{"version":3,"sources":["jquery.jcarousel.js","bootstrap.js","emodal.js","ev-emitter.js","lodash.js","mobile-detect.js","jquery.validate.js","js.cookie.js","lazyload.js","jquery.sexylightbox.js","jquery.autocomplete.js","jquery.tipTip.js","platin.js"],"names":["$","jCarousel","version","rRelativeTarget","parseTarget","target","relative","parts","exec","parseInt","detectCarousel","element","carousel","length","filter","find","parent","base","pluginName","_options","_element","_carousel","_init","noop","_create","_destroy","_reload","create","this","attr","toLowerCase","data","_trigger","destroy","removeData","removeAttr","reload","options","key","value","arguments","extend","error","type","event","defaultPrevented","concat","each","Event","trigger","isDefaultPrevented","plugin","pluginPrototype","Plugin","fn","prototype","args","Array","slice","call","returnValue","instance","isFunction","charAt","methodValue","apply","jQuery","window","$window","toFloat","val","parseFloat","animating","tail","inTail","resizeState","resizeTimer","lt","vertical","rtl","circular","underflow","list","children","eq","items","animation","transitions","wrap","center","_list","_items","_target","_first","_last","_visible","_fullyvisible","self","width","height","onWindowResize","clearTimeout","setTimeout","currentResizeState","on","off","found","parents","test","css","item","index","closest","props","left","top","_prepare","remove","_position","move","option","not","pos","position","stop","lrb","clipping","dim","dimension","Math","abs","first","last","visible","fullyvisible","hasNext","end","check","hasPrev","scroll","animate","callback","parsed","current","start","curr","isVisible","i","_scroll","_scrollTail","get","after","clone","append","moveBy","min","max","prepend","properties","opts","multiplier","correction","transforms","transforms3d","duration","complete","backup","transitionDuration","transitionTimingFunction","transitionProperty","oldComplete","easing","transform","one","jquery","_animate","_update","next","add","proxy","c","fx","speeds","idx","wh","clip","update","centerOffset","back","doUpdate","elIn","elOut","push","reverse","jcarousel","scrollIntoView","method","_active","onDestroy","onReload","onEvent","e","preventDefault","active","perPage","page","_carouselItems","_pages","_currentPage","onScroll","_clear","_calculatePages","pp","_getCarouselItems","numCarouselItems","carouselItems","currItem","currentIndex","newIndex","currentPage","is","reloadCarouselItems","empty","pages","document","hiddenProp","visibilityChangeEvent","hidden","mozHidden","msHidden","webkitHidden","interval","autostart","_timer","_started","onAnimateEnd","_start","onVisibilityChange","_stop","btBody","getElementById","Error","split","emulateTransitionEnd","called","$el","support","transition","el","createElement","transEndEventNames","WebkitTransition","MozTransition","OTransition","name","undefined","style","transitionEnd","special","bsTransitionEnd","bindType","delegateType","handle","handleObj","handler","dismiss","Alert","close","VERSION","TRANSITION_DURATION","$this","selector","replace","$parent","removeElement","detach","removeClass","hasClass","old","alert","Constructor","noConflict","Button","$element","DEFAULTS","isLoading","toggle","setState","loadingText","state","d","resetText","addClass","prop","changed","$input","toggleClass","button","$btn","Carousel","$indicators","paused","sliding","$active","$items","keyboard","keydown","pause","documentElement","cycle","action","slide","to","tagName","which","prev","clearInterval","setInterval","getItemIndex","getItemForDirection","direction","activeIndex","itemIndex","that","$next","isCycling","relatedTarget","slideEvent","$nextIndicator","slidEvent","offsetWidth","join","clickHandler","href","$target","slideIndex","$carousel","Collapse","$trigger","id","transitioning","getParent","addAriaAndCollapsedClass","getTargetFromTrigger","show","activesData","actives","startEvent","scrollSize","camelCase","hide","offsetHeight","isOpen","collapse","Dropdown","clearMenus","contains","isActive","insertAfter","stopPropagation","dropdown","Modal","$body","$dialog","$backdrop","isShown","originalBodyPad","scrollbarWidth","ignoreBackdropClick","fixedContent","remote","load","_relatedTarget","BACKDROP_TRANSITION_DURATION","backdrop","checkScrollbar","setScrollbar","escape","resize","appendTo","scrollTop","adjustDialog","enforceFocus","hideModal","has","handleUpdate","resetAdjustments","resetScrollbar","removeBackdrop","doAnimate","currentTarget","focus","callbackRemove","modalIsOverflowing","scrollHeight","clientHeight","paddingLeft","bodyIsOverflowing","paddingRight","fullWindowWidth","innerWidth","documentElementRect","getBoundingClientRect","right","clientWidth","measureScrollbar","bodyPad","actualPadding","calculatedPadding","padding","scrollDiv","className","removeChild","modal","showEvent","DISALLOWED_ATTRIBUTES","uriAttrs","DefaultWhitelist","*","a","area","b","br","col","code","div","em","hr","h1","h2","h3","h4","h5","h6","img","li","ol","p","pre","s","small","span","sub","sup","strong","u","ul","SAFE_URL_PATTERN","DATA_URL_PATTERN","allowedAttribute","allowedAttributeList","attrName","nodeName","inArray","Boolean","nodeValue","match","regExp","RegExp","l","sanitizeHtml","unsafeHtml","whiteList","sanitizeFn","implementation","createHTMLDocument","createdDocument","body","innerHTML","whitelistKeys","map","elements","len","elName","attributeList","attributes","whitelistedAttributes","j","len2","removeAttribute","parentNode","Tooltip","enabled","timeout","hoverState","inState","init","placement","template","title","delay","html","container","viewport","sanitize","getOptions","$viewport","click","hover","constructor","triggers","eventIn","eventOut","enter","leave","fixTitle","getDefaults","dataAttributes","dataAttr","hasOwnProperty","getDelegateOptions","defaults","obj","tip","isInStateTrue","hasContent","inDom","ownerDocument","$tip","tipId","getUID","setContent","autoToken","autoPlace","display","getPosition","actualWidth","actualHeight","orgPlacement","viewportDim","bottom","calculatedOffset","getCalculatedOffset","applyPlacement","prevHoverState","offset","marginTop","marginLeft","isNaN","setOffset","using","round","delta","getViewportAdjustedDelta","isVertical","arrowDelta","arrowOffsetPosition","replaceArrow","arrow","getTitle","text","$e","isBody","elRect","isSvg","SVGElement","elOffset","outerDims","viewportPadding","viewportDimensions","topEdgeOffset","bottomEdgeOffset","leftEdgeOffset","rightEdgeOffset","o","prefix","random","$arrow","enable","disable","toggleEnabled","tooltip","Popover","content","getContent","typeContent","popover","ScrollSpy","$scrollElement","offsets","targets","activeTarget","process","refresh","getScrollHeight","offsetMethod","offsetBase","isWindow","$href","sort","maxScroll","activate","clear","parentsUntil","scrollspy","$spy","Tab","$ul","$previous","hideEvent","tab","Affix","checkPosition","checkPositionWithEventLoop","affixed","unpin","pinnedOffset","RESET","getState","offsetTop","offsetBottom","targetHeight","initializing","colliderTop","getPinnedOffset","affix","affixType","define","root","$modal","BIN","DIV","EMPTY","EVENT_CLICK","EVENT_HIDE","EVENT_SHOW","EVENT_SUBMIT","HIDE","INPUT","KEY_DANGER","LABEL","OK","True","Yes","lastParams","MODAL_BODY","MODAL_DIALOG","REC_MODAL_CONTENT","SIZE","sm","lg","xl","TMP_MODAL_CONTENT","defaultSettings","allowContentRecycle","confirmLabel","Object","keys","labels","loadingHtml","size","autofocus","addLabel","yes","no","ajax","dfd","_createDeferred","setEModalOptions","params","async","deferred","xhrFields","withCredentials","loading","url","dataType","done","success","resolve","fail","responseText","textStatus","msg","reject","confirm","buttons","label","message","onHide","ev","emptyBin","iframe","postData","$ver","ver","$major","$minor","$patch","major","minor","patch","iframeReady","fadeOut","prompt","btn","k","_getFooter","submit","pattern","setId","_getModalInstance","setModalOptions","overrideOptions","defer","q","require","Q","Deferred","promise","messageFotter","btnOp","bind","skipEventChageIfExists","_recycleModal","checkValidity","$content","$ref","subtitle","_setup","$message","onclick","useBin","_getMessage","amd","mName","eModal","module","exports","global","factory","EvEmitter","proto","eventName","listener","events","_events","listeners","indexOf","once","onceEvents","_onceEvents","splice","emitEvent","onceListeners","allOff","FUNC_ERROR_TEXT","HASH_UNDEFINED","PLACEHOLDER","WRAP_CURRY_RIGHT_FLAG","WRAP_PARTIAL_FLAG","WRAP_PARTIAL_RIGHT_FLAG","WRAP_ARY_FLAG","WRAP_REARG_FLAG","INFINITY","MAX_SAFE_INTEGER","NAN","MAX_ARRAY_LENGTH","wrapFlags","argsTag","arrayTag","boolTag","dateTag","errorTag","funcTag","genTag","mapTag","numberTag","objectTag","promiseTag","regexpTag","setTag","stringTag","symbolTag","weakMapTag","arrayBufferTag","dataViewTag","float32Tag","float64Tag","int8Tag","int16Tag","int32Tag","uint8Tag","uint8ClampedTag","uint16Tag","uint32Tag","reEmptyStringLeading","reEmptyStringMiddle","reEmptyStringTrailing","reEscapedHtml","reUnescapedHtml","reHasEscapedHtml","source","reHasUnescapedHtml","reEscape","reEvaluate","reInterpolate","reIsDeepProp","reIsPlainProp","rePropName","reRegExpChar","reHasRegExpChar","reTrimStart","reWhitespace","reWrapComment","reWrapDetails","reSplitDetails","reAsciiWord","reForbiddenIdentifierChars","reEscapeChar","reEsTemplate","reFlags","reIsBadHex","reIsBinary","reIsHostCtor","reIsOctal","reIsUint","reLatin","reNoMatch","reUnescapedString","rsComboRange","rsComboMarksRange","rsDingbatRange","rsLowerRange","rsUpperRange","rsVarRange","rsBreakRange","rsMathOpRange","rsApos","rsAstral","rsBreak","rsCombo","rsDigits","rsDingbat","rsLower","rsMisc","rsFitz","rsNonAstral","rsRegional","rsSurrPair","rsUpper","rsMiscLower","rsMiscUpper","rsOptContrLower","rsOptContrUpper","reOptMod","rsOptVar","rsSeq","rsEmoji","rsSymbol","reApos","reComboMark","reUnicode","reUnicodeWord","reHasUnicode","reHasUnicodeWord","contextProps","templateCounter","typedArrayTags","cloneableTags","stringEscapes","\\","'","\n","\r","
","
","freeParseFloat","freeParseInt","freeGlobal","freeSelf","Function","freeExports","nodeType","freeModule","moduleExports","freeProcess","nodeUtil","types","binding","nodeIsArrayBuffer","isArrayBuffer","nodeIsDate","isDate","nodeIsMap","isMap","nodeIsRegExp","isRegExp","nodeIsSet","isSet","nodeIsTypedArray","isTypedArray","func","thisArg","arrayAggregator","array","setter","iteratee","accumulator","arrayEach","arrayEachRight","arrayEvery","predicate","arrayFilter","resIndex","result","arrayIncludes","baseIndexOf","arrayIncludesWith","comparator","arrayMap","arrayPush","values","arrayReduce","initAccum","arrayReduceRight","arraySome","asciiSize","baseProperty","baseFindKey","collection","eachFunc","baseFindIndex","fromIndex","fromRight","strictIndexOf","baseIsNaN","baseIndexOfWith","baseMean","baseSum","object","basePropertyOf","baseReduce","baseTimes","n","baseTrim","string","trimmedEndIndex","baseUnary","baseValues","cacheHas","cache","charsStartIndex","strSymbols","chrSymbols","charsEndIndex","countHolders","placeholder","deburrLetter","À","Á","Â","Ã","Ä","Å","à","á","â","ã","ä","å","Ç","ç","Ð","ð","È","É","Ê","Ë","è","é","ê","ë","Ì","Í","Î","Ï","ì","í","î","ï","Ñ","ñ","Ò","Ó","Ô","Õ","Ö","Ø","ò","ó","ô","õ","ö","ø","Ù","Ú","Û","Ü","ù","ú","û","ü","Ý","ý","ÿ","Æ","æ","Þ","þ","ß","Ā","Ă","Ą","ā","ă","ą","Ć","Ĉ","Ċ","Č","ć","ĉ","ċ","č","Ď","Đ","ď","đ","Ē","Ĕ","Ė","Ę","Ě","ē","ĕ","ė","ę","ě","Ĝ","Ğ","Ġ","Ģ","ĝ","ğ","ġ","ģ","Ĥ","Ħ","ĥ","ħ","Ĩ","Ī","Ĭ","Į","İ","ĩ","ī","ĭ","į","ı","Ĵ","ĵ","Ķ","ķ","ĸ","Ĺ","Ļ","Ľ","Ŀ","Ł","ĺ","ļ","ľ","ŀ","ł","Ń","Ņ","Ň","Ŋ","ń","ņ","ň","ŋ","Ō","Ŏ","Ő","ō","ŏ","ő","Ŕ","Ŗ","Ř","ŕ","ŗ","ř","Ś","Ŝ","Ş","Š","ś","ŝ","ş","š","Ţ","Ť","Ŧ","ţ","ť","ŧ","Ũ","Ū","Ŭ","Ů","Ű","Ų","ũ","ū","ŭ","ů","ű","ų","Ŵ","ŵ","Ŷ","ŷ","Ÿ","Ź","Ż","Ž","ź","ż","ž","IJ","ij","Œ","œ","ʼn","ſ","escapeHtmlChar","&","<",">","\"","escapeStringChar","chr","hasUnicode","mapToArray","forEach","overArg","arg","replaceHolders","setToArray","set","setToPairs","stringSize","lastIndex","unicodeSize","stringToArray","unicodeToArray","asciiToArray","unescapeHtmlChar","&amp;","&lt;","&gt;","&quot;","&#39;","_","runInContext","context","uid","pick","Date","String","TypeError","arrayProto","funcProto","objectProto","coreJsData","funcToString","toString","idCounter","maskSrcKey","IE_PROTO","nativeObjectToString","objectCtorString","oldDash","reIsNative","Buffer","Symbol","Uint8Array","allocUnsafe","getPrototype","getPrototypeOf","objectCreate","propertyIsEnumerable","spreadableSymbol","isConcatSpreadable","symIterator","iterator","symToStringTag","toStringTag","defineProperty","getNative","ctxClearTimeout","ctxNow","now","ctxSetTimeout","nativeCeil","ceil","nativeFloor","floor","nativeGetSymbols","getOwnPropertySymbols","nativeIsBuffer","isBuffer","nativeIsFinite","isFinite","nativeJoin","nativeKeys","nativeMax","nativeMin","nativeNow","nativeParseInt","nativeRandom","nativeReverse","DataView","Map","Promise","Set","WeakMap","nativeCreate","metaMap","realNames","dataViewCtorString","toSource","mapCtorString","promiseCtorString","setCtorString","weakMapCtorString","symbolProto","symbolValueOf","valueOf","symbolToString","lodash","isObjectLike","isArray","LazyWrapper","LodashWrapper","wrapperClone","baseCreate","isObject","baseLodash","chainAll","__wrapped__","__actions__","__chain__","__index__","__values__","__dir__","__filtered__","__iteratees__","__takeCount__","__views__","Hash","entries","entry","ListCache","MapCache","SetCache","__data__","Stack","arrayLikeKeys","inherited","isArr","isArg","isArguments","isBuff","isType","skipIndexes","isIndex","arraySample","baseRandom","arraySampleSize","shuffleSelf","copyArray","baseClamp","arrayShuffle","assignMergeValue","baseAssignValue","assignValue","objValue","assocIndexOf","baseAggregator","baseEach","baseAssign","copyObject","configurable","enumerable","writable","baseAt","paths","skip","number","lower","upper","baseClone","bitmask","customizer","stack","isDeep","isFlat","isFull","input","initCloneArray","tag","getTag","isFunc","cloneBuffer","initCloneObject","getSymbolsIn","copySymbolsIn","keysIn","baseAssignIn","getSymbols","copySymbols","Ctor","cloneArrayBuffer","dataView","buffer","byteOffset","byteLength","cloneDataView","cloneTypedArray","regexp","cloneRegExp","symbol","initCloneByTag","stacked","subValue","getAllKeysIn","getAllKeys","baseConformsTo","baseDelay","wait","baseDifference","includes","isCommon","valuesLength","outer","computed","valuesIndex","templateSettings","evaluate","interpolate","variable","imports","pop","hash","getMapData","pairs","LARGE_ARRAY_SIZE","createBaseEach","baseForOwn","baseEachRight","baseForOwnRight","baseEvery","baseExtremum","isSymbol","baseFilter","baseFlatten","depth","isStrict","isFlattenable","baseFor","createBaseFor","baseForRight","baseFunctions","baseGet","path","castPath","toKey","baseGetAllKeys","keysFunc","symbolsFunc","baseGetTag","isOwn","unmasked","getRawTag","objectToString","baseGt","other","baseHas","baseHasIn","baseIntersection","arrays","othLength","othIndex","caches","maxLength","Infinity","seen","baseInvoke","baseIsArguments","baseIsEqual","equalFunc","objIsArr","othIsArr","objTag","othTag","objIsObj","othIsObj","isSameTag","equalArrays","convert","isPartial","equalByTag","objIsWrapped","othIsWrapped","objUnwrapped","othUnwrapped","objProps","objLength","objStacked","othStacked","skipCtor","othValue","compared","objCtor","othCtor","equalObjects","baseIsEqualDeep","baseIsMatch","matchData","noCustomizer","srcValue","COMPARE_PARTIAL_FLAG","baseIsNative","baseIteratee","identity","baseMatchesProperty","baseMatches","property","baseKeys","isPrototype","baseKeysIn","nativeKeysIn","isProto","baseLt","baseMap","isArrayLike","getMatchData","matchesStrictComparable","isKey","isStrictComparable","hasIn","baseMerge","srcIndex","mergeFunc","safeGet","newValue","isTyped","isArrayLikeObject","isPlainObject","toPlainObject","baseMergeDeep","baseNth","baseOrderBy","iteratees","orders","getIteratee","comparer","baseSortBy","criteria","objCriteria","othCriteria","ordersLength","compareAscending","compareMultiple","basePickBy","baseSet","basePullAll","basePullAt","indexes","previous","baseUnset","baseRepeat","baseRest","setToString","overRest","baseSample","baseSampleSize","nested","baseSetData","baseSetToString","constant","baseShuffle","baseSlice","baseSome","baseSortedIndex","retHighest","low","high","mid","baseSortedIndexBy","valIsNaN","valIsNull","valIsSymbol","valIsUndefined","othIsDefined","othIsNull","othIsReflexive","othIsSymbol","setLow","baseSortedUniq","baseToNumber","baseToString","baseUniq","createSet","seenIndex","baseUpdate","updater","baseWhile","isDrop","baseWrapperValue","actions","baseXor","baseZipObject","assignFunc","valsLength","castArrayLikeObject","castFunction","stringToPath","castRest","castSlice","copy","arrayBuffer","typedArray","valIsDefined","valIsReflexive","composeArgs","partials","holders","isCurried","argsIndex","argsLength","holdersLength","leftIndex","leftLength","rangeLength","isUncurried","composeArgsRight","holdersIndex","rightIndex","rightLength","isNew","createAggregator","initializer","createAssigner","assigner","sources","guard","isIterateeCall","iterable","createCaseFirst","methodName","trailing","createCompounder","words","deburr","createCtor","thisBinding","createFind","findIndexFunc","createFlow","flatRest","funcs","prereq","thru","wrapper","getFuncName","funcName","getData","isLaziable","plant","createHybrid","partialsRight","holdersRight","argPos","ary","arity","isAry","isBind","isBindKey","isFlip","getHolder","holdersCount","newHolders","createRecurry","reorder","createInverter","toIteratee","baseInverter","createMathOperation","operator","defaultValue","createOver","arrayFunc","createPadding","chars","charsLength","createRange","step","toFinite","baseRange","createRelationalOperation","toNumber","wrapFunc","isCurry","newData","setData","setWrapToString","createRound","precision","toInteger","pair","createToPairs","baseToPairs","createWrap","srcBitmask","newBitmask","isCombo","mergeData","createCurry","createPartial","createBind","customDefaultsAssignIn","customDefaultsMerge","customOmitClone","arrLength","arrStacked","arrValue","flatten","otherFunc","getValue","stubArray","hasPath","hasFunc","isLength","ArrayBuffer","ctorString","isMaskable","stubFalse","otherArgs","oldArray","shortOut","reference","details","insertWrapDetails","updateWrapDetails","getWrapDetails","count","lastCalled","stamp","remaining","rand","memoize","memoizeCapped","charCodeAt","quote","subString","difference","differenceBy","differenceWith","findIndex","findLastIndex","head","intersection","mapped","intersectionBy","intersectionWith","pull","pullAll","pullAt","union","unionBy","unionWith","unzip","group","unzipWith","without","xor","xorBy","xorWith","zip","zipWith","chain","interceptor","wrapperAt","countBy","findLast","forEachRight","groupBy","invokeMap","keyBy","partition","sortBy","before","bindKey","WRAP_BIND_FLAG","debounce","lastArgs","lastThis","maxWait","timerId","lastCallTime","lastInvokeTime","leading","maxing","invokeFunc","time","leadingEdge","timerExpired","shouldInvoke","timeSinceLastCall","trailingEdge","timeWaiting","remainingWait","debounced","isInvoking","cancel","flush","resolver","memoized","Cache","negate","overArgs","funcsLength","partial","partialRight","rearg","gt","gte","isError","isInteger","isNumber","isString","lte","toArray","iteratorToArray","remainder","toLength","isBinary","assign","assignIn","assignInWith","assignWith","at","propsIndex","propsLength","defaultsDeep","mergeWith","invert","invertBy","invoke","merge","omit","CLONE_DEEP_FLAG","basePick","pickBy","toPairs","toPairsIn","word","capitalize","upperFirst","kebabCase","lowerCase","lowerFirst","snakeCase","startCase","upperCase","toUpperCase","hasUnicodeWord","unicodeWords","asciiWords","attempt","bindAll","methodNames","flow","flowRight","methodOf","mixin","over","overEvery","overSome","basePropertyDeep","range","rangeRight","augend","addend","divide","dividend","divisor","multiply","multiplicand","subtract","minuend","subtrahend","castArray","chunk","compact","cond","conforms","baseConforms","curry","curryRight","drop","dropRight","dropRightWhile","dropWhile","fill","baseFill","flatMap","flatMapDeep","flatMapDepth","flattenDeep","flattenDepth","flip","fromPairs","functions","functionsIn","initial","mapKeys","mapValues","matches","matchesProperty","nthArg","omitBy","orderBy","propertyOf","pullAllBy","pullAllWith","rest","sampleSize","setWith","shuffle","sortedUniq","sortedUniqBy","separator","limit","spread","take","takeRight","takeRightWhile","takeWhile","tap","throttle","toPath","isArrLike","unary","uniq","uniqBy","uniqWith","unset","updateWith","valuesIn","zipObject","zipObjectDeep","entriesIn","extendWith","clamp","cloneDeep","cloneDeepWith","cloneWith","conformsTo","defaultTo","endsWith","escapeRegExp","every","findKey","findLastKey","forIn","forInRight","forOwn","forOwnRight","inRange","baseInRange","isBoolean","isElement","isEmpty","isEqual","isEqualWith","isMatch","isMatchWith","isNative","isNil","isNull","isSafeInteger","isUndefined","isWeakMap","isWeakSet","lastIndexOf","strictLastIndexOf","maxBy","mean","meanBy","minBy","stubObject","stubString","stubTrue","nth","pad","strLength","padEnd","padStart","radix","floating","temp","reduce","reduceRight","repeat","sample","some","sortedIndex","sortedIndexBy","sortedIndexOf","sortedLastIndex","sortedLastIndexBy","sortedLastIndexOf","startsWith","sum","sumBy","settings","isEscaping","isEvaluating","importsKeys","importsValues","reDelimiters","sourceURL","escapeValue","interpolateValue","esTemplateValue","evaluateValue","times","toLower","toSafeInteger","toUpper","trim","trimEnd","trimStart","truncate","omission","search","substring","newEnd","unescape","uniqueId","eachRight","isFilter","takeName","dropName","checkIteratee","isTaker","lodashFunc","retUnwrapped","isLazy","useLazy","isHybrid","isUnwrapped","onlyLazy","chainName","dir","isRight","view","getView","iterLength","takeCount","iterIndex","commit","wrapped","toJSON","impl","phones","iPhone","BlackBerry","Pixel","HTC","Nexus","Dell","Motorola","Samsung","LG","Sony","Asus","Xiaomi","NokiaLumia","Micromax","Palm","Vertu","Pantech","Fly","Wiko","iMobile","SimValley","Wolfgang","Alcatel","Nintendo","Amoi","INQ","OnePlus","GenericPhone","tablets","iPad","NexusTablet","GoogleTablet","SamsungTablet","Kindle","SurfaceTablet","HPTablet","AsusTablet","BlackBerryTablet","HTCtablet","MotorolaTablet","NookTablet","AcerTablet","ToshibaTablet","LGTablet","FujitsuTablet","PrestigioTablet","LenovoTablet","DellTablet","YarvikTablet","MedionTablet","ArnovaTablet","IntensoTablet","IRUTablet","MegafonTablet","EbodaTablet","AllViewTablet","ArchosTablet","AinolTablet","NokiaLumiaTablet","SonyTablet","PhilipsTablet","CubeTablet","CobyTablet","MIDTablet","MSITablet","SMiTTablet","RockChipTablet","FlyTablet","bqTablet","HuaweiTablet","NecTablet","PantechTablet","BronchoTablet","VersusTablet","ZyncTablet","PositivoTablet","NabiTablet","KoboTablet","DanewTablet","TexetTablet","PlaystationTablet","TrekstorTablet","PyleAudioTablet","AdvanTablet","DanyTechTablet","GalapadTablet","MicromaxTablet","KarbonnTablet","AllFineTablet","PROSCANTablet","YONESTablet","ChangJiaTablet","GUTablet","PointOfViewTablet","OvermaxTablet","HCLTablet","DPSTablet","VistureTablet","CrestaTablet","MediatekTablet","ConcordeTablet","GoCleverTablet","ModecomTablet","VoninoTablet","ECSTablet","StorexTablet","VodafoneTablet","EssentielBTablet","RossMoorTablet","iMobileTablet","TolinoTablet","AudioSonicTablet","AMPETablet","SkkTablet","TecnoTablet","JXDTablet","iJoyTablet","FX2Tablet","XoroTablet","ViewsonicTablet","VerizonTablet","OdysTablet","CaptivaTablet","IconbitTablet","TeclastTablet","OndaTablet","JaytechTablet","BlaupunktTablet","DigmaTablet","EvolioTablet","LavaTablet","AocTablet","MpmanTablet","CelkonTablet","WolderTablet","MediacomTablet","MiTablet","NibiruTablet","NexoTablet","LeaderTablet","UbislateTablet","PocketBookTablet","KocasoTablet","HisenseTablet","Hudl","TelstraTablet","GenericTablet","oss","AndroidOS","BlackBerryOS","PalmOS","SymbianOS","WindowsMobileOS","WindowsPhoneOS","iOS","iPadOS","SailfishOS","MeeGoOS","MaemoOS","JavaOS","webOS","badaOS","BREWOS","uas","Chrome","Dolfin","Opera","Skyfire","Edge","IE","Firefox","Bolt","TeaShark","Blazer","Safari","WeChat","UCBrowser","baiduboxapp","baidubrowser","DiigoBrowser","Mercury","ObigoBrowser","NetFront","GenericBrowser","PaleMoon","Mobile","Build","Version","VendorID","iPod","Coast","Fennec","NokiaBrowser","Opera Mini","Opera Mobi","MQQBrowser","MicroMessenger","SamsungBrowser","Iron","Tizen","Webkit","SailfishBrowser","Gecko","Trident","Presto","Goanna","Android","Sailfish","BREW","Java","Windows Phone OS","Windows Phone","Windows CE","Windows NT","Symbian","utils","Bot","MobileBot","DesktopMode","TV","WebKit","Console","Watch","fullPattern","shortPattern","tabletPattern","hasOwnProp","equalIC","containsIC","valueLC","convertPropsToRegExp","MobileDetect","userAgent","maxPhoneWidth","ua","substr","prepareUserAgent","_cache","FALLBACK_PHONE","FALLBACK_TABLET","FALLBACK_MOBILE","verPos","mobileDetectRules","oss0","findMatch","rules","findMatches","getVersionStr","propertyName","patterns","getVersion","prepareVersionNo","NaN","numbers","shift","Number","isMobileFallback","detectMobileBrowsers","isTabletFallback","prepareDetectionCache","mobile","phone","tablet","phoneSized","isPhoneSized","mobileGrade","t","$isMobile","os","detectOS","getDeviceSmallerSide","screen","userAgents","versionStr","grade","_impl","validate","validator","onsubmit","submitButton","cancelSubmit","submitHandler","formSubmitted","currentForm","debug","form","pendingRequest","focusInvalid","console","warn","valid","errorList","command","argument","staticRules","existingRules","param","filtered","isContentEditable","normalizeRule","messages","normalizeRules","classRules","attributeRules","dataRules","required","str","expr","pseudos","blank","filled","unchecked","format","makeArray","unshift","groups","errorClass","pendingClass","validClass","errorElement","focusCleanup","errorContainer","errorLabelContainer","ignore","ignoreTitle","onfocusin","lastActive","unhighlight","hideThese","errorsFor","onfocusout","checkable","submitted","optional","onkeyup","elementValue","keyCode","invalid","highlight","findByName","setDefaults","email","date","dateISO","digits","equalTo","maxlength","minlength","rangelength","autoCreateRanges","labelContainer","errorContext","containers","valueCache","pending","reset","delegate","eventType","invalidHandler","checkForm","errorMap","triggerHandler","showErrors","prepareForm","currentElements","rs","cleanElement","clean","checkElement","validationTargetFor","v","prepareElement","testgroup","numberOfInvalids","toHide","errors","successList","grep","defaultShowErrors","resetForm","hideErrors","resetElements","objectLength","addWrapper","findLastActive","rulesCache","resetInternals","toShow","validity","badInput","rule","normalizer","rulesCount","dependencyMismatch","parameters","methods","formatAndAdd","log","customDataMessage","customMessage","m","findDefined","defaultMessage","theregex","toToggle","showLabel","validElements","invalidElements","place","errorID","elementID","idOrName","describedBy","errorPlacement","escapeCssMeta","describer","getLength","depend","dependTypes","boolean","function","startRequest","stopRequest","previousValue","classRuleSettings","creditcard","addClassRules","classes","normalizeAttributeRule","getAttribute","depends","keepRule","parameter","transformed","addMethod","decimals","errorMessage","re","decimalPlaces","num","toInt","pow","optionDataString","originalMessage","mode","port","response","pendingRequests","ajaxPrefilter","xhr","abort","ajaxSettings","registeredInModuleLoader","OldCookies","Cookies","api","decode","decodeURIComponent","converter","expires","toUTCString","JSON","stringify","write","encodeURIComponent","stringifiedAttributes","attributeName","cookie","json","jar","cookies","read","parse","getJSON","withConverter","LazyLoad","src","srcset","rootMargin","threshold","extended","deep","images","querySelectorAll","observer","IntersectionObserver","loadImages","observerConfig","isIntersecting","unobserve","backgroundImage","image","observe","loadAndDestroy","disconnect","lazyload","attribute","args2","SexyLightbox","initialize","hook","enlace","sexy","anchors","PM","_window","IsMobile","refreshBox","caption","rel","force","baseURL","queryString","parseQuery","background","Image","onload","onerror","imagesdir","color","urlNoQuery","showIframe","then","w","h","_modal","_base","_title","_iFrame","contentWindow","parentIFrame","parentIFrameParams","query","shake","boyutla","autocomplete","urlOrData","isUrl","Autocompleter","noRecord","formatMatch","formatItem","flushCache","setOptions","unautocomplete","KEY","globalFailure","failure","lastKeyPressCode","blockSubmit","inputClass","hasFocus","config","mouseDownOnSelect","select","Select","selectCurrent","selected","multiple","trimWords","wordAt","seperator","multipleSeparator","cursorAt","selection","progress","resultEvent","hideResultsNow","onChange","crap","skipPrevCheck","currentValue","lastWord","minChars","loadingClass","matchCase","request","receiveData","stopLoading","mustMatch","sValue","autoFill","term","extraParams","timestamp","emptyList","rows","row","formatResult","navigator","pageUp","pageDown","clickFire","findValueCallback","populate","unbind","resultsClass","matchSubset","matchContains","cacheLength","selectFirst","inputFocus","scrollJumpPosition","stMatchSets","nullData","rawValue","firstChar","csub","x","listItems","CLASSES","needsInit","moveSelect","movePosition","activeItem","innerHeight","fillList","available","formatted","bgiframe","maxHeight","overflow","listHeight","scrollbarsVisible","createTextRange","selRange","moveStart","moveEnd","setSelectionRange","selectionStart","selectionEnd","field","orig","textLength","caretAt","tipTip","activation","keepAlive","maxWidth","edgeOffset","defaultPosition","fadeIn","exit","tiptip_holder","tiptip_content","tiptip_arrow","org_elem","org_title","active_tiptip","org_width","outerWidth","org_height","outerHeight","tip_w","tip_h","w_compare","h_compare","marg_left","marg_top","t_class","arrow_top","arrow_left","right_compare","scrollLeft","left_compare","top_compare","bottom_compare","margin-left","margin-top","deactive_tiptip","PlatinMarket","Statr","dot_get","currentObj","dot_set","getQueryString","location","results","CustomEvent","bubbles","cancelable","detail","evt","createEvent","initCustomEvent","_data","_CsrfToken","_ActionPage","_ServerTime","CSRFToken","ActionPage","ServerTime","dispatchEvent","InIframe","Configure","JqZoom","zoomType","preloadText","preloadImages","showEffect","hideEffect","zoomWidth","zoomHeight","xOffset","KeepSession","Lightbox","fullscreenEl","history","shareEl","closeOnScroll","pinchToClose","closeElClasses","clickToCloseNonZoomable","JCarousel","autoscroll","equalHeight","Sexylightbox","Autocomplate","ValidationRules","_messages","adres_tanimi","il","ilce","adres","tel","gsm","ad","konuk_ad","soyad","tc_kimlik","firma_unvan","vergi_daire","vergi_no","TcIdentity","checked","gizlilik_politikasi_onay","fatura","teslimat_fatura_bilgileri","konuk_soyad","konuk_email","siparis_notu","Get","teslimat_tanim","teslimat_ad","teslimat_soyad","teslimat_tc_kimlik","teslimat_ulke","teslimat_sehir","teslimat_ilce","teslimat_adres","teslimat_gsm","Telefon","fatura_tanim","fatura_tip","fatura_ad","fatura_soyad","fatura_tc_kimlik","fatura_ulke","fatura_sehir","fatura_ilce","fatura_adres","fatura_tel","fatura_gsm","faturam_siparisimle_gelsin","fatura_firma_unvan","fatura_vergi_daire","fatura_vergi_no","ValidationMethods","stripped","GSM","toplam","strtoplam","oldValue","oldObj","connect","cb","_self","Scope","Name","Value","Defined","SetDefault","OnPage","_PageFunctions","HizliSatinAl","product_id","HemenAl","UserFS","PublicUrl","file","SharedFS","Timer","Ajax","getTime","info","err","status","statusText","RememberUrl","Countries","Cities","country","Towns","city","ProductDetail","ProductVariantDetail","proId","subProId","ProductVariants","pro_VARIANTS","variant","alt_urun_ID","alt_URUN_RESIM","price","alt_urun_FIYAT_TIPI","pro_PRICE","alt_urun_FIYAT","quantity","alt_urun_STOK","sku","alt_urun_STOK_KODU","alt_urun_VAR_DEGER","variantId","_variant","pro_VARIANT_NAMES","_v","varyasyon_ID","varyasyon_ISMI","varyasyon_DEGERLERI","ApplyData","node","md","LoadImages","_LoadImages","callCount","ready","internalCallback","isNumeric","ValidationOptions","form_name","GetValidationRules","RateProduct","productId","rating","InitLocationSelector","_countrySelector","_citySelector","_townSelector","_countryFilter","$_country","$_city","$_town","cities","convertInputBox","towns","countries","expectedVal","makeJQueryPlugins","tabSelector","activeClass","change","tabs","selectedNode","changeTab","changeEvt","currentTab","newTab","changedEvt","initialSelected","listSelector","changeItem","currentItem","newItem","scrollToTop","addEventListener","clearQueue","opacity","passive","delayKeyup","ms","timer","_lazyLoad","imagesLoaded","$images","checkImages","imagesAllOk","elem","naturalWidth","nodes","tallest","elemIndex","thisHeight","dataLoading","addOption","_option","_val","newVal","inputValue","arrElement","slideByMouse","scanOffset","slideCount","oneWidth","Mouse","y","Count","Width","leftPos","pageX","pageY","toggleDisable","readOnly","_state","bindDisable","_fn","eval","platinCarousel","prependTo","jcarouselAutoscroll","prevButton","nextButton","_validators","_validatorName"],"mappings":"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","file":"vendor.min.js","sourcesContent":["/*! jCarousel - v0.3.9 - 2018-07-30\n* http://sorgalla.com/jcarousel/\n* Copyright (c) 2006-2018 Jan Sorgalla; Licensed MIT */\n(function($) {\n    'use strict';\n\n    var jCarousel = $.jCarousel = {};\n\n    jCarousel.version = '0.3.9';\n\n    var rRelativeTarget = /^([+\\-]=)?(.+)$/;\n\n    jCarousel.parseTarget = function(target) {\n        var relative = false,\n            parts    = typeof target !== 'object' ?\n                           rRelativeTarget.exec(target) :\n                           null;\n\n        if (parts) {\n            target = parseInt(parts[2], 10) || 0;\n\n            if (parts[1]) {\n                relative = true;\n                if (parts[1] === '-=') {\n                    target *= -1;\n                }\n            }\n        } else if (typeof target !== 'object') {\n            target = parseInt(target, 10) || 0;\n        }\n\n        return {\n            target: target,\n            relative: relative\n        };\n    };\n\n    jCarousel.detectCarousel = function(element) {\n        var carousel;\n\n        while (element.length > 0) {\n            carousel = element.filter('[data-jcarousel]');\n\n            if (carousel.length > 0) {\n                return carousel;\n            }\n\n            carousel = element.find('[data-jcarousel]');\n\n            if (carousel.length > 0) {\n                return carousel;\n            }\n\n            element = element.parent();\n        }\n\n        return null;\n    };\n\n    jCarousel.base = function(pluginName) {\n        return {\n            version:  jCarousel.version,\n            _options:  {},\n            _element:  null,\n            _carousel: null,\n            _init:     $.noop,\n            _create:   $.noop,\n            _destroy:  $.noop,\n            _reload:   $.noop,\n            create: function() {\n                this._element\n                    .attr('data-' + pluginName.toLowerCase(), true)\n                    .data(pluginName, this);\n\n                if (false === this._trigger('create')) {\n                    return this;\n                }\n\n                this._create();\n\n                this._trigger('createend');\n\n                return this;\n            },\n            destroy: function() {\n                if (false === this._trigger('destroy')) {\n                    return this;\n                }\n\n                this._destroy();\n\n                this._trigger('destroyend');\n\n                this._element\n                    .removeData(pluginName)\n                    .removeAttr('data-' + pluginName.toLowerCase());\n\n                return this;\n            },\n            reload: function(options) {\n                if (false === this._trigger('reload')) {\n                    return this;\n                }\n\n                if (options) {\n                    this.options(options);\n                }\n\n                this._reload();\n\n                this._trigger('reloadend');\n\n                return this;\n            },\n            element: function() {\n                return this._element;\n            },\n            options: function(key, value) {\n                if (arguments.length === 0) {\n                    return $.extend({}, this._options);\n                }\n\n                if (typeof key === 'string') {\n                    if (typeof value === 'undefined') {\n                        return typeof this._options[key] === 'undefined' ?\n                                null :\n                                this._options[key];\n                    }\n\n                    this._options[key] = value;\n                } else {\n                    this._options = $.extend({}, this._options, key);\n                }\n\n                return this;\n            },\n            carousel: function() {\n                if (!this._carousel) {\n                    this._carousel = jCarousel.detectCarousel(this.options('carousel') || this._element);\n\n                    if (!this._carousel) {\n                        $.error('Could not detect carousel for plugin \"' + pluginName + '\"');\n                    }\n                }\n\n                return this._carousel;\n            },\n            _trigger: function(type, element, data) {\n                var event,\n                    defaultPrevented = false;\n\n                data = [this].concat(data || []);\n\n                (element || this._element).each(function() {\n                    event = $.Event((pluginName + ':' + type).toLowerCase());\n\n                    $(this).trigger(event, data);\n\n                    if (event.isDefaultPrevented()) {\n                        defaultPrevented = true;\n                    }\n                });\n\n                return !defaultPrevented;\n            }\n        };\n    };\n\n    jCarousel.plugin = function(pluginName, pluginPrototype) {\n        var Plugin = $[pluginName] = function(element, options) {\n            this._element = $(element);\n            this.options(options);\n\n            this._init();\n            this.create();\n        };\n\n        Plugin.fn = Plugin.prototype = $.extend(\n            {},\n            jCarousel.base(pluginName),\n            pluginPrototype\n        );\n\n        $.fn[pluginName] = function(options) {\n            var args        = Array.prototype.slice.call(arguments, 1),\n                returnValue = this;\n\n            if (typeof options === 'string') {\n                this.each(function() {\n                    var instance = $(this).data(pluginName);\n\n                    if (!instance) {\n                        return $.error(\n                            'Cannot call methods on ' + pluginName + ' prior to initialization; ' +\n                            'attempted to call method \"' + options + '\"'\n                        );\n                    }\n\n                    if (!$.isFunction(instance[options]) || options.charAt(0) === '_') {\n                        return $.error(\n                            'No such method \"' + options + '\" for ' + pluginName + ' instance'\n                        );\n                    }\n\n                    var methodValue = instance[options].apply(instance, args);\n\n                    if (methodValue !== instance && typeof methodValue !== 'undefined') {\n                        returnValue = methodValue;\n                        return false;\n                    }\n                });\n            } else {\n                this.each(function() {\n                    var instance = $(this).data(pluginName);\n\n                    if (instance instanceof Plugin) {\n                        instance.reload(options);\n                    } else {\n                        new Plugin(this, options);\n                    }\n                });\n            }\n\n            return returnValue;\n        };\n\n        return Plugin;\n    };\n}(jQuery));\n\n(function($, window) {\n    'use strict';\n\n    var $window = $(window);\n\n    var toFloat = function(val) {\n        return parseFloat(val) || 0;\n    };\n\n    $.jCarousel.plugin('jcarousel', {\n        animating:   false,\n        tail:        0,\n        inTail:      false,\n        resizeState: null,\n        resizeTimer: null,\n        lt:          null,\n        vertical:    false,\n        rtl:         false,\n        circular:    false,\n        underflow:   false,\n        relative:    false,\n\n        _options: {\n            list: function() {\n                return this.element().children().eq(0);\n            },\n            items: function() {\n                return this.list().children();\n            },\n            animation:   400,\n            transitions: false,\n            wrap:        null,\n            vertical:    null,\n            rtl:         null,\n            center:      false\n        },\n\n        // Protected, don't access directly\n        _list:         null,\n        _items:        null,\n        _target:       $(),\n        _first:        $(),\n        _last:         $(),\n        _visible:      $(),\n        _fullyvisible: $(),\n        _init: function() {\n            var self = this;\n\n            self.resizeState = $window.width() + 'x' + $window.height();\n\n            this.onWindowResize = function() {\n                if (self.resizeTimer) {\n                    clearTimeout(self.resizeTimer);\n                }\n\n                self.resizeTimer = setTimeout(function() {\n                    var currentResizeState = $window.width() + 'x' + $window.height();\n\n                    // Check if the window size actually changed.\n                    // iOS might trigger resize events on page scroll.\n                    if (currentResizeState === self.resizeState) {\n                        return;\n                    }\n\n                    self.resizeState = currentResizeState;\n                    self.reload();\n                }, 100);\n            };\n\n            return this;\n        },\n        _create: function() {\n            this._reload();\n\n            $window.on('resize.jcarousel', this.onWindowResize);\n        },\n        _destroy: function() {\n            $window.off('resize.jcarousel', this.onWindowResize);\n        },\n        _reload: function() {\n            this.vertical = this.options('vertical');\n\n            if (this.vertical == null) {\n                this.vertical = toFloat(this.list().height()) > toFloat(this.list().width());\n            }\n\n            this.rtl = this.options('rtl');\n\n            if (this.rtl == null) {\n                this.rtl = (function(element) {\n                    if (('' + element.attr('dir')).toLowerCase() === 'rtl') {\n                        return true;\n                    }\n\n                    var found = false;\n\n                    element.parents('[dir]').each(function() {\n                        if ((/rtl/i).test($(this).attr('dir'))) {\n                            found = true;\n                            return false;\n                        }\n                    });\n\n                    return found;\n                }(this._element));\n            }\n\n            this.lt = this.vertical ? 'top' : 'left';\n\n            // Ensure before closest() call\n            this.relative = this.list().css('position') === 'relative';\n\n            // Force list and items reload\n            this._list  = null;\n            this._items = null;\n\n            var item = this.index(this._target) >= 0 ?\n                           this._target :\n                           this.closest();\n\n            // _prepare() needs this here\n            this.circular  = this.options('wrap') === 'circular';\n            this.underflow = false;\n\n            var props = {'left': 0, 'top': 0};\n\n            if (item.length > 0) {\n                this._prepare(item);\n                this.list().find('[data-jcarousel-clone]').remove();\n\n                // Force items reload\n                this._items = null;\n\n                this.underflow = this._fullyvisible.length >= this.items().length;\n                this.circular  = this.circular && !this.underflow;\n\n                props[this.lt] = this._position(item) + 'px';\n            }\n\n            this.move(props);\n\n            return this;\n        },\n        list: function() {\n            if (this._list === null) {\n                var option = this.options('list');\n                this._list = $.isFunction(option) ? option.call(this) : this._element.find(option);\n            }\n\n            return this._list;\n        },\n        items: function() {\n            if (this._items === null) {\n                var option = this.options('items');\n                this._items = ($.isFunction(option) ? option.call(this) : this.list().find(option)).not('[data-jcarousel-clone]');\n            }\n\n            return this._items;\n        },\n        index: function(item) {\n            return this.items().index(item);\n        },\n        closest: function() {\n            var self    = this,\n                pos     = this.list().position()[this.lt],\n                closest = $(), // Ensure we're returning a jQuery instance\n                stop    = false,\n                lrb     = this.vertical ? 'bottom' : (this.rtl && !this.relative ? 'left' : 'right'),\n                width;\n\n            if (this.rtl && this.relative && !this.vertical) {\n                pos += toFloat(this.list().width()) - this.clipping();\n            }\n\n            this.items().each(function() {\n                closest = $(this);\n\n                if (stop) {\n                    return false;\n                }\n\n                var dim = self.dimension(closest);\n\n                pos += dim;\n\n                if (pos >= 0) {\n                    width = dim - toFloat(closest.css('margin-' + lrb));\n\n                    if ((Math.abs(pos) - dim + (width / 2)) <= 0) {\n                        stop = true;\n                    } else {\n                        return false;\n                    }\n                }\n            });\n\n\n            return closest;\n        },\n        target: function() {\n            return this._target;\n        },\n        first: function() {\n            return this._first;\n        },\n        last: function() {\n            return this._last;\n        },\n        visible: function() {\n            return this._visible;\n        },\n        fullyvisible: function() {\n            return this._fullyvisible;\n        },\n        hasNext: function() {\n            if (false === this._trigger('hasnext')) {\n                return true;\n            }\n\n            var wrap = this.options('wrap'),\n                end = this.items().length - 1,\n                check = this.options('center') ? this._target : this._last;\n\n            return end >= 0 && !this.underflow &&\n                ((wrap && wrap !== 'first') ||\n                    (this.index(check) < end) ||\n                    (this.tail && !this.inTail)) ? true : false;\n        },\n        hasPrev: function() {\n            if (false === this._trigger('hasprev')) {\n                return true;\n            }\n\n            var wrap = this.options('wrap');\n\n            return this.items().length > 0 && !this.underflow &&\n                ((wrap && wrap !== 'last') ||\n                    (this.index(this._first) > 0) ||\n                    (this.tail && this.inTail)) ? true : false;\n        },\n        clipping: function() {\n            return toFloat(this._element['inner' + (this.vertical ? 'Height' : 'Width')]());\n        },\n        dimension: function(element) {\n            return toFloat(element['outer' + (this.vertical ? 'Height' : 'Width')](true));\n        },\n        scroll: function(target, animate, callback) {\n            if (this.animating) {\n                return this;\n            }\n\n            if (false === this._trigger('scroll', null, [target, animate])) {\n                return this;\n            }\n\n            if ($.isFunction(animate)) {\n                callback = animate;\n                animate  = true;\n            }\n\n            var parsed = $.jCarousel.parseTarget(target);\n\n            if (parsed.relative) {\n                var end    = this.items().length - 1,\n                    scroll = Math.abs(parsed.target),\n                    wrap   = this.options('wrap'),\n                    current,\n                    first,\n                    index,\n                    start,\n                    curr,\n                    isVisible,\n                    props,\n                    i;\n\n                if (parsed.target > 0) {\n                    var last = this.index(this._last);\n\n                    if (last >= end && this.tail) {\n                        if (!this.inTail) {\n                            this._scrollTail(animate, callback);\n                        } else {\n                            if (wrap === 'both' || wrap === 'last') {\n                                this._scroll(0, animate, callback);\n                            } else {\n                                if ($.isFunction(callback)) {\n                                    callback.call(this, false);\n                                }\n                            }\n                        }\n                    } else {\n                        current = this.index(this._target);\n\n                        if ((this.underflow && current === end && (wrap === 'circular' || wrap === 'both' || wrap === 'last')) ||\n                            (!this.underflow && last === end && (wrap === 'both' || wrap === 'last'))) {\n                            this._scroll(0, animate, callback);\n                        } else {\n                            index = current + scroll;\n\n                            if (this.circular && index > end) {\n                                i = end;\n                                curr = this.items().get(-1);\n\n                                while (i++ < index) {\n                                    curr = this.items().eq(0);\n                                    isVisible = this._visible.index(curr) >= 0;\n\n                                    if (isVisible) {\n                                        curr.after(curr.clone(true).attr('data-jcarousel-clone', true));\n                                    }\n\n                                    this.list().append(curr);\n\n                                    if (!isVisible) {\n                                        props = {};\n                                        props[this.lt] = this.dimension(curr);\n                                        this.moveBy(props);\n                                    }\n\n                                    // Force items reload\n                                    this._items = null;\n                                }\n\n                                this._scroll(curr, animate, callback);\n                            } else {\n                                this._scroll(Math.min(index, end), animate, callback);\n                            }\n                        }\n                    }\n                } else {\n                    if (this.inTail) {\n                        this._scroll(Math.max((this.index(this._first) - scroll) + 1, 0), animate, callback);\n                    } else {\n                        first  = this.index(this._first);\n                        current = this.index(this._target);\n                        start  = this.underflow ? current : first;\n                        index  = start - scroll;\n\n                        if (start <= 0 && ((this.underflow && wrap === 'circular') || wrap === 'both' || wrap === 'first')) {\n                            this._scroll(end, animate, callback);\n                        } else {\n                            if (this.circular && index < 0) {\n                                i    = index;\n                                curr = this.items().get(0);\n\n                                while (i++ < 0) {\n                                    curr = this.items().eq(-1);\n                                    isVisible = this._visible.index(curr) >= 0;\n\n                                    if (isVisible) {\n                                        curr.after(curr.clone(true).attr('data-jcarousel-clone', true));\n                                    }\n\n                                    this.list().prepend(curr);\n\n                                    // Force items reload\n                                    this._items = null;\n\n                                    var dim = this.dimension(curr);\n\n                                    props = {};\n                                    props[this.lt] = -dim;\n                                    this.moveBy(props);\n\n                                }\n\n                                this._scroll(curr, animate, callback);\n                            } else {\n                                this._scroll(Math.max(index, 0), animate, callback);\n                            }\n                        }\n                    }\n                }\n            } else {\n                this._scroll(parsed.target, animate, callback);\n            }\n\n            this._trigger('scrollend');\n\n            return this;\n        },\n        moveBy: function(properties, opts) {\n            var position = this.list().position(),\n                multiplier = 1,\n                correction = 0;\n\n            if (this.rtl && !this.vertical) {\n                multiplier = -1;\n\n                if (this.relative) {\n                    correction = toFloat(this.list().width()) - this.clipping();\n                }\n            }\n\n            if (properties.left) {\n                properties.left = (toFloat(position.left) + correction + toFloat(properties.left) * multiplier) + 'px';\n            }\n\n            if (properties.top) {\n                properties.top = (toFloat(position.top) + correction + toFloat(properties.top) * multiplier) + 'px';\n            }\n\n            return this.move(properties, opts);\n        },\n        move: function(properties, opts) {\n            opts = opts || {};\n\n            var option       = this.options('transitions'),\n                transitions  = !!option,\n                transforms   = !!option.transforms,\n                transforms3d = !!option.transforms3d,\n                duration     = opts.duration || 0,\n                list         = this.list();\n\n            if (!transitions && duration > 0) {\n                list.animate(properties, opts);\n                return;\n            }\n\n            var complete = opts.complete || $.noop,\n                css = {};\n\n            if (transitions) {\n                var backup = {\n                        transitionDuration: list.css('transitionDuration'),\n                        transitionTimingFunction: list.css('transitionTimingFunction'),\n                        transitionProperty: list.css('transitionProperty')\n                    },\n                    oldComplete = complete;\n\n                complete = function() {\n                    $(this).css(backup);\n                    oldComplete.call(this);\n                };\n                css = {\n                    transitionDuration: (duration > 0 ? duration / 1000 : 0) + 's',\n                    transitionTimingFunction: option.easing || opts.easing,\n                    transitionProperty: duration > 0 ? (function() {\n                        if (transforms || transforms3d) {\n                            // We have to use 'all' because jQuery doesn't prefix\n                            // css values, like transition-property: transform;\n                            return 'all';\n                        }\n\n                        return properties.left ? 'left' : 'top';\n                    })() : 'none',\n                    transform: 'none'\n                };\n            }\n\n            if (transforms3d) {\n                css.transform = 'translate3d(' + (properties.left || 0) + ',' + (properties.top || 0) + ',0)';\n            } else if (transforms) {\n                css.transform = 'translate(' + (properties.left || 0) + ',' + (properties.top || 0) + ')';\n            } else {\n                $.extend(css, properties);\n            }\n\n            if (transitions && duration > 0) {\n                list.one('transitionend webkitTransitionEnd oTransitionEnd otransitionend MSTransitionEnd', complete);\n            }\n\n            list.css(css);\n\n            if (duration <= 0) {\n                list.each(function() {\n                    complete.call(this);\n                });\n            }\n        },\n        _scroll: function(item, animate, callback) {\n            if (this.animating) {\n                if ($.isFunction(callback)) {\n                    callback.call(this, false);\n                }\n\n                return this;\n            }\n\n            if (typeof item !== 'object') {\n                item = this.items().eq(item);\n            } else if (typeof item.jquery === 'undefined') {\n                item = $(item);\n            }\n\n            if (item.length === 0) {\n                if ($.isFunction(callback)) {\n                    callback.call(this, false);\n                }\n\n                return this;\n            }\n\n            this.inTail = false;\n\n            this._prepare(item);\n\n            var pos     = this._position(item),\n                currPos = toFloat(this.list().position()[this.lt]);\n\n            if (pos === currPos) {\n                if ($.isFunction(callback)) {\n                    callback.call(this, false);\n                }\n\n                return this;\n            }\n\n            var properties = {};\n            properties[this.lt] = pos + 'px';\n\n            this._animate(properties, animate, callback);\n\n            return this;\n        },\n        _scrollTail: function(animate, callback) {\n            if (this.animating || !this.tail) {\n                if ($.isFunction(callback)) {\n                    callback.call(this, false);\n                }\n\n                return this;\n            }\n\n            var pos = this.list().position()[this.lt];\n\n            if (this.rtl && this.relative && !this.vertical) {\n                pos += toFloat(this.list().width()) - this.clipping();\n            }\n\n            if (this.rtl && !this.vertical) {\n                pos += this.tail;\n            } else {\n                pos -= this.tail;\n            }\n\n            this.inTail = true;\n\n            var properties = {};\n            properties[this.lt] = pos + 'px';\n\n            this._update({\n                target:       this._target.next(),\n                fullyvisible: this._fullyvisible.slice(1).add(this._visible.last())\n            });\n\n            this._animate(properties, animate, callback);\n\n            return this;\n        },\n        _animate: function(properties, animate, callback) {\n            callback = callback || $.noop;\n\n            if (false === this._trigger('animate')) {\n                callback.call(this, false);\n                return this;\n            }\n\n            this.animating = true;\n\n            var animation = this.options('animation'),\n                complete  = $.proxy(function() {\n                    this.animating = false;\n\n                    var c = this.list().find('[data-jcarousel-clone]');\n\n                    if (c.length > 0) {\n                        c.remove();\n                        this._reload();\n                    }\n\n                    this._trigger('animateend');\n\n                    callback.call(this, true);\n                }, this);\n\n            var opts = typeof animation === 'object' ?\n                           $.extend({}, animation) :\n                           {duration: animation},\n                oldComplete = opts.complete || $.noop;\n\n            if (animate === false) {\n                opts.duration = 0;\n            } else if (typeof $.fx.speeds[opts.duration] !== 'undefined') {\n                opts.duration = $.fx.speeds[opts.duration];\n            }\n\n            opts.complete = function() {\n                complete();\n                oldComplete.call(this);\n            };\n\n            this.move(properties, opts);\n\n            return this;\n        },\n        _prepare: function(item) {\n            var index  = this.index(item),\n                idx    = index,\n                wh     = this.dimension(item),\n                clip   = this.clipping(),\n                lrb    = this.vertical ? 'bottom' : (this.rtl ? 'left'  : 'right'),\n                center = this.options('center'),\n                update = {\n                    target:       item,\n                    first:        item,\n                    last:         item,\n                    visible:      item,\n                    fullyvisible: wh <= clip ? item : $()\n                },\n                curr,\n                isVisible,\n                margin,\n                dim;\n\n            if (center) {\n                wh /= 2;\n                clip /= 2;\n            }\n\n            if (wh < clip) {\n                while (true) {\n                    curr = this.items().eq(++idx);\n\n                    if (curr.length === 0) {\n                        if (!this.circular) {\n                            break;\n                        }\n\n                        curr = this.items().eq(0);\n\n                        if (item.get(0) === curr.get(0)) {\n                            break;\n                        }\n\n                        isVisible = this._visible.index(curr) >= 0;\n\n                        if (isVisible) {\n                            curr.after(curr.clone(true).attr('data-jcarousel-clone', true));\n                        }\n\n                        this.list().append(curr);\n\n                        if (!isVisible) {\n                            var props = {};\n                            props[this.lt] = this.dimension(curr);\n                            this.moveBy(props);\n                        }\n\n                        // Force items reload\n                        this._items = null;\n                    }\n\n                    dim = this.dimension(curr);\n\n                    if (dim === 0) {\n                        break;\n                    }\n\n                    wh += dim;\n\n                    update.last    = curr;\n                    update.visible = update.visible.add(curr);\n\n                    // Remove right/bottom margin from total width\n                    margin = toFloat(curr.css('margin-' + lrb));\n\n                    if ((wh - margin) <= clip) {\n                        update.fullyvisible = update.fullyvisible.add(curr);\n                    }\n\n                    if (wh >= clip) {\n                        break;\n                    }\n                }\n            }\n\n            if (!this.circular && !center && wh < clip) {\n                idx = index;\n\n                while (true) {\n                    if (--idx < 0) {\n                        break;\n                    }\n\n                    curr = this.items().eq(idx);\n\n                    if (curr.length === 0) {\n                        break;\n                    }\n\n                    dim = this.dimension(curr);\n\n                    if (dim === 0) {\n                        break;\n                    }\n\n                    wh += dim;\n\n                    update.first   = curr;\n                    update.visible = update.visible.add(curr);\n\n                    // Remove right/bottom margin from total width\n                    margin = toFloat(curr.css('margin-' + lrb));\n\n                    if ((wh - margin) <= clip) {\n                        update.fullyvisible = update.fullyvisible.add(curr);\n                    }\n\n                    if (wh >= clip) {\n                        break;\n                    }\n                }\n            }\n\n            this._update(update);\n\n            this.tail = 0;\n\n            if (!center &&\n                this.options('wrap') !== 'circular' &&\n                this.options('wrap') !== 'custom' &&\n                this.index(update.last) === (this.items().length - 1)) {\n\n                // Remove right/bottom margin from total width\n                wh -= toFloat(update.last.css('margin-' + lrb));\n\n                if (wh > clip) {\n                    this.tail = wh - clip;\n                }\n            }\n\n            return this;\n        },\n        _position: function(item) {\n            var first  = this._first,\n                pos    = toFloat(first.position()[this.lt]),\n                center = this.options('center'),\n                centerOffset = center ? (this.clipping() / 2) - (this.dimension(first) / 2) : 0;\n\n            if (this.rtl && !this.vertical) {\n                if (this.relative) {\n                    pos -= toFloat(this.list().width()) - this.dimension(first);\n                } else {\n                    pos -= this.clipping() - this.dimension(first);\n                }\n\n                pos += centerOffset;\n            } else {\n                pos -= centerOffset;\n            }\n\n            if (!center &&\n                (this.index(item) > this.index(first) || this.inTail) &&\n                this.tail) {\n                pos = this.rtl && !this.vertical ? pos - this.tail : pos + this.tail;\n                this.inTail = true;\n            } else {\n                this.inTail = false;\n            }\n\n            return -pos;\n        },\n        _update: function(update) {\n            var self = this,\n                current = {\n                    target:       this._target,\n                    first:        this._first,\n                    last:         this._last,\n                    visible:      this._visible,\n                    fullyvisible: this._fullyvisible\n                },\n                back = this.index(update.first || current.first) < this.index(current.first),\n                key,\n                doUpdate = function(key) {\n                    var elIn  = [],\n                        elOut = [];\n\n                    update[key].each(function() {\n                        if (current[key].index(this) < 0) {\n                            elIn.push(this);\n                        }\n                    });\n\n                    current[key].each(function() {\n                        if (update[key].index(this) < 0) {\n                            elOut.push(this);\n                        }\n                    });\n\n                    if (back) {\n                        elIn = elIn.reverse();\n                    } else {\n                        elOut = elOut.reverse();\n                    }\n\n                    self._trigger(key + 'in', $(elIn));\n                    self._trigger(key + 'out', $(elOut));\n\n                    self['_' + key] = update[key];\n                };\n\n            for (key in update) {\n                doUpdate(key);\n            }\n\n            return this;\n        }\n    });\n}(jQuery, window));\n\n(function($) {\n    'use strict';\n\n    $.jcarousel.fn.scrollIntoView = function(target, animate, callback) {\n        var parsed = $.jCarousel.parseTarget(target),\n            first  = this.index(this._fullyvisible.first()),\n            last   = this.index(this._fullyvisible.last()),\n            index;\n\n        if (parsed.relative) {\n            index = parsed.target < 0 ? Math.max(0, first + parsed.target) : last + parsed.target;\n        } else {\n            index = typeof parsed.target !== 'object' ? parsed.target : this.index(parsed.target);\n        }\n\n        if (index < first) {\n            return this.scroll(index, animate, callback);\n        }\n\n        if (index >= first && index <= last) {\n            if ($.isFunction(callback)) {\n                callback.call(this, false);\n            }\n\n            return this;\n        }\n\n        var items = this.items(),\n            clip = this.clipping(),\n            lrb  = this.vertical ? 'bottom' : (this.rtl ? 'left'  : 'right'),\n            wh   = 0,\n            curr;\n\n        while (true) {\n            curr = items.eq(index);\n\n            if (curr.length === 0) {\n                break;\n            }\n\n            wh += this.dimension(curr);\n\n            if (wh >= clip) {\n                var margin = parseFloat(curr.css('margin-' + lrb)) || 0;\n                if ((wh - margin) !== clip) {\n                    index++;\n                }\n                break;\n            }\n\n            if (index <= 0) {\n                break;\n            }\n\n            index--;\n        }\n\n        return this.scroll(index, animate, callback);\n    };\n}(jQuery));\n\n(function($) {\n    'use strict';\n\n    $.jCarousel.plugin('jcarouselControl', {\n        _options: {\n            target: '+=1',\n            event:  'click',\n            method: 'scroll'\n        },\n        _active: null,\n        _init: function() {\n            this.onDestroy = $.proxy(function() {\n                this._destroy();\n                this.carousel()\n                    .one('jcarousel:createend', $.proxy(this._create, this));\n            }, this);\n            this.onReload = $.proxy(this._reload, this);\n            this.onEvent = $.proxy(function(e) {\n                e.preventDefault();\n\n                var method = this.options('method');\n\n                if ($.isFunction(method)) {\n                    method.call(this);\n                } else {\n                    this.carousel()\n                        .jcarousel(this.options('method'), this.options('target'));\n                }\n            }, this);\n        },\n        _create: function() {\n            this.carousel()\n                .one('jcarousel:destroy', this.onDestroy)\n                .on('jcarousel:reloadend jcarousel:scrollend', this.onReload);\n\n            this._element\n                .on(this.options('event') + '.jcarouselcontrol', this.onEvent);\n\n            this._reload();\n        },\n        _destroy: function() {\n            this._element\n                .off('.jcarouselcontrol', this.onEvent);\n\n            this.carousel()\n                .off('jcarousel:destroy', this.onDestroy)\n                .off('jcarousel:reloadend jcarousel:scrollend', this.onReload);\n        },\n        _reload: function() {\n            var parsed   = $.jCarousel.parseTarget(this.options('target')),\n                carousel = this.carousel(),\n                active;\n\n            if (parsed.relative) {\n                active = carousel\n                    .jcarousel(parsed.target > 0 ? 'hasNext' : 'hasPrev');\n            } else {\n                var target = typeof parsed.target !== 'object' ?\n                                carousel.jcarousel('items').eq(parsed.target) :\n                                parsed.target;\n\n                active = carousel.jcarousel('target').index(target) >= 0;\n            }\n\n            if (this._active !== active) {\n                this._trigger(active ? 'active' : 'inactive');\n                this._active = active;\n            }\n\n            return this;\n        }\n    });\n}(jQuery));\n\n(function($) {\n    'use strict';\n\n    $.jCarousel.plugin('jcarouselPagination', {\n        _options: {\n            perPage: null,\n            item: function(page) {\n                return '<a href=\"#' + page + '\">' + page + '</a>';\n            },\n            event:  'click',\n            method: 'scroll'\n        },\n        _carouselItems: null,\n        _pages: {},\n        _items: {},\n        _currentPage: null,\n        _init: function() {\n            this.onDestroy = $.proxy(function() {\n                this._destroy();\n                this.carousel()\n                    .one('jcarousel:createend', $.proxy(this._create, this));\n            }, this);\n            this.onReload = $.proxy(this._reload, this);\n            this.onScroll = $.proxy(this._update, this);\n        },\n        _create: function() {\n            this.carousel()\n                .one('jcarousel:destroy', this.onDestroy)\n                .on('jcarousel:reloadend', this.onReload)\n                .on('jcarousel:scrollend', this.onScroll);\n\n            this._reload();\n        },\n        _destroy: function() {\n            this._clear();\n\n            this.carousel()\n                .off('jcarousel:destroy', this.onDestroy)\n                .off('jcarousel:reloadend', this.onReload)\n                .off('jcarousel:scrollend', this.onScroll);\n\n            this._carouselItems = null;\n        },\n        _reload: function() {\n            var perPage = this.options('perPage');\n\n            this._pages = {};\n            this._items = {};\n\n            // Calculate pages\n            if ($.isFunction(perPage)) {\n                perPage = perPage.call(this);\n            }\n\n            if (perPage == null) {\n                this._pages = this._calculatePages();\n            } else {\n                var pp    = parseInt(perPage, 10) || 0,\n                    items = this._getCarouselItems(),\n                    page  = 1,\n                    i     = 0,\n                    curr;\n\n                while (true) {\n                    curr = items.eq(i++);\n\n                    if (curr.length === 0) {\n                        break;\n                    }\n\n                    if (!this._pages[page]) {\n                        this._pages[page] = curr;\n                    } else {\n                        this._pages[page] = this._pages[page].add(curr);\n                    }\n\n                    if (i % pp === 0) {\n                        page++;\n                    }\n                }\n            }\n\n            this._clear();\n\n            var self     = this,\n                carousel = this.carousel().data('jcarousel'),\n                element  = this._element,\n                item     = this.options('item'),\n                numCarouselItems = this._getCarouselItems().length;\n\n            $.each(this._pages, function(page, carouselItems) {\n                var currItem = self._items[page] = $(item.call(self, page, carouselItems));\n\n                currItem.on(self.options('event') + '.jcarouselpagination', $.proxy(function() {\n                    var target = carouselItems.eq(0);\n\n                    // If circular wrapping enabled, ensure correct scrolling direction\n                    if (carousel.circular) {\n                        var currentIndex = carousel.index(carousel.target()),\n                            newIndex     = carousel.index(target);\n\n                        if (parseFloat(page) > parseFloat(self._currentPage)) {\n                            if (newIndex < currentIndex) {\n                                target = '+=' + (numCarouselItems - currentIndex + newIndex);\n                            }\n                        } else {\n                            if (newIndex > currentIndex) {\n                                target = '-=' + (currentIndex + (numCarouselItems - newIndex));\n                            }\n                        }\n                    }\n\n                    carousel[this.options('method')](target);\n                }, self));\n\n                element.append(currItem);\n            });\n\n            this._update();\n        },\n        _update: function() {\n            var target = this.carousel().jcarousel('target'),\n                currentPage;\n\n            $.each(this._pages, function(page, carouselItems) {\n                carouselItems.each(function() {\n                    if (target.is(this)) {\n                        currentPage = page;\n                        return false;\n                    }\n                });\n\n                if (currentPage) {\n                    return false;\n                }\n            });\n\n            if (this._currentPage !== currentPage) {\n                this._trigger('inactive', this._items[this._currentPage]);\n                this._trigger('active', this._items[currentPage]);\n            }\n\n            this._currentPage = currentPage;\n        },\n        items: function() {\n            return this._items;\n        },\n        reloadCarouselItems: function() {\n            this._carouselItems = null;\n            return this;\n        },\n        _clear: function() {\n            this._element.empty();\n            this._currentPage = null;\n        },\n        _calculatePages: function() {\n            var carousel = this.carousel().data('jcarousel'),\n                items    = this._getCarouselItems(),\n                clip     = carousel.clipping(),\n                wh       = 0,\n                idx      = 0,\n                page     = 1,\n                pages    = {},\n                curr,\n                dim;\n\n            while (true) {\n                curr = items.eq(idx++);\n\n                if (curr.length === 0) {\n                    break;\n                }\n\n                dim = carousel.dimension(curr);\n\n                if ((wh + dim) > clip) {\n                    page++;\n                    wh = 0;\n                }\n\n                wh += dim;\n\n                if (!pages[page]) {\n                    pages[page] = curr;\n                } else {\n                    pages[page] = pages[page].add(curr);\n                }\n            }\n\n            return pages;\n        },\n        _getCarouselItems: function() {\n            if (!this._carouselItems) {\n                this._carouselItems = this.carousel().jcarousel('items');\n            }\n\n            return this._carouselItems;\n        }\n    });\n}(jQuery));\n\n(function($, document) {\n    'use strict';\n\n    var hiddenProp,\n        visibilityChangeEvent,\n        visibilityChangeEventNames = {\n            hidden: 'visibilitychange',\n            mozHidden: 'mozvisibilitychange',\n            msHidden: 'msvisibilitychange',\n            webkitHidden: 'webkitvisibilitychange'\n        }\n    ;\n\n    $.each(visibilityChangeEventNames, function(key, val) {\n        if (typeof document[key] !== 'undefined') {\n            hiddenProp = key;\n            visibilityChangeEvent = val;\n            return false;\n        }\n    });\n\n    $.jCarousel.plugin('jcarouselAutoscroll', {\n        _options: {\n            target:    '+=1',\n            interval:  3000,\n            autostart: true,\n            method: 'scroll'\n        },\n        _timer: null,\n        _started: false,\n        _init: function () {\n            this.onDestroy = $.proxy(function() {\n                this._destroy();\n                this.carousel()\n                    .one('jcarousel:createend', $.proxy(this._create, this));\n            }, this);\n\n            this.onAnimateEnd = $.proxy(this._start, this);\n\n            this.onVisibilityChange = $.proxy(function() {\n                if (document[hiddenProp]) {\n                    this._stop();\n                } else {\n                    this._start();\n                }\n            }, this);\n        },\n        _create: function() {\n            this.carousel()\n                .one('jcarousel:destroy', this.onDestroy);\n\n            $(document)\n                .on(visibilityChangeEvent, this.onVisibilityChange);\n\n            if (this.options('autostart')) {\n                this.start();\n            }\n        },\n        _destroy: function() {\n            this._stop();\n\n            this.carousel()\n                .off('jcarousel:destroy', this.onDestroy);\n\n            $(document)\n                .off(visibilityChangeEvent, this.onVisibilityChange);\n        },\n        _start: function() {\n            this._stop();\n\n            if (!this._started) {\n                return;\n            }\n\n            this.carousel()\n                .one('jcarousel:animateend', this.onAnimateEnd);\n\n            this._timer = setTimeout($.proxy(function() {\n                this.carousel().jcarousel(this.options('method'), this.options('target'));\n            }, this), this.options('interval'));\n\n            return this;\n        },\n        _stop: function() {\n            if (this._timer) {\n                this._timer = clearTimeout(this._timer);\n            }\n\n            this.carousel()\n                .off('jcarousel:animateend', this.onAnimateEnd);\n\n            return this;\n        },\n        start: function() {\n            this._started = true;\n            this._start();\n\n            return this;\n        },\n        stop: function() {\n            this._started = false;\n            this._stop();\n\n            return this;\n        }\n    });\n}(jQuery, document));\n","$(\"body\").append('<div id=\"bt-body\" class=\"bt-safe\"></div>');\n\tdocument.btBody = document.getElementById('bt-body');\n/*!\n * Bootstrap v3.4.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under the MIT license\n */\n\nif (typeof jQuery === 'undefined') {\n  throw new Error('Bootstrap\\'s JavaScript requires jQuery')\n}\n\n+function ($) {\n  'use strict';\n  var version = $.fn.jquery.split(' ')[0].split('.')\n  if ((version[0] < 2 && version[1] < 9) || (version[0] == 1 && version[1] == 9 && version[2] < 1) || (version[0] > 3)) {\n    throw new Error('Bootstrap\\'s JavaScript requires jQuery version 1.9.1 or higher, but lower than version 4')\n  }\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: transition.js v3.4.1\n * https://getbootstrap.com/docs/3.4/javascript/#transitions\n * ========================================================================\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // CSS TRANSITION SUPPORT (Shoutout: https://modernizr.com/)\n  // ============================================================\n\n  function transitionEnd() {\n    var el = document.createElement('bootstrap')\n\n    var transEndEventNames = {\n      WebkitTransition : 'webkitTransitionEnd',\n      MozTransition    : 'transitionend',\n      OTransition      : 'oTransitionEnd otransitionend',\n      transition       : 'transitionend'\n    }\n\n    for (var name in transEndEventNames) {\n      if (el.style[name] !== undefined) {\n        return { end: transEndEventNames[name] }\n      }\n    }\n\n    return false // explicit for ie8 (  ._.)\n  }\n\n  // https://blog.alexmaccaw.com/css-transitions\n  $.fn.emulateTransitionEnd = function (duration) {\n    var called = false\n    var $el = this\n    $(this).one('bsTransitionEnd', function () { called = true })\n    var callback = function () { if (!called) $($el).trigger($.support.transition.end) }\n    setTimeout(callback, duration)\n    return this\n  }\n\n  $(function () {\n    $.support.transition = transitionEnd()\n\n    if (!$.support.transition) return\n\n    $.event.special.bsTransitionEnd = {\n      bindType: $.support.transition.end,\n      delegateType: $.support.transition.end,\n      handle: function (e) {\n        if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments)\n      }\n    }\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: alert.js v3.4.1\n * https://getbootstrap.com/docs/3.4/javascript/#alerts\n * ========================================================================\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // ALERT CLASS DEFINITION\n  // ======================\n\n  var dismiss = '[data-dismiss=\"alert\"]'\n  var Alert   = function (el) {\n    $(el).on('click', dismiss, this.close)\n  }\n\n  Alert.VERSION = '3.4.1'\n\n  Alert.TRANSITION_DURATION = 150\n\n  Alert.prototype.close = function (e) {\n    var $this    = $(this)\n    var selector = $this.attr('data-target')\n\n    if (!selector) {\n      selector = $this.attr('href')\n      selector = selector && selector.replace(/.*(?=#[^\\s]*$)/, '') // strip for ie7\n    }\n\n    selector    = selector === '#' ? [] : selector\n    var $parent = $(document).find(selector)\n\n    if (e) e.preventDefault()\n\n    if (!$parent.length) {\n      $parent = $this.closest('.alert')\n    }\n\n    $parent.trigger(e = $.Event('close.bs.alert'))\n\n    if (e.isDefaultPrevented()) return\n\n    $parent.removeClass('in')\n\n    function removeElement() {\n      // detach from parent, fire event then clean up data\n      $parent.detach().trigger('closed.bs.alert').remove()\n    }\n\n    $.support.transition && $parent.hasClass('fade') ?\n      $parent\n        .one('bsTransitionEnd', removeElement)\n        .emulateTransitionEnd(Alert.TRANSITION_DURATION) :\n      removeElement()\n  }\n\n\n  // ALERT PLUGIN DEFINITION\n  // =======================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this = $(this)\n      var data  = $this.data('bs.alert')\n\n      if (!data) $this.data('bs.alert', (data = new Alert(this)))\n      if (typeof option == 'string') data[option].call($this)\n    })\n  }\n\n  var old = $.fn.alert\n\n  $.fn.alert             = Plugin\n  $.fn.alert.Constructor = Alert\n\n\n  // ALERT NO CONFLICT\n  // =================\n\n  $.fn.alert.noConflict = function () {\n    $.fn.alert = old\n    return this\n  }\n\n\n  // ALERT DATA-API\n  // ==============\n\n  $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close)\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: button.js v3.4.1\n * https://getbootstrap.com/docs/3.4/javascript/#buttons\n * ========================================================================\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // BUTTON PUBLIC CLASS DEFINITION\n  // ==============================\n\n  var Button = function (element, options) {\n    this.$element  = $(element)\n    this.options   = $.extend({}, Button.DEFAULTS, options)\n    this.isLoading = false\n  }\n\n  Button.VERSION  = '3.4.1'\n\n  Button.DEFAULTS = {\n    loadingText: 'loading...'\n  }\n\n  Button.prototype.setState = function (state) {\n    var d    = 'disabled'\n    var $el  = this.$element\n    var val  = $el.is('input') ? 'val' : 'html'\n    var data = $el.data()\n\n    state += 'Text'\n\n    if (data.resetText == null) $el.data('resetText', $el[val]())\n\n    // push to event loop to allow forms to submit\n    setTimeout($.proxy(function () {\n      $el[val](data[state] == null ? this.options[state] : data[state])\n\n      if (state == 'loadingText') {\n        this.isLoading = true\n        $el.addClass(d).attr(d, d).prop(d, true)\n      } else if (this.isLoading) {\n        this.isLoading = false\n        $el.removeClass(d).removeAttr(d).prop(d, false)\n      }\n    }, this), 0)\n  }\n\n  Button.prototype.toggle = function () {\n    var changed = true\n    var $parent = this.$element.closest('[data-toggle=\"buttons\"]')\n\n    if ($parent.length) {\n      var $input = this.$element.find('input')\n      if ($input.prop('type') == 'radio') {\n        if ($input.prop('checked')) changed = false\n        $parent.find('.active').removeClass('active')\n        this.$element.addClass('active')\n      } else if ($input.prop('type') == 'checkbox') {\n        if (($input.prop('checked')) !== this.$element.hasClass('active')) changed = false\n        this.$element.toggleClass('active')\n      }\n      $input.prop('checked', this.$element.hasClass('active'))\n      if (changed) $input.trigger('change')\n    } else {\n      this.$element.attr('aria-pressed', !this.$element.hasClass('active'))\n      this.$element.toggleClass('active')\n    }\n  }\n\n\n  // BUTTON PLUGIN DEFINITION\n  // ========================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.button')\n      var options = typeof option == 'object' && option\n\n      if (!data) $this.data('bs.button', (data = new Button(this, options)))\n\n      if (option == 'toggle') data.toggle()\n      else if (option) data.setState(option)\n    })\n  }\n\n  var old = $.fn.button\n\n  $.fn.button             = Plugin\n  $.fn.button.Constructor = Button\n\n\n  // BUTTON NO CONFLICT\n  // ==================\n\n  $.fn.button.noConflict = function () {\n    $.fn.button = old\n    return this\n  }\n\n\n  // BUTTON DATA-API\n  // ===============\n\n  $(document)\n    .on('click.bs.button.data-api', '[data-toggle^=\"button\"]', function (e) {\n      var $btn = $(e.target).closest('.btn')\n      Plugin.call($btn, 'toggle')\n      if (!($(e.target).is('input[type=\"radio\"], input[type=\"checkbox\"]'))) {\n        // Prevent double click on radios, and the double selections (so cancellation) on checkboxes\n        e.preventDefault()\n        // The target component still receive the focus\n        if ($btn.is('input,button')) $btn.trigger('focus')\n        else $btn.find('input:visible,button:visible').first().trigger('focus')\n      }\n    })\n    .on('focus.bs.button.data-api blur.bs.button.data-api', '[data-toggle^=\"button\"]', function (e) {\n      $(e.target).closest('.btn').toggleClass('focus', /^focus(in)?$/.test(e.type))\n    })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: carousel.js v3.4.1\n * https://getbootstrap.com/docs/3.4/javascript/#carousel\n * ========================================================================\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // CAROUSEL CLASS DEFINITION\n  // =========================\n\n  var Carousel = function (element, options) {\n    this.$element    = $(element)\n    this.$indicators = this.$element.find('.carousel-indicators')\n    this.options     = options\n    this.paused      = null\n    this.sliding     = null\n    this.interval    = null\n    this.$active     = null\n    this.$items      = null\n\n    this.options.keyboard && this.$element.on('keydown.bs.carousel', $.proxy(this.keydown, this))\n\n    this.options.pause == 'hover' && !('ontouchstart' in document.documentElement) && this.$element\n      .on('mouseenter.bs.carousel', $.proxy(this.pause, this))\n      .on('mouseleave.bs.carousel', $.proxy(this.cycle, this))\n  }\n\n  Carousel.VERSION  = '3.4.1'\n\n  Carousel.TRANSITION_DURATION = 600\n\n  Carousel.DEFAULTS = {\n    interval: 5000,\n    pause: 'hover',\n    wrap: true,\n    keyboard: true\n  }\n\n  Carousel.prototype.keydown = function (e) {\n    if (/input|textarea/i.test(e.target.tagName)) return\n    switch (e.which) {\n      case 37: this.prev(); break\n      case 39: this.next(); break\n      default: return\n    }\n\n    e.preventDefault()\n  }\n\n  Carousel.prototype.cycle = function (e) {\n    e || (this.paused = false)\n\n    this.interval && clearInterval(this.interval)\n\n    this.options.interval\n      && !this.paused\n      && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))\n\n    return this\n  }\n\n  Carousel.prototype.getItemIndex = function (item) {\n    this.$items = item.parent().children('.item')\n    return this.$items.index(item || this.$active)\n  }\n\n  Carousel.prototype.getItemForDirection = function (direction, active) {\n    var activeIndex = this.getItemIndex(active)\n    var willWrap = (direction == 'prev' && activeIndex === 0)\n                || (direction == 'next' && activeIndex == (this.$items.length - 1))\n    if (willWrap && !this.options.wrap) return active\n    var delta = direction == 'prev' ? -1 : 1\n    var itemIndex = (activeIndex + delta) % this.$items.length\n    return this.$items.eq(itemIndex)\n  }\n\n  Carousel.prototype.to = function (pos) {\n    var that        = this\n    var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active'))\n\n    if (pos > (this.$items.length - 1) || pos < 0) return\n\n    if (this.sliding)       return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, \"slid\"\n    if (activeIndex == pos) return this.pause().cycle()\n\n    return this.slide(pos > activeIndex ? 'next' : 'prev', this.$items.eq(pos))\n  }\n\n  Carousel.prototype.pause = function (e) {\n    e || (this.paused = true)\n\n    if (this.$element.find('.next, .prev').length && $.support.transition) {\n      this.$element.trigger($.support.transition.end)\n      this.cycle(true)\n    }\n\n    this.interval = clearInterval(this.interval)\n\n    return this\n  }\n\n  Carousel.prototype.next = function () {\n    if (this.sliding) return\n    return this.slide('next')\n  }\n\n  Carousel.prototype.prev = function () {\n    if (this.sliding) return\n    return this.slide('prev')\n  }\n\n  Carousel.prototype.slide = function (type, next) {\n    var $active   = this.$element.find('.item.active')\n    var $next     = next || this.getItemForDirection(type, $active)\n    var isCycling = this.interval\n    var direction = type == 'next' ? 'left' : 'right'\n    var that      = this\n\n    if ($next.hasClass('active')) return (this.sliding = false)\n\n    var relatedTarget = $next[0]\n    var slideEvent = $.Event('slide.bs.carousel', {\n      relatedTarget: relatedTarget,\n      direction: direction\n    })\n    this.$element.trigger(slideEvent)\n    if (slideEvent.isDefaultPrevented()) return\n\n    this.sliding = true\n\n    isCycling && this.pause()\n\n    if (this.$indicators.length) {\n      this.$indicators.find('.active').removeClass('active')\n      var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)])\n      $nextIndicator && $nextIndicator.addClass('active')\n    }\n\n    var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, \"slid\"\n    if ($.support.transition && this.$element.hasClass('slide')) {\n      $next.addClass(type)\n      if (typeof $next === 'object' && $next.length) {\n        $next[0].offsetWidth // force reflow\n      }\n      $active.addClass(direction)\n      $next.addClass(direction)\n      $active\n        .one('bsTransitionEnd', function () {\n          $next.removeClass([type, direction].join(' ')).addClass('active')\n          $active.removeClass(['active', direction].join(' '))\n          that.sliding = false\n          setTimeout(function () {\n            that.$element.trigger(slidEvent)\n          }, 0)\n        })\n        .emulateTransitionEnd(Carousel.TRANSITION_DURATION)\n    } else {\n      $active.removeClass('active')\n      $next.addClass('active')\n      this.sliding = false\n      this.$element.trigger(slidEvent)\n    }\n\n    isCycling && this.cycle()\n\n    return this\n  }\n\n\n  // CAROUSEL PLUGIN DEFINITION\n  // ==========================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.carousel')\n      var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option)\n      var action  = typeof option == 'string' ? option : options.slide\n\n      if (!data) $this.data('bs.carousel', (data = new Carousel(this, options)))\n      if (typeof option == 'number') data.to(option)\n      else if (action) data[action]()\n      else if (options.interval) data.pause().cycle()\n    })\n  }\n\n  var old = $.fn.carousel\n\n  $.fn.carousel             = Plugin\n  $.fn.carousel.Constructor = Carousel\n\n\n  // CAROUSEL NO CONFLICT\n  // ====================\n\n  $.fn.carousel.noConflict = function () {\n    $.fn.carousel = old\n    return this\n  }\n\n\n  // CAROUSEL DATA-API\n  // =================\n\n  var clickHandler = function (e) {\n    var $this   = $(this)\n    var href    = $this.attr('href')\n    if (href) {\n      href = href.replace(/.*(?=#[^\\s]+$)/, '') // strip for ie7\n    }\n\n    var target  = $this.attr('data-target') || href\n    var $target = $(document).find(target)\n\n    if (!$target.hasClass('carousel')) return\n\n    var options = $.extend({}, $target.data(), $this.data())\n    var slideIndex = $this.attr('data-slide-to')\n    if (slideIndex) options.interval = false\n\n    Plugin.call($target, options)\n\n    if (slideIndex) {\n      $target.data('bs.carousel').to(slideIndex)\n    }\n\n    e.preventDefault()\n  }\n\n  $(document)\n    .on('click.bs.carousel.data-api', '[data-slide]', clickHandler)\n    .on('click.bs.carousel.data-api', '[data-slide-to]', clickHandler)\n\n  $(window).on('load', function () {\n    $('[data-ride=\"carousel\"]').each(function () {\n      var $carousel = $(this)\n      Plugin.call($carousel, $carousel.data())\n    })\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: collapse.js v3.4.1\n * https://getbootstrap.com/docs/3.4/javascript/#collapse\n * ========================================================================\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n/* jshint latedef: false */\n\n+function ($) {\n  'use strict';\n\n  // COLLAPSE PUBLIC CLASS DEFINITION\n  // ================================\n\n  var Collapse = function (element, options) {\n    this.$element      = $(element)\n    this.options       = $.extend({}, Collapse.DEFAULTS, options)\n    this.$trigger      = $('[data-toggle=\"collapse\"][href=\"#' + element.id + '\"],' +\n                           '[data-toggle=\"collapse\"][data-target=\"#' + element.id + '\"]')\n    this.transitioning = null\n\n    if (this.options.parent) {\n      this.$parent = this.getParent()\n    } else {\n      this.addAriaAndCollapsedClass(this.$element, this.$trigger)\n    }\n\n    if (this.options.toggle) this.toggle()\n  }\n\n  Collapse.VERSION  = '3.4.1'\n\n  Collapse.TRANSITION_DURATION = 350\n\n  Collapse.DEFAULTS = {\n    toggle: true\n  }\n\n  Collapse.prototype.dimension = function () {\n    var hasWidth = this.$element.hasClass('width')\n    return hasWidth ? 'width' : 'height'\n  }\n\n  Collapse.prototype.show = function () {\n    if (this.transitioning || this.$element.hasClass('in')) return\n\n    var activesData\n    var actives = this.$parent && this.$parent.children('.panel').children('.in, .collapsing')\n\n    if (actives && actives.length) {\n      activesData = actives.data('bs.collapse')\n      if (activesData && activesData.transitioning) return\n    }\n\n    var startEvent = $.Event('show.bs.collapse')\n    this.$element.trigger(startEvent)\n    if (startEvent.isDefaultPrevented()) return\n\n    if (actives && actives.length) {\n      Plugin.call(actives, 'hide')\n      activesData || actives.data('bs.collapse', null)\n    }\n\n    var dimension = this.dimension()\n\n    this.$element\n      .removeClass('collapse')\n      .addClass('collapsing')[dimension](0)\n      .attr('aria-expanded', true)\n\n    this.$trigger\n      .removeClass('collapsed')\n      .attr('aria-expanded', true)\n\n    this.transitioning = 1\n\n    var complete = function () {\n      this.$element\n        .removeClass('collapsing')\n        .addClass('collapse in')[dimension]('')\n      this.transitioning = 0\n      this.$element\n        .trigger('shown.bs.collapse')\n    }\n\n    if (!$.support.transition) return complete.call(this)\n\n    var scrollSize = $.camelCase(['scroll', dimension].join('-'))\n\n    this.$element\n      .one('bsTransitionEnd', $.proxy(complete, this))\n      .emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize])\n  }\n\n  Collapse.prototype.hide = function () {\n    if (this.transitioning || !this.$element.hasClass('in')) return\n\n    var startEvent = $.Event('hide.bs.collapse')\n    this.$element.trigger(startEvent)\n    if (startEvent.isDefaultPrevented()) return\n\n    var dimension = this.dimension()\n\n    this.$element[dimension](this.$element[dimension]())[0].offsetHeight\n\n    this.$element\n      .addClass('collapsing')\n      .removeClass('collapse in')\n      .attr('aria-expanded', false)\n\n    this.$trigger\n      .addClass('collapsed')\n      .attr('aria-expanded', false)\n\n    this.transitioning = 1\n\n    var complete = function () {\n      this.transitioning = 0\n      this.$element\n        .removeClass('collapsing')\n        .addClass('collapse')\n        .trigger('hidden.bs.collapse')\n    }\n\n    if (!$.support.transition) return complete.call(this)\n\n    this.$element\n      [dimension](0)\n      .one('bsTransitionEnd', $.proxy(complete, this))\n      .emulateTransitionEnd(Collapse.TRANSITION_DURATION)\n  }\n\n  Collapse.prototype.toggle = function () {\n    this[this.$element.hasClass('in') ? 'hide' : 'show']()\n  }\n\n  Collapse.prototype.getParent = function () {\n    return $(document).find(this.options.parent)\n      .find('[data-toggle=\"collapse\"][data-parent=\"' + this.options.parent + '\"]')\n      .each($.proxy(function (i, element) {\n        var $element = $(element)\n        this.addAriaAndCollapsedClass(getTargetFromTrigger($element), $element)\n      }, this))\n      .end()\n  }\n\n  Collapse.prototype.addAriaAndCollapsedClass = function ($element, $trigger) {\n    var isOpen = $element.hasClass('in')\n\n    $element.attr('aria-expanded', isOpen)\n    $trigger\n      .toggleClass('collapsed', !isOpen)\n      .attr('aria-expanded', isOpen)\n  }\n\n  function getTargetFromTrigger($trigger) {\n    var href\n    var target = $trigger.attr('data-target')\n      || (href = $trigger.attr('href')) && href.replace(/.*(?=#[^\\s]+$)/, '') // strip for ie7\n\n    return $(document).find(target)\n  }\n\n\n  // COLLAPSE PLUGIN DEFINITION\n  // ==========================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.collapse')\n      var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option)\n\n      if (!data && options.toggle && /show|hide/.test(option)) options.toggle = false\n      if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  var old = $.fn.collapse\n\n  $.fn.collapse             = Plugin\n  $.fn.collapse.Constructor = Collapse\n\n\n  // COLLAPSE NO CONFLICT\n  // ====================\n\n  $.fn.collapse.noConflict = function () {\n    $.fn.collapse = old\n    return this\n  }\n\n\n  // COLLAPSE DATA-API\n  // =================\n\n  $(document).on('click.bs.collapse.data-api', '[data-toggle=\"collapse\"]', function (e) {\n    var $this   = $(this)\n\n    if (!$this.attr('data-target')) e.preventDefault()\n\n    var $target = getTargetFromTrigger($this)\n    var data    = $target.data('bs.collapse')\n    var option  = data ? 'toggle' : $this.data()\n\n    Plugin.call($target, option)\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: dropdown.js v3.4.1\n * https://getbootstrap.com/docs/3.4/javascript/#dropdowns\n * ========================================================================\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // DROPDOWN CLASS DEFINITION\n  // =========================\n\n  var backdrop = '.dropdown-backdrop'\n  var toggle   = '[data-toggle=\"dropdown\"]'\n  var Dropdown = function (element) {\n    $(element).on('click.bs.dropdown', this.toggle)\n  }\n\n  Dropdown.VERSION = '3.4.1'\n\n  function getParent($this) {\n    var selector = $this.attr('data-target')\n\n    if (!selector) {\n      selector = $this.attr('href')\n      selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\\s]*$)/, '') // strip for ie7\n    }\n\n    var $parent = selector !== '#' ? $(document).find(selector) : null\n\n    return $parent && $parent.length ? $parent : $this.parent()\n  }\n\n  function clearMenus(e) {\n    if (e && e.which === 3) return\n    $(backdrop).remove()\n    $(toggle).each(function () {\n      var $this         = $(this)\n      var $parent       = getParent($this)\n      var relatedTarget = { relatedTarget: this }\n\n      if (!$parent.hasClass('open')) return\n\n      if (e && e.type == 'click' && /input|textarea/i.test(e.target.tagName) && $.contains($parent[0], e.target)) return\n\n      $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget))\n\n      if (e.isDefaultPrevented()) return\n\n      $this.attr('aria-expanded', 'false')\n      $parent.removeClass('open').trigger($.Event('hidden.bs.dropdown', relatedTarget))\n    })\n  }\n\n  Dropdown.prototype.toggle = function (e) {\n    var $this = $(this)\n\n    if ($this.is('.disabled, :disabled')) return\n\n    var $parent  = getParent($this)\n    var isActive = $parent.hasClass('open')\n\n    clearMenus()\n\n    if (!isActive) {\n      if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) {\n        // if mobile we use a backdrop because click events don't delegate\n        $(document.createElement('div'))\n          .addClass('dropdown-backdrop')\n          .insertAfter($(this))\n          .on('click', clearMenus)\n      }\n\n      var relatedTarget = { relatedTarget: this }\n      $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget))\n\n      if (e.isDefaultPrevented()) return\n\n      $this\n        .trigger('focus')\n        .attr('aria-expanded', 'true')\n\n      $parent\n        .toggleClass('open')\n        .trigger($.Event('shown.bs.dropdown', relatedTarget))\n    }\n\n    return false\n  }\n\n  Dropdown.prototype.keydown = function (e) {\n    if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) return\n\n    var $this = $(this)\n\n    e.preventDefault()\n    e.stopPropagation()\n\n    if ($this.is('.disabled, :disabled')) return\n\n    var $parent  = getParent($this)\n    var isActive = $parent.hasClass('open')\n\n    if (!isActive && e.which != 27 || isActive && e.which == 27) {\n      if (e.which == 27) $parent.find(toggle).trigger('focus')\n      return $this.trigger('click')\n    }\n\n    var desc = ' li:not(.disabled):visible a'\n    var $items = $parent.find('.dropdown-menu' + desc)\n\n    if (!$items.length) return\n\n    var index = $items.index(e.target)\n\n    if (e.which == 38 && index > 0)                 index--         // up\n    if (e.which == 40 && index < $items.length - 1) index++         // down\n    if (!~index)                                    index = 0\n\n    $items.eq(index).trigger('focus')\n  }\n\n\n  // DROPDOWN PLUGIN DEFINITION\n  // ==========================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this = $(this)\n      var data  = $this.data('bs.dropdown')\n\n      if (!data) $this.data('bs.dropdown', (data = new Dropdown(this)))\n      if (typeof option == 'string') data[option].call($this)\n    })\n  }\n\n  var old = $.fn.dropdown\n\n  $.fn.dropdown             = Plugin\n  $.fn.dropdown.Constructor = Dropdown\n\n\n  // DROPDOWN NO CONFLICT\n  // ====================\n\n  $.fn.dropdown.noConflict = function () {\n    $.fn.dropdown = old\n    return this\n  }\n\n\n  // APPLY TO STANDARD DROPDOWN ELEMENTS\n  // ===================================\n\n  $(document)\n    .on('click.bs.dropdown.data-api', clearMenus)\n    .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })\n    .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle)\n    .on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown)\n    .on('keydown.bs.dropdown.data-api', '.dropdown-menu', Dropdown.prototype.keydown)\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: modal.js v3.4.1\n * https://getbootstrap.com/docs/3.4/javascript/#modals\n * ========================================================================\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // MODAL CLASS DEFINITION\n  // ======================\n\n  var Modal = function (element, options) {\n    this.options = options\n    this.$body = $(document.btBody)\n    this.$element = $(element)\n    this.$dialog = this.$element.find('.modal-dialog')\n    this.$backdrop = null\n    this.isShown = null\n    this.originalBodyPad = null\n    this.scrollbarWidth = 0\n    this.ignoreBackdropClick = false\n    this.fixedContent = '.navbar-fixed-top, .navbar-fixed-bottom'\n\n    if (this.options.remote) {\n      this.$element\n        .find('.modal-content')\n        .load(this.options.remote, $.proxy(function () {\n          this.$element.trigger('loaded.bs.modal')\n        }, this))\n    }\n  }\n\n  Modal.VERSION = '3.4.1'\n\n  Modal.TRANSITION_DURATION = 300\n  Modal.BACKDROP_TRANSITION_DURATION = 150\n\n  Modal.DEFAULTS = {\n    backdrop: true,\n    keyboard: true,\n    show: true\n  }\n\n  Modal.prototype.toggle = function (_relatedTarget) {\n    return this.isShown ? this.hide() : this.show(_relatedTarget)\n  }\n\n  Modal.prototype.show = function (_relatedTarget) {\n    var that = this\n    var e = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })\n\n    this.$element.trigger(e)\n\n    if (this.isShown || e.isDefaultPrevented()) return\n\n    this.isShown = true\n\n    this.checkScrollbar()\n    this.setScrollbar()\n    this.$body.addClass('modal-open')\n\n    this.escape()\n    this.resize()\n\n    this.$element.on('click.dismiss.bs.modal', '[data-dismiss=\"modal\"]', $.proxy(this.hide, this))\n\n    this.$dialog.on('mousedown.dismiss.bs.modal', function () {\n      that.$element.one('mouseup.dismiss.bs.modal', function (e) {\n        if ($(e.target).is(that.$element)) that.ignoreBackdropClick = true\n      })\n    })\n\n    this.backdrop(function () {\n      var transition = $.support.transition && that.$element.hasClass('fade')\n\n      if (!that.$element.parent().length) {\n        that.$element.appendTo(that.$body) // don't move modals dom position\n      }\n\n      that.$element\n        .show()\n        .scrollTop(0)\n\n      that.adjustDialog()\n\n      if (transition) {\n        that.$element[0].offsetWidth // force reflow\n      }\n\n      that.$element.addClass('in')\n\n      that.enforceFocus()\n\n      var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })\n\n      transition ?\n        that.$dialog // wait for modal to slide in\n          .one('bsTransitionEnd', function () {\n            that.$element.trigger('focus').trigger(e)\n          })\n          .emulateTransitionEnd(Modal.TRANSITION_DURATION) :\n        that.$element.trigger('focus').trigger(e)\n    })\n  }\n\n  Modal.prototype.hide = function (e) {\n    if (e) e.preventDefault()\n\n    e = $.Event('hide.bs.modal')\n\n    this.$element.trigger(e)\n\n    if (!this.isShown || e.isDefaultPrevented()) return\n\n    this.isShown = false\n\n    this.escape()\n    this.resize()\n\n    $(document).off('focusin.bs.modal')\n\n    this.$element\n      .removeClass('in')\n      .off('click.dismiss.bs.modal')\n      .off('mouseup.dismiss.bs.modal')\n\n    this.$dialog.off('mousedown.dismiss.bs.modal')\n\n    $.support.transition && this.$element.hasClass('fade') ?\n      this.$element\n        .one('bsTransitionEnd', $.proxy(this.hideModal, this))\n        .emulateTransitionEnd(Modal.TRANSITION_DURATION) :\n      this.hideModal()\n  }\n\n  Modal.prototype.enforceFocus = function () {\n    $(document)\n      .off('focusin.bs.modal') // guard against infinite focus loop\n      .on('focusin.bs.modal', $.proxy(function (e) {\n        if (document !== e.target &&\n          this.$element[0] !== e.target &&\n          !this.$element.has(e.target).length) {\n          this.$element.trigger('focus')\n        }\n      }, this))\n  }\n\n  Modal.prototype.escape = function () {\n    if (this.isShown && this.options.keyboard) {\n      this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) {\n        e.which == 27 && this.hide()\n      }, this))\n    } else if (!this.isShown) {\n      this.$element.off('keydown.dismiss.bs.modal')\n    }\n  }\n\n  Modal.prototype.resize = function () {\n    if (this.isShown) {\n      $(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this))\n    } else {\n      $(window).off('resize.bs.modal')\n    }\n  }\n\n  Modal.prototype.hideModal = function () {\n    var that = this\n    this.$element.hide()\n    this.backdrop(function () {\n      that.$body.removeClass('modal-open')\n      that.resetAdjustments()\n      that.resetScrollbar()\n      that.$element.trigger('hidden.bs.modal')\n    })\n  }\n\n  Modal.prototype.removeBackdrop = function () {\n    this.$backdrop && this.$backdrop.remove()\n    this.$backdrop = null\n  }\n\n  Modal.prototype.backdrop = function (callback) {\n    var that = this\n    var animate = this.$element.hasClass('fade') ? 'fade' : ''\n\n    if (this.isShown && this.options.backdrop) {\n      var doAnimate = $.support.transition && animate\n\n      this.$backdrop = $(document.createElement('div'))\n        .addClass('modal-backdrop ' + animate)\n        .appendTo(this.$body)\n\n      this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) {\n        if (this.ignoreBackdropClick) {\n          this.ignoreBackdropClick = false\n          return\n        }\n        if (e.target !== e.currentTarget) return\n        this.options.backdrop == 'static'\n          ? this.$element[0].focus()\n          : this.hide()\n      }, this))\n\n      if (doAnimate) this.$backdrop[0].offsetWidth // force reflow\n\n      this.$backdrop.addClass('in')\n\n      if (!callback) return\n\n      doAnimate ?\n        this.$backdrop\n          .one('bsTransitionEnd', callback)\n          .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :\n        callback()\n\n    } else if (!this.isShown && this.$backdrop) {\n      this.$backdrop.removeClass('in')\n\n      var callbackRemove = function () {\n        that.removeBackdrop()\n        callback && callback()\n      }\n      $.support.transition && this.$element.hasClass('fade') ?\n        this.$backdrop\n          .one('bsTransitionEnd', callbackRemove)\n          .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :\n        callbackRemove()\n\n    } else if (callback) {\n      callback()\n    }\n  }\n\n  // these following methods are used to handle overflowing modals\n\n  Modal.prototype.handleUpdate = function () {\n    this.adjustDialog()\n  }\n\n  Modal.prototype.adjustDialog = function () {\n    var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight\n\n    this.$element.css({\n      paddingLeft: !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '',\n      paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : ''\n    })\n  }\n\n  Modal.prototype.resetAdjustments = function () {\n    this.$element.css({\n      paddingLeft: '',\n      paddingRight: ''\n    })\n  }\n\n  Modal.prototype.checkScrollbar = function () {\n    var fullWindowWidth = window.innerWidth\n    if (!fullWindowWidth) { // workaround for missing window.innerWidth in IE8\n      var documentElementRect = document.documentElement.getBoundingClientRect()\n      fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left)\n    }\n    this.bodyIsOverflowing = document.btBody.clientWidth < fullWindowWidth\n    this.scrollbarWidth = this.measureScrollbar()\n  }\n\n  Modal.prototype.setScrollbar = function () {\n    var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10)\n    this.originalBodyPad = document.btBody.style.paddingRight || ''\n    var scrollbarWidth = this.scrollbarWidth\n    if (this.bodyIsOverflowing) {\n      this.$body.css('padding-right', bodyPad + scrollbarWidth)\n      $(this.fixedContent).each(function (index, element) {\n        var actualPadding = element.style.paddingRight\n        var calculatedPadding = $(element).css('padding-right')\n        $(element)\n          .data('padding-right', actualPadding)\n          .css('padding-right', parseFloat(calculatedPadding) + scrollbarWidth + 'px')\n      })\n    }\n  }\n\n  Modal.prototype.resetScrollbar = function () {\n    this.$body.css('padding-right', this.originalBodyPad)\n    $(this.fixedContent).each(function (index, element) {\n      var padding = $(element).data('padding-right')\n      $(element).removeData('padding-right')\n      element.style.paddingRight = padding ? padding : ''\n    })\n  }\n\n  Modal.prototype.measureScrollbar = function () { // thx walsh\n    var scrollDiv = document.createElement('div')\n    scrollDiv.className = 'modal-scrollbar-measure'\n    this.$body.append(scrollDiv)\n    var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth\n    this.$body[0].removeChild(scrollDiv)\n    return scrollbarWidth\n  }\n\n\n  // MODAL PLUGIN DEFINITION\n  // =======================\n\n  function Plugin(option, _relatedTarget) {\n    return this.each(function () {\n      var $this = $(this)\n      var data = $this.data('bs.modal')\n      var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option)\n\n      if (!data) $this.data('bs.modal', (data = new Modal(this, options)))\n      if (typeof option == 'string') data[option](_relatedTarget)\n      else if (options.show) data.show(_relatedTarget)\n    })\n  }\n\n  var old = $.fn.modal\n\n  $.fn.modal = Plugin\n  $.fn.modal.Constructor = Modal\n\n\n  // MODAL NO CONFLICT\n  // =================\n\n  $.fn.modal.noConflict = function () {\n    $.fn.modal = old\n    return this\n  }\n\n\n  // MODAL DATA-API\n  // ==============\n\n  $(document).on('click.bs.modal.data-api', '[data-toggle=\"modal\"]', function (e) {\n    var $this = $(this)\n    var href = $this.attr('href')\n    var target = $this.attr('data-target') ||\n      (href && href.replace(/.*(?=#[^\\s]+$)/, '')) // strip for ie7\n\n    var $target = $(document).find(target)\n    var option = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())\n\n    if ($this.is('a')) e.preventDefault()\n\n    $target.one('show.bs.modal', function (showEvent) {\n      if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown\n      $target.one('hidden.bs.modal', function () {\n        $this.is(':visible') && $this.trigger('focus')\n      })\n    })\n    Plugin.call($target, option, this)\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: tooltip.js v3.4.1\n * https://getbootstrap.com/docs/3.4/javascript/#tooltip\n * Inspired by the original jQuery.tipsy by Jason Frame\n * ========================================================================\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n+function ($) {\n  'use strict';\n\n  var DISALLOWED_ATTRIBUTES = ['sanitize', 'whiteList', 'sanitizeFn']\n\n  var uriAttrs = [\n    'background',\n    'cite',\n    'href',\n    'itemtype',\n    'longdesc',\n    'poster',\n    'src',\n    'xlink:href'\n  ]\n\n  var ARIA_ATTRIBUTE_PATTERN = /^aria-[\\w-]*$/i\n\n  var DefaultWhitelist = {\n    // Global attributes allowed on any supplied element below.\n    '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],\n    a: ['target', 'href', 'title', 'rel'],\n    area: [],\n    b: [],\n    br: [],\n    col: [],\n    code: [],\n    div: [],\n    em: [],\n    hr: [],\n    h1: [],\n    h2: [],\n    h3: [],\n    h4: [],\n    h5: [],\n    h6: [],\n    i: [],\n    img: ['src', 'alt', 'title', 'width', 'height'],\n    li: [],\n    ol: [],\n    p: [],\n    pre: [],\n    s: [],\n    small: [],\n    span: [],\n    sub: [],\n    sup: [],\n    strong: [],\n    u: [],\n    ul: []\n  }\n\n  /**\n   * A pattern that recognizes a commonly useful subset of URLs that are safe.\n   *\n   * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts\n   */\n  var SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file):|[^&:/?#]*(?:[/?#]|$))/gi\n\n  /**\n   * A pattern that matches safe data URLs. Only matches image, video and audio types.\n   *\n   * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts\n   */\n  var DATA_URL_PATTERN = /^data:(?:image\\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\\/(?:mpeg|mp4|ogg|webm)|audio\\/(?:mp3|oga|ogg|opus));base64,[a-z0-9+/]+=*$/i\n\n  function allowedAttribute(attr, allowedAttributeList) {\n    var attrName = attr.nodeName.toLowerCase()\n\n    if ($.inArray(attrName, allowedAttributeList) !== -1) {\n      if ($.inArray(attrName, uriAttrs) !== -1) {\n        return Boolean(attr.nodeValue.match(SAFE_URL_PATTERN) || attr.nodeValue.match(DATA_URL_PATTERN))\n      }\n\n      return true\n    }\n\n    var regExp = $(allowedAttributeList).filter(function (index, value) {\n      return value instanceof RegExp\n    })\n\n    // Check if a regular expression validates the attribute.\n    for (var i = 0, l = regExp.length; i < l; i++) {\n      if (attrName.match(regExp[i])) {\n        return true\n      }\n    }\n\n    return false\n  }\n\n  function sanitizeHtml(unsafeHtml, whiteList, sanitizeFn) {\n    if (unsafeHtml.length === 0) {\n      return unsafeHtml\n    }\n\n    if (sanitizeFn && typeof sanitizeFn === 'function') {\n      return sanitizeFn(unsafeHtml)\n    }\n\n    // IE 8 and below don't support createHTMLDocument\n    if (!document.implementation || !document.implementation.createHTMLDocument) {\n      return unsafeHtml\n    }\n\n    var createdDocument = document.implementation.createHTMLDocument('sanitization')\n    createdDocument.body.innerHTML = unsafeHtml\n\n    var whitelistKeys = $.map(whiteList, function (el, i) { return i })\n    var elements = $(createdDocument.body).find('*')\n\n    for (var i = 0, len = elements.length; i < len; i++) {\n      var el = elements[i]\n      var elName = el.nodeName.toLowerCase()\n\n      if ($.inArray(elName, whitelistKeys) === -1) {\n        el.parentNode.removeChild(el)\n\n        continue\n      }\n\n      var attributeList = $.map(el.attributes, function (el) { return el })\n      var whitelistedAttributes = [].concat(whiteList['*'] || [], whiteList[elName] || [])\n\n      for (var j = 0, len2 = attributeList.length; j < len2; j++) {\n        if (!allowedAttribute(attributeList[j], whitelistedAttributes)) {\n          el.removeAttribute(attributeList[j].nodeName)\n        }\n      }\n    }\n\n    return createdDocument.body.innerHTML\n  }\n\n  // TOOLTIP PUBLIC CLASS DEFINITION\n  // ===============================\n\n  var Tooltip = function (element, options) {\n    this.type       = null\n    this.options    = null\n    this.enabled    = null\n    this.timeout    = null\n    this.hoverState = null\n    this.$element   = null\n    this.inState    = null\n\n    this.init('tooltip', element, options)\n  }\n\n  Tooltip.VERSION  = '3.4.1'\n\n  Tooltip.TRANSITION_DURATION = 150\n\n  Tooltip.DEFAULTS = {\n    animation: true,\n    placement: 'top',\n    selector: false,\n    template: '<div class=\"tooltip\" role=\"tooltip\"><div class=\"tooltip-arrow\"></div><div class=\"tooltip-inner\"></div></div>',\n    trigger: 'hover focus',\n    title: '',\n    delay: 0,\n    html: false,\n    container: false,\n    viewport: {\n      selector: 'body',\n      padding: 0\n    },\n    sanitize : true,\n    sanitizeFn : null,\n    whiteList : DefaultWhitelist\n  }\n\n  Tooltip.prototype.init = function (type, element, options) {\n    this.enabled   = true\n    this.type      = type\n    this.$element  = $(element)\n    this.options   = this.getOptions(options)\n    this.$viewport = this.options.viewport && $(document).find($.isFunction(this.options.viewport) ? this.options.viewport.call(this, this.$element) : (this.options.viewport.selector || this.options.viewport))\n    this.inState   = { click: false, hover: false, focus: false }\n\n    if (this.$element[0] instanceof document.constructor && !this.options.selector) {\n      throw new Error('`selector` option must be specified when initializing ' + this.type + ' on the window.document object!')\n    }\n\n    var triggers = this.options.trigger.split(' ')\n\n    for (var i = triggers.length; i--;) {\n      var trigger = triggers[i]\n\n      if (trigger == 'click') {\n        this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))\n      } else if (trigger != 'manual') {\n        var eventIn  = trigger == 'hover' ? 'mouseenter' : 'focusin'\n        var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout'\n\n        this.$element.on(eventIn  + '.' + this.type, this.options.selector, $.proxy(this.enter, this))\n        this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))\n      }\n    }\n\n    this.options.selector ?\n      (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :\n      this.fixTitle()\n  }\n\n  Tooltip.prototype.getDefaults = function () {\n    return Tooltip.DEFAULTS\n  }\n\n  Tooltip.prototype.getOptions = function (options) {\n    var dataAttributes = this.$element.data()\n\n    for (var dataAttr in dataAttributes) {\n      if (dataAttributes.hasOwnProperty(dataAttr) && $.inArray(dataAttr, DISALLOWED_ATTRIBUTES) !== -1) {\n        delete dataAttributes[dataAttr]\n      }\n    }\n\n    options = $.extend({}, this.getDefaults(), dataAttributes, options)\n\n    if (options.delay && typeof options.delay == 'number') {\n      options.delay = {\n        show: options.delay,\n        hide: options.delay\n      }\n    }\n\n    if (options.sanitize) {\n      options.template = sanitizeHtml(options.template, options.whiteList, options.sanitizeFn)\n    }\n\n    return options\n  }\n\n  Tooltip.prototype.getDelegateOptions = function () {\n    var options  = {}\n    var defaults = this.getDefaults()\n\n    this._options && $.each(this._options, function (key, value) {\n      if (defaults[key] != value) options[key] = value\n    })\n\n    return options\n  }\n\n  Tooltip.prototype.enter = function (obj) {\n    var self = obj instanceof this.constructor ?\n      obj : $(obj.currentTarget).data('bs.' + this.type)\n\n    if (!self) {\n      self = new this.constructor(obj.currentTarget, this.getDelegateOptions())\n      $(obj.currentTarget).data('bs.' + this.type, self)\n    }\n\n    if (obj instanceof $.Event) {\n      self.inState[obj.type == 'focusin' ? 'focus' : 'hover'] = true\n    }\n\n    if (self.tip().hasClass('in') || self.hoverState == 'in') {\n      self.hoverState = 'in'\n      return\n    }\n\n    clearTimeout(self.timeout)\n\n    self.hoverState = 'in'\n\n    if (!self.options.delay || !self.options.delay.show) return self.show()\n\n    self.timeout = setTimeout(function () {\n      if (self.hoverState == 'in') self.show()\n    }, self.options.delay.show)\n  }\n\n  Tooltip.prototype.isInStateTrue = function () {\n    for (var key in this.inState) {\n      if (this.inState[key]) return true\n    }\n\n    return false\n  }\n\n  Tooltip.prototype.leave = function (obj) {\n    var self = obj instanceof this.constructor ?\n      obj : $(obj.currentTarget).data('bs.' + this.type)\n\n    if (!self) {\n      self = new this.constructor(obj.currentTarget, this.getDelegateOptions())\n      $(obj.currentTarget).data('bs.' + this.type, self)\n    }\n\n    if (obj instanceof $.Event) {\n      self.inState[obj.type == 'focusout' ? 'focus' : 'hover'] = false\n    }\n\n    if (self.isInStateTrue()) return\n\n    clearTimeout(self.timeout)\n\n    self.hoverState = 'out'\n\n    if (!self.options.delay || !self.options.delay.hide) return self.hide()\n\n    self.timeout = setTimeout(function () {\n      if (self.hoverState == 'out') self.hide()\n    }, self.options.delay.hide)\n  }\n\n  Tooltip.prototype.show = function () {\n    var e = $.Event('show.bs.' + this.type)\n\n    if (this.hasContent() && this.enabled) {\n      this.$element.trigger(e)\n\n      var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0])\n      if (e.isDefaultPrevented() || !inDom) return\n      var that = this\n\n      var $tip = this.tip()\n\n      var tipId = this.getUID(this.type)\n\n      this.setContent()\n      $tip.attr('id', tipId)\n      this.$element.attr('aria-describedby', tipId)\n\n      if (this.options.animation) $tip.addClass('fade')\n\n      var placement = typeof this.options.placement == 'function' ?\n        this.options.placement.call(this, $tip[0], this.$element[0]) :\n        this.options.placement\n\n      var autoToken = /\\s?auto?\\s?/i\n      var autoPlace = autoToken.test(placement)\n      if (autoPlace) placement = placement.replace(autoToken, '') || 'top'\n\n      $tip\n        .detach()\n        .css({ top: 0, left: 0, display: 'block' })\n        .addClass(placement)\n        .data('bs.' + this.type, this)\n\n      this.options.container ? $tip.appendTo($(document).find(this.options.container)) : $tip.insertAfter(this.$element)\n      this.$element.trigger('inserted.bs.' + this.type)\n\n      var pos          = this.getPosition()\n      var actualWidth  = $tip[0].offsetWidth\n      var actualHeight = $tip[0].offsetHeight\n\n      if (autoPlace) {\n        var orgPlacement = placement\n        var viewportDim = this.getPosition(this.$viewport)\n\n        placement = placement == 'bottom' && pos.bottom + actualHeight > viewportDim.bottom ? 'top'    :\n                    placement == 'top'    && pos.top    - actualHeight < viewportDim.top    ? 'bottom' :\n                    placement == 'right'  && pos.right  + actualWidth  > viewportDim.width  ? 'left'   :\n                    placement == 'left'   && pos.left   - actualWidth  < viewportDim.left   ? 'right'  :\n                    placement\n\n        $tip\n          .removeClass(orgPlacement)\n          .addClass(placement)\n      }\n\n      var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight)\n\n      this.applyPlacement(calculatedOffset, placement)\n\n      var complete = function () {\n        var prevHoverState = that.hoverState\n        that.$element.trigger('shown.bs.' + that.type)\n        that.hoverState = null\n\n        if (prevHoverState == 'out') that.leave(that)\n      }\n\n      $.support.transition && this.$tip.hasClass('fade') ?\n        $tip\n          .one('bsTransitionEnd', complete)\n          .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :\n        complete()\n    }\n  }\n\n  Tooltip.prototype.applyPlacement = function (offset, placement) {\n    var $tip   = this.tip()\n    var width  = $tip[0].offsetWidth\n    var height = $tip[0].offsetHeight\n\n    // manually read margins because getBoundingClientRect includes difference\n    var marginTop = parseInt($tip.css('margin-top'), 10)\n    var marginLeft = parseInt($tip.css('margin-left'), 10)\n\n    // we must check for NaN for ie 8/9\n    if (isNaN(marginTop))  marginTop  = 0\n    if (isNaN(marginLeft)) marginLeft = 0\n\n    offset.top  += marginTop\n    offset.left += marginLeft\n\n    // $.fn.offset doesn't round pixel values\n    // so we use setOffset directly with our own function B-0\n    $.offset.setOffset($tip[0], $.extend({\n      using: function (props) {\n        $tip.css({\n          top: Math.round(props.top),\n          left: Math.round(props.left)\n        })\n      }\n    }, offset), 0)\n\n    $tip.addClass('in')\n\n    // check to see if placing tip in new offset caused the tip to resize itself\n    var actualWidth  = $tip[0].offsetWidth\n    var actualHeight = $tip[0].offsetHeight\n\n    if (placement == 'top' && actualHeight != height) {\n      offset.top = offset.top + height - actualHeight\n    }\n\n    var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight)\n\n    if (delta.left) offset.left += delta.left\n    else offset.top += delta.top\n\n    var isVertical          = /top|bottom/.test(placement)\n    var arrowDelta          = isVertical ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight\n    var arrowOffsetPosition = isVertical ? 'offsetWidth' : 'offsetHeight'\n\n    $tip.offset(offset)\n    this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical)\n  }\n\n  Tooltip.prototype.replaceArrow = function (delta, dimension, isVertical) {\n    this.arrow()\n      .css(isVertical ? 'left' : 'top', 50 * (1 - delta / dimension) + '%')\n      .css(isVertical ? 'top' : 'left', '')\n  }\n\n  Tooltip.prototype.setContent = function () {\n    var $tip  = this.tip()\n    var title = this.getTitle()\n\n    if (this.options.html) {\n      if (this.options.sanitize) {\n        title = sanitizeHtml(title, this.options.whiteList, this.options.sanitizeFn)\n      }\n\n      $tip.find('.tooltip-inner').html(title)\n    } else {\n      $tip.find('.tooltip-inner').text(title)\n    }\n\n    $tip.removeClass('fade in top bottom left right')\n  }\n\n  Tooltip.prototype.hide = function (callback) {\n    var that = this\n    var $tip = $(this.$tip)\n    var e    = $.Event('hide.bs.' + this.type)\n\n    function complete() {\n      if (that.hoverState != 'in') $tip.detach()\n      if (that.$element) { // TODO: Check whether guarding this code with this `if` is really necessary.\n        that.$element\n          .removeAttr('aria-describedby')\n          .trigger('hidden.bs.' + that.type)\n      }\n      callback && callback()\n    }\n\n    this.$element.trigger(e)\n\n    if (e.isDefaultPrevented()) return\n\n    $tip.removeClass('in')\n\n    $.support.transition && $tip.hasClass('fade') ?\n      $tip\n        .one('bsTransitionEnd', complete)\n        .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :\n      complete()\n\n    this.hoverState = null\n\n    return this\n  }\n\n  Tooltip.prototype.fixTitle = function () {\n    var $e = this.$element\n    if ($e.attr('title') || typeof $e.attr('data-original-title') != 'string') {\n      $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')\n    }\n  }\n\n  Tooltip.prototype.hasContent = function () {\n    return this.getTitle()\n  }\n\n  Tooltip.prototype.getPosition = function ($element) {\n    $element   = $element || this.$element\n\n    var el     = $element[0]\n    var isBody = el.tagName == 'BODY'\n\n    var elRect    = el.getBoundingClientRect()\n    if (elRect.width == null) {\n      // width and height are missing in IE8, so compute them manually; see https://github.com/twbs/bootstrap/issues/14093\n      elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top })\n    }\n    var isSvg = window.SVGElement && el instanceof window.SVGElement\n    // Avoid using $.offset() on SVGs since it gives incorrect results in jQuery 3.\n    // See https://github.com/twbs/bootstrap/issues/20280\n    var elOffset  = isBody ? { top: 0, left: 0 } : (isSvg ? null : $element.offset())\n    var scroll    = { scroll: isBody ? document.documentElement.scrollTop || document.btBody.scrollTop : $element.scrollTop() }\n    var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null\n\n    return $.extend({}, elRect, scroll, outerDims, elOffset)\n  }\n\n  Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {\n    return placement == 'bottom' ? { top: pos.top + pos.height,   left: pos.left + pos.width / 2 - actualWidth / 2 } :\n           placement == 'top'    ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } :\n           placement == 'left'   ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } :\n        /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width }\n\n  }\n\n  Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) {\n    var delta = { top: 0, left: 0 }\n    if (!this.$viewport) return delta\n\n    var viewportPadding = this.options.viewport && this.options.viewport.padding || 0\n    var viewportDimensions = this.getPosition(this.$viewport)\n\n    if (/right|left/.test(placement)) {\n      var topEdgeOffset    = pos.top - viewportPadding - viewportDimensions.scroll\n      var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight\n      if (topEdgeOffset < viewportDimensions.top) { // top overflow\n        delta.top = viewportDimensions.top - topEdgeOffset\n      } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow\n        delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset\n      }\n    } else {\n      var leftEdgeOffset  = pos.left - viewportPadding\n      var rightEdgeOffset = pos.left + viewportPadding + actualWidth\n      if (leftEdgeOffset < viewportDimensions.left) { // left overflow\n        delta.left = viewportDimensions.left - leftEdgeOffset\n      } else if (rightEdgeOffset > viewportDimensions.right) { // right overflow\n        delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset\n      }\n    }\n\n    return delta\n  }\n\n  Tooltip.prototype.getTitle = function () {\n    var title\n    var $e = this.$element\n    var o  = this.options\n\n    title = $e.attr('data-original-title')\n      || (typeof o.title == 'function' ? o.title.call($e[0]) :  o.title)\n\n    return title\n  }\n\n  Tooltip.prototype.getUID = function (prefix) {\n    do prefix += ~~(Math.random() * 1000000)\n    while (document.getElementById(prefix))\n    return prefix\n  }\n\n  Tooltip.prototype.tip = function () {\n    if (!this.$tip) {\n      this.$tip = $(this.options.template)\n      if (this.$tip.length != 1) {\n        throw new Error(this.type + ' `template` option must consist of exactly 1 top-level element!')\n      }\n    }\n    return this.$tip\n  }\n\n  Tooltip.prototype.arrow = function () {\n    return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow'))\n  }\n\n  Tooltip.prototype.enable = function () {\n    this.enabled = true\n  }\n\n  Tooltip.prototype.disable = function () {\n    this.enabled = false\n  }\n\n  Tooltip.prototype.toggleEnabled = function () {\n    this.enabled = !this.enabled\n  }\n\n  Tooltip.prototype.toggle = function (e) {\n    var self = this\n    if (e) {\n      self = $(e.currentTarget).data('bs.' + this.type)\n      if (!self) {\n        self = new this.constructor(e.currentTarget, this.getDelegateOptions())\n        $(e.currentTarget).data('bs.' + this.type, self)\n      }\n    }\n\n    if (e) {\n      self.inState.click = !self.inState.click\n      if (self.isInStateTrue()) self.enter(self)\n      else self.leave(self)\n    } else {\n      self.tip().hasClass('in') ? self.leave(self) : self.enter(self)\n    }\n  }\n\n  Tooltip.prototype.destroy = function () {\n    var that = this\n    clearTimeout(this.timeout)\n    this.hide(function () {\n      that.$element.off('.' + that.type).removeData('bs.' + that.type)\n      if (that.$tip) {\n        that.$tip.detach()\n      }\n      that.$tip = null\n      that.$arrow = null\n      that.$viewport = null\n      that.$element = null\n    })\n  }\n\n  Tooltip.prototype.sanitizeHtml = function (unsafeHtml) {\n    return sanitizeHtml(unsafeHtml, this.options.whiteList, this.options.sanitizeFn)\n  }\n\n  // TOOLTIP PLUGIN DEFINITION\n  // =========================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.tooltip')\n      var options = typeof option == 'object' && option\n\n      if (!data && /destroy|hide/.test(option)) return\n      if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  var old = $.fn.tooltip\n\n  $.fn.tooltip             = Plugin\n  $.fn.tooltip.Constructor = Tooltip\n\n\n  // TOOLTIP NO CONFLICT\n  // ===================\n\n  $.fn.tooltip.noConflict = function () {\n    $.fn.tooltip = old\n    return this\n  }\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: popover.js v3.4.1\n * https://getbootstrap.com/docs/3.4/javascript/#popovers\n * ========================================================================\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // POPOVER PUBLIC CLASS DEFINITION\n  // ===============================\n\n  var Popover = function (element, options) {\n    this.init('popover', element, options)\n  }\n\n  if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')\n\n  Popover.VERSION  = '3.4.1'\n\n  Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, {\n    placement: 'right',\n    trigger: 'click',\n    content: '',\n    template: '<div class=\"popover\" role=\"tooltip\"><div class=\"arrow\"></div><h3 class=\"popover-title\"></h3><div class=\"popover-content\"></div></div>'\n  })\n\n\n  // NOTE: POPOVER EXTENDS tooltip.js\n  // ================================\n\n  Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype)\n\n  Popover.prototype.constructor = Popover\n\n  Popover.prototype.getDefaults = function () {\n    return Popover.DEFAULTS\n  }\n\n  Popover.prototype.setContent = function () {\n    var $tip    = this.tip()\n    var title   = this.getTitle()\n    var content = this.getContent()\n\n    if (this.options.html) {\n      var typeContent = typeof content\n\n      if (this.options.sanitize) {\n        title = this.sanitizeHtml(title)\n\n        if (typeContent === 'string') {\n          content = this.sanitizeHtml(content)\n        }\n      }\n\n      $tip.find('.popover-title').html(title)\n      $tip.find('.popover-content').children().detach().end()[\n        typeContent === 'string' ? 'html' : 'append'\n      ](content)\n    } else {\n      $tip.find('.popover-title').text(title)\n      $tip.find('.popover-content').children().detach().end().text(content)\n    }\n\n    $tip.removeClass('fade top bottom left right in')\n\n    // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do\n    // this manually by checking the contents.\n    if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide()\n  }\n\n  Popover.prototype.hasContent = function () {\n    return this.getTitle() || this.getContent()\n  }\n\n  Popover.prototype.getContent = function () {\n    var $e = this.$element\n    var o  = this.options\n\n    return $e.attr('data-content')\n      || (typeof o.content == 'function' ?\n        o.content.call($e[0]) :\n        o.content)\n  }\n\n  Popover.prototype.arrow = function () {\n    return (this.$arrow = this.$arrow || this.tip().find('.arrow'))\n  }\n\n\n  // POPOVER PLUGIN DEFINITION\n  // =========================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.popover')\n      var options = typeof option == 'object' && option\n\n      if (!data && /destroy|hide/.test(option)) return\n      if (!data) $this.data('bs.popover', (data = new Popover(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  var old = $.fn.popover\n\n  $.fn.popover             = Plugin\n  $.fn.popover.Constructor = Popover\n\n\n  // POPOVER NO CONFLICT\n  // ===================\n\n  $.fn.popover.noConflict = function () {\n    $.fn.popover = old\n    return this\n  }\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: scrollspy.js v3.4.1\n * https://getbootstrap.com/docs/3.4/javascript/#scrollspy\n * ========================================================================\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // SCROLLSPY CLASS DEFINITION\n  // ==========================\n\n  function ScrollSpy(element, options) {\n    this.$body          = $(document.btBody)\n    this.$scrollElement = $(element).is(document.btBody) ? $(window) : $(element)\n    this.options        = $.extend({}, ScrollSpy.DEFAULTS, options)\n    this.selector       = (this.options.target || '') + ' .nav li > a'\n    this.offsets        = []\n    this.targets        = []\n    this.activeTarget   = null\n    this.scrollHeight   = 0\n\n    this.$scrollElement.on('scroll.bs.scrollspy', $.proxy(this.process, this))\n    this.refresh()\n    this.process()\n  }\n\n  ScrollSpy.VERSION  = '3.4.1'\n\n  ScrollSpy.DEFAULTS = {\n    offset: 10\n  }\n\n  ScrollSpy.prototype.getScrollHeight = function () {\n    return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight)\n  }\n\n  ScrollSpy.prototype.refresh = function () {\n    var that          = this\n    var offsetMethod  = 'offset'\n    var offsetBase    = 0\n\n    this.offsets      = []\n    this.targets      = []\n    this.scrollHeight = this.getScrollHeight()\n\n    if (!$.isWindow(this.$scrollElement[0])) {\n      offsetMethod = 'position'\n      offsetBase   = this.$scrollElement.scrollTop()\n    }\n\n    this.$body\n      .find(this.selector)\n      .map(function () {\n        var $el   = $(this)\n        var href  = $el.data('target') || $el.attr('href')\n        var $href = /^#./.test(href) && $(href)\n\n        return ($href\n          && $href.length\n          && $href.is(':visible')\n          && [[$href[offsetMethod]().top + offsetBase, href]]) || null\n      })\n      .sort(function (a, b) { return a[0] - b[0] })\n      .each(function () {\n        that.offsets.push(this[0])\n        that.targets.push(this[1])\n      })\n  }\n\n  ScrollSpy.prototype.process = function () {\n    var scrollTop    = this.$scrollElement.scrollTop() + this.options.offset\n    var scrollHeight = this.getScrollHeight()\n    var maxScroll    = this.options.offset + scrollHeight - this.$scrollElement.height()\n    var offsets      = this.offsets\n    var targets      = this.targets\n    var activeTarget = this.activeTarget\n    var i\n\n    if (this.scrollHeight != scrollHeight) {\n      this.refresh()\n    }\n\n    if (scrollTop >= maxScroll) {\n      return activeTarget != (i = targets[targets.length - 1]) && this.activate(i)\n    }\n\n    if (activeTarget && scrollTop < offsets[0]) {\n      this.activeTarget = null\n      return this.clear()\n    }\n\n    for (i = offsets.length; i--;) {\n      activeTarget != targets[i]\n        && scrollTop >= offsets[i]\n        && (offsets[i + 1] === undefined || scrollTop < offsets[i + 1])\n        && this.activate(targets[i])\n    }\n  }\n\n  ScrollSpy.prototype.activate = function (target) {\n    this.activeTarget = target\n\n    this.clear()\n\n    var selector = this.selector +\n      '[data-target=\"' + target + '\"],' +\n      this.selector + '[href=\"' + target + '\"]'\n\n    var active = $(selector)\n      .parents('li')\n      .addClass('active')\n\n    if (active.parent('.dropdown-menu').length) {\n      active = active\n        .closest('li.dropdown')\n        .addClass('active')\n    }\n\n    active.trigger('activate.bs.scrollspy')\n  }\n\n  ScrollSpy.prototype.clear = function () {\n    $(this.selector)\n      .parentsUntil(this.options.target, '.active')\n      .removeClass('active')\n  }\n\n\n  // SCROLLSPY PLUGIN DEFINITION\n  // ===========================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.scrollspy')\n      var options = typeof option == 'object' && option\n\n      if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  var old = $.fn.scrollspy\n\n  $.fn.scrollspy             = Plugin\n  $.fn.scrollspy.Constructor = ScrollSpy\n\n\n  // SCROLLSPY NO CONFLICT\n  // =====================\n\n  $.fn.scrollspy.noConflict = function () {\n    $.fn.scrollspy = old\n    return this\n  }\n\n\n  // SCROLLSPY DATA-API\n  // ==================\n\n  $(window).on('load.bs.scrollspy.data-api', function () {\n    $('[data-spy=\"scroll\"]').each(function () {\n      var $spy = $(this)\n      Plugin.call($spy, $spy.data())\n    })\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: tab.js v3.4.1\n * https://getbootstrap.com/docs/3.4/javascript/#tabs\n * ========================================================================\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // TAB CLASS DEFINITION\n  // ====================\n\n  var Tab = function (element) {\n    // jscs:disable requireDollarBeforejQueryAssignment\n    this.element = $(element)\n    // jscs:enable requireDollarBeforejQueryAssignment\n  }\n\n  Tab.VERSION = '3.4.1'\n\n  Tab.TRANSITION_DURATION = 150\n\n  Tab.prototype.show = function () {\n    var $this    = this.element\n    var $ul      = $this.closest('ul:not(.dropdown-menu)')\n    var selector = $this.data('target')\n\n    if (!selector) {\n      selector = $this.attr('href')\n      selector = selector && selector.replace(/.*(?=#[^\\s]*$)/, '') // strip for ie7\n    }\n\n    if ($this.parent('li').hasClass('active')) return\n\n    var $previous = $ul.find('.active:last a')\n    var hideEvent = $.Event('hide.bs.tab', {\n      relatedTarget: $this[0]\n    })\n    var showEvent = $.Event('show.bs.tab', {\n      relatedTarget: $previous[0]\n    })\n\n    $previous.trigger(hideEvent)\n    $this.trigger(showEvent)\n\n    if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) return\n\n    var $target = $(document).find(selector)\n\n    this.activate($this.closest('li'), $ul)\n    this.activate($target, $target.parent(), function () {\n      $previous.trigger({\n        type: 'hidden.bs.tab',\n        relatedTarget: $this[0]\n      })\n      $this.trigger({\n        type: 'shown.bs.tab',\n        relatedTarget: $previous[0]\n      })\n    })\n  }\n\n  Tab.prototype.activate = function (element, container, callback) {\n    var $active    = container.find('> .active')\n    var transition = callback\n      && $.support.transition\n      && ($active.length && $active.hasClass('fade') || !!container.find('> .fade').length)\n\n    function next() {\n      $active\n        .removeClass('active')\n        .find('> .dropdown-menu > .active')\n        .removeClass('active')\n        .end()\n        .find('[data-toggle=\"tab\"]')\n        .attr('aria-expanded', false)\n\n      element\n        .addClass('active')\n        .find('[data-toggle=\"tab\"]')\n        .attr('aria-expanded', true)\n\n      if (transition) {\n        element[0].offsetWidth // reflow for transition\n        element.addClass('in')\n      } else {\n        element.removeClass('fade')\n      }\n\n      if (element.parent('.dropdown-menu').length) {\n        element\n          .closest('li.dropdown')\n          .addClass('active')\n          .end()\n          .find('[data-toggle=\"tab\"]')\n          .attr('aria-expanded', true)\n      }\n\n      callback && callback()\n    }\n\n    $active.length && transition ?\n      $active\n        .one('bsTransitionEnd', next)\n        .emulateTransitionEnd(Tab.TRANSITION_DURATION) :\n      next()\n\n    $active.removeClass('in')\n  }\n\n\n  // TAB PLUGIN DEFINITION\n  // =====================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this = $(this)\n      var data  = $this.data('bs.tab')\n\n      if (!data) $this.data('bs.tab', (data = new Tab(this)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  var old = $.fn.tab\n\n  $.fn.tab             = Plugin\n  $.fn.tab.Constructor = Tab\n\n\n  // TAB NO CONFLICT\n  // ===============\n\n  $.fn.tab.noConflict = function () {\n    $.fn.tab = old\n    return this\n  }\n\n\n  // TAB DATA-API\n  // ============\n\n  var clickHandler = function (e) {\n    e.preventDefault()\n    Plugin.call($(this), 'show')\n  }\n\n  $(document)\n    .on('click.bs.tab.data-api', '[data-toggle=\"tab\"]', clickHandler)\n    .on('click.bs.tab.data-api', '[data-toggle=\"pill\"]', clickHandler)\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: affix.js v3.4.1\n * https://getbootstrap.com/docs/3.4/javascript/#affix\n * ========================================================================\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // AFFIX CLASS DEFINITION\n  // ======================\n\n  var Affix = function (element, options) {\n    this.options = $.extend({}, Affix.DEFAULTS, options)\n\n    var target = this.options.target === Affix.DEFAULTS.target ? $(this.options.target) : $(document).find(this.options.target)\n\n    this.$target = target\n      .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this))\n      .on('click.bs.affix.data-api',  $.proxy(this.checkPositionWithEventLoop, this))\n\n    this.$element     = $(element)\n    this.affixed      = null\n    this.unpin        = null\n    this.pinnedOffset = null\n\n    this.checkPosition()\n  }\n\n  Affix.VERSION  = '3.4.1'\n\n  Affix.RESET    = 'affix affix-top affix-bottom'\n\n  Affix.DEFAULTS = {\n    offset: 0,\n    target: window\n  }\n\n  Affix.prototype.getState = function (scrollHeight, height, offsetTop, offsetBottom) {\n    var scrollTop    = this.$target.scrollTop()\n    var position     = this.$element.offset()\n    var targetHeight = this.$target.height()\n\n    if (offsetTop != null && this.affixed == 'top') return scrollTop < offsetTop ? 'top' : false\n\n    if (this.affixed == 'bottom') {\n      if (offsetTop != null) return (scrollTop + this.unpin <= position.top) ? false : 'bottom'\n      return (scrollTop + targetHeight <= scrollHeight - offsetBottom) ? false : 'bottom'\n    }\n\n    var initializing   = this.affixed == null\n    var colliderTop    = initializing ? scrollTop : position.top\n    var colliderHeight = initializing ? targetHeight : height\n\n    if (offsetTop != null && scrollTop <= offsetTop) return 'top'\n    if (offsetBottom != null && (colliderTop + colliderHeight >= scrollHeight - offsetBottom)) return 'bottom'\n\n    return false\n  }\n\n  Affix.prototype.getPinnedOffset = function () {\n    if (this.pinnedOffset) return this.pinnedOffset\n    this.$element.removeClass(Affix.RESET).addClass('affix')\n    var scrollTop = this.$target.scrollTop()\n    var position  = this.$element.offset()\n    return (this.pinnedOffset = position.top - scrollTop)\n  }\n\n  Affix.prototype.checkPositionWithEventLoop = function () {\n    setTimeout($.proxy(this.checkPosition, this), 1)\n  }\n\n  Affix.prototype.checkPosition = function () {\n    if (!this.$element.is(':visible')) return\n\n    var height       = this.$element.height()\n    var offset       = this.options.offset\n    var offsetTop    = offset.top\n    var offsetBottom = offset.bottom\n    var scrollHeight = Math.max($(document).height(), $(document.btBody).height())\n\n    if (typeof offset != 'object')         offsetBottom = offsetTop = offset\n    if (typeof offsetTop == 'function')    offsetTop    = offset.top(this.$element)\n    if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element)\n\n    var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom)\n\n    if (this.affixed != affix) {\n      if (this.unpin != null) this.$element.css('top', '')\n\n      var affixType = 'affix' + (affix ? '-' + affix : '')\n      var e         = $.Event(affixType + '.bs.affix')\n\n      this.$element.trigger(e)\n\n      if (e.isDefaultPrevented()) return\n\n      this.affixed = affix\n      this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null\n\n      this.$element\n        .removeClass(Affix.RESET)\n        .addClass(affixType)\n        .trigger(affixType.replace('affix', 'affixed') + '.bs.affix')\n    }\n\n    if (affix == 'bottom') {\n      this.$element.offset({\n        top: scrollHeight - height - offsetBottom\n      })\n    }\n  }\n\n\n  // AFFIX PLUGIN DEFINITION\n  // =======================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.affix')\n      var options = typeof option == 'object' && option\n\n      if (!data) $this.data('bs.affix', (data = new Affix(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  var old = $.fn.affix\n\n  $.fn.affix             = Plugin\n  $.fn.affix.Constructor = Affix\n\n\n  // AFFIX NO CONFLICT\n  // =================\n\n  $.fn.affix.noConflict = function () {\n    $.fn.affix = old\n    return this\n  }\n\n\n  // AFFIX DATA-API\n  // ==============\n\n  $(window).on('load', function () {\n    $('[data-spy=\"affix\"]').each(function () {\n      var $spy = $(this)\n      var data = $spy.data()\n\n      data.offset = data.offset || {}\n\n      if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom\n      if (data.offsetTop    != null) data.offset.top    = data.offsetTop\n\n      Plugin.call($spy, data)\n    })\n  })\n\n}(jQuery);\n","/* ========================================================================\n * SaRibe: eModal.js v1.2.67\n * http://saribe.github.io/eModal\n * ========================================================================\n * Copyright Samuel Ribeiro.\n * Licensed under MIT.\n * ======================================================================== */\n\n/**\n * Easy Modal for bootstrap, is a simple way to create modal dialogs using javascript.\n * @params allowed elements:\n *     buttons  {array}:           An array of objects to configure buttons to modal footer; only able if message == string\n *     css      {object}:          CSS object try apply into message body; only able if message == string\n *     data     {object}:          Used for iframe with post data parameters              \n *     loading  {boolean}:         Set loading progress as message.\n *     message  {string|object}:   The body message string or the HTML element. e.g.: $(selector);\n *     size     {string}:          sm || lg || xl -> define the modal size.\n *     subtitle {string}:          The header subtitle string. This appear in a smaller text.\n *     title    {string}:          The header title string.\n *     useBin   {boolean}:         Set message as recyclable.\n * </summary>\n * <param name=\"params\"   >Modal options parameters of string body message.</param>\n * <param name=\"title\"    >The string header title or a flag to set default parameters.</param>\n * <returns type=\"Promise\">{ then, element }.</returns>\n */\n\n;\n(function (define) {\n    define(['jquery'], function ($, root) {\n        var $modal;\n        var BIN = 'recycle-bin';\n        var DIV = '<div>';\n        var EMPTY = '';\n        var EVENT_CLICK = 'click';\n        var EVENT_HIDE = 'hide';\n        var EVENT_SHOW = 'shown.bs.modal';\n        var EVENT_SUBMIT = 'submit';\n        var FOOTER_ID = 'eFooter';\n        var HIDE = EVENT_HIDE + '.bs.modal';\n        var INPUT = 'input';\n        var KEY_DANGER = 'danger';\n        var LABEL = {\n            OK: 'Cancel',\n            True: 'False',\n            Yes: 'No'\n        };\n        var lastParams = {};\n        var MODAL_BODY = 'modal-body';\n        var MODAL_DIALOG = '.modal-dialog';\n        var options = {};\n        var REC_MODAL_CONTENT = 'modal-rec';\n        var SIZE = {\n            sm: 'sm',\n            lg: 'lg',\n            xl: 'xl'\n        };\n        var TMP_MODAL_CONTENT = 'modal-tmp';\n\n        var defaultSettings = {\n            allowContentRecycle: true,\n            confirmLabel: Object.keys(LABEL)[0],\n            labels: LABEL,\n            loadingHtml: '<h5>Loading...</h5><div class=progress><div class=\"progress-bar progress-bar-striped active\" style=\"width: 100%\"></div></div>',\n            size: EMPTY,\n            title: 'Attention',\n            autofocus: false\n        };\n        \n        root = root || {};\n        root.addLabel = addLabel;\n        root.ajax = ajax;\n        root.alert = alert;\n        root.close = close;\n        root.confirm = confirm;\n        root.emptyBin = emptyBin;\n        root.iframe = iframe;\n        root.prompt = prompt;\n        root.setId = setId;\n        root.setEModalOptions = setEModalOptions;\n        root.setModalOptions = setModalOptions;\n        root.size = SIZE;\n        root.version = '1.2.67';\n\n        return root;\n\n        //#region /////////////////////////* Private Logic */////////////////////////\n        /**\n         * Find modal body and append message to it.\n         * @param {String | DOM} message\n         */\n        function _build(message) {\n            $modal\n                .modal(options)\n                .find('.modal-content')\n                .append(message);\n        }\n\n        /**\n         * Will find what Promises approach the developer is using.\n         * Will use Promises A+ if Q.js is present, otherwise will use Promises A from jQuery.\n         * @returns {Promise}\n         */\n        function _createDeferred() {\n            var defer;\n\n            // try native promise\n            //if (Promise) defer = Promise.defer();\n\n            var q;\n\n            try {\n                q = require('Q');\n            } // Load option Q by require if exist\n            catch (e) {\n                q = window.Q;\n            }\n\n            if (q) { // try Q\n                defer = q.defer();\n            } else { // Use jQuery :(\n                defer = $.Deferred();\n                defer.promise = defer.promise();\n            }\n\n            defer.promise.element = _getModalInstance(true).find(MODAL_DIALOG);\n            return defer;\n        }\n\n        /**\n         * Will create modal DOM footer with all buttons.\n         * @param {Array} buttons - all custom buttons, if none, will generate defaults\n         * @returns {$DOM} footer DOM element\n         */\n        function _getFooter(buttons) {\n            if (buttons === false) {\n                return EMPTY;\n            }\n\n            var messageFotter = $(DIV).addClass('modal-footer').prop('id', FOOTER_ID);\n            if (buttons) {\n                for (var i = 0, k = buttons.length; i < k; i++) {\n                    var btnOp = buttons[i];\n                    var btn = $('<button>').addClass('btn btn-' + (btnOp.style || 'primary'));\n\n                    for (var index in btnOp) {\n                        if (btnOp.hasOwnProperty(index)) {\n                            switch (index) {\n                                case 'close':\n                                    //add close event\n                                    if (btnOp[index]) {\n                                        btn.attr('data-dismiss', 'modal')\n                                            .addClass('x');\n                                    }\n                                    break;\n                                case EVENT_CLICK:\n                                    //click event\n                                    var fn = btnOp.click.bind(_getModalInstance(true).find('.modal-content'));\n                                    btn.click(fn);\n                                    break;\n                                case 'text':\n                                    btn.html(btnOp[index]);\n                                    break;\n                                default:\n                                    //all other possible HTML attributes to button element\n                                    btn.attr(index, btnOp[index]);\n                            }\n                        }\n                    }\n\n                    messageFotter.append(btn);\n                }\n            } else {\n                //if no buttons defined by user, add a standard close button.\n                messageFotter.append('<button class=\"x btn btn-primary\" data-dismiss=modal type=button>Close</button>');\n            }\n            return messageFotter;\n        }\n\n        /**\n         * Extract message from arguments.\n         * @param {Object | String} data - this can be the message string or the full detailed object\n         * @returns {$DOM}\n         */\n        function _getMessage(data) {\n            var $message;\n            var content = data.loading ?\n                defaultSettings.loadingHtml :\n                (data.message || data);\n\n            if (content.on || content.onclick) {\n                $message = data.clone === true ?\n                    $(content).clone() :\n                    $(content);\n\n                $message.addClass(data.useBin && !data.loading ? REC_MODAL_CONTENT : TMP_MODAL_CONTENT);\n            } else {\n                $message = $(DIV)\n                    .attr('style', 'position:relative;word-wrap:break-word;')\n                    .addClass(MODAL_BODY)\n                    .html(content);\n            }\n\n            return data.css && (data.css !== $message.css && $message.css(data.css)), $message;\n        }\n\n        /**\n         * Return a new modal object if is the first request or the already created model.\n         * @param {boolean} skipEventChageIfExists\n         * @returns {jQuery Object}\n         */\n        function _getModalInstance(skipEventChageIfExists) {\n            if (!$modal) {\n                //add recycle bin container to document\n                if (!$('#' + BIN).length) {\n                    $('body').append($(DIV).prop('id', BIN).hide());\n                }\n\n                $modal = createModalElement();\n            }\n\n            if (skipEventChageIfExists && $modal) {\n                return $modal;\n            }\n\n            if (defaultSettings.autofocus) {\n                $modal\n                    .on(EVENT_SHOW, function () {\n                        $(this).find(INPUT).first().focus();\n                    });\n            }\n\n            return $modal;\n\n            function createModalElement() {\n                return $('<div class=\"modal fade\" tabindex=\"-1\"><style>.modal-title{display:inline;}.modal-xl{width:96%;}.modal-body{max-height: calc(100vh - 145px);overflow-y: auto;}</style>' +\n                    '<div class=modal-dialog>' +\n                    '<div class=modal-content>' +\n                    ' <div class=modal-header><h5 class=modal-title></h5><button type=button class=\"x close\" data-dismiss=modal aria-label=\"Close\"><span aria-hidden=true>&times;</span></button></div>' +\n                    '</div>' +\n                    '</div>' +\n                    '</div>')\n                    .on('hidden.bs.modal', _recycleModal)\n                    .on(EVENT_CLICK, 'button.x', function (ev) {\n                        var btn = $(ev.currentTarget);\n\n                        if (btn.prop('type') !== EVENT_SUBMIT)\n                            return $modal.modal(EVENT_HIDE);\n\n                        try {\n                            if (btn.closest('form')[0].checkValidity())\n                                return close();\n                        } catch (e) {\n                            return close();\n                        }\n\n                        return $modal;\n                    });\n            }\n        }\n\n        /**\n         * @param {String} version \n         * @returns {Boolean}\n         */\n        function _jQueryMinVersion(version) {\n            var $ver = $.fn.jquery.split('.');\n            var ver = version.split('.');\n            var $major = $ver[0];\n            var $minor = $ver[1];\n            var $patch = $ver[2];\n            var major = ver[0];\n            var minor = ver[1];\n            var patch = ver[2];\n        \n            return !(\n                (major > $major) ||\n                (major === $major && minor > $minor) ||\n                (major === $major && minor === $minor && patch > $patch)\n            );\n        }\n\n        /**\n         * Move content to recycle bin if is a DOM object defined by user,\n         * delete it if is a simple string message.\n         * All modal messages can be deleted if default setting \"allowContentRecycle\" = false.\n         */\n        function _recycleModal() {\n            if (!$modal) return;\n\n            var $content = $modal.find('.' + REC_MODAL_CONTENT).removeClass(REC_MODAL_CONTENT)\n                .appendTo('#' + BIN);\n\n            $modal\n                .off(HIDE)\n                .off(EVENT_SHOW)\n                .find('.modal-content > div:not(:first-child)')\n                .remove();\n\n            if (!defaultSettings.allowContentRecycle || lastParams.clone) {\n                $content.remove();\n            }\n        }\n\n        /**\n         * Handle default values and toggle between {Object | String}.\n         * Create or get Modal element\n         * @param {Object | String} data - this can be the message string or the full detailed object\n         * @param {String} title - the string that will be shown in modal header\n         * @returns {Promise} Promise with modal $DOM element\n         */\n        function _setup(params, title) {\n            if (!params) throw new Error('Invalid parameters!');\n\n            _recycleModal();\n            lastParams = params;\n\n            // Lazy loading\n            var $ref = _getModalInstance();\n            var size = 'modal-' + (params.size || defaultSettings.size);\n\n            // Change size\n            $ref.find(MODAL_DIALOG)\n                .removeClass('modal-sm modal-lg modal-xl')\n                .addClass(params.size || defaultSettings.size ? size : null);\n\n            // Change title\n            $ref.find('.modal-title')\n                .html((params.title || title || defaultSettings.title) + ' ')\n                .append($('<small>').html(params.subtitle || EMPTY));\n\n            $ref.on(HIDE, params.onHide);\n        }\n        //#endregion\n\n        //#region /////////////////////////* Public Methods */////////////////////////\n\n        function addLabel(yes, no) {\n            LABEL[yes] = no;\n        }\n\n        /**\n         * Gets data from URL to eModal body\n         * @param {Object | String} data - this can be the message string or the full detailed object\n         * @param {String} title - the string that will be shown in modal header\n         * @returns {Promise} Promise with modal $DOM element\n         */\n        function ajax(data, title) {\n\n            var dfd = _createDeferred();\n\n            if (typeof data === 'object') {\n                setEModalOptions(data);\n            }\n\n            var params = {\n                async: true,\n                deferred: dfd,\n                xhrFields: { withCredentials: false },\n                loading: true,\n                title: title || defaultSettings.title,\n                url: data.url || data,\n                dataType: data.dataType || 'text'\n            };\n\n            if (data.url) {\n                $.extend(params, data);\n            }\n\n            $.ajax(params)\n                .done(ok)\n                .fail(error);\n\n            return alert(params, title);\n\n            function ok(html) {\n                $modal\n                    .find('.' + MODAL_BODY)\n                    .html(data.success ? data.success(html) : html);\n\n                return dfd.resolve($modal);\n            }\n\n            function error(responseText, textStatus) {\n                var msg = data.error ?\n                    data.error(responseText, textStatus, params) :\n                    '<div class=\"alert alert-danger\">' +\n                    '<strong>XHR Fail: </strong>URL [ ' + params.url + '] load fail.' +\n                    '</div>';\n\n                $modal\n                    .find('.' + MODAL_BODY)\n                    .html(msg);\n                return dfd.reject(responseText);\n            }\n        }\n\n        /**\n         * Non blocking alert whit bootstrap.\n         * @param {Object | String} data - this can be the message string or the full detailed object.\n         * @param {String} title - the string that will be shown in modal header.\n         * @returns {Promise} Promise with modal $DOM element\n         */\n        function alert(data, title) {\n            _setup(data, title);\n\n            var dfd = data.deferred || _createDeferred();\n\n            if (typeof data === 'object') {\n                setEModalOptions(data);\n            }\n\n            var $message = $(DIV).append(_getMessage(data), _getFooter(data.buttons));\n\n            _build($message);\n\n            if (!data.async) {\n                $modal.on(EVENT_SHOW, dfd.resolve);\n            }\n\n            return dfd.promise;\n        }\n\n        /**\n         * Non blocking confirm dialog with bootstrap.\n         * @param {Object | String} data - this can be the message string or the full detailed object.\n         * @param {String} title - the string that will be shown in modal header.\n         * @returns {Promise} Promise with modal $DOM element\n         */\n        function confirm(data, title) {\n            var dfd = _createDeferred();\n\n            if (typeof data === 'object') {\n                setEModalOptions(data);\n            }\n\n            return alert({\n                async: true,\n                buttons: [{\n                    close: true,\n                    click: click,\n                    text: LABEL[data.label] ? LABEL[data.label] : LABEL[defaultSettings.confirmLabel],\n                    style: data.style && data.style[0] || KEY_DANGER\n                }, {\n                    close: true,\n                    click: click,\n                    text: LABEL[data.label] ? data.label : defaultSettings.confirmLabel,\n                    style: data.style && data.style[1]\n                }],\n                deferred: dfd,\n                message: data.message || data,\n                onHide: click,\n                size: data.size,\n                title: data.title || title\n            });\n\n            function click(ev) {\n                close();\n\n                var key = $(ev.currentTarget).html();\n                return LABEL[key] ? dfd.resolve() : dfd.reject();\n            }\n        }\n\n        /**\n         * Will load a URL in iFrame inside the modal body.\n         * @param {Object | String} data - this can be the URL string or the full detailed object.\n         * @param {String} title - the string that will be shown in modal header.\n         * @returns {Promise} Promise with modal $DOM element\n         */\n        function iframe(params, title) {\n            var dfd = _createDeferred();\n\n            if (typeof data === 'object') {\n                setEModalOptions(data);\n            }\n\n            var postData = params.data ? \n                Object.keys(params.data).map(mapData).join(' ') : \n                '';\n\n            var html = ('<div class=modal-body style=\"position: absolute;width: 100%;background-color: rgba(255,255,255,0.8);height: 100%;\">%1%</div>' +\n                '<iframe class=\"embed-responsive-item\" frameborder=0 src=\"%0%\" %2% style=\"width:100%;height:75vh;display:block;\"/>')\n                .replace('%0%', params.message || params.url || params)\n                .replace('%1%', defaultSettings.loadingHtml)\n                .replace('%2%', postData);\n\n            var message = _jQueryMinVersion('3.0.0') ? \n                $(html).on('load', iframeReady):\n                $(html).load(iframeReady);\n\n            return alert({\n                async: true,\n                buttons: params.buttons || false,\n                deferred: dfd,\n                message: message,\n                size: params.size || SIZE.xl,\n                title: params.title || title\n            });\n            //////////\n\n            function mapData(item) {\n                return item + '=\"' + params.data[item] + '\"';\n            }\n\n            function iframeReady() {\n                $(this)\n                    .parent()\n                    .find('div.' + TMP_MODAL_CONTENT)\n                    .fadeOut(function () {\n                        $(this).remove();\n                    });\n\n                return dfd.resolve();\n            }\n        }\n\n        /**\n         * Remove all Dom elements in recycle bin.\n         * @returns {Array} All removed elements\n         */\n        function emptyBin() {\n            return $('#' + BIN + ' > *').remove();\n        }\n\n        /**\n         * Provides one value form.\n         * @param {Object | String} data - this can be the value string label or the full detailed object.\n         * @param {String} title - the string that will be shown in modal header.\n         * @returns {Promise} Promise with modal $DOM element\n         */\n        function prompt(data, title) {\n            var dfd = _createDeferred();\n\n            if (typeof data === 'object') {\n                setEModalOptions(data);\n            }\n\n            var params = {\n                deferred: dfd\n            };\n\n            if (typeof data === 'object') {\n                $.extend(params, data);\n            } else {\n                params.message = data;\n                params.title = title;\n            }\n\n            params.async = true;\n\n            if (params.buttons) {\n                var btn;\n                for (var i = 0, k = params.buttons.length; i < k; i++) {\n                    btn = params.buttons[i];\n                    btn.style = (btn.style || 'default') + ' pull-left';\n                    btn.type = btn.type || 'button';\n                }\n            }\n\n            var buttons = _getFooter([{\n                close: true,\n                type: 'reset',\n                text: LABEL.OK,\n                style: KEY_DANGER\n            }, {\n                close: false,\n                type: EVENT_SUBMIT,\n                text: defaultSettings.confirmLabel\n            }].concat(params.buttons || []));\n\n            params.buttons = false;\n            params.onHide = submit;\n\n            params.message = $('<form role=form style=\"margin-bottom:0;\">' +\n                '<div class=modal-body>' +\n                '<label for=prompt-input class=control-label>' + (params.message || EMPTY) + '</label>' +\n                '<input type=text class=form-control required autocomplete=\"on\" value=\"' + (params.value || EMPTY) + (params.pattern ? '\" pattern=\"' + params.pattern : EMPTY) + '\">' +\n                '</div></form>')\n                .append(buttons)\n                .on(EVENT_SUBMIT, submit);\n\n            return alert(params);\n\n            function submit(ev) {\n                var value = $modal.find(INPUT).val();\n                close();\n\n                //TODO:\n                ev.type !== EVENT_SUBMIT ?\n                    dfd.reject(value) :\n                    dfd.resolve(value);\n\n                return false;\n            }\n        }\n\n        function setId(id) {\n            _getModalInstance(true)\n                .find(MODAL_DIALOG)\n                .prop('id', id);\n        }\n\n        /**\n         * Set or change eModal options.\n         * @param {Object} overrideOptions\n         * @returns {Object} merged eModal options\n         */\n        function setEModalOptions(overrideOptions) {\n            return $.extend(defaultSettings, overrideOptions);\n        }\n\n        /**\n         * Set or change bootstrap modal options.\n         * @param {Object} overrideOptions\n         * @returns {Object} merged eModal options\n         */\n        function setModalOptions(overrideOptions) {\n            $modal && $modal.remove();\n\n            return $.extend(options, overrideOptions);\n        }\n\n        /**\n         * Close the current open eModal\n         * @returns {$DOM} eModal DOM element\n         */\n        function close() {\n            if ($modal) {\n                $modal.off(HIDE).modal(EVENT_HIDE);\n            }\n            return $modal;\n        }\n        //#endregion\n    });\n}(typeof define == 'function' && define.amd ?\n    define :\n    function (args, mName) {\n        this.eModal = typeof module != 'undefined' && module.exports ?\n            mName(require(args[0], {}), module.exports) :\n            mName(window.$);\n    }));","/**\n * EvEmitter v1.1.0\n * Lil' event emitter\n * MIT License\n */\n\n/* jshint unused: true, undef: true, strict: true */\n\n( function( global, factory ) {\n  // universal module definition\n  /* jshint strict: false */ /* globals define, module, window */\n  if ( typeof define == 'function' && define.amd ) {\n    // AMD - RequireJS\n    define( factory );\n  } else if ( typeof module == 'object' && module.exports ) {\n    // CommonJS - Browserify, Webpack\n    module.exports = factory();\n  } else {\n    // Browser globals\n    global.EvEmitter = factory();\n  }\n\n}( typeof window != 'undefined' ? window : this, function() {\n\n\"use strict\";\n\nfunction EvEmitter() {}\n\nvar proto = EvEmitter.prototype;\n\nproto.on = function( eventName, listener ) {\n  if ( !eventName || !listener ) {\n    return;\n  }\n  // set events hash\n  var events = this._events = this._events || {};\n  // set listeners array\n  var listeners = events[ eventName ] = events[ eventName ] || [];\n  // only add once\n  if ( listeners.indexOf( listener ) == -1 ) {\n    listeners.push( listener );\n  }\n\n  return this;\n};\n\nproto.once = function( eventName, listener ) {\n  if ( !eventName || !listener ) {\n    return;\n  }\n  // add event\n  this.on( eventName, listener );\n  // set once flag\n  // set onceEvents hash\n  var onceEvents = this._onceEvents = this._onceEvents || {};\n  // set onceListeners object\n  var onceListeners = onceEvents[ eventName ] = onceEvents[ eventName ] || {};\n  // set flag\n  onceListeners[ listener ] = true;\n\n  return this;\n};\n\nproto.off = function( eventName, listener ) {\n  var listeners = this._events && this._events[ eventName ];\n  if ( !listeners || !listeners.length ) {\n    return;\n  }\n  var index = listeners.indexOf( listener );\n  if ( index != -1 ) {\n    listeners.splice( index, 1 );\n  }\n\n  return this;\n};\n\nproto.emitEvent = function( eventName, args ) {\n  var listeners = this._events && this._events[ eventName ];\n  if ( !listeners || !listeners.length ) {\n    return;\n  }\n  // copy over to avoid interference if .off() in listener\n  listeners = listeners.slice(0);\n  args = args || [];\n  // once stuff\n  var onceListeners = this._onceEvents && this._onceEvents[ eventName ];\n\n  for ( var i=0; i < listeners.length; i++ ) {\n    var listener = listeners[i]\n    var isOnce = onceListeners && onceListeners[ listener ];\n    if ( isOnce ) {\n      // remove listener\n      // remove before trigger to prevent recursion\n      this.off( eventName, listener );\n      // unset once flag\n      delete onceListeners[ listener ];\n    }\n    // trigger listener\n    listener.apply( this, args );\n  }\n\n  return this;\n};\n\nproto.allOff = function() {\n  delete this._events;\n  delete this._onceEvents;\n};\n\nreturn EvEmitter;\n\n}));\n","/**\n * @license\n * Lodash <https://lodash.com/>\n * Copyright OpenJS Foundation and other contributors <https://openjsf.org/>\n * Released under MIT license <https://lodash.com/license>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n;(function() {\n\n  /** Used as a safe reference for `undefined` in pre-ES5 environments. */\n  var undefined;\n\n  /** Used as the semantic version number. */\n  var VERSION = '4.17.21';\n\n  /** Used as the size to enable large array optimizations. */\n  var LARGE_ARRAY_SIZE = 200;\n\n  /** Error message constants. */\n  var CORE_ERROR_TEXT = 'Unsupported core-js use. Try https://npms.io/search?q=ponyfill.',\n      FUNC_ERROR_TEXT = 'Expected a function',\n      INVALID_TEMPL_VAR_ERROR_TEXT = 'Invalid `variable` option passed into `_.template`';\n\n  /** Used to stand-in for `undefined` hash values. */\n  var HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n  /** Used as the maximum memoize cache size. */\n  var MAX_MEMOIZE_SIZE = 500;\n\n  /** Used as the internal argument placeholder. */\n  var PLACEHOLDER = '__lodash_placeholder__';\n\n  /** Used to compose bitmasks for cloning. */\n  var CLONE_DEEP_FLAG = 1,\n      CLONE_FLAT_FLAG = 2,\n      CLONE_SYMBOLS_FLAG = 4;\n\n  /** Used to compose bitmasks for value comparisons. */\n  var COMPARE_PARTIAL_FLAG = 1,\n      COMPARE_UNORDERED_FLAG = 2;\n\n  /** Used to compose bitmasks for function metadata. */\n  var WRAP_BIND_FLAG = 1,\n      WRAP_BIND_KEY_FLAG = 2,\n      WRAP_CURRY_BOUND_FLAG = 4,\n      WRAP_CURRY_FLAG = 8,\n      WRAP_CURRY_RIGHT_FLAG = 16,\n      WRAP_PARTIAL_FLAG = 32,\n      WRAP_PARTIAL_RIGHT_FLAG = 64,\n      WRAP_ARY_FLAG = 128,\n      WRAP_REARG_FLAG = 256,\n      WRAP_FLIP_FLAG = 512;\n\n  /** Used as default options for `_.truncate`. */\n  var DEFAULT_TRUNC_LENGTH = 30,\n      DEFAULT_TRUNC_OMISSION = '...';\n\n  /** Used to detect hot functions by number of calls within a span of milliseconds. */\n  var HOT_COUNT = 800,\n      HOT_SPAN = 16;\n\n  /** Used to indicate the type of lazy iteratees. */\n  var LAZY_FILTER_FLAG = 1,\n      LAZY_MAP_FLAG = 2,\n      LAZY_WHILE_FLAG = 3;\n\n  /** Used as references for various `Number` constants. */\n  var INFINITY = 1 / 0,\n      MAX_SAFE_INTEGER = 9007199254740991,\n      MAX_INTEGER = 1.7976931348623157e+308,\n      NAN = 0 / 0;\n\n  /** Used as references for the maximum length and index of an array. */\n  var MAX_ARRAY_LENGTH = 4294967295,\n      MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1,\n      HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1;\n\n  /** Used to associate wrap methods with their bit flags. */\n  var wrapFlags = [\n    ['ary', WRAP_ARY_FLAG],\n    ['bind', WRAP_BIND_FLAG],\n    ['bindKey', WRAP_BIND_KEY_FLAG],\n    ['curry', WRAP_CURRY_FLAG],\n    ['curryRight', WRAP_CURRY_RIGHT_FLAG],\n    ['flip', WRAP_FLIP_FLAG],\n    ['partial', WRAP_PARTIAL_FLAG],\n    ['partialRight', WRAP_PARTIAL_RIGHT_FLAG],\n    ['rearg', WRAP_REARG_FLAG]\n  ];\n\n  /** `Object#toString` result references. */\n  var argsTag = '[object Arguments]',\n      arrayTag = '[object Array]',\n      asyncTag = '[object AsyncFunction]',\n      boolTag = '[object Boolean]',\n      dateTag = '[object Date]',\n      domExcTag = '[object DOMException]',\n      errorTag = '[object Error]',\n      funcTag = '[object Function]',\n      genTag = '[object GeneratorFunction]',\n      mapTag = '[object Map]',\n      numberTag = '[object Number]',\n      nullTag = '[object Null]',\n      objectTag = '[object Object]',\n      promiseTag = '[object Promise]',\n      proxyTag = '[object Proxy]',\n      regexpTag = '[object RegExp]',\n      setTag = '[object Set]',\n      stringTag = '[object String]',\n      symbolTag = '[object Symbol]',\n      undefinedTag = '[object Undefined]',\n      weakMapTag = '[object WeakMap]',\n      weakSetTag = '[object WeakSet]';\n\n  var arrayBufferTag = '[object ArrayBuffer]',\n      dataViewTag = '[object DataView]',\n      float32Tag = '[object Float32Array]',\n      float64Tag = '[object Float64Array]',\n      int8Tag = '[object Int8Array]',\n      int16Tag = '[object Int16Array]',\n      int32Tag = '[object Int32Array]',\n      uint8Tag = '[object Uint8Array]',\n      uint8ClampedTag = '[object Uint8ClampedArray]',\n      uint16Tag = '[object Uint16Array]',\n      uint32Tag = '[object Uint32Array]';\n\n  /** Used to match empty string literals in compiled template source. */\n  var reEmptyStringLeading = /\\b__p \\+= '';/g,\n      reEmptyStringMiddle = /\\b(__p \\+=) '' \\+/g,\n      reEmptyStringTrailing = /(__e\\(.*?\\)|\\b__t\\)) \\+\\n'';/g;\n\n  /** Used to match HTML entities and HTML characters. */\n  var reEscapedHtml = /&(?:amp|lt|gt|quot|#39);/g,\n      reUnescapedHtml = /[&<>\"']/g,\n      reHasEscapedHtml = RegExp(reEscapedHtml.source),\n      reHasUnescapedHtml = RegExp(reUnescapedHtml.source);\n\n  /** Used to match template delimiters. */\n  var reEscape = /<%-([\\s\\S]+?)%>/g,\n      reEvaluate = /<%([\\s\\S]+?)%>/g,\n      reInterpolate = /<%=([\\s\\S]+?)%>/g;\n\n  /** Used to match property names within property paths. */\n  var reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n      reIsPlainProp = /^\\w*$/,\n      rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n\n  /**\n   * Used to match `RegExp`\n   * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n   */\n  var reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g,\n      reHasRegExpChar = RegExp(reRegExpChar.source);\n\n  /** Used to match leading whitespace. */\n  var reTrimStart = /^\\s+/;\n\n  /** Used to match a single whitespace character. */\n  var reWhitespace = /\\s/;\n\n  /** Used to match wrap detail comments. */\n  var reWrapComment = /\\{(?:\\n\\/\\* \\[wrapped with .+\\] \\*\\/)?\\n?/,\n      reWrapDetails = /\\{\\n\\/\\* \\[wrapped with (.+)\\] \\*/,\n      reSplitDetails = /,? & /;\n\n  /** Used to match words composed of alphanumeric characters. */\n  var reAsciiWord = /[^\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\x7f]+/g;\n\n  /**\n   * Used to validate the `validate` option in `_.template` variable.\n   *\n   * Forbids characters which could potentially change the meaning of the function argument definition:\n   * - \"(),\" (modification of function parameters)\n   * - \"=\" (default value)\n   * - \"[]{}\" (destructuring of function parameters)\n   * - \"/\" (beginning of a comment)\n   * - whitespace\n   */\n  var reForbiddenIdentifierChars = /[()=,{}\\[\\]\\/\\s]/;\n\n  /** Used to match backslashes in property paths. */\n  var reEscapeChar = /\\\\(\\\\)?/g;\n\n  /**\n   * Used to match\n   * [ES template delimiters](http://ecma-international.org/ecma-262/7.0/#sec-template-literal-lexical-components).\n   */\n  var reEsTemplate = /\\$\\{([^\\\\}]*(?:\\\\.[^\\\\}]*)*)\\}/g;\n\n  /** Used to match `RegExp` flags from their coerced string values. */\n  var reFlags = /\\w*$/;\n\n  /** Used to detect bad signed hexadecimal string values. */\n  var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n  /** Used to detect binary string values. */\n  var reIsBinary = /^0b[01]+$/i;\n\n  /** Used to detect host constructors (Safari). */\n  var reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n  /** Used to detect octal string values. */\n  var reIsOctal = /^0o[0-7]+$/i;\n\n  /** Used to detect unsigned integer values. */\n  var reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n  /** Used to match Latin Unicode letters (excluding mathematical operators). */\n  var reLatin = /[\\xc0-\\xd6\\xd8-\\xf6\\xf8-\\xff\\u0100-\\u017f]/g;\n\n  /** Used to ensure capturing order of template delimiters. */\n  var reNoMatch = /($^)/;\n\n  /** Used to match unescaped characters in compiled string literals. */\n  var reUnescapedString = /['\\n\\r\\u2028\\u2029\\\\]/g;\n\n  /** Used to compose unicode character classes. */\n  var rsAstralRange = '\\\\ud800-\\\\udfff',\n      rsComboMarksRange = '\\\\u0300-\\\\u036f',\n      reComboHalfMarksRange = '\\\\ufe20-\\\\ufe2f',\n      rsComboSymbolsRange = '\\\\u20d0-\\\\u20ff',\n      rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,\n      rsDingbatRange = '\\\\u2700-\\\\u27bf',\n      rsLowerRange = 'a-z\\\\xdf-\\\\xf6\\\\xf8-\\\\xff',\n      rsMathOpRange = '\\\\xac\\\\xb1\\\\xd7\\\\xf7',\n      rsNonCharRange = '\\\\x00-\\\\x2f\\\\x3a-\\\\x40\\\\x5b-\\\\x60\\\\x7b-\\\\xbf',\n      rsPunctuationRange = '\\\\u2000-\\\\u206f',\n      rsSpaceRange = ' \\\\t\\\\x0b\\\\f\\\\xa0\\\\ufeff\\\\n\\\\r\\\\u2028\\\\u2029\\\\u1680\\\\u180e\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200a\\\\u202f\\\\u205f\\\\u3000',\n      rsUpperRange = 'A-Z\\\\xc0-\\\\xd6\\\\xd8-\\\\xde',\n      rsVarRange = '\\\\ufe0e\\\\ufe0f',\n      rsBreakRange = rsMathOpRange + rsNonCharRange + rsPunctuationRange + rsSpaceRange;\n\n  /** Used to compose unicode capture groups. */\n  var rsApos = \"['\\u2019]\",\n      rsAstral = '[' + rsAstralRange + ']',\n      rsBreak = '[' + rsBreakRange + ']',\n      rsCombo = '[' + rsComboRange + ']',\n      rsDigits = '\\\\d+',\n      rsDingbat = '[' + rsDingbatRange + ']',\n      rsLower = '[' + rsLowerRange + ']',\n      rsMisc = '[^' + rsAstralRange + rsBreakRange + rsDigits + rsDingbatRange + rsLowerRange + rsUpperRange + ']',\n      rsFitz = '\\\\ud83c[\\\\udffb-\\\\udfff]',\n      rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',\n      rsNonAstral = '[^' + rsAstralRange + ']',\n      rsRegional = '(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}',\n      rsSurrPair = '[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]',\n      rsUpper = '[' + rsUpperRange + ']',\n      rsZWJ = '\\\\u200d';\n\n  /** Used to compose unicode regexes. */\n  var rsMiscLower = '(?:' + rsLower + '|' + rsMisc + ')',\n      rsMiscUpper = '(?:' + rsUpper + '|' + rsMisc + ')',\n      rsOptContrLower = '(?:' + rsApos + '(?:d|ll|m|re|s|t|ve))?',\n      rsOptContrUpper = '(?:' + rsApos + '(?:D|LL|M|RE|S|T|VE))?',\n      reOptMod = rsModifier + '?',\n      rsOptVar = '[' + rsVarRange + ']?',\n      rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',\n      rsOrdLower = '\\\\d*(?:1st|2nd|3rd|(?![123])\\\\dth)(?=\\\\b|[A-Z_])',\n      rsOrdUpper = '\\\\d*(?:1ST|2ND|3RD|(?![123])\\\\dTH)(?=\\\\b|[a-z_])',\n      rsSeq = rsOptVar + reOptMod + rsOptJoin,\n      rsEmoji = '(?:' + [rsDingbat, rsRegional, rsSurrPair].join('|') + ')' + rsSeq,\n      rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')';\n\n  /** Used to match apostrophes. */\n  var reApos = RegExp(rsApos, 'g');\n\n  /**\n   * Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks) and\n   * [combining diacritical marks for symbols](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks_for_Symbols).\n   */\n  var reComboMark = RegExp(rsCombo, 'g');\n\n  /** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */\n  var reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g');\n\n  /** Used to match complex or compound words. */\n  var reUnicodeWord = RegExp([\n    rsUpper + '?' + rsLower + '+' + rsOptContrLower + '(?=' + [rsBreak, rsUpper, '$'].join('|') + ')',\n    rsMiscUpper + '+' + rsOptContrUpper + '(?=' + [rsBreak, rsUpper + rsMiscLower, '$'].join('|') + ')',\n    rsUpper + '?' + rsMiscLower + '+' + rsOptContrLower,\n    rsUpper + '+' + rsOptContrUpper,\n    rsOrdUpper,\n    rsOrdLower,\n    rsDigits,\n    rsEmoji\n  ].join('|'), 'g');\n\n  /** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */\n  var reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange  + rsComboRange + rsVarRange + ']');\n\n  /** Used to detect strings that need a more robust regexp to match words. */\n  var reHasUnicodeWord = /[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;\n\n  /** Used to assign default `context` object properties. */\n  var contextProps = [\n    'Array', 'Buffer', 'DataView', 'Date', 'Error', 'Float32Array', 'Float64Array',\n    'Function', 'Int8Array', 'Int16Array', 'Int32Array', 'Map', 'Math', 'Object',\n    'Promise', 'RegExp', 'Set', 'String', 'Symbol', 'TypeError', 'Uint8Array',\n    'Uint8ClampedArray', 'Uint16Array', 'Uint32Array', 'WeakMap',\n    '_', 'clearTimeout', 'isFinite', 'parseInt', 'setTimeout'\n  ];\n\n  /** Used to make template sourceURLs easier to identify. */\n  var templateCounter = -1;\n\n  /** Used to identify `toStringTag` values of typed arrays. */\n  var typedArrayTags = {};\n  typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\n  typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\n  typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\n  typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\n  typedArrayTags[uint32Tag] = true;\n  typedArrayTags[argsTag] = typedArrayTags[arrayTag] =\n  typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\n  typedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\n  typedArrayTags[errorTag] = typedArrayTags[funcTag] =\n  typedArrayTags[mapTag] = typedArrayTags[numberTag] =\n  typedArrayTags[objectTag] = typedArrayTags[regexpTag] =\n  typedArrayTags[setTag] = typedArrayTags[stringTag] =\n  typedArrayTags[weakMapTag] = false;\n\n  /** Used to identify `toStringTag` values supported by `_.clone`. */\n  var cloneableTags = {};\n  cloneableTags[argsTag] = cloneableTags[arrayTag] =\n  cloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =\n  cloneableTags[boolTag] = cloneableTags[dateTag] =\n  cloneableTags[float32Tag] = cloneableTags[float64Tag] =\n  cloneableTags[int8Tag] = cloneableTags[int16Tag] =\n  cloneableTags[int32Tag] = cloneableTags[mapTag] =\n  cloneableTags[numberTag] = cloneableTags[objectTag] =\n  cloneableTags[regexpTag] = cloneableTags[setTag] =\n  cloneableTags[stringTag] = cloneableTags[symbolTag] =\n  cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =\n  cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;\n  cloneableTags[errorTag] = cloneableTags[funcTag] =\n  cloneableTags[weakMapTag] = false;\n\n  /** Used to map Latin Unicode letters to basic Latin letters. */\n  var deburredLetters = {\n    // Latin-1 Supplement block.\n    '\\xc0': 'A',  '\\xc1': 'A', '\\xc2': 'A', '\\xc3': 'A', '\\xc4': 'A', '\\xc5': 'A',\n    '\\xe0': 'a',  '\\xe1': 'a', '\\xe2': 'a', '\\xe3': 'a', '\\xe4': 'a', '\\xe5': 'a',\n    '\\xc7': 'C',  '\\xe7': 'c',\n    '\\xd0': 'D',  '\\xf0': 'd',\n    '\\xc8': 'E',  '\\xc9': 'E', '\\xca': 'E', '\\xcb': 'E',\n    '\\xe8': 'e',  '\\xe9': 'e', '\\xea': 'e', '\\xeb': 'e',\n    '\\xcc': 'I',  '\\xcd': 'I', '\\xce': 'I', '\\xcf': 'I',\n    '\\xec': 'i',  '\\xed': 'i', '\\xee': 'i', '\\xef': 'i',\n    '\\xd1': 'N',  '\\xf1': 'n',\n    '\\xd2': 'O',  '\\xd3': 'O', '\\xd4': 'O', '\\xd5': 'O', '\\xd6': 'O', '\\xd8': 'O',\n    '\\xf2': 'o',  '\\xf3': 'o', '\\xf4': 'o', '\\xf5': 'o', '\\xf6': 'o', '\\xf8': 'o',\n    '\\xd9': 'U',  '\\xda': 'U', '\\xdb': 'U', '\\xdc': 'U',\n    '\\xf9': 'u',  '\\xfa': 'u', '\\xfb': 'u', '\\xfc': 'u',\n    '\\xdd': 'Y',  '\\xfd': 'y', '\\xff': 'y',\n    '\\xc6': 'Ae', '\\xe6': 'ae',\n    '\\xde': 'Th', '\\xfe': 'th',\n    '\\xdf': 'ss',\n    // Latin Extended-A block.\n    '\\u0100': 'A',  '\\u0102': 'A', '\\u0104': 'A',\n    '\\u0101': 'a',  '\\u0103': 'a', '\\u0105': 'a',\n    '\\u0106': 'C',  '\\u0108': 'C', '\\u010a': 'C', '\\u010c': 'C',\n    '\\u0107': 'c',  '\\u0109': 'c', '\\u010b': 'c', '\\u010d': 'c',\n    '\\u010e': 'D',  '\\u0110': 'D', '\\u010f': 'd', '\\u0111': 'd',\n    '\\u0112': 'E',  '\\u0114': 'E', '\\u0116': 'E', '\\u0118': 'E', '\\u011a': 'E',\n    '\\u0113': 'e',  '\\u0115': 'e', '\\u0117': 'e', '\\u0119': 'e', '\\u011b': 'e',\n    '\\u011c': 'G',  '\\u011e': 'G', '\\u0120': 'G', '\\u0122': 'G',\n    '\\u011d': 'g',  '\\u011f': 'g', '\\u0121': 'g', '\\u0123': 'g',\n    '\\u0124': 'H',  '\\u0126': 'H', '\\u0125': 'h', '\\u0127': 'h',\n    '\\u0128': 'I',  '\\u012a': 'I', '\\u012c': 'I', '\\u012e': 'I', '\\u0130': 'I',\n    '\\u0129': 'i',  '\\u012b': 'i', '\\u012d': 'i', '\\u012f': 'i', '\\u0131': 'i',\n    '\\u0134': 'J',  '\\u0135': 'j',\n    '\\u0136': 'K',  '\\u0137': 'k', '\\u0138': 'k',\n    '\\u0139': 'L',  '\\u013b': 'L', '\\u013d': 'L', '\\u013f': 'L', '\\u0141': 'L',\n    '\\u013a': 'l',  '\\u013c': 'l', '\\u013e': 'l', '\\u0140': 'l', '\\u0142': 'l',\n    '\\u0143': 'N',  '\\u0145': 'N', '\\u0147': 'N', '\\u014a': 'N',\n    '\\u0144': 'n',  '\\u0146': 'n', '\\u0148': 'n', '\\u014b': 'n',\n    '\\u014c': 'O',  '\\u014e': 'O', '\\u0150': 'O',\n    '\\u014d': 'o',  '\\u014f': 'o', '\\u0151': 'o',\n    '\\u0154': 'R',  '\\u0156': 'R', '\\u0158': 'R',\n    '\\u0155': 'r',  '\\u0157': 'r', '\\u0159': 'r',\n    '\\u015a': 'S',  '\\u015c': 'S', '\\u015e': 'S', '\\u0160': 'S',\n    '\\u015b': 's',  '\\u015d': 's', '\\u015f': 's', '\\u0161': 's',\n    '\\u0162': 'T',  '\\u0164': 'T', '\\u0166': 'T',\n    '\\u0163': 't',  '\\u0165': 't', '\\u0167': 't',\n    '\\u0168': 'U',  '\\u016a': 'U', '\\u016c': 'U', '\\u016e': 'U', '\\u0170': 'U', '\\u0172': 'U',\n    '\\u0169': 'u',  '\\u016b': 'u', '\\u016d': 'u', '\\u016f': 'u', '\\u0171': 'u', '\\u0173': 'u',\n    '\\u0174': 'W',  '\\u0175': 'w',\n    '\\u0176': 'Y',  '\\u0177': 'y', '\\u0178': 'Y',\n    '\\u0179': 'Z',  '\\u017b': 'Z', '\\u017d': 'Z',\n    '\\u017a': 'z',  '\\u017c': 'z', '\\u017e': 'z',\n    '\\u0132': 'IJ', '\\u0133': 'ij',\n    '\\u0152': 'Oe', '\\u0153': 'oe',\n    '\\u0149': \"'n\", '\\u017f': 's'\n  };\n\n  /** Used to map characters to HTML entities. */\n  var htmlEscapes = {\n    '&': '&amp;',\n    '<': '&lt;',\n    '>': '&gt;',\n    '\"': '&quot;',\n    \"'\": '&#39;'\n  };\n\n  /** Used to map HTML entities to characters. */\n  var htmlUnescapes = {\n    '&amp;': '&',\n    '&lt;': '<',\n    '&gt;': '>',\n    '&quot;': '\"',\n    '&#39;': \"'\"\n  };\n\n  /** Used to escape characters for inclusion in compiled string literals. */\n  var stringEscapes = {\n    '\\\\': '\\\\',\n    \"'\": \"'\",\n    '\\n': 'n',\n    '\\r': 'r',\n    '\\u2028': 'u2028',\n    '\\u2029': 'u2029'\n  };\n\n  /** Built-in method references without a dependency on `root`. */\n  var freeParseFloat = parseFloat,\n      freeParseInt = parseInt;\n\n  /** Detect free variable `global` from Node.js. */\n  var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n  /** Detect free variable `self`. */\n  var freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n  /** Used as a reference to the global object. */\n  var root = freeGlobal || freeSelf || Function('return this')();\n\n  /** Detect free variable `exports`. */\n  var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n  /** Detect free variable `module`. */\n  var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n  /** Detect the popular CommonJS extension `module.exports`. */\n  var moduleExports = freeModule && freeModule.exports === freeExports;\n\n  /** Detect free variable `process` from Node.js. */\n  var freeProcess = moduleExports && freeGlobal.process;\n\n  /** Used to access faster Node.js helpers. */\n  var nodeUtil = (function() {\n    try {\n      // Use `util.types` for Node.js 10+.\n      var types = freeModule && freeModule.require && freeModule.require('util').types;\n\n      if (types) {\n        return types;\n      }\n\n      // Legacy `process.binding('util')` for Node.js < 10.\n      return freeProcess && freeProcess.binding && freeProcess.binding('util');\n    } catch (e) {}\n  }());\n\n  /* Node.js helper references. */\n  var nodeIsArrayBuffer = nodeUtil && nodeUtil.isArrayBuffer,\n      nodeIsDate = nodeUtil && nodeUtil.isDate,\n      nodeIsMap = nodeUtil && nodeUtil.isMap,\n      nodeIsRegExp = nodeUtil && nodeUtil.isRegExp,\n      nodeIsSet = nodeUtil && nodeUtil.isSet,\n      nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n  /*--------------------------------------------------------------------------*/\n\n  /**\n   * A faster alternative to `Function#apply`, this function invokes `func`\n   * with the `this` binding of `thisArg` and the arguments of `args`.\n   *\n   * @private\n   * @param {Function} func The function to invoke.\n   * @param {*} thisArg The `this` binding of `func`.\n   * @param {Array} args The arguments to invoke `func` with.\n   * @returns {*} Returns the result of `func`.\n   */\n  function apply(func, thisArg, args) {\n    switch (args.length) {\n      case 0: return func.call(thisArg);\n      case 1: return func.call(thisArg, args[0]);\n      case 2: return func.call(thisArg, args[0], args[1]);\n      case 3: return func.call(thisArg, args[0], args[1], args[2]);\n    }\n    return func.apply(thisArg, args);\n  }\n\n  /**\n   * A specialized version of `baseAggregator` for arrays.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} setter The function to set `accumulator` values.\n   * @param {Function} iteratee The iteratee to transform keys.\n   * @param {Object} accumulator The initial aggregated object.\n   * @returns {Function} Returns `accumulator`.\n   */\n  function arrayAggregator(array, setter, iteratee, accumulator) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    while (++index < length) {\n      var value = array[index];\n      setter(accumulator, value, iteratee(value), array);\n    }\n    return accumulator;\n  }\n\n  /**\n   * A specialized version of `_.forEach` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {Array} Returns `array`.\n   */\n  function arrayEach(array, iteratee) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    while (++index < length) {\n      if (iteratee(array[index], index, array) === false) {\n        break;\n      }\n    }\n    return array;\n  }\n\n  /**\n   * A specialized version of `_.forEachRight` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {Array} Returns `array`.\n   */\n  function arrayEachRight(array, iteratee) {\n    var length = array == null ? 0 : array.length;\n\n    while (length--) {\n      if (iteratee(array[length], length, array) === false) {\n        break;\n      }\n    }\n    return array;\n  }\n\n  /**\n   * A specialized version of `_.every` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} predicate The function invoked per iteration.\n   * @returns {boolean} Returns `true` if all elements pass the predicate check,\n   *  else `false`.\n   */\n  function arrayEvery(array, predicate) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    while (++index < length) {\n      if (!predicate(array[index], index, array)) {\n        return false;\n      }\n    }\n    return true;\n  }\n\n  /**\n   * A specialized version of `_.filter` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} predicate The function invoked per iteration.\n   * @returns {Array} Returns the new filtered array.\n   */\n  function arrayFilter(array, predicate) {\n    var index = -1,\n        length = array == null ? 0 : array.length,\n        resIndex = 0,\n        result = [];\n\n    while (++index < length) {\n      var value = array[index];\n      if (predicate(value, index, array)) {\n        result[resIndex++] = value;\n      }\n    }\n    return result;\n  }\n\n  /**\n   * A specialized version of `_.includes` for arrays without support for\n   * specifying an index to search from.\n   *\n   * @private\n   * @param {Array} [array] The array to inspect.\n   * @param {*} target The value to search for.\n   * @returns {boolean} Returns `true` if `target` is found, else `false`.\n   */\n  function arrayIncludes(array, value) {\n    var length = array == null ? 0 : array.length;\n    return !!length && baseIndexOf(array, value, 0) > -1;\n  }\n\n  /**\n   * This function is like `arrayIncludes` except that it accepts a comparator.\n   *\n   * @private\n   * @param {Array} [array] The array to inspect.\n   * @param {*} target The value to search for.\n   * @param {Function} comparator The comparator invoked per element.\n   * @returns {boolean} Returns `true` if `target` is found, else `false`.\n   */\n  function arrayIncludesWith(array, value, comparator) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    while (++index < length) {\n      if (comparator(value, array[index])) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  /**\n   * A specialized version of `_.map` for arrays without support for iteratee\n   * shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {Array} Returns the new mapped array.\n   */\n  function arrayMap(array, iteratee) {\n    var index = -1,\n        length = array == null ? 0 : array.length,\n        result = Array(length);\n\n    while (++index < length) {\n      result[index] = iteratee(array[index], index, array);\n    }\n    return result;\n  }\n\n  /**\n   * Appends the elements of `values` to `array`.\n   *\n   * @private\n   * @param {Array} array The array to modify.\n   * @param {Array} values The values to append.\n   * @returns {Array} Returns `array`.\n   */\n  function arrayPush(array, values) {\n    var index = -1,\n        length = values.length,\n        offset = array.length;\n\n    while (++index < length) {\n      array[offset + index] = values[index];\n    }\n    return array;\n  }\n\n  /**\n   * A specialized version of `_.reduce` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @param {*} [accumulator] The initial value.\n   * @param {boolean} [initAccum] Specify using the first element of `array` as\n   *  the initial value.\n   * @returns {*} Returns the accumulated value.\n   */\n  function arrayReduce(array, iteratee, accumulator, initAccum) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    if (initAccum && length) {\n      accumulator = array[++index];\n    }\n    while (++index < length) {\n      accumulator = iteratee(accumulator, array[index], index, array);\n    }\n    return accumulator;\n  }\n\n  /**\n   * A specialized version of `_.reduceRight` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @param {*} [accumulator] The initial value.\n   * @param {boolean} [initAccum] Specify using the last element of `array` as\n   *  the initial value.\n   * @returns {*} Returns the accumulated value.\n   */\n  function arrayReduceRight(array, iteratee, accumulator, initAccum) {\n    var length = array == null ? 0 : array.length;\n    if (initAccum && length) {\n      accumulator = array[--length];\n    }\n    while (length--) {\n      accumulator = iteratee(accumulator, array[length], length, array);\n    }\n    return accumulator;\n  }\n\n  /**\n   * A specialized version of `_.some` for arrays without support for iteratee\n   * shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} predicate The function invoked per iteration.\n   * @returns {boolean} Returns `true` if any element passes the predicate check,\n   *  else `false`.\n   */\n  function arraySome(array, predicate) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    while (++index < length) {\n      if (predicate(array[index], index, array)) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  /**\n   * Gets the size of an ASCII `string`.\n   *\n   * @private\n   * @param {string} string The string inspect.\n   * @returns {number} Returns the string size.\n   */\n  var asciiSize = baseProperty('length');\n\n  /**\n   * Converts an ASCII `string` to an array.\n   *\n   * @private\n   * @param {string} string The string to convert.\n   * @returns {Array} Returns the converted array.\n   */\n  function asciiToArray(string) {\n    return string.split('');\n  }\n\n  /**\n   * Splits an ASCII `string` into an array of its words.\n   *\n   * @private\n   * @param {string} The string to inspect.\n   * @returns {Array} Returns the words of `string`.\n   */\n  function asciiWords(string) {\n    return string.match(reAsciiWord) || [];\n  }\n\n  /**\n   * The base implementation of methods like `_.findKey` and `_.findLastKey`,\n   * without support for iteratee shorthands, which iterates over `collection`\n   * using `eachFunc`.\n   *\n   * @private\n   * @param {Array|Object} collection The collection to inspect.\n   * @param {Function} predicate The function invoked per iteration.\n   * @param {Function} eachFunc The function to iterate over `collection`.\n   * @returns {*} Returns the found element or its key, else `undefined`.\n   */\n  function baseFindKey(collection, predicate, eachFunc) {\n    var result;\n    eachFunc(collection, function(value, key, collection) {\n      if (predicate(value, key, collection)) {\n        result = key;\n        return false;\n      }\n    });\n    return result;\n  }\n\n  /**\n   * The base implementation of `_.findIndex` and `_.findLastIndex` without\n   * support for iteratee shorthands.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {Function} predicate The function invoked per iteration.\n   * @param {number} fromIndex The index to search from.\n   * @param {boolean} [fromRight] Specify iterating from right to left.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function baseFindIndex(array, predicate, fromIndex, fromRight) {\n    var length = array.length,\n        index = fromIndex + (fromRight ? 1 : -1);\n\n    while ((fromRight ? index-- : ++index < length)) {\n      if (predicate(array[index], index, array)) {\n        return index;\n      }\n    }\n    return -1;\n  }\n\n  /**\n   * The base implementation of `_.indexOf` without `fromIndex` bounds checks.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} value The value to search for.\n   * @param {number} fromIndex The index to search from.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function baseIndexOf(array, value, fromIndex) {\n    return value === value\n      ? strictIndexOf(array, value, fromIndex)\n      : baseFindIndex(array, baseIsNaN, fromIndex);\n  }\n\n  /**\n   * This function is like `baseIndexOf` except that it accepts a comparator.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} value The value to search for.\n   * @param {number} fromIndex The index to search from.\n   * @param {Function} comparator The comparator invoked per element.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function baseIndexOfWith(array, value, fromIndex, comparator) {\n    var index = fromIndex - 1,\n        length = array.length;\n\n    while (++index < length) {\n      if (comparator(array[index], value)) {\n        return index;\n      }\n    }\n    return -1;\n  }\n\n  /**\n   * The base implementation of `_.isNaN` without support for number objects.\n   *\n   * @private\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n   */\n  function baseIsNaN(value) {\n    return value !== value;\n  }\n\n  /**\n   * The base implementation of `_.mean` and `_.meanBy` without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} array The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {number} Returns the mean.\n   */\n  function baseMean(array, iteratee) {\n    var length = array == null ? 0 : array.length;\n    return length ? (baseSum(array, iteratee) / length) : NAN;\n  }\n\n  /**\n   * The base implementation of `_.property` without support for deep paths.\n   *\n   * @private\n   * @param {string} key The key of the property to get.\n   * @returns {Function} Returns the new accessor function.\n   */\n  function baseProperty(key) {\n    return function(object) {\n      return object == null ? undefined : object[key];\n    };\n  }\n\n  /**\n   * The base implementation of `_.propertyOf` without support for deep paths.\n   *\n   * @private\n   * @param {Object} object The object to query.\n   * @returns {Function} Returns the new accessor function.\n   */\n  function basePropertyOf(object) {\n    return function(key) {\n      return object == null ? undefined : object[key];\n    };\n  }\n\n  /**\n   * The base implementation of `_.reduce` and `_.reduceRight`, without support\n   * for iteratee shorthands, which iterates over `collection` using `eachFunc`.\n   *\n   * @private\n   * @param {Array|Object} collection The collection to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @param {*} accumulator The initial value.\n   * @param {boolean} initAccum Specify using the first or last element of\n   *  `collection` as the initial value.\n   * @param {Function} eachFunc The function to iterate over `collection`.\n   * @returns {*} Returns the accumulated value.\n   */\n  function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {\n    eachFunc(collection, function(value, index, collection) {\n      accumulator = initAccum\n        ? (initAccum = false, value)\n        : iteratee(accumulator, value, index, collection);\n    });\n    return accumulator;\n  }\n\n  /**\n   * The base implementation of `_.sortBy` which uses `comparer` to define the\n   * sort order of `array` and replaces criteria objects with their corresponding\n   * values.\n   *\n   * @private\n   * @param {Array} array The array to sort.\n   * @param {Function} comparer The function to define sort order.\n   * @returns {Array} Returns `array`.\n   */\n  function baseSortBy(array, comparer) {\n    var length = array.length;\n\n    array.sort(comparer);\n    while (length--) {\n      array[length] = array[length].value;\n    }\n    return array;\n  }\n\n  /**\n   * The base implementation of `_.sum` and `_.sumBy` without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} array The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {number} Returns the sum.\n   */\n  function baseSum(array, iteratee) {\n    var result,\n        index = -1,\n        length = array.length;\n\n    while (++index < length) {\n      var current = iteratee(array[index]);\n      if (current !== undefined) {\n        result = result === undefined ? current : (result + current);\n      }\n    }\n    return result;\n  }\n\n  /**\n   * The base implementation of `_.times` without support for iteratee shorthands\n   * or max array length checks.\n   *\n   * @private\n   * @param {number} n The number of times to invoke `iteratee`.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {Array} Returns the array of results.\n   */\n  function baseTimes(n, iteratee) {\n    var index = -1,\n        result = Array(n);\n\n    while (++index < n) {\n      result[index] = iteratee(index);\n    }\n    return result;\n  }\n\n  /**\n   * The base implementation of `_.toPairs` and `_.toPairsIn` which creates an array\n   * of key-value pairs for `object` corresponding to the property names of `props`.\n   *\n   * @private\n   * @param {Object} object The object to query.\n   * @param {Array} props The property names to get values for.\n   * @returns {Object} Returns the key-value pairs.\n   */\n  function baseToPairs(object, props) {\n    return arrayMap(props, function(key) {\n      return [key, object[key]];\n    });\n  }\n\n  /**\n   * The base implementation of `_.trim`.\n   *\n   * @private\n   * @param {string} string The string to trim.\n   * @returns {string} Returns the trimmed string.\n   */\n  function baseTrim(string) {\n    return string\n      ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '')\n      : string;\n  }\n\n  /**\n   * The base implementation of `_.unary` without support for storing metadata.\n   *\n   * @private\n   * @param {Function} func The function to cap arguments for.\n   * @returns {Function} Returns the new capped function.\n   */\n  function baseUnary(func) {\n    return function(value) {\n      return func(value);\n    };\n  }\n\n  /**\n   * The base implementation of `_.values` and `_.valuesIn` which creates an\n   * array of `object` property values corresponding to the property names\n   * of `props`.\n   *\n   * @private\n   * @param {Object} object The object to query.\n   * @param {Array} props The property names to get values for.\n   * @returns {Object} Returns the array of property values.\n   */\n  function baseValues(object, props) {\n    return arrayMap(props, function(key) {\n      return object[key];\n    });\n  }\n\n  /**\n   * Checks if a `cache` value for `key` exists.\n   *\n   * @private\n   * @param {Object} cache The cache to query.\n   * @param {string} key The key of the entry to check.\n   * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n   */\n  function cacheHas(cache, key) {\n    return cache.has(key);\n  }\n\n  /**\n   * Used by `_.trim` and `_.trimStart` to get the index of the first string symbol\n   * that is not found in the character symbols.\n   *\n   * @private\n   * @param {Array} strSymbols The string symbols to inspect.\n   * @param {Array} chrSymbols The character symbols to find.\n   * @returns {number} Returns the index of the first unmatched string symbol.\n   */\n  function charsStartIndex(strSymbols, chrSymbols) {\n    var index = -1,\n        length = strSymbols.length;\n\n    while (++index < length && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}\n    return index;\n  }\n\n  /**\n   * Used by `_.trim` and `_.trimEnd` to get the index of the last string symbol\n   * that is not found in the character symbols.\n   *\n   * @private\n   * @param {Array} strSymbols The string symbols to inspect.\n   * @param {Array} chrSymbols The character symbols to find.\n   * @returns {number} Returns the index of the last unmatched string symbol.\n   */\n  function charsEndIndex(strSymbols, chrSymbols) {\n    var index = strSymbols.length;\n\n    while (index-- && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}\n    return index;\n  }\n\n  /**\n   * Gets the number of `placeholder` occurrences in `array`.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} placeholder The placeholder to search for.\n   * @returns {number} Returns the placeholder count.\n   */\n  function countHolders(array, placeholder) {\n    var length = array.length,\n        result = 0;\n\n    while (length--) {\n      if (array[length] === placeholder) {\n        ++result;\n      }\n    }\n    return result;\n  }\n\n  /**\n   * Used by `_.deburr` to convert Latin-1 Supplement and Latin Extended-A\n   * letters to basic Latin letters.\n   *\n   * @private\n   * @param {string} letter The matched letter to deburr.\n   * @returns {string} Returns the deburred letter.\n   */\n  var deburrLetter = basePropertyOf(deburredLetters);\n\n  /**\n   * Used by `_.escape` to convert characters to HTML entities.\n   *\n   * @private\n   * @param {string} chr The matched character to escape.\n   * @returns {string} Returns the escaped character.\n   */\n  var escapeHtmlChar = basePropertyOf(htmlEscapes);\n\n  /**\n   * Used by `_.template` to escape characters for inclusion in compiled string literals.\n   *\n   * @private\n   * @param {string} chr The matched character to escape.\n   * @returns {string} Returns the escaped character.\n   */\n  function escapeStringChar(chr) {\n    return '\\\\' + stringEscapes[chr];\n  }\n\n  /**\n   * Gets the value at `key` of `object`.\n   *\n   * @private\n   * @param {Object} [object] The object to query.\n   * @param {string} key The key of the property to get.\n   * @returns {*} Returns the property value.\n   */\n  function getValue(object, key) {\n    return object == null ? undefined : object[key];\n  }\n\n  /**\n   * Checks if `string` contains Unicode symbols.\n   *\n   * @private\n   * @param {string} string The string to inspect.\n   * @returns {boolean} Returns `true` if a symbol is found, else `false`.\n   */\n  function hasUnicode(string) {\n    return reHasUnicode.test(string);\n  }\n\n  /**\n   * Checks if `string` contains a word composed of Unicode symbols.\n   *\n   * @private\n   * @param {string} string The string to inspect.\n   * @returns {boolean} Returns `true` if a word is found, else `false`.\n   */\n  function hasUnicodeWord(string) {\n    return reHasUnicodeWord.test(string);\n  }\n\n  /**\n   * Converts `iterator` to an array.\n   *\n   * @private\n   * @param {Object} iterator The iterator to convert.\n   * @returns {Array} Returns the converted array.\n   */\n  function iteratorToArray(iterator) {\n    var data,\n        result = [];\n\n    while (!(data = iterator.next()).done) {\n      result.push(data.value);\n    }\n    return result;\n  }\n\n  /**\n   * Converts `map` to its key-value pairs.\n   *\n   * @private\n   * @param {Object} map The map to convert.\n   * @returns {Array} Returns the key-value pairs.\n   */\n  function mapToArray(map) {\n    var index = -1,\n        result = Array(map.size);\n\n    map.forEach(function(value, key) {\n      result[++index] = [key, value];\n    });\n    return result;\n  }\n\n  /**\n   * Creates a unary function that invokes `func` with its argument transformed.\n   *\n   * @private\n   * @param {Function} func The function to wrap.\n   * @param {Function} transform The argument transform.\n   * @returns {Function} Returns the new function.\n   */\n  function overArg(func, transform) {\n    return function(arg) {\n      return func(transform(arg));\n    };\n  }\n\n  /**\n   * Replaces all `placeholder` elements in `array` with an internal placeholder\n   * and returns an array of their indexes.\n   *\n   * @private\n   * @param {Array} array The array to modify.\n   * @param {*} placeholder The placeholder to replace.\n   * @returns {Array} Returns the new array of placeholder indexes.\n   */\n  function replaceHolders(array, placeholder) {\n    var index = -1,\n        length = array.length,\n        resIndex = 0,\n        result = [];\n\n    while (++index < length) {\n      var value = array[index];\n      if (value === placeholder || value === PLACEHOLDER) {\n        array[index] = PLACEHOLDER;\n        result[resIndex++] = index;\n      }\n    }\n    return result;\n  }\n\n  /**\n   * Converts `set` to an array of its values.\n   *\n   * @private\n   * @param {Object} set The set to convert.\n   * @returns {Array} Returns the values.\n   */\n  function setToArray(set) {\n    var index = -1,\n        result = Array(set.size);\n\n    set.forEach(function(value) {\n      result[++index] = value;\n    });\n    return result;\n  }\n\n  /**\n   * Converts `set` to its value-value pairs.\n   *\n   * @private\n   * @param {Object} set The set to convert.\n   * @returns {Array} Returns the value-value pairs.\n   */\n  function setToPairs(set) {\n    var index = -1,\n        result = Array(set.size);\n\n    set.forEach(function(value) {\n      result[++index] = [value, value];\n    });\n    return result;\n  }\n\n  /**\n   * A specialized version of `_.indexOf` which performs strict equality\n   * comparisons of values, i.e. `===`.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} value The value to search for.\n   * @param {number} fromIndex The index to search from.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function strictIndexOf(array, value, fromIndex) {\n    var index = fromIndex - 1,\n        length = array.length;\n\n    while (++index < length) {\n      if (array[index] === value) {\n        return index;\n      }\n    }\n    return -1;\n  }\n\n  /**\n   * A specialized version of `_.lastIndexOf` which performs strict equality\n   * comparisons of values, i.e. `===`.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} value The value to search for.\n   * @param {number} fromIndex The index to search from.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function strictLastIndexOf(array, value, fromIndex) {\n    var index = fromIndex + 1;\n    while (index--) {\n      if (array[index] === value) {\n        return index;\n      }\n    }\n    return index;\n  }\n\n  /**\n   * Gets the number of symbols in `string`.\n   *\n   * @private\n   * @param {string} string The string to inspect.\n   * @returns {number} Returns the string size.\n   */\n  function stringSize(string) {\n    return hasUnicode(string)\n      ? unicodeSize(string)\n      : asciiSize(string);\n  }\n\n  /**\n   * Converts `string` to an array.\n   *\n   * @private\n   * @param {string} string The string to convert.\n   * @returns {Array} Returns the converted array.\n   */\n  function stringToArray(string) {\n    return hasUnicode(string)\n      ? unicodeToArray(string)\n      : asciiToArray(string);\n  }\n\n  /**\n   * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace\n   * character of `string`.\n   *\n   * @private\n   * @param {string} string The string to inspect.\n   * @returns {number} Returns the index of the last non-whitespace character.\n   */\n  function trimmedEndIndex(string) {\n    var index = string.length;\n\n    while (index-- && reWhitespace.test(string.charAt(index))) {}\n    return index;\n  }\n\n  /**\n   * Used by `_.unescape` to convert HTML entities to characters.\n   *\n   * @private\n   * @param {string} chr The matched character to unescape.\n   * @returns {string} Returns the unescaped character.\n   */\n  var unescapeHtmlChar = basePropertyOf(htmlUnescapes);\n\n  /**\n   * Gets the size of a Unicode `string`.\n   *\n   * @private\n   * @param {string} string The string inspect.\n   * @returns {number} Returns the string size.\n   */\n  function unicodeSize(string) {\n    var result = reUnicode.lastIndex = 0;\n    while (reUnicode.test(string)) {\n      ++result;\n    }\n    return result;\n  }\n\n  /**\n   * Converts a Unicode `string` to an array.\n   *\n   * @private\n   * @param {string} string The string to convert.\n   * @returns {Array} Returns the converted array.\n   */\n  function unicodeToArray(string) {\n    return string.match(reUnicode) || [];\n  }\n\n  /**\n   * Splits a Unicode `string` into an array of its words.\n   *\n   * @private\n   * @param {string} The string to inspect.\n   * @returns {Array} Returns the words of `string`.\n   */\n  function unicodeWords(string) {\n    return string.match(reUnicodeWord) || [];\n  }\n\n  /*--------------------------------------------------------------------------*/\n\n  /**\n   * Create a new pristine `lodash` function using the `context` object.\n   *\n   * @static\n   * @memberOf _\n   * @since 1.1.0\n   * @category Util\n   * @param {Object} [context=root] The context object.\n   * @returns {Function} Returns a new `lodash` function.\n   * @example\n   *\n   * _.mixin({ 'foo': _.constant('foo') });\n   *\n   * var lodash = _.runInContext();\n   * lodash.mixin({ 'bar': lodash.constant('bar') });\n   *\n   * _.isFunction(_.foo);\n   * // => true\n   * _.isFunction(_.bar);\n   * // => false\n   *\n   * lodash.isFunction(lodash.foo);\n   * // => false\n   * lodash.isFunction(lodash.bar);\n   * // => true\n   *\n   * // Create a suped-up `defer` in Node.js.\n   * var defer = _.runInContext({ 'setTimeout': setImmediate }).defer;\n   */\n  var runInContext = (function runInContext(context) {\n    context = context == null ? root : _.defaults(root.Object(), context, _.pick(root, contextProps));\n\n    /** Built-in constructor references. */\n    var Array = context.Array,\n        Date = context.Date,\n        Error = context.Error,\n        Function = context.Function,\n        Math = context.Math,\n        Object = context.Object,\n        RegExp = context.RegExp,\n        String = context.String,\n        TypeError = context.TypeError;\n\n    /** Used for built-in method references. */\n    var arrayProto = Array.prototype,\n        funcProto = Function.prototype,\n        objectProto = Object.prototype;\n\n    /** Used to detect overreaching core-js shims. */\n    var coreJsData = context['__core-js_shared__'];\n\n    /** Used to resolve the decompiled source of functions. */\n    var funcToString = funcProto.toString;\n\n    /** Used to check objects for own properties. */\n    var hasOwnProperty = objectProto.hasOwnProperty;\n\n    /** Used to generate unique IDs. */\n    var idCounter = 0;\n\n    /** Used to detect methods masquerading as native. */\n    var maskSrcKey = (function() {\n      var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n      return uid ? ('Symbol(src)_1.' + uid) : '';\n    }());\n\n    /**\n     * Used to resolve the\n     * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n     * of values.\n     */\n    var nativeObjectToString = objectProto.toString;\n\n    /** Used to infer the `Object` constructor. */\n    var objectCtorString = funcToString.call(Object);\n\n    /** Used to restore the original `_` reference in `_.noConflict`. */\n    var oldDash = root._;\n\n    /** Used to detect if a method is native. */\n    var reIsNative = RegExp('^' +\n      funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n      .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n    );\n\n    /** Built-in value references. */\n    var Buffer = moduleExports ? context.Buffer : undefined,\n        Symbol = context.Symbol,\n        Uint8Array = context.Uint8Array,\n        allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined,\n        getPrototype = overArg(Object.getPrototypeOf, Object),\n        objectCreate = Object.create,\n        propertyIsEnumerable = objectProto.propertyIsEnumerable,\n        splice = arrayProto.splice,\n        spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined,\n        symIterator = Symbol ? Symbol.iterator : undefined,\n        symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n    var defineProperty = (function() {\n      try {\n        var func = getNative(Object, 'defineProperty');\n        func({}, '', {});\n        return func;\n      } catch (e) {}\n    }());\n\n    /** Mocked built-ins. */\n    var ctxClearTimeout = context.clearTimeout !== root.clearTimeout && context.clearTimeout,\n        ctxNow = Date && Date.now !== root.Date.now && Date.now,\n        ctxSetTimeout = context.setTimeout !== root.setTimeout && context.setTimeout;\n\n    /* Built-in method references for those with the same name as other `lodash` methods. */\n    var nativeCeil = Math.ceil,\n        nativeFloor = Math.floor,\n        nativeGetSymbols = Object.getOwnPropertySymbols,\n        nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined,\n        nativeIsFinite = context.isFinite,\n        nativeJoin = arrayProto.join,\n        nativeKeys = overArg(Object.keys, Object),\n        nativeMax = Math.max,\n        nativeMin = Math.min,\n        nativeNow = Date.now,\n        nativeParseInt = context.parseInt,\n        nativeRandom = Math.random,\n        nativeReverse = arrayProto.reverse;\n\n    /* Built-in method references that are verified to be native. */\n    var DataView = getNative(context, 'DataView'),\n        Map = getNative(context, 'Map'),\n        Promise = getNative(context, 'Promise'),\n        Set = getNative(context, 'Set'),\n        WeakMap = getNative(context, 'WeakMap'),\n        nativeCreate = getNative(Object, 'create');\n\n    /** Used to store function metadata. */\n    var metaMap = WeakMap && new WeakMap;\n\n    /** Used to lookup unminified function names. */\n    var realNames = {};\n\n    /** Used to detect maps, sets, and weakmaps. */\n    var dataViewCtorString = toSource(DataView),\n        mapCtorString = toSource(Map),\n        promiseCtorString = toSource(Promise),\n        setCtorString = toSource(Set),\n        weakMapCtorString = toSource(WeakMap);\n\n    /** Used to convert symbols to primitives and strings. */\n    var symbolProto = Symbol ? Symbol.prototype : undefined,\n        symbolValueOf = symbolProto ? symbolProto.valueOf : undefined,\n        symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a `lodash` object which wraps `value` to enable implicit method\n     * chain sequences. Methods that operate on and return arrays, collections,\n     * and functions can be chained together. Methods that retrieve a single value\n     * or may return a primitive value will automatically end the chain sequence\n     * and return the unwrapped value. Otherwise, the value must be unwrapped\n     * with `_#value`.\n     *\n     * Explicit chain sequences, which must be unwrapped with `_#value`, may be\n     * enabled using `_.chain`.\n     *\n     * The execution of chained methods is lazy, that is, it's deferred until\n     * `_#value` is implicitly or explicitly called.\n     *\n     * Lazy evaluation allows several methods to support shortcut fusion.\n     * Shortcut fusion is an optimization to merge iteratee calls; this avoids\n     * the creation of intermediate arrays and can greatly reduce the number of\n     * iteratee executions. Sections of a chain sequence qualify for shortcut\n     * fusion if the section is applied to an array and iteratees accept only\n     * one argument. The heuristic for whether a section qualifies for shortcut\n     * fusion is subject to change.\n     *\n     * Chaining is supported in custom builds as long as the `_#value` method is\n     * directly or indirectly included in the build.\n     *\n     * In addition to lodash methods, wrappers have `Array` and `String` methods.\n     *\n     * The wrapper `Array` methods are:\n     * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift`\n     *\n     * The wrapper `String` methods are:\n     * `replace` and `split`\n     *\n     * The wrapper methods that support shortcut fusion are:\n     * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`,\n     * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`,\n     * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray`\n     *\n     * The chainable wrapper methods are:\n     * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`,\n     * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`,\n     * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`,\n     * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`,\n     * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`,\n     * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`,\n     * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`,\n     * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`,\n     * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`,\n     * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`,\n     * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,\n     * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`,\n     * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`,\n     * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`,\n     * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`,\n     * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`,\n     * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`,\n     * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`,\n     * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`,\n     * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`,\n     * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`,\n     * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`,\n     * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`,\n     * `zipObject`, `zipObjectDeep`, and `zipWith`\n     *\n     * The wrapper methods that are **not** chainable by default are:\n     * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,\n     * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,\n     * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,\n     * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,\n     * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,\n     * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,\n     * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,\n     * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,\n     * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,\n     * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,\n     * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,\n     * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,\n     * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,\n     * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,\n     * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`,\n     * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`,\n     * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`,\n     * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`,\n     * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`,\n     * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`,\n     * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`,\n     * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`,\n     * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`,\n     * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`,\n     * `upperFirst`, `value`, and `words`\n     *\n     * @name _\n     * @constructor\n     * @category Seq\n     * @param {*} value The value to wrap in a `lodash` instance.\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var wrapped = _([1, 2, 3]);\n     *\n     * // Returns an unwrapped value.\n     * wrapped.reduce(_.add);\n     * // => 6\n     *\n     * // Returns a wrapped value.\n     * var squares = wrapped.map(square);\n     *\n     * _.isArray(squares);\n     * // => false\n     *\n     * _.isArray(squares.value());\n     * // => true\n     */\n    function lodash(value) {\n      if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) {\n        if (value instanceof LodashWrapper) {\n          return value;\n        }\n        if (hasOwnProperty.call(value, '__wrapped__')) {\n          return wrapperClone(value);\n        }\n      }\n      return new LodashWrapper(value);\n    }\n\n    /**\n     * The base implementation of `_.create` without support for assigning\n     * properties to the created object.\n     *\n     * @private\n     * @param {Object} proto The object to inherit from.\n     * @returns {Object} Returns the new object.\n     */\n    var baseCreate = (function() {\n      function object() {}\n      return function(proto) {\n        if (!isObject(proto)) {\n          return {};\n        }\n        if (objectCreate) {\n          return objectCreate(proto);\n        }\n        object.prototype = proto;\n        var result = new object;\n        object.prototype = undefined;\n        return result;\n      };\n    }());\n\n    /**\n     * The function whose prototype chain sequence wrappers inherit from.\n     *\n     * @private\n     */\n    function baseLodash() {\n      // No operation performed.\n    }\n\n    /**\n     * The base constructor for creating `lodash` wrapper objects.\n     *\n     * @private\n     * @param {*} value The value to wrap.\n     * @param {boolean} [chainAll] Enable explicit method chain sequences.\n     */\n    function LodashWrapper(value, chainAll) {\n      this.__wrapped__ = value;\n      this.__actions__ = [];\n      this.__chain__ = !!chainAll;\n      this.__index__ = 0;\n      this.__values__ = undefined;\n    }\n\n    /**\n     * By default, the template delimiters used by lodash are like those in\n     * embedded Ruby (ERB) as well as ES2015 template strings. Change the\n     * following template settings to use alternative delimiters.\n     *\n     * @static\n     * @memberOf _\n     * @type {Object}\n     */\n    lodash.templateSettings = {\n\n      /**\n       * Used to detect `data` property values to be HTML-escaped.\n       *\n       * @memberOf _.templateSettings\n       * @type {RegExp}\n       */\n      'escape': reEscape,\n\n      /**\n       * Used to detect code to be evaluated.\n       *\n       * @memberOf _.templateSettings\n       * @type {RegExp}\n       */\n      'evaluate': reEvaluate,\n\n      /**\n       * Used to detect `data` property values to inject.\n       *\n       * @memberOf _.templateSettings\n       * @type {RegExp}\n       */\n      'interpolate': reInterpolate,\n\n      /**\n       * Used to reference the data object in the template text.\n       *\n       * @memberOf _.templateSettings\n       * @type {string}\n       */\n      'variable': '',\n\n      /**\n       * Used to import variables into the compiled template.\n       *\n       * @memberOf _.templateSettings\n       * @type {Object}\n       */\n      'imports': {\n\n        /**\n         * A reference to the `lodash` function.\n         *\n         * @memberOf _.templateSettings.imports\n         * @type {Function}\n         */\n        '_': lodash\n      }\n    };\n\n    // Ensure wrappers are instances of `baseLodash`.\n    lodash.prototype = baseLodash.prototype;\n    lodash.prototype.constructor = lodash;\n\n    LodashWrapper.prototype = baseCreate(baseLodash.prototype);\n    LodashWrapper.prototype.constructor = LodashWrapper;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.\n     *\n     * @private\n     * @constructor\n     * @param {*} value The value to wrap.\n     */\n    function LazyWrapper(value) {\n      this.__wrapped__ = value;\n      this.__actions__ = [];\n      this.__dir__ = 1;\n      this.__filtered__ = false;\n      this.__iteratees__ = [];\n      this.__takeCount__ = MAX_ARRAY_LENGTH;\n      this.__views__ = [];\n    }\n\n    /**\n     * Creates a clone of the lazy wrapper object.\n     *\n     * @private\n     * @name clone\n     * @memberOf LazyWrapper\n     * @returns {Object} Returns the cloned `LazyWrapper` object.\n     */\n    function lazyClone() {\n      var result = new LazyWrapper(this.__wrapped__);\n      result.__actions__ = copyArray(this.__actions__);\n      result.__dir__ = this.__dir__;\n      result.__filtered__ = this.__filtered__;\n      result.__iteratees__ = copyArray(this.__iteratees__);\n      result.__takeCount__ = this.__takeCount__;\n      result.__views__ = copyArray(this.__views__);\n      return result;\n    }\n\n    /**\n     * Reverses the direction of lazy iteration.\n     *\n     * @private\n     * @name reverse\n     * @memberOf LazyWrapper\n     * @returns {Object} Returns the new reversed `LazyWrapper` object.\n     */\n    function lazyReverse() {\n      if (this.__filtered__) {\n        var result = new LazyWrapper(this);\n        result.__dir__ = -1;\n        result.__filtered__ = true;\n      } else {\n        result = this.clone();\n        result.__dir__ *= -1;\n      }\n      return result;\n    }\n\n    /**\n     * Extracts the unwrapped value from its lazy wrapper.\n     *\n     * @private\n     * @name value\n     * @memberOf LazyWrapper\n     * @returns {*} Returns the unwrapped value.\n     */\n    function lazyValue() {\n      var array = this.__wrapped__.value(),\n          dir = this.__dir__,\n          isArr = isArray(array),\n          isRight = dir < 0,\n          arrLength = isArr ? array.length : 0,\n          view = getView(0, arrLength, this.__views__),\n          start = view.start,\n          end = view.end,\n          length = end - start,\n          index = isRight ? end : (start - 1),\n          iteratees = this.__iteratees__,\n          iterLength = iteratees.length,\n          resIndex = 0,\n          takeCount = nativeMin(length, this.__takeCount__);\n\n      if (!isArr || (!isRight && arrLength == length && takeCount == length)) {\n        return baseWrapperValue(array, this.__actions__);\n      }\n      var result = [];\n\n      outer:\n      while (length-- && resIndex < takeCount) {\n        index += dir;\n\n        var iterIndex = -1,\n            value = array[index];\n\n        while (++iterIndex < iterLength) {\n          var data = iteratees[iterIndex],\n              iteratee = data.iteratee,\n              type = data.type,\n              computed = iteratee(value);\n\n          if (type == LAZY_MAP_FLAG) {\n            value = computed;\n          } else if (!computed) {\n            if (type == LAZY_FILTER_FLAG) {\n              continue outer;\n            } else {\n              break outer;\n            }\n          }\n        }\n        result[resIndex++] = value;\n      }\n      return result;\n    }\n\n    // Ensure `LazyWrapper` is an instance of `baseLodash`.\n    LazyWrapper.prototype = baseCreate(baseLodash.prototype);\n    LazyWrapper.prototype.constructor = LazyWrapper;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a hash object.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [entries] The key-value pairs to cache.\n     */\n    function Hash(entries) {\n      var index = -1,\n          length = entries == null ? 0 : entries.length;\n\n      this.clear();\n      while (++index < length) {\n        var entry = entries[index];\n        this.set(entry[0], entry[1]);\n      }\n    }\n\n    /**\n     * Removes all key-value entries from the hash.\n     *\n     * @private\n     * @name clear\n     * @memberOf Hash\n     */\n    function hashClear() {\n      this.__data__ = nativeCreate ? nativeCreate(null) : {};\n      this.size = 0;\n    }\n\n    /**\n     * Removes `key` and its value from the hash.\n     *\n     * @private\n     * @name delete\n     * @memberOf Hash\n     * @param {Object} hash The hash to modify.\n     * @param {string} key The key of the value to remove.\n     * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n     */\n    function hashDelete(key) {\n      var result = this.has(key) && delete this.__data__[key];\n      this.size -= result ? 1 : 0;\n      return result;\n    }\n\n    /**\n     * Gets the hash value for `key`.\n     *\n     * @private\n     * @name get\n     * @memberOf Hash\n     * @param {string} key The key of the value to get.\n     * @returns {*} Returns the entry value.\n     */\n    function hashGet(key) {\n      var data = this.__data__;\n      if (nativeCreate) {\n        var result = data[key];\n        return result === HASH_UNDEFINED ? undefined : result;\n      }\n      return hasOwnProperty.call(data, key) ? data[key] : undefined;\n    }\n\n    /**\n     * Checks if a hash value for `key` exists.\n     *\n     * @private\n     * @name has\n     * @memberOf Hash\n     * @param {string} key The key of the entry to check.\n     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n     */\n    function hashHas(key) {\n      var data = this.__data__;\n      return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n    }\n\n    /**\n     * Sets the hash `key` to `value`.\n     *\n     * @private\n     * @name set\n     * @memberOf Hash\n     * @param {string} key The key of the value to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns the hash instance.\n     */\n    function hashSet(key, value) {\n      var data = this.__data__;\n      this.size += this.has(key) ? 0 : 1;\n      data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n      return this;\n    }\n\n    // Add methods to `Hash`.\n    Hash.prototype.clear = hashClear;\n    Hash.prototype['delete'] = hashDelete;\n    Hash.prototype.get = hashGet;\n    Hash.prototype.has = hashHas;\n    Hash.prototype.set = hashSet;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates an list cache object.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [entries] The key-value pairs to cache.\n     */\n    function ListCache(entries) {\n      var index = -1,\n          length = entries == null ? 0 : entries.length;\n\n      this.clear();\n      while (++index < length) {\n        var entry = entries[index];\n        this.set(entry[0], entry[1]);\n      }\n    }\n\n    /**\n     * Removes all key-value entries from the list cache.\n     *\n     * @private\n     * @name clear\n     * @memberOf ListCache\n     */\n    function listCacheClear() {\n      this.__data__ = [];\n      this.size = 0;\n    }\n\n    /**\n     * Removes `key` and its value from the list cache.\n     *\n     * @private\n     * @name delete\n     * @memberOf ListCache\n     * @param {string} key The key of the value to remove.\n     * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n     */\n    function listCacheDelete(key) {\n      var data = this.__data__,\n          index = assocIndexOf(data, key);\n\n      if (index < 0) {\n        return false;\n      }\n      var lastIndex = data.length - 1;\n      if (index == lastIndex) {\n        data.pop();\n      } else {\n        splice.call(data, index, 1);\n      }\n      --this.size;\n      return true;\n    }\n\n    /**\n     * Gets the list cache value for `key`.\n     *\n     * @private\n     * @name get\n     * @memberOf ListCache\n     * @param {string} key The key of the value to get.\n     * @returns {*} Returns the entry value.\n     */\n    function listCacheGet(key) {\n      var data = this.__data__,\n          index = assocIndexOf(data, key);\n\n      return index < 0 ? undefined : data[index][1];\n    }\n\n    /**\n     * Checks if a list cache value for `key` exists.\n     *\n     * @private\n     * @name has\n     * @memberOf ListCache\n     * @param {string} key The key of the entry to check.\n     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n     */\n    function listCacheHas(key) {\n      return assocIndexOf(this.__data__, key) > -1;\n    }\n\n    /**\n     * Sets the list cache `key` to `value`.\n     *\n     * @private\n     * @name set\n     * @memberOf ListCache\n     * @param {string} key The key of the value to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns the list cache instance.\n     */\n    function listCacheSet(key, value) {\n      var data = this.__data__,\n          index = assocIndexOf(data, key);\n\n      if (index < 0) {\n        ++this.size;\n        data.push([key, value]);\n      } else {\n        data[index][1] = value;\n      }\n      return this;\n    }\n\n    // Add methods to `ListCache`.\n    ListCache.prototype.clear = listCacheClear;\n    ListCache.prototype['delete'] = listCacheDelete;\n    ListCache.prototype.get = listCacheGet;\n    ListCache.prototype.has = listCacheHas;\n    ListCache.prototype.set = listCacheSet;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a map cache object to store key-value pairs.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [entries] The key-value pairs to cache.\n     */\n    function MapCache(entries) {\n      var index = -1,\n          length = entries == null ? 0 : entries.length;\n\n      this.clear();\n      while (++index < length) {\n        var entry = entries[index];\n        this.set(entry[0], entry[1]);\n      }\n    }\n\n    /**\n     * Removes all key-value entries from the map.\n     *\n     * @private\n     * @name clear\n     * @memberOf MapCache\n     */\n    function mapCacheClear() {\n      this.size = 0;\n      this.__data__ = {\n        'hash': new Hash,\n        'map': new (Map || ListCache),\n        'string': new Hash\n      };\n    }\n\n    /**\n     * Removes `key` and its value from the map.\n     *\n     * @private\n     * @name delete\n     * @memberOf MapCache\n     * @param {string} key The key of the value to remove.\n     * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n     */\n    function mapCacheDelete(key) {\n      var result = getMapData(this, key)['delete'](key);\n      this.size -= result ? 1 : 0;\n      return result;\n    }\n\n    /**\n     * Gets the map value for `key`.\n     *\n     * @private\n     * @name get\n     * @memberOf MapCache\n     * @param {string} key The key of the value to get.\n     * @returns {*} Returns the entry value.\n     */\n    function mapCacheGet(key) {\n      return getMapData(this, key).get(key);\n    }\n\n    /**\n     * Checks if a map value for `key` exists.\n     *\n     * @private\n     * @name has\n     * @memberOf MapCache\n     * @param {string} key The key of the entry to check.\n     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n     */\n    function mapCacheHas(key) {\n      return getMapData(this, key).has(key);\n    }\n\n    /**\n     * Sets the map `key` to `value`.\n     *\n     * @private\n     * @name set\n     * @memberOf MapCache\n     * @param {string} key The key of the value to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns the map cache instance.\n     */\n    function mapCacheSet(key, value) {\n      var data = getMapData(this, key),\n          size = data.size;\n\n      data.set(key, value);\n      this.size += data.size == size ? 0 : 1;\n      return this;\n    }\n\n    // Add methods to `MapCache`.\n    MapCache.prototype.clear = mapCacheClear;\n    MapCache.prototype['delete'] = mapCacheDelete;\n    MapCache.prototype.get = mapCacheGet;\n    MapCache.prototype.has = mapCacheHas;\n    MapCache.prototype.set = mapCacheSet;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     *\n     * Creates an array cache object to store unique values.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [values] The values to cache.\n     */\n    function SetCache(values) {\n      var index = -1,\n          length = values == null ? 0 : values.length;\n\n      this.__data__ = new MapCache;\n      while (++index < length) {\n        this.add(values[index]);\n      }\n    }\n\n    /**\n     * Adds `value` to the array cache.\n     *\n     * @private\n     * @name add\n     * @memberOf SetCache\n     * @alias push\n     * @param {*} value The value to cache.\n     * @returns {Object} Returns the cache instance.\n     */\n    function setCacheAdd(value) {\n      this.__data__.set(value, HASH_UNDEFINED);\n      return this;\n    }\n\n    /**\n     * Checks if `value` is in the array cache.\n     *\n     * @private\n     * @name has\n     * @memberOf SetCache\n     * @param {*} value The value to search for.\n     * @returns {number} Returns `true` if `value` is found, else `false`.\n     */\n    function setCacheHas(value) {\n      return this.__data__.has(value);\n    }\n\n    // Add methods to `SetCache`.\n    SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\n    SetCache.prototype.has = setCacheHas;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a stack cache object to store key-value pairs.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [entries] The key-value pairs to cache.\n     */\n    function Stack(entries) {\n      var data = this.__data__ = new ListCache(entries);\n      this.size = data.size;\n    }\n\n    /**\n     * Removes all key-value entries from the stack.\n     *\n     * @private\n     * @name clear\n     * @memberOf Stack\n     */\n    function stackClear() {\n      this.__data__ = new ListCache;\n      this.size = 0;\n    }\n\n    /**\n     * Removes `key` and its value from the stack.\n     *\n     * @private\n     * @name delete\n     * @memberOf Stack\n     * @param {string} key The key of the value to remove.\n     * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n     */\n    function stackDelete(key) {\n      var data = this.__data__,\n          result = data['delete'](key);\n\n      this.size = data.size;\n      return result;\n    }\n\n    /**\n     * Gets the stack value for `key`.\n     *\n     * @private\n     * @name get\n     * @memberOf Stack\n     * @param {string} key The key of the value to get.\n     * @returns {*} Returns the entry value.\n     */\n    function stackGet(key) {\n      return this.__data__.get(key);\n    }\n\n    /**\n     * Checks if a stack value for `key` exists.\n     *\n     * @private\n     * @name has\n     * @memberOf Stack\n     * @param {string} key The key of the entry to check.\n     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n     */\n    function stackHas(key) {\n      return this.__data__.has(key);\n    }\n\n    /**\n     * Sets the stack `key` to `value`.\n     *\n     * @private\n     * @name set\n     * @memberOf Stack\n     * @param {string} key The key of the value to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns the stack cache instance.\n     */\n    function stackSet(key, value) {\n      var data = this.__data__;\n      if (data instanceof ListCache) {\n        var pairs = data.__data__;\n        if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n          pairs.push([key, value]);\n          this.size = ++data.size;\n          return this;\n        }\n        data = this.__data__ = new MapCache(pairs);\n      }\n      data.set(key, value);\n      this.size = data.size;\n      return this;\n    }\n\n    // Add methods to `Stack`.\n    Stack.prototype.clear = stackClear;\n    Stack.prototype['delete'] = stackDelete;\n    Stack.prototype.get = stackGet;\n    Stack.prototype.has = stackHas;\n    Stack.prototype.set = stackSet;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates an array of the enumerable property names of the array-like `value`.\n     *\n     * @private\n     * @param {*} value The value to query.\n     * @param {boolean} inherited Specify returning inherited property names.\n     * @returns {Array} Returns the array of property names.\n     */\n    function arrayLikeKeys(value, inherited) {\n      var isArr = isArray(value),\n          isArg = !isArr && isArguments(value),\n          isBuff = !isArr && !isArg && isBuffer(value),\n          isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n          skipIndexes = isArr || isArg || isBuff || isType,\n          result = skipIndexes ? baseTimes(value.length, String) : [],\n          length = result.length;\n\n      for (var key in value) {\n        if ((inherited || hasOwnProperty.call(value, key)) &&\n            !(skipIndexes && (\n               // Safari 9 has enumerable `arguments.length` in strict mode.\n               key == 'length' ||\n               // Node.js 0.10 has enumerable non-index properties on buffers.\n               (isBuff && (key == 'offset' || key == 'parent')) ||\n               // PhantomJS 2 has enumerable non-index properties on typed arrays.\n               (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\n               // Skip index properties.\n               isIndex(key, length)\n            ))) {\n          result.push(key);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * A specialized version of `_.sample` for arrays.\n     *\n     * @private\n     * @param {Array} array The array to sample.\n     * @returns {*} Returns the random element.\n     */\n    function arraySample(array) {\n      var length = array.length;\n      return length ? array[baseRandom(0, length - 1)] : undefined;\n    }\n\n    /**\n     * A specialized version of `_.sampleSize` for arrays.\n     *\n     * @private\n     * @param {Array} array The array to sample.\n     * @param {number} n The number of elements to sample.\n     * @returns {Array} Returns the random elements.\n     */\n    function arraySampleSize(array, n) {\n      return shuffleSelf(copyArray(array), baseClamp(n, 0, array.length));\n    }\n\n    /**\n     * A specialized version of `_.shuffle` for arrays.\n     *\n     * @private\n     * @param {Array} array The array to shuffle.\n     * @returns {Array} Returns the new shuffled array.\n     */\n    function arrayShuffle(array) {\n      return shuffleSelf(copyArray(array));\n    }\n\n    /**\n     * This function is like `assignValue` except that it doesn't assign\n     * `undefined` values.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {string} key The key of the property to assign.\n     * @param {*} value The value to assign.\n     */\n    function assignMergeValue(object, key, value) {\n      if ((value !== undefined && !eq(object[key], value)) ||\n          (value === undefined && !(key in object))) {\n        baseAssignValue(object, key, value);\n      }\n    }\n\n    /**\n     * Assigns `value` to `key` of `object` if the existing value is not equivalent\n     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {string} key The key of the property to assign.\n     * @param {*} value The value to assign.\n     */\n    function assignValue(object, key, value) {\n      var objValue = object[key];\n      if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\n          (value === undefined && !(key in object))) {\n        baseAssignValue(object, key, value);\n      }\n    }\n\n    /**\n     * Gets the index at which the `key` is found in `array` of key-value pairs.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {*} key The key to search for.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     */\n    function assocIndexOf(array, key) {\n      var length = array.length;\n      while (length--) {\n        if (eq(array[length][0], key)) {\n          return length;\n        }\n      }\n      return -1;\n    }\n\n    /**\n     * Aggregates elements of `collection` on `accumulator` with keys transformed\n     * by `iteratee` and values set by `setter`.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} setter The function to set `accumulator` values.\n     * @param {Function} iteratee The iteratee to transform keys.\n     * @param {Object} accumulator The initial aggregated object.\n     * @returns {Function} Returns `accumulator`.\n     */\n    function baseAggregator(collection, setter, iteratee, accumulator) {\n      baseEach(collection, function(value, key, collection) {\n        setter(accumulator, value, iteratee(value), collection);\n      });\n      return accumulator;\n    }\n\n    /**\n     * The base implementation of `_.assign` without support for multiple sources\n     * or `customizer` functions.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @returns {Object} Returns `object`.\n     */\n    function baseAssign(object, source) {\n      return object && copyObject(source, keys(source), object);\n    }\n\n    /**\n     * The base implementation of `_.assignIn` without support for multiple sources\n     * or `customizer` functions.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @returns {Object} Returns `object`.\n     */\n    function baseAssignIn(object, source) {\n      return object && copyObject(source, keysIn(source), object);\n    }\n\n    /**\n     * The base implementation of `assignValue` and `assignMergeValue` without\n     * value checks.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {string} key The key of the property to assign.\n     * @param {*} value The value to assign.\n     */\n    function baseAssignValue(object, key, value) {\n      if (key == '__proto__' && defineProperty) {\n        defineProperty(object, key, {\n          'configurable': true,\n          'enumerable': true,\n          'value': value,\n          'writable': true\n        });\n      } else {\n        object[key] = value;\n      }\n    }\n\n    /**\n     * The base implementation of `_.at` without support for individual paths.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {string[]} paths The property paths to pick.\n     * @returns {Array} Returns the picked elements.\n     */\n    function baseAt(object, paths) {\n      var index = -1,\n          length = paths.length,\n          result = Array(length),\n          skip = object == null;\n\n      while (++index < length) {\n        result[index] = skip ? undefined : get(object, paths[index]);\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.clamp` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {number} number The number to clamp.\n     * @param {number} [lower] The lower bound.\n     * @param {number} upper The upper bound.\n     * @returns {number} Returns the clamped number.\n     */\n    function baseClamp(number, lower, upper) {\n      if (number === number) {\n        if (upper !== undefined) {\n          number = number <= upper ? number : upper;\n        }\n        if (lower !== undefined) {\n          number = number >= lower ? number : lower;\n        }\n      }\n      return number;\n    }\n\n    /**\n     * The base implementation of `_.clone` and `_.cloneDeep` which tracks\n     * traversed objects.\n     *\n     * @private\n     * @param {*} value The value to clone.\n     * @param {boolean} bitmask The bitmask flags.\n     *  1 - Deep clone\n     *  2 - Flatten inherited properties\n     *  4 - Clone symbols\n     * @param {Function} [customizer] The function to customize cloning.\n     * @param {string} [key] The key of `value`.\n     * @param {Object} [object] The parent object of `value`.\n     * @param {Object} [stack] Tracks traversed objects and their clone counterparts.\n     * @returns {*} Returns the cloned value.\n     */\n    function baseClone(value, bitmask, customizer, key, object, stack) {\n      var result,\n          isDeep = bitmask & CLONE_DEEP_FLAG,\n          isFlat = bitmask & CLONE_FLAT_FLAG,\n          isFull = bitmask & CLONE_SYMBOLS_FLAG;\n\n      if (customizer) {\n        result = object ? customizer(value, key, object, stack) : customizer(value);\n      }\n      if (result !== undefined) {\n        return result;\n      }\n      if (!isObject(value)) {\n        return value;\n      }\n      var isArr = isArray(value);\n      if (isArr) {\n        result = initCloneArray(value);\n        if (!isDeep) {\n          return copyArray(value, result);\n        }\n      } else {\n        var tag = getTag(value),\n            isFunc = tag == funcTag || tag == genTag;\n\n        if (isBuffer(value)) {\n          return cloneBuffer(value, isDeep);\n        }\n        if (tag == objectTag || tag == argsTag || (isFunc && !object)) {\n          result = (isFlat || isFunc) ? {} : initCloneObject(value);\n          if (!isDeep) {\n            return isFlat\n              ? copySymbolsIn(value, baseAssignIn(result, value))\n              : copySymbols(value, baseAssign(result, value));\n          }\n        } else {\n          if (!cloneableTags[tag]) {\n            return object ? value : {};\n          }\n          result = initCloneByTag(value, tag, isDeep);\n        }\n      }\n      // Check for circular references and return its corresponding clone.\n      stack || (stack = new Stack);\n      var stacked = stack.get(value);\n      if (stacked) {\n        return stacked;\n      }\n      stack.set(value, result);\n\n      if (isSet(value)) {\n        value.forEach(function(subValue) {\n          result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));\n        });\n      } else if (isMap(value)) {\n        value.forEach(function(subValue, key) {\n          result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack));\n        });\n      }\n\n      var keysFunc = isFull\n        ? (isFlat ? getAllKeysIn : getAllKeys)\n        : (isFlat ? keysIn : keys);\n\n      var props = isArr ? undefined : keysFunc(value);\n      arrayEach(props || value, function(subValue, key) {\n        if (props) {\n          key = subValue;\n          subValue = value[key];\n        }\n        // Recursively populate clone (susceptible to call stack limits).\n        assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));\n      });\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.conforms` which doesn't clone `source`.\n     *\n     * @private\n     * @param {Object} source The object of property predicates to conform to.\n     * @returns {Function} Returns the new spec function.\n     */\n    function baseConforms(source) {\n      var props = keys(source);\n      return function(object) {\n        return baseConformsTo(object, source, props);\n      };\n    }\n\n    /**\n     * The base implementation of `_.conformsTo` which accepts `props` to check.\n     *\n     * @private\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property predicates to conform to.\n     * @returns {boolean} Returns `true` if `object` conforms, else `false`.\n     */\n    function baseConformsTo(object, source, props) {\n      var length = props.length;\n      if (object == null) {\n        return !length;\n      }\n      object = Object(object);\n      while (length--) {\n        var key = props[length],\n            predicate = source[key],\n            value = object[key];\n\n        if ((value === undefined && !(key in object)) || !predicate(value)) {\n          return false;\n        }\n      }\n      return true;\n    }\n\n    /**\n     * The base implementation of `_.delay` and `_.defer` which accepts `args`\n     * to provide to `func`.\n     *\n     * @private\n     * @param {Function} func The function to delay.\n     * @param {number} wait The number of milliseconds to delay invocation.\n     * @param {Array} args The arguments to provide to `func`.\n     * @returns {number|Object} Returns the timer id or timeout object.\n     */\n    function baseDelay(func, wait, args) {\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      return setTimeout(function() { func.apply(undefined, args); }, wait);\n    }\n\n    /**\n     * The base implementation of methods like `_.difference` without support\n     * for excluding multiple arrays or iteratee shorthands.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {Array} values The values to exclude.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of filtered values.\n     */\n    function baseDifference(array, values, iteratee, comparator) {\n      var index = -1,\n          includes = arrayIncludes,\n          isCommon = true,\n          length = array.length,\n          result = [],\n          valuesLength = values.length;\n\n      if (!length) {\n        return result;\n      }\n      if (iteratee) {\n        values = arrayMap(values, baseUnary(iteratee));\n      }\n      if (comparator) {\n        includes = arrayIncludesWith;\n        isCommon = false;\n      }\n      else if (values.length >= LARGE_ARRAY_SIZE) {\n        includes = cacheHas;\n        isCommon = false;\n        values = new SetCache(values);\n      }\n      outer:\n      while (++index < length) {\n        var value = array[index],\n            computed = iteratee == null ? value : iteratee(value);\n\n        value = (comparator || value !== 0) ? value : 0;\n        if (isCommon && computed === computed) {\n          var valuesIndex = valuesLength;\n          while (valuesIndex--) {\n            if (values[valuesIndex] === computed) {\n              continue outer;\n            }\n          }\n          result.push(value);\n        }\n        else if (!includes(values, computed, comparator)) {\n          result.push(value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.forEach` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Array|Object} Returns `collection`.\n     */\n    var baseEach = createBaseEach(baseForOwn);\n\n    /**\n     * The base implementation of `_.forEachRight` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Array|Object} Returns `collection`.\n     */\n    var baseEachRight = createBaseEach(baseForOwnRight, true);\n\n    /**\n     * The base implementation of `_.every` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} predicate The function invoked per iteration.\n     * @returns {boolean} Returns `true` if all elements pass the predicate check,\n     *  else `false`\n     */\n    function baseEvery(collection, predicate) {\n      var result = true;\n      baseEach(collection, function(value, index, collection) {\n        result = !!predicate(value, index, collection);\n        return result;\n      });\n      return result;\n    }\n\n    /**\n     * The base implementation of methods like `_.max` and `_.min` which accepts a\n     * `comparator` to determine the extremum value.\n     *\n     * @private\n     * @param {Array} array The array to iterate over.\n     * @param {Function} iteratee The iteratee invoked per iteration.\n     * @param {Function} comparator The comparator used to compare values.\n     * @returns {*} Returns the extremum value.\n     */\n    function baseExtremum(array, iteratee, comparator) {\n      var index = -1,\n          length = array.length;\n\n      while (++index < length) {\n        var value = array[index],\n            current = iteratee(value);\n\n        if (current != null && (computed === undefined\n              ? (current === current && !isSymbol(current))\n              : comparator(current, computed)\n            )) {\n          var computed = current,\n              result = value;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.fill` without an iteratee call guard.\n     *\n     * @private\n     * @param {Array} array The array to fill.\n     * @param {*} value The value to fill `array` with.\n     * @param {number} [start=0] The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns `array`.\n     */\n    function baseFill(array, value, start, end) {\n      var length = array.length;\n\n      start = toInteger(start);\n      if (start < 0) {\n        start = -start > length ? 0 : (length + start);\n      }\n      end = (end === undefined || end > length) ? length : toInteger(end);\n      if (end < 0) {\n        end += length;\n      }\n      end = start > end ? 0 : toLength(end);\n      while (start < end) {\n        array[start++] = value;\n      }\n      return array;\n    }\n\n    /**\n     * The base implementation of `_.filter` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} predicate The function invoked per iteration.\n     * @returns {Array} Returns the new filtered array.\n     */\n    function baseFilter(collection, predicate) {\n      var result = [];\n      baseEach(collection, function(value, index, collection) {\n        if (predicate(value, index, collection)) {\n          result.push(value);\n        }\n      });\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.flatten` with support for restricting flattening.\n     *\n     * @private\n     * @param {Array} array The array to flatten.\n     * @param {number} depth The maximum recursion depth.\n     * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.\n     * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.\n     * @param {Array} [result=[]] The initial result value.\n     * @returns {Array} Returns the new flattened array.\n     */\n    function baseFlatten(array, depth, predicate, isStrict, result) {\n      var index = -1,\n          length = array.length;\n\n      predicate || (predicate = isFlattenable);\n      result || (result = []);\n\n      while (++index < length) {\n        var value = array[index];\n        if (depth > 0 && predicate(value)) {\n          if (depth > 1) {\n            // Recursively flatten arrays (susceptible to call stack limits).\n            baseFlatten(value, depth - 1, predicate, isStrict, result);\n          } else {\n            arrayPush(result, value);\n          }\n        } else if (!isStrict) {\n          result[result.length] = value;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `baseForOwn` which iterates over `object`\n     * properties returned by `keysFunc` and invokes `iteratee` for each property.\n     * Iteratee functions may exit iteration early by explicitly returning `false`.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @param {Function} keysFunc The function to get the keys of `object`.\n     * @returns {Object} Returns `object`.\n     */\n    var baseFor = createBaseFor();\n\n    /**\n     * This function is like `baseFor` except that it iterates over properties\n     * in the opposite order.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @param {Function} keysFunc The function to get the keys of `object`.\n     * @returns {Object} Returns `object`.\n     */\n    var baseForRight = createBaseFor(true);\n\n    /**\n     * The base implementation of `_.forOwn` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     */\n    function baseForOwn(object, iteratee) {\n      return object && baseFor(object, iteratee, keys);\n    }\n\n    /**\n     * The base implementation of `_.forOwnRight` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     */\n    function baseForOwnRight(object, iteratee) {\n      return object && baseForRight(object, iteratee, keys);\n    }\n\n    /**\n     * The base implementation of `_.functions` which creates an array of\n     * `object` function property names filtered from `props`.\n     *\n     * @private\n     * @param {Object} object The object to inspect.\n     * @param {Array} props The property names to filter.\n     * @returns {Array} Returns the function names.\n     */\n    function baseFunctions(object, props) {\n      return arrayFilter(props, function(key) {\n        return isFunction(object[key]);\n      });\n    }\n\n    /**\n     * The base implementation of `_.get` without support for default values.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the property to get.\n     * @returns {*} Returns the resolved value.\n     */\n    function baseGet(object, path) {\n      path = castPath(path, object);\n\n      var index = 0,\n          length = path.length;\n\n      while (object != null && index < length) {\n        object = object[toKey(path[index++])];\n      }\n      return (index && index == length) ? object : undefined;\n    }\n\n    /**\n     * The base implementation of `getAllKeys` and `getAllKeysIn` which uses\n     * `keysFunc` and `symbolsFunc` to get the enumerable property names and\n     * symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Function} keysFunc The function to get the keys of `object`.\n     * @param {Function} symbolsFunc The function to get the symbols of `object`.\n     * @returns {Array} Returns the array of property names and symbols.\n     */\n    function baseGetAllKeys(object, keysFunc, symbolsFunc) {\n      var result = keysFunc(object);\n      return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\n    }\n\n    /**\n     * The base implementation of `getTag` without fallbacks for buggy environments.\n     *\n     * @private\n     * @param {*} value The value to query.\n     * @returns {string} Returns the `toStringTag`.\n     */\n    function baseGetTag(value) {\n      if (value == null) {\n        return value === undefined ? undefinedTag : nullTag;\n      }\n      return (symToStringTag && symToStringTag in Object(value))\n        ? getRawTag(value)\n        : objectToString(value);\n    }\n\n    /**\n     * The base implementation of `_.gt` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is greater than `other`,\n     *  else `false`.\n     */\n    function baseGt(value, other) {\n      return value > other;\n    }\n\n    /**\n     * The base implementation of `_.has` without support for deep paths.\n     *\n     * @private\n     * @param {Object} [object] The object to query.\n     * @param {Array|string} key The key to check.\n     * @returns {boolean} Returns `true` if `key` exists, else `false`.\n     */\n    function baseHas(object, key) {\n      return object != null && hasOwnProperty.call(object, key);\n    }\n\n    /**\n     * The base implementation of `_.hasIn` without support for deep paths.\n     *\n     * @private\n     * @param {Object} [object] The object to query.\n     * @param {Array|string} key The key to check.\n     * @returns {boolean} Returns `true` if `key` exists, else `false`.\n     */\n    function baseHasIn(object, key) {\n      return object != null && key in Object(object);\n    }\n\n    /**\n     * The base implementation of `_.inRange` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {number} number The number to check.\n     * @param {number} start The start of the range.\n     * @param {number} end The end of the range.\n     * @returns {boolean} Returns `true` if `number` is in the range, else `false`.\n     */\n    function baseInRange(number, start, end) {\n      return number >= nativeMin(start, end) && number < nativeMax(start, end);\n    }\n\n    /**\n     * The base implementation of methods like `_.intersection`, without support\n     * for iteratee shorthands, that accepts an array of arrays to inspect.\n     *\n     * @private\n     * @param {Array} arrays The arrays to inspect.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of shared values.\n     */\n    function baseIntersection(arrays, iteratee, comparator) {\n      var includes = comparator ? arrayIncludesWith : arrayIncludes,\n          length = arrays[0].length,\n          othLength = arrays.length,\n          othIndex = othLength,\n          caches = Array(othLength),\n          maxLength = Infinity,\n          result = [];\n\n      while (othIndex--) {\n        var array = arrays[othIndex];\n        if (othIndex && iteratee) {\n          array = arrayMap(array, baseUnary(iteratee));\n        }\n        maxLength = nativeMin(array.length, maxLength);\n        caches[othIndex] = !comparator && (iteratee || (length >= 120 && array.length >= 120))\n          ? new SetCache(othIndex && array)\n          : undefined;\n      }\n      array = arrays[0];\n\n      var index = -1,\n          seen = caches[0];\n\n      outer:\n      while (++index < length && result.length < maxLength) {\n        var value = array[index],\n            computed = iteratee ? iteratee(value) : value;\n\n        value = (comparator || value !== 0) ? value : 0;\n        if (!(seen\n              ? cacheHas(seen, computed)\n              : includes(result, computed, comparator)\n            )) {\n          othIndex = othLength;\n          while (--othIndex) {\n            var cache = caches[othIndex];\n            if (!(cache\n                  ? cacheHas(cache, computed)\n                  : includes(arrays[othIndex], computed, comparator))\n                ) {\n              continue outer;\n            }\n          }\n          if (seen) {\n            seen.push(computed);\n          }\n          result.push(value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.invert` and `_.invertBy` which inverts\n     * `object` with values transformed by `iteratee` and set by `setter`.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} setter The function to set `accumulator` values.\n     * @param {Function} iteratee The iteratee to transform values.\n     * @param {Object} accumulator The initial inverted object.\n     * @returns {Function} Returns `accumulator`.\n     */\n    function baseInverter(object, setter, iteratee, accumulator) {\n      baseForOwn(object, function(value, key, object) {\n        setter(accumulator, iteratee(value), key, object);\n      });\n      return accumulator;\n    }\n\n    /**\n     * The base implementation of `_.invoke` without support for individual\n     * method arguments.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the method to invoke.\n     * @param {Array} args The arguments to invoke the method with.\n     * @returns {*} Returns the result of the invoked method.\n     */\n    function baseInvoke(object, path, args) {\n      path = castPath(path, object);\n      object = parent(object, path);\n      var func = object == null ? object : object[toKey(last(path))];\n      return func == null ? undefined : apply(func, object, args);\n    }\n\n    /**\n     * The base implementation of `_.isArguments`.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n     */\n    function baseIsArguments(value) {\n      return isObjectLike(value) && baseGetTag(value) == argsTag;\n    }\n\n    /**\n     * The base implementation of `_.isArrayBuffer` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.\n     */\n    function baseIsArrayBuffer(value) {\n      return isObjectLike(value) && baseGetTag(value) == arrayBufferTag;\n    }\n\n    /**\n     * The base implementation of `_.isDate` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a date object, else `false`.\n     */\n    function baseIsDate(value) {\n      return isObjectLike(value) && baseGetTag(value) == dateTag;\n    }\n\n    /**\n     * The base implementation of `_.isEqual` which supports partial comparisons\n     * and tracks traversed objects.\n     *\n     * @private\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @param {boolean} bitmask The bitmask flags.\n     *  1 - Unordered comparison\n     *  2 - Partial comparison\n     * @param {Function} [customizer] The function to customize comparisons.\n     * @param {Object} [stack] Tracks traversed `value` and `other` objects.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     */\n    function baseIsEqual(value, other, bitmask, customizer, stack) {\n      if (value === other) {\n        return true;\n      }\n      if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {\n        return value !== value && other !== other;\n      }\n      return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);\n    }\n\n    /**\n     * A specialized version of `baseIsEqual` for arrays and objects which performs\n     * deep comparisons and tracks traversed objects enabling objects with circular\n     * references to be compared.\n     *\n     * @private\n     * @param {Object} object The object to compare.\n     * @param {Object} other The other object to compare.\n     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n     * @param {Function} customizer The function to customize comparisons.\n     * @param {Function} equalFunc The function to determine equivalents of values.\n     * @param {Object} [stack] Tracks traversed `object` and `other` objects.\n     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n     */\n    function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {\n      var objIsArr = isArray(object),\n          othIsArr = isArray(other),\n          objTag = objIsArr ? arrayTag : getTag(object),\n          othTag = othIsArr ? arrayTag : getTag(other);\n\n      objTag = objTag == argsTag ? objectTag : objTag;\n      othTag = othTag == argsTag ? objectTag : othTag;\n\n      var objIsObj = objTag == objectTag,\n          othIsObj = othTag == objectTag,\n          isSameTag = objTag == othTag;\n\n      if (isSameTag && isBuffer(object)) {\n        if (!isBuffer(other)) {\n          return false;\n        }\n        objIsArr = true;\n        objIsObj = false;\n      }\n      if (isSameTag && !objIsObj) {\n        stack || (stack = new Stack);\n        return (objIsArr || isTypedArray(object))\n          ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)\n          : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);\n      }\n      if (!(bitmask & COMPARE_PARTIAL_FLAG)) {\n        var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n            othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n        if (objIsWrapped || othIsWrapped) {\n          var objUnwrapped = objIsWrapped ? object.value() : object,\n              othUnwrapped = othIsWrapped ? other.value() : other;\n\n          stack || (stack = new Stack);\n          return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);\n        }\n      }\n      if (!isSameTag) {\n        return false;\n      }\n      stack || (stack = new Stack);\n      return equalObjects(object, other, bitmask, customizer, equalFunc, stack);\n    }\n\n    /**\n     * The base implementation of `_.isMap` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n     */\n    function baseIsMap(value) {\n      return isObjectLike(value) && getTag(value) == mapTag;\n    }\n\n    /**\n     * The base implementation of `_.isMatch` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property values to match.\n     * @param {Array} matchData The property names, values, and compare flags to match.\n     * @param {Function} [customizer] The function to customize comparisons.\n     * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n     */\n    function baseIsMatch(object, source, matchData, customizer) {\n      var index = matchData.length,\n          length = index,\n          noCustomizer = !customizer;\n\n      if (object == null) {\n        return !length;\n      }\n      object = Object(object);\n      while (index--) {\n        var data = matchData[index];\n        if ((noCustomizer && data[2])\n              ? data[1] !== object[data[0]]\n              : !(data[0] in object)\n            ) {\n          return false;\n        }\n      }\n      while (++index < length) {\n        data = matchData[index];\n        var key = data[0],\n            objValue = object[key],\n            srcValue = data[1];\n\n        if (noCustomizer && data[2]) {\n          if (objValue === undefined && !(key in object)) {\n            return false;\n          }\n        } else {\n          var stack = new Stack;\n          if (customizer) {\n            var result = customizer(objValue, srcValue, key, object, source, stack);\n          }\n          if (!(result === undefined\n                ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack)\n                : result\n              )) {\n            return false;\n          }\n        }\n      }\n      return true;\n    }\n\n    /**\n     * The base implementation of `_.isNative` without bad shim checks.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a native function,\n     *  else `false`.\n     */\n    function baseIsNative(value) {\n      if (!isObject(value) || isMasked(value)) {\n        return false;\n      }\n      var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n      return pattern.test(toSource(value));\n    }\n\n    /**\n     * The base implementation of `_.isRegExp` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\n     */\n    function baseIsRegExp(value) {\n      return isObjectLike(value) && baseGetTag(value) == regexpTag;\n    }\n\n    /**\n     * The base implementation of `_.isSet` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n     */\n    function baseIsSet(value) {\n      return isObjectLike(value) && getTag(value) == setTag;\n    }\n\n    /**\n     * The base implementation of `_.isTypedArray` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n     */\n    function baseIsTypedArray(value) {\n      return isObjectLike(value) &&\n        isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n    }\n\n    /**\n     * The base implementation of `_.iteratee`.\n     *\n     * @private\n     * @param {*} [value=_.identity] The value to convert to an iteratee.\n     * @returns {Function} Returns the iteratee.\n     */\n    function baseIteratee(value) {\n      // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.\n      // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.\n      if (typeof value == 'function') {\n        return value;\n      }\n      if (value == null) {\n        return identity;\n      }\n      if (typeof value == 'object') {\n        return isArray(value)\n          ? baseMatchesProperty(value[0], value[1])\n          : baseMatches(value);\n      }\n      return property(value);\n    }\n\n    /**\n     * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     */\n    function baseKeys(object) {\n      if (!isPrototype(object)) {\n        return nativeKeys(object);\n      }\n      var result = [];\n      for (var key in Object(object)) {\n        if (hasOwnProperty.call(object, key) && key != 'constructor') {\n          result.push(key);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     */\n    function baseKeysIn(object) {\n      if (!isObject(object)) {\n        return nativeKeysIn(object);\n      }\n      var isProto = isPrototype(object),\n          result = [];\n\n      for (var key in object) {\n        if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\n          result.push(key);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.lt` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is less than `other`,\n     *  else `false`.\n     */\n    function baseLt(value, other) {\n      return value < other;\n    }\n\n    /**\n     * The base implementation of `_.map` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Array} Returns the new mapped array.\n     */\n    function baseMap(collection, iteratee) {\n      var index = -1,\n          result = isArrayLike(collection) ? Array(collection.length) : [];\n\n      baseEach(collection, function(value, key, collection) {\n        result[++index] = iteratee(value, key, collection);\n      });\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.matches` which doesn't clone `source`.\n     *\n     * @private\n     * @param {Object} source The object of property values to match.\n     * @returns {Function} Returns the new spec function.\n     */\n    function baseMatches(source) {\n      var matchData = getMatchData(source);\n      if (matchData.length == 1 && matchData[0][2]) {\n        return matchesStrictComparable(matchData[0][0], matchData[0][1]);\n      }\n      return function(object) {\n        return object === source || baseIsMatch(object, source, matchData);\n      };\n    }\n\n    /**\n     * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.\n     *\n     * @private\n     * @param {string} path The path of the property to get.\n     * @param {*} srcValue The value to match.\n     * @returns {Function} Returns the new spec function.\n     */\n    function baseMatchesProperty(path, srcValue) {\n      if (isKey(path) && isStrictComparable(srcValue)) {\n        return matchesStrictComparable(toKey(path), srcValue);\n      }\n      return function(object) {\n        var objValue = get(object, path);\n        return (objValue === undefined && objValue === srcValue)\n          ? hasIn(object, path)\n          : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);\n      };\n    }\n\n    /**\n     * The base implementation of `_.merge` without support for multiple sources.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @param {number} srcIndex The index of `source`.\n     * @param {Function} [customizer] The function to customize merged values.\n     * @param {Object} [stack] Tracks traversed source values and their merged\n     *  counterparts.\n     */\n    function baseMerge(object, source, srcIndex, customizer, stack) {\n      if (object === source) {\n        return;\n      }\n      baseFor(source, function(srcValue, key) {\n        stack || (stack = new Stack);\n        if (isObject(srcValue)) {\n          baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack);\n        }\n        else {\n          var newValue = customizer\n            ? customizer(safeGet(object, key), srcValue, (key + ''), object, source, stack)\n            : undefined;\n\n          if (newValue === undefined) {\n            newValue = srcValue;\n          }\n          assignMergeValue(object, key, newValue);\n        }\n      }, keysIn);\n    }\n\n    /**\n     * A specialized version of `baseMerge` for arrays and objects which performs\n     * deep merges and tracks traversed objects enabling objects with circular\n     * references to be merged.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @param {string} key The key of the value to merge.\n     * @param {number} srcIndex The index of `source`.\n     * @param {Function} mergeFunc The function to merge values.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @param {Object} [stack] Tracks traversed source values and their merged\n     *  counterparts.\n     */\n    function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) {\n      var objValue = safeGet(object, key),\n          srcValue = safeGet(source, key),\n          stacked = stack.get(srcValue);\n\n      if (stacked) {\n        assignMergeValue(object, key, stacked);\n        return;\n      }\n      var newValue = customizer\n        ? customizer(objValue, srcValue, (key + ''), object, source, stack)\n        : undefined;\n\n      var isCommon = newValue === undefined;\n\n      if (isCommon) {\n        var isArr = isArray(srcValue),\n            isBuff = !isArr && isBuffer(srcValue),\n            isTyped = !isArr && !isBuff && isTypedArray(srcValue);\n\n        newValue = srcValue;\n        if (isArr || isBuff || isTyped) {\n          if (isArray(objValue)) {\n            newValue = objValue;\n          }\n          else if (isArrayLikeObject(objValue)) {\n            newValue = copyArray(objValue);\n          }\n          else if (isBuff) {\n            isCommon = false;\n            newValue = cloneBuffer(srcValue, true);\n          }\n          else if (isTyped) {\n            isCommon = false;\n            newValue = cloneTypedArray(srcValue, true);\n          }\n          else {\n            newValue = [];\n          }\n        }\n        else if (isPlainObject(srcValue) || isArguments(srcValue)) {\n          newValue = objValue;\n          if (isArguments(objValue)) {\n            newValue = toPlainObject(objValue);\n          }\n          else if (!isObject(objValue) || isFunction(objValue)) {\n            newValue = initCloneObject(srcValue);\n          }\n        }\n        else {\n          isCommon = false;\n        }\n      }\n      if (isCommon) {\n        // Recursively merge objects and arrays (susceptible to call stack limits).\n        stack.set(srcValue, newValue);\n        mergeFunc(newValue, srcValue, srcIndex, customizer, stack);\n        stack['delete'](srcValue);\n      }\n      assignMergeValue(object, key, newValue);\n    }\n\n    /**\n     * The base implementation of `_.nth` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {Array} array The array to query.\n     * @param {number} n The index of the element to return.\n     * @returns {*} Returns the nth element of `array`.\n     */\n    function baseNth(array, n) {\n      var length = array.length;\n      if (!length) {\n        return;\n      }\n      n += n < 0 ? length : 0;\n      return isIndex(n, length) ? array[n] : undefined;\n    }\n\n    /**\n     * The base implementation of `_.orderBy` without param guards.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by.\n     * @param {string[]} orders The sort orders of `iteratees`.\n     * @returns {Array} Returns the new sorted array.\n     */\n    function baseOrderBy(collection, iteratees, orders) {\n      if (iteratees.length) {\n        iteratees = arrayMap(iteratees, function(iteratee) {\n          if (isArray(iteratee)) {\n            return function(value) {\n              return baseGet(value, iteratee.length === 1 ? iteratee[0] : iteratee);\n            }\n          }\n          return iteratee;\n        });\n      } else {\n        iteratees = [identity];\n      }\n\n      var index = -1;\n      iteratees = arrayMap(iteratees, baseUnary(getIteratee()));\n\n      var result = baseMap(collection, function(value, key, collection) {\n        var criteria = arrayMap(iteratees, function(iteratee) {\n          return iteratee(value);\n        });\n        return { 'criteria': criteria, 'index': ++index, 'value': value };\n      });\n\n      return baseSortBy(result, function(object, other) {\n        return compareMultiple(object, other, orders);\n      });\n    }\n\n    /**\n     * The base implementation of `_.pick` without support for individual\n     * property identifiers.\n     *\n     * @private\n     * @param {Object} object The source object.\n     * @param {string[]} paths The property paths to pick.\n     * @returns {Object} Returns the new object.\n     */\n    function basePick(object, paths) {\n      return basePickBy(object, paths, function(value, path) {\n        return hasIn(object, path);\n      });\n    }\n\n    /**\n     * The base implementation of  `_.pickBy` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Object} object The source object.\n     * @param {string[]} paths The property paths to pick.\n     * @param {Function} predicate The function invoked per property.\n     * @returns {Object} Returns the new object.\n     */\n    function basePickBy(object, paths, predicate) {\n      var index = -1,\n          length = paths.length,\n          result = {};\n\n      while (++index < length) {\n        var path = paths[index],\n            value = baseGet(object, path);\n\n        if (predicate(value, path)) {\n          baseSet(result, castPath(path, object), value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * A specialized version of `baseProperty` which supports deep paths.\n     *\n     * @private\n     * @param {Array|string} path The path of the property to get.\n     * @returns {Function} Returns the new accessor function.\n     */\n    function basePropertyDeep(path) {\n      return function(object) {\n        return baseGet(object, path);\n      };\n    }\n\n    /**\n     * The base implementation of `_.pullAllBy` without support for iteratee\n     * shorthands.\n     *\n     * @private\n     * @param {Array} array The array to modify.\n     * @param {Array} values The values to remove.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns `array`.\n     */\n    function basePullAll(array, values, iteratee, comparator) {\n      var indexOf = comparator ? baseIndexOfWith : baseIndexOf,\n          index = -1,\n          length = values.length,\n          seen = array;\n\n      if (array === values) {\n        values = copyArray(values);\n      }\n      if (iteratee) {\n        seen = arrayMap(array, baseUnary(iteratee));\n      }\n      while (++index < length) {\n        var fromIndex = 0,\n            value = values[index],\n            computed = iteratee ? iteratee(value) : value;\n\n        while ((fromIndex = indexOf(seen, computed, fromIndex, comparator)) > -1) {\n          if (seen !== array) {\n            splice.call(seen, fromIndex, 1);\n          }\n          splice.call(array, fromIndex, 1);\n        }\n      }\n      return array;\n    }\n\n    /**\n     * The base implementation of `_.pullAt` without support for individual\n     * indexes or capturing the removed elements.\n     *\n     * @private\n     * @param {Array} array The array to modify.\n     * @param {number[]} indexes The indexes of elements to remove.\n     * @returns {Array} Returns `array`.\n     */\n    function basePullAt(array, indexes) {\n      var length = array ? indexes.length : 0,\n          lastIndex = length - 1;\n\n      while (length--) {\n        var index = indexes[length];\n        if (length == lastIndex || index !== previous) {\n          var previous = index;\n          if (isIndex(index)) {\n            splice.call(array, index, 1);\n          } else {\n            baseUnset(array, index);\n          }\n        }\n      }\n      return array;\n    }\n\n    /**\n     * The base implementation of `_.random` without support for returning\n     * floating-point numbers.\n     *\n     * @private\n     * @param {number} lower The lower bound.\n     * @param {number} upper The upper bound.\n     * @returns {number} Returns the random number.\n     */\n    function baseRandom(lower, upper) {\n      return lower + nativeFloor(nativeRandom() * (upper - lower + 1));\n    }\n\n    /**\n     * The base implementation of `_.range` and `_.rangeRight` which doesn't\n     * coerce arguments.\n     *\n     * @private\n     * @param {number} start The start of the range.\n     * @param {number} end The end of the range.\n     * @param {number} step The value to increment or decrement by.\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Array} Returns the range of numbers.\n     */\n    function baseRange(start, end, step, fromRight) {\n      var index = -1,\n          length = nativeMax(nativeCeil((end - start) / (step || 1)), 0),\n          result = Array(length);\n\n      while (length--) {\n        result[fromRight ? length : ++index] = start;\n        start += step;\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.repeat` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {string} string The string to repeat.\n     * @param {number} n The number of times to repeat the string.\n     * @returns {string} Returns the repeated string.\n     */\n    function baseRepeat(string, n) {\n      var result = '';\n      if (!string || n < 1 || n > MAX_SAFE_INTEGER) {\n        return result;\n      }\n      // Leverage the exponentiation by squaring algorithm for a faster repeat.\n      // See https://en.wikipedia.org/wiki/Exponentiation_by_squaring for more details.\n      do {\n        if (n % 2) {\n          result += string;\n        }\n        n = nativeFloor(n / 2);\n        if (n) {\n          string += string;\n        }\n      } while (n);\n\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.rest` which doesn't validate or coerce arguments.\n     *\n     * @private\n     * @param {Function} func The function to apply a rest parameter to.\n     * @param {number} [start=func.length-1] The start position of the rest parameter.\n     * @returns {Function} Returns the new function.\n     */\n    function baseRest(func, start) {\n      return setToString(overRest(func, start, identity), func + '');\n    }\n\n    /**\n     * The base implementation of `_.sample`.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to sample.\n     * @returns {*} Returns the random element.\n     */\n    function baseSample(collection) {\n      return arraySample(values(collection));\n    }\n\n    /**\n     * The base implementation of `_.sampleSize` without param guards.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to sample.\n     * @param {number} n The number of elements to sample.\n     * @returns {Array} Returns the random elements.\n     */\n    function baseSampleSize(collection, n) {\n      var array = values(collection);\n      return shuffleSelf(array, baseClamp(n, 0, array.length));\n    }\n\n    /**\n     * The base implementation of `_.set`.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to set.\n     * @param {*} value The value to set.\n     * @param {Function} [customizer] The function to customize path creation.\n     * @returns {Object} Returns `object`.\n     */\n    function baseSet(object, path, value, customizer) {\n      if (!isObject(object)) {\n        return object;\n      }\n      path = castPath(path, object);\n\n      var index = -1,\n          length = path.length,\n          lastIndex = length - 1,\n          nested = object;\n\n      while (nested != null && ++index < length) {\n        var key = toKey(path[index]),\n            newValue = value;\n\n        if (key === '__proto__' || key === 'constructor' || key === 'prototype') {\n          return object;\n        }\n\n        if (index != lastIndex) {\n          var objValue = nested[key];\n          newValue = customizer ? customizer(objValue, key, nested) : undefined;\n          if (newValue === undefined) {\n            newValue = isObject(objValue)\n              ? objValue\n              : (isIndex(path[index + 1]) ? [] : {});\n          }\n        }\n        assignValue(nested, key, newValue);\n        nested = nested[key];\n      }\n      return object;\n    }\n\n    /**\n     * The base implementation of `setData` without support for hot loop shorting.\n     *\n     * @private\n     * @param {Function} func The function to associate metadata with.\n     * @param {*} data The metadata.\n     * @returns {Function} Returns `func`.\n     */\n    var baseSetData = !metaMap ? identity : function(func, data) {\n      metaMap.set(func, data);\n      return func;\n    };\n\n    /**\n     * The base implementation of `setToString` without support for hot loop shorting.\n     *\n     * @private\n     * @param {Function} func The function to modify.\n     * @param {Function} string The `toString` result.\n     * @returns {Function} Returns `func`.\n     */\n    var baseSetToString = !defineProperty ? identity : function(func, string) {\n      return defineProperty(func, 'toString', {\n        'configurable': true,\n        'enumerable': false,\n        'value': constant(string),\n        'writable': true\n      });\n    };\n\n    /**\n     * The base implementation of `_.shuffle`.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to shuffle.\n     * @returns {Array} Returns the new shuffled array.\n     */\n    function baseShuffle(collection) {\n      return shuffleSelf(values(collection));\n    }\n\n    /**\n     * The base implementation of `_.slice` without an iteratee call guard.\n     *\n     * @private\n     * @param {Array} array The array to slice.\n     * @param {number} [start=0] The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns the slice of `array`.\n     */\n    function baseSlice(array, start, end) {\n      var index = -1,\n          length = array.length;\n\n      if (start < 0) {\n        start = -start > length ? 0 : (length + start);\n      }\n      end = end > length ? length : end;\n      if (end < 0) {\n        end += length;\n      }\n      length = start > end ? 0 : ((end - start) >>> 0);\n      start >>>= 0;\n\n      var result = Array(length);\n      while (++index < length) {\n        result[index] = array[index + start];\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.some` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} predicate The function invoked per iteration.\n     * @returns {boolean} Returns `true` if any element passes the predicate check,\n     *  else `false`.\n     */\n    function baseSome(collection, predicate) {\n      var result;\n\n      baseEach(collection, function(value, index, collection) {\n        result = predicate(value, index, collection);\n        return !result;\n      });\n      return !!result;\n    }\n\n    /**\n     * The base implementation of `_.sortedIndex` and `_.sortedLastIndex` which\n     * performs a binary search of `array` to determine the index at which `value`\n     * should be inserted into `array` in order to maintain its sort order.\n     *\n     * @private\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {boolean} [retHighest] Specify returning the highest qualified index.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     */\n    function baseSortedIndex(array, value, retHighest) {\n      var low = 0,\n          high = array == null ? low : array.length;\n\n      if (typeof value == 'number' && value === value && high <= HALF_MAX_ARRAY_LENGTH) {\n        while (low < high) {\n          var mid = (low + high) >>> 1,\n              computed = array[mid];\n\n          if (computed !== null && !isSymbol(computed) &&\n              (retHighest ? (computed <= value) : (computed < value))) {\n            low = mid + 1;\n          } else {\n            high = mid;\n          }\n        }\n        return high;\n      }\n      return baseSortedIndexBy(array, value, identity, retHighest);\n    }\n\n    /**\n     * The base implementation of `_.sortedIndexBy` and `_.sortedLastIndexBy`\n     * which invokes `iteratee` for `value` and each element of `array` to compute\n     * their sort ranking. The iteratee is invoked with one argument; (value).\n     *\n     * @private\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {Function} iteratee The iteratee invoked per element.\n     * @param {boolean} [retHighest] Specify returning the highest qualified index.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     */\n    function baseSortedIndexBy(array, value, iteratee, retHighest) {\n      var low = 0,\n          high = array == null ? 0 : array.length;\n      if (high === 0) {\n        return 0;\n      }\n\n      value = iteratee(value);\n      var valIsNaN = value !== value,\n          valIsNull = value === null,\n          valIsSymbol = isSymbol(value),\n          valIsUndefined = value === undefined;\n\n      while (low < high) {\n        var mid = nativeFloor((low + high) / 2),\n            computed = iteratee(array[mid]),\n            othIsDefined = computed !== undefined,\n            othIsNull = computed === null,\n            othIsReflexive = computed === computed,\n            othIsSymbol = isSymbol(computed);\n\n        if (valIsNaN) {\n          var setLow = retHighest || othIsReflexive;\n        } else if (valIsUndefined) {\n          setLow = othIsReflexive && (retHighest || othIsDefined);\n        } else if (valIsNull) {\n          setLow = othIsReflexive && othIsDefined && (retHighest || !othIsNull);\n        } else if (valIsSymbol) {\n          setLow = othIsReflexive && othIsDefined && !othIsNull && (retHighest || !othIsSymbol);\n        } else if (othIsNull || othIsSymbol) {\n          setLow = false;\n        } else {\n          setLow = retHighest ? (computed <= value) : (computed < value);\n        }\n        if (setLow) {\n          low = mid + 1;\n        } else {\n          high = mid;\n        }\n      }\n      return nativeMin(high, MAX_ARRAY_INDEX);\n    }\n\n    /**\n     * The base implementation of `_.sortedUniq` and `_.sortedUniqBy` without\n     * support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @returns {Array} Returns the new duplicate free array.\n     */\n    function baseSortedUniq(array, iteratee) {\n      var index = -1,\n          length = array.length,\n          resIndex = 0,\n          result = [];\n\n      while (++index < length) {\n        var value = array[index],\n            computed = iteratee ? iteratee(value) : value;\n\n        if (!index || !eq(computed, seen)) {\n          var seen = computed;\n          result[resIndex++] = value === 0 ? 0 : value;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.toNumber` which doesn't ensure correct\n     * conversions of binary, hexadecimal, or octal string values.\n     *\n     * @private\n     * @param {*} value The value to process.\n     * @returns {number} Returns the number.\n     */\n    function baseToNumber(value) {\n      if (typeof value == 'number') {\n        return value;\n      }\n      if (isSymbol(value)) {\n        return NAN;\n      }\n      return +value;\n    }\n\n    /**\n     * The base implementation of `_.toString` which doesn't convert nullish\n     * values to empty strings.\n     *\n     * @private\n     * @param {*} value The value to process.\n     * @returns {string} Returns the string.\n     */\n    function baseToString(value) {\n      // Exit early for strings to avoid a performance hit in some environments.\n      if (typeof value == 'string') {\n        return value;\n      }\n      if (isArray(value)) {\n        // Recursively convert values (susceptible to call stack limits).\n        return arrayMap(value, baseToString) + '';\n      }\n      if (isSymbol(value)) {\n        return symbolToString ? symbolToString.call(value) : '';\n      }\n      var result = (value + '');\n      return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n    }\n\n    /**\n     * The base implementation of `_.uniqBy` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new duplicate free array.\n     */\n    function baseUniq(array, iteratee, comparator) {\n      var index = -1,\n          includes = arrayIncludes,\n          length = array.length,\n          isCommon = true,\n          result = [],\n          seen = result;\n\n      if (comparator) {\n        isCommon = false;\n        includes = arrayIncludesWith;\n      }\n      else if (length >= LARGE_ARRAY_SIZE) {\n        var set = iteratee ? null : createSet(array);\n        if (set) {\n          return setToArray(set);\n        }\n        isCommon = false;\n        includes = cacheHas;\n        seen = new SetCache;\n      }\n      else {\n        seen = iteratee ? [] : result;\n      }\n      outer:\n      while (++index < length) {\n        var value = array[index],\n            computed = iteratee ? iteratee(value) : value;\n\n        value = (comparator || value !== 0) ? value : 0;\n        if (isCommon && computed === computed) {\n          var seenIndex = seen.length;\n          while (seenIndex--) {\n            if (seen[seenIndex] === computed) {\n              continue outer;\n            }\n          }\n          if (iteratee) {\n            seen.push(computed);\n          }\n          result.push(value);\n        }\n        else if (!includes(seen, computed, comparator)) {\n          if (seen !== result) {\n            seen.push(computed);\n          }\n          result.push(value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.unset`.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The property path to unset.\n     * @returns {boolean} Returns `true` if the property is deleted, else `false`.\n     */\n    function baseUnset(object, path) {\n      path = castPath(path, object);\n      object = parent(object, path);\n      return object == null || delete object[toKey(last(path))];\n    }\n\n    /**\n     * The base implementation of `_.update`.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to update.\n     * @param {Function} updater The function to produce the updated value.\n     * @param {Function} [customizer] The function to customize path creation.\n     * @returns {Object} Returns `object`.\n     */\n    function baseUpdate(object, path, updater, customizer) {\n      return baseSet(object, path, updater(baseGet(object, path)), customizer);\n    }\n\n    /**\n     * The base implementation of methods like `_.dropWhile` and `_.takeWhile`\n     * without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array} array The array to query.\n     * @param {Function} predicate The function invoked per iteration.\n     * @param {boolean} [isDrop] Specify dropping elements instead of taking them.\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Array} Returns the slice of `array`.\n     */\n    function baseWhile(array, predicate, isDrop, fromRight) {\n      var length = array.length,\n          index = fromRight ? length : -1;\n\n      while ((fromRight ? index-- : ++index < length) &&\n        predicate(array[index], index, array)) {}\n\n      return isDrop\n        ? baseSlice(array, (fromRight ? 0 : index), (fromRight ? index + 1 : length))\n        : baseSlice(array, (fromRight ? index + 1 : 0), (fromRight ? length : index));\n    }\n\n    /**\n     * The base implementation of `wrapperValue` which returns the result of\n     * performing a sequence of actions on the unwrapped `value`, where each\n     * successive action is supplied the return value of the previous.\n     *\n     * @private\n     * @param {*} value The unwrapped value.\n     * @param {Array} actions Actions to perform to resolve the unwrapped value.\n     * @returns {*} Returns the resolved value.\n     */\n    function baseWrapperValue(value, actions) {\n      var result = value;\n      if (result instanceof LazyWrapper) {\n        result = result.value();\n      }\n      return arrayReduce(actions, function(result, action) {\n        return action.func.apply(action.thisArg, arrayPush([result], action.args));\n      }, result);\n    }\n\n    /**\n     * The base implementation of methods like `_.xor`, without support for\n     * iteratee shorthands, that accepts an array of arrays to inspect.\n     *\n     * @private\n     * @param {Array} arrays The arrays to inspect.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of values.\n     */\n    function baseXor(arrays, iteratee, comparator) {\n      var length = arrays.length;\n      if (length < 2) {\n        return length ? baseUniq(arrays[0]) : [];\n      }\n      var index = -1,\n          result = Array(length);\n\n      while (++index < length) {\n        var array = arrays[index],\n            othIndex = -1;\n\n        while (++othIndex < length) {\n          if (othIndex != index) {\n            result[index] = baseDifference(result[index] || array, arrays[othIndex], iteratee, comparator);\n          }\n        }\n      }\n      return baseUniq(baseFlatten(result, 1), iteratee, comparator);\n    }\n\n    /**\n     * This base implementation of `_.zipObject` which assigns values using `assignFunc`.\n     *\n     * @private\n     * @param {Array} props The property identifiers.\n     * @param {Array} values The property values.\n     * @param {Function} assignFunc The function to assign values.\n     * @returns {Object} Returns the new object.\n     */\n    function baseZipObject(props, values, assignFunc) {\n      var index = -1,\n          length = props.length,\n          valsLength = values.length,\n          result = {};\n\n      while (++index < length) {\n        var value = index < valsLength ? values[index] : undefined;\n        assignFunc(result, props[index], value);\n      }\n      return result;\n    }\n\n    /**\n     * Casts `value` to an empty array if it's not an array like object.\n     *\n     * @private\n     * @param {*} value The value to inspect.\n     * @returns {Array|Object} Returns the cast array-like object.\n     */\n    function castArrayLikeObject(value) {\n      return isArrayLikeObject(value) ? value : [];\n    }\n\n    /**\n     * Casts `value` to `identity` if it's not a function.\n     *\n     * @private\n     * @param {*} value The value to inspect.\n     * @returns {Function} Returns cast function.\n     */\n    function castFunction(value) {\n      return typeof value == 'function' ? value : identity;\n    }\n\n    /**\n     * Casts `value` to a path array if it's not one.\n     *\n     * @private\n     * @param {*} value The value to inspect.\n     * @param {Object} [object] The object to query keys on.\n     * @returns {Array} Returns the cast property path array.\n     */\n    function castPath(value, object) {\n      if (isArray(value)) {\n        return value;\n      }\n      return isKey(value, object) ? [value] : stringToPath(toString(value));\n    }\n\n    /**\n     * A `baseRest` alias which can be replaced with `identity` by module\n     * replacement plugins.\n     *\n     * @private\n     * @type {Function}\n     * @param {Function} func The function to apply a rest parameter to.\n     * @returns {Function} Returns the new function.\n     */\n    var castRest = baseRest;\n\n    /**\n     * Casts `array` to a slice if it's needed.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {number} start The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns the cast slice.\n     */\n    function castSlice(array, start, end) {\n      var length = array.length;\n      end = end === undefined ? length : end;\n      return (!start && end >= length) ? array : baseSlice(array, start, end);\n    }\n\n    /**\n     * A simple wrapper around the global [`clearTimeout`](https://mdn.io/clearTimeout).\n     *\n     * @private\n     * @param {number|Object} id The timer id or timeout object of the timer to clear.\n     */\n    var clearTimeout = ctxClearTimeout || function(id) {\n      return root.clearTimeout(id);\n    };\n\n    /**\n     * Creates a clone of  `buffer`.\n     *\n     * @private\n     * @param {Buffer} buffer The buffer to clone.\n     * @param {boolean} [isDeep] Specify a deep clone.\n     * @returns {Buffer} Returns the cloned buffer.\n     */\n    function cloneBuffer(buffer, isDeep) {\n      if (isDeep) {\n        return buffer.slice();\n      }\n      var length = buffer.length,\n          result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);\n\n      buffer.copy(result);\n      return result;\n    }\n\n    /**\n     * Creates a clone of `arrayBuffer`.\n     *\n     * @private\n     * @param {ArrayBuffer} arrayBuffer The array buffer to clone.\n     * @returns {ArrayBuffer} Returns the cloned array buffer.\n     */\n    function cloneArrayBuffer(arrayBuffer) {\n      var result = new arrayBuffer.constructor(arrayBuffer.byteLength);\n      new Uint8Array(result).set(new Uint8Array(arrayBuffer));\n      return result;\n    }\n\n    /**\n     * Creates a clone of `dataView`.\n     *\n     * @private\n     * @param {Object} dataView The data view to clone.\n     * @param {boolean} [isDeep] Specify a deep clone.\n     * @returns {Object} Returns the cloned data view.\n     */\n    function cloneDataView(dataView, isDeep) {\n      var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;\n      return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);\n    }\n\n    /**\n     * Creates a clone of `regexp`.\n     *\n     * @private\n     * @param {Object} regexp The regexp to clone.\n     * @returns {Object} Returns the cloned regexp.\n     */\n    function cloneRegExp(regexp) {\n      var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));\n      result.lastIndex = regexp.lastIndex;\n      return result;\n    }\n\n    /**\n     * Creates a clone of the `symbol` object.\n     *\n     * @private\n     * @param {Object} symbol The symbol object to clone.\n     * @returns {Object} Returns the cloned symbol object.\n     */\n    function cloneSymbol(symbol) {\n      return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};\n    }\n\n    /**\n     * Creates a clone of `typedArray`.\n     *\n     * @private\n     * @param {Object} typedArray The typed array to clone.\n     * @param {boolean} [isDeep] Specify a deep clone.\n     * @returns {Object} Returns the cloned typed array.\n     */\n    function cloneTypedArray(typedArray, isDeep) {\n      var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;\n      return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);\n    }\n\n    /**\n     * Compares values to sort them in ascending order.\n     *\n     * @private\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {number} Returns the sort order indicator for `value`.\n     */\n    function compareAscending(value, other) {\n      if (value !== other) {\n        var valIsDefined = value !== undefined,\n            valIsNull = value === null,\n            valIsReflexive = value === value,\n            valIsSymbol = isSymbol(value);\n\n        var othIsDefined = other !== undefined,\n            othIsNull = other === null,\n            othIsReflexive = other === other,\n            othIsSymbol = isSymbol(other);\n\n        if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) ||\n            (valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) ||\n            (valIsNull && othIsDefined && othIsReflexive) ||\n            (!valIsDefined && othIsReflexive) ||\n            !valIsReflexive) {\n          return 1;\n        }\n        if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) ||\n            (othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) ||\n            (othIsNull && valIsDefined && valIsReflexive) ||\n            (!othIsDefined && valIsReflexive) ||\n            !othIsReflexive) {\n          return -1;\n        }\n      }\n      return 0;\n    }\n\n    /**\n     * Used by `_.orderBy` to compare multiple properties of a value to another\n     * and stable sort them.\n     *\n     * If `orders` is unspecified, all values are sorted in ascending order. Otherwise,\n     * specify an order of \"desc\" for descending or \"asc\" for ascending sort order\n     * of corresponding values.\n     *\n     * @private\n     * @param {Object} object The object to compare.\n     * @param {Object} other The other object to compare.\n     * @param {boolean[]|string[]} orders The order to sort by for each property.\n     * @returns {number} Returns the sort order indicator for `object`.\n     */\n    function compareMultiple(object, other, orders) {\n      var index = -1,\n          objCriteria = object.criteria,\n          othCriteria = other.criteria,\n          length = objCriteria.length,\n          ordersLength = orders.length;\n\n      while (++index < length) {\n        var result = compareAscending(objCriteria[index], othCriteria[index]);\n        if (result) {\n          if (index >= ordersLength) {\n            return result;\n          }\n          var order = orders[index];\n          return result * (order == 'desc' ? -1 : 1);\n        }\n      }\n      // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications\n      // that causes it, under certain circumstances, to provide the same value for\n      // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247\n      // for more details.\n      //\n      // This also ensures a stable sort in V8 and other engines.\n      // See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details.\n      return object.index - other.index;\n    }\n\n    /**\n     * Creates an array that is the composition of partially applied arguments,\n     * placeholders, and provided arguments into a single array of arguments.\n     *\n     * @private\n     * @param {Array} args The provided arguments.\n     * @param {Array} partials The arguments to prepend to those provided.\n     * @param {Array} holders The `partials` placeholder indexes.\n     * @params {boolean} [isCurried] Specify composing for a curried function.\n     * @returns {Array} Returns the new array of composed arguments.\n     */\n    function composeArgs(args, partials, holders, isCurried) {\n      var argsIndex = -1,\n          argsLength = args.length,\n          holdersLength = holders.length,\n          leftIndex = -1,\n          leftLength = partials.length,\n          rangeLength = nativeMax(argsLength - holdersLength, 0),\n          result = Array(leftLength + rangeLength),\n          isUncurried = !isCurried;\n\n      while (++leftIndex < leftLength) {\n        result[leftIndex] = partials[leftIndex];\n      }\n      while (++argsIndex < holdersLength) {\n        if (isUncurried || argsIndex < argsLength) {\n          result[holders[argsIndex]] = args[argsIndex];\n        }\n      }\n      while (rangeLength--) {\n        result[leftIndex++] = args[argsIndex++];\n      }\n      return result;\n    }\n\n    /**\n     * This function is like `composeArgs` except that the arguments composition\n     * is tailored for `_.partialRight`.\n     *\n     * @private\n     * @param {Array} args The provided arguments.\n     * @param {Array} partials The arguments to append to those provided.\n     * @param {Array} holders The `partials` placeholder indexes.\n     * @params {boolean} [isCurried] Specify composing for a curried function.\n     * @returns {Array} Returns the new array of composed arguments.\n     */\n    function composeArgsRight(args, partials, holders, isCurried) {\n      var argsIndex = -1,\n          argsLength = args.length,\n          holdersIndex = -1,\n          holdersLength = holders.length,\n          rightIndex = -1,\n          rightLength = partials.length,\n          rangeLength = nativeMax(argsLength - holdersLength, 0),\n          result = Array(rangeLength + rightLength),\n          isUncurried = !isCurried;\n\n      while (++argsIndex < rangeLength) {\n        result[argsIndex] = args[argsIndex];\n      }\n      var offset = argsIndex;\n      while (++rightIndex < rightLength) {\n        result[offset + rightIndex] = partials[rightIndex];\n      }\n      while (++holdersIndex < holdersLength) {\n        if (isUncurried || argsIndex < argsLength) {\n          result[offset + holders[holdersIndex]] = args[argsIndex++];\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Copies the values of `source` to `array`.\n     *\n     * @private\n     * @param {Array} source The array to copy values from.\n     * @param {Array} [array=[]] The array to copy values to.\n     * @returns {Array} Returns `array`.\n     */\n    function copyArray(source, array) {\n      var index = -1,\n          length = source.length;\n\n      array || (array = Array(length));\n      while (++index < length) {\n        array[index] = source[index];\n      }\n      return array;\n    }\n\n    /**\n     * Copies properties of `source` to `object`.\n     *\n     * @private\n     * @param {Object} source The object to copy properties from.\n     * @param {Array} props The property identifiers to copy.\n     * @param {Object} [object={}] The object to copy properties to.\n     * @param {Function} [customizer] The function to customize copied values.\n     * @returns {Object} Returns `object`.\n     */\n    function copyObject(source, props, object, customizer) {\n      var isNew = !object;\n      object || (object = {});\n\n      var index = -1,\n          length = props.length;\n\n      while (++index < length) {\n        var key = props[index];\n\n        var newValue = customizer\n          ? customizer(object[key], source[key], key, object, source)\n          : undefined;\n\n        if (newValue === undefined) {\n          newValue = source[key];\n        }\n        if (isNew) {\n          baseAssignValue(object, key, newValue);\n        } else {\n          assignValue(object, key, newValue);\n        }\n      }\n      return object;\n    }\n\n    /**\n     * Copies own symbols of `source` to `object`.\n     *\n     * @private\n     * @param {Object} source The object to copy symbols from.\n     * @param {Object} [object={}] The object to copy symbols to.\n     * @returns {Object} Returns `object`.\n     */\n    function copySymbols(source, object) {\n      return copyObject(source, getSymbols(source), object);\n    }\n\n    /**\n     * Copies own and inherited symbols of `source` to `object`.\n     *\n     * @private\n     * @param {Object} source The object to copy symbols from.\n     * @param {Object} [object={}] The object to copy symbols to.\n     * @returns {Object} Returns `object`.\n     */\n    function copySymbolsIn(source, object) {\n      return copyObject(source, getSymbolsIn(source), object);\n    }\n\n    /**\n     * Creates a function like `_.groupBy`.\n     *\n     * @private\n     * @param {Function} setter The function to set accumulator values.\n     * @param {Function} [initializer] The accumulator object initializer.\n     * @returns {Function} Returns the new aggregator function.\n     */\n    function createAggregator(setter, initializer) {\n      return function(collection, iteratee) {\n        var func = isArray(collection) ? arrayAggregator : baseAggregator,\n            accumulator = initializer ? initializer() : {};\n\n        return func(collection, setter, getIteratee(iteratee, 2), accumulator);\n      };\n    }\n\n    /**\n     * Creates a function like `_.assign`.\n     *\n     * @private\n     * @param {Function} assigner The function to assign values.\n     * @returns {Function} Returns the new assigner function.\n     */\n    function createAssigner(assigner) {\n      return baseRest(function(object, sources) {\n        var index = -1,\n            length = sources.length,\n            customizer = length > 1 ? sources[length - 1] : undefined,\n            guard = length > 2 ? sources[2] : undefined;\n\n        customizer = (assigner.length > 3 && typeof customizer == 'function')\n          ? (length--, customizer)\n          : undefined;\n\n        if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n          customizer = length < 3 ? undefined : customizer;\n          length = 1;\n        }\n        object = Object(object);\n        while (++index < length) {\n          var source = sources[index];\n          if (source) {\n            assigner(object, source, index, customizer);\n          }\n        }\n        return object;\n      });\n    }\n\n    /**\n     * Creates a `baseEach` or `baseEachRight` function.\n     *\n     * @private\n     * @param {Function} eachFunc The function to iterate over a collection.\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Function} Returns the new base function.\n     */\n    function createBaseEach(eachFunc, fromRight) {\n      return function(collection, iteratee) {\n        if (collection == null) {\n          return collection;\n        }\n        if (!isArrayLike(collection)) {\n          return eachFunc(collection, iteratee);\n        }\n        var length = collection.length,\n            index = fromRight ? length : -1,\n            iterable = Object(collection);\n\n        while ((fromRight ? index-- : ++index < length)) {\n          if (iteratee(iterable[index], index, iterable) === false) {\n            break;\n          }\n        }\n        return collection;\n      };\n    }\n\n    /**\n     * Creates a base function for methods like `_.forIn` and `_.forOwn`.\n     *\n     * @private\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Function} Returns the new base function.\n     */\n    function createBaseFor(fromRight) {\n      return function(object, iteratee, keysFunc) {\n        var index = -1,\n            iterable = Object(object),\n            props = keysFunc(object),\n            length = props.length;\n\n        while (length--) {\n          var key = props[fromRight ? length : ++index];\n          if (iteratee(iterable[key], key, iterable) === false) {\n            break;\n          }\n        }\n        return object;\n      };\n    }\n\n    /**\n     * Creates a function that wraps `func` to invoke it with the optional `this`\n     * binding of `thisArg`.\n     *\n     * @private\n     * @param {Function} func The function to wrap.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createBind(func, bitmask, thisArg) {\n      var isBind = bitmask & WRAP_BIND_FLAG,\n          Ctor = createCtor(func);\n\n      function wrapper() {\n        var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n        return fn.apply(isBind ? thisArg : this, arguments);\n      }\n      return wrapper;\n    }\n\n    /**\n     * Creates a function like `_.lowerFirst`.\n     *\n     * @private\n     * @param {string} methodName The name of the `String` case method to use.\n     * @returns {Function} Returns the new case function.\n     */\n    function createCaseFirst(methodName) {\n      return function(string) {\n        string = toString(string);\n\n        var strSymbols = hasUnicode(string)\n          ? stringToArray(string)\n          : undefined;\n\n        var chr = strSymbols\n          ? strSymbols[0]\n          : string.charAt(0);\n\n        var trailing = strSymbols\n          ? castSlice(strSymbols, 1).join('')\n          : string.slice(1);\n\n        return chr[methodName]() + trailing;\n      };\n    }\n\n    /**\n     * Creates a function like `_.camelCase`.\n     *\n     * @private\n     * @param {Function} callback The function to combine each word.\n     * @returns {Function} Returns the new compounder function.\n     */\n    function createCompounder(callback) {\n      return function(string) {\n        return arrayReduce(words(deburr(string).replace(reApos, '')), callback, '');\n      };\n    }\n\n    /**\n     * Creates a function that produces an instance of `Ctor` regardless of\n     * whether it was invoked as part of a `new` expression or by `call` or `apply`.\n     *\n     * @private\n     * @param {Function} Ctor The constructor to wrap.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createCtor(Ctor) {\n      return function() {\n        // Use a `switch` statement to work with class constructors. See\n        // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist\n        // for more details.\n        var args = arguments;\n        switch (args.length) {\n          case 0: return new Ctor;\n          case 1: return new Ctor(args[0]);\n          case 2: return new Ctor(args[0], args[1]);\n          case 3: return new Ctor(args[0], args[1], args[2]);\n          case 4: return new Ctor(args[0], args[1], args[2], args[3]);\n          case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]);\n          case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]);\n          case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);\n        }\n        var thisBinding = baseCreate(Ctor.prototype),\n            result = Ctor.apply(thisBinding, args);\n\n        // Mimic the constructor's `return` behavior.\n        // See https://es5.github.io/#x13.2.2 for more details.\n        return isObject(result) ? result : thisBinding;\n      };\n    }\n\n    /**\n     * Creates a function that wraps `func` to enable currying.\n     *\n     * @private\n     * @param {Function} func The function to wrap.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @param {number} arity The arity of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createCurry(func, bitmask, arity) {\n      var Ctor = createCtor(func);\n\n      function wrapper() {\n        var length = arguments.length,\n            args = Array(length),\n            index = length,\n            placeholder = getHolder(wrapper);\n\n        while (index--) {\n          args[index] = arguments[index];\n        }\n        var holders = (length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder)\n          ? []\n          : replaceHolders(args, placeholder);\n\n        length -= holders.length;\n        if (length < arity) {\n          return createRecurry(\n            func, bitmask, createHybrid, wrapper.placeholder, undefined,\n            args, holders, undefined, undefined, arity - length);\n        }\n        var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n        return apply(fn, this, args);\n      }\n      return wrapper;\n    }\n\n    /**\n     * Creates a `_.find` or `_.findLast` function.\n     *\n     * @private\n     * @param {Function} findIndexFunc The function to find the collection index.\n     * @returns {Function} Returns the new find function.\n     */\n    function createFind(findIndexFunc) {\n      return function(collection, predicate, fromIndex) {\n        var iterable = Object(collection);\n        if (!isArrayLike(collection)) {\n          var iteratee = getIteratee(predicate, 3);\n          collection = keys(collection);\n          predicate = function(key) { return iteratee(iterable[key], key, iterable); };\n        }\n        var index = findIndexFunc(collection, predicate, fromIndex);\n        return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;\n      };\n    }\n\n    /**\n     * Creates a `_.flow` or `_.flowRight` function.\n     *\n     * @private\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Function} Returns the new flow function.\n     */\n    function createFlow(fromRight) {\n      return flatRest(function(funcs) {\n        var length = funcs.length,\n            index = length,\n            prereq = LodashWrapper.prototype.thru;\n\n        if (fromRight) {\n          funcs.reverse();\n        }\n        while (index--) {\n          var func = funcs[index];\n          if (typeof func != 'function') {\n            throw new TypeError(FUNC_ERROR_TEXT);\n          }\n          if (prereq && !wrapper && getFuncName(func) == 'wrapper') {\n            var wrapper = new LodashWrapper([], true);\n          }\n        }\n        index = wrapper ? index : length;\n        while (++index < length) {\n          func = funcs[index];\n\n          var funcName = getFuncName(func),\n              data = funcName == 'wrapper' ? getData(func) : undefined;\n\n          if (data && isLaziable(data[0]) &&\n                data[1] == (WRAP_ARY_FLAG | WRAP_CURRY_FLAG | WRAP_PARTIAL_FLAG | WRAP_REARG_FLAG) &&\n                !data[4].length && data[9] == 1\n              ) {\n            wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]);\n          } else {\n            wrapper = (func.length == 1 && isLaziable(func))\n              ? wrapper[funcName]()\n              : wrapper.thru(func);\n          }\n        }\n        return function() {\n          var args = arguments,\n              value = args[0];\n\n          if (wrapper && args.length == 1 && isArray(value)) {\n            return wrapper.plant(value).value();\n          }\n          var index = 0,\n              result = length ? funcs[index].apply(this, args) : value;\n\n          while (++index < length) {\n            result = funcs[index].call(this, result);\n          }\n          return result;\n        };\n      });\n    }\n\n    /**\n     * Creates a function that wraps `func` to invoke it with optional `this`\n     * binding of `thisArg`, partial application, and currying.\n     *\n     * @private\n     * @param {Function|string} func The function or method name to wrap.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @param {Array} [partials] The arguments to prepend to those provided to\n     *  the new function.\n     * @param {Array} [holders] The `partials` placeholder indexes.\n     * @param {Array} [partialsRight] The arguments to append to those provided\n     *  to the new function.\n     * @param {Array} [holdersRight] The `partialsRight` placeholder indexes.\n     * @param {Array} [argPos] The argument positions of the new function.\n     * @param {number} [ary] The arity cap of `func`.\n     * @param {number} [arity] The arity of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {\n      var isAry = bitmask & WRAP_ARY_FLAG,\n          isBind = bitmask & WRAP_BIND_FLAG,\n          isBindKey = bitmask & WRAP_BIND_KEY_FLAG,\n          isCurried = bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG),\n          isFlip = bitmask & WRAP_FLIP_FLAG,\n          Ctor = isBindKey ? undefined : createCtor(func);\n\n      function wrapper() {\n        var length = arguments.length,\n            args = Array(length),\n            index = length;\n\n        while (index--) {\n          args[index] = arguments[index];\n        }\n        if (isCurried) {\n          var placeholder = getHolder(wrapper),\n              holdersCount = countHolders(args, placeholder);\n        }\n        if (partials) {\n          args = composeArgs(args, partials, holders, isCurried);\n        }\n        if (partialsRight) {\n          args = composeArgsRight(args, partialsRight, holdersRight, isCurried);\n        }\n        length -= holdersCount;\n        if (isCurried && length < arity) {\n          var newHolders = replaceHolders(args, placeholder);\n          return createRecurry(\n            func, bitmask, createHybrid, wrapper.placeholder, thisArg,\n            args, newHolders, argPos, ary, arity - length\n          );\n        }\n        var thisBinding = isBind ? thisArg : this,\n            fn = isBindKey ? thisBinding[func] : func;\n\n        length = args.length;\n        if (argPos) {\n          args = reorder(args, argPos);\n        } else if (isFlip && length > 1) {\n          args.reverse();\n        }\n        if (isAry && ary < length) {\n          args.length = ary;\n        }\n        if (this && this !== root && this instanceof wrapper) {\n          fn = Ctor || createCtor(fn);\n        }\n        return fn.apply(thisBinding, args);\n      }\n      return wrapper;\n    }\n\n    /**\n     * Creates a function like `_.invertBy`.\n     *\n     * @private\n     * @param {Function} setter The function to set accumulator values.\n     * @param {Function} toIteratee The function to resolve iteratees.\n     * @returns {Function} Returns the new inverter function.\n     */\n    function createInverter(setter, toIteratee) {\n      return function(object, iteratee) {\n        return baseInverter(object, setter, toIteratee(iteratee), {});\n      };\n    }\n\n    /**\n     * Creates a function that performs a mathematical operation on two values.\n     *\n     * @private\n     * @param {Function} operator The function to perform the operation.\n     * @param {number} [defaultValue] The value used for `undefined` arguments.\n     * @returns {Function} Returns the new mathematical operation function.\n     */\n    function createMathOperation(operator, defaultValue) {\n      return function(value, other) {\n        var result;\n        if (value === undefined && other === undefined) {\n          return defaultValue;\n        }\n        if (value !== undefined) {\n          result = value;\n        }\n        if (other !== undefined) {\n          if (result === undefined) {\n            return other;\n          }\n          if (typeof value == 'string' || typeof other == 'string') {\n            value = baseToString(value);\n            other = baseToString(other);\n          } else {\n            value = baseToNumber(value);\n            other = baseToNumber(other);\n          }\n          result = operator(value, other);\n        }\n        return result;\n      };\n    }\n\n    /**\n     * Creates a function like `_.over`.\n     *\n     * @private\n     * @param {Function} arrayFunc The function to iterate over iteratees.\n     * @returns {Function} Returns the new over function.\n     */\n    function createOver(arrayFunc) {\n      return flatRest(function(iteratees) {\n        iteratees = arrayMap(iteratees, baseUnary(getIteratee()));\n        return baseRest(function(args) {\n          var thisArg = this;\n          return arrayFunc(iteratees, function(iteratee) {\n            return apply(iteratee, thisArg, args);\n          });\n        });\n      });\n    }\n\n    /**\n     * Creates the padding for `string` based on `length`. The `chars` string\n     * is truncated if the number of characters exceeds `length`.\n     *\n     * @private\n     * @param {number} length The padding length.\n     * @param {string} [chars=' '] The string used as padding.\n     * @returns {string} Returns the padding for `string`.\n     */\n    function createPadding(length, chars) {\n      chars = chars === undefined ? ' ' : baseToString(chars);\n\n      var charsLength = chars.length;\n      if (charsLength < 2) {\n        return charsLength ? baseRepeat(chars, length) : chars;\n      }\n      var result = baseRepeat(chars, nativeCeil(length / stringSize(chars)));\n      return hasUnicode(chars)\n        ? castSlice(stringToArray(result), 0, length).join('')\n        : result.slice(0, length);\n    }\n\n    /**\n     * Creates a function that wraps `func` to invoke it with the `this` binding\n     * of `thisArg` and `partials` prepended to the arguments it receives.\n     *\n     * @private\n     * @param {Function} func The function to wrap.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @param {*} thisArg The `this` binding of `func`.\n     * @param {Array} partials The arguments to prepend to those provided to\n     *  the new function.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createPartial(func, bitmask, thisArg, partials) {\n      var isBind = bitmask & WRAP_BIND_FLAG,\n          Ctor = createCtor(func);\n\n      function wrapper() {\n        var argsIndex = -1,\n            argsLength = arguments.length,\n            leftIndex = -1,\n            leftLength = partials.length,\n            args = Array(leftLength + argsLength),\n            fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n\n        while (++leftIndex < leftLength) {\n          args[leftIndex] = partials[leftIndex];\n        }\n        while (argsLength--) {\n          args[leftIndex++] = arguments[++argsIndex];\n        }\n        return apply(fn, isBind ? thisArg : this, args);\n      }\n      return wrapper;\n    }\n\n    /**\n     * Creates a `_.range` or `_.rangeRight` function.\n     *\n     * @private\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Function} Returns the new range function.\n     */\n    function createRange(fromRight) {\n      return function(start, end, step) {\n        if (step && typeof step != 'number' && isIterateeCall(start, end, step)) {\n          end = step = undefined;\n        }\n        // Ensure the sign of `-0` is preserved.\n        start = toFinite(start);\n        if (end === undefined) {\n          end = start;\n          start = 0;\n        } else {\n          end = toFinite(end);\n        }\n        step = step === undefined ? (start < end ? 1 : -1) : toFinite(step);\n        return baseRange(start, end, step, fromRight);\n      };\n    }\n\n    /**\n     * Creates a function that performs a relational operation on two values.\n     *\n     * @private\n     * @param {Function} operator The function to perform the operation.\n     * @returns {Function} Returns the new relational operation function.\n     */\n    function createRelationalOperation(operator) {\n      return function(value, other) {\n        if (!(typeof value == 'string' && typeof other == 'string')) {\n          value = toNumber(value);\n          other = toNumber(other);\n        }\n        return operator(value, other);\n      };\n    }\n\n    /**\n     * Creates a function that wraps `func` to continue currying.\n     *\n     * @private\n     * @param {Function} func The function to wrap.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @param {Function} wrapFunc The function to create the `func` wrapper.\n     * @param {*} placeholder The placeholder value.\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @param {Array} [partials] The arguments to prepend to those provided to\n     *  the new function.\n     * @param {Array} [holders] The `partials` placeholder indexes.\n     * @param {Array} [argPos] The argument positions of the new function.\n     * @param {number} [ary] The arity cap of `func`.\n     * @param {number} [arity] The arity of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) {\n      var isCurry = bitmask & WRAP_CURRY_FLAG,\n          newHolders = isCurry ? holders : undefined,\n          newHoldersRight = isCurry ? undefined : holders,\n          newPartials = isCurry ? partials : undefined,\n          newPartialsRight = isCurry ? undefined : partials;\n\n      bitmask |= (isCurry ? WRAP_PARTIAL_FLAG : WRAP_PARTIAL_RIGHT_FLAG);\n      bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG : WRAP_PARTIAL_FLAG);\n\n      if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) {\n        bitmask &= ~(WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG);\n      }\n      var newData = [\n        func, bitmask, thisArg, newPartials, newHolders, newPartialsRight,\n        newHoldersRight, argPos, ary, arity\n      ];\n\n      var result = wrapFunc.apply(undefined, newData);\n      if (isLaziable(func)) {\n        setData(result, newData);\n      }\n      result.placeholder = placeholder;\n      return setWrapToString(result, func, bitmask);\n    }\n\n    /**\n     * Creates a function like `_.round`.\n     *\n     * @private\n     * @param {string} methodName The name of the `Math` method to use when rounding.\n     * @returns {Function} Returns the new round function.\n     */\n    function createRound(methodName) {\n      var func = Math[methodName];\n      return function(number, precision) {\n        number = toNumber(number);\n        precision = precision == null ? 0 : nativeMin(toInteger(precision), 292);\n        if (precision && nativeIsFinite(number)) {\n          // Shift with exponential notation to avoid floating-point issues.\n          // See [MDN](https://mdn.io/round#Examples) for more details.\n          var pair = (toString(number) + 'e').split('e'),\n              value = func(pair[0] + 'e' + (+pair[1] + precision));\n\n          pair = (toString(value) + 'e').split('e');\n          return +(pair[0] + 'e' + (+pair[1] - precision));\n        }\n        return func(number);\n      };\n    }\n\n    /**\n     * Creates a set object of `values`.\n     *\n     * @private\n     * @param {Array} values The values to add to the set.\n     * @returns {Object} Returns the new set.\n     */\n    var createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) {\n      return new Set(values);\n    };\n\n    /**\n     * Creates a `_.toPairs` or `_.toPairsIn` function.\n     *\n     * @private\n     * @param {Function} keysFunc The function to get the keys of a given object.\n     * @returns {Function} Returns the new pairs function.\n     */\n    function createToPairs(keysFunc) {\n      return function(object) {\n        var tag = getTag(object);\n        if (tag == mapTag) {\n          return mapToArray(object);\n        }\n        if (tag == setTag) {\n          return setToPairs(object);\n        }\n        return baseToPairs(object, keysFunc(object));\n      };\n    }\n\n    /**\n     * Creates a function that either curries or invokes `func` with optional\n     * `this` binding and partially applied arguments.\n     *\n     * @private\n     * @param {Function|string} func The function or method name to wrap.\n     * @param {number} bitmask The bitmask flags.\n     *    1 - `_.bind`\n     *    2 - `_.bindKey`\n     *    4 - `_.curry` or `_.curryRight` of a bound function\n     *    8 - `_.curry`\n     *   16 - `_.curryRight`\n     *   32 - `_.partial`\n     *   64 - `_.partialRight`\n     *  128 - `_.rearg`\n     *  256 - `_.ary`\n     *  512 - `_.flip`\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @param {Array} [partials] The arguments to be partially applied.\n     * @param {Array} [holders] The `partials` placeholder indexes.\n     * @param {Array} [argPos] The argument positions of the new function.\n     * @param {number} [ary] The arity cap of `func`.\n     * @param {number} [arity] The arity of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {\n      var isBindKey = bitmask & WRAP_BIND_KEY_FLAG;\n      if (!isBindKey && typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      var length = partials ? partials.length : 0;\n      if (!length) {\n        bitmask &= ~(WRAP_PARTIAL_FLAG | WRAP_PARTIAL_RIGHT_FLAG);\n        partials = holders = undefined;\n      }\n      ary = ary === undefined ? ary : nativeMax(toInteger(ary), 0);\n      arity = arity === undefined ? arity : toInteger(arity);\n      length -= holders ? holders.length : 0;\n\n      if (bitmask & WRAP_PARTIAL_RIGHT_FLAG) {\n        var partialsRight = partials,\n            holdersRight = holders;\n\n        partials = holders = undefined;\n      }\n      var data = isBindKey ? undefined : getData(func);\n\n      var newData = [\n        func, bitmask, thisArg, partials, holders, partialsRight, holdersRight,\n        argPos, ary, arity\n      ];\n\n      if (data) {\n        mergeData(newData, data);\n      }\n      func = newData[0];\n      bitmask = newData[1];\n      thisArg = newData[2];\n      partials = newData[3];\n      holders = newData[4];\n      arity = newData[9] = newData[9] === undefined\n        ? (isBindKey ? 0 : func.length)\n        : nativeMax(newData[9] - length, 0);\n\n      if (!arity && bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG)) {\n        bitmask &= ~(WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG);\n      }\n      if (!bitmask || bitmask == WRAP_BIND_FLAG) {\n        var result = createBind(func, bitmask, thisArg);\n      } else if (bitmask == WRAP_CURRY_FLAG || bitmask == WRAP_CURRY_RIGHT_FLAG) {\n        result = createCurry(func, bitmask, arity);\n      } else if ((bitmask == WRAP_PARTIAL_FLAG || bitmask == (WRAP_BIND_FLAG | WRAP_PARTIAL_FLAG)) && !holders.length) {\n        result = createPartial(func, bitmask, thisArg, partials);\n      } else {\n        result = createHybrid.apply(undefined, newData);\n      }\n      var setter = data ? baseSetData : setData;\n      return setWrapToString(setter(result, newData), func, bitmask);\n    }\n\n    /**\n     * Used by `_.defaults` to customize its `_.assignIn` use to assign properties\n     * of source objects to the destination object for all destination properties\n     * that resolve to `undefined`.\n     *\n     * @private\n     * @param {*} objValue The destination value.\n     * @param {*} srcValue The source value.\n     * @param {string} key The key of the property to assign.\n     * @param {Object} object The parent object of `objValue`.\n     * @returns {*} Returns the value to assign.\n     */\n    function customDefaultsAssignIn(objValue, srcValue, key, object) {\n      if (objValue === undefined ||\n          (eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key))) {\n        return srcValue;\n      }\n      return objValue;\n    }\n\n    /**\n     * Used by `_.defaultsDeep` to customize its `_.merge` use to merge source\n     * objects into destination objects that are passed thru.\n     *\n     * @private\n     * @param {*} objValue The destination value.\n     * @param {*} srcValue The source value.\n     * @param {string} key The key of the property to merge.\n     * @param {Object} object The parent object of `objValue`.\n     * @param {Object} source The parent object of `srcValue`.\n     * @param {Object} [stack] Tracks traversed source values and their merged\n     *  counterparts.\n     * @returns {*} Returns the value to assign.\n     */\n    function customDefaultsMerge(objValue, srcValue, key, object, source, stack) {\n      if (isObject(objValue) && isObject(srcValue)) {\n        // Recursively merge objects and arrays (susceptible to call stack limits).\n        stack.set(srcValue, objValue);\n        baseMerge(objValue, srcValue, undefined, customDefaultsMerge, stack);\n        stack['delete'](srcValue);\n      }\n      return objValue;\n    }\n\n    /**\n     * Used by `_.omit` to customize its `_.cloneDeep` use to only clone plain\n     * objects.\n     *\n     * @private\n     * @param {*} value The value to inspect.\n     * @param {string} key The key of the property to inspect.\n     * @returns {*} Returns the uncloned value or `undefined` to defer cloning to `_.cloneDeep`.\n     */\n    function customOmitClone(value) {\n      return isPlainObject(value) ? undefined : value;\n    }\n\n    /**\n     * A specialized version of `baseIsEqualDeep` for arrays with support for\n     * partial deep comparisons.\n     *\n     * @private\n     * @param {Array} array The array to compare.\n     * @param {Array} other The other array to compare.\n     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n     * @param {Function} customizer The function to customize comparisons.\n     * @param {Function} equalFunc The function to determine equivalents of values.\n     * @param {Object} stack Tracks traversed `array` and `other` objects.\n     * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\n     */\n    function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {\n      var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n          arrLength = array.length,\n          othLength = other.length;\n\n      if (arrLength != othLength && !(isPartial && othLength > arrLength)) {\n        return false;\n      }\n      // Check that cyclic values are equal.\n      var arrStacked = stack.get(array);\n      var othStacked = stack.get(other);\n      if (arrStacked && othStacked) {\n        return arrStacked == other && othStacked == array;\n      }\n      var index = -1,\n          result = true,\n          seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;\n\n      stack.set(array, other);\n      stack.set(other, array);\n\n      // Ignore non-index properties.\n      while (++index < arrLength) {\n        var arrValue = array[index],\n            othValue = other[index];\n\n        if (customizer) {\n          var compared = isPartial\n            ? customizer(othValue, arrValue, index, other, array, stack)\n            : customizer(arrValue, othValue, index, array, other, stack);\n        }\n        if (compared !== undefined) {\n          if (compared) {\n            continue;\n          }\n          result = false;\n          break;\n        }\n        // Recursively compare arrays (susceptible to call stack limits).\n        if (seen) {\n          if (!arraySome(other, function(othValue, othIndex) {\n                if (!cacheHas(seen, othIndex) &&\n                    (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {\n                  return seen.push(othIndex);\n                }\n              })) {\n            result = false;\n            break;\n          }\n        } else if (!(\n              arrValue === othValue ||\n                equalFunc(arrValue, othValue, bitmask, customizer, stack)\n            )) {\n          result = false;\n          break;\n        }\n      }\n      stack['delete'](array);\n      stack['delete'](other);\n      return result;\n    }\n\n    /**\n     * A specialized version of `baseIsEqualDeep` for comparing objects of\n     * the same `toStringTag`.\n     *\n     * **Note:** This function only supports comparing values with tags of\n     * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n     *\n     * @private\n     * @param {Object} object The object to compare.\n     * @param {Object} other The other object to compare.\n     * @param {string} tag The `toStringTag` of the objects to compare.\n     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n     * @param {Function} customizer The function to customize comparisons.\n     * @param {Function} equalFunc The function to determine equivalents of values.\n     * @param {Object} stack Tracks traversed `object` and `other` objects.\n     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n     */\n    function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {\n      switch (tag) {\n        case dataViewTag:\n          if ((object.byteLength != other.byteLength) ||\n              (object.byteOffset != other.byteOffset)) {\n            return false;\n          }\n          object = object.buffer;\n          other = other.buffer;\n\n        case arrayBufferTag:\n          if ((object.byteLength != other.byteLength) ||\n              !equalFunc(new Uint8Array(object), new Uint8Array(other))) {\n            return false;\n          }\n          return true;\n\n        case boolTag:\n        case dateTag:\n        case numberTag:\n          // Coerce booleans to `1` or `0` and dates to milliseconds.\n          // Invalid dates are coerced to `NaN`.\n          return eq(+object, +other);\n\n        case errorTag:\n          return object.name == other.name && object.message == other.message;\n\n        case regexpTag:\n        case stringTag:\n          // Coerce regexes to strings and treat strings, primitives and objects,\n          // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring\n          // for more details.\n          return object == (other + '');\n\n        case mapTag:\n          var convert = mapToArray;\n\n        case setTag:\n          var isPartial = bitmask & COMPARE_PARTIAL_FLAG;\n          convert || (convert = setToArray);\n\n          if (object.size != other.size && !isPartial) {\n            return false;\n          }\n          // Assume cyclic values are equal.\n          var stacked = stack.get(object);\n          if (stacked) {\n            return stacked == other;\n          }\n          bitmask |= COMPARE_UNORDERED_FLAG;\n\n          // Recursively compare objects (susceptible to call stack limits).\n          stack.set(object, other);\n          var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);\n          stack['delete'](object);\n          return result;\n\n        case symbolTag:\n          if (symbolValueOf) {\n            return symbolValueOf.call(object) == symbolValueOf.call(other);\n          }\n      }\n      return false;\n    }\n\n    /**\n     * A specialized version of `baseIsEqualDeep` for objects with support for\n     * partial deep comparisons.\n     *\n     * @private\n     * @param {Object} object The object to compare.\n     * @param {Object} other The other object to compare.\n     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n     * @param {Function} customizer The function to customize comparisons.\n     * @param {Function} equalFunc The function to determine equivalents of values.\n     * @param {Object} stack Tracks traversed `object` and `other` objects.\n     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n     */\n    function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {\n      var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n          objProps = getAllKeys(object),\n          objLength = objProps.length,\n          othProps = getAllKeys(other),\n          othLength = othProps.length;\n\n      if (objLength != othLength && !isPartial) {\n        return false;\n      }\n      var index = objLength;\n      while (index--) {\n        var key = objProps[index];\n        if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {\n          return false;\n        }\n      }\n      // Check that cyclic values are equal.\n      var objStacked = stack.get(object);\n      var othStacked = stack.get(other);\n      if (objStacked && othStacked) {\n        return objStacked == other && othStacked == object;\n      }\n      var result = true;\n      stack.set(object, other);\n      stack.set(other, object);\n\n      var skipCtor = isPartial;\n      while (++index < objLength) {\n        key = objProps[index];\n        var objValue = object[key],\n            othValue = other[key];\n\n        if (customizer) {\n          var compared = isPartial\n            ? customizer(othValue, objValue, key, other, object, stack)\n            : customizer(objValue, othValue, key, object, other, stack);\n        }\n        // Recursively compare objects (susceptible to call stack limits).\n        if (!(compared === undefined\n              ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))\n              : compared\n            )) {\n          result = false;\n          break;\n        }\n        skipCtor || (skipCtor = key == 'constructor');\n      }\n      if (result && !skipCtor) {\n        var objCtor = object.constructor,\n            othCtor = other.constructor;\n\n        // Non `Object` object instances with different constructors are not equal.\n        if (objCtor != othCtor &&\n            ('constructor' in object && 'constructor' in other) &&\n            !(typeof objCtor == 'function' && objCtor instanceof objCtor &&\n              typeof othCtor == 'function' && othCtor instanceof othCtor)) {\n          result = false;\n        }\n      }\n      stack['delete'](object);\n      stack['delete'](other);\n      return result;\n    }\n\n    /**\n     * A specialized version of `baseRest` which flattens the rest array.\n     *\n     * @private\n     * @param {Function} func The function to apply a rest parameter to.\n     * @returns {Function} Returns the new function.\n     */\n    function flatRest(func) {\n      return setToString(overRest(func, undefined, flatten), func + '');\n    }\n\n    /**\n     * Creates an array of own enumerable property names and symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names and symbols.\n     */\n    function getAllKeys(object) {\n      return baseGetAllKeys(object, keys, getSymbols);\n    }\n\n    /**\n     * Creates an array of own and inherited enumerable property names and\n     * symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names and symbols.\n     */\n    function getAllKeysIn(object) {\n      return baseGetAllKeys(object, keysIn, getSymbolsIn);\n    }\n\n    /**\n     * Gets metadata for `func`.\n     *\n     * @private\n     * @param {Function} func The function to query.\n     * @returns {*} Returns the metadata for `func`.\n     */\n    var getData = !metaMap ? noop : function(func) {\n      return metaMap.get(func);\n    };\n\n    /**\n     * Gets the name of `func`.\n     *\n     * @private\n     * @param {Function} func The function to query.\n     * @returns {string} Returns the function name.\n     */\n    function getFuncName(func) {\n      var result = (func.name + ''),\n          array = realNames[result],\n          length = hasOwnProperty.call(realNames, result) ? array.length : 0;\n\n      while (length--) {\n        var data = array[length],\n            otherFunc = data.func;\n        if (otherFunc == null || otherFunc == func) {\n          return data.name;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Gets the argument placeholder value for `func`.\n     *\n     * @private\n     * @param {Function} func The function to inspect.\n     * @returns {*} Returns the placeholder value.\n     */\n    function getHolder(func) {\n      var object = hasOwnProperty.call(lodash, 'placeholder') ? lodash : func;\n      return object.placeholder;\n    }\n\n    /**\n     * Gets the appropriate \"iteratee\" function. If `_.iteratee` is customized,\n     * this function returns the custom method, otherwise it returns `baseIteratee`.\n     * If arguments are provided, the chosen function is invoked with them and\n     * its result is returned.\n     *\n     * @private\n     * @param {*} [value] The value to convert to an iteratee.\n     * @param {number} [arity] The arity of the created iteratee.\n     * @returns {Function} Returns the chosen function or its result.\n     */\n    function getIteratee() {\n      var result = lodash.iteratee || iteratee;\n      result = result === iteratee ? baseIteratee : result;\n      return arguments.length ? result(arguments[0], arguments[1]) : result;\n    }\n\n    /**\n     * Gets the data for `map`.\n     *\n     * @private\n     * @param {Object} map The map to query.\n     * @param {string} key The reference key.\n     * @returns {*} Returns the map data.\n     */\n    function getMapData(map, key) {\n      var data = map.__data__;\n      return isKeyable(key)\n        ? data[typeof key == 'string' ? 'string' : 'hash']\n        : data.map;\n    }\n\n    /**\n     * Gets the property names, values, and compare flags of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the match data of `object`.\n     */\n    function getMatchData(object) {\n      var result = keys(object),\n          length = result.length;\n\n      while (length--) {\n        var key = result[length],\n            value = object[key];\n\n        result[length] = [key, value, isStrictComparable(value)];\n      }\n      return result;\n    }\n\n    /**\n     * Gets the native function at `key` of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {string} key The key of the method to get.\n     * @returns {*} Returns the function if it's native, else `undefined`.\n     */\n    function getNative(object, key) {\n      var value = getValue(object, key);\n      return baseIsNative(value) ? value : undefined;\n    }\n\n    /**\n     * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n     *\n     * @private\n     * @param {*} value The value to query.\n     * @returns {string} Returns the raw `toStringTag`.\n     */\n    function getRawTag(value) {\n      var isOwn = hasOwnProperty.call(value, symToStringTag),\n          tag = value[symToStringTag];\n\n      try {\n        value[symToStringTag] = undefined;\n        var unmasked = true;\n      } catch (e) {}\n\n      var result = nativeObjectToString.call(value);\n      if (unmasked) {\n        if (isOwn) {\n          value[symToStringTag] = tag;\n        } else {\n          delete value[symToStringTag];\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Creates an array of the own enumerable symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of symbols.\n     */\n    var getSymbols = !nativeGetSymbols ? stubArray : function(object) {\n      if (object == null) {\n        return [];\n      }\n      object = Object(object);\n      return arrayFilter(nativeGetSymbols(object), function(symbol) {\n        return propertyIsEnumerable.call(object, symbol);\n      });\n    };\n\n    /**\n     * Creates an array of the own and inherited enumerable symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of symbols.\n     */\n    var getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) {\n      var result = [];\n      while (object) {\n        arrayPush(result, getSymbols(object));\n        object = getPrototype(object);\n      }\n      return result;\n    };\n\n    /**\n     * Gets the `toStringTag` of `value`.\n     *\n     * @private\n     * @param {*} value The value to query.\n     * @returns {string} Returns the `toStringTag`.\n     */\n    var getTag = baseGetTag;\n\n    // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\n    if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n        (Map && getTag(new Map) != mapTag) ||\n        (Promise && getTag(Promise.resolve()) != promiseTag) ||\n        (Set && getTag(new Set) != setTag) ||\n        (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n      getTag = function(value) {\n        var result = baseGetTag(value),\n            Ctor = result == objectTag ? value.constructor : undefined,\n            ctorString = Ctor ? toSource(Ctor) : '';\n\n        if (ctorString) {\n          switch (ctorString) {\n            case dataViewCtorString: return dataViewTag;\n            case mapCtorString: return mapTag;\n            case promiseCtorString: return promiseTag;\n            case setCtorString: return setTag;\n            case weakMapCtorString: return weakMapTag;\n          }\n        }\n        return result;\n      };\n    }\n\n    /**\n     * Gets the view, applying any `transforms` to the `start` and `end` positions.\n     *\n     * @private\n     * @param {number} start The start of the view.\n     * @param {number} end The end of the view.\n     * @param {Array} transforms The transformations to apply to the view.\n     * @returns {Object} Returns an object containing the `start` and `end`\n     *  positions of the view.\n     */\n    function getView(start, end, transforms) {\n      var index = -1,\n          length = transforms.length;\n\n      while (++index < length) {\n        var data = transforms[index],\n            size = data.size;\n\n        switch (data.type) {\n          case 'drop':      start += size; break;\n          case 'dropRight': end -= size; break;\n          case 'take':      end = nativeMin(end, start + size); break;\n          case 'takeRight': start = nativeMax(start, end - size); break;\n        }\n      }\n      return { 'start': start, 'end': end };\n    }\n\n    /**\n     * Extracts wrapper details from the `source` body comment.\n     *\n     * @private\n     * @param {string} source The source to inspect.\n     * @returns {Array} Returns the wrapper details.\n     */\n    function getWrapDetails(source) {\n      var match = source.match(reWrapDetails);\n      return match ? match[1].split(reSplitDetails) : [];\n    }\n\n    /**\n     * Checks if `path` exists on `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path to check.\n     * @param {Function} hasFunc The function to check properties.\n     * @returns {boolean} Returns `true` if `path` exists, else `false`.\n     */\n    function hasPath(object, path, hasFunc) {\n      path = castPath(path, object);\n\n      var index = -1,\n          length = path.length,\n          result = false;\n\n      while (++index < length) {\n        var key = toKey(path[index]);\n        if (!(result = object != null && hasFunc(object, key))) {\n          break;\n        }\n        object = object[key];\n      }\n      if (result || ++index != length) {\n        return result;\n      }\n      length = object == null ? 0 : object.length;\n      return !!length && isLength(length) && isIndex(key, length) &&\n        (isArray(object) || isArguments(object));\n    }\n\n    /**\n     * Initializes an array clone.\n     *\n     * @private\n     * @param {Array} array The array to clone.\n     * @returns {Array} Returns the initialized clone.\n     */\n    function initCloneArray(array) {\n      var length = array.length,\n          result = new array.constructor(length);\n\n      // Add properties assigned by `RegExp#exec`.\n      if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {\n        result.index = array.index;\n        result.input = array.input;\n      }\n      return result;\n    }\n\n    /**\n     * Initializes an object clone.\n     *\n     * @private\n     * @param {Object} object The object to clone.\n     * @returns {Object} Returns the initialized clone.\n     */\n    function initCloneObject(object) {\n      return (typeof object.constructor == 'function' && !isPrototype(object))\n        ? baseCreate(getPrototype(object))\n        : {};\n    }\n\n    /**\n     * Initializes an object clone based on its `toStringTag`.\n     *\n     * **Note:** This function only supports cloning values with tags of\n     * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`.\n     *\n     * @private\n     * @param {Object} object The object to clone.\n     * @param {string} tag The `toStringTag` of the object to clone.\n     * @param {boolean} [isDeep] Specify a deep clone.\n     * @returns {Object} Returns the initialized clone.\n     */\n    function initCloneByTag(object, tag, isDeep) {\n      var Ctor = object.constructor;\n      switch (tag) {\n        case arrayBufferTag:\n          return cloneArrayBuffer(object);\n\n        case boolTag:\n        case dateTag:\n          return new Ctor(+object);\n\n        case dataViewTag:\n          return cloneDataView(object, isDeep);\n\n        case float32Tag: case float64Tag:\n        case int8Tag: case int16Tag: case int32Tag:\n        case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:\n          return cloneTypedArray(object, isDeep);\n\n        case mapTag:\n          return new Ctor;\n\n        case numberTag:\n        case stringTag:\n          return new Ctor(object);\n\n        case regexpTag:\n          return cloneRegExp(object);\n\n        case setTag:\n          return new Ctor;\n\n        case symbolTag:\n          return cloneSymbol(object);\n      }\n    }\n\n    /**\n     * Inserts wrapper `details` in a comment at the top of the `source` body.\n     *\n     * @private\n     * @param {string} source The source to modify.\n     * @returns {Array} details The details to insert.\n     * @returns {string} Returns the modified source.\n     */\n    function insertWrapDetails(source, details) {\n      var length = details.length;\n      if (!length) {\n        return source;\n      }\n      var lastIndex = length - 1;\n      details[lastIndex] = (length > 1 ? '& ' : '') + details[lastIndex];\n      details = details.join(length > 2 ? ', ' : ' ');\n      return source.replace(reWrapComment, '{\\n/* [wrapped with ' + details + '] */\\n');\n    }\n\n    /**\n     * Checks if `value` is a flattenable `arguments` object or array.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.\n     */\n    function isFlattenable(value) {\n      return isArray(value) || isArguments(value) ||\n        !!(spreadableSymbol && value && value[spreadableSymbol]);\n    }\n\n    /**\n     * Checks if `value` is a valid array-like index.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n     * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n     */\n    function isIndex(value, length) {\n      var type = typeof value;\n      length = length == null ? MAX_SAFE_INTEGER : length;\n\n      return !!length &&\n        (type == 'number' ||\n          (type != 'symbol' && reIsUint.test(value))) &&\n            (value > -1 && value % 1 == 0 && value < length);\n    }\n\n    /**\n     * Checks if the given arguments are from an iteratee call.\n     *\n     * @private\n     * @param {*} value The potential iteratee value argument.\n     * @param {*} index The potential iteratee index or key argument.\n     * @param {*} object The potential iteratee object argument.\n     * @returns {boolean} Returns `true` if the arguments are from an iteratee call,\n     *  else `false`.\n     */\n    function isIterateeCall(value, index, object) {\n      if (!isObject(object)) {\n        return false;\n      }\n      var type = typeof index;\n      if (type == 'number'\n            ? (isArrayLike(object) && isIndex(index, object.length))\n            : (type == 'string' && index in object)\n          ) {\n        return eq(object[index], value);\n      }\n      return false;\n    }\n\n    /**\n     * Checks if `value` is a property name and not a property path.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @param {Object} [object] The object to query keys on.\n     * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n     */\n    function isKey(value, object) {\n      if (isArray(value)) {\n        return false;\n      }\n      var type = typeof value;\n      if (type == 'number' || type == 'symbol' || type == 'boolean' ||\n          value == null || isSymbol(value)) {\n        return true;\n      }\n      return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n        (object != null && value in Object(object));\n    }\n\n    /**\n     * Checks if `value` is suitable for use as unique object key.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n     */\n    function isKeyable(value) {\n      var type = typeof value;\n      return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n        ? (value !== '__proto__')\n        : (value === null);\n    }\n\n    /**\n     * Checks if `func` has a lazy counterpart.\n     *\n     * @private\n     * @param {Function} func The function to check.\n     * @returns {boolean} Returns `true` if `func` has a lazy counterpart,\n     *  else `false`.\n     */\n    function isLaziable(func) {\n      var funcName = getFuncName(func),\n          other = lodash[funcName];\n\n      if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) {\n        return false;\n      }\n      if (func === other) {\n        return true;\n      }\n      var data = getData(other);\n      return !!data && func === data[0];\n    }\n\n    /**\n     * Checks if `func` has its source masked.\n     *\n     * @private\n     * @param {Function} func The function to check.\n     * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n     */\n    function isMasked(func) {\n      return !!maskSrcKey && (maskSrcKey in func);\n    }\n\n    /**\n     * Checks if `func` is capable of being masked.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `func` is maskable, else `false`.\n     */\n    var isMaskable = coreJsData ? isFunction : stubFalse;\n\n    /**\n     * Checks if `value` is likely a prototype object.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n     */\n    function isPrototype(value) {\n      var Ctor = value && value.constructor,\n          proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n      return value === proto;\n    }\n\n    /**\n     * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` if suitable for strict\n     *  equality comparisons, else `false`.\n     */\n    function isStrictComparable(value) {\n      return value === value && !isObject(value);\n    }\n\n    /**\n     * A specialized version of `matchesProperty` for source values suitable\n     * for strict equality comparisons, i.e. `===`.\n     *\n     * @private\n     * @param {string} key The key of the property to get.\n     * @param {*} srcValue The value to match.\n     * @returns {Function} Returns the new spec function.\n     */\n    function matchesStrictComparable(key, srcValue) {\n      return function(object) {\n        if (object == null) {\n          return false;\n        }\n        return object[key] === srcValue &&\n          (srcValue !== undefined || (key in Object(object)));\n      };\n    }\n\n    /**\n     * A specialized version of `_.memoize` which clears the memoized function's\n     * cache when it exceeds `MAX_MEMOIZE_SIZE`.\n     *\n     * @private\n     * @param {Function} func The function to have its output memoized.\n     * @returns {Function} Returns the new memoized function.\n     */\n    function memoizeCapped(func) {\n      var result = memoize(func, function(key) {\n        if (cache.size === MAX_MEMOIZE_SIZE) {\n          cache.clear();\n        }\n        return key;\n      });\n\n      var cache = result.cache;\n      return result;\n    }\n\n    /**\n     * Merges the function metadata of `source` into `data`.\n     *\n     * Merging metadata reduces the number of wrappers used to invoke a function.\n     * This is possible because methods like `_.bind`, `_.curry`, and `_.partial`\n     * may be applied regardless of execution order. Methods like `_.ary` and\n     * `_.rearg` modify function arguments, making the order in which they are\n     * executed important, preventing the merging of metadata. However, we make\n     * an exception for a safe combined case where curried functions have `_.ary`\n     * and or `_.rearg` applied.\n     *\n     * @private\n     * @param {Array} data The destination metadata.\n     * @param {Array} source The source metadata.\n     * @returns {Array} Returns `data`.\n     */\n    function mergeData(data, source) {\n      var bitmask = data[1],\n          srcBitmask = source[1],\n          newBitmask = bitmask | srcBitmask,\n          isCommon = newBitmask < (WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG | WRAP_ARY_FLAG);\n\n      var isCombo =\n        ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_CURRY_FLAG)) ||\n        ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_REARG_FLAG) && (data[7].length <= source[8])) ||\n        ((srcBitmask == (WRAP_ARY_FLAG | WRAP_REARG_FLAG)) && (source[7].length <= source[8]) && (bitmask == WRAP_CURRY_FLAG));\n\n      // Exit early if metadata can't be merged.\n      if (!(isCommon || isCombo)) {\n        return data;\n      }\n      // Use source `thisArg` if available.\n      if (srcBitmask & WRAP_BIND_FLAG) {\n        data[2] = source[2];\n        // Set when currying a bound function.\n        newBitmask |= bitmask & WRAP_BIND_FLAG ? 0 : WRAP_CURRY_BOUND_FLAG;\n      }\n      // Compose partial arguments.\n      var value = source[3];\n      if (value) {\n        var partials = data[3];\n        data[3] = partials ? composeArgs(partials, value, source[4]) : value;\n        data[4] = partials ? replaceHolders(data[3], PLACEHOLDER) : source[4];\n      }\n      // Compose partial right arguments.\n      value = source[5];\n      if (value) {\n        partials = data[5];\n        data[5] = partials ? composeArgsRight(partials, value, source[6]) : value;\n        data[6] = partials ? replaceHolders(data[5], PLACEHOLDER) : source[6];\n      }\n      // Use source `argPos` if available.\n      value = source[7];\n      if (value) {\n        data[7] = value;\n      }\n      // Use source `ary` if it's smaller.\n      if (srcBitmask & WRAP_ARY_FLAG) {\n        data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]);\n      }\n      // Use source `arity` if one is not provided.\n      if (data[9] == null) {\n        data[9] = source[9];\n      }\n      // Use source `func` and merge bitmasks.\n      data[0] = source[0];\n      data[1] = newBitmask;\n\n      return data;\n    }\n\n    /**\n     * This function is like\n     * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n     * except that it includes inherited enumerable properties.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     */\n    function nativeKeysIn(object) {\n      var result = [];\n      if (object != null) {\n        for (var key in Object(object)) {\n          result.push(key);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Converts `value` to a string using `Object.prototype.toString`.\n     *\n     * @private\n     * @param {*} value The value to convert.\n     * @returns {string} Returns the converted string.\n     */\n    function objectToString(value) {\n      return nativeObjectToString.call(value);\n    }\n\n    /**\n     * A specialized version of `baseRest` which transforms the rest array.\n     *\n     * @private\n     * @param {Function} func The function to apply a rest parameter to.\n     * @param {number} [start=func.length-1] The start position of the rest parameter.\n     * @param {Function} transform The rest array transform.\n     * @returns {Function} Returns the new function.\n     */\n    function overRest(func, start, transform) {\n      start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\n      return function() {\n        var args = arguments,\n            index = -1,\n            length = nativeMax(args.length - start, 0),\n            array = Array(length);\n\n        while (++index < length) {\n          array[index] = args[start + index];\n        }\n        index = -1;\n        var otherArgs = Array(start + 1);\n        while (++index < start) {\n          otherArgs[index] = args[index];\n        }\n        otherArgs[start] = transform(array);\n        return apply(func, this, otherArgs);\n      };\n    }\n\n    /**\n     * Gets the parent value at `path` of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Array} path The path to get the parent value of.\n     * @returns {*} Returns the parent value.\n     */\n    function parent(object, path) {\n      return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1));\n    }\n\n    /**\n     * Reorder `array` according to the specified indexes where the element at\n     * the first index is assigned as the first element, the element at\n     * the second index is assigned as the second element, and so on.\n     *\n     * @private\n     * @param {Array} array The array to reorder.\n     * @param {Array} indexes The arranged array indexes.\n     * @returns {Array} Returns `array`.\n     */\n    function reorder(array, indexes) {\n      var arrLength = array.length,\n          length = nativeMin(indexes.length, arrLength),\n          oldArray = copyArray(array);\n\n      while (length--) {\n        var index = indexes[length];\n        array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined;\n      }\n      return array;\n    }\n\n    /**\n     * Gets the value at `key`, unless `key` is \"__proto__\" or \"constructor\".\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {string} key The key of the property to get.\n     * @returns {*} Returns the property value.\n     */\n    function safeGet(object, key) {\n      if (key === 'constructor' && typeof object[key] === 'function') {\n        return;\n      }\n\n      if (key == '__proto__') {\n        return;\n      }\n\n      return object[key];\n    }\n\n    /**\n     * Sets metadata for `func`.\n     *\n     * **Note:** If this function becomes hot, i.e. is invoked a lot in a short\n     * period of time, it will trip its breaker and transition to an identity\n     * function to avoid garbage collection pauses in V8. See\n     * [V8 issue 2070](https://bugs.chromium.org/p/v8/issues/detail?id=2070)\n     * for more details.\n     *\n     * @private\n     * @param {Function} func The function to associate metadata with.\n     * @param {*} data The metadata.\n     * @returns {Function} Returns `func`.\n     */\n    var setData = shortOut(baseSetData);\n\n    /**\n     * A simple wrapper around the global [`setTimeout`](https://mdn.io/setTimeout).\n     *\n     * @private\n     * @param {Function} func The function to delay.\n     * @param {number} wait The number of milliseconds to delay invocation.\n     * @returns {number|Object} Returns the timer id or timeout object.\n     */\n    var setTimeout = ctxSetTimeout || function(func, wait) {\n      return root.setTimeout(func, wait);\n    };\n\n    /**\n     * Sets the `toString` method of `func` to return `string`.\n     *\n     * @private\n     * @param {Function} func The function to modify.\n     * @param {Function} string The `toString` result.\n     * @returns {Function} Returns `func`.\n     */\n    var setToString = shortOut(baseSetToString);\n\n    /**\n     * Sets the `toString` method of `wrapper` to mimic the source of `reference`\n     * with wrapper details in a comment at the top of the source body.\n     *\n     * @private\n     * @param {Function} wrapper The function to modify.\n     * @param {Function} reference The reference function.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @returns {Function} Returns `wrapper`.\n     */\n    function setWrapToString(wrapper, reference, bitmask) {\n      var source = (reference + '');\n      return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask)));\n    }\n\n    /**\n     * Creates a function that'll short out and invoke `identity` instead\n     * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`\n     * milliseconds.\n     *\n     * @private\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new shortable function.\n     */\n    function shortOut(func) {\n      var count = 0,\n          lastCalled = 0;\n\n      return function() {\n        var stamp = nativeNow(),\n            remaining = HOT_SPAN - (stamp - lastCalled);\n\n        lastCalled = stamp;\n        if (remaining > 0) {\n          if (++count >= HOT_COUNT) {\n            return arguments[0];\n          }\n        } else {\n          count = 0;\n        }\n        return func.apply(undefined, arguments);\n      };\n    }\n\n    /**\n     * A specialized version of `_.shuffle` which mutates and sets the size of `array`.\n     *\n     * @private\n     * @param {Array} array The array to shuffle.\n     * @param {number} [size=array.length] The size of `array`.\n     * @returns {Array} Returns `array`.\n     */\n    function shuffleSelf(array, size) {\n      var index = -1,\n          length = array.length,\n          lastIndex = length - 1;\n\n      size = size === undefined ? length : size;\n      while (++index < size) {\n        var rand = baseRandom(index, lastIndex),\n            value = array[rand];\n\n        array[rand] = array[index];\n        array[index] = value;\n      }\n      array.length = size;\n      return array;\n    }\n\n    /**\n     * Converts `string` to a property path array.\n     *\n     * @private\n     * @param {string} string The string to convert.\n     * @returns {Array} Returns the property path array.\n     */\n    var stringToPath = memoizeCapped(function(string) {\n      var result = [];\n      if (string.charCodeAt(0) === 46 /* . */) {\n        result.push('');\n      }\n      string.replace(rePropName, function(match, number, quote, subString) {\n        result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));\n      });\n      return result;\n    });\n\n    /**\n     * Converts `value` to a string key if it's not a string or symbol.\n     *\n     * @private\n     * @param {*} value The value to inspect.\n     * @returns {string|symbol} Returns the key.\n     */\n    function toKey(value) {\n      if (typeof value == 'string' || isSymbol(value)) {\n        return value;\n      }\n      var result = (value + '');\n      return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n    }\n\n    /**\n     * Converts `func` to its source code.\n     *\n     * @private\n     * @param {Function} func The function to convert.\n     * @returns {string} Returns the source code.\n     */\n    function toSource(func) {\n      if (func != null) {\n        try {\n          return funcToString.call(func);\n        } catch (e) {}\n        try {\n          return (func + '');\n        } catch (e) {}\n      }\n      return '';\n    }\n\n    /**\n     * Updates wrapper `details` based on `bitmask` flags.\n     *\n     * @private\n     * @returns {Array} details The details to modify.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @returns {Array} Returns `details`.\n     */\n    function updateWrapDetails(details, bitmask) {\n      arrayEach(wrapFlags, function(pair) {\n        var value = '_.' + pair[0];\n        if ((bitmask & pair[1]) && !arrayIncludes(details, value)) {\n          details.push(value);\n        }\n      });\n      return details.sort();\n    }\n\n    /**\n     * Creates a clone of `wrapper`.\n     *\n     * @private\n     * @param {Object} wrapper The wrapper to clone.\n     * @returns {Object} Returns the cloned wrapper.\n     */\n    function wrapperClone(wrapper) {\n      if (wrapper instanceof LazyWrapper) {\n        return wrapper.clone();\n      }\n      var result = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__);\n      result.__actions__ = copyArray(wrapper.__actions__);\n      result.__index__  = wrapper.__index__;\n      result.__values__ = wrapper.__values__;\n      return result;\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates an array of elements split into groups the length of `size`.\n     * If `array` can't be split evenly, the final chunk will be the remaining\n     * elements.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to process.\n     * @param {number} [size=1] The length of each chunk\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the new array of chunks.\n     * @example\n     *\n     * _.chunk(['a', 'b', 'c', 'd'], 2);\n     * // => [['a', 'b'], ['c', 'd']]\n     *\n     * _.chunk(['a', 'b', 'c', 'd'], 3);\n     * // => [['a', 'b', 'c'], ['d']]\n     */\n    function chunk(array, size, guard) {\n      if ((guard ? isIterateeCall(array, size, guard) : size === undefined)) {\n        size = 1;\n      } else {\n        size = nativeMax(toInteger(size), 0);\n      }\n      var length = array == null ? 0 : array.length;\n      if (!length || size < 1) {\n        return [];\n      }\n      var index = 0,\n          resIndex = 0,\n          result = Array(nativeCeil(length / size));\n\n      while (index < length) {\n        result[resIndex++] = baseSlice(array, index, (index += size));\n      }\n      return result;\n    }\n\n    /**\n     * Creates an array with all falsey values removed. The values `false`, `null`,\n     * `0`, `\"\"`, `undefined`, and `NaN` are falsey.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to compact.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * _.compact([0, 1, false, 2, '', 3]);\n     * // => [1, 2, 3]\n     */\n    function compact(array) {\n      var index = -1,\n          length = array == null ? 0 : array.length,\n          resIndex = 0,\n          result = [];\n\n      while (++index < length) {\n        var value = array[index];\n        if (value) {\n          result[resIndex++] = value;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Creates a new array concatenating `array` with any additional arrays\n     * and/or values.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to concatenate.\n     * @param {...*} [values] The values to concatenate.\n     * @returns {Array} Returns the new concatenated array.\n     * @example\n     *\n     * var array = [1];\n     * var other = _.concat(array, 2, [3], [[4]]);\n     *\n     * console.log(other);\n     * // => [1, 2, 3, [4]]\n     *\n     * console.log(array);\n     * // => [1]\n     */\n    function concat() {\n      var length = arguments.length;\n      if (!length) {\n        return [];\n      }\n      var args = Array(length - 1),\n          array = arguments[0],\n          index = length;\n\n      while (index--) {\n        args[index - 1] = arguments[index];\n      }\n      return arrayPush(isArray(array) ? copyArray(array) : [array], baseFlatten(args, 1));\n    }\n\n    /**\n     * Creates an array of `array` values not included in the other given arrays\n     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons. The order and references of result values are\n     * determined by the first array.\n     *\n     * **Note:** Unlike `_.pullAll`, this method returns a new array.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {...Array} [values] The values to exclude.\n     * @returns {Array} Returns the new array of filtered values.\n     * @see _.without, _.xor\n     * @example\n     *\n     * _.difference([2, 1], [2, 3]);\n     * // => [1]\n     */\n    var difference = baseRest(function(array, values) {\n      return isArrayLikeObject(array)\n        ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true))\n        : [];\n    });\n\n    /**\n     * This method is like `_.difference` except that it accepts `iteratee` which\n     * is invoked for each element of `array` and `values` to generate the criterion\n     * by which they're compared. The order and references of result values are\n     * determined by the first array. The iteratee is invoked with one argument:\n     * (value).\n     *\n     * **Note:** Unlike `_.pullAllBy`, this method returns a new array.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {...Array} [values] The values to exclude.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * _.differenceBy([2.1, 1.2], [2.3, 3.4], Math.floor);\n     * // => [1.2]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.differenceBy([{ 'x': 2 }, { 'x': 1 }], [{ 'x': 1 }], 'x');\n     * // => [{ 'x': 2 }]\n     */\n    var differenceBy = baseRest(function(array, values) {\n      var iteratee = last(values);\n      if (isArrayLikeObject(iteratee)) {\n        iteratee = undefined;\n      }\n      return isArrayLikeObject(array)\n        ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), getIteratee(iteratee, 2))\n        : [];\n    });\n\n    /**\n     * This method is like `_.difference` except that it accepts `comparator`\n     * which is invoked to compare elements of `array` to `values`. The order and\n     * references of result values are determined by the first array. The comparator\n     * is invoked with two arguments: (arrVal, othVal).\n     *\n     * **Note:** Unlike `_.pullAllWith`, this method returns a new array.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {...Array} [values] The values to exclude.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n     *\n     * _.differenceWith(objects, [{ 'x': 1, 'y': 2 }], _.isEqual);\n     * // => [{ 'x': 2, 'y': 1 }]\n     */\n    var differenceWith = baseRest(function(array, values) {\n      var comparator = last(values);\n      if (isArrayLikeObject(comparator)) {\n        comparator = undefined;\n      }\n      return isArrayLikeObject(array)\n        ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), undefined, comparator)\n        : [];\n    });\n\n    /**\n     * Creates a slice of `array` with `n` elements dropped from the beginning.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.5.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=1] The number of elements to drop.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.drop([1, 2, 3]);\n     * // => [2, 3]\n     *\n     * _.drop([1, 2, 3], 2);\n     * // => [3]\n     *\n     * _.drop([1, 2, 3], 5);\n     * // => []\n     *\n     * _.drop([1, 2, 3], 0);\n     * // => [1, 2, 3]\n     */\n    function drop(array, n, guard) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      n = (guard || n === undefined) ? 1 : toInteger(n);\n      return baseSlice(array, n < 0 ? 0 : n, length);\n    }\n\n    /**\n     * Creates a slice of `array` with `n` elements dropped from the end.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=1] The number of elements to drop.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.dropRight([1, 2, 3]);\n     * // => [1, 2]\n     *\n     * _.dropRight([1, 2, 3], 2);\n     * // => [1]\n     *\n     * _.dropRight([1, 2, 3], 5);\n     * // => []\n     *\n     * _.dropRight([1, 2, 3], 0);\n     * // => [1, 2, 3]\n     */\n    function dropRight(array, n, guard) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      n = (guard || n === undefined) ? 1 : toInteger(n);\n      n = length - n;\n      return baseSlice(array, 0, n < 0 ? 0 : n);\n    }\n\n    /**\n     * Creates a slice of `array` excluding elements dropped from the end.\n     * Elements are dropped until `predicate` returns falsey. The predicate is\n     * invoked with three arguments: (value, index, array).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': true },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': false }\n     * ];\n     *\n     * _.dropRightWhile(users, function(o) { return !o.active; });\n     * // => objects for ['barney']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.dropRightWhile(users, { 'user': 'pebbles', 'active': false });\n     * // => objects for ['barney', 'fred']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.dropRightWhile(users, ['active', false]);\n     * // => objects for ['barney']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.dropRightWhile(users, 'active');\n     * // => objects for ['barney', 'fred', 'pebbles']\n     */\n    function dropRightWhile(array, predicate) {\n      return (array && array.length)\n        ? baseWhile(array, getIteratee(predicate, 3), true, true)\n        : [];\n    }\n\n    /**\n     * Creates a slice of `array` excluding elements dropped from the beginning.\n     * Elements are dropped until `predicate` returns falsey. The predicate is\n     * invoked with three arguments: (value, index, array).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': false },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': true }\n     * ];\n     *\n     * _.dropWhile(users, function(o) { return !o.active; });\n     * // => objects for ['pebbles']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.dropWhile(users, { 'user': 'barney', 'active': false });\n     * // => objects for ['fred', 'pebbles']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.dropWhile(users, ['active', false]);\n     * // => objects for ['pebbles']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.dropWhile(users, 'active');\n     * // => objects for ['barney', 'fred', 'pebbles']\n     */\n    function dropWhile(array, predicate) {\n      return (array && array.length)\n        ? baseWhile(array, getIteratee(predicate, 3), true)\n        : [];\n    }\n\n    /**\n     * Fills elements of `array` with `value` from `start` up to, but not\n     * including, `end`.\n     *\n     * **Note:** This method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.2.0\n     * @category Array\n     * @param {Array} array The array to fill.\n     * @param {*} value The value to fill `array` with.\n     * @param {number} [start=0] The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = [1, 2, 3];\n     *\n     * _.fill(array, 'a');\n     * console.log(array);\n     * // => ['a', 'a', 'a']\n     *\n     * _.fill(Array(3), 2);\n     * // => [2, 2, 2]\n     *\n     * _.fill([4, 6, 8, 10], '*', 1, 3);\n     * // => [4, '*', '*', 10]\n     */\n    function fill(array, value, start, end) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      if (start && typeof start != 'number' && isIterateeCall(array, value, start)) {\n        start = 0;\n        end = length;\n      }\n      return baseFill(array, value, start, end);\n    }\n\n    /**\n     * This method is like `_.find` except that it returns the index of the first\n     * element `predicate` returns truthy for instead of the element itself.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param {number} [fromIndex=0] The index to search from.\n     * @returns {number} Returns the index of the found element, else `-1`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': false },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': true }\n     * ];\n     *\n     * _.findIndex(users, function(o) { return o.user == 'barney'; });\n     * // => 0\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.findIndex(users, { 'user': 'fred', 'active': false });\n     * // => 1\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.findIndex(users, ['active', false]);\n     * // => 0\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.findIndex(users, 'active');\n     * // => 2\n     */\n    function findIndex(array, predicate, fromIndex) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return -1;\n      }\n      var index = fromIndex == null ? 0 : toInteger(fromIndex);\n      if (index < 0) {\n        index = nativeMax(length + index, 0);\n      }\n      return baseFindIndex(array, getIteratee(predicate, 3), index);\n    }\n\n    /**\n     * This method is like `_.findIndex` except that it iterates over elements\n     * of `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param {number} [fromIndex=array.length-1] The index to search from.\n     * @returns {number} Returns the index of the found element, else `-1`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': true },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': false }\n     * ];\n     *\n     * _.findLastIndex(users, function(o) { return o.user == 'pebbles'; });\n     * // => 2\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.findLastIndex(users, { 'user': 'barney', 'active': true });\n     * // => 0\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.findLastIndex(users, ['active', false]);\n     * // => 2\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.findLastIndex(users, 'active');\n     * // => 0\n     */\n    function findLastIndex(array, predicate, fromIndex) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return -1;\n      }\n      var index = length - 1;\n      if (fromIndex !== undefined) {\n        index = toInteger(fromIndex);\n        index = fromIndex < 0\n          ? nativeMax(length + index, 0)\n          : nativeMin(index, length - 1);\n      }\n      return baseFindIndex(array, getIteratee(predicate, 3), index, true);\n    }\n\n    /**\n     * Flattens `array` a single level deep.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to flatten.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * _.flatten([1, [2, [3, [4]], 5]]);\n     * // => [1, 2, [3, [4]], 5]\n     */\n    function flatten(array) {\n      var length = array == null ? 0 : array.length;\n      return length ? baseFlatten(array, 1) : [];\n    }\n\n    /**\n     * Recursively flattens `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to flatten.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * _.flattenDeep([1, [2, [3, [4]], 5]]);\n     * // => [1, 2, 3, 4, 5]\n     */\n    function flattenDeep(array) {\n      var length = array == null ? 0 : array.length;\n      return length ? baseFlatten(array, INFINITY) : [];\n    }\n\n    /**\n     * Recursively flatten `array` up to `depth` times.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.4.0\n     * @category Array\n     * @param {Array} array The array to flatten.\n     * @param {number} [depth=1] The maximum recursion depth.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * var array = [1, [2, [3, [4]], 5]];\n     *\n     * _.flattenDepth(array, 1);\n     * // => [1, 2, [3, [4]], 5]\n     *\n     * _.flattenDepth(array, 2);\n     * // => [1, 2, 3, [4], 5]\n     */\n    function flattenDepth(array, depth) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      depth = depth === undefined ? 1 : toInteger(depth);\n      return baseFlatten(array, depth);\n    }\n\n    /**\n     * The inverse of `_.toPairs`; this method returns an object composed\n     * from key-value `pairs`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} pairs The key-value pairs.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * _.fromPairs([['a', 1], ['b', 2]]);\n     * // => { 'a': 1, 'b': 2 }\n     */\n    function fromPairs(pairs) {\n      var index = -1,\n          length = pairs == null ? 0 : pairs.length,\n          result = {};\n\n      while (++index < length) {\n        var pair = pairs[index];\n        result[pair[0]] = pair[1];\n      }\n      return result;\n    }\n\n    /**\n     * Gets the first element of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @alias first\n     * @category Array\n     * @param {Array} array The array to query.\n     * @returns {*} Returns the first element of `array`.\n     * @example\n     *\n     * _.head([1, 2, 3]);\n     * // => 1\n     *\n     * _.head([]);\n     * // => undefined\n     */\n    function head(array) {\n      return (array && array.length) ? array[0] : undefined;\n    }\n\n    /**\n     * Gets the index at which the first occurrence of `value` is found in `array`\n     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons. If `fromIndex` is negative, it's used as the\n     * offset from the end of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {*} value The value to search for.\n     * @param {number} [fromIndex=0] The index to search from.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     * @example\n     *\n     * _.indexOf([1, 2, 1, 2], 2);\n     * // => 1\n     *\n     * // Search from the `fromIndex`.\n     * _.indexOf([1, 2, 1, 2], 2, 2);\n     * // => 3\n     */\n    function indexOf(array, value, fromIndex) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return -1;\n      }\n      var index = fromIndex == null ? 0 : toInteger(fromIndex);\n      if (index < 0) {\n        index = nativeMax(length + index, 0);\n      }\n      return baseIndexOf(array, value, index);\n    }\n\n    /**\n     * Gets all but the last element of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.initial([1, 2, 3]);\n     * // => [1, 2]\n     */\n    function initial(array) {\n      var length = array == null ? 0 : array.length;\n      return length ? baseSlice(array, 0, -1) : [];\n    }\n\n    /**\n     * Creates an array of unique values that are included in all given arrays\n     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons. The order and references of result values are\n     * determined by the first array.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @returns {Array} Returns the new array of intersecting values.\n     * @example\n     *\n     * _.intersection([2, 1], [2, 3]);\n     * // => [2]\n     */\n    var intersection = baseRest(function(arrays) {\n      var mapped = arrayMap(arrays, castArrayLikeObject);\n      return (mapped.length && mapped[0] === arrays[0])\n        ? baseIntersection(mapped)\n        : [];\n    });\n\n    /**\n     * This method is like `_.intersection` except that it accepts `iteratee`\n     * which is invoked for each element of each `arrays` to generate the criterion\n     * by which they're compared. The order and references of result values are\n     * determined by the first array. The iteratee is invoked with one argument:\n     * (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns the new array of intersecting values.\n     * @example\n     *\n     * _.intersectionBy([2.1, 1.2], [2.3, 3.4], Math.floor);\n     * // => [2.1]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.intersectionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\n     * // => [{ 'x': 1 }]\n     */\n    var intersectionBy = baseRest(function(arrays) {\n      var iteratee = last(arrays),\n          mapped = arrayMap(arrays, castArrayLikeObject);\n\n      if (iteratee === last(mapped)) {\n        iteratee = undefined;\n      } else {\n        mapped.pop();\n      }\n      return (mapped.length && mapped[0] === arrays[0])\n        ? baseIntersection(mapped, getIteratee(iteratee, 2))\n        : [];\n    });\n\n    /**\n     * This method is like `_.intersection` except that it accepts `comparator`\n     * which is invoked to compare elements of `arrays`. The order and references\n     * of result values are determined by the first array. The comparator is\n     * invoked with two arguments: (arrVal, othVal).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of intersecting values.\n     * @example\n     *\n     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n     * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\n     *\n     * _.intersectionWith(objects, others, _.isEqual);\n     * // => [{ 'x': 1, 'y': 2 }]\n     */\n    var intersectionWith = baseRest(function(arrays) {\n      var comparator = last(arrays),\n          mapped = arrayMap(arrays, castArrayLikeObject);\n\n      comparator = typeof comparator == 'function' ? comparator : undefined;\n      if (comparator) {\n        mapped.pop();\n      }\n      return (mapped.length && mapped[0] === arrays[0])\n        ? baseIntersection(mapped, undefined, comparator)\n        : [];\n    });\n\n    /**\n     * Converts all elements in `array` into a string separated by `separator`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to convert.\n     * @param {string} [separator=','] The element separator.\n     * @returns {string} Returns the joined string.\n     * @example\n     *\n     * _.join(['a', 'b', 'c'], '~');\n     * // => 'a~b~c'\n     */\n    function join(array, separator) {\n      return array == null ? '' : nativeJoin.call(array, separator);\n    }\n\n    /**\n     * Gets the last element of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @returns {*} Returns the last element of `array`.\n     * @example\n     *\n     * _.last([1, 2, 3]);\n     * // => 3\n     */\n    function last(array) {\n      var length = array == null ? 0 : array.length;\n      return length ? array[length - 1] : undefined;\n    }\n\n    /**\n     * This method is like `_.indexOf` except that it iterates over elements of\n     * `array` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {*} value The value to search for.\n     * @param {number} [fromIndex=array.length-1] The index to search from.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     * @example\n     *\n     * _.lastIndexOf([1, 2, 1, 2], 2);\n     * // => 3\n     *\n     * // Search from the `fromIndex`.\n     * _.lastIndexOf([1, 2, 1, 2], 2, 2);\n     * // => 1\n     */\n    function lastIndexOf(array, value, fromIndex) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return -1;\n      }\n      var index = length;\n      if (fromIndex !== undefined) {\n        index = toInteger(fromIndex);\n        index = index < 0 ? nativeMax(length + index, 0) : nativeMin(index, length - 1);\n      }\n      return value === value\n        ? strictLastIndexOf(array, value, index)\n        : baseFindIndex(array, baseIsNaN, index, true);\n    }\n\n    /**\n     * Gets the element at index `n` of `array`. If `n` is negative, the nth\n     * element from the end is returned.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.11.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=0] The index of the element to return.\n     * @returns {*} Returns the nth element of `array`.\n     * @example\n     *\n     * var array = ['a', 'b', 'c', 'd'];\n     *\n     * _.nth(array, 1);\n     * // => 'b'\n     *\n     * _.nth(array, -2);\n     * // => 'c';\n     */\n    function nth(array, n) {\n      return (array && array.length) ? baseNth(array, toInteger(n)) : undefined;\n    }\n\n    /**\n     * Removes all given values from `array` using\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons.\n     *\n     * **Note:** Unlike `_.without`, this method mutates `array`. Use `_.remove`\n     * to remove elements from an array by predicate.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {...*} [values] The values to remove.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = ['a', 'b', 'c', 'a', 'b', 'c'];\n     *\n     * _.pull(array, 'a', 'c');\n     * console.log(array);\n     * // => ['b', 'b']\n     */\n    var pull = baseRest(pullAll);\n\n    /**\n     * This method is like `_.pull` except that it accepts an array of values to remove.\n     *\n     * **Note:** Unlike `_.difference`, this method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {Array} values The values to remove.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = ['a', 'b', 'c', 'a', 'b', 'c'];\n     *\n     * _.pullAll(array, ['a', 'c']);\n     * console.log(array);\n     * // => ['b', 'b']\n     */\n    function pullAll(array, values) {\n      return (array && array.length && values && values.length)\n        ? basePullAll(array, values)\n        : array;\n    }\n\n    /**\n     * This method is like `_.pullAll` except that it accepts `iteratee` which is\n     * invoked for each element of `array` and `values` to generate the criterion\n     * by which they're compared. The iteratee is invoked with one argument: (value).\n     *\n     * **Note:** Unlike `_.differenceBy`, this method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {Array} values The values to remove.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = [{ 'x': 1 }, { 'x': 2 }, { 'x': 3 }, { 'x': 1 }];\n     *\n     * _.pullAllBy(array, [{ 'x': 1 }, { 'x': 3 }], 'x');\n     * console.log(array);\n     * // => [{ 'x': 2 }]\n     */\n    function pullAllBy(array, values, iteratee) {\n      return (array && array.length && values && values.length)\n        ? basePullAll(array, values, getIteratee(iteratee, 2))\n        : array;\n    }\n\n    /**\n     * This method is like `_.pullAll` except that it accepts `comparator` which\n     * is invoked to compare elements of `array` to `values`. The comparator is\n     * invoked with two arguments: (arrVal, othVal).\n     *\n     * **Note:** Unlike `_.differenceWith`, this method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.6.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {Array} values The values to remove.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = [{ 'x': 1, 'y': 2 }, { 'x': 3, 'y': 4 }, { 'x': 5, 'y': 6 }];\n     *\n     * _.pullAllWith(array, [{ 'x': 3, 'y': 4 }], _.isEqual);\n     * console.log(array);\n     * // => [{ 'x': 1, 'y': 2 }, { 'x': 5, 'y': 6 }]\n     */\n    function pullAllWith(array, values, comparator) {\n      return (array && array.length && values && values.length)\n        ? basePullAll(array, values, undefined, comparator)\n        : array;\n    }\n\n    /**\n     * Removes elements from `array` corresponding to `indexes` and returns an\n     * array of removed elements.\n     *\n     * **Note:** Unlike `_.at`, this method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {...(number|number[])} [indexes] The indexes of elements to remove.\n     * @returns {Array} Returns the new array of removed elements.\n     * @example\n     *\n     * var array = ['a', 'b', 'c', 'd'];\n     * var pulled = _.pullAt(array, [1, 3]);\n     *\n     * console.log(array);\n     * // => ['a', 'c']\n     *\n     * console.log(pulled);\n     * // => ['b', 'd']\n     */\n    var pullAt = flatRest(function(array, indexes) {\n      var length = array == null ? 0 : array.length,\n          result = baseAt(array, indexes);\n\n      basePullAt(array, arrayMap(indexes, function(index) {\n        return isIndex(index, length) ? +index : index;\n      }).sort(compareAscending));\n\n      return result;\n    });\n\n    /**\n     * Removes all elements from `array` that `predicate` returns truthy for\n     * and returns an array of the removed elements. The predicate is invoked\n     * with three arguments: (value, index, array).\n     *\n     * **Note:** Unlike `_.filter`, this method mutates `array`. Use `_.pull`\n     * to pull elements from an array by value.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new array of removed elements.\n     * @example\n     *\n     * var array = [1, 2, 3, 4];\n     * var evens = _.remove(array, function(n) {\n     *   return n % 2 == 0;\n     * });\n     *\n     * console.log(array);\n     * // => [1, 3]\n     *\n     * console.log(evens);\n     * // => [2, 4]\n     */\n    function remove(array, predicate) {\n      var result = [];\n      if (!(array && array.length)) {\n        return result;\n      }\n      var index = -1,\n          indexes = [],\n          length = array.length;\n\n      predicate = getIteratee(predicate, 3);\n      while (++index < length) {\n        var value = array[index];\n        if (predicate(value, index, array)) {\n          result.push(value);\n          indexes.push(index);\n        }\n      }\n      basePullAt(array, indexes);\n      return result;\n    }\n\n    /**\n     * Reverses `array` so that the first element becomes the last, the second\n     * element becomes the second to last, and so on.\n     *\n     * **Note:** This method mutates `array` and is based on\n     * [`Array#reverse`](https://mdn.io/Array/reverse).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = [1, 2, 3];\n     *\n     * _.reverse(array);\n     * // => [3, 2, 1]\n     *\n     * console.log(array);\n     * // => [3, 2, 1]\n     */\n    function reverse(array) {\n      return array == null ? array : nativeReverse.call(array);\n    }\n\n    /**\n     * Creates a slice of `array` from `start` up to, but not including, `end`.\n     *\n     * **Note:** This method is used instead of\n     * [`Array#slice`](https://mdn.io/Array/slice) to ensure dense arrays are\n     * returned.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to slice.\n     * @param {number} [start=0] The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns the slice of `array`.\n     */\n    function slice(array, start, end) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      if (end && typeof end != 'number' && isIterateeCall(array, start, end)) {\n        start = 0;\n        end = length;\n      }\n      else {\n        start = start == null ? 0 : toInteger(start);\n        end = end === undefined ? length : toInteger(end);\n      }\n      return baseSlice(array, start, end);\n    }\n\n    /**\n     * Uses a binary search to determine the lowest index at which `value`\n     * should be inserted into `array` in order to maintain its sort order.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     * @example\n     *\n     * _.sortedIndex([30, 50], 40);\n     * // => 1\n     */\n    function sortedIndex(array, value) {\n      return baseSortedIndex(array, value);\n    }\n\n    /**\n     * This method is like `_.sortedIndex` except that it accepts `iteratee`\n     * which is invoked for `value` and each element of `array` to compute their\n     * sort ranking. The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     * @example\n     *\n     * var objects = [{ 'x': 4 }, { 'x': 5 }];\n     *\n     * _.sortedIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });\n     * // => 0\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.sortedIndexBy(objects, { 'x': 4 }, 'x');\n     * // => 0\n     */\n    function sortedIndexBy(array, value, iteratee) {\n      return baseSortedIndexBy(array, value, getIteratee(iteratee, 2));\n    }\n\n    /**\n     * This method is like `_.indexOf` except that it performs a binary\n     * search on a sorted `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {*} value The value to search for.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     * @example\n     *\n     * _.sortedIndexOf([4, 5, 5, 5, 6], 5);\n     * // => 1\n     */\n    function sortedIndexOf(array, value) {\n      var length = array == null ? 0 : array.length;\n      if (length) {\n        var index = baseSortedIndex(array, value);\n        if (index < length && eq(array[index], value)) {\n          return index;\n        }\n      }\n      return -1;\n    }\n\n    /**\n     * This method is like `_.sortedIndex` except that it returns the highest\n     * index at which `value` should be inserted into `array` in order to\n     * maintain its sort order.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     * @example\n     *\n     * _.sortedLastIndex([4, 5, 5, 5, 6], 5);\n     * // => 4\n     */\n    function sortedLastIndex(array, value) {\n      return baseSortedIndex(array, value, true);\n    }\n\n    /**\n     * This method is like `_.sortedLastIndex` except that it accepts `iteratee`\n     * which is invoked for `value` and each element of `array` to compute their\n     * sort ranking. The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     * @example\n     *\n     * var objects = [{ 'x': 4 }, { 'x': 5 }];\n     *\n     * _.sortedLastIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });\n     * // => 1\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.sortedLastIndexBy(objects, { 'x': 4 }, 'x');\n     * // => 1\n     */\n    function sortedLastIndexBy(array, value, iteratee) {\n      return baseSortedIndexBy(array, value, getIteratee(iteratee, 2), true);\n    }\n\n    /**\n     * This method is like `_.lastIndexOf` except that it performs a binary\n     * search on a sorted `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {*} value The value to search for.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     * @example\n     *\n     * _.sortedLastIndexOf([4, 5, 5, 5, 6], 5);\n     * // => 3\n     */\n    function sortedLastIndexOf(array, value) {\n      var length = array == null ? 0 : array.length;\n      if (length) {\n        var index = baseSortedIndex(array, value, true) - 1;\n        if (eq(array[index], value)) {\n          return index;\n        }\n      }\n      return -1;\n    }\n\n    /**\n     * This method is like `_.uniq` except that it's designed and optimized\n     * for sorted arrays.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @returns {Array} Returns the new duplicate free array.\n     * @example\n     *\n     * _.sortedUniq([1, 1, 2]);\n     * // => [1, 2]\n     */\n    function sortedUniq(array) {\n      return (array && array.length)\n        ? baseSortedUniq(array)\n        : [];\n    }\n\n    /**\n     * This method is like `_.uniqBy` except that it's designed and optimized\n     * for sorted arrays.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @returns {Array} Returns the new duplicate free array.\n     * @example\n     *\n     * _.sortedUniqBy([1.1, 1.2, 2.3, 2.4], Math.floor);\n     * // => [1.1, 2.3]\n     */\n    function sortedUniqBy(array, iteratee) {\n      return (array && array.length)\n        ? baseSortedUniq(array, getIteratee(iteratee, 2))\n        : [];\n    }\n\n    /**\n     * Gets all but the first element of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.tail([1, 2, 3]);\n     * // => [2, 3]\n     */\n    function tail(array) {\n      var length = array == null ? 0 : array.length;\n      return length ? baseSlice(array, 1, length) : [];\n    }\n\n    /**\n     * Creates a slice of `array` with `n` elements taken from the beginning.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=1] The number of elements to take.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.take([1, 2, 3]);\n     * // => [1]\n     *\n     * _.take([1, 2, 3], 2);\n     * // => [1, 2]\n     *\n     * _.take([1, 2, 3], 5);\n     * // => [1, 2, 3]\n     *\n     * _.take([1, 2, 3], 0);\n     * // => []\n     */\n    function take(array, n, guard) {\n      if (!(array && array.length)) {\n        return [];\n      }\n      n = (guard || n === undefined) ? 1 : toInteger(n);\n      return baseSlice(array, 0, n < 0 ? 0 : n);\n    }\n\n    /**\n     * Creates a slice of `array` with `n` elements taken from the end.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=1] The number of elements to take.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.takeRight([1, 2, 3]);\n     * // => [3]\n     *\n     * _.takeRight([1, 2, 3], 2);\n     * // => [2, 3]\n     *\n     * _.takeRight([1, 2, 3], 5);\n     * // => [1, 2, 3]\n     *\n     * _.takeRight([1, 2, 3], 0);\n     * // => []\n     */\n    function takeRight(array, n, guard) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      n = (guard || n === undefined) ? 1 : toInteger(n);\n      n = length - n;\n      return baseSlice(array, n < 0 ? 0 : n, length);\n    }\n\n    /**\n     * Creates a slice of `array` with elements taken from the end. Elements are\n     * taken until `predicate` returns falsey. The predicate is invoked with\n     * three arguments: (value, index, array).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': true },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': false }\n     * ];\n     *\n     * _.takeRightWhile(users, function(o) { return !o.active; });\n     * // => objects for ['fred', 'pebbles']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.takeRightWhile(users, { 'user': 'pebbles', 'active': false });\n     * // => objects for ['pebbles']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.takeRightWhile(users, ['active', false]);\n     * // => objects for ['fred', 'pebbles']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.takeRightWhile(users, 'active');\n     * // => []\n     */\n    function takeRightWhile(array, predicate) {\n      return (array && array.length)\n        ? baseWhile(array, getIteratee(predicate, 3), false, true)\n        : [];\n    }\n\n    /**\n     * Creates a slice of `array` with elements taken from the beginning. Elements\n     * are taken until `predicate` returns falsey. The predicate is invoked with\n     * three arguments: (value, index, array).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': false },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': true }\n     * ];\n     *\n     * _.takeWhile(users, function(o) { return !o.active; });\n     * // => objects for ['barney', 'fred']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.takeWhile(users, { 'user': 'barney', 'active': false });\n     * // => objects for ['barney']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.takeWhile(users, ['active', false]);\n     * // => objects for ['barney', 'fred']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.takeWhile(users, 'active');\n     * // => []\n     */\n    function takeWhile(array, predicate) {\n      return (array && array.length)\n        ? baseWhile(array, getIteratee(predicate, 3))\n        : [];\n    }\n\n    /**\n     * Creates an array of unique values, in order, from all given arrays using\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @returns {Array} Returns the new array of combined values.\n     * @example\n     *\n     * _.union([2], [1, 2]);\n     * // => [2, 1]\n     */\n    var union = baseRest(function(arrays) {\n      return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true));\n    });\n\n    /**\n     * This method is like `_.union` except that it accepts `iteratee` which is\n     * invoked for each element of each `arrays` to generate the criterion by\n     * which uniqueness is computed. Result values are chosen from the first\n     * array in which the value occurs. The iteratee is invoked with one argument:\n     * (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns the new array of combined values.\n     * @example\n     *\n     * _.unionBy([2.1], [1.2, 2.3], Math.floor);\n     * // => [2.1, 1.2]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.unionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\n     * // => [{ 'x': 1 }, { 'x': 2 }]\n     */\n    var unionBy = baseRest(function(arrays) {\n      var iteratee = last(arrays);\n      if (isArrayLikeObject(iteratee)) {\n        iteratee = undefined;\n      }\n      return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), getIteratee(iteratee, 2));\n    });\n\n    /**\n     * This method is like `_.union` except that it accepts `comparator` which\n     * is invoked to compare elements of `arrays`. Result values are chosen from\n     * the first array in which the value occurs. The comparator is invoked\n     * with two arguments: (arrVal, othVal).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of combined values.\n     * @example\n     *\n     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n     * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\n     *\n     * _.unionWith(objects, others, _.isEqual);\n     * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]\n     */\n    var unionWith = baseRest(function(arrays) {\n      var comparator = last(arrays);\n      comparator = typeof comparator == 'function' ? comparator : undefined;\n      return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), undefined, comparator);\n    });\n\n    /**\n     * Creates a duplicate-free version of an array, using\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons, in which only the first occurrence of each element\n     * is kept. The order of result values is determined by the order they occur\n     * in the array.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @returns {Array} Returns the new duplicate free array.\n     * @example\n     *\n     * _.uniq([2, 1, 2]);\n     * // => [2, 1]\n     */\n    function uniq(array) {\n      return (array && array.length) ? baseUniq(array) : [];\n    }\n\n    /**\n     * This method is like `_.uniq` except that it accepts `iteratee` which is\n     * invoked for each element in `array` to generate the criterion by which\n     * uniqueness is computed. The order of result values is determined by the\n     * order they occur in the array. The iteratee is invoked with one argument:\n     * (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns the new duplicate free array.\n     * @example\n     *\n     * _.uniqBy([2.1, 1.2, 2.3], Math.floor);\n     * // => [2.1, 1.2]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');\n     * // => [{ 'x': 1 }, { 'x': 2 }]\n     */\n    function uniqBy(array, iteratee) {\n      return (array && array.length) ? baseUniq(array, getIteratee(iteratee, 2)) : [];\n    }\n\n    /**\n     * This method is like `_.uniq` except that it accepts `comparator` which\n     * is invoked to compare elements of `array`. The order of result values is\n     * determined by the order they occur in the array.The comparator is invoked\n     * with two arguments: (arrVal, othVal).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new duplicate free array.\n     * @example\n     *\n     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 2 }];\n     *\n     * _.uniqWith(objects, _.isEqual);\n     * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]\n     */\n    function uniqWith(array, comparator) {\n      comparator = typeof comparator == 'function' ? comparator : undefined;\n      return (array && array.length) ? baseUniq(array, undefined, comparator) : [];\n    }\n\n    /**\n     * This method is like `_.zip` except that it accepts an array of grouped\n     * elements and creates an array regrouping the elements to their pre-zip\n     * configuration.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.2.0\n     * @category Array\n     * @param {Array} array The array of grouped elements to process.\n     * @returns {Array} Returns the new array of regrouped elements.\n     * @example\n     *\n     * var zipped = _.zip(['a', 'b'], [1, 2], [true, false]);\n     * // => [['a', 1, true], ['b', 2, false]]\n     *\n     * _.unzip(zipped);\n     * // => [['a', 'b'], [1, 2], [true, false]]\n     */\n    function unzip(array) {\n      if (!(array && array.length)) {\n        return [];\n      }\n      var length = 0;\n      array = arrayFilter(array, function(group) {\n        if (isArrayLikeObject(group)) {\n          length = nativeMax(group.length, length);\n          return true;\n        }\n      });\n      return baseTimes(length, function(index) {\n        return arrayMap(array, baseProperty(index));\n      });\n    }\n\n    /**\n     * This method is like `_.unzip` except that it accepts `iteratee` to specify\n     * how regrouped values should be combined. The iteratee is invoked with the\n     * elements of each group: (...group).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.8.0\n     * @category Array\n     * @param {Array} array The array of grouped elements to process.\n     * @param {Function} [iteratee=_.identity] The function to combine\n     *  regrouped values.\n     * @returns {Array} Returns the new array of regrouped elements.\n     * @example\n     *\n     * var zipped = _.zip([1, 2], [10, 20], [100, 200]);\n     * // => [[1, 10, 100], [2, 20, 200]]\n     *\n     * _.unzipWith(zipped, _.add);\n     * // => [3, 30, 300]\n     */\n    function unzipWith(array, iteratee) {\n      if (!(array && array.length)) {\n        return [];\n      }\n      var result = unzip(array);\n      if (iteratee == null) {\n        return result;\n      }\n      return arrayMap(result, function(group) {\n        return apply(iteratee, undefined, group);\n      });\n    }\n\n    /**\n     * Creates an array excluding all given values using\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons.\n     *\n     * **Note:** Unlike `_.pull`, this method returns a new array.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {...*} [values] The values to exclude.\n     * @returns {Array} Returns the new array of filtered values.\n     * @see _.difference, _.xor\n     * @example\n     *\n     * _.without([2, 1, 2, 3], 1, 2);\n     * // => [3]\n     */\n    var without = baseRest(function(array, values) {\n      return isArrayLikeObject(array)\n        ? baseDifference(array, values)\n        : [];\n    });\n\n    /**\n     * Creates an array of unique values that is the\n     * [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference)\n     * of the given arrays. The order of result values is determined by the order\n     * they occur in the arrays.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.4.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @returns {Array} Returns the new array of filtered values.\n     * @see _.difference, _.without\n     * @example\n     *\n     * _.xor([2, 1], [2, 3]);\n     * // => [1, 3]\n     */\n    var xor = baseRest(function(arrays) {\n      return baseXor(arrayFilter(arrays, isArrayLikeObject));\n    });\n\n    /**\n     * This method is like `_.xor` except that it accepts `iteratee` which is\n     * invoked for each element of each `arrays` to generate the criterion by\n     * which by which they're compared. The order of result values is determined\n     * by the order they occur in the arrays. The iteratee is invoked with one\n     * argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * _.xorBy([2.1, 1.2], [2.3, 3.4], Math.floor);\n     * // => [1.2, 3.4]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.xorBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\n     * // => [{ 'x': 2 }]\n     */\n    var xorBy = baseRest(function(arrays) {\n      var iteratee = last(arrays);\n      if (isArrayLikeObject(iteratee)) {\n        iteratee = undefined;\n      }\n      return baseXor(arrayFilter(arrays, isArrayLikeObject), getIteratee(iteratee, 2));\n    });\n\n    /**\n     * This method is like `_.xor` except that it accepts `comparator` which is\n     * invoked to compare elements of `arrays`. The order of result values is\n     * determined by the order they occur in the arrays. The comparator is invoked\n     * with two arguments: (arrVal, othVal).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n     * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\n     *\n     * _.xorWith(objects, others, _.isEqual);\n     * // => [{ 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]\n     */\n    var xorWith = baseRest(function(arrays) {\n      var comparator = last(arrays);\n      comparator = typeof comparator == 'function' ? comparator : undefined;\n      return baseXor(arrayFilter(arrays, isArrayLikeObject), undefined, comparator);\n    });\n\n    /**\n     * Creates an array of grouped elements, the first of which contains the\n     * first elements of the given arrays, the second of which contains the\n     * second elements of the given arrays, and so on.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to process.\n     * @returns {Array} Returns the new array of grouped elements.\n     * @example\n     *\n     * _.zip(['a', 'b'], [1, 2], [true, false]);\n     * // => [['a', 1, true], ['b', 2, false]]\n     */\n    var zip = baseRest(unzip);\n\n    /**\n     * This method is like `_.fromPairs` except that it accepts two arrays,\n     * one of property identifiers and one of corresponding values.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.4.0\n     * @category Array\n     * @param {Array} [props=[]] The property identifiers.\n     * @param {Array} [values=[]] The property values.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * _.zipObject(['a', 'b'], [1, 2]);\n     * // => { 'a': 1, 'b': 2 }\n     */\n    function zipObject(props, values) {\n      return baseZipObject(props || [], values || [], assignValue);\n    }\n\n    /**\n     * This method is like `_.zipObject` except that it supports property paths.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.1.0\n     * @category Array\n     * @param {Array} [props=[]] The property identifiers.\n     * @param {Array} [values=[]] The property values.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * _.zipObjectDeep(['a.b[0].c', 'a.b[1].d'], [1, 2]);\n     * // => { 'a': { 'b': [{ 'c': 1 }, { 'd': 2 }] } }\n     */\n    function zipObjectDeep(props, values) {\n      return baseZipObject(props || [], values || [], baseSet);\n    }\n\n    /**\n     * This method is like `_.zip` except that it accepts `iteratee` to specify\n     * how grouped values should be combined. The iteratee is invoked with the\n     * elements of each group: (...group).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.8.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to process.\n     * @param {Function} [iteratee=_.identity] The function to combine\n     *  grouped values.\n     * @returns {Array} Returns the new array of grouped elements.\n     * @example\n     *\n     * _.zipWith([1, 2], [10, 20], [100, 200], function(a, b, c) {\n     *   return a + b + c;\n     * });\n     * // => [111, 222]\n     */\n    var zipWith = baseRest(function(arrays) {\n      var length = arrays.length,\n          iteratee = length > 1 ? arrays[length - 1] : undefined;\n\n      iteratee = typeof iteratee == 'function' ? (arrays.pop(), iteratee) : undefined;\n      return unzipWith(arrays, iteratee);\n    });\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a `lodash` wrapper instance that wraps `value` with explicit method\n     * chain sequences enabled. The result of such sequences must be unwrapped\n     * with `_#value`.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.3.0\n     * @category Seq\n     * @param {*} value The value to wrap.\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'age': 36 },\n     *   { 'user': 'fred',    'age': 40 },\n     *   { 'user': 'pebbles', 'age': 1 }\n     * ];\n     *\n     * var youngest = _\n     *   .chain(users)\n     *   .sortBy('age')\n     *   .map(function(o) {\n     *     return o.user + ' is ' + o.age;\n     *   })\n     *   .head()\n     *   .value();\n     * // => 'pebbles is 1'\n     */\n    function chain(value) {\n      var result = lodash(value);\n      result.__chain__ = true;\n      return result;\n    }\n\n    /**\n     * This method invokes `interceptor` and returns `value`. The interceptor\n     * is invoked with one argument; (value). The purpose of this method is to\n     * \"tap into\" a method chain sequence in order to modify intermediate results.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Seq\n     * @param {*} value The value to provide to `interceptor`.\n     * @param {Function} interceptor The function to invoke.\n     * @returns {*} Returns `value`.\n     * @example\n     *\n     * _([1, 2, 3])\n     *  .tap(function(array) {\n     *    // Mutate input array.\n     *    array.pop();\n     *  })\n     *  .reverse()\n     *  .value();\n     * // => [2, 1]\n     */\n    function tap(value, interceptor) {\n      interceptor(value);\n      return value;\n    }\n\n    /**\n     * This method is like `_.tap` except that it returns the result of `interceptor`.\n     * The purpose of this method is to \"pass thru\" values replacing intermediate\n     * results in a method chain sequence.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Seq\n     * @param {*} value The value to provide to `interceptor`.\n     * @param {Function} interceptor The function to invoke.\n     * @returns {*} Returns the result of `interceptor`.\n     * @example\n     *\n     * _('  abc  ')\n     *  .chain()\n     *  .trim()\n     *  .thru(function(value) {\n     *    return [value];\n     *  })\n     *  .value();\n     * // => ['abc']\n     */\n    function thru(value, interceptor) {\n      return interceptor(value);\n    }\n\n    /**\n     * This method is the wrapper version of `_.at`.\n     *\n     * @name at\n     * @memberOf _\n     * @since 1.0.0\n     * @category Seq\n     * @param {...(string|string[])} [paths] The property paths to pick.\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };\n     *\n     * _(object).at(['a[0].b.c', 'a[1]']).value();\n     * // => [3, 4]\n     */\n    var wrapperAt = flatRest(function(paths) {\n      var length = paths.length,\n          start = length ? paths[0] : 0,\n          value = this.__wrapped__,\n          interceptor = function(object) { return baseAt(object, paths); };\n\n      if (length > 1 || this.__actions__.length ||\n          !(value instanceof LazyWrapper) || !isIndex(start)) {\n        return this.thru(interceptor);\n      }\n      value = value.slice(start, +start + (length ? 1 : 0));\n      value.__actions__.push({\n        'func': thru,\n        'args': [interceptor],\n        'thisArg': undefined\n      });\n      return new LodashWrapper(value, this.__chain__).thru(function(array) {\n        if (length && !array.length) {\n          array.push(undefined);\n        }\n        return array;\n      });\n    });\n\n    /**\n     * Creates a `lodash` wrapper instance with explicit method chain sequences enabled.\n     *\n     * @name chain\n     * @memberOf _\n     * @since 0.1.0\n     * @category Seq\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36 },\n     *   { 'user': 'fred',   'age': 40 }\n     * ];\n     *\n     * // A sequence without explicit chaining.\n     * _(users).head();\n     * // => { 'user': 'barney', 'age': 36 }\n     *\n     * // A sequence with explicit chaining.\n     * _(users)\n     *   .chain()\n     *   .head()\n     *   .pick('user')\n     *   .value();\n     * // => { 'user': 'barney' }\n     */\n    function wrapperChain() {\n      return chain(this);\n    }\n\n    /**\n     * Executes the chain sequence and returns the wrapped result.\n     *\n     * @name commit\n     * @memberOf _\n     * @since 3.2.0\n     * @category Seq\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var array = [1, 2];\n     * var wrapped = _(array).push(3);\n     *\n     * console.log(array);\n     * // => [1, 2]\n     *\n     * wrapped = wrapped.commit();\n     * console.log(array);\n     * // => [1, 2, 3]\n     *\n     * wrapped.last();\n     * // => 3\n     *\n     * console.log(array);\n     * // => [1, 2, 3]\n     */\n    function wrapperCommit() {\n      return new LodashWrapper(this.value(), this.__chain__);\n    }\n\n    /**\n     * Gets the next value on a wrapped object following the\n     * [iterator protocol](https://mdn.io/iteration_protocols#iterator).\n     *\n     * @name next\n     * @memberOf _\n     * @since 4.0.0\n     * @category Seq\n     * @returns {Object} Returns the next iterator value.\n     * @example\n     *\n     * var wrapped = _([1, 2]);\n     *\n     * wrapped.next();\n     * // => { 'done': false, 'value': 1 }\n     *\n     * wrapped.next();\n     * // => { 'done': false, 'value': 2 }\n     *\n     * wrapped.next();\n     * // => { 'done': true, 'value': undefined }\n     */\n    function wrapperNext() {\n      if (this.__values__ === undefined) {\n        this.__values__ = toArray(this.value());\n      }\n      var done = this.__index__ >= this.__values__.length,\n          value = done ? undefined : this.__values__[this.__index__++];\n\n      return { 'done': done, 'value': value };\n    }\n\n    /**\n     * Enables the wrapper to be iterable.\n     *\n     * @name Symbol.iterator\n     * @memberOf _\n     * @since 4.0.0\n     * @category Seq\n     * @returns {Object} Returns the wrapper object.\n     * @example\n     *\n     * var wrapped = _([1, 2]);\n     *\n     * wrapped[Symbol.iterator]() === wrapped;\n     * // => true\n     *\n     * Array.from(wrapped);\n     * // => [1, 2]\n     */\n    function wrapperToIterator() {\n      return this;\n    }\n\n    /**\n     * Creates a clone of the chain sequence planting `value` as the wrapped value.\n     *\n     * @name plant\n     * @memberOf _\n     * @since 3.2.0\n     * @category Seq\n     * @param {*} value The value to plant.\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var wrapped = _([1, 2]).map(square);\n     * var other = wrapped.plant([3, 4]);\n     *\n     * other.value();\n     * // => [9, 16]\n     *\n     * wrapped.value();\n     * // => [1, 4]\n     */\n    function wrapperPlant(value) {\n      var result,\n          parent = this;\n\n      while (parent instanceof baseLodash) {\n        var clone = wrapperClone(parent);\n        clone.__index__ = 0;\n        clone.__values__ = undefined;\n        if (result) {\n          previous.__wrapped__ = clone;\n        } else {\n          result = clone;\n        }\n        var previous = clone;\n        parent = parent.__wrapped__;\n      }\n      previous.__wrapped__ = value;\n      return result;\n    }\n\n    /**\n     * This method is the wrapper version of `_.reverse`.\n     *\n     * **Note:** This method mutates the wrapped array.\n     *\n     * @name reverse\n     * @memberOf _\n     * @since 0.1.0\n     * @category Seq\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var array = [1, 2, 3];\n     *\n     * _(array).reverse().value()\n     * // => [3, 2, 1]\n     *\n     * console.log(array);\n     * // => [3, 2, 1]\n     */\n    function wrapperReverse() {\n      var value = this.__wrapped__;\n      if (value instanceof LazyWrapper) {\n        var wrapped = value;\n        if (this.__actions__.length) {\n          wrapped = new LazyWrapper(this);\n        }\n        wrapped = wrapped.reverse();\n        wrapped.__actions__.push({\n          'func': thru,\n          'args': [reverse],\n          'thisArg': undefined\n        });\n        return new LodashWrapper(wrapped, this.__chain__);\n      }\n      return this.thru(reverse);\n    }\n\n    /**\n     * Executes the chain sequence to resolve the unwrapped value.\n     *\n     * @name value\n     * @memberOf _\n     * @since 0.1.0\n     * @alias toJSON, valueOf\n     * @category Seq\n     * @returns {*} Returns the resolved unwrapped value.\n     * @example\n     *\n     * _([1, 2, 3]).value();\n     * // => [1, 2, 3]\n     */\n    function wrapperValue() {\n      return baseWrapperValue(this.__wrapped__, this.__actions__);\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates an object composed of keys generated from the results of running\n     * each element of `collection` thru `iteratee`. The corresponding value of\n     * each key is the number of times the key was returned by `iteratee`. The\n     * iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.5.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n     * @returns {Object} Returns the composed aggregate object.\n     * @example\n     *\n     * _.countBy([6.1, 4.2, 6.3], Math.floor);\n     * // => { '4': 1, '6': 2 }\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.countBy(['one', 'two', 'three'], 'length');\n     * // => { '3': 2, '5': 1 }\n     */\n    var countBy = createAggregator(function(result, value, key) {\n      if (hasOwnProperty.call(result, key)) {\n        ++result[key];\n      } else {\n        baseAssignValue(result, key, 1);\n      }\n    });\n\n    /**\n     * Checks if `predicate` returns truthy for **all** elements of `collection`.\n     * Iteration is stopped once `predicate` returns falsey. The predicate is\n     * invoked with three arguments: (value, index|key, collection).\n     *\n     * **Note:** This method returns `true` for\n     * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because\n     * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of\n     * elements of empty collections.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {boolean} Returns `true` if all elements pass the predicate check,\n     *  else `false`.\n     * @example\n     *\n     * _.every([true, 1, null, 'yes'], Boolean);\n     * // => false\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36, 'active': false },\n     *   { 'user': 'fred',   'age': 40, 'active': false }\n     * ];\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.every(users, { 'user': 'barney', 'active': false });\n     * // => false\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.every(users, ['active', false]);\n     * // => true\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.every(users, 'active');\n     * // => false\n     */\n    function every(collection, predicate, guard) {\n      var func = isArray(collection) ? arrayEvery : baseEvery;\n      if (guard && isIterateeCall(collection, predicate, guard)) {\n        predicate = undefined;\n      }\n      return func(collection, getIteratee(predicate, 3));\n    }\n\n    /**\n     * Iterates over elements of `collection`, returning an array of all elements\n     * `predicate` returns truthy for. The predicate is invoked with three\n     * arguments: (value, index|key, collection).\n     *\n     * **Note:** Unlike `_.remove`, this method returns a new array.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new filtered array.\n     * @see _.reject\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36, 'active': true },\n     *   { 'user': 'fred',   'age': 40, 'active': false }\n     * ];\n     *\n     * _.filter(users, function(o) { return !o.active; });\n     * // => objects for ['fred']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.filter(users, { 'age': 36, 'active': true });\n     * // => objects for ['barney']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.filter(users, ['active', false]);\n     * // => objects for ['fred']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.filter(users, 'active');\n     * // => objects for ['barney']\n     *\n     * // Combining several predicates using `_.overEvery` or `_.overSome`.\n     * _.filter(users, _.overSome([{ 'age': 36 }, ['age', 40]]));\n     * // => objects for ['fred', 'barney']\n     */\n    function filter(collection, predicate) {\n      var func = isArray(collection) ? arrayFilter : baseFilter;\n      return func(collection, getIteratee(predicate, 3));\n    }\n\n    /**\n     * Iterates over elements of `collection`, returning the first element\n     * `predicate` returns truthy for. The predicate is invoked with three\n     * arguments: (value, index|key, collection).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param {number} [fromIndex=0] The index to search from.\n     * @returns {*} Returns the matched element, else `undefined`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'age': 36, 'active': true },\n     *   { 'user': 'fred',    'age': 40, 'active': false },\n     *   { 'user': 'pebbles', 'age': 1,  'active': true }\n     * ];\n     *\n     * _.find(users, function(o) { return o.age < 40; });\n     * // => object for 'barney'\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.find(users, { 'age': 1, 'active': true });\n     * // => object for 'pebbles'\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.find(users, ['active', false]);\n     * // => object for 'fred'\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.find(users, 'active');\n     * // => object for 'barney'\n     */\n    var find = createFind(findIndex);\n\n    /**\n     * This method is like `_.find` except that it iterates over elements of\n     * `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param {number} [fromIndex=collection.length-1] The index to search from.\n     * @returns {*} Returns the matched element, else `undefined`.\n     * @example\n     *\n     * _.findLast([1, 2, 3, 4], function(n) {\n     *   return n % 2 == 1;\n     * });\n     * // => 3\n     */\n    var findLast = createFind(findLastIndex);\n\n    /**\n     * Creates a flattened array of values by running each element in `collection`\n     * thru `iteratee` and flattening the mapped results. The iteratee is invoked\n     * with three arguments: (value, index|key, collection).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * function duplicate(n) {\n     *   return [n, n];\n     * }\n     *\n     * _.flatMap([1, 2], duplicate);\n     * // => [1, 1, 2, 2]\n     */\n    function flatMap(collection, iteratee) {\n      return baseFlatten(map(collection, iteratee), 1);\n    }\n\n    /**\n     * This method is like `_.flatMap` except that it recursively flattens the\n     * mapped results.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.7.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * function duplicate(n) {\n     *   return [[[n, n]]];\n     * }\n     *\n     * _.flatMapDeep([1, 2], duplicate);\n     * // => [1, 1, 2, 2]\n     */\n    function flatMapDeep(collection, iteratee) {\n      return baseFlatten(map(collection, iteratee), INFINITY);\n    }\n\n    /**\n     * This method is like `_.flatMap` except that it recursively flattens the\n     * mapped results up to `depth` times.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.7.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {number} [depth=1] The maximum recursion depth.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * function duplicate(n) {\n     *   return [[[n, n]]];\n     * }\n     *\n     * _.flatMapDepth([1, 2], duplicate, 2);\n     * // => [[1, 1], [2, 2]]\n     */\n    function flatMapDepth(collection, iteratee, depth) {\n      depth = depth === undefined ? 1 : toInteger(depth);\n      return baseFlatten(map(collection, iteratee), depth);\n    }\n\n    /**\n     * Iterates over elements of `collection` and invokes `iteratee` for each element.\n     * The iteratee is invoked with three arguments: (value, index|key, collection).\n     * Iteratee functions may exit iteration early by explicitly returning `false`.\n     *\n     * **Note:** As with other \"Collections\" methods, objects with a \"length\"\n     * property are iterated like arrays. To avoid this behavior use `_.forIn`\n     * or `_.forOwn` for object iteration.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @alias each\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array|Object} Returns `collection`.\n     * @see _.forEachRight\n     * @example\n     *\n     * _.forEach([1, 2], function(value) {\n     *   console.log(value);\n     * });\n     * // => Logs `1` then `2`.\n     *\n     * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => Logs 'a' then 'b' (iteration order is not guaranteed).\n     */\n    function forEach(collection, iteratee) {\n      var func = isArray(collection) ? arrayEach : baseEach;\n      return func(collection, getIteratee(iteratee, 3));\n    }\n\n    /**\n     * This method is like `_.forEach` except that it iterates over elements of\n     * `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @alias eachRight\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array|Object} Returns `collection`.\n     * @see _.forEach\n     * @example\n     *\n     * _.forEachRight([1, 2], function(value) {\n     *   console.log(value);\n     * });\n     * // => Logs `2` then `1`.\n     */\n    function forEachRight(collection, iteratee) {\n      var func = isArray(collection) ? arrayEachRight : baseEachRight;\n      return func(collection, getIteratee(iteratee, 3));\n    }\n\n    /**\n     * Creates an object composed of keys generated from the results of running\n     * each element of `collection` thru `iteratee`. The order of grouped values\n     * is determined by the order they occur in `collection`. The corresponding\n     * value of each key is an array of elements responsible for generating the\n     * key. The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n     * @returns {Object} Returns the composed aggregate object.\n     * @example\n     *\n     * _.groupBy([6.1, 4.2, 6.3], Math.floor);\n     * // => { '4': [4.2], '6': [6.1, 6.3] }\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.groupBy(['one', 'two', 'three'], 'length');\n     * // => { '3': ['one', 'two'], '5': ['three'] }\n     */\n    var groupBy = createAggregator(function(result, value, key) {\n      if (hasOwnProperty.call(result, key)) {\n        result[key].push(value);\n      } else {\n        baseAssignValue(result, key, [value]);\n      }\n    });\n\n    /**\n     * Checks if `value` is in `collection`. If `collection` is a string, it's\n     * checked for a substring of `value`, otherwise\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * is used for equality comparisons. If `fromIndex` is negative, it's used as\n     * the offset from the end of `collection`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to inspect.\n     * @param {*} value The value to search for.\n     * @param {number} [fromIndex=0] The index to search from.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.\n     * @returns {boolean} Returns `true` if `value` is found, else `false`.\n     * @example\n     *\n     * _.includes([1, 2, 3], 1);\n     * // => true\n     *\n     * _.includes([1, 2, 3], 1, 2);\n     * // => false\n     *\n     * _.includes({ 'a': 1, 'b': 2 }, 1);\n     * // => true\n     *\n     * _.includes('abcd', 'bc');\n     * // => true\n     */\n    function includes(collection, value, fromIndex, guard) {\n      collection = isArrayLike(collection) ? collection : values(collection);\n      fromIndex = (fromIndex && !guard) ? toInteger(fromIndex) : 0;\n\n      var length = collection.length;\n      if (fromIndex < 0) {\n        fromIndex = nativeMax(length + fromIndex, 0);\n      }\n      return isString(collection)\n        ? (fromIndex <= length && collection.indexOf(value, fromIndex) > -1)\n        : (!!length && baseIndexOf(collection, value, fromIndex) > -1);\n    }\n\n    /**\n     * Invokes the method at `path` of each element in `collection`, returning\n     * an array of the results of each invoked method. Any additional arguments\n     * are provided to each invoked method. If `path` is a function, it's invoked\n     * for, and `this` bound to, each element in `collection`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Array|Function|string} path The path of the method to invoke or\n     *  the function invoked per iteration.\n     * @param {...*} [args] The arguments to invoke each method with.\n     * @returns {Array} Returns the array of results.\n     * @example\n     *\n     * _.invokeMap([[5, 1, 7], [3, 2, 1]], 'sort');\n     * // => [[1, 5, 7], [1, 2, 3]]\n     *\n     * _.invokeMap([123, 456], String.prototype.split, '');\n     * // => [['1', '2', '3'], ['4', '5', '6']]\n     */\n    var invokeMap = baseRest(function(collection, path, args) {\n      var index = -1,\n          isFunc = typeof path == 'function',\n          result = isArrayLike(collection) ? Array(collection.length) : [];\n\n      baseEach(collection, function(value) {\n        result[++index] = isFunc ? apply(path, value, args) : baseInvoke(value, path, args);\n      });\n      return result;\n    });\n\n    /**\n     * Creates an object composed of keys generated from the results of running\n     * each element of `collection` thru `iteratee`. The corresponding value of\n     * each key is the last element responsible for generating the key. The\n     * iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n     * @returns {Object} Returns the composed aggregate object.\n     * @example\n     *\n     * var array = [\n     *   { 'dir': 'left', 'code': 97 },\n     *   { 'dir': 'right', 'code': 100 }\n     * ];\n     *\n     * _.keyBy(array, function(o) {\n     *   return String.fromCharCode(o.code);\n     * });\n     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\n     *\n     * _.keyBy(array, 'dir');\n     * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }\n     */\n    var keyBy = createAggregator(function(result, value, key) {\n      baseAssignValue(result, key, value);\n    });\n\n    /**\n     * Creates an array of values by running each element in `collection` thru\n     * `iteratee`. The iteratee is invoked with three arguments:\n     * (value, index|key, collection).\n     *\n     * Many lodash methods are guarded to work as iteratees for methods like\n     * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.\n     *\n     * The guarded methods are:\n     * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,\n     * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,\n     * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,\n     * `template`, `trim`, `trimEnd`, `trimStart`, and `words`\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new mapped array.\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * _.map([4, 8], square);\n     * // => [16, 64]\n     *\n     * _.map({ 'a': 4, 'b': 8 }, square);\n     * // => [16, 64] (iteration order is not guaranteed)\n     *\n     * var users = [\n     *   { 'user': 'barney' },\n     *   { 'user': 'fred' }\n     * ];\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.map(users, 'user');\n     * // => ['barney', 'fred']\n     */\n    function map(collection, iteratee) {\n      var func = isArray(collection) ? arrayMap : baseMap;\n      return func(collection, getIteratee(iteratee, 3));\n    }\n\n    /**\n     * This method is like `_.sortBy` except that it allows specifying the sort\n     * orders of the iteratees to sort by. If `orders` is unspecified, all values\n     * are sorted in ascending order. Otherwise, specify an order of \"desc\" for\n     * descending or \"asc\" for ascending sort order of corresponding values.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Array[]|Function[]|Object[]|string[]} [iteratees=[_.identity]]\n     *  The iteratees to sort by.\n     * @param {string[]} [orders] The sort orders of `iteratees`.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.\n     * @returns {Array} Returns the new sorted array.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'fred',   'age': 48 },\n     *   { 'user': 'barney', 'age': 34 },\n     *   { 'user': 'fred',   'age': 40 },\n     *   { 'user': 'barney', 'age': 36 }\n     * ];\n     *\n     * // Sort by `user` in ascending order and by `age` in descending order.\n     * _.orderBy(users, ['user', 'age'], ['asc', 'desc']);\n     * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]\n     */\n    function orderBy(collection, iteratees, orders, guard) {\n      if (collection == null) {\n        return [];\n      }\n      if (!isArray(iteratees)) {\n        iteratees = iteratees == null ? [] : [iteratees];\n      }\n      orders = guard ? undefined : orders;\n      if (!isArray(orders)) {\n        orders = orders == null ? [] : [orders];\n      }\n      return baseOrderBy(collection, iteratees, orders);\n    }\n\n    /**\n     * Creates an array of elements split into two groups, the first of which\n     * contains elements `predicate` returns truthy for, the second of which\n     * contains elements `predicate` returns falsey for. The predicate is\n     * invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the array of grouped elements.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'age': 36, 'active': false },\n     *   { 'user': 'fred',    'age': 40, 'active': true },\n     *   { 'user': 'pebbles', 'age': 1,  'active': false }\n     * ];\n     *\n     * _.partition(users, function(o) { return o.active; });\n     * // => objects for [['fred'], ['barney', 'pebbles']]\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.partition(users, { 'age': 1, 'active': false });\n     * // => objects for [['pebbles'], ['barney', 'fred']]\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.partition(users, ['active', false]);\n     * // => objects for [['barney', 'pebbles'], ['fred']]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.partition(users, 'active');\n     * // => objects for [['fred'], ['barney', 'pebbles']]\n     */\n    var partition = createAggregator(function(result, value, key) {\n      result[key ? 0 : 1].push(value);\n    }, function() { return [[], []]; });\n\n    /**\n     * Reduces `collection` to a value which is the accumulated result of running\n     * each element in `collection` thru `iteratee`, where each successive\n     * invocation is supplied the return value of the previous. If `accumulator`\n     * is not given, the first element of `collection` is used as the initial\n     * value. The iteratee is invoked with four arguments:\n     * (accumulator, value, index|key, collection).\n     *\n     * Many lodash methods are guarded to work as iteratees for methods like\n     * `_.reduce`, `_.reduceRight`, and `_.transform`.\n     *\n     * The guarded methods are:\n     * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,\n     * and `sortBy`\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [accumulator] The initial value.\n     * @returns {*} Returns the accumulated value.\n     * @see _.reduceRight\n     * @example\n     *\n     * _.reduce([1, 2], function(sum, n) {\n     *   return sum + n;\n     * }, 0);\n     * // => 3\n     *\n     * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {\n     *   (result[value] || (result[value] = [])).push(key);\n     *   return result;\n     * }, {});\n     * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)\n     */\n    function reduce(collection, iteratee, accumulator) {\n      var func = isArray(collection) ? arrayReduce : baseReduce,\n          initAccum = arguments.length < 3;\n\n      return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEach);\n    }\n\n    /**\n     * This method is like `_.reduce` except that it iterates over elements of\n     * `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [accumulator] The initial value.\n     * @returns {*} Returns the accumulated value.\n     * @see _.reduce\n     * @example\n     *\n     * var array = [[0, 1], [2, 3], [4, 5]];\n     *\n     * _.reduceRight(array, function(flattened, other) {\n     *   return flattened.concat(other);\n     * }, []);\n     * // => [4, 5, 2, 3, 0, 1]\n     */\n    function reduceRight(collection, iteratee, accumulator) {\n      var func = isArray(collection) ? arrayReduceRight : baseReduce,\n          initAccum = arguments.length < 3;\n\n      return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEachRight);\n    }\n\n    /**\n     * The opposite of `_.filter`; this method returns the elements of `collection`\n     * that `predicate` does **not** return truthy for.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new filtered array.\n     * @see _.filter\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36, 'active': false },\n     *   { 'user': 'fred',   'age': 40, 'active': true }\n     * ];\n     *\n     * _.reject(users, function(o) { return !o.active; });\n     * // => objects for ['fred']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.reject(users, { 'age': 40, 'active': true });\n     * // => objects for ['barney']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.reject(users, ['active', false]);\n     * // => objects for ['fred']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.reject(users, 'active');\n     * // => objects for ['barney']\n     */\n    function reject(collection, predicate) {\n      var func = isArray(collection) ? arrayFilter : baseFilter;\n      return func(collection, negate(getIteratee(predicate, 3)));\n    }\n\n    /**\n     * Gets a random element from `collection`.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to sample.\n     * @returns {*} Returns the random element.\n     * @example\n     *\n     * _.sample([1, 2, 3, 4]);\n     * // => 2\n     */\n    function sample(collection) {\n      var func = isArray(collection) ? arraySample : baseSample;\n      return func(collection);\n    }\n\n    /**\n     * Gets `n` random elements at unique keys from `collection` up to the\n     * size of `collection`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to sample.\n     * @param {number} [n=1] The number of elements to sample.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the random elements.\n     * @example\n     *\n     * _.sampleSize([1, 2, 3], 2);\n     * // => [3, 1]\n     *\n     * _.sampleSize([1, 2, 3], 4);\n     * // => [2, 3, 1]\n     */\n    function sampleSize(collection, n, guard) {\n      if ((guard ? isIterateeCall(collection, n, guard) : n === undefined)) {\n        n = 1;\n      } else {\n        n = toInteger(n);\n      }\n      var func = isArray(collection) ? arraySampleSize : baseSampleSize;\n      return func(collection, n);\n    }\n\n    /**\n     * Creates an array of shuffled values, using a version of the\n     * [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to shuffle.\n     * @returns {Array} Returns the new shuffled array.\n     * @example\n     *\n     * _.shuffle([1, 2, 3, 4]);\n     * // => [4, 1, 3, 2]\n     */\n    function shuffle(collection) {\n      var func = isArray(collection) ? arrayShuffle : baseShuffle;\n      return func(collection);\n    }\n\n    /**\n     * Gets the size of `collection` by returning its length for array-like\n     * values or the number of own enumerable string keyed properties for objects.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to inspect.\n     * @returns {number} Returns the collection size.\n     * @example\n     *\n     * _.size([1, 2, 3]);\n     * // => 3\n     *\n     * _.size({ 'a': 1, 'b': 2 });\n     * // => 2\n     *\n     * _.size('pebbles');\n     * // => 7\n     */\n    function size(collection) {\n      if (collection == null) {\n        return 0;\n      }\n      if (isArrayLike(collection)) {\n        return isString(collection) ? stringSize(collection) : collection.length;\n      }\n      var tag = getTag(collection);\n      if (tag == mapTag || tag == setTag) {\n        return collection.size;\n      }\n      return baseKeys(collection).length;\n    }\n\n    /**\n     * Checks if `predicate` returns truthy for **any** element of `collection`.\n     * Iteration is stopped once `predicate` returns truthy. The predicate is\n     * invoked with three arguments: (value, index|key, collection).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {boolean} Returns `true` if any element passes the predicate check,\n     *  else `false`.\n     * @example\n     *\n     * _.some([null, 0, 'yes', false], Boolean);\n     * // => true\n     *\n     * var users = [\n     *   { 'user': 'barney', 'active': true },\n     *   { 'user': 'fred',   'active': false }\n     * ];\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.some(users, { 'user': 'barney', 'active': false });\n     * // => false\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.some(users, ['active', false]);\n     * // => true\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.some(users, 'active');\n     * // => true\n     */\n    function some(collection, predicate, guard) {\n      var func = isArray(collection) ? arraySome : baseSome;\n      if (guard && isIterateeCall(collection, predicate, guard)) {\n        predicate = undefined;\n      }\n      return func(collection, getIteratee(predicate, 3));\n    }\n\n    /**\n     * Creates an array of elements, sorted in ascending order by the results of\n     * running each element in a collection thru each iteratee. This method\n     * performs a stable sort, that is, it preserves the original sort order of\n     * equal elements. The iteratees are invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {...(Function|Function[])} [iteratees=[_.identity]]\n     *  The iteratees to sort by.\n     * @returns {Array} Returns the new sorted array.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'fred',   'age': 48 },\n     *   { 'user': 'barney', 'age': 36 },\n     *   { 'user': 'fred',   'age': 30 },\n     *   { 'user': 'barney', 'age': 34 }\n     * ];\n     *\n     * _.sortBy(users, [function(o) { return o.user; }]);\n     * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 30]]\n     *\n     * _.sortBy(users, ['user', 'age']);\n     * // => objects for [['barney', 34], ['barney', 36], ['fred', 30], ['fred', 48]]\n     */\n    var sortBy = baseRest(function(collection, iteratees) {\n      if (collection == null) {\n        return [];\n      }\n      var length = iteratees.length;\n      if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) {\n        iteratees = [];\n      } else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) {\n        iteratees = [iteratees[0]];\n      }\n      return baseOrderBy(collection, baseFlatten(iteratees, 1), []);\n    });\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Gets the timestamp of the number of milliseconds that have elapsed since\n     * the Unix epoch (1 January 1970 00:00:00 UTC).\n     *\n     * @static\n     * @memberOf _\n     * @since 2.4.0\n     * @category Date\n     * @returns {number} Returns the timestamp.\n     * @example\n     *\n     * _.defer(function(stamp) {\n     *   console.log(_.now() - stamp);\n     * }, _.now());\n     * // => Logs the number of milliseconds it took for the deferred invocation.\n     */\n    var now = ctxNow || function() {\n      return root.Date.now();\n    };\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * The opposite of `_.before`; this method creates a function that invokes\n     * `func` once it's called `n` or more times.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {number} n The number of calls before `func` is invoked.\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new restricted function.\n     * @example\n     *\n     * var saves = ['profile', 'settings'];\n     *\n     * var done = _.after(saves.length, function() {\n     *   console.log('done saving!');\n     * });\n     *\n     * _.forEach(saves, function(type) {\n     *   asyncSave({ 'type': type, 'complete': done });\n     * });\n     * // => Logs 'done saving!' after the two async saves have completed.\n     */\n    function after(n, func) {\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      n = toInteger(n);\n      return function() {\n        if (--n < 1) {\n          return func.apply(this, arguments);\n        }\n      };\n    }\n\n    /**\n     * Creates a function that invokes `func`, with up to `n` arguments,\n     * ignoring any additional arguments.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Function\n     * @param {Function} func The function to cap arguments for.\n     * @param {number} [n=func.length] The arity cap.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Function} Returns the new capped function.\n     * @example\n     *\n     * _.map(['6', '8', '10'], _.ary(parseInt, 1));\n     * // => [6, 8, 10]\n     */\n    function ary(func, n, guard) {\n      n = guard ? undefined : n;\n      n = (func && n == null) ? func.length : n;\n      return createWrap(func, WRAP_ARY_FLAG, undefined, undefined, undefined, undefined, n);\n    }\n\n    /**\n     * Creates a function that invokes `func`, with the `this` binding and arguments\n     * of the created function, while it's called less than `n` times. Subsequent\n     * calls to the created function return the result of the last `func` invocation.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Function\n     * @param {number} n The number of calls at which `func` is no longer invoked.\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new restricted function.\n     * @example\n     *\n     * jQuery(element).on('click', _.before(5, addContactToList));\n     * // => Allows adding up to 4 contacts to the list.\n     */\n    function before(n, func) {\n      var result;\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      n = toInteger(n);\n      return function() {\n        if (--n > 0) {\n          result = func.apply(this, arguments);\n        }\n        if (n <= 1) {\n          func = undefined;\n        }\n        return result;\n      };\n    }\n\n    /**\n     * Creates a function that invokes `func` with the `this` binding of `thisArg`\n     * and `partials` prepended to the arguments it receives.\n     *\n     * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,\n     * may be used as a placeholder for partially applied arguments.\n     *\n     * **Note:** Unlike native `Function#bind`, this method doesn't set the \"length\"\n     * property of bound functions.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to bind.\n     * @param {*} thisArg The `this` binding of `func`.\n     * @param {...*} [partials] The arguments to be partially applied.\n     * @returns {Function} Returns the new bound function.\n     * @example\n     *\n     * function greet(greeting, punctuation) {\n     *   return greeting + ' ' + this.user + punctuation;\n     * }\n     *\n     * var object = { 'user': 'fred' };\n     *\n     * var bound = _.bind(greet, object, 'hi');\n     * bound('!');\n     * // => 'hi fred!'\n     *\n     * // Bound with placeholders.\n     * var bound = _.bind(greet, object, _, '!');\n     * bound('hi');\n     * // => 'hi fred!'\n     */\n    var bind = baseRest(function(func, thisArg, partials) {\n      var bitmask = WRAP_BIND_FLAG;\n      if (partials.length) {\n        var holders = replaceHolders(partials, getHolder(bind));\n        bitmask |= WRAP_PARTIAL_FLAG;\n      }\n      return createWrap(func, bitmask, thisArg, partials, holders);\n    });\n\n    /**\n     * Creates a function that invokes the method at `object[key]` with `partials`\n     * prepended to the arguments it receives.\n     *\n     * This method differs from `_.bind` by allowing bound functions to reference\n     * methods that may be redefined or don't yet exist. See\n     * [Peter Michaux's article](http://peter.michaux.ca/articles/lazy-function-definition-pattern)\n     * for more details.\n     *\n     * The `_.bindKey.placeholder` value, which defaults to `_` in monolithic\n     * builds, may be used as a placeholder for partially applied arguments.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.10.0\n     * @category Function\n     * @param {Object} object The object to invoke the method on.\n     * @param {string} key The key of the method.\n     * @param {...*} [partials] The arguments to be partially applied.\n     * @returns {Function} Returns the new bound function.\n     * @example\n     *\n     * var object = {\n     *   'user': 'fred',\n     *   'greet': function(greeting, punctuation) {\n     *     return greeting + ' ' + this.user + punctuation;\n     *   }\n     * };\n     *\n     * var bound = _.bindKey(object, 'greet', 'hi');\n     * bound('!');\n     * // => 'hi fred!'\n     *\n     * object.greet = function(greeting, punctuation) {\n     *   return greeting + 'ya ' + this.user + punctuation;\n     * };\n     *\n     * bound('!');\n     * // => 'hiya fred!'\n     *\n     * // Bound with placeholders.\n     * var bound = _.bindKey(object, 'greet', _, '!');\n     * bound('hi');\n     * // => 'hiya fred!'\n     */\n    var bindKey = baseRest(function(object, key, partials) {\n      var bitmask = WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG;\n      if (partials.length) {\n        var holders = replaceHolders(partials, getHolder(bindKey));\n        bitmask |= WRAP_PARTIAL_FLAG;\n      }\n      return createWrap(key, bitmask, object, partials, holders);\n    });\n\n    /**\n     * Creates a function that accepts arguments of `func` and either invokes\n     * `func` returning its result, if at least `arity` number of arguments have\n     * been provided, or returns a function that accepts the remaining `func`\n     * arguments, and so on. The arity of `func` may be specified if `func.length`\n     * is not sufficient.\n     *\n     * The `_.curry.placeholder` value, which defaults to `_` in monolithic builds,\n     * may be used as a placeholder for provided arguments.\n     *\n     * **Note:** This method doesn't set the \"length\" property of curried functions.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Function\n     * @param {Function} func The function to curry.\n     * @param {number} [arity=func.length] The arity of `func`.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Function} Returns the new curried function.\n     * @example\n     *\n     * var abc = function(a, b, c) {\n     *   return [a, b, c];\n     * };\n     *\n     * var curried = _.curry(abc);\n     *\n     * curried(1)(2)(3);\n     * // => [1, 2, 3]\n     *\n     * curried(1, 2)(3);\n     * // => [1, 2, 3]\n     *\n     * curried(1, 2, 3);\n     * // => [1, 2, 3]\n     *\n     * // Curried with placeholders.\n     * curried(1)(_, 3)(2);\n     * // => [1, 2, 3]\n     */\n    function curry(func, arity, guard) {\n      arity = guard ? undefined : arity;\n      var result = createWrap(func, WRAP_CURRY_FLAG, undefined, undefined, undefined, undefined, undefined, arity);\n      result.placeholder = curry.placeholder;\n      return result;\n    }\n\n    /**\n     * This method is like `_.curry` except that arguments are applied to `func`\n     * in the manner of `_.partialRight` instead of `_.partial`.\n     *\n     * The `_.curryRight.placeholder` value, which defaults to `_` in monolithic\n     * builds, may be used as a placeholder for provided arguments.\n     *\n     * **Note:** This method doesn't set the \"length\" property of curried functions.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Function\n     * @param {Function} func The function to curry.\n     * @param {number} [arity=func.length] The arity of `func`.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Function} Returns the new curried function.\n     * @example\n     *\n     * var abc = function(a, b, c) {\n     *   return [a, b, c];\n     * };\n     *\n     * var curried = _.curryRight(abc);\n     *\n     * curried(3)(2)(1);\n     * // => [1, 2, 3]\n     *\n     * curried(2, 3)(1);\n     * // => [1, 2, 3]\n     *\n     * curried(1, 2, 3);\n     * // => [1, 2, 3]\n     *\n     * // Curried with placeholders.\n     * curried(3)(1, _)(2);\n     * // => [1, 2, 3]\n     */\n    function curryRight(func, arity, guard) {\n      arity = guard ? undefined : arity;\n      var result = createWrap(func, WRAP_CURRY_RIGHT_FLAG, undefined, undefined, undefined, undefined, undefined, arity);\n      result.placeholder = curryRight.placeholder;\n      return result;\n    }\n\n    /**\n     * Creates a debounced function that delays invoking `func` until after `wait`\n     * milliseconds have elapsed since the last time the debounced function was\n     * invoked. The debounced function comes with a `cancel` method to cancel\n     * delayed `func` invocations and a `flush` method to immediately invoke them.\n     * Provide `options` to indicate whether `func` should be invoked on the\n     * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n     * with the last arguments provided to the debounced function. Subsequent\n     * calls to the debounced function return the result of the last `func`\n     * invocation.\n     *\n     * **Note:** If `leading` and `trailing` options are `true`, `func` is\n     * invoked on the trailing edge of the timeout only if the debounced function\n     * is invoked more than once during the `wait` timeout.\n     *\n     * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n     * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n     *\n     * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n     * for details over the differences between `_.debounce` and `_.throttle`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to debounce.\n     * @param {number} [wait=0] The number of milliseconds to delay.\n     * @param {Object} [options={}] The options object.\n     * @param {boolean} [options.leading=false]\n     *  Specify invoking on the leading edge of the timeout.\n     * @param {number} [options.maxWait]\n     *  The maximum time `func` is allowed to be delayed before it's invoked.\n     * @param {boolean} [options.trailing=true]\n     *  Specify invoking on the trailing edge of the timeout.\n     * @returns {Function} Returns the new debounced function.\n     * @example\n     *\n     * // Avoid costly calculations while the window size is in flux.\n     * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n     *\n     * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n     * jQuery(element).on('click', _.debounce(sendMail, 300, {\n     *   'leading': true,\n     *   'trailing': false\n     * }));\n     *\n     * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n     * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n     * var source = new EventSource('/stream');\n     * jQuery(source).on('message', debounced);\n     *\n     * // Cancel the trailing debounced invocation.\n     * jQuery(window).on('popstate', debounced.cancel);\n     */\n    function debounce(func, wait, options) {\n      var lastArgs,\n          lastThis,\n          maxWait,\n          result,\n          timerId,\n          lastCallTime,\n          lastInvokeTime = 0,\n          leading = false,\n          maxing = false,\n          trailing = true;\n\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      wait = toNumber(wait) || 0;\n      if (isObject(options)) {\n        leading = !!options.leading;\n        maxing = 'maxWait' in options;\n        maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n        trailing = 'trailing' in options ? !!options.trailing : trailing;\n      }\n\n      function invokeFunc(time) {\n        var args = lastArgs,\n            thisArg = lastThis;\n\n        lastArgs = lastThis = undefined;\n        lastInvokeTime = time;\n        result = func.apply(thisArg, args);\n        return result;\n      }\n\n      function leadingEdge(time) {\n        // Reset any `maxWait` timer.\n        lastInvokeTime = time;\n        // Start the timer for the trailing edge.\n        timerId = setTimeout(timerExpired, wait);\n        // Invoke the leading edge.\n        return leading ? invokeFunc(time) : result;\n      }\n\n      function remainingWait(time) {\n        var timeSinceLastCall = time - lastCallTime,\n            timeSinceLastInvoke = time - lastInvokeTime,\n            timeWaiting = wait - timeSinceLastCall;\n\n        return maxing\n          ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)\n          : timeWaiting;\n      }\n\n      function shouldInvoke(time) {\n        var timeSinceLastCall = time - lastCallTime,\n            timeSinceLastInvoke = time - lastInvokeTime;\n\n        // Either this is the first call, activity has stopped and we're at the\n        // trailing edge, the system time has gone backwards and we're treating\n        // it as the trailing edge, or we've hit the `maxWait` limit.\n        return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n          (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n      }\n\n      function timerExpired() {\n        var time = now();\n        if (shouldInvoke(time)) {\n          return trailingEdge(time);\n        }\n        // Restart the timer.\n        timerId = setTimeout(timerExpired, remainingWait(time));\n      }\n\n      function trailingEdge(time) {\n        timerId = undefined;\n\n        // Only invoke if we have `lastArgs` which means `func` has been\n        // debounced at least once.\n        if (trailing && lastArgs) {\n          return invokeFunc(time);\n        }\n        lastArgs = lastThis = undefined;\n        return result;\n      }\n\n      function cancel() {\n        if (timerId !== undefined) {\n          clearTimeout(timerId);\n        }\n        lastInvokeTime = 0;\n        lastArgs = lastCallTime = lastThis = timerId = undefined;\n      }\n\n      function flush() {\n        return timerId === undefined ? result : trailingEdge(now());\n      }\n\n      function debounced() {\n        var time = now(),\n            isInvoking = shouldInvoke(time);\n\n        lastArgs = arguments;\n        lastThis = this;\n        lastCallTime = time;\n\n        if (isInvoking) {\n          if (timerId === undefined) {\n            return leadingEdge(lastCallTime);\n          }\n          if (maxing) {\n            // Handle invocations in a tight loop.\n            clearTimeout(timerId);\n            timerId = setTimeout(timerExpired, wait);\n            return invokeFunc(lastCallTime);\n          }\n        }\n        if (timerId === undefined) {\n          timerId = setTimeout(timerExpired, wait);\n        }\n        return result;\n      }\n      debounced.cancel = cancel;\n      debounced.flush = flush;\n      return debounced;\n    }\n\n    /**\n     * Defers invoking the `func` until the current call stack has cleared. Any\n     * additional arguments are provided to `func` when it's invoked.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to defer.\n     * @param {...*} [args] The arguments to invoke `func` with.\n     * @returns {number} Returns the timer id.\n     * @example\n     *\n     * _.defer(function(text) {\n     *   console.log(text);\n     * }, 'deferred');\n     * // => Logs 'deferred' after one millisecond.\n     */\n    var defer = baseRest(function(func, args) {\n      return baseDelay(func, 1, args);\n    });\n\n    /**\n     * Invokes `func` after `wait` milliseconds. Any additional arguments are\n     * provided to `func` when it's invoked.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to delay.\n     * @param {number} wait The number of milliseconds to delay invocation.\n     * @param {...*} [args] The arguments to invoke `func` with.\n     * @returns {number} Returns the timer id.\n     * @example\n     *\n     * _.delay(function(text) {\n     *   console.log(text);\n     * }, 1000, 'later');\n     * // => Logs 'later' after one second.\n     */\n    var delay = baseRest(function(func, wait, args) {\n      return baseDelay(func, toNumber(wait) || 0, args);\n    });\n\n    /**\n     * Creates a function that invokes `func` with arguments reversed.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Function\n     * @param {Function} func The function to flip arguments for.\n     * @returns {Function} Returns the new flipped function.\n     * @example\n     *\n     * var flipped = _.flip(function() {\n     *   return _.toArray(arguments);\n     * });\n     *\n     * flipped('a', 'b', 'c', 'd');\n     * // => ['d', 'c', 'b', 'a']\n     */\n    function flip(func) {\n      return createWrap(func, WRAP_FLIP_FLAG);\n    }\n\n    /**\n     * Creates a function that memoizes the result of `func`. If `resolver` is\n     * provided, it determines the cache key for storing the result based on the\n     * arguments provided to the memoized function. By default, the first argument\n     * provided to the memoized function is used as the map cache key. The `func`\n     * is invoked with the `this` binding of the memoized function.\n     *\n     * **Note:** The cache is exposed as the `cache` property on the memoized\n     * function. Its creation may be customized by replacing the `_.memoize.Cache`\n     * constructor with one whose instances implement the\n     * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n     * method interface of `clear`, `delete`, `get`, `has`, and `set`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to have its output memoized.\n     * @param {Function} [resolver] The function to resolve the cache key.\n     * @returns {Function} Returns the new memoized function.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2 };\n     * var other = { 'c': 3, 'd': 4 };\n     *\n     * var values = _.memoize(_.values);\n     * values(object);\n     * // => [1, 2]\n     *\n     * values(other);\n     * // => [3, 4]\n     *\n     * object.a = 2;\n     * values(object);\n     * // => [1, 2]\n     *\n     * // Modify the result cache.\n     * values.cache.set(object, ['a', 'b']);\n     * values(object);\n     * // => ['a', 'b']\n     *\n     * // Replace `_.memoize.Cache`.\n     * _.memoize.Cache = WeakMap;\n     */\n    function memoize(func, resolver) {\n      if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      var memoized = function() {\n        var args = arguments,\n            key = resolver ? resolver.apply(this, args) : args[0],\n            cache = memoized.cache;\n\n        if (cache.has(key)) {\n          return cache.get(key);\n        }\n        var result = func.apply(this, args);\n        memoized.cache = cache.set(key, result) || cache;\n        return result;\n      };\n      memoized.cache = new (memoize.Cache || MapCache);\n      return memoized;\n    }\n\n    // Expose `MapCache`.\n    memoize.Cache = MapCache;\n\n    /**\n     * Creates a function that negates the result of the predicate `func`. The\n     * `func` predicate is invoked with the `this` binding and arguments of the\n     * created function.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Function\n     * @param {Function} predicate The predicate to negate.\n     * @returns {Function} Returns the new negated function.\n     * @example\n     *\n     * function isEven(n) {\n     *   return n % 2 == 0;\n     * }\n     *\n     * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));\n     * // => [1, 3, 5]\n     */\n    function negate(predicate) {\n      if (typeof predicate != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      return function() {\n        var args = arguments;\n        switch (args.length) {\n          case 0: return !predicate.call(this);\n          case 1: return !predicate.call(this, args[0]);\n          case 2: return !predicate.call(this, args[0], args[1]);\n          case 3: return !predicate.call(this, args[0], args[1], args[2]);\n        }\n        return !predicate.apply(this, args);\n      };\n    }\n\n    /**\n     * Creates a function that is restricted to invoking `func` once. Repeat calls\n     * to the function return the value of the first invocation. The `func` is\n     * invoked with the `this` binding and arguments of the created function.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new restricted function.\n     * @example\n     *\n     * var initialize = _.once(createApplication);\n     * initialize();\n     * initialize();\n     * // => `createApplication` is invoked once\n     */\n    function once(func) {\n      return before(2, func);\n    }\n\n    /**\n     * Creates a function that invokes `func` with its arguments transformed.\n     *\n     * @static\n     * @since 4.0.0\n     * @memberOf _\n     * @category Function\n     * @param {Function} func The function to wrap.\n     * @param {...(Function|Function[])} [transforms=[_.identity]]\n     *  The argument transforms.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * function doubled(n) {\n     *   return n * 2;\n     * }\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var func = _.overArgs(function(x, y) {\n     *   return [x, y];\n     * }, [square, doubled]);\n     *\n     * func(9, 3);\n     * // => [81, 6]\n     *\n     * func(10, 5);\n     * // => [100, 10]\n     */\n    var overArgs = castRest(function(func, transforms) {\n      transforms = (transforms.length == 1 && isArray(transforms[0]))\n        ? arrayMap(transforms[0], baseUnary(getIteratee()))\n        : arrayMap(baseFlatten(transforms, 1), baseUnary(getIteratee()));\n\n      var funcsLength = transforms.length;\n      return baseRest(function(args) {\n        var index = -1,\n            length = nativeMin(args.length, funcsLength);\n\n        while (++index < length) {\n          args[index] = transforms[index].call(this, args[index]);\n        }\n        return apply(func, this, args);\n      });\n    });\n\n    /**\n     * Creates a function that invokes `func` with `partials` prepended to the\n     * arguments it receives. This method is like `_.bind` except it does **not**\n     * alter the `this` binding.\n     *\n     * The `_.partial.placeholder` value, which defaults to `_` in monolithic\n     * builds, may be used as a placeholder for partially applied arguments.\n     *\n     * **Note:** This method doesn't set the \"length\" property of partially\n     * applied functions.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.2.0\n     * @category Function\n     * @param {Function} func The function to partially apply arguments to.\n     * @param {...*} [partials] The arguments to be partially applied.\n     * @returns {Function} Returns the new partially applied function.\n     * @example\n     *\n     * function greet(greeting, name) {\n     *   return greeting + ' ' + name;\n     * }\n     *\n     * var sayHelloTo = _.partial(greet, 'hello');\n     * sayHelloTo('fred');\n     * // => 'hello fred'\n     *\n     * // Partially applied with placeholders.\n     * var greetFred = _.partial(greet, _, 'fred');\n     * greetFred('hi');\n     * // => 'hi fred'\n     */\n    var partial = baseRest(function(func, partials) {\n      var holders = replaceHolders(partials, getHolder(partial));\n      return createWrap(func, WRAP_PARTIAL_FLAG, undefined, partials, holders);\n    });\n\n    /**\n     * This method is like `_.partial` except that partially applied arguments\n     * are appended to the arguments it receives.\n     *\n     * The `_.partialRight.placeholder` value, which defaults to `_` in monolithic\n     * builds, may be used as a placeholder for partially applied arguments.\n     *\n     * **Note:** This method doesn't set the \"length\" property of partially\n     * applied functions.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.0.0\n     * @category Function\n     * @param {Function} func The function to partially apply arguments to.\n     * @param {...*} [partials] The arguments to be partially applied.\n     * @returns {Function} Returns the new partially applied function.\n     * @example\n     *\n     * function greet(greeting, name) {\n     *   return greeting + ' ' + name;\n     * }\n     *\n     * var greetFred = _.partialRight(greet, 'fred');\n     * greetFred('hi');\n     * // => 'hi fred'\n     *\n     * // Partially applied with placeholders.\n     * var sayHelloTo = _.partialRight(greet, 'hello', _);\n     * sayHelloTo('fred');\n     * // => 'hello fred'\n     */\n    var partialRight = baseRest(function(func, partials) {\n      var holders = replaceHolders(partials, getHolder(partialRight));\n      return createWrap(func, WRAP_PARTIAL_RIGHT_FLAG, undefined, partials, holders);\n    });\n\n    /**\n     * Creates a function that invokes `func` with arguments arranged according\n     * to the specified `indexes` where the argument value at the first index is\n     * provided as the first argument, the argument value at the second index is\n     * provided as the second argument, and so on.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Function\n     * @param {Function} func The function to rearrange arguments for.\n     * @param {...(number|number[])} indexes The arranged argument indexes.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var rearged = _.rearg(function(a, b, c) {\n     *   return [a, b, c];\n     * }, [2, 0, 1]);\n     *\n     * rearged('b', 'c', 'a')\n     * // => ['a', 'b', 'c']\n     */\n    var rearg = flatRest(function(func, indexes) {\n      return createWrap(func, WRAP_REARG_FLAG, undefined, undefined, undefined, indexes);\n    });\n\n    /**\n     * Creates a function that invokes `func` with the `this` binding of the\n     * created function and arguments from `start` and beyond provided as\n     * an array.\n     *\n     * **Note:** This method is based on the\n     * [rest parameter](https://mdn.io/rest_parameters).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Function\n     * @param {Function} func The function to apply a rest parameter to.\n     * @param {number} [start=func.length-1] The start position of the rest parameter.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var say = _.rest(function(what, names) {\n     *   return what + ' ' + _.initial(names).join(', ') +\n     *     (_.size(names) > 1 ? ', & ' : '') + _.last(names);\n     * });\n     *\n     * say('hello', 'fred', 'barney', 'pebbles');\n     * // => 'hello fred, barney, & pebbles'\n     */\n    function rest(func, start) {\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      start = start === undefined ? start : toInteger(start);\n      return baseRest(func, start);\n    }\n\n    /**\n     * Creates a function that invokes `func` with the `this` binding of the\n     * create function and an array of arguments much like\n     * [`Function#apply`](http://www.ecma-international.org/ecma-262/7.0/#sec-function.prototype.apply).\n     *\n     * **Note:** This method is based on the\n     * [spread operator](https://mdn.io/spread_operator).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.2.0\n     * @category Function\n     * @param {Function} func The function to spread arguments over.\n     * @param {number} [start=0] The start position of the spread.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var say = _.spread(function(who, what) {\n     *   return who + ' says ' + what;\n     * });\n     *\n     * say(['fred', 'hello']);\n     * // => 'fred says hello'\n     *\n     * var numbers = Promise.all([\n     *   Promise.resolve(40),\n     *   Promise.resolve(36)\n     * ]);\n     *\n     * numbers.then(_.spread(function(x, y) {\n     *   return x + y;\n     * }));\n     * // => a Promise of 76\n     */\n    function spread(func, start) {\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      start = start == null ? 0 : nativeMax(toInteger(start), 0);\n      return baseRest(function(args) {\n        var array = args[start],\n            otherArgs = castSlice(args, 0, start);\n\n        if (array) {\n          arrayPush(otherArgs, array);\n        }\n        return apply(func, this, otherArgs);\n      });\n    }\n\n    /**\n     * Creates a throttled function that only invokes `func` at most once per\n     * every `wait` milliseconds. The throttled function comes with a `cancel`\n     * method to cancel delayed `func` invocations and a `flush` method to\n     * immediately invoke them. Provide `options` to indicate whether `func`\n     * should be invoked on the leading and/or trailing edge of the `wait`\n     * timeout. The `func` is invoked with the last arguments provided to the\n     * throttled function. Subsequent calls to the throttled function return the\n     * result of the last `func` invocation.\n     *\n     * **Note:** If `leading` and `trailing` options are `true`, `func` is\n     * invoked on the trailing edge of the timeout only if the throttled function\n     * is invoked more than once during the `wait` timeout.\n     *\n     * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n     * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n     *\n     * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n     * for details over the differences between `_.throttle` and `_.debounce`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to throttle.\n     * @param {number} [wait=0] The number of milliseconds to throttle invocations to.\n     * @param {Object} [options={}] The options object.\n     * @param {boolean} [options.leading=true]\n     *  Specify invoking on the leading edge of the timeout.\n     * @param {boolean} [options.trailing=true]\n     *  Specify invoking on the trailing edge of the timeout.\n     * @returns {Function} Returns the new throttled function.\n     * @example\n     *\n     * // Avoid excessively updating the position while scrolling.\n     * jQuery(window).on('scroll', _.throttle(updatePosition, 100));\n     *\n     * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.\n     * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });\n     * jQuery(element).on('click', throttled);\n     *\n     * // Cancel the trailing throttled invocation.\n     * jQuery(window).on('popstate', throttled.cancel);\n     */\n    function throttle(func, wait, options) {\n      var leading = true,\n          trailing = true;\n\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      if (isObject(options)) {\n        leading = 'leading' in options ? !!options.leading : leading;\n        trailing = 'trailing' in options ? !!options.trailing : trailing;\n      }\n      return debounce(func, wait, {\n        'leading': leading,\n        'maxWait': wait,\n        'trailing': trailing\n      });\n    }\n\n    /**\n     * Creates a function that accepts up to one argument, ignoring any\n     * additional arguments.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Function\n     * @param {Function} func The function to cap arguments for.\n     * @returns {Function} Returns the new capped function.\n     * @example\n     *\n     * _.map(['6', '8', '10'], _.unary(parseInt));\n     * // => [6, 8, 10]\n     */\n    function unary(func) {\n      return ary(func, 1);\n    }\n\n    /**\n     * Creates a function that provides `value` to `wrapper` as its first\n     * argument. Any additional arguments provided to the function are appended\n     * to those provided to the `wrapper`. The wrapper is invoked with the `this`\n     * binding of the created function.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {*} value The value to wrap.\n     * @param {Function} [wrapper=identity] The wrapper function.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var p = _.wrap(_.escape, function(func, text) {\n     *   return '<p>' + func(text) + '</p>';\n     * });\n     *\n     * p('fred, barney, & pebbles');\n     * // => '<p>fred, barney, &amp; pebbles</p>'\n     */\n    function wrap(value, wrapper) {\n      return partial(castFunction(wrapper), value);\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Casts `value` as an array if it's not one.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.4.0\n     * @category Lang\n     * @param {*} value The value to inspect.\n     * @returns {Array} Returns the cast array.\n     * @example\n     *\n     * _.castArray(1);\n     * // => [1]\n     *\n     * _.castArray({ 'a': 1 });\n     * // => [{ 'a': 1 }]\n     *\n     * _.castArray('abc');\n     * // => ['abc']\n     *\n     * _.castArray(null);\n     * // => [null]\n     *\n     * _.castArray(undefined);\n     * // => [undefined]\n     *\n     * _.castArray();\n     * // => []\n     *\n     * var array = [1, 2, 3];\n     * console.log(_.castArray(array) === array);\n     * // => true\n     */\n    function castArray() {\n      if (!arguments.length) {\n        return [];\n      }\n      var value = arguments[0];\n      return isArray(value) ? value : [value];\n    }\n\n    /**\n     * Creates a shallow clone of `value`.\n     *\n     * **Note:** This method is loosely based on the\n     * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)\n     * and supports cloning arrays, array buffers, booleans, date objects, maps,\n     * numbers, `Object` objects, regexes, sets, strings, symbols, and typed\n     * arrays. The own enumerable properties of `arguments` objects are cloned\n     * as plain objects. An empty object is returned for uncloneable values such\n     * as error objects, functions, DOM nodes, and WeakMaps.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to clone.\n     * @returns {*} Returns the cloned value.\n     * @see _.cloneDeep\n     * @example\n     *\n     * var objects = [{ 'a': 1 }, { 'b': 2 }];\n     *\n     * var shallow = _.clone(objects);\n     * console.log(shallow[0] === objects[0]);\n     * // => true\n     */\n    function clone(value) {\n      return baseClone(value, CLONE_SYMBOLS_FLAG);\n    }\n\n    /**\n     * This method is like `_.clone` except that it accepts `customizer` which\n     * is invoked to produce the cloned value. If `customizer` returns `undefined`,\n     * cloning is handled by the method instead. The `customizer` is invoked with\n     * up to four arguments; (value [, index|key, object, stack]).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to clone.\n     * @param {Function} [customizer] The function to customize cloning.\n     * @returns {*} Returns the cloned value.\n     * @see _.cloneDeepWith\n     * @example\n     *\n     * function customizer(value) {\n     *   if (_.isElement(value)) {\n     *     return value.cloneNode(false);\n     *   }\n     * }\n     *\n     * var el = _.cloneWith(document.body, customizer);\n     *\n     * console.log(el === document.body);\n     * // => false\n     * console.log(el.nodeName);\n     * // => 'BODY'\n     * console.log(el.childNodes.length);\n     * // => 0\n     */\n    function cloneWith(value, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      return baseClone(value, CLONE_SYMBOLS_FLAG, customizer);\n    }\n\n    /**\n     * This method is like `_.clone` except that it recursively clones `value`.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.0.0\n     * @category Lang\n     * @param {*} value The value to recursively clone.\n     * @returns {*} Returns the deep cloned value.\n     * @see _.clone\n     * @example\n     *\n     * var objects = [{ 'a': 1 }, { 'b': 2 }];\n     *\n     * var deep = _.cloneDeep(objects);\n     * console.log(deep[0] === objects[0]);\n     * // => false\n     */\n    function cloneDeep(value) {\n      return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG);\n    }\n\n    /**\n     * This method is like `_.cloneWith` except that it recursively clones `value`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to recursively clone.\n     * @param {Function} [customizer] The function to customize cloning.\n     * @returns {*} Returns the deep cloned value.\n     * @see _.cloneWith\n     * @example\n     *\n     * function customizer(value) {\n     *   if (_.isElement(value)) {\n     *     return value.cloneNode(true);\n     *   }\n     * }\n     *\n     * var el = _.cloneDeepWith(document.body, customizer);\n     *\n     * console.log(el === document.body);\n     * // => false\n     * console.log(el.nodeName);\n     * // => 'BODY'\n     * console.log(el.childNodes.length);\n     * // => 20\n     */\n    function cloneDeepWith(value, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG, customizer);\n    }\n\n    /**\n     * Checks if `object` conforms to `source` by invoking the predicate\n     * properties of `source` with the corresponding property values of `object`.\n     *\n     * **Note:** This method is equivalent to `_.conforms` when `source` is\n     * partially applied.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.14.0\n     * @category Lang\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property predicates to conform to.\n     * @returns {boolean} Returns `true` if `object` conforms, else `false`.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2 };\n     *\n     * _.conformsTo(object, { 'b': function(n) { return n > 1; } });\n     * // => true\n     *\n     * _.conformsTo(object, { 'b': function(n) { return n > 2; } });\n     * // => false\n     */\n    function conformsTo(object, source) {\n      return source == null || baseConformsTo(object, source, keys(source));\n    }\n\n    /**\n     * Performs a\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * comparison between two values to determine if they are equivalent.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     * @example\n     *\n     * var object = { 'a': 1 };\n     * var other = { 'a': 1 };\n     *\n     * _.eq(object, object);\n     * // => true\n     *\n     * _.eq(object, other);\n     * // => false\n     *\n     * _.eq('a', 'a');\n     * // => true\n     *\n     * _.eq('a', Object('a'));\n     * // => false\n     *\n     * _.eq(NaN, NaN);\n     * // => true\n     */\n    function eq(value, other) {\n      return value === other || (value !== value && other !== other);\n    }\n\n    /**\n     * Checks if `value` is greater than `other`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.9.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is greater than `other`,\n     *  else `false`.\n     * @see _.lt\n     * @example\n     *\n     * _.gt(3, 1);\n     * // => true\n     *\n     * _.gt(3, 3);\n     * // => false\n     *\n     * _.gt(1, 3);\n     * // => false\n     */\n    var gt = createRelationalOperation(baseGt);\n\n    /**\n     * Checks if `value` is greater than or equal to `other`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.9.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is greater than or equal to\n     *  `other`, else `false`.\n     * @see _.lte\n     * @example\n     *\n     * _.gte(3, 1);\n     * // => true\n     *\n     * _.gte(3, 3);\n     * // => true\n     *\n     * _.gte(1, 3);\n     * // => false\n     */\n    var gte = createRelationalOperation(function(value, other) {\n      return value >= other;\n    });\n\n    /**\n     * Checks if `value` is likely an `arguments` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n     *  else `false`.\n     * @example\n     *\n     * _.isArguments(function() { return arguments; }());\n     * // => true\n     *\n     * _.isArguments([1, 2, 3]);\n     * // => false\n     */\n    var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n      return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n        !propertyIsEnumerable.call(value, 'callee');\n    };\n\n    /**\n     * Checks if `value` is classified as an `Array` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n     * @example\n     *\n     * _.isArray([1, 2, 3]);\n     * // => true\n     *\n     * _.isArray(document.body.children);\n     * // => false\n     *\n     * _.isArray('abc');\n     * // => false\n     *\n     * _.isArray(_.noop);\n     * // => false\n     */\n    var isArray = Array.isArray;\n\n    /**\n     * Checks if `value` is classified as an `ArrayBuffer` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.\n     * @example\n     *\n     * _.isArrayBuffer(new ArrayBuffer(2));\n     * // => true\n     *\n     * _.isArrayBuffer(new Array(2));\n     * // => false\n     */\n    var isArrayBuffer = nodeIsArrayBuffer ? baseUnary(nodeIsArrayBuffer) : baseIsArrayBuffer;\n\n    /**\n     * Checks if `value` is array-like. A value is considered array-like if it's\n     * not a function and has a `value.length` that's an integer greater than or\n     * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n     * @example\n     *\n     * _.isArrayLike([1, 2, 3]);\n     * // => true\n     *\n     * _.isArrayLike(document.body.children);\n     * // => true\n     *\n     * _.isArrayLike('abc');\n     * // => true\n     *\n     * _.isArrayLike(_.noop);\n     * // => false\n     */\n    function isArrayLike(value) {\n      return value != null && isLength(value.length) && !isFunction(value);\n    }\n\n    /**\n     * This method is like `_.isArrayLike` except that it also checks if `value`\n     * is an object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an array-like object,\n     *  else `false`.\n     * @example\n     *\n     * _.isArrayLikeObject([1, 2, 3]);\n     * // => true\n     *\n     * _.isArrayLikeObject(document.body.children);\n     * // => true\n     *\n     * _.isArrayLikeObject('abc');\n     * // => false\n     *\n     * _.isArrayLikeObject(_.noop);\n     * // => false\n     */\n    function isArrayLikeObject(value) {\n      return isObjectLike(value) && isArrayLike(value);\n    }\n\n    /**\n     * Checks if `value` is classified as a boolean primitive or object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a boolean, else `false`.\n     * @example\n     *\n     * _.isBoolean(false);\n     * // => true\n     *\n     * _.isBoolean(null);\n     * // => false\n     */\n    function isBoolean(value) {\n      return value === true || value === false ||\n        (isObjectLike(value) && baseGetTag(value) == boolTag);\n    }\n\n    /**\n     * Checks if `value` is a buffer.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n     * @example\n     *\n     * _.isBuffer(new Buffer(2));\n     * // => true\n     *\n     * _.isBuffer(new Uint8Array(2));\n     * // => false\n     */\n    var isBuffer = nativeIsBuffer || stubFalse;\n\n    /**\n     * Checks if `value` is classified as a `Date` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a date object, else `false`.\n     * @example\n     *\n     * _.isDate(new Date);\n     * // => true\n     *\n     * _.isDate('Mon April 23 2012');\n     * // => false\n     */\n    var isDate = nodeIsDate ? baseUnary(nodeIsDate) : baseIsDate;\n\n    /**\n     * Checks if `value` is likely a DOM element.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a DOM element, else `false`.\n     * @example\n     *\n     * _.isElement(document.body);\n     * // => true\n     *\n     * _.isElement('<body>');\n     * // => false\n     */\n    function isElement(value) {\n      return isObjectLike(value) && value.nodeType === 1 && !isPlainObject(value);\n    }\n\n    /**\n     * Checks if `value` is an empty object, collection, map, or set.\n     *\n     * Objects are considered empty if they have no own enumerable string keyed\n     * properties.\n     *\n     * Array-like values such as `arguments` objects, arrays, buffers, strings, or\n     * jQuery-like collections are considered empty if they have a `length` of `0`.\n     * Similarly, maps and sets are considered empty if they have a `size` of `0`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is empty, else `false`.\n     * @example\n     *\n     * _.isEmpty(null);\n     * // => true\n     *\n     * _.isEmpty(true);\n     * // => true\n     *\n     * _.isEmpty(1);\n     * // => true\n     *\n     * _.isEmpty([1, 2, 3]);\n     * // => false\n     *\n     * _.isEmpty({ 'a': 1 });\n     * // => false\n     */\n    function isEmpty(value) {\n      if (value == null) {\n        return true;\n      }\n      if (isArrayLike(value) &&\n          (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' ||\n            isBuffer(value) || isTypedArray(value) || isArguments(value))) {\n        return !value.length;\n      }\n      var tag = getTag(value);\n      if (tag == mapTag || tag == setTag) {\n        return !value.size;\n      }\n      if (isPrototype(value)) {\n        return !baseKeys(value).length;\n      }\n      for (var key in value) {\n        if (hasOwnProperty.call(value, key)) {\n          return false;\n        }\n      }\n      return true;\n    }\n\n    /**\n     * Performs a deep comparison between two values to determine if they are\n     * equivalent.\n     *\n     * **Note:** This method supports comparing arrays, array buffers, booleans,\n     * date objects, error objects, maps, numbers, `Object` objects, regexes,\n     * sets, strings, symbols, and typed arrays. `Object` objects are compared\n     * by their own, not inherited, enumerable properties. Functions and DOM\n     * nodes are compared by strict equality, i.e. `===`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     * @example\n     *\n     * var object = { 'a': 1 };\n     * var other = { 'a': 1 };\n     *\n     * _.isEqual(object, other);\n     * // => true\n     *\n     * object === other;\n     * // => false\n     */\n    function isEqual(value, other) {\n      return baseIsEqual(value, other);\n    }\n\n    /**\n     * This method is like `_.isEqual` except that it accepts `customizer` which\n     * is invoked to compare values. If `customizer` returns `undefined`, comparisons\n     * are handled by the method instead. The `customizer` is invoked with up to\n     * six arguments: (objValue, othValue [, index|key, object, other, stack]).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @param {Function} [customizer] The function to customize comparisons.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     * @example\n     *\n     * function isGreeting(value) {\n     *   return /^h(?:i|ello)$/.test(value);\n     * }\n     *\n     * function customizer(objValue, othValue) {\n     *   if (isGreeting(objValue) && isGreeting(othValue)) {\n     *     return true;\n     *   }\n     * }\n     *\n     * var array = ['hello', 'goodbye'];\n     * var other = ['hi', 'goodbye'];\n     *\n     * _.isEqualWith(array, other, customizer);\n     * // => true\n     */\n    function isEqualWith(value, other, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      var result = customizer ? customizer(value, other) : undefined;\n      return result === undefined ? baseIsEqual(value, other, undefined, customizer) : !!result;\n    }\n\n    /**\n     * Checks if `value` is an `Error`, `EvalError`, `RangeError`, `ReferenceError`,\n     * `SyntaxError`, `TypeError`, or `URIError` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an error object, else `false`.\n     * @example\n     *\n     * _.isError(new Error);\n     * // => true\n     *\n     * _.isError(Error);\n     * // => false\n     */\n    function isError(value) {\n      if (!isObjectLike(value)) {\n        return false;\n      }\n      var tag = baseGetTag(value);\n      return tag == errorTag || tag == domExcTag ||\n        (typeof value.message == 'string' && typeof value.name == 'string' && !isPlainObject(value));\n    }\n\n    /**\n     * Checks if `value` is a finite primitive number.\n     *\n     * **Note:** This method is based on\n     * [`Number.isFinite`](https://mdn.io/Number/isFinite).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a finite number, else `false`.\n     * @example\n     *\n     * _.isFinite(3);\n     * // => true\n     *\n     * _.isFinite(Number.MIN_VALUE);\n     * // => true\n     *\n     * _.isFinite(Infinity);\n     * // => false\n     *\n     * _.isFinite('3');\n     * // => false\n     */\n    function isFinite(value) {\n      return typeof value == 'number' && nativeIsFinite(value);\n    }\n\n    /**\n     * Checks if `value` is classified as a `Function` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n     * @example\n     *\n     * _.isFunction(_);\n     * // => true\n     *\n     * _.isFunction(/abc/);\n     * // => false\n     */\n    function isFunction(value) {\n      if (!isObject(value)) {\n        return false;\n      }\n      // The use of `Object#toString` avoids issues with the `typeof` operator\n      // in Safari 9 which returns 'object' for typed arrays and other constructors.\n      var tag = baseGetTag(value);\n      return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n    }\n\n    /**\n     * Checks if `value` is an integer.\n     *\n     * **Note:** This method is based on\n     * [`Number.isInteger`](https://mdn.io/Number/isInteger).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an integer, else `false`.\n     * @example\n     *\n     * _.isInteger(3);\n     * // => true\n     *\n     * _.isInteger(Number.MIN_VALUE);\n     * // => false\n     *\n     * _.isInteger(Infinity);\n     * // => false\n     *\n     * _.isInteger('3');\n     * // => false\n     */\n    function isInteger(value) {\n      return typeof value == 'number' && value == toInteger(value);\n    }\n\n    /**\n     * Checks if `value` is a valid array-like length.\n     *\n     * **Note:** This method is loosely based on\n     * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n     * @example\n     *\n     * _.isLength(3);\n     * // => true\n     *\n     * _.isLength(Number.MIN_VALUE);\n     * // => false\n     *\n     * _.isLength(Infinity);\n     * // => false\n     *\n     * _.isLength('3');\n     * // => false\n     */\n    function isLength(value) {\n      return typeof value == 'number' &&\n        value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n    }\n\n    /**\n     * Checks if `value` is the\n     * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n     * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n     * @example\n     *\n     * _.isObject({});\n     * // => true\n     *\n     * _.isObject([1, 2, 3]);\n     * // => true\n     *\n     * _.isObject(_.noop);\n     * // => true\n     *\n     * _.isObject(null);\n     * // => false\n     */\n    function isObject(value) {\n      var type = typeof value;\n      return value != null && (type == 'object' || type == 'function');\n    }\n\n    /**\n     * Checks if `value` is object-like. A value is object-like if it's not `null`\n     * and has a `typeof` result of \"object\".\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n     * @example\n     *\n     * _.isObjectLike({});\n     * // => true\n     *\n     * _.isObjectLike([1, 2, 3]);\n     * // => true\n     *\n     * _.isObjectLike(_.noop);\n     * // => false\n     *\n     * _.isObjectLike(null);\n     * // => false\n     */\n    function isObjectLike(value) {\n      return value != null && typeof value == 'object';\n    }\n\n    /**\n     * Checks if `value` is classified as a `Map` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n     * @example\n     *\n     * _.isMap(new Map);\n     * // => true\n     *\n     * _.isMap(new WeakMap);\n     * // => false\n     */\n    var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;\n\n    /**\n     * Performs a partial deep comparison between `object` and `source` to\n     * determine if `object` contains equivalent property values.\n     *\n     * **Note:** This method is equivalent to `_.matches` when `source` is\n     * partially applied.\n     *\n     * Partial comparisons will match empty array and empty object `source`\n     * values against any array or object value, respectively. See `_.isEqual`\n     * for a list of supported value comparisons.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Lang\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property values to match.\n     * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2 };\n     *\n     * _.isMatch(object, { 'b': 2 });\n     * // => true\n     *\n     * _.isMatch(object, { 'b': 1 });\n     * // => false\n     */\n    function isMatch(object, source) {\n      return object === source || baseIsMatch(object, source, getMatchData(source));\n    }\n\n    /**\n     * This method is like `_.isMatch` except that it accepts `customizer` which\n     * is invoked to compare values. If `customizer` returns `undefined`, comparisons\n     * are handled by the method instead. The `customizer` is invoked with five\n     * arguments: (objValue, srcValue, index|key, object, source).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property values to match.\n     * @param {Function} [customizer] The function to customize comparisons.\n     * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n     * @example\n     *\n     * function isGreeting(value) {\n     *   return /^h(?:i|ello)$/.test(value);\n     * }\n     *\n     * function customizer(objValue, srcValue) {\n     *   if (isGreeting(objValue) && isGreeting(srcValue)) {\n     *     return true;\n     *   }\n     * }\n     *\n     * var object = { 'greeting': 'hello' };\n     * var source = { 'greeting': 'hi' };\n     *\n     * _.isMatchWith(object, source, customizer);\n     * // => true\n     */\n    function isMatchWith(object, source, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      return baseIsMatch(object, source, getMatchData(source), customizer);\n    }\n\n    /**\n     * Checks if `value` is `NaN`.\n     *\n     * **Note:** This method is based on\n     * [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as\n     * global [`isNaN`](https://mdn.io/isNaN) which returns `true` for\n     * `undefined` and other non-number values.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n     * @example\n     *\n     * _.isNaN(NaN);\n     * // => true\n     *\n     * _.isNaN(new Number(NaN));\n     * // => true\n     *\n     * isNaN(undefined);\n     * // => true\n     *\n     * _.isNaN(undefined);\n     * // => false\n     */\n    function isNaN(value) {\n      // An `NaN` primitive is the only value that is not equal to itself.\n      // Perform the `toStringTag` check first to avoid errors with some\n      // ActiveX objects in IE.\n      return isNumber(value) && value != +value;\n    }\n\n    /**\n     * Checks if `value` is a pristine native function.\n     *\n     * **Note:** This method can't reliably detect native functions in the presence\n     * of the core-js package because core-js circumvents this kind of detection.\n     * Despite multiple requests, the core-js maintainer has made it clear: any\n     * attempt to fix the detection will be obstructed. As a result, we're left\n     * with little choice but to throw an error. Unfortunately, this also affects\n     * packages, like [babel-polyfill](https://www.npmjs.com/package/babel-polyfill),\n     * which rely on core-js.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a native function,\n     *  else `false`.\n     * @example\n     *\n     * _.isNative(Array.prototype.push);\n     * // => true\n     *\n     * _.isNative(_);\n     * // => false\n     */\n    function isNative(value) {\n      if (isMaskable(value)) {\n        throw new Error(CORE_ERROR_TEXT);\n      }\n      return baseIsNative(value);\n    }\n\n    /**\n     * Checks if `value` is `null`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is `null`, else `false`.\n     * @example\n     *\n     * _.isNull(null);\n     * // => true\n     *\n     * _.isNull(void 0);\n     * // => false\n     */\n    function isNull(value) {\n      return value === null;\n    }\n\n    /**\n     * Checks if `value` is `null` or `undefined`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is nullish, else `false`.\n     * @example\n     *\n     * _.isNil(null);\n     * // => true\n     *\n     * _.isNil(void 0);\n     * // => true\n     *\n     * _.isNil(NaN);\n     * // => false\n     */\n    function isNil(value) {\n      return value == null;\n    }\n\n    /**\n     * Checks if `value` is classified as a `Number` primitive or object.\n     *\n     * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are\n     * classified as numbers, use the `_.isFinite` method.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a number, else `false`.\n     * @example\n     *\n     * _.isNumber(3);\n     * // => true\n     *\n     * _.isNumber(Number.MIN_VALUE);\n     * // => true\n     *\n     * _.isNumber(Infinity);\n     * // => true\n     *\n     * _.isNumber('3');\n     * // => false\n     */\n    function isNumber(value) {\n      return typeof value == 'number' ||\n        (isObjectLike(value) && baseGetTag(value) == numberTag);\n    }\n\n    /**\n     * Checks if `value` is a plain object, that is, an object created by the\n     * `Object` constructor or one with a `[[Prototype]]` of `null`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.8.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     * }\n     *\n     * _.isPlainObject(new Foo);\n     * // => false\n     *\n     * _.isPlainObject([1, 2, 3]);\n     * // => false\n     *\n     * _.isPlainObject({ 'x': 0, 'y': 0 });\n     * // => true\n     *\n     * _.isPlainObject(Object.create(null));\n     * // => true\n     */\n    function isPlainObject(value) {\n      if (!isObjectLike(value) || baseGetTag(value) != objectTag) {\n        return false;\n      }\n      var proto = getPrototype(value);\n      if (proto === null) {\n        return true;\n      }\n      var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;\n      return typeof Ctor == 'function' && Ctor instanceof Ctor &&\n        funcToString.call(Ctor) == objectCtorString;\n    }\n\n    /**\n     * Checks if `value` is classified as a `RegExp` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\n     * @example\n     *\n     * _.isRegExp(/abc/);\n     * // => true\n     *\n     * _.isRegExp('/abc/');\n     * // => false\n     */\n    var isRegExp = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp;\n\n    /**\n     * Checks if `value` is a safe integer. An integer is safe if it's an IEEE-754\n     * double precision number which isn't the result of a rounded unsafe integer.\n     *\n     * **Note:** This method is based on\n     * [`Number.isSafeInteger`](https://mdn.io/Number/isSafeInteger).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a safe integer, else `false`.\n     * @example\n     *\n     * _.isSafeInteger(3);\n     * // => true\n     *\n     * _.isSafeInteger(Number.MIN_VALUE);\n     * // => false\n     *\n     * _.isSafeInteger(Infinity);\n     * // => false\n     *\n     * _.isSafeInteger('3');\n     * // => false\n     */\n    function isSafeInteger(value) {\n      return isInteger(value) && value >= -MAX_SAFE_INTEGER && value <= MAX_SAFE_INTEGER;\n    }\n\n    /**\n     * Checks if `value` is classified as a `Set` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n     * @example\n     *\n     * _.isSet(new Set);\n     * // => true\n     *\n     * _.isSet(new WeakSet);\n     * // => false\n     */\n    var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;\n\n    /**\n     * Checks if `value` is classified as a `String` primitive or object.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a string, else `false`.\n     * @example\n     *\n     * _.isString('abc');\n     * // => true\n     *\n     * _.isString(1);\n     * // => false\n     */\n    function isString(value) {\n      return typeof value == 'string' ||\n        (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag);\n    }\n\n    /**\n     * Checks if `value` is classified as a `Symbol` primitive or object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n     * @example\n     *\n     * _.isSymbol(Symbol.iterator);\n     * // => true\n     *\n     * _.isSymbol('abc');\n     * // => false\n     */\n    function isSymbol(value) {\n      return typeof value == 'symbol' ||\n        (isObjectLike(value) && baseGetTag(value) == symbolTag);\n    }\n\n    /**\n     * Checks if `value` is classified as a typed array.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n     * @example\n     *\n     * _.isTypedArray(new Uint8Array);\n     * // => true\n     *\n     * _.isTypedArray([]);\n     * // => false\n     */\n    var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\n    /**\n     * Checks if `value` is `undefined`.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.\n     * @example\n     *\n     * _.isUndefined(void 0);\n     * // => true\n     *\n     * _.isUndefined(null);\n     * // => false\n     */\n    function isUndefined(value) {\n      return value === undefined;\n    }\n\n    /**\n     * Checks if `value` is classified as a `WeakMap` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a weak map, else `false`.\n     * @example\n     *\n     * _.isWeakMap(new WeakMap);\n     * // => true\n     *\n     * _.isWeakMap(new Map);\n     * // => false\n     */\n    function isWeakMap(value) {\n      return isObjectLike(value) && getTag(value) == weakMapTag;\n    }\n\n    /**\n     * Checks if `value` is classified as a `WeakSet` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a weak set, else `false`.\n     * @example\n     *\n     * _.isWeakSet(new WeakSet);\n     * // => true\n     *\n     * _.isWeakSet(new Set);\n     * // => false\n     */\n    function isWeakSet(value) {\n      return isObjectLike(value) && baseGetTag(value) == weakSetTag;\n    }\n\n    /**\n     * Checks if `value` is less than `other`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.9.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is less than `other`,\n     *  else `false`.\n     * @see _.gt\n     * @example\n     *\n     * _.lt(1, 3);\n     * // => true\n     *\n     * _.lt(3, 3);\n     * // => false\n     *\n     * _.lt(3, 1);\n     * // => false\n     */\n    var lt = createRelationalOperation(baseLt);\n\n    /**\n     * Checks if `value` is less than or equal to `other`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.9.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is less than or equal to\n     *  `other`, else `false`.\n     * @see _.gte\n     * @example\n     *\n     * _.lte(1, 3);\n     * // => true\n     *\n     * _.lte(3, 3);\n     * // => true\n     *\n     * _.lte(3, 1);\n     * // => false\n     */\n    var lte = createRelationalOperation(function(value, other) {\n      return value <= other;\n    });\n\n    /**\n     * Converts `value` to an array.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {Array} Returns the converted array.\n     * @example\n     *\n     * _.toArray({ 'a': 1, 'b': 2 });\n     * // => [1, 2]\n     *\n     * _.toArray('abc');\n     * // => ['a', 'b', 'c']\n     *\n     * _.toArray(1);\n     * // => []\n     *\n     * _.toArray(null);\n     * // => []\n     */\n    function toArray(value) {\n      if (!value) {\n        return [];\n      }\n      if (isArrayLike(value)) {\n        return isString(value) ? stringToArray(value) : copyArray(value);\n      }\n      if (symIterator && value[symIterator]) {\n        return iteratorToArray(value[symIterator]());\n      }\n      var tag = getTag(value),\n          func = tag == mapTag ? mapToArray : (tag == setTag ? setToArray : values);\n\n      return func(value);\n    }\n\n    /**\n     * Converts `value` to a finite number.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.12.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {number} Returns the converted number.\n     * @example\n     *\n     * _.toFinite(3.2);\n     * // => 3.2\n     *\n     * _.toFinite(Number.MIN_VALUE);\n     * // => 5e-324\n     *\n     * _.toFinite(Infinity);\n     * // => 1.7976931348623157e+308\n     *\n     * _.toFinite('3.2');\n     * // => 3.2\n     */\n    function toFinite(value) {\n      if (!value) {\n        return value === 0 ? value : 0;\n      }\n      value = toNumber(value);\n      if (value === INFINITY || value === -INFINITY) {\n        var sign = (value < 0 ? -1 : 1);\n        return sign * MAX_INTEGER;\n      }\n      return value === value ? value : 0;\n    }\n\n    /**\n     * Converts `value` to an integer.\n     *\n     * **Note:** This method is loosely based on\n     * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {number} Returns the converted integer.\n     * @example\n     *\n     * _.toInteger(3.2);\n     * // => 3\n     *\n     * _.toInteger(Number.MIN_VALUE);\n     * // => 0\n     *\n     * _.toInteger(Infinity);\n     * // => 1.7976931348623157e+308\n     *\n     * _.toInteger('3.2');\n     * // => 3\n     */\n    function toInteger(value) {\n      var result = toFinite(value),\n          remainder = result % 1;\n\n      return result === result ? (remainder ? result - remainder : result) : 0;\n    }\n\n    /**\n     * Converts `value` to an integer suitable for use as the length of an\n     * array-like object.\n     *\n     * **Note:** This method is based on\n     * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {number} Returns the converted integer.\n     * @example\n     *\n     * _.toLength(3.2);\n     * // => 3\n     *\n     * _.toLength(Number.MIN_VALUE);\n     * // => 0\n     *\n     * _.toLength(Infinity);\n     * // => 4294967295\n     *\n     * _.toLength('3.2');\n     * // => 3\n     */\n    function toLength(value) {\n      return value ? baseClamp(toInteger(value), 0, MAX_ARRAY_LENGTH) : 0;\n    }\n\n    /**\n     * Converts `value` to a number.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to process.\n     * @returns {number} Returns the number.\n     * @example\n     *\n     * _.toNumber(3.2);\n     * // => 3.2\n     *\n     * _.toNumber(Number.MIN_VALUE);\n     * // => 5e-324\n     *\n     * _.toNumber(Infinity);\n     * // => Infinity\n     *\n     * _.toNumber('3.2');\n     * // => 3.2\n     */\n    function toNumber(value) {\n      if (typeof value == 'number') {\n        return value;\n      }\n      if (isSymbol(value)) {\n        return NAN;\n      }\n      if (isObject(value)) {\n        var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n        value = isObject(other) ? (other + '') : other;\n      }\n      if (typeof value != 'string') {\n        return value === 0 ? value : +value;\n      }\n      value = baseTrim(value);\n      var isBinary = reIsBinary.test(value);\n      return (isBinary || reIsOctal.test(value))\n        ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n        : (reIsBadHex.test(value) ? NAN : +value);\n    }\n\n    /**\n     * Converts `value` to a plain object flattening inherited enumerable string\n     * keyed properties of `value` to own properties of the plain object.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {Object} Returns the converted plain object.\n     * @example\n     *\n     * function Foo() {\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.assign({ 'a': 1 }, new Foo);\n     * // => { 'a': 1, 'b': 2 }\n     *\n     * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));\n     * // => { 'a': 1, 'b': 2, 'c': 3 }\n     */\n    function toPlainObject(value) {\n      return copyObject(value, keysIn(value));\n    }\n\n    /**\n     * Converts `value` to a safe integer. A safe integer can be compared and\n     * represented correctly.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {number} Returns the converted integer.\n     * @example\n     *\n     * _.toSafeInteger(3.2);\n     * // => 3\n     *\n     * _.toSafeInteger(Number.MIN_VALUE);\n     * // => 0\n     *\n     * _.toSafeInteger(Infinity);\n     * // => 9007199254740991\n     *\n     * _.toSafeInteger('3.2');\n     * // => 3\n     */\n    function toSafeInteger(value) {\n      return value\n        ? baseClamp(toInteger(value), -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER)\n        : (value === 0 ? value : 0);\n    }\n\n    /**\n     * Converts `value` to a string. An empty string is returned for `null`\n     * and `undefined` values. The sign of `-0` is preserved.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {string} Returns the converted string.\n     * @example\n     *\n     * _.toString(null);\n     * // => ''\n     *\n     * _.toString(-0);\n     * // => '-0'\n     *\n     * _.toString([1, 2, 3]);\n     * // => '1,2,3'\n     */\n    function toString(value) {\n      return value == null ? '' : baseToString(value);\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Assigns own enumerable string keyed properties of source objects to the\n     * destination object. Source objects are applied from left to right.\n     * Subsequent sources overwrite property assignments of previous sources.\n     *\n     * **Note:** This method mutates `object` and is loosely based on\n     * [`Object.assign`](https://mdn.io/Object/assign).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.10.0\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @see _.assignIn\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     * }\n     *\n     * function Bar() {\n     *   this.c = 3;\n     * }\n     *\n     * Foo.prototype.b = 2;\n     * Bar.prototype.d = 4;\n     *\n     * _.assign({ 'a': 0 }, new Foo, new Bar);\n     * // => { 'a': 1, 'c': 3 }\n     */\n    var assign = createAssigner(function(object, source) {\n      if (isPrototype(source) || isArrayLike(source)) {\n        copyObject(source, keys(source), object);\n        return;\n      }\n      for (var key in source) {\n        if (hasOwnProperty.call(source, key)) {\n          assignValue(object, key, source[key]);\n        }\n      }\n    });\n\n    /**\n     * This method is like `_.assign` except that it iterates over own and\n     * inherited source properties.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @alias extend\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @see _.assign\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     * }\n     *\n     * function Bar() {\n     *   this.c = 3;\n     * }\n     *\n     * Foo.prototype.b = 2;\n     * Bar.prototype.d = 4;\n     *\n     * _.assignIn({ 'a': 0 }, new Foo, new Bar);\n     * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 }\n     */\n    var assignIn = createAssigner(function(object, source) {\n      copyObject(source, keysIn(source), object);\n    });\n\n    /**\n     * This method is like `_.assignIn` except that it accepts `customizer`\n     * which is invoked to produce the assigned values. If `customizer` returns\n     * `undefined`, assignment is handled by the method instead. The `customizer`\n     * is invoked with five arguments: (objValue, srcValue, key, object, source).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @alias extendWith\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} sources The source objects.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @returns {Object} Returns `object`.\n     * @see _.assignWith\n     * @example\n     *\n     * function customizer(objValue, srcValue) {\n     *   return _.isUndefined(objValue) ? srcValue : objValue;\n     * }\n     *\n     * var defaults = _.partialRight(_.assignInWith, customizer);\n     *\n     * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n     * // => { 'a': 1, 'b': 2 }\n     */\n    var assignInWith = createAssigner(function(object, source, srcIndex, customizer) {\n      copyObject(source, keysIn(source), object, customizer);\n    });\n\n    /**\n     * This method is like `_.assign` except that it accepts `customizer`\n     * which is invoked to produce the assigned values. If `customizer` returns\n     * `undefined`, assignment is handled by the method instead. The `customizer`\n     * is invoked with five arguments: (objValue, srcValue, key, object, source).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} sources The source objects.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @returns {Object} Returns `object`.\n     * @see _.assignInWith\n     * @example\n     *\n     * function customizer(objValue, srcValue) {\n     *   return _.isUndefined(objValue) ? srcValue : objValue;\n     * }\n     *\n     * var defaults = _.partialRight(_.assignWith, customizer);\n     *\n     * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n     * // => { 'a': 1, 'b': 2 }\n     */\n    var assignWith = createAssigner(function(object, source, srcIndex, customizer) {\n      copyObject(source, keys(source), object, customizer);\n    });\n\n    /**\n     * Creates an array of values corresponding to `paths` of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.0.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {...(string|string[])} [paths] The property paths to pick.\n     * @returns {Array} Returns the picked values.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };\n     *\n     * _.at(object, ['a[0].b.c', 'a[1]']);\n     * // => [3, 4]\n     */\n    var at = flatRest(baseAt);\n\n    /**\n     * Creates an object that inherits from the `prototype` object. If a\n     * `properties` object is given, its own enumerable string keyed properties\n     * are assigned to the created object.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.3.0\n     * @category Object\n     * @param {Object} prototype The object to inherit from.\n     * @param {Object} [properties] The properties to assign to the object.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * function Shape() {\n     *   this.x = 0;\n     *   this.y = 0;\n     * }\n     *\n     * function Circle() {\n     *   Shape.call(this);\n     * }\n     *\n     * Circle.prototype = _.create(Shape.prototype, {\n     *   'constructor': Circle\n     * });\n     *\n     * var circle = new Circle;\n     * circle instanceof Circle;\n     * // => true\n     *\n     * circle instanceof Shape;\n     * // => true\n     */\n    function create(prototype, properties) {\n      var result = baseCreate(prototype);\n      return properties == null ? result : baseAssign(result, properties);\n    }\n\n    /**\n     * Assigns own and inherited enumerable string keyed properties of source\n     * objects to the destination object for all destination properties that\n     * resolve to `undefined`. Source objects are applied from left to right.\n     * Once a property is set, additional values of the same property are ignored.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @see _.defaultsDeep\n     * @example\n     *\n     * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n     * // => { 'a': 1, 'b': 2 }\n     */\n    var defaults = baseRest(function(object, sources) {\n      object = Object(object);\n\n      var index = -1;\n      var length = sources.length;\n      var guard = length > 2 ? sources[2] : undefined;\n\n      if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n        length = 1;\n      }\n\n      while (++index < length) {\n        var source = sources[index];\n        var props = keysIn(source);\n        var propsIndex = -1;\n        var propsLength = props.length;\n\n        while (++propsIndex < propsLength) {\n          var key = props[propsIndex];\n          var value = object[key];\n\n          if (value === undefined ||\n              (eq(value, objectProto[key]) && !hasOwnProperty.call(object, key))) {\n            object[key] = source[key];\n          }\n        }\n      }\n\n      return object;\n    });\n\n    /**\n     * This method is like `_.defaults` except that it recursively assigns\n     * default properties.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.10.0\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @see _.defaults\n     * @example\n     *\n     * _.defaultsDeep({ 'a': { 'b': 2 } }, { 'a': { 'b': 1, 'c': 3 } });\n     * // => { 'a': { 'b': 2, 'c': 3 } }\n     */\n    var defaultsDeep = baseRest(function(args) {\n      args.push(undefined, customDefaultsMerge);\n      return apply(mergeWith, undefined, args);\n    });\n\n    /**\n     * This method is like `_.find` except that it returns the key of the first\n     * element `predicate` returns truthy for instead of the element itself.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.1.0\n     * @category Object\n     * @param {Object} object The object to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {string|undefined} Returns the key of the matched element,\n     *  else `undefined`.\n     * @example\n     *\n     * var users = {\n     *   'barney':  { 'age': 36, 'active': true },\n     *   'fred':    { 'age': 40, 'active': false },\n     *   'pebbles': { 'age': 1,  'active': true }\n     * };\n     *\n     * _.findKey(users, function(o) { return o.age < 40; });\n     * // => 'barney' (iteration order is not guaranteed)\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.findKey(users, { 'age': 1, 'active': true });\n     * // => 'pebbles'\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.findKey(users, ['active', false]);\n     * // => 'fred'\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.findKey(users, 'active');\n     * // => 'barney'\n     */\n    function findKey(object, predicate) {\n      return baseFindKey(object, getIteratee(predicate, 3), baseForOwn);\n    }\n\n    /**\n     * This method is like `_.findKey` except that it iterates over elements of\n     * a collection in the opposite order.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Object\n     * @param {Object} object The object to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {string|undefined} Returns the key of the matched element,\n     *  else `undefined`.\n     * @example\n     *\n     * var users = {\n     *   'barney':  { 'age': 36, 'active': true },\n     *   'fred':    { 'age': 40, 'active': false },\n     *   'pebbles': { 'age': 1,  'active': true }\n     * };\n     *\n     * _.findLastKey(users, function(o) { return o.age < 40; });\n     * // => returns 'pebbles' assuming `_.findKey` returns 'barney'\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.findLastKey(users, { 'age': 36, 'active': true });\n     * // => 'barney'\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.findLastKey(users, ['active', false]);\n     * // => 'fred'\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.findLastKey(users, 'active');\n     * // => 'pebbles'\n     */\n    function findLastKey(object, predicate) {\n      return baseFindKey(object, getIteratee(predicate, 3), baseForOwnRight);\n    }\n\n    /**\n     * Iterates over own and inherited enumerable string keyed properties of an\n     * object and invokes `iteratee` for each property. The iteratee is invoked\n     * with three arguments: (value, key, object). Iteratee functions may exit\n     * iteration early by explicitly returning `false`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.3.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     * @see _.forInRight\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.forIn(new Foo, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => Logs 'a', 'b', then 'c' (iteration order is not guaranteed).\n     */\n    function forIn(object, iteratee) {\n      return object == null\n        ? object\n        : baseFor(object, getIteratee(iteratee, 3), keysIn);\n    }\n\n    /**\n     * This method is like `_.forIn` except that it iterates over properties of\n     * `object` in the opposite order.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     * @see _.forIn\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.forInRight(new Foo, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => Logs 'c', 'b', then 'a' assuming `_.forIn` logs 'a', 'b', then 'c'.\n     */\n    function forInRight(object, iteratee) {\n      return object == null\n        ? object\n        : baseForRight(object, getIteratee(iteratee, 3), keysIn);\n    }\n\n    /**\n     * Iterates over own enumerable string keyed properties of an object and\n     * invokes `iteratee` for each property. The iteratee is invoked with three\n     * arguments: (value, key, object). Iteratee functions may exit iteration\n     * early by explicitly returning `false`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.3.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     * @see _.forOwnRight\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.forOwn(new Foo, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => Logs 'a' then 'b' (iteration order is not guaranteed).\n     */\n    function forOwn(object, iteratee) {\n      return object && baseForOwn(object, getIteratee(iteratee, 3));\n    }\n\n    /**\n     * This method is like `_.forOwn` except that it iterates over properties of\n     * `object` in the opposite order.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     * @see _.forOwn\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.forOwnRight(new Foo, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => Logs 'b' then 'a' assuming `_.forOwn` logs 'a' then 'b'.\n     */\n    function forOwnRight(object, iteratee) {\n      return object && baseForOwnRight(object, getIteratee(iteratee, 3));\n    }\n\n    /**\n     * Creates an array of function property names from own enumerable properties\n     * of `object`.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to inspect.\n     * @returns {Array} Returns the function names.\n     * @see _.functionsIn\n     * @example\n     *\n     * function Foo() {\n     *   this.a = _.constant('a');\n     *   this.b = _.constant('b');\n     * }\n     *\n     * Foo.prototype.c = _.constant('c');\n     *\n     * _.functions(new Foo);\n     * // => ['a', 'b']\n     */\n    function functions(object) {\n      return object == null ? [] : baseFunctions(object, keys(object));\n    }\n\n    /**\n     * Creates an array of function property names from own and inherited\n     * enumerable properties of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The object to inspect.\n     * @returns {Array} Returns the function names.\n     * @see _.functions\n     * @example\n     *\n     * function Foo() {\n     *   this.a = _.constant('a');\n     *   this.b = _.constant('b');\n     * }\n     *\n     * Foo.prototype.c = _.constant('c');\n     *\n     * _.functionsIn(new Foo);\n     * // => ['a', 'b', 'c']\n     */\n    function functionsIn(object) {\n      return object == null ? [] : baseFunctions(object, keysIn(object));\n    }\n\n    /**\n     * Gets the value at `path` of `object`. If the resolved value is\n     * `undefined`, the `defaultValue` is returned in its place.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.7.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the property to get.\n     * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n     * @returns {*} Returns the resolved value.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n     *\n     * _.get(object, 'a[0].b.c');\n     * // => 3\n     *\n     * _.get(object, ['a', '0', 'b', 'c']);\n     * // => 3\n     *\n     * _.get(object, 'a.b.c', 'default');\n     * // => 'default'\n     */\n    function get(object, path, defaultValue) {\n      var result = object == null ? undefined : baseGet(object, path);\n      return result === undefined ? defaultValue : result;\n    }\n\n    /**\n     * Checks if `path` is a direct property of `object`.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path to check.\n     * @returns {boolean} Returns `true` if `path` exists, else `false`.\n     * @example\n     *\n     * var object = { 'a': { 'b': 2 } };\n     * var other = _.create({ 'a': _.create({ 'b': 2 }) });\n     *\n     * _.has(object, 'a');\n     * // => true\n     *\n     * _.has(object, 'a.b');\n     * // => true\n     *\n     * _.has(object, ['a', 'b']);\n     * // => true\n     *\n     * _.has(other, 'a');\n     * // => false\n     */\n    function has(object, path) {\n      return object != null && hasPath(object, path, baseHas);\n    }\n\n    /**\n     * Checks if `path` is a direct or inherited property of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path to check.\n     * @returns {boolean} Returns `true` if `path` exists, else `false`.\n     * @example\n     *\n     * var object = _.create({ 'a': _.create({ 'b': 2 }) });\n     *\n     * _.hasIn(object, 'a');\n     * // => true\n     *\n     * _.hasIn(object, 'a.b');\n     * // => true\n     *\n     * _.hasIn(object, ['a', 'b']);\n     * // => true\n     *\n     * _.hasIn(object, 'b');\n     * // => false\n     */\n    function hasIn(object, path) {\n      return object != null && hasPath(object, path, baseHasIn);\n    }\n\n    /**\n     * Creates an object composed of the inverted keys and values of `object`.\n     * If `object` contains duplicate values, subsequent values overwrite\n     * property assignments of previous values.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.7.0\n     * @category Object\n     * @param {Object} object The object to invert.\n     * @returns {Object} Returns the new inverted object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2, 'c': 1 };\n     *\n     * _.invert(object);\n     * // => { '1': 'c', '2': 'b' }\n     */\n    var invert = createInverter(function(result, value, key) {\n      if (value != null &&\n          typeof value.toString != 'function') {\n        value = nativeObjectToString.call(value);\n      }\n\n      result[value] = key;\n    }, constant(identity));\n\n    /**\n     * This method is like `_.invert` except that the inverted object is generated\n     * from the results of running each element of `object` thru `iteratee`. The\n     * corresponding inverted value of each inverted key is an array of keys\n     * responsible for generating the inverted value. The iteratee is invoked\n     * with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.1.0\n     * @category Object\n     * @param {Object} object The object to invert.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Object} Returns the new inverted object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2, 'c': 1 };\n     *\n     * _.invertBy(object);\n     * // => { '1': ['a', 'c'], '2': ['b'] }\n     *\n     * _.invertBy(object, function(value) {\n     *   return 'group' + value;\n     * });\n     * // => { 'group1': ['a', 'c'], 'group2': ['b'] }\n     */\n    var invertBy = createInverter(function(result, value, key) {\n      if (value != null &&\n          typeof value.toString != 'function') {\n        value = nativeObjectToString.call(value);\n      }\n\n      if (hasOwnProperty.call(result, value)) {\n        result[value].push(key);\n      } else {\n        result[value] = [key];\n      }\n    }, getIteratee);\n\n    /**\n     * Invokes the method at `path` of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the method to invoke.\n     * @param {...*} [args] The arguments to invoke the method with.\n     * @returns {*} Returns the result of the invoked method.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': [1, 2, 3, 4] } }] };\n     *\n     * _.invoke(object, 'a[0].b.c.slice', 1, 3);\n     * // => [2, 3]\n     */\n    var invoke = baseRest(baseInvoke);\n\n    /**\n     * Creates an array of the own enumerable property names of `object`.\n     *\n     * **Note:** Non-object values are coerced to objects. See the\n     * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n     * for more details.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.keys(new Foo);\n     * // => ['a', 'b'] (iteration order is not guaranteed)\n     *\n     * _.keys('hi');\n     * // => ['0', '1']\n     */\n    function keys(object) {\n      return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n    }\n\n    /**\n     * Creates an array of the own and inherited enumerable property names of `object`.\n     *\n     * **Note:** Non-object values are coerced to objects.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.keysIn(new Foo);\n     * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n     */\n    function keysIn(object) {\n      return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);\n    }\n\n    /**\n     * The opposite of `_.mapValues`; this method creates an object with the\n     * same values as `object` and keys generated by running each own enumerable\n     * string keyed property of `object` thru `iteratee`. The iteratee is invoked\n     * with three arguments: (value, key, object).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.8.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns the new mapped object.\n     * @see _.mapValues\n     * @example\n     *\n     * _.mapKeys({ 'a': 1, 'b': 2 }, function(value, key) {\n     *   return key + value;\n     * });\n     * // => { 'a1': 1, 'b2': 2 }\n     */\n    function mapKeys(object, iteratee) {\n      var result = {};\n      iteratee = getIteratee(iteratee, 3);\n\n      baseForOwn(object, function(value, key, object) {\n        baseAssignValue(result, iteratee(value, key, object), value);\n      });\n      return result;\n    }\n\n    /**\n     * Creates an object with the same keys as `object` and values generated\n     * by running each own enumerable string keyed property of `object` thru\n     * `iteratee`. The iteratee is invoked with three arguments:\n     * (value, key, object).\n     *\n     * @static\n     * @memberOf _\n     * @since 2.4.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns the new mapped object.\n     * @see _.mapKeys\n     * @example\n     *\n     * var users = {\n     *   'fred':    { 'user': 'fred',    'age': 40 },\n     *   'pebbles': { 'user': 'pebbles', 'age': 1 }\n     * };\n     *\n     * _.mapValues(users, function(o) { return o.age; });\n     * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.mapValues(users, 'age');\n     * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\n     */\n    function mapValues(object, iteratee) {\n      var result = {};\n      iteratee = getIteratee(iteratee, 3);\n\n      baseForOwn(object, function(value, key, object) {\n        baseAssignValue(result, key, iteratee(value, key, object));\n      });\n      return result;\n    }\n\n    /**\n     * This method is like `_.assign` except that it recursively merges own and\n     * inherited enumerable string keyed properties of source objects into the\n     * destination object. Source properties that resolve to `undefined` are\n     * skipped if a destination value exists. Array and plain object properties\n     * are merged recursively. Other objects and value types are overridden by\n     * assignment. Source objects are applied from left to right. Subsequent\n     * sources overwrite property assignments of previous sources.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.5.0\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = {\n     *   'a': [{ 'b': 2 }, { 'd': 4 }]\n     * };\n     *\n     * var other = {\n     *   'a': [{ 'c': 3 }, { 'e': 5 }]\n     * };\n     *\n     * _.merge(object, other);\n     * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }\n     */\n    var merge = createAssigner(function(object, source, srcIndex) {\n      baseMerge(object, source, srcIndex);\n    });\n\n    /**\n     * This method is like `_.merge` except that it accepts `customizer` which\n     * is invoked to produce the merged values of the destination and source\n     * properties. If `customizer` returns `undefined`, merging is handled by the\n     * method instead. The `customizer` is invoked with six arguments:\n     * (objValue, srcValue, key, object, source, stack).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} sources The source objects.\n     * @param {Function} customizer The function to customize assigned values.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * function customizer(objValue, srcValue) {\n     *   if (_.isArray(objValue)) {\n     *     return objValue.concat(srcValue);\n     *   }\n     * }\n     *\n     * var object = { 'a': [1], 'b': [2] };\n     * var other = { 'a': [3], 'b': [4] };\n     *\n     * _.mergeWith(object, other, customizer);\n     * // => { 'a': [1, 3], 'b': [2, 4] }\n     */\n    var mergeWith = createAssigner(function(object, source, srcIndex, customizer) {\n      baseMerge(object, source, srcIndex, customizer);\n    });\n\n    /**\n     * The opposite of `_.pick`; this method creates an object composed of the\n     * own and inherited enumerable property paths of `object` that are not omitted.\n     *\n     * **Note:** This method is considerably slower than `_.pick`.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The source object.\n     * @param {...(string|string[])} [paths] The property paths to omit.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': '2', 'c': 3 };\n     *\n     * _.omit(object, ['a', 'c']);\n     * // => { 'b': '2' }\n     */\n    var omit = flatRest(function(object, paths) {\n      var result = {};\n      if (object == null) {\n        return result;\n      }\n      var isDeep = false;\n      paths = arrayMap(paths, function(path) {\n        path = castPath(path, object);\n        isDeep || (isDeep = path.length > 1);\n        return path;\n      });\n      copyObject(object, getAllKeysIn(object), result);\n      if (isDeep) {\n        result = baseClone(result, CLONE_DEEP_FLAG | CLONE_FLAT_FLAG | CLONE_SYMBOLS_FLAG, customOmitClone);\n      }\n      var length = paths.length;\n      while (length--) {\n        baseUnset(result, paths[length]);\n      }\n      return result;\n    });\n\n    /**\n     * The opposite of `_.pickBy`; this method creates an object composed of\n     * the own and inherited enumerable string keyed properties of `object` that\n     * `predicate` doesn't return truthy for. The predicate is invoked with two\n     * arguments: (value, key).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The source object.\n     * @param {Function} [predicate=_.identity] The function invoked per property.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': '2', 'c': 3 };\n     *\n     * _.omitBy(object, _.isNumber);\n     * // => { 'b': '2' }\n     */\n    function omitBy(object, predicate) {\n      return pickBy(object, negate(getIteratee(predicate)));\n    }\n\n    /**\n     * Creates an object composed of the picked `object` properties.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The source object.\n     * @param {...(string|string[])} [paths] The property paths to pick.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': '2', 'c': 3 };\n     *\n     * _.pick(object, ['a', 'c']);\n     * // => { 'a': 1, 'c': 3 }\n     */\n    var pick = flatRest(function(object, paths) {\n      return object == null ? {} : basePick(object, paths);\n    });\n\n    /**\n     * Creates an object composed of the `object` properties `predicate` returns\n     * truthy for. The predicate is invoked with two arguments: (value, key).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The source object.\n     * @param {Function} [predicate=_.identity] The function invoked per property.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': '2', 'c': 3 };\n     *\n     * _.pickBy(object, _.isNumber);\n     * // => { 'a': 1, 'c': 3 }\n     */\n    function pickBy(object, predicate) {\n      if (object == null) {\n        return {};\n      }\n      var props = arrayMap(getAllKeysIn(object), function(prop) {\n        return [prop];\n      });\n      predicate = getIteratee(predicate);\n      return basePickBy(object, props, function(value, path) {\n        return predicate(value, path[0]);\n      });\n    }\n\n    /**\n     * This method is like `_.get` except that if the resolved value is a\n     * function it's invoked with the `this` binding of its parent object and\n     * its result is returned.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the property to resolve.\n     * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n     * @returns {*} Returns the resolved value.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c1': 3, 'c2': _.constant(4) } }] };\n     *\n     * _.result(object, 'a[0].b.c1');\n     * // => 3\n     *\n     * _.result(object, 'a[0].b.c2');\n     * // => 4\n     *\n     * _.result(object, 'a[0].b.c3', 'default');\n     * // => 'default'\n     *\n     * _.result(object, 'a[0].b.c3', _.constant('default'));\n     * // => 'default'\n     */\n    function result(object, path, defaultValue) {\n      path = castPath(path, object);\n\n      var index = -1,\n          length = path.length;\n\n      // Ensure the loop is entered when path is empty.\n      if (!length) {\n        length = 1;\n        object = undefined;\n      }\n      while (++index < length) {\n        var value = object == null ? undefined : object[toKey(path[index])];\n        if (value === undefined) {\n          index = length;\n          value = defaultValue;\n        }\n        object = isFunction(value) ? value.call(object) : value;\n      }\n      return object;\n    }\n\n    /**\n     * Sets the value at `path` of `object`. If a portion of `path` doesn't exist,\n     * it's created. Arrays are created for missing index properties while objects\n     * are created for all other missing properties. Use `_.setWith` to customize\n     * `path` creation.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.7.0\n     * @category Object\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n     *\n     * _.set(object, 'a[0].b.c', 4);\n     * console.log(object.a[0].b.c);\n     * // => 4\n     *\n     * _.set(object, ['x', '0', 'y', 'z'], 5);\n     * console.log(object.x[0].y.z);\n     * // => 5\n     */\n    function set(object, path, value) {\n      return object == null ? object : baseSet(object, path, value);\n    }\n\n    /**\n     * This method is like `_.set` except that it accepts `customizer` which is\n     * invoked to produce the objects of `path`.  If `customizer` returns `undefined`\n     * path creation is handled by the method instead. The `customizer` is invoked\n     * with three arguments: (nsValue, key, nsObject).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to set.\n     * @param {*} value The value to set.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = {};\n     *\n     * _.setWith(object, '[0][1]', 'a', Object);\n     * // => { '0': { '1': 'a' } }\n     */\n    function setWith(object, path, value, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      return object == null ? object : baseSet(object, path, value, customizer);\n    }\n\n    /**\n     * Creates an array of own enumerable string keyed-value pairs for `object`\n     * which can be consumed by `_.fromPairs`. If `object` is a map or set, its\n     * entries are returned.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @alias entries\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the key-value pairs.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.toPairs(new Foo);\n     * // => [['a', 1], ['b', 2]] (iteration order is not guaranteed)\n     */\n    var toPairs = createToPairs(keys);\n\n    /**\n     * Creates an array of own and inherited enumerable string keyed-value pairs\n     * for `object` which can be consumed by `_.fromPairs`. If `object` is a map\n     * or set, its entries are returned.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @alias entriesIn\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the key-value pairs.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.toPairsIn(new Foo);\n     * // => [['a', 1], ['b', 2], ['c', 3]] (iteration order is not guaranteed)\n     */\n    var toPairsIn = createToPairs(keysIn);\n\n    /**\n     * An alternative to `_.reduce`; this method transforms `object` to a new\n     * `accumulator` object which is the result of running each of its own\n     * enumerable string keyed properties thru `iteratee`, with each invocation\n     * potentially mutating the `accumulator` object. If `accumulator` is not\n     * provided, a new object with the same `[[Prototype]]` will be used. The\n     * iteratee is invoked with four arguments: (accumulator, value, key, object).\n     * Iteratee functions may exit iteration early by explicitly returning `false`.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.3.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [accumulator] The custom accumulator value.\n     * @returns {*} Returns the accumulated value.\n     * @example\n     *\n     * _.transform([2, 3, 4], function(result, n) {\n     *   result.push(n *= n);\n     *   return n % 2 == 0;\n     * }, []);\n     * // => [4, 9]\n     *\n     * _.transform({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {\n     *   (result[value] || (result[value] = [])).push(key);\n     * }, {});\n     * // => { '1': ['a', 'c'], '2': ['b'] }\n     */\n    function transform(object, iteratee, accumulator) {\n      var isArr = isArray(object),\n          isArrLike = isArr || isBuffer(object) || isTypedArray(object);\n\n      iteratee = getIteratee(iteratee, 4);\n      if (accumulator == null) {\n        var Ctor = object && object.constructor;\n        if (isArrLike) {\n          accumulator = isArr ? new Ctor : [];\n        }\n        else if (isObject(object)) {\n          accumulator = isFunction(Ctor) ? baseCreate(getPrototype(object)) : {};\n        }\n        else {\n          accumulator = {};\n        }\n      }\n      (isArrLike ? arrayEach : baseForOwn)(object, function(value, index, object) {\n        return iteratee(accumulator, value, index, object);\n      });\n      return accumulator;\n    }\n\n    /**\n     * Removes the property at `path` of `object`.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to unset.\n     * @returns {boolean} Returns `true` if the property is deleted, else `false`.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 7 } }] };\n     * _.unset(object, 'a[0].b.c');\n     * // => true\n     *\n     * console.log(object);\n     * // => { 'a': [{ 'b': {} }] };\n     *\n     * _.unset(object, ['a', '0', 'b', 'c']);\n     * // => true\n     *\n     * console.log(object);\n     * // => { 'a': [{ 'b': {} }] };\n     */\n    function unset(object, path) {\n      return object == null ? true : baseUnset(object, path);\n    }\n\n    /**\n     * This method is like `_.set` except that accepts `updater` to produce the\n     * value to set. Use `_.updateWith` to customize `path` creation. The `updater`\n     * is invoked with one argument: (value).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.6.0\n     * @category Object\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to set.\n     * @param {Function} updater The function to produce the updated value.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n     *\n     * _.update(object, 'a[0].b.c', function(n) { return n * n; });\n     * console.log(object.a[0].b.c);\n     * // => 9\n     *\n     * _.update(object, 'x[0].y.z', function(n) { return n ? n + 1 : 0; });\n     * console.log(object.x[0].y.z);\n     * // => 0\n     */\n    function update(object, path, updater) {\n      return object == null ? object : baseUpdate(object, path, castFunction(updater));\n    }\n\n    /**\n     * This method is like `_.update` except that it accepts `customizer` which is\n     * invoked to produce the objects of `path`.  If `customizer` returns `undefined`\n     * path creation is handled by the method instead. The `customizer` is invoked\n     * with three arguments: (nsValue, key, nsObject).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.6.0\n     * @category Object\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to set.\n     * @param {Function} updater The function to produce the updated value.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = {};\n     *\n     * _.updateWith(object, '[0][1]', _.constant('a'), Object);\n     * // => { '0': { '1': 'a' } }\n     */\n    function updateWith(object, path, updater, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      return object == null ? object : baseUpdate(object, path, castFunction(updater), customizer);\n    }\n\n    /**\n     * Creates an array of the own enumerable string keyed property values of `object`.\n     *\n     * **Note:** Non-object values are coerced to objects.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property values.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.values(new Foo);\n     * // => [1, 2] (iteration order is not guaranteed)\n     *\n     * _.values('hi');\n     * // => ['h', 'i']\n     */\n    function values(object) {\n      return object == null ? [] : baseValues(object, keys(object));\n    }\n\n    /**\n     * Creates an array of the own and inherited enumerable string keyed property\n     * values of `object`.\n     *\n     * **Note:** Non-object values are coerced to objects.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property values.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.valuesIn(new Foo);\n     * // => [1, 2, 3] (iteration order is not guaranteed)\n     */\n    function valuesIn(object) {\n      return object == null ? [] : baseValues(object, keysIn(object));\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Clamps `number` within the inclusive `lower` and `upper` bounds.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Number\n     * @param {number} number The number to clamp.\n     * @param {number} [lower] The lower bound.\n     * @param {number} upper The upper bound.\n     * @returns {number} Returns the clamped number.\n     * @example\n     *\n     * _.clamp(-10, -5, 5);\n     * // => -5\n     *\n     * _.clamp(10, -5, 5);\n     * // => 5\n     */\n    function clamp(number, lower, upper) {\n      if (upper === undefined) {\n        upper = lower;\n        lower = undefined;\n      }\n      if (upper !== undefined) {\n        upper = toNumber(upper);\n        upper = upper === upper ? upper : 0;\n      }\n      if (lower !== undefined) {\n        lower = toNumber(lower);\n        lower = lower === lower ? lower : 0;\n      }\n      return baseClamp(toNumber(number), lower, upper);\n    }\n\n    /**\n     * Checks if `n` is between `start` and up to, but not including, `end`. If\n     * `end` is not specified, it's set to `start` with `start` then set to `0`.\n     * If `start` is greater than `end` the params are swapped to support\n     * negative ranges.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.3.0\n     * @category Number\n     * @param {number} number The number to check.\n     * @param {number} [start=0] The start of the range.\n     * @param {number} end The end of the range.\n     * @returns {boolean} Returns `true` if `number` is in the range, else `false`.\n     * @see _.range, _.rangeRight\n     * @example\n     *\n     * _.inRange(3, 2, 4);\n     * // => true\n     *\n     * _.inRange(4, 8);\n     * // => true\n     *\n     * _.inRange(4, 2);\n     * // => false\n     *\n     * _.inRange(2, 2);\n     * // => false\n     *\n     * _.inRange(1.2, 2);\n     * // => true\n     *\n     * _.inRange(5.2, 4);\n     * // => false\n     *\n     * _.inRange(-3, -2, -6);\n     * // => true\n     */\n    function inRange(number, start, end) {\n      start = toFinite(start);\n      if (end === undefined) {\n        end = start;\n        start = 0;\n      } else {\n        end = toFinite(end);\n      }\n      number = toNumber(number);\n      return baseInRange(number, start, end);\n    }\n\n    /**\n     * Produces a random number between the inclusive `lower` and `upper` bounds.\n     * If only one argument is provided a number between `0` and the given number\n     * is returned. If `floating` is `true`, or either `lower` or `upper` are\n     * floats, a floating-point number is returned instead of an integer.\n     *\n     * **Note:** JavaScript follows the IEEE-754 standard for resolving\n     * floating-point values which can produce unexpected results.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.7.0\n     * @category Number\n     * @param {number} [lower=0] The lower bound.\n     * @param {number} [upper=1] The upper bound.\n     * @param {boolean} [floating] Specify returning a floating-point number.\n     * @returns {number} Returns the random number.\n     * @example\n     *\n     * _.random(0, 5);\n     * // => an integer between 0 and 5\n     *\n     * _.random(5);\n     * // => also an integer between 0 and 5\n     *\n     * _.random(5, true);\n     * // => a floating-point number between 0 and 5\n     *\n     * _.random(1.2, 5.2);\n     * // => a floating-point number between 1.2 and 5.2\n     */\n    function random(lower, upper, floating) {\n      if (floating && typeof floating != 'boolean' && isIterateeCall(lower, upper, floating)) {\n        upper = floating = undefined;\n      }\n      if (floating === undefined) {\n        if (typeof upper == 'boolean') {\n          floating = upper;\n          upper = undefined;\n        }\n        else if (typeof lower == 'boolean') {\n          floating = lower;\n          lower = undefined;\n        }\n      }\n      if (lower === undefined && upper === undefined) {\n        lower = 0;\n        upper = 1;\n      }\n      else {\n        lower = toFinite(lower);\n        if (upper === undefined) {\n          upper = lower;\n          lower = 0;\n        } else {\n          upper = toFinite(upper);\n        }\n      }\n      if (lower > upper) {\n        var temp = lower;\n        lower = upper;\n        upper = temp;\n      }\n      if (floating || lower % 1 || upper % 1) {\n        var rand = nativeRandom();\n        return nativeMin(lower + (rand * (upper - lower + freeParseFloat('1e-' + ((rand + '').length - 1)))), upper);\n      }\n      return baseRandom(lower, upper);\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the camel cased string.\n     * @example\n     *\n     * _.camelCase('Foo Bar');\n     * // => 'fooBar'\n     *\n     * _.camelCase('--foo-bar--');\n     * // => 'fooBar'\n     *\n     * _.camelCase('__FOO_BAR__');\n     * // => 'fooBar'\n     */\n    var camelCase = createCompounder(function(result, word, index) {\n      word = word.toLowerCase();\n      return result + (index ? capitalize(word) : word);\n    });\n\n    /**\n     * Converts the first character of `string` to upper case and the remaining\n     * to lower case.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to capitalize.\n     * @returns {string} Returns the capitalized string.\n     * @example\n     *\n     * _.capitalize('FRED');\n     * // => 'Fred'\n     */\n    function capitalize(string) {\n      return upperFirst(toString(string).toLowerCase());\n    }\n\n    /**\n     * Deburrs `string` by converting\n     * [Latin-1 Supplement](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table)\n     * and [Latin Extended-A](https://en.wikipedia.org/wiki/Latin_Extended-A)\n     * letters to basic Latin letters and removing\n     * [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to deburr.\n     * @returns {string} Returns the deburred string.\n     * @example\n     *\n     * _.deburr('déjà vu');\n     * // => 'deja vu'\n     */\n    function deburr(string) {\n      string = toString(string);\n      return string && string.replace(reLatin, deburrLetter).replace(reComboMark, '');\n    }\n\n    /**\n     * Checks if `string` ends with the given target string.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to inspect.\n     * @param {string} [target] The string to search for.\n     * @param {number} [position=string.length] The position to search up to.\n     * @returns {boolean} Returns `true` if `string` ends with `target`,\n     *  else `false`.\n     * @example\n     *\n     * _.endsWith('abc', 'c');\n     * // => true\n     *\n     * _.endsWith('abc', 'b');\n     * // => false\n     *\n     * _.endsWith('abc', 'b', 2);\n     * // => true\n     */\n    function endsWith(string, target, position) {\n      string = toString(string);\n      target = baseToString(target);\n\n      var length = string.length;\n      position = position === undefined\n        ? length\n        : baseClamp(toInteger(position), 0, length);\n\n      var end = position;\n      position -= target.length;\n      return position >= 0 && string.slice(position, end) == target;\n    }\n\n    /**\n     * Converts the characters \"&\", \"<\", \">\", '\"', and \"'\" in `string` to their\n     * corresponding HTML entities.\n     *\n     * **Note:** No other characters are escaped. To escape additional\n     * characters use a third-party library like [_he_](https://mths.be/he).\n     *\n     * Though the \">\" character is escaped for symmetry, characters like\n     * \">\" and \"/\" don't need escaping in HTML and have no special meaning\n     * unless they're part of a tag or unquoted attribute value. See\n     * [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands)\n     * (under \"semi-related fun fact\") for more details.\n     *\n     * When working with HTML you should always\n     * [quote attribute values](http://wonko.com/post/html-escaping) to reduce\n     * XSS vectors.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to escape.\n     * @returns {string} Returns the escaped string.\n     * @example\n     *\n     * _.escape('fred, barney, & pebbles');\n     * // => 'fred, barney, &amp; pebbles'\n     */\n    function escape(string) {\n      string = toString(string);\n      return (string && reHasUnescapedHtml.test(string))\n        ? string.replace(reUnescapedHtml, escapeHtmlChar)\n        : string;\n    }\n\n    /**\n     * Escapes the `RegExp` special characters \"^\", \"$\", \"\\\", \".\", \"*\", \"+\",\n     * \"?\", \"(\", \")\", \"[\", \"]\", \"{\", \"}\", and \"|\" in `string`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to escape.\n     * @returns {string} Returns the escaped string.\n     * @example\n     *\n     * _.escapeRegExp('[lodash](https://lodash.com/)');\n     * // => '\\[lodash\\]\\(https://lodash\\.com/\\)'\n     */\n    function escapeRegExp(string) {\n      string = toString(string);\n      return (string && reHasRegExpChar.test(string))\n        ? string.replace(reRegExpChar, '\\\\$&')\n        : string;\n    }\n\n    /**\n     * Converts `string` to\n     * [kebab case](https://en.wikipedia.org/wiki/Letter_case#Special_case_styles).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the kebab cased string.\n     * @example\n     *\n     * _.kebabCase('Foo Bar');\n     * // => 'foo-bar'\n     *\n     * _.kebabCase('fooBar');\n     * // => 'foo-bar'\n     *\n     * _.kebabCase('__FOO_BAR__');\n     * // => 'foo-bar'\n     */\n    var kebabCase = createCompounder(function(result, word, index) {\n      return result + (index ? '-' : '') + word.toLowerCase();\n    });\n\n    /**\n     * Converts `string`, as space separated words, to lower case.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the lower cased string.\n     * @example\n     *\n     * _.lowerCase('--Foo-Bar--');\n     * // => 'foo bar'\n     *\n     * _.lowerCase('fooBar');\n     * // => 'foo bar'\n     *\n     * _.lowerCase('__FOO_BAR__');\n     * // => 'foo bar'\n     */\n    var lowerCase = createCompounder(function(result, word, index) {\n      return result + (index ? ' ' : '') + word.toLowerCase();\n    });\n\n    /**\n     * Converts the first character of `string` to lower case.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the converted string.\n     * @example\n     *\n     * _.lowerFirst('Fred');\n     * // => 'fred'\n     *\n     * _.lowerFirst('FRED');\n     * // => 'fRED'\n     */\n    var lowerFirst = createCaseFirst('toLowerCase');\n\n    /**\n     * Pads `string` on the left and right sides if it's shorter than `length`.\n     * Padding characters are truncated if they can't be evenly divided by `length`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to pad.\n     * @param {number} [length=0] The padding length.\n     * @param {string} [chars=' '] The string used as padding.\n     * @returns {string} Returns the padded string.\n     * @example\n     *\n     * _.pad('abc', 8);\n     * // => '  abc   '\n     *\n     * _.pad('abc', 8, '_-');\n     * // => '_-abc_-_'\n     *\n     * _.pad('abc', 3);\n     * // => 'abc'\n     */\n    function pad(string, length, chars) {\n      string = toString(string);\n      length = toInteger(length);\n\n      var strLength = length ? stringSize(string) : 0;\n      if (!length || strLength >= length) {\n        return string;\n      }\n      var mid = (length - strLength) / 2;\n      return (\n        createPadding(nativeFloor(mid), chars) +\n        string +\n        createPadding(nativeCeil(mid), chars)\n      );\n    }\n\n    /**\n     * Pads `string` on the right side if it's shorter than `length`. Padding\n     * characters are truncated if they exceed `length`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to pad.\n     * @param {number} [length=0] The padding length.\n     * @param {string} [chars=' '] The string used as padding.\n     * @returns {string} Returns the padded string.\n     * @example\n     *\n     * _.padEnd('abc', 6);\n     * // => 'abc   '\n     *\n     * _.padEnd('abc', 6, '_-');\n     * // => 'abc_-_'\n     *\n     * _.padEnd('abc', 3);\n     * // => 'abc'\n     */\n    function padEnd(string, length, chars) {\n      string = toString(string);\n      length = toInteger(length);\n\n      var strLength = length ? stringSize(string) : 0;\n      return (length && strLength < length)\n        ? (string + createPadding(length - strLength, chars))\n        : string;\n    }\n\n    /**\n     * Pads `string` on the left side if it's shorter than `length`. Padding\n     * characters are truncated if they exceed `length`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to pad.\n     * @param {number} [length=0] The padding length.\n     * @param {string} [chars=' '] The string used as padding.\n     * @returns {string} Returns the padded string.\n     * @example\n     *\n     * _.padStart('abc', 6);\n     * // => '   abc'\n     *\n     * _.padStart('abc', 6, '_-');\n     * // => '_-_abc'\n     *\n     * _.padStart('abc', 3);\n     * // => 'abc'\n     */\n    function padStart(string, length, chars) {\n      string = toString(string);\n      length = toInteger(length);\n\n      var strLength = length ? stringSize(string) : 0;\n      return (length && strLength < length)\n        ? (createPadding(length - strLength, chars) + string)\n        : string;\n    }\n\n    /**\n     * Converts `string` to an integer of the specified radix. If `radix` is\n     * `undefined` or `0`, a `radix` of `10` is used unless `value` is a\n     * hexadecimal, in which case a `radix` of `16` is used.\n     *\n     * **Note:** This method aligns with the\n     * [ES5 implementation](https://es5.github.io/#x15.1.2.2) of `parseInt`.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.1.0\n     * @category String\n     * @param {string} string The string to convert.\n     * @param {number} [radix=10] The radix to interpret `value` by.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {number} Returns the converted integer.\n     * @example\n     *\n     * _.parseInt('08');\n     * // => 8\n     *\n     * _.map(['6', '08', '10'], _.parseInt);\n     * // => [6, 8, 10]\n     */\n    function parseInt(string, radix, guard) {\n      if (guard || radix == null) {\n        radix = 0;\n      } else if (radix) {\n        radix = +radix;\n      }\n      return nativeParseInt(toString(string).replace(reTrimStart, ''), radix || 0);\n    }\n\n    /**\n     * Repeats the given string `n` times.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to repeat.\n     * @param {number} [n=1] The number of times to repeat the string.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {string} Returns the repeated string.\n     * @example\n     *\n     * _.repeat('*', 3);\n     * // => '***'\n     *\n     * _.repeat('abc', 2);\n     * // => 'abcabc'\n     *\n     * _.repeat('abc', 0);\n     * // => ''\n     */\n    function repeat(string, n, guard) {\n      if ((guard ? isIterateeCall(string, n, guard) : n === undefined)) {\n        n = 1;\n      } else {\n        n = toInteger(n);\n      }\n      return baseRepeat(toString(string), n);\n    }\n\n    /**\n     * Replaces matches for `pattern` in `string` with `replacement`.\n     *\n     * **Note:** This method is based on\n     * [`String#replace`](https://mdn.io/String/replace).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to modify.\n     * @param {RegExp|string} pattern The pattern to replace.\n     * @param {Function|string} replacement The match replacement.\n     * @returns {string} Returns the modified string.\n     * @example\n     *\n     * _.replace('Hi Fred', 'Fred', 'Barney');\n     * // => 'Hi Barney'\n     */\n    function replace() {\n      var args = arguments,\n          string = toString(args[0]);\n\n      return args.length < 3 ? string : string.replace(args[1], args[2]);\n    }\n\n    /**\n     * Converts `string` to\n     * [snake case](https://en.wikipedia.org/wiki/Snake_case).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the snake cased string.\n     * @example\n     *\n     * _.snakeCase('Foo Bar');\n     * // => 'foo_bar'\n     *\n     * _.snakeCase('fooBar');\n     * // => 'foo_bar'\n     *\n     * _.snakeCase('--FOO-BAR--');\n     * // => 'foo_bar'\n     */\n    var snakeCase = createCompounder(function(result, word, index) {\n      return result + (index ? '_' : '') + word.toLowerCase();\n    });\n\n    /**\n     * Splits `string` by `separator`.\n     *\n     * **Note:** This method is based on\n     * [`String#split`](https://mdn.io/String/split).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to split.\n     * @param {RegExp|string} separator The separator pattern to split by.\n     * @param {number} [limit] The length to truncate results to.\n     * @returns {Array} Returns the string segments.\n     * @example\n     *\n     * _.split('a-b-c', '-', 2);\n     * // => ['a', 'b']\n     */\n    function split(string, separator, limit) {\n      if (limit && typeof limit != 'number' && isIterateeCall(string, separator, limit)) {\n        separator = limit = undefined;\n      }\n      limit = limit === undefined ? MAX_ARRAY_LENGTH : limit >>> 0;\n      if (!limit) {\n        return [];\n      }\n      string = toString(string);\n      if (string && (\n            typeof separator == 'string' ||\n            (separator != null && !isRegExp(separator))\n          )) {\n        separator = baseToString(separator);\n        if (!separator && hasUnicode(string)) {\n          return castSlice(stringToArray(string), 0, limit);\n        }\n      }\n      return string.split(separator, limit);\n    }\n\n    /**\n     * Converts `string` to\n     * [start case](https://en.wikipedia.org/wiki/Letter_case#Stylistic_or_specialised_usage).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.1.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the start cased string.\n     * @example\n     *\n     * _.startCase('--foo-bar--');\n     * // => 'Foo Bar'\n     *\n     * _.startCase('fooBar');\n     * // => 'Foo Bar'\n     *\n     * _.startCase('__FOO_BAR__');\n     * // => 'FOO BAR'\n     */\n    var startCase = createCompounder(function(result, word, index) {\n      return result + (index ? ' ' : '') + upperFirst(word);\n    });\n\n    /**\n     * Checks if `string` starts with the given target string.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to inspect.\n     * @param {string} [target] The string to search for.\n     * @param {number} [position=0] The position to search from.\n     * @returns {boolean} Returns `true` if `string` starts with `target`,\n     *  else `false`.\n     * @example\n     *\n     * _.startsWith('abc', 'a');\n     * // => true\n     *\n     * _.startsWith('abc', 'b');\n     * // => false\n     *\n     * _.startsWith('abc', 'b', 1);\n     * // => true\n     */\n    function startsWith(string, target, position) {\n      string = toString(string);\n      position = position == null\n        ? 0\n        : baseClamp(toInteger(position), 0, string.length);\n\n      target = baseToString(target);\n      return string.slice(position, position + target.length) == target;\n    }\n\n    /**\n     * Creates a compiled template function that can interpolate data properties\n     * in \"interpolate\" delimiters, HTML-escape interpolated data properties in\n     * \"escape\" delimiters, and execute JavaScript in \"evaluate\" delimiters. Data\n     * properties may be accessed as free variables in the template. If a setting\n     * object is given, it takes precedence over `_.templateSettings` values.\n     *\n     * **Note:** In the development build `_.template` utilizes\n     * [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl)\n     * for easier debugging.\n     *\n     * For more information on precompiling templates see\n     * [lodash's custom builds documentation](https://lodash.com/custom-builds).\n     *\n     * For more information on Chrome extension sandboxes see\n     * [Chrome's extensions documentation](https://developer.chrome.com/extensions/sandboxingEval).\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The template string.\n     * @param {Object} [options={}] The options object.\n     * @param {RegExp} [options.escape=_.templateSettings.escape]\n     *  The HTML \"escape\" delimiter.\n     * @param {RegExp} [options.evaluate=_.templateSettings.evaluate]\n     *  The \"evaluate\" delimiter.\n     * @param {Object} [options.imports=_.templateSettings.imports]\n     *  An object to import into the template as free variables.\n     * @param {RegExp} [options.interpolate=_.templateSettings.interpolate]\n     *  The \"interpolate\" delimiter.\n     * @param {string} [options.sourceURL='lodash.templateSources[n]']\n     *  The sourceURL of the compiled template.\n     * @param {string} [options.variable='obj']\n     *  The data object variable name.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Function} Returns the compiled template function.\n     * @example\n     *\n     * // Use the \"interpolate\" delimiter to create a compiled template.\n     * var compiled = _.template('hello <%= user %>!');\n     * compiled({ 'user': 'fred' });\n     * // => 'hello fred!'\n     *\n     * // Use the HTML \"escape\" delimiter to escape data property values.\n     * var compiled = _.template('<b><%- value %></b>');\n     * compiled({ 'value': '<script>' });\n     * // => '<b>&lt;script&gt;</b>'\n     *\n     * // Use the \"evaluate\" delimiter to execute JavaScript and generate HTML.\n     * var compiled = _.template('<% _.forEach(users, function(user) { %><li><%- user %></li><% }); %>');\n     * compiled({ 'users': ['fred', 'barney'] });\n     * // => '<li>fred</li><li>barney</li>'\n     *\n     * // Use the internal `print` function in \"evaluate\" delimiters.\n     * var compiled = _.template('<% print(\"hello \" + user); %>!');\n     * compiled({ 'user': 'barney' });\n     * // => 'hello barney!'\n     *\n     * // Use the ES template literal delimiter as an \"interpolate\" delimiter.\n     * // Disable support by replacing the \"interpolate\" delimiter.\n     * var compiled = _.template('hello ${ user }!');\n     * compiled({ 'user': 'pebbles' });\n     * // => 'hello pebbles!'\n     *\n     * // Use backslashes to treat delimiters as plain text.\n     * var compiled = _.template('<%= \"\\\\<%- value %\\\\>\" %>');\n     * compiled({ 'value': 'ignored' });\n     * // => '<%- value %>'\n     *\n     * // Use the `imports` option to import `jQuery` as `jq`.\n     * var text = '<% jq.each(users, function(user) { %><li><%- user %></li><% }); %>';\n     * var compiled = _.template(text, { 'imports': { 'jq': jQuery } });\n     * compiled({ 'users': ['fred', 'barney'] });\n     * // => '<li>fred</li><li>barney</li>'\n     *\n     * // Use the `sourceURL` option to specify a custom sourceURL for the template.\n     * var compiled = _.template('hello <%= user %>!', { 'sourceURL': '/basic/greeting.jst' });\n     * compiled(data);\n     * // => Find the source of \"greeting.jst\" under the Sources tab or Resources panel of the web inspector.\n     *\n     * // Use the `variable` option to ensure a with-statement isn't used in the compiled template.\n     * var compiled = _.template('hi <%= data.user %>!', { 'variable': 'data' });\n     * compiled.source;\n     * // => function(data) {\n     * //   var __t, __p = '';\n     * //   __p += 'hi ' + ((__t = ( data.user )) == null ? '' : __t) + '!';\n     * //   return __p;\n     * // }\n     *\n     * // Use custom template delimiters.\n     * _.templateSettings.interpolate = /{{([\\s\\S]+?)}}/g;\n     * var compiled = _.template('hello {{ user }}!');\n     * compiled({ 'user': 'mustache' });\n     * // => 'hello mustache!'\n     *\n     * // Use the `source` property to inline compiled templates for meaningful\n     * // line numbers in error messages and stack traces.\n     * fs.writeFileSync(path.join(process.cwd(), 'jst.js'), '\\\n     *   var JST = {\\\n     *     \"main\": ' + _.template(mainText).source + '\\\n     *   };\\\n     * ');\n     */\n    function template(string, options, guard) {\n      // Based on John Resig's `tmpl` implementation\n      // (http://ejohn.org/blog/javascript-micro-templating/)\n      // and Laura Doktorova's doT.js (https://github.com/olado/doT).\n      var settings = lodash.templateSettings;\n\n      if (guard && isIterateeCall(string, options, guard)) {\n        options = undefined;\n      }\n      string = toString(string);\n      options = assignInWith({}, options, settings, customDefaultsAssignIn);\n\n      var imports = assignInWith({}, options.imports, settings.imports, customDefaultsAssignIn),\n          importsKeys = keys(imports),\n          importsValues = baseValues(imports, importsKeys);\n\n      var isEscaping,\n          isEvaluating,\n          index = 0,\n          interpolate = options.interpolate || reNoMatch,\n          source = \"__p += '\";\n\n      // Compile the regexp to match each delimiter.\n      var reDelimiters = RegExp(\n        (options.escape || reNoMatch).source + '|' +\n        interpolate.source + '|' +\n        (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + '|' +\n        (options.evaluate || reNoMatch).source + '|$'\n      , 'g');\n\n      // Use a sourceURL for easier debugging.\n      // The sourceURL gets injected into the source that's eval-ed, so be careful\n      // to normalize all kinds of whitespace, so e.g. newlines (and unicode versions of it) can't sneak in\n      // and escape the comment, thus injecting code that gets evaled.\n      var sourceURL = '//# sourceURL=' +\n        (hasOwnProperty.call(options, 'sourceURL')\n          ? (options.sourceURL + '').replace(/\\s/g, ' ')\n          : ('lodash.templateSources[' + (++templateCounter) + ']')\n        ) + '\\n';\n\n      string.replace(reDelimiters, function(match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) {\n        interpolateValue || (interpolateValue = esTemplateValue);\n\n        // Escape characters that can't be included in string literals.\n        source += string.slice(index, offset).replace(reUnescapedString, escapeStringChar);\n\n        // Replace delimiters with snippets.\n        if (escapeValue) {\n          isEscaping = true;\n          source += \"' +\\n__e(\" + escapeValue + \") +\\n'\";\n        }\n        if (evaluateValue) {\n          isEvaluating = true;\n          source += \"';\\n\" + evaluateValue + \";\\n__p += '\";\n        }\n        if (interpolateValue) {\n          source += \"' +\\n((__t = (\" + interpolateValue + \")) == null ? '' : __t) +\\n'\";\n        }\n        index = offset + match.length;\n\n        // The JS engine embedded in Adobe products needs `match` returned in\n        // order to produce the correct `offset` value.\n        return match;\n      });\n\n      source += \"';\\n\";\n\n      // If `variable` is not specified wrap a with-statement around the generated\n      // code to add the data object to the top of the scope chain.\n      var variable = hasOwnProperty.call(options, 'variable') && options.variable;\n      if (!variable) {\n        source = 'with (obj) {\\n' + source + '\\n}\\n';\n      }\n      // Throw an error if a forbidden character was found in `variable`, to prevent\n      // potential command injection attacks.\n      else if (reForbiddenIdentifierChars.test(variable)) {\n        throw new Error(INVALID_TEMPL_VAR_ERROR_TEXT);\n      }\n\n      // Cleanup code by stripping empty strings.\n      source = (isEvaluating ? source.replace(reEmptyStringLeading, '') : source)\n        .replace(reEmptyStringMiddle, '$1')\n        .replace(reEmptyStringTrailing, '$1;');\n\n      // Frame code as the function body.\n      source = 'function(' + (variable || 'obj') + ') {\\n' +\n        (variable\n          ? ''\n          : 'obj || (obj = {});\\n'\n        ) +\n        \"var __t, __p = ''\" +\n        (isEscaping\n           ? ', __e = _.escape'\n           : ''\n        ) +\n        (isEvaluating\n          ? ', __j = Array.prototype.join;\\n' +\n            \"function print() { __p += __j.call(arguments, '') }\\n\"\n          : ';\\n'\n        ) +\n        source +\n        'return __p\\n}';\n\n      var result = attempt(function() {\n        return Function(importsKeys, sourceURL + 'return ' + source)\n          .apply(undefined, importsValues);\n      });\n\n      // Provide the compiled function's source by its `toString` method or\n      // the `source` property as a convenience for inlining compiled templates.\n      result.source = source;\n      if (isError(result)) {\n        throw result;\n      }\n      return result;\n    }\n\n    /**\n     * Converts `string`, as a whole, to lower case just like\n     * [String#toLowerCase](https://mdn.io/toLowerCase).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the lower cased string.\n     * @example\n     *\n     * _.toLower('--Foo-Bar--');\n     * // => '--foo-bar--'\n     *\n     * _.toLower('fooBar');\n     * // => 'foobar'\n     *\n     * _.toLower('__FOO_BAR__');\n     * // => '__foo_bar__'\n     */\n    function toLower(value) {\n      return toString(value).toLowerCase();\n    }\n\n    /**\n     * Converts `string`, as a whole, to upper case just like\n     * [String#toUpperCase](https://mdn.io/toUpperCase).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the upper cased string.\n     * @example\n     *\n     * _.toUpper('--foo-bar--');\n     * // => '--FOO-BAR--'\n     *\n     * _.toUpper('fooBar');\n     * // => 'FOOBAR'\n     *\n     * _.toUpper('__foo_bar__');\n     * // => '__FOO_BAR__'\n     */\n    function toUpper(value) {\n      return toString(value).toUpperCase();\n    }\n\n    /**\n     * Removes leading and trailing whitespace or specified characters from `string`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to trim.\n     * @param {string} [chars=whitespace] The characters to trim.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {string} Returns the trimmed string.\n     * @example\n     *\n     * _.trim('  abc  ');\n     * // => 'abc'\n     *\n     * _.trim('-_-abc-_-', '_-');\n     * // => 'abc'\n     *\n     * _.map(['  foo  ', '  bar  '], _.trim);\n     * // => ['foo', 'bar']\n     */\n    function trim(string, chars, guard) {\n      string = toString(string);\n      if (string && (guard || chars === undefined)) {\n        return baseTrim(string);\n      }\n      if (!string || !(chars = baseToString(chars))) {\n        return string;\n      }\n      var strSymbols = stringToArray(string),\n          chrSymbols = stringToArray(chars),\n          start = charsStartIndex(strSymbols, chrSymbols),\n          end = charsEndIndex(strSymbols, chrSymbols) + 1;\n\n      return castSlice(strSymbols, start, end).join('');\n    }\n\n    /**\n     * Removes trailing whitespace or specified characters from `string`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to trim.\n     * @param {string} [chars=whitespace] The characters to trim.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {string} Returns the trimmed string.\n     * @example\n     *\n     * _.trimEnd('  abc  ');\n     * // => '  abc'\n     *\n     * _.trimEnd('-_-abc-_-', '_-');\n     * // => '-_-abc'\n     */\n    function trimEnd(string, chars, guard) {\n      string = toString(string);\n      if (string && (guard || chars === undefined)) {\n        return string.slice(0, trimmedEndIndex(string) + 1);\n      }\n      if (!string || !(chars = baseToString(chars))) {\n        return string;\n      }\n      var strSymbols = stringToArray(string),\n          end = charsEndIndex(strSymbols, stringToArray(chars)) + 1;\n\n      return castSlice(strSymbols, 0, end).join('');\n    }\n\n    /**\n     * Removes leading whitespace or specified characters from `string`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to trim.\n     * @param {string} [chars=whitespace] The characters to trim.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {string} Returns the trimmed string.\n     * @example\n     *\n     * _.trimStart('  abc  ');\n     * // => 'abc  '\n     *\n     * _.trimStart('-_-abc-_-', '_-');\n     * // => 'abc-_-'\n     */\n    function trimStart(string, chars, guard) {\n      string = toString(string);\n      if (string && (guard || chars === undefined)) {\n        return string.replace(reTrimStart, '');\n      }\n      if (!string || !(chars = baseToString(chars))) {\n        return string;\n      }\n      var strSymbols = stringToArray(string),\n          start = charsStartIndex(strSymbols, stringToArray(chars));\n\n      return castSlice(strSymbols, start).join('');\n    }\n\n    /**\n     * Truncates `string` if it's longer than the given maximum string length.\n     * The last characters of the truncated string are replaced with the omission\n     * string which defaults to \"...\".\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to truncate.\n     * @param {Object} [options={}] The options object.\n     * @param {number} [options.length=30] The maximum string length.\n     * @param {string} [options.omission='...'] The string to indicate text is omitted.\n     * @param {RegExp|string} [options.separator] The separator pattern to truncate to.\n     * @returns {string} Returns the truncated string.\n     * @example\n     *\n     * _.truncate('hi-diddly-ho there, neighborino');\n     * // => 'hi-diddly-ho there, neighbo...'\n     *\n     * _.truncate('hi-diddly-ho there, neighborino', {\n     *   'length': 24,\n     *   'separator': ' '\n     * });\n     * // => 'hi-diddly-ho there,...'\n     *\n     * _.truncate('hi-diddly-ho there, neighborino', {\n     *   'length': 24,\n     *   'separator': /,? +/\n     * });\n     * // => 'hi-diddly-ho there...'\n     *\n     * _.truncate('hi-diddly-ho there, neighborino', {\n     *   'omission': ' [...]'\n     * });\n     * // => 'hi-diddly-ho there, neig [...]'\n     */\n    function truncate(string, options) {\n      var length = DEFAULT_TRUNC_LENGTH,\n          omission = DEFAULT_TRUNC_OMISSION;\n\n      if (isObject(options)) {\n        var separator = 'separator' in options ? options.separator : separator;\n        length = 'length' in options ? toInteger(options.length) : length;\n        omission = 'omission' in options ? baseToString(options.omission) : omission;\n      }\n      string = toString(string);\n\n      var strLength = string.length;\n      if (hasUnicode(string)) {\n        var strSymbols = stringToArray(string);\n        strLength = strSymbols.length;\n      }\n      if (length >= strLength) {\n        return string;\n      }\n      var end = length - stringSize(omission);\n      if (end < 1) {\n        return omission;\n      }\n      var result = strSymbols\n        ? castSlice(strSymbols, 0, end).join('')\n        : string.slice(0, end);\n\n      if (separator === undefined) {\n        return result + omission;\n      }\n      if (strSymbols) {\n        end += (result.length - end);\n      }\n      if (isRegExp(separator)) {\n        if (string.slice(end).search(separator)) {\n          var match,\n              substring = result;\n\n          if (!separator.global) {\n            separator = RegExp(separator.source, toString(reFlags.exec(separator)) + 'g');\n          }\n          separator.lastIndex = 0;\n          while ((match = separator.exec(substring))) {\n            var newEnd = match.index;\n          }\n          result = result.slice(0, newEnd === undefined ? end : newEnd);\n        }\n      } else if (string.indexOf(baseToString(separator), end) != end) {\n        var index = result.lastIndexOf(separator);\n        if (index > -1) {\n          result = result.slice(0, index);\n        }\n      }\n      return result + omission;\n    }\n\n    /**\n     * The inverse of `_.escape`; this method converts the HTML entities\n     * `&amp;`, `&lt;`, `&gt;`, `&quot;`, and `&#39;` in `string` to\n     * their corresponding characters.\n     *\n     * **Note:** No other HTML entities are unescaped. To unescape additional\n     * HTML entities use a third-party library like [_he_](https://mths.be/he).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.6.0\n     * @category String\n     * @param {string} [string=''] The string to unescape.\n     * @returns {string} Returns the unescaped string.\n     * @example\n     *\n     * _.unescape('fred, barney, &amp; pebbles');\n     * // => 'fred, barney, & pebbles'\n     */\n    function unescape(string) {\n      string = toString(string);\n      return (string && reHasEscapedHtml.test(string))\n        ? string.replace(reEscapedHtml, unescapeHtmlChar)\n        : string;\n    }\n\n    /**\n     * Converts `string`, as space separated words, to upper case.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the upper cased string.\n     * @example\n     *\n     * _.upperCase('--foo-bar');\n     * // => 'FOO BAR'\n     *\n     * _.upperCase('fooBar');\n     * // => 'FOO BAR'\n     *\n     * _.upperCase('__foo_bar__');\n     * // => 'FOO BAR'\n     */\n    var upperCase = createCompounder(function(result, word, index) {\n      return result + (index ? ' ' : '') + word.toUpperCase();\n    });\n\n    /**\n     * Converts the first character of `string` to upper case.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the converted string.\n     * @example\n     *\n     * _.upperFirst('fred');\n     * // => 'Fred'\n     *\n     * _.upperFirst('FRED');\n     * // => 'FRED'\n     */\n    var upperFirst = createCaseFirst('toUpperCase');\n\n    /**\n     * Splits `string` into an array of its words.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to inspect.\n     * @param {RegExp|string} [pattern] The pattern to match words.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the words of `string`.\n     * @example\n     *\n     * _.words('fred, barney, & pebbles');\n     * // => ['fred', 'barney', 'pebbles']\n     *\n     * _.words('fred, barney, & pebbles', /[^, ]+/g);\n     * // => ['fred', 'barney', '&', 'pebbles']\n     */\n    function words(string, pattern, guard) {\n      string = toString(string);\n      pattern = guard ? undefined : pattern;\n\n      if (pattern === undefined) {\n        return hasUnicodeWord(string) ? unicodeWords(string) : asciiWords(string);\n      }\n      return string.match(pattern) || [];\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Attempts to invoke `func`, returning either the result or the caught error\n     * object. Any additional arguments are provided to `func` when it's invoked.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Util\n     * @param {Function} func The function to attempt.\n     * @param {...*} [args] The arguments to invoke `func` with.\n     * @returns {*} Returns the `func` result or error object.\n     * @example\n     *\n     * // Avoid throwing errors for invalid selectors.\n     * var elements = _.attempt(function(selector) {\n     *   return document.querySelectorAll(selector);\n     * }, '>_>');\n     *\n     * if (_.isError(elements)) {\n     *   elements = [];\n     * }\n     */\n    var attempt = baseRest(function(func, args) {\n      try {\n        return apply(func, undefined, args);\n      } catch (e) {\n        return isError(e) ? e : new Error(e);\n      }\n    });\n\n    /**\n     * Binds methods of an object to the object itself, overwriting the existing\n     * method.\n     *\n     * **Note:** This method doesn't set the \"length\" property of bound functions.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {Object} object The object to bind and assign the bound methods to.\n     * @param {...(string|string[])} methodNames The object method names to bind.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var view = {\n     *   'label': 'docs',\n     *   'click': function() {\n     *     console.log('clicked ' + this.label);\n     *   }\n     * };\n     *\n     * _.bindAll(view, ['click']);\n     * jQuery(element).on('click', view.click);\n     * // => Logs 'clicked docs' when clicked.\n     */\n    var bindAll = flatRest(function(object, methodNames) {\n      arrayEach(methodNames, function(key) {\n        key = toKey(key);\n        baseAssignValue(object, key, bind(object[key], object));\n      });\n      return object;\n    });\n\n    /**\n     * Creates a function that iterates over `pairs` and invokes the corresponding\n     * function of the first predicate to return truthy. The predicate-function\n     * pairs are invoked with the `this` binding and arguments of the created\n     * function.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {Array} pairs The predicate-function pairs.\n     * @returns {Function} Returns the new composite function.\n     * @example\n     *\n     * var func = _.cond([\n     *   [_.matches({ 'a': 1 }),           _.constant('matches A')],\n     *   [_.conforms({ 'b': _.isNumber }), _.constant('matches B')],\n     *   [_.stubTrue,                      _.constant('no match')]\n     * ]);\n     *\n     * func({ 'a': 1, 'b': 2 });\n     * // => 'matches A'\n     *\n     * func({ 'a': 0, 'b': 1 });\n     * // => 'matches B'\n     *\n     * func({ 'a': '1', 'b': '2' });\n     * // => 'no match'\n     */\n    function cond(pairs) {\n      var length = pairs == null ? 0 : pairs.length,\n          toIteratee = getIteratee();\n\n      pairs = !length ? [] : arrayMap(pairs, function(pair) {\n        if (typeof pair[1] != 'function') {\n          throw new TypeError(FUNC_ERROR_TEXT);\n        }\n        return [toIteratee(pair[0]), pair[1]];\n      });\n\n      return baseRest(function(args) {\n        var index = -1;\n        while (++index < length) {\n          var pair = pairs[index];\n          if (apply(pair[0], this, args)) {\n            return apply(pair[1], this, args);\n          }\n        }\n      });\n    }\n\n    /**\n     * Creates a function that invokes the predicate properties of `source` with\n     * the corresponding property values of a given object, returning `true` if\n     * all predicates return truthy, else `false`.\n     *\n     * **Note:** The created function is equivalent to `_.conformsTo` with\n     * `source` partially applied.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {Object} source The object of property predicates to conform to.\n     * @returns {Function} Returns the new spec function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': 2, 'b': 1 },\n     *   { 'a': 1, 'b': 2 }\n     * ];\n     *\n     * _.filter(objects, _.conforms({ 'b': function(n) { return n > 1; } }));\n     * // => [{ 'a': 1, 'b': 2 }]\n     */\n    function conforms(source) {\n      return baseConforms(baseClone(source, CLONE_DEEP_FLAG));\n    }\n\n    /**\n     * Creates a function that returns `value`.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.4.0\n     * @category Util\n     * @param {*} value The value to return from the new function.\n     * @returns {Function} Returns the new constant function.\n     * @example\n     *\n     * var objects = _.times(2, _.constant({ 'a': 1 }));\n     *\n     * console.log(objects);\n     * // => [{ 'a': 1 }, { 'a': 1 }]\n     *\n     * console.log(objects[0] === objects[1]);\n     * // => true\n     */\n    function constant(value) {\n      return function() {\n        return value;\n      };\n    }\n\n    /**\n     * Checks `value` to determine whether a default value should be returned in\n     * its place. The `defaultValue` is returned if `value` is `NaN`, `null`,\n     * or `undefined`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.14.0\n     * @category Util\n     * @param {*} value The value to check.\n     * @param {*} defaultValue The default value.\n     * @returns {*} Returns the resolved value.\n     * @example\n     *\n     * _.defaultTo(1, 10);\n     * // => 1\n     *\n     * _.defaultTo(undefined, 10);\n     * // => 10\n     */\n    function defaultTo(value, defaultValue) {\n      return (value == null || value !== value) ? defaultValue : value;\n    }\n\n    /**\n     * Creates a function that returns the result of invoking the given functions\n     * with the `this` binding of the created function, where each successive\n     * invocation is supplied the return value of the previous.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Util\n     * @param {...(Function|Function[])} [funcs] The functions to invoke.\n     * @returns {Function} Returns the new composite function.\n     * @see _.flowRight\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var addSquare = _.flow([_.add, square]);\n     * addSquare(1, 2);\n     * // => 9\n     */\n    var flow = createFlow();\n\n    /**\n     * This method is like `_.flow` except that it creates a function that\n     * invokes the given functions from right to left.\n     *\n     * @static\n     * @since 3.0.0\n     * @memberOf _\n     * @category Util\n     * @param {...(Function|Function[])} [funcs] The functions to invoke.\n     * @returns {Function} Returns the new composite function.\n     * @see _.flow\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var addSquare = _.flowRight([square, _.add]);\n     * addSquare(1, 2);\n     * // => 9\n     */\n    var flowRight = createFlow(true);\n\n    /**\n     * This method returns the first argument it receives.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {*} value Any value.\n     * @returns {*} Returns `value`.\n     * @example\n     *\n     * var object = { 'a': 1 };\n     *\n     * console.log(_.identity(object) === object);\n     * // => true\n     */\n    function identity(value) {\n      return value;\n    }\n\n    /**\n     * Creates a function that invokes `func` with the arguments of the created\n     * function. If `func` is a property name, the created function returns the\n     * property value for a given element. If `func` is an array or object, the\n     * created function returns `true` for elements that contain the equivalent\n     * source properties, otherwise it returns `false`.\n     *\n     * @static\n     * @since 4.0.0\n     * @memberOf _\n     * @category Util\n     * @param {*} [func=_.identity] The value to convert to a callback.\n     * @returns {Function} Returns the callback.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36, 'active': true },\n     *   { 'user': 'fred',   'age': 40, 'active': false }\n     * ];\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.filter(users, _.iteratee({ 'user': 'barney', 'active': true }));\n     * // => [{ 'user': 'barney', 'age': 36, 'active': true }]\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.filter(users, _.iteratee(['user', 'fred']));\n     * // => [{ 'user': 'fred', 'age': 40 }]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.map(users, _.iteratee('user'));\n     * // => ['barney', 'fred']\n     *\n     * // Create custom iteratee shorthands.\n     * _.iteratee = _.wrap(_.iteratee, function(iteratee, func) {\n     *   return !_.isRegExp(func) ? iteratee(func) : function(string) {\n     *     return func.test(string);\n     *   };\n     * });\n     *\n     * _.filter(['abc', 'def'], /ef/);\n     * // => ['def']\n     */\n    function iteratee(func) {\n      return baseIteratee(typeof func == 'function' ? func : baseClone(func, CLONE_DEEP_FLAG));\n    }\n\n    /**\n     * Creates a function that performs a partial deep comparison between a given\n     * object and `source`, returning `true` if the given object has equivalent\n     * property values, else `false`.\n     *\n     * **Note:** The created function is equivalent to `_.isMatch` with `source`\n     * partially applied.\n     *\n     * Partial comparisons will match empty array and empty object `source`\n     * values against any array or object value, respectively. See `_.isEqual`\n     * for a list of supported value comparisons.\n     *\n     * **Note:** Multiple values can be checked by combining several matchers\n     * using `_.overSome`\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Util\n     * @param {Object} source The object of property values to match.\n     * @returns {Function} Returns the new spec function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': 1, 'b': 2, 'c': 3 },\n     *   { 'a': 4, 'b': 5, 'c': 6 }\n     * ];\n     *\n     * _.filter(objects, _.matches({ 'a': 4, 'c': 6 }));\n     * // => [{ 'a': 4, 'b': 5, 'c': 6 }]\n     *\n     * // Checking for several possible values\n     * _.filter(objects, _.overSome([_.matches({ 'a': 1 }), _.matches({ 'a': 4 })]));\n     * // => [{ 'a': 1, 'b': 2, 'c': 3 }, { 'a': 4, 'b': 5, 'c': 6 }]\n     */\n    function matches(source) {\n      return baseMatches(baseClone(source, CLONE_DEEP_FLAG));\n    }\n\n    /**\n     * Creates a function that performs a partial deep comparison between the\n     * value at `path` of a given object to `srcValue`, returning `true` if the\n     * object value is equivalent, else `false`.\n     *\n     * **Note:** Partial comparisons will match empty array and empty object\n     * `srcValue` values against any array or object value, respectively. See\n     * `_.isEqual` for a list of supported value comparisons.\n     *\n     * **Note:** Multiple values can be checked by combining several matchers\n     * using `_.overSome`\n     *\n     * @static\n     * @memberOf _\n     * @since 3.2.0\n     * @category Util\n     * @param {Array|string} path The path of the property to get.\n     * @param {*} srcValue The value to match.\n     * @returns {Function} Returns the new spec function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': 1, 'b': 2, 'c': 3 },\n     *   { 'a': 4, 'b': 5, 'c': 6 }\n     * ];\n     *\n     * _.find(objects, _.matchesProperty('a', 4));\n     * // => { 'a': 4, 'b': 5, 'c': 6 }\n     *\n     * // Checking for several possible values\n     * _.filter(objects, _.overSome([_.matchesProperty('a', 1), _.matchesProperty('a', 4)]));\n     * // => [{ 'a': 1, 'b': 2, 'c': 3 }, { 'a': 4, 'b': 5, 'c': 6 }]\n     */\n    function matchesProperty(path, srcValue) {\n      return baseMatchesProperty(path, baseClone(srcValue, CLONE_DEEP_FLAG));\n    }\n\n    /**\n     * Creates a function that invokes the method at `path` of a given object.\n     * Any additional arguments are provided to the invoked method.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.7.0\n     * @category Util\n     * @param {Array|string} path The path of the method to invoke.\n     * @param {...*} [args] The arguments to invoke the method with.\n     * @returns {Function} Returns the new invoker function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': { 'b': _.constant(2) } },\n     *   { 'a': { 'b': _.constant(1) } }\n     * ];\n     *\n     * _.map(objects, _.method('a.b'));\n     * // => [2, 1]\n     *\n     * _.map(objects, _.method(['a', 'b']));\n     * // => [2, 1]\n     */\n    var method = baseRest(function(path, args) {\n      return function(object) {\n        return baseInvoke(object, path, args);\n      };\n    });\n\n    /**\n     * The opposite of `_.method`; this method creates a function that invokes\n     * the method at a given path of `object`. Any additional arguments are\n     * provided to the invoked method.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.7.0\n     * @category Util\n     * @param {Object} object The object to query.\n     * @param {...*} [args] The arguments to invoke the method with.\n     * @returns {Function} Returns the new invoker function.\n     * @example\n     *\n     * var array = _.times(3, _.constant),\n     *     object = { 'a': array, 'b': array, 'c': array };\n     *\n     * _.map(['a[2]', 'c[0]'], _.methodOf(object));\n     * // => [2, 0]\n     *\n     * _.map([['a', '2'], ['c', '0']], _.methodOf(object));\n     * // => [2, 0]\n     */\n    var methodOf = baseRest(function(object, args) {\n      return function(path) {\n        return baseInvoke(object, path, args);\n      };\n    });\n\n    /**\n     * Adds all own enumerable string keyed function properties of a source\n     * object to the destination object. If `object` is a function, then methods\n     * are added to its prototype as well.\n     *\n     * **Note:** Use `_.runInContext` to create a pristine `lodash` function to\n     * avoid conflicts caused by modifying the original.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {Function|Object} [object=lodash] The destination object.\n     * @param {Object} source The object of functions to add.\n     * @param {Object} [options={}] The options object.\n     * @param {boolean} [options.chain=true] Specify whether mixins are chainable.\n     * @returns {Function|Object} Returns `object`.\n     * @example\n     *\n     * function vowels(string) {\n     *   return _.filter(string, function(v) {\n     *     return /[aeiou]/i.test(v);\n     *   });\n     * }\n     *\n     * _.mixin({ 'vowels': vowels });\n     * _.vowels('fred');\n     * // => ['e']\n     *\n     * _('fred').vowels().value();\n     * // => ['e']\n     *\n     * _.mixin({ 'vowels': vowels }, { 'chain': false });\n     * _('fred').vowels();\n     * // => ['e']\n     */\n    function mixin(object, source, options) {\n      var props = keys(source),\n          methodNames = baseFunctions(source, props);\n\n      if (options == null &&\n          !(isObject(source) && (methodNames.length || !props.length))) {\n        options = source;\n        source = object;\n        object = this;\n        methodNames = baseFunctions(source, keys(source));\n      }\n      var chain = !(isObject(options) && 'chain' in options) || !!options.chain,\n          isFunc = isFunction(object);\n\n      arrayEach(methodNames, function(methodName) {\n        var func = source[methodName];\n        object[methodName] = func;\n        if (isFunc) {\n          object.prototype[methodName] = function() {\n            var chainAll = this.__chain__;\n            if (chain || chainAll) {\n              var result = object(this.__wrapped__),\n                  actions = result.__actions__ = copyArray(this.__actions__);\n\n              actions.push({ 'func': func, 'args': arguments, 'thisArg': object });\n              result.__chain__ = chainAll;\n              return result;\n            }\n            return func.apply(object, arrayPush([this.value()], arguments));\n          };\n        }\n      });\n\n      return object;\n    }\n\n    /**\n     * Reverts the `_` variable to its previous value and returns a reference to\n     * the `lodash` function.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @returns {Function} Returns the `lodash` function.\n     * @example\n     *\n     * var lodash = _.noConflict();\n     */\n    function noConflict() {\n      if (root._ === this) {\n        root._ = oldDash;\n      }\n      return this;\n    }\n\n    /**\n     * This method returns `undefined`.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.3.0\n     * @category Util\n     * @example\n     *\n     * _.times(2, _.noop);\n     * // => [undefined, undefined]\n     */\n    function noop() {\n      // No operation performed.\n    }\n\n    /**\n     * Creates a function that gets the argument at index `n`. If `n` is negative,\n     * the nth argument from the end is returned.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {number} [n=0] The index of the argument to return.\n     * @returns {Function} Returns the new pass-thru function.\n     * @example\n     *\n     * var func = _.nthArg(1);\n     * func('a', 'b', 'c', 'd');\n     * // => 'b'\n     *\n     * var func = _.nthArg(-2);\n     * func('a', 'b', 'c', 'd');\n     * // => 'c'\n     */\n    function nthArg(n) {\n      n = toInteger(n);\n      return baseRest(function(args) {\n        return baseNth(args, n);\n      });\n    }\n\n    /**\n     * Creates a function that invokes `iteratees` with the arguments it receives\n     * and returns their results.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {...(Function|Function[])} [iteratees=[_.identity]]\n     *  The iteratees to invoke.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var func = _.over([Math.max, Math.min]);\n     *\n     * func(1, 2, 3, 4);\n     * // => [4, 1]\n     */\n    var over = createOver(arrayMap);\n\n    /**\n     * Creates a function that checks if **all** of the `predicates` return\n     * truthy when invoked with the arguments it receives.\n     *\n     * Following shorthands are possible for providing predicates.\n     * Pass an `Object` and it will be used as an parameter for `_.matches` to create the predicate.\n     * Pass an `Array` of parameters for `_.matchesProperty` and the predicate will be created using them.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {...(Function|Function[])} [predicates=[_.identity]]\n     *  The predicates to check.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var func = _.overEvery([Boolean, isFinite]);\n     *\n     * func('1');\n     * // => true\n     *\n     * func(null);\n     * // => false\n     *\n     * func(NaN);\n     * // => false\n     */\n    var overEvery = createOver(arrayEvery);\n\n    /**\n     * Creates a function that checks if **any** of the `predicates` return\n     * truthy when invoked with the arguments it receives.\n     *\n     * Following shorthands are possible for providing predicates.\n     * Pass an `Object` and it will be used as an parameter for `_.matches` to create the predicate.\n     * Pass an `Array` of parameters for `_.matchesProperty` and the predicate will be created using them.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {...(Function|Function[])} [predicates=[_.identity]]\n     *  The predicates to check.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var func = _.overSome([Boolean, isFinite]);\n     *\n     * func('1');\n     * // => true\n     *\n     * func(null);\n     * // => true\n     *\n     * func(NaN);\n     * // => false\n     *\n     * var matchesFunc = _.overSome([{ 'a': 1 }, { 'a': 2 }])\n     * var matchesPropertyFunc = _.overSome([['a', 1], ['a', 2]])\n     */\n    var overSome = createOver(arraySome);\n\n    /**\n     * Creates a function that returns the value at `path` of a given object.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.4.0\n     * @category Util\n     * @param {Array|string} path The path of the property to get.\n     * @returns {Function} Returns the new accessor function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': { 'b': 2 } },\n     *   { 'a': { 'b': 1 } }\n     * ];\n     *\n     * _.map(objects, _.property('a.b'));\n     * // => [2, 1]\n     *\n     * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');\n     * // => [1, 2]\n     */\n    function property(path) {\n      return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);\n    }\n\n    /**\n     * The opposite of `_.property`; this method creates a function that returns\n     * the value at a given path of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Util\n     * @param {Object} object The object to query.\n     * @returns {Function} Returns the new accessor function.\n     * @example\n     *\n     * var array = [0, 1, 2],\n     *     object = { 'a': array, 'b': array, 'c': array };\n     *\n     * _.map(['a[2]', 'c[0]'], _.propertyOf(object));\n     * // => [2, 0]\n     *\n     * _.map([['a', '2'], ['c', '0']], _.propertyOf(object));\n     * // => [2, 0]\n     */\n    function propertyOf(object) {\n      return function(path) {\n        return object == null ? undefined : baseGet(object, path);\n      };\n    }\n\n    /**\n     * Creates an array of numbers (positive and/or negative) progressing from\n     * `start` up to, but not including, `end`. A step of `-1` is used if a negative\n     * `start` is specified without an `end` or `step`. If `end` is not specified,\n     * it's set to `start` with `start` then set to `0`.\n     *\n     * **Note:** JavaScript follows the IEEE-754 standard for resolving\n     * floating-point values which can produce unexpected results.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {number} [start=0] The start of the range.\n     * @param {number} end The end of the range.\n     * @param {number} [step=1] The value to increment or decrement by.\n     * @returns {Array} Returns the range of numbers.\n     * @see _.inRange, _.rangeRight\n     * @example\n     *\n     * _.range(4);\n     * // => [0, 1, 2, 3]\n     *\n     * _.range(-4);\n     * // => [0, -1, -2, -3]\n     *\n     * _.range(1, 5);\n     * // => [1, 2, 3, 4]\n     *\n     * _.range(0, 20, 5);\n     * // => [0, 5, 10, 15]\n     *\n     * _.range(0, -4, -1);\n     * // => [0, -1, -2, -3]\n     *\n     * _.range(1, 4, 0);\n     * // => [1, 1, 1]\n     *\n     * _.range(0);\n     * // => []\n     */\n    var range = createRange();\n\n    /**\n     * This method is like `_.range` except that it populates values in\n     * descending order.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {number} [start=0] The start of the range.\n     * @param {number} end The end of the range.\n     * @param {number} [step=1] The value to increment or decrement by.\n     * @returns {Array} Returns the range of numbers.\n     * @see _.inRange, _.range\n     * @example\n     *\n     * _.rangeRight(4);\n     * // => [3, 2, 1, 0]\n     *\n     * _.rangeRight(-4);\n     * // => [-3, -2, -1, 0]\n     *\n     * _.rangeRight(1, 5);\n     * // => [4, 3, 2, 1]\n     *\n     * _.rangeRight(0, 20, 5);\n     * // => [15, 10, 5, 0]\n     *\n     * _.rangeRight(0, -4, -1);\n     * // => [-3, -2, -1, 0]\n     *\n     * _.rangeRight(1, 4, 0);\n     * // => [1, 1, 1]\n     *\n     * _.rangeRight(0);\n     * // => []\n     */\n    var rangeRight = createRange(true);\n\n    /**\n     * This method returns a new empty array.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.13.0\n     * @category Util\n     * @returns {Array} Returns the new empty array.\n     * @example\n     *\n     * var arrays = _.times(2, _.stubArray);\n     *\n     * console.log(arrays);\n     * // => [[], []]\n     *\n     * console.log(arrays[0] === arrays[1]);\n     * // => false\n     */\n    function stubArray() {\n      return [];\n    }\n\n    /**\n     * This method returns `false`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.13.0\n     * @category Util\n     * @returns {boolean} Returns `false`.\n     * @example\n     *\n     * _.times(2, _.stubFalse);\n     * // => [false, false]\n     */\n    function stubFalse() {\n      return false;\n    }\n\n    /**\n     * This method returns a new empty object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.13.0\n     * @category Util\n     * @returns {Object} Returns the new empty object.\n     * @example\n     *\n     * var objects = _.times(2, _.stubObject);\n     *\n     * console.log(objects);\n     * // => [{}, {}]\n     *\n     * console.log(objects[0] === objects[1]);\n     * // => false\n     */\n    function stubObject() {\n      return {};\n    }\n\n    /**\n     * This method returns an empty string.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.13.0\n     * @category Util\n     * @returns {string} Returns the empty string.\n     * @example\n     *\n     * _.times(2, _.stubString);\n     * // => ['', '']\n     */\n    function stubString() {\n      return '';\n    }\n\n    /**\n     * This method returns `true`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.13.0\n     * @category Util\n     * @returns {boolean} Returns `true`.\n     * @example\n     *\n     * _.times(2, _.stubTrue);\n     * // => [true, true]\n     */\n    function stubTrue() {\n      return true;\n    }\n\n    /**\n     * Invokes the iteratee `n` times, returning an array of the results of\n     * each invocation. The iteratee is invoked with one argument; (index).\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {number} n The number of times to invoke `iteratee`.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the array of results.\n     * @example\n     *\n     * _.times(3, String);\n     * // => ['0', '1', '2']\n     *\n     *  _.times(4, _.constant(0));\n     * // => [0, 0, 0, 0]\n     */\n    function times(n, iteratee) {\n      n = toInteger(n);\n      if (n < 1 || n > MAX_SAFE_INTEGER) {\n        return [];\n      }\n      var index = MAX_ARRAY_LENGTH,\n          length = nativeMin(n, MAX_ARRAY_LENGTH);\n\n      iteratee = getIteratee(iteratee);\n      n -= MAX_ARRAY_LENGTH;\n\n      var result = baseTimes(length, iteratee);\n      while (++index < n) {\n        iteratee(index);\n      }\n      return result;\n    }\n\n    /**\n     * Converts `value` to a property path array.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {*} value The value to convert.\n     * @returns {Array} Returns the new property path array.\n     * @example\n     *\n     * _.toPath('a.b.c');\n     * // => ['a', 'b', 'c']\n     *\n     * _.toPath('a[0].b.c');\n     * // => ['a', '0', 'b', 'c']\n     */\n    function toPath(value) {\n      if (isArray(value)) {\n        return arrayMap(value, toKey);\n      }\n      return isSymbol(value) ? [value] : copyArray(stringToPath(toString(value)));\n    }\n\n    /**\n     * Generates a unique ID. If `prefix` is given, the ID is appended to it.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {string} [prefix=''] The value to prefix the ID with.\n     * @returns {string} Returns the unique ID.\n     * @example\n     *\n     * _.uniqueId('contact_');\n     * // => 'contact_104'\n     *\n     * _.uniqueId();\n     * // => '105'\n     */\n    function uniqueId(prefix) {\n      var id = ++idCounter;\n      return toString(prefix) + id;\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Adds two numbers.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.4.0\n     * @category Math\n     * @param {number} augend The first number in an addition.\n     * @param {number} addend The second number in an addition.\n     * @returns {number} Returns the total.\n     * @example\n     *\n     * _.add(6, 4);\n     * // => 10\n     */\n    var add = createMathOperation(function(augend, addend) {\n      return augend + addend;\n    }, 0);\n\n    /**\n     * Computes `number` rounded up to `precision`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.10.0\n     * @category Math\n     * @param {number} number The number to round up.\n     * @param {number} [precision=0] The precision to round up to.\n     * @returns {number} Returns the rounded up number.\n     * @example\n     *\n     * _.ceil(4.006);\n     * // => 5\n     *\n     * _.ceil(6.004, 2);\n     * // => 6.01\n     *\n     * _.ceil(6040, -2);\n     * // => 6100\n     */\n    var ceil = createRound('ceil');\n\n    /**\n     * Divide two numbers.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.7.0\n     * @category Math\n     * @param {number} dividend The first number in a division.\n     * @param {number} divisor The second number in a division.\n     * @returns {number} Returns the quotient.\n     * @example\n     *\n     * _.divide(6, 4);\n     * // => 1.5\n     */\n    var divide = createMathOperation(function(dividend, divisor) {\n      return dividend / divisor;\n    }, 1);\n\n    /**\n     * Computes `number` rounded down to `precision`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.10.0\n     * @category Math\n     * @param {number} number The number to round down.\n     * @param {number} [precision=0] The precision to round down to.\n     * @returns {number} Returns the rounded down number.\n     * @example\n     *\n     * _.floor(4.006);\n     * // => 4\n     *\n     * _.floor(0.046, 2);\n     * // => 0.04\n     *\n     * _.floor(4060, -2);\n     * // => 4000\n     */\n    var floor = createRound('floor');\n\n    /**\n     * Computes the maximum value of `array`. If `array` is empty or falsey,\n     * `undefined` is returned.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @returns {*} Returns the maximum value.\n     * @example\n     *\n     * _.max([4, 2, 8, 6]);\n     * // => 8\n     *\n     * _.max([]);\n     * // => undefined\n     */\n    function max(array) {\n      return (array && array.length)\n        ? baseExtremum(array, identity, baseGt)\n        : undefined;\n    }\n\n    /**\n     * This method is like `_.max` except that it accepts `iteratee` which is\n     * invoked for each element in `array` to generate the criterion by which\n     * the value is ranked. The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {*} Returns the maximum value.\n     * @example\n     *\n     * var objects = [{ 'n': 1 }, { 'n': 2 }];\n     *\n     * _.maxBy(objects, function(o) { return o.n; });\n     * // => { 'n': 2 }\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.maxBy(objects, 'n');\n     * // => { 'n': 2 }\n     */\n    function maxBy(array, iteratee) {\n      return (array && array.length)\n        ? baseExtremum(array, getIteratee(iteratee, 2), baseGt)\n        : undefined;\n    }\n\n    /**\n     * Computes the mean of the values in `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @returns {number} Returns the mean.\n     * @example\n     *\n     * _.mean([4, 2, 8, 6]);\n     * // => 5\n     */\n    function mean(array) {\n      return baseMean(array, identity);\n    }\n\n    /**\n     * This method is like `_.mean` except that it accepts `iteratee` which is\n     * invoked for each element in `array` to generate the value to be averaged.\n     * The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.7.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {number} Returns the mean.\n     * @example\n     *\n     * var objects = [{ 'n': 4 }, { 'n': 2 }, { 'n': 8 }, { 'n': 6 }];\n     *\n     * _.meanBy(objects, function(o) { return o.n; });\n     * // => 5\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.meanBy(objects, 'n');\n     * // => 5\n     */\n    function meanBy(array, iteratee) {\n      return baseMean(array, getIteratee(iteratee, 2));\n    }\n\n    /**\n     * Computes the minimum value of `array`. If `array` is empty or falsey,\n     * `undefined` is returned.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @returns {*} Returns the minimum value.\n     * @example\n     *\n     * _.min([4, 2, 8, 6]);\n     * // => 2\n     *\n     * _.min([]);\n     * // => undefined\n     */\n    function min(array) {\n      return (array && array.length)\n        ? baseExtremum(array, identity, baseLt)\n        : undefined;\n    }\n\n    /**\n     * This method is like `_.min` except that it accepts `iteratee` which is\n     * invoked for each element in `array` to generate the criterion by which\n     * the value is ranked. The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {*} Returns the minimum value.\n     * @example\n     *\n     * var objects = [{ 'n': 1 }, { 'n': 2 }];\n     *\n     * _.minBy(objects, function(o) { return o.n; });\n     * // => { 'n': 1 }\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.minBy(objects, 'n');\n     * // => { 'n': 1 }\n     */\n    function minBy(array, iteratee) {\n      return (array && array.length)\n        ? baseExtremum(array, getIteratee(iteratee, 2), baseLt)\n        : undefined;\n    }\n\n    /**\n     * Multiply two numbers.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.7.0\n     * @category Math\n     * @param {number} multiplier The first number in a multiplication.\n     * @param {number} multiplicand The second number in a multiplication.\n     * @returns {number} Returns the product.\n     * @example\n     *\n     * _.multiply(6, 4);\n     * // => 24\n     */\n    var multiply = createMathOperation(function(multiplier, multiplicand) {\n      return multiplier * multiplicand;\n    }, 1);\n\n    /**\n     * Computes `number` rounded to `precision`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.10.0\n     * @category Math\n     * @param {number} number The number to round.\n     * @param {number} [precision=0] The precision to round to.\n     * @returns {number} Returns the rounded number.\n     * @example\n     *\n     * _.round(4.006);\n     * // => 4\n     *\n     * _.round(4.006, 2);\n     * // => 4.01\n     *\n     * _.round(4060, -2);\n     * // => 4100\n     */\n    var round = createRound('round');\n\n    /**\n     * Subtract two numbers.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Math\n     * @param {number} minuend The first number in a subtraction.\n     * @param {number} subtrahend The second number in a subtraction.\n     * @returns {number} Returns the difference.\n     * @example\n     *\n     * _.subtract(6, 4);\n     * // => 2\n     */\n    var subtract = createMathOperation(function(minuend, subtrahend) {\n      return minuend - subtrahend;\n    }, 0);\n\n    /**\n     * Computes the sum of the values in `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.4.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @returns {number} Returns the sum.\n     * @example\n     *\n     * _.sum([4, 2, 8, 6]);\n     * // => 20\n     */\n    function sum(array) {\n      return (array && array.length)\n        ? baseSum(array, identity)\n        : 0;\n    }\n\n    /**\n     * This method is like `_.sum` except that it accepts `iteratee` which is\n     * invoked for each element in `array` to generate the value to be summed.\n     * The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {number} Returns the sum.\n     * @example\n     *\n     * var objects = [{ 'n': 4 }, { 'n': 2 }, { 'n': 8 }, { 'n': 6 }];\n     *\n     * _.sumBy(objects, function(o) { return o.n; });\n     * // => 20\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.sumBy(objects, 'n');\n     * // => 20\n     */\n    function sumBy(array, iteratee) {\n      return (array && array.length)\n        ? baseSum(array, getIteratee(iteratee, 2))\n        : 0;\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    // Add methods that return wrapped values in chain sequences.\n    lodash.after = after;\n    lodash.ary = ary;\n    lodash.assign = assign;\n    lodash.assignIn = assignIn;\n    lodash.assignInWith = assignInWith;\n    lodash.assignWith = assignWith;\n    lodash.at = at;\n    lodash.before = before;\n    lodash.bind = bind;\n    lodash.bindAll = bindAll;\n    lodash.bindKey = bindKey;\n    lodash.castArray = castArray;\n    lodash.chain = chain;\n    lodash.chunk = chunk;\n    lodash.compact = compact;\n    lodash.concat = concat;\n    lodash.cond = cond;\n    lodash.conforms = conforms;\n    lodash.constant = constant;\n    lodash.countBy = countBy;\n    lodash.create = create;\n    lodash.curry = curry;\n    lodash.curryRight = curryRight;\n    lodash.debounce = debounce;\n    lodash.defaults = defaults;\n    lodash.defaultsDeep = defaultsDeep;\n    lodash.defer = defer;\n    lodash.delay = delay;\n    lodash.difference = difference;\n    lodash.differenceBy = differenceBy;\n    lodash.differenceWith = differenceWith;\n    lodash.drop = drop;\n    lodash.dropRight = dropRight;\n    lodash.dropRightWhile = dropRightWhile;\n    lodash.dropWhile = dropWhile;\n    lodash.fill = fill;\n    lodash.filter = filter;\n    lodash.flatMap = flatMap;\n    lodash.flatMapDeep = flatMapDeep;\n    lodash.flatMapDepth = flatMapDepth;\n    lodash.flatten = flatten;\n    lodash.flattenDeep = flattenDeep;\n    lodash.flattenDepth = flattenDepth;\n    lodash.flip = flip;\n    lodash.flow = flow;\n    lodash.flowRight = flowRight;\n    lodash.fromPairs = fromPairs;\n    lodash.functions = functions;\n    lodash.functionsIn = functionsIn;\n    lodash.groupBy = groupBy;\n    lodash.initial = initial;\n    lodash.intersection = intersection;\n    lodash.intersectionBy = intersectionBy;\n    lodash.intersectionWith = intersectionWith;\n    lodash.invert = invert;\n    lodash.invertBy = invertBy;\n    lodash.invokeMap = invokeMap;\n    lodash.iteratee = iteratee;\n    lodash.keyBy = keyBy;\n    lodash.keys = keys;\n    lodash.keysIn = keysIn;\n    lodash.map = map;\n    lodash.mapKeys = mapKeys;\n    lodash.mapValues = mapValues;\n    lodash.matches = matches;\n    lodash.matchesProperty = matchesProperty;\n    lodash.memoize = memoize;\n    lodash.merge = merge;\n    lodash.mergeWith = mergeWith;\n    lodash.method = method;\n    lodash.methodOf = methodOf;\n    lodash.mixin = mixin;\n    lodash.negate = negate;\n    lodash.nthArg = nthArg;\n    lodash.omit = omit;\n    lodash.omitBy = omitBy;\n    lodash.once = once;\n    lodash.orderBy = orderBy;\n    lodash.over = over;\n    lodash.overArgs = overArgs;\n    lodash.overEvery = overEvery;\n    lodash.overSome = overSome;\n    lodash.partial = partial;\n    lodash.partialRight = partialRight;\n    lodash.partition = partition;\n    lodash.pick = pick;\n    lodash.pickBy = pickBy;\n    lodash.property = property;\n    lodash.propertyOf = propertyOf;\n    lodash.pull = pull;\n    lodash.pullAll = pullAll;\n    lodash.pullAllBy = pullAllBy;\n    lodash.pullAllWith = pullAllWith;\n    lodash.pullAt = pullAt;\n    lodash.range = range;\n    lodash.rangeRight = rangeRight;\n    lodash.rearg = rearg;\n    lodash.reject = reject;\n    lodash.remove = remove;\n    lodash.rest = rest;\n    lodash.reverse = reverse;\n    lodash.sampleSize = sampleSize;\n    lodash.set = set;\n    lodash.setWith = setWith;\n    lodash.shuffle = shuffle;\n    lodash.slice = slice;\n    lodash.sortBy = sortBy;\n    lodash.sortedUniq = sortedUniq;\n    lodash.sortedUniqBy = sortedUniqBy;\n    lodash.split = split;\n    lodash.spread = spread;\n    lodash.tail = tail;\n    lodash.take = take;\n    lodash.takeRight = takeRight;\n    lodash.takeRightWhile = takeRightWhile;\n    lodash.takeWhile = takeWhile;\n    lodash.tap = tap;\n    lodash.throttle = throttle;\n    lodash.thru = thru;\n    lodash.toArray = toArray;\n    lodash.toPairs = toPairs;\n    lodash.toPairsIn = toPairsIn;\n    lodash.toPath = toPath;\n    lodash.toPlainObject = toPlainObject;\n    lodash.transform = transform;\n    lodash.unary = unary;\n    lodash.union = union;\n    lodash.unionBy = unionBy;\n    lodash.unionWith = unionWith;\n    lodash.uniq = uniq;\n    lodash.uniqBy = uniqBy;\n    lodash.uniqWith = uniqWith;\n    lodash.unset = unset;\n    lodash.unzip = unzip;\n    lodash.unzipWith = unzipWith;\n    lodash.update = update;\n    lodash.updateWith = updateWith;\n    lodash.values = values;\n    lodash.valuesIn = valuesIn;\n    lodash.without = without;\n    lodash.words = words;\n    lodash.wrap = wrap;\n    lodash.xor = xor;\n    lodash.xorBy = xorBy;\n    lodash.xorWith = xorWith;\n    lodash.zip = zip;\n    lodash.zipObject = zipObject;\n    lodash.zipObjectDeep = zipObjectDeep;\n    lodash.zipWith = zipWith;\n\n    // Add aliases.\n    lodash.entries = toPairs;\n    lodash.entriesIn = toPairsIn;\n    lodash.extend = assignIn;\n    lodash.extendWith = assignInWith;\n\n    // Add methods to `lodash.prototype`.\n    mixin(lodash, lodash);\n\n    /*------------------------------------------------------------------------*/\n\n    // Add methods that return unwrapped values in chain sequences.\n    lodash.add = add;\n    lodash.attempt = attempt;\n    lodash.camelCase = camelCase;\n    lodash.capitalize = capitalize;\n    lodash.ceil = ceil;\n    lodash.clamp = clamp;\n    lodash.clone = clone;\n    lodash.cloneDeep = cloneDeep;\n    lodash.cloneDeepWith = cloneDeepWith;\n    lodash.cloneWith = cloneWith;\n    lodash.conformsTo = conformsTo;\n    lodash.deburr = deburr;\n    lodash.defaultTo = defaultTo;\n    lodash.divide = divide;\n    lodash.endsWith = endsWith;\n    lodash.eq = eq;\n    lodash.escape = escape;\n    lodash.escapeRegExp = escapeRegExp;\n    lodash.every = every;\n    lodash.find = find;\n    lodash.findIndex = findIndex;\n    lodash.findKey = findKey;\n    lodash.findLast = findLast;\n    lodash.findLastIndex = findLastIndex;\n    lodash.findLastKey = findLastKey;\n    lodash.floor = floor;\n    lodash.forEach = forEach;\n    lodash.forEachRight = forEachRight;\n    lodash.forIn = forIn;\n    lodash.forInRight = forInRight;\n    lodash.forOwn = forOwn;\n    lodash.forOwnRight = forOwnRight;\n    lodash.get = get;\n    lodash.gt = gt;\n    lodash.gte = gte;\n    lodash.has = has;\n    lodash.hasIn = hasIn;\n    lodash.head = head;\n    lodash.identity = identity;\n    lodash.includes = includes;\n    lodash.indexOf = indexOf;\n    lodash.inRange = inRange;\n    lodash.invoke = invoke;\n    lodash.isArguments = isArguments;\n    lodash.isArray = isArray;\n    lodash.isArrayBuffer = isArrayBuffer;\n    lodash.isArrayLike = isArrayLike;\n    lodash.isArrayLikeObject = isArrayLikeObject;\n    lodash.isBoolean = isBoolean;\n    lodash.isBuffer = isBuffer;\n    lodash.isDate = isDate;\n    lodash.isElement = isElement;\n    lodash.isEmpty = isEmpty;\n    lodash.isEqual = isEqual;\n    lodash.isEqualWith = isEqualWith;\n    lodash.isError = isError;\n    lodash.isFinite = isFinite;\n    lodash.isFunction = isFunction;\n    lodash.isInteger = isInteger;\n    lodash.isLength = isLength;\n    lodash.isMap = isMap;\n    lodash.isMatch = isMatch;\n    lodash.isMatchWith = isMatchWith;\n    lodash.isNaN = isNaN;\n    lodash.isNative = isNative;\n    lodash.isNil = isNil;\n    lodash.isNull = isNull;\n    lodash.isNumber = isNumber;\n    lodash.isObject = isObject;\n    lodash.isObjectLike = isObjectLike;\n    lodash.isPlainObject = isPlainObject;\n    lodash.isRegExp = isRegExp;\n    lodash.isSafeInteger = isSafeInteger;\n    lodash.isSet = isSet;\n    lodash.isString = isString;\n    lodash.isSymbol = isSymbol;\n    lodash.isTypedArray = isTypedArray;\n    lodash.isUndefined = isUndefined;\n    lodash.isWeakMap = isWeakMap;\n    lodash.isWeakSet = isWeakSet;\n    lodash.join = join;\n    lodash.kebabCase = kebabCase;\n    lodash.last = last;\n    lodash.lastIndexOf = lastIndexOf;\n    lodash.lowerCase = lowerCase;\n    lodash.lowerFirst = lowerFirst;\n    lodash.lt = lt;\n    lodash.lte = lte;\n    lodash.max = max;\n    lodash.maxBy = maxBy;\n    lodash.mean = mean;\n    lodash.meanBy = meanBy;\n    lodash.min = min;\n    lodash.minBy = minBy;\n    lodash.stubArray = stubArray;\n    lodash.stubFalse = stubFalse;\n    lodash.stubObject = stubObject;\n    lodash.stubString = stubString;\n    lodash.stubTrue = stubTrue;\n    lodash.multiply = multiply;\n    lodash.nth = nth;\n    lodash.noConflict = noConflict;\n    lodash.noop = noop;\n    lodash.now = now;\n    lodash.pad = pad;\n    lodash.padEnd = padEnd;\n    lodash.padStart = padStart;\n    lodash.parseInt = parseInt;\n    lodash.random = random;\n    lodash.reduce = reduce;\n    lodash.reduceRight = reduceRight;\n    lodash.repeat = repeat;\n    lodash.replace = replace;\n    lodash.result = result;\n    lodash.round = round;\n    lodash.runInContext = runInContext;\n    lodash.sample = sample;\n    lodash.size = size;\n    lodash.snakeCase = snakeCase;\n    lodash.some = some;\n    lodash.sortedIndex = sortedIndex;\n    lodash.sortedIndexBy = sortedIndexBy;\n    lodash.sortedIndexOf = sortedIndexOf;\n    lodash.sortedLastIndex = sortedLastIndex;\n    lodash.sortedLastIndexBy = sortedLastIndexBy;\n    lodash.sortedLastIndexOf = sortedLastIndexOf;\n    lodash.startCase = startCase;\n    lodash.startsWith = startsWith;\n    lodash.subtract = subtract;\n    lodash.sum = sum;\n    lodash.sumBy = sumBy;\n    lodash.template = template;\n    lodash.times = times;\n    lodash.toFinite = toFinite;\n    lodash.toInteger = toInteger;\n    lodash.toLength = toLength;\n    lodash.toLower = toLower;\n    lodash.toNumber = toNumber;\n    lodash.toSafeInteger = toSafeInteger;\n    lodash.toString = toString;\n    lodash.toUpper = toUpper;\n    lodash.trim = trim;\n    lodash.trimEnd = trimEnd;\n    lodash.trimStart = trimStart;\n    lodash.truncate = truncate;\n    lodash.unescape = unescape;\n    lodash.uniqueId = uniqueId;\n    lodash.upperCase = upperCase;\n    lodash.upperFirst = upperFirst;\n\n    // Add aliases.\n    lodash.each = forEach;\n    lodash.eachRight = forEachRight;\n    lodash.first = head;\n\n    mixin(lodash, (function() {\n      var source = {};\n      baseForOwn(lodash, function(func, methodName) {\n        if (!hasOwnProperty.call(lodash.prototype, methodName)) {\n          source[methodName] = func;\n        }\n      });\n      return source;\n    }()), { 'chain': false });\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * The semantic version number.\n     *\n     * @static\n     * @memberOf _\n     * @type {string}\n     */\n    lodash.VERSION = VERSION;\n\n    // Assign default placeholders.\n    arrayEach(['bind', 'bindKey', 'curry', 'curryRight', 'partial', 'partialRight'], function(methodName) {\n      lodash[methodName].placeholder = lodash;\n    });\n\n    // Add `LazyWrapper` methods for `_.drop` and `_.take` variants.\n    arrayEach(['drop', 'take'], function(methodName, index) {\n      LazyWrapper.prototype[methodName] = function(n) {\n        n = n === undefined ? 1 : nativeMax(toInteger(n), 0);\n\n        var result = (this.__filtered__ && !index)\n          ? new LazyWrapper(this)\n          : this.clone();\n\n        if (result.__filtered__) {\n          result.__takeCount__ = nativeMin(n, result.__takeCount__);\n        } else {\n          result.__views__.push({\n            'size': nativeMin(n, MAX_ARRAY_LENGTH),\n            'type': methodName + (result.__dir__ < 0 ? 'Right' : '')\n          });\n        }\n        return result;\n      };\n\n      LazyWrapper.prototype[methodName + 'Right'] = function(n) {\n        return this.reverse()[methodName](n).reverse();\n      };\n    });\n\n    // Add `LazyWrapper` methods that accept an `iteratee` value.\n    arrayEach(['filter', 'map', 'takeWhile'], function(methodName, index) {\n      var type = index + 1,\n          isFilter = type == LAZY_FILTER_FLAG || type == LAZY_WHILE_FLAG;\n\n      LazyWrapper.prototype[methodName] = function(iteratee) {\n        var result = this.clone();\n        result.__iteratees__.push({\n          'iteratee': getIteratee(iteratee, 3),\n          'type': type\n        });\n        result.__filtered__ = result.__filtered__ || isFilter;\n        return result;\n      };\n    });\n\n    // Add `LazyWrapper` methods for `_.head` and `_.last`.\n    arrayEach(['head', 'last'], function(methodName, index) {\n      var takeName = 'take' + (index ? 'Right' : '');\n\n      LazyWrapper.prototype[methodName] = function() {\n        return this[takeName](1).value()[0];\n      };\n    });\n\n    // Add `LazyWrapper` methods for `_.initial` and `_.tail`.\n    arrayEach(['initial', 'tail'], function(methodName, index) {\n      var dropName = 'drop' + (index ? '' : 'Right');\n\n      LazyWrapper.prototype[methodName] = function() {\n        return this.__filtered__ ? new LazyWrapper(this) : this[dropName](1);\n      };\n    });\n\n    LazyWrapper.prototype.compact = function() {\n      return this.filter(identity);\n    };\n\n    LazyWrapper.prototype.find = function(predicate) {\n      return this.filter(predicate).head();\n    };\n\n    LazyWrapper.prototype.findLast = function(predicate) {\n      return this.reverse().find(predicate);\n    };\n\n    LazyWrapper.prototype.invokeMap = baseRest(function(path, args) {\n      if (typeof path == 'function') {\n        return new LazyWrapper(this);\n      }\n      return this.map(function(value) {\n        return baseInvoke(value, path, args);\n      });\n    });\n\n    LazyWrapper.prototype.reject = function(predicate) {\n      return this.filter(negate(getIteratee(predicate)));\n    };\n\n    LazyWrapper.prototype.slice = function(start, end) {\n      start = toInteger(start);\n\n      var result = this;\n      if (result.__filtered__ && (start > 0 || end < 0)) {\n        return new LazyWrapper(result);\n      }\n      if (start < 0) {\n        result = result.takeRight(-start);\n      } else if (start) {\n        result = result.drop(start);\n      }\n      if (end !== undefined) {\n        end = toInteger(end);\n        result = end < 0 ? result.dropRight(-end) : result.take(end - start);\n      }\n      return result;\n    };\n\n    LazyWrapper.prototype.takeRightWhile = function(predicate) {\n      return this.reverse().takeWhile(predicate).reverse();\n    };\n\n    LazyWrapper.prototype.toArray = function() {\n      return this.take(MAX_ARRAY_LENGTH);\n    };\n\n    // Add `LazyWrapper` methods to `lodash.prototype`.\n    baseForOwn(LazyWrapper.prototype, function(func, methodName) {\n      var checkIteratee = /^(?:filter|find|map|reject)|While$/.test(methodName),\n          isTaker = /^(?:head|last)$/.test(methodName),\n          lodashFunc = lodash[isTaker ? ('take' + (methodName == 'last' ? 'Right' : '')) : methodName],\n          retUnwrapped = isTaker || /^find/.test(methodName);\n\n      if (!lodashFunc) {\n        return;\n      }\n      lodash.prototype[methodName] = function() {\n        var value = this.__wrapped__,\n            args = isTaker ? [1] : arguments,\n            isLazy = value instanceof LazyWrapper,\n            iteratee = args[0],\n            useLazy = isLazy || isArray(value);\n\n        var interceptor = function(value) {\n          var result = lodashFunc.apply(lodash, arrayPush([value], args));\n          return (isTaker && chainAll) ? result[0] : result;\n        };\n\n        if (useLazy && checkIteratee && typeof iteratee == 'function' && iteratee.length != 1) {\n          // Avoid lazy use if the iteratee has a \"length\" value other than `1`.\n          isLazy = useLazy = false;\n        }\n        var chainAll = this.__chain__,\n            isHybrid = !!this.__actions__.length,\n            isUnwrapped = retUnwrapped && !chainAll,\n            onlyLazy = isLazy && !isHybrid;\n\n        if (!retUnwrapped && useLazy) {\n          value = onlyLazy ? value : new LazyWrapper(this);\n          var result = func.apply(value, args);\n          result.__actions__.push({ 'func': thru, 'args': [interceptor], 'thisArg': undefined });\n          return new LodashWrapper(result, chainAll);\n        }\n        if (isUnwrapped && onlyLazy) {\n          return func.apply(this, args);\n        }\n        result = this.thru(interceptor);\n        return isUnwrapped ? (isTaker ? result.value()[0] : result.value()) : result;\n      };\n    });\n\n    // Add `Array` methods to `lodash.prototype`.\n    arrayEach(['pop', 'push', 'shift', 'sort', 'splice', 'unshift'], function(methodName) {\n      var func = arrayProto[methodName],\n          chainName = /^(?:push|sort|unshift)$/.test(methodName) ? 'tap' : 'thru',\n          retUnwrapped = /^(?:pop|shift)$/.test(methodName);\n\n      lodash.prototype[methodName] = function() {\n        var args = arguments;\n        if (retUnwrapped && !this.__chain__) {\n          var value = this.value();\n          return func.apply(isArray(value) ? value : [], args);\n        }\n        return this[chainName](function(value) {\n          return func.apply(isArray(value) ? value : [], args);\n        });\n      };\n    });\n\n    // Map minified method names to their real names.\n    baseForOwn(LazyWrapper.prototype, function(func, methodName) {\n      var lodashFunc = lodash[methodName];\n      if (lodashFunc) {\n        var key = lodashFunc.name + '';\n        if (!hasOwnProperty.call(realNames, key)) {\n          realNames[key] = [];\n        }\n        realNames[key].push({ 'name': methodName, 'func': lodashFunc });\n      }\n    });\n\n    realNames[createHybrid(undefined, WRAP_BIND_KEY_FLAG).name] = [{\n      'name': 'wrapper',\n      'func': undefined\n    }];\n\n    // Add methods to `LazyWrapper`.\n    LazyWrapper.prototype.clone = lazyClone;\n    LazyWrapper.prototype.reverse = lazyReverse;\n    LazyWrapper.prototype.value = lazyValue;\n\n    // Add chain sequence methods to the `lodash` wrapper.\n    lodash.prototype.at = wrapperAt;\n    lodash.prototype.chain = wrapperChain;\n    lodash.prototype.commit = wrapperCommit;\n    lodash.prototype.next = wrapperNext;\n    lodash.prototype.plant = wrapperPlant;\n    lodash.prototype.reverse = wrapperReverse;\n    lodash.prototype.toJSON = lodash.prototype.valueOf = lodash.prototype.value = wrapperValue;\n\n    // Add lazy aliases.\n    lodash.prototype.first = lodash.prototype.head;\n\n    if (symIterator) {\n      lodash.prototype[symIterator] = wrapperToIterator;\n    }\n    return lodash;\n  });\n\n  /*--------------------------------------------------------------------------*/\n\n  // Export lodash.\n  var _ = runInContext();\n\n  // Some AMD build optimizers, like r.js, check for condition patterns like:\n  if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {\n    // Expose Lodash on the global object to prevent errors when Lodash is\n    // loaded by a script tag in the presence of an AMD loader.\n    // See http://requirejs.org/docs/errors.html#mismatch for more details.\n    // Use `_.noConflict` to remove Lodash from the global object.\n    root._ = _;\n\n    // Define as an anonymous module so, through path mapping, it can be\n    // referenced as the \"underscore\" module.\n    define(function() {\n      return _;\n    });\n  }\n  // Check for `exports` after `define` in case a build optimizer adds it.\n  else if (freeModule) {\n    // Export for Node.js.\n    (freeModule.exports = _)._ = _;\n    // Export for CommonJS support.\n    freeExports._ = _;\n  }\n  else {\n    // Export to the global object.\n    root._ = _;\n  }\n}.call(this));\n","// THIS FILE IS GENERATED - DO NOT EDIT!\n/*!mobile-detect v1.4.5 2021-03-13*/\n/*global module:false, define:false*/\n/*jshint latedef:false*/\n/*!@license Copyright 2013, Heinrich Goebl, License: MIT, see https://github.com/hgoebl/mobile-detect.js*/\n(function (define, undefined) {\ndefine(function () {\n    'use strict';\n\n    var impl = {};\n\n    impl.mobileDetectRules = {\n    \"phones\": {\n        \"iPhone\": \"\\\\biPhone\\\\b|\\\\biPod\\\\b\",\n        \"BlackBerry\": \"BlackBerry|\\\\bBB10\\\\b|rim[0-9]+|\\\\b(BBA100|BBB100|BBD100|BBE100|BBF100|STH100)\\\\b-[0-9]+\",\n        \"Pixel\": \"; \\\\bPixel\\\\b\",\n        \"HTC\": \"HTC|HTC.*(Sensation|Evo|Vision|Explorer|6800|8100|8900|A7272|S510e|C110e|Legend|Desire|T8282)|APX515CKT|Qtek9090|APA9292KT|HD_mini|Sensation.*Z710e|PG86100|Z715e|Desire.*(A8181|HD)|ADR6200|ADR6400L|ADR6425|001HT|Inspire 4G|Android.*\\\\bEVO\\\\b|T-Mobile G1|Z520m|Android [0-9.]+; Pixel\",\n        \"Nexus\": \"Nexus One|Nexus S|Galaxy.*Nexus|Android.*Nexus.*Mobile|Nexus 4|Nexus 5|Nexus 5X|Nexus 6\",\n        \"Dell\": \"Dell[;]? (Streak|Aero|Venue|Venue Pro|Flash|Smoke|Mini 3iX)|XCD28|XCD35|\\\\b001DL\\\\b|\\\\b101DL\\\\b|\\\\bGS01\\\\b\",\n        \"Motorola\": \"Motorola|DROIDX|DROID BIONIC|\\\\bDroid\\\\b.*Build|Android.*Xoom|HRI39|MOT-|A1260|A1680|A555|A853|A855|A953|A955|A956|Motorola.*ELECTRIFY|Motorola.*i1|i867|i940|MB200|MB300|MB501|MB502|MB508|MB511|MB520|MB525|MB526|MB611|MB612|MB632|MB810|MB855|MB860|MB861|MB865|MB870|ME501|ME502|ME511|ME525|ME600|ME632|ME722|ME811|ME860|ME863|ME865|MT620|MT710|MT716|MT720|MT810|MT870|MT917|Motorola.*TITANIUM|WX435|WX445|XT300|XT301|XT311|XT316|XT317|XT319|XT320|XT390|XT502|XT530|XT531|XT532|XT535|XT603|XT610|XT611|XT615|XT681|XT701|XT702|XT711|XT720|XT800|XT806|XT860|XT862|XT875|XT882|XT883|XT894|XT901|XT907|XT909|XT910|XT912|XT928|XT926|XT915|XT919|XT925|XT1021|\\\\bMoto E\\\\b|XT1068|XT1092|XT1052\",\n        \"Samsung\": \"\\\\bSamsung\\\\b|SM-G950F|SM-G955F|SM-G9250|GT-19300|SGH-I337|BGT-S5230|GT-B2100|GT-B2700|GT-B2710|GT-B3210|GT-B3310|GT-B3410|GT-B3730|GT-B3740|GT-B5510|GT-B5512|GT-B5722|GT-B6520|GT-B7300|GT-B7320|GT-B7330|GT-B7350|GT-B7510|GT-B7722|GT-B7800|GT-C3010|GT-C3011|GT-C3060|GT-C3200|GT-C3212|GT-C3212I|GT-C3262|GT-C3222|GT-C3300|GT-C3300K|GT-C3303|GT-C3303K|GT-C3310|GT-C3322|GT-C3330|GT-C3350|GT-C3500|GT-C3510|GT-C3530|GT-C3630|GT-C3780|GT-C5010|GT-C5212|GT-C6620|GT-C6625|GT-C6712|GT-E1050|GT-E1070|GT-E1075|GT-E1080|GT-E1081|GT-E1085|GT-E1087|GT-E1100|GT-E1107|GT-E1110|GT-E1120|GT-E1125|GT-E1130|GT-E1160|GT-E1170|GT-E1175|GT-E1180|GT-E1182|GT-E1200|GT-E1210|GT-E1225|GT-E1230|GT-E1390|GT-E2100|GT-E2120|GT-E2121|GT-E2152|GT-E2220|GT-E2222|GT-E2230|GT-E2232|GT-E2250|GT-E2370|GT-E2550|GT-E2652|GT-E3210|GT-E3213|GT-I5500|GT-I5503|GT-I5700|GT-I5800|GT-I5801|GT-I6410|GT-I6420|GT-I7110|GT-I7410|GT-I7500|GT-I8000|GT-I8150|GT-I8160|GT-I8190|GT-I8320|GT-I8330|GT-I8350|GT-I8530|GT-I8700|GT-I8703|GT-I8910|GT-I9000|GT-I9001|GT-I9003|GT-I9010|GT-I9020|GT-I9023|GT-I9070|GT-I9082|GT-I9100|GT-I9103|GT-I9220|GT-I9250|GT-I9300|GT-I9305|GT-I9500|GT-I9505|GT-M3510|GT-M5650|GT-M7500|GT-M7600|GT-M7603|GT-M8800|GT-M8910|GT-N7000|GT-S3110|GT-S3310|GT-S3350|GT-S3353|GT-S3370|GT-S3650|GT-S3653|GT-S3770|GT-S3850|GT-S5210|GT-S5220|GT-S5229|GT-S5230|GT-S5233|GT-S5250|GT-S5253|GT-S5260|GT-S5263|GT-S5270|GT-S5300|GT-S5330|GT-S5350|GT-S5360|GT-S5363|GT-S5369|GT-S5380|GT-S5380D|GT-S5560|GT-S5570|GT-S5600|GT-S5603|GT-S5610|GT-S5620|GT-S5660|GT-S5670|GT-S5690|GT-S5750|GT-S5780|GT-S5830|GT-S5839|GT-S6102|GT-S6500|GT-S7070|GT-S7200|GT-S7220|GT-S7230|GT-S7233|GT-S7250|GT-S7500|GT-S7530|GT-S7550|GT-S7562|GT-S7710|GT-S8000|GT-S8003|GT-S8500|GT-S8530|GT-S8600|SCH-A310|SCH-A530|SCH-A570|SCH-A610|SCH-A630|SCH-A650|SCH-A790|SCH-A795|SCH-A850|SCH-A870|SCH-A890|SCH-A930|SCH-A950|SCH-A970|SCH-A990|SCH-I100|SCH-I110|SCH-I400|SCH-I405|SCH-I500|SCH-I510|SCH-I515|SCH-I600|SCH-I730|SCH-I760|SCH-I770|SCH-I830|SCH-I910|SCH-I920|SCH-I959|SCH-LC11|SCH-N150|SCH-N300|SCH-R100|SCH-R300|SCH-R351|SCH-R400|SCH-R410|SCH-T300|SCH-U310|SCH-U320|SCH-U350|SCH-U360|SCH-U365|SCH-U370|SCH-U380|SCH-U410|SCH-U430|SCH-U450|SCH-U460|SCH-U470|SCH-U490|SCH-U540|SCH-U550|SCH-U620|SCH-U640|SCH-U650|SCH-U660|SCH-U700|SCH-U740|SCH-U750|SCH-U810|SCH-U820|SCH-U900|SCH-U940|SCH-U960|SCS-26UC|SGH-A107|SGH-A117|SGH-A127|SGH-A137|SGH-A157|SGH-A167|SGH-A177|SGH-A187|SGH-A197|SGH-A227|SGH-A237|SGH-A257|SGH-A437|SGH-A517|SGH-A597|SGH-A637|SGH-A657|SGH-A667|SGH-A687|SGH-A697|SGH-A707|SGH-A717|SGH-A727|SGH-A737|SGH-A747|SGH-A767|SGH-A777|SGH-A797|SGH-A817|SGH-A827|SGH-A837|SGH-A847|SGH-A867|SGH-A877|SGH-A887|SGH-A897|SGH-A927|SGH-B100|SGH-B130|SGH-B200|SGH-B220|SGH-C100|SGH-C110|SGH-C120|SGH-C130|SGH-C140|SGH-C160|SGH-C170|SGH-C180|SGH-C200|SGH-C207|SGH-C210|SGH-C225|SGH-C230|SGH-C417|SGH-C450|SGH-D307|SGH-D347|SGH-D357|SGH-D407|SGH-D415|SGH-D780|SGH-D807|SGH-D980|SGH-E105|SGH-E200|SGH-E315|SGH-E316|SGH-E317|SGH-E335|SGH-E590|SGH-E635|SGH-E715|SGH-E890|SGH-F300|SGH-F480|SGH-I200|SGH-I300|SGH-I320|SGH-I550|SGH-I577|SGH-I600|SGH-I607|SGH-I617|SGH-I627|SGH-I637|SGH-I677|SGH-I700|SGH-I717|SGH-I727|SGH-i747M|SGH-I777|SGH-I780|SGH-I827|SGH-I847|SGH-I857|SGH-I896|SGH-I897|SGH-I900|SGH-I907|SGH-I917|SGH-I927|SGH-I937|SGH-I997|SGH-J150|SGH-J200|SGH-L170|SGH-L700|SGH-M110|SGH-M150|SGH-M200|SGH-N105|SGH-N500|SGH-N600|SGH-N620|SGH-N625|SGH-N700|SGH-N710|SGH-P107|SGH-P207|SGH-P300|SGH-P310|SGH-P520|SGH-P735|SGH-P777|SGH-Q105|SGH-R210|SGH-R220|SGH-R225|SGH-S105|SGH-S307|SGH-T109|SGH-T119|SGH-T139|SGH-T209|SGH-T219|SGH-T229|SGH-T239|SGH-T249|SGH-T259|SGH-T309|SGH-T319|SGH-T329|SGH-T339|SGH-T349|SGH-T359|SGH-T369|SGH-T379|SGH-T409|SGH-T429|SGH-T439|SGH-T459|SGH-T469|SGH-T479|SGH-T499|SGH-T509|SGH-T519|SGH-T539|SGH-T559|SGH-T589|SGH-T609|SGH-T619|SGH-T629|SGH-T639|SGH-T659|SGH-T669|SGH-T679|SGH-T709|SGH-T719|SGH-T729|SGH-T739|SGH-T746|SGH-T749|SGH-T759|SGH-T769|SGH-T809|SGH-T819|SGH-T839|SGH-T919|SGH-T929|SGH-T939|SGH-T959|SGH-T989|SGH-U100|SGH-U200|SGH-U800|SGH-V205|SGH-V206|SGH-X100|SGH-X105|SGH-X120|SGH-X140|SGH-X426|SGH-X427|SGH-X475|SGH-X495|SGH-X497|SGH-X507|SGH-X600|SGH-X610|SGH-X620|SGH-X630|SGH-X700|SGH-X820|SGH-X890|SGH-Z130|SGH-Z150|SGH-Z170|SGH-ZX10|SGH-ZX20|SHW-M110|SPH-A120|SPH-A400|SPH-A420|SPH-A460|SPH-A500|SPH-A560|SPH-A600|SPH-A620|SPH-A660|SPH-A700|SPH-A740|SPH-A760|SPH-A790|SPH-A800|SPH-A820|SPH-A840|SPH-A880|SPH-A900|SPH-A940|SPH-A960|SPH-D600|SPH-D700|SPH-D710|SPH-D720|SPH-I300|SPH-I325|SPH-I330|SPH-I350|SPH-I500|SPH-I600|SPH-I700|SPH-L700|SPH-M100|SPH-M220|SPH-M240|SPH-M300|SPH-M305|SPH-M320|SPH-M330|SPH-M350|SPH-M360|SPH-M370|SPH-M380|SPH-M510|SPH-M540|SPH-M550|SPH-M560|SPH-M570|SPH-M580|SPH-M610|SPH-M620|SPH-M630|SPH-M800|SPH-M810|SPH-M850|SPH-M900|SPH-M910|SPH-M920|SPH-M930|SPH-N100|SPH-N200|SPH-N240|SPH-N300|SPH-N400|SPH-Z400|SWC-E100|SCH-i909|GT-N7100|GT-N7105|SCH-I535|SM-N900A|SGH-I317|SGH-T999L|GT-S5360B|GT-I8262|GT-S6802|GT-S6312|GT-S6310|GT-S5312|GT-S5310|GT-I9105|GT-I8510|GT-S6790N|SM-G7105|SM-N9005|GT-S5301|GT-I9295|GT-I9195|SM-C101|GT-S7392|GT-S7560|GT-B7610|GT-I5510|GT-S7582|GT-S7530E|GT-I8750|SM-G9006V|SM-G9008V|SM-G9009D|SM-G900A|SM-G900D|SM-G900F|SM-G900H|SM-G900I|SM-G900J|SM-G900K|SM-G900L|SM-G900M|SM-G900P|SM-G900R4|SM-G900S|SM-G900T|SM-G900V|SM-G900W8|SHV-E160K|SCH-P709|SCH-P729|SM-T2558|GT-I9205|SM-G9350|SM-J120F|SM-G920F|SM-G920V|SM-G930F|SM-N910C|SM-A310F|GT-I9190|SM-J500FN|SM-G903F|SM-J330F|SM-G610F|SM-G981B|SM-G892A|SM-A530F\",\n        \"LG\": \"\\\\bLG\\\\b;|LG[- ]?(C800|C900|E400|E610|E900|E-900|F160|F180K|F180L|F180S|730|855|L160|LS740|LS840|LS970|LU6200|MS690|MS695|MS770|MS840|MS870|MS910|P500|P700|P705|VM696|AS680|AS695|AX840|C729|E970|GS505|272|C395|E739BK|E960|L55C|L75C|LS696|LS860|P769BK|P350|P500|P509|P870|UN272|US730|VS840|VS950|LN272|LN510|LS670|LS855|LW690|MN270|MN510|P509|P769|P930|UN200|UN270|UN510|UN610|US670|US740|US760|UX265|UX840|VN271|VN530|VS660|VS700|VS740|VS750|VS910|VS920|VS930|VX9200|VX11000|AX840A|LW770|P506|P925|P999|E612|D955|D802|MS323|M257)|LM-G710\",\n        \"Sony\": \"SonyST|SonyLT|SonyEricsson|SonyEricssonLT15iv|LT18i|E10i|LT28h|LT26w|SonyEricssonMT27i|C5303|C6902|C6903|C6906|C6943|D2533|SOV34|601SO|F8332\",\n        \"Asus\": \"Asus.*Galaxy|PadFone.*Mobile\",\n        \"Xiaomi\": \"^(?!.*\\\\bx11\\\\b).*xiaomi.*$|POCOPHONE F1|MI 8|Redmi Note 9S|Redmi Note 5A Prime|N2G47H|M2001J2G|M2001J2I|M1805E10A|M2004J11G|M1902F1G|M2002J9G|M2004J19G|M2003J6A1G\",\n        \"NokiaLumia\": \"Lumia [0-9]{3,4}\",\n        \"Micromax\": \"Micromax.*\\\\b(A210|A92|A88|A72|A111|A110Q|A115|A116|A110|A90S|A26|A51|A35|A54|A25|A27|A89|A68|A65|A57|A90)\\\\b\",\n        \"Palm\": \"PalmSource|Palm\",\n        \"Vertu\": \"Vertu|Vertu.*Ltd|Vertu.*Ascent|Vertu.*Ayxta|Vertu.*Constellation(F|Quest)?|Vertu.*Monika|Vertu.*Signature\",\n        \"Pantech\": \"PANTECH|IM-A850S|IM-A840S|IM-A830L|IM-A830K|IM-A830S|IM-A820L|IM-A810K|IM-A810S|IM-A800S|IM-T100K|IM-A725L|IM-A780L|IM-A775C|IM-A770K|IM-A760S|IM-A750K|IM-A740S|IM-A730S|IM-A720L|IM-A710K|IM-A690L|IM-A690S|IM-A650S|IM-A630K|IM-A600S|VEGA PTL21|PT003|P8010|ADR910L|P6030|P6020|P9070|P4100|P9060|P5000|CDM8992|TXT8045|ADR8995|IS11PT|P2030|P6010|P8000|PT002|IS06|CDM8999|P9050|PT001|TXT8040|P2020|P9020|P2000|P7040|P7000|C790\",\n        \"Fly\": \"IQ230|IQ444|IQ450|IQ440|IQ442|IQ441|IQ245|IQ256|IQ236|IQ255|IQ235|IQ245|IQ275|IQ240|IQ285|IQ280|IQ270|IQ260|IQ250\",\n        \"Wiko\": \"KITE 4G|HIGHWAY|GETAWAY|STAIRWAY|DARKSIDE|DARKFULL|DARKNIGHT|DARKMOON|SLIDE|WAX 4G|RAINBOW|BLOOM|SUNSET|GOA(?!nna)|LENNY|BARRY|IGGY|OZZY|CINK FIVE|CINK PEAX|CINK PEAX 2|CINK SLIM|CINK SLIM 2|CINK +|CINK KING|CINK PEAX|CINK SLIM|SUBLIM\",\n        \"iMobile\": \"i-mobile (IQ|i-STYLE|idea|ZAA|Hitz)\",\n        \"SimValley\": \"\\\\b(SP-80|XT-930|SX-340|XT-930|SX-310|SP-360|SP60|SPT-800|SP-120|SPT-800|SP-140|SPX-5|SPX-8|SP-100|SPX-8|SPX-12)\\\\b\",\n        \"Wolfgang\": \"AT-B24D|AT-AS50HD|AT-AS40W|AT-AS55HD|AT-AS45q2|AT-B26D|AT-AS50Q\",\n        \"Alcatel\": \"Alcatel\",\n        \"Nintendo\": \"Nintendo (3DS|Switch)\",\n        \"Amoi\": \"Amoi\",\n        \"INQ\": \"INQ\",\n        \"OnePlus\": \"ONEPLUS\",\n        \"GenericPhone\": \"Tapatalk|PDA;|SAGEM|\\\\bmmp\\\\b|pocket|\\\\bpsp\\\\b|symbian|Smartphone|smartfon|treo|up.browser|up.link|vodafone|\\\\bwap\\\\b|nokia|Series40|Series60|S60|SonyEricsson|N900|MAUI.*WAP.*Browser\"\n    },\n    \"tablets\": {\n        \"iPad\": \"iPad|iPad.*Mobile\",\n        \"NexusTablet\": \"Android.*Nexus[\\\\s]+(7|9|10)\",\n        \"GoogleTablet\": \"Android.*Pixel C\",\n        \"SamsungTablet\": \"SAMSUNG.*Tablet|Galaxy.*Tab|SC-01C|GT-P1000|GT-P1003|GT-P1010|GT-P3105|GT-P6210|GT-P6800|GT-P6810|GT-P7100|GT-P7300|GT-P7310|GT-P7500|GT-P7510|SCH-I800|SCH-I815|SCH-I905|SGH-I957|SGH-I987|SGH-T849|SGH-T859|SGH-T869|SPH-P100|GT-P3100|GT-P3108|GT-P3110|GT-P5100|GT-P5110|GT-P6200|GT-P7320|GT-P7511|GT-N8000|GT-P8510|SGH-I497|SPH-P500|SGH-T779|SCH-I705|SCH-I915|GT-N8013|GT-P3113|GT-P5113|GT-P8110|GT-N8010|GT-N8005|GT-N8020|GT-P1013|GT-P6201|GT-P7501|GT-N5100|GT-N5105|GT-N5110|SHV-E140K|SHV-E140L|SHV-E140S|SHV-E150S|SHV-E230K|SHV-E230L|SHV-E230S|SHW-M180K|SHW-M180L|SHW-M180S|SHW-M180W|SHW-M300W|SHW-M305W|SHW-M380K|SHW-M380S|SHW-M380W|SHW-M430W|SHW-M480K|SHW-M480S|SHW-M480W|SHW-M485W|SHW-M486W|SHW-M500W|GT-I9228|SCH-P739|SCH-I925|GT-I9200|GT-P5200|GT-P5210|GT-P5210X|SM-T311|SM-T310|SM-T310X|SM-T210|SM-T210R|SM-T211|SM-P600|SM-P601|SM-P605|SM-P900|SM-P901|SM-T217|SM-T217A|SM-T217S|SM-P6000|SM-T3100|SGH-I467|XE500|SM-T110|GT-P5220|GT-I9200X|GT-N5110X|GT-N5120|SM-P905|SM-T111|SM-T2105|SM-T315|SM-T320|SM-T320X|SM-T321|SM-T520|SM-T525|SM-T530NU|SM-T230NU|SM-T330NU|SM-T900|XE500T1C|SM-P605V|SM-P905V|SM-T337V|SM-T537V|SM-T707V|SM-T807V|SM-P600X|SM-P900X|SM-T210X|SM-T230|SM-T230X|SM-T325|GT-P7503|SM-T531|SM-T330|SM-T530|SM-T705|SM-T705C|SM-T535|SM-T331|SM-T800|SM-T700|SM-T537|SM-T807|SM-P907A|SM-T337A|SM-T537A|SM-T707A|SM-T807A|SM-T237|SM-T807P|SM-P607T|SM-T217T|SM-T337T|SM-T807T|SM-T116NQ|SM-T116BU|SM-P550|SM-T350|SM-T550|SM-T9000|SM-P9000|SM-T705Y|SM-T805|GT-P3113|SM-T710|SM-T810|SM-T815|SM-T360|SM-T533|SM-T113|SM-T335|SM-T715|SM-T560|SM-T670|SM-T677|SM-T377|SM-T567|SM-T357T|SM-T555|SM-T561|SM-T713|SM-T719|SM-T813|SM-T819|SM-T580|SM-T355Y?|SM-T280|SM-T817A|SM-T820|SM-W700|SM-P580|SM-T587|SM-P350|SM-P555M|SM-P355M|SM-T113NU|SM-T815Y|SM-T585|SM-T285|SM-T825|SM-W708|SM-T835|SM-T830|SM-T837V|SM-T720|SM-T510|SM-T387V|SM-P610|SM-T290|SM-T515|SM-T590|SM-T595|SM-T725|SM-T817P|SM-P585N0|SM-T395|SM-T295|SM-T865|SM-P610N|SM-P615|SM-T970|SM-T380|SM-T5950|SM-T905|SM-T231|SM-T500|SM-T860\",\n        \"Kindle\": \"Kindle|Silk.*Accelerated|Android.*\\\\b(KFOT|KFTT|KFJWI|KFJWA|KFOTE|KFSOWI|KFTHWI|KFTHWA|KFAPWI|KFAPWA|WFJWAE|KFSAWA|KFSAWI|KFASWI|KFARWI|KFFOWI|KFGIWI|KFMEWI)\\\\b|Android.*Silk\\/[0-9.]+ like Chrome\\/[0-9.]+ (?!Mobile)\",\n        \"SurfaceTablet\": \"Windows NT [0-9.]+; ARM;.*(Tablet|ARMBJS)\",\n        \"HPTablet\": \"HP Slate (7|8|10)|HP ElitePad 900|hp-tablet|EliteBook.*Touch|HP 8|Slate 21|HP SlateBook 10\",\n        \"AsusTablet\": \"^.*PadFone((?!Mobile).)*$|Transformer|TF101|TF101G|TF300T|TF300TG|TF300TL|TF700T|TF700KL|TF701T|TF810C|ME171|ME301T|ME302C|ME371MG|ME370T|ME372MG|ME172V|ME173X|ME400C|Slider SL101|\\\\bK00F\\\\b|\\\\bK00C\\\\b|\\\\bK00E\\\\b|\\\\bK00L\\\\b|TX201LA|ME176C|ME102A|\\\\bM80TA\\\\b|ME372CL|ME560CG|ME372CG|ME302KL| K010 | K011 | K017 | K01E |ME572C|ME103K|ME170C|ME171C|\\\\bME70C\\\\b|ME581C|ME581CL|ME8510C|ME181C|P01Y|PO1MA|P01Z|\\\\bP027\\\\b|\\\\bP024\\\\b|\\\\bP00C\\\\b\",\n        \"BlackBerryTablet\": \"PlayBook|RIM Tablet\",\n        \"HTCtablet\": \"HTC_Flyer_P512|HTC Flyer|HTC Jetstream|HTC-P715a|HTC EVO View 4G|PG41200|PG09410\",\n        \"MotorolaTablet\": \"xoom|sholest|MZ615|MZ605|MZ505|MZ601|MZ602|MZ603|MZ604|MZ606|MZ607|MZ608|MZ609|MZ615|MZ616|MZ617\",\n        \"NookTablet\": \"Android.*Nook|NookColor|nook browser|BNRV200|BNRV200A|BNTV250|BNTV250A|BNTV400|BNTV600|LogicPD Zoom2\",\n        \"AcerTablet\": \"Android.*; \\\\b(A100|A101|A110|A200|A210|A211|A500|A501|A510|A511|A700|A701|W500|W500P|W501|W501P|W510|W511|W700|G100|G100W|B1-A71|B1-710|B1-711|A1-810|A1-811|A1-830)\\\\b|W3-810|\\\\bA3-A10\\\\b|\\\\bA3-A11\\\\b|\\\\bA3-A20\\\\b|\\\\bA3-A30|A3-A40\",\n        \"ToshibaTablet\": \"Android.*(AT100|AT105|AT200|AT205|AT270|AT275|AT300|AT305|AT1S5|AT500|AT570|AT700|AT830)|TOSHIBA.*FOLIO\",\n        \"LGTablet\": \"\\\\bL-06C|LG-V909|LG-V900|LG-V700|LG-V510|LG-V500|LG-V410|LG-V400|LG-VK810\\\\b\",\n        \"FujitsuTablet\": \"Android.*\\\\b(F-01D|F-02F|F-05E|F-10D|M532|Q572)\\\\b\",\n        \"PrestigioTablet\": \"PMP3170B|PMP3270B|PMP3470B|PMP7170B|PMP3370B|PMP3570C|PMP5870C|PMP3670B|PMP5570C|PMP5770D|PMP3970B|PMP3870C|PMP5580C|PMP5880D|PMP5780D|PMP5588C|PMP7280C|PMP7280C3G|PMP7280|PMP7880D|PMP5597D|PMP5597|PMP7100D|PER3464|PER3274|PER3574|PER3884|PER5274|PER5474|PMP5097CPRO|PMP5097|PMP7380D|PMP5297C|PMP5297C_QUAD|PMP812E|PMP812E3G|PMP812F|PMP810E|PMP880TD|PMT3017|PMT3037|PMT3047|PMT3057|PMT7008|PMT5887|PMT5001|PMT5002\",\n        \"LenovoTablet\": \"Lenovo TAB|Idea(Tab|Pad)( A1|A10| K1|)|ThinkPad([ ]+)?Tablet|YT3-850M|YT3-X90L|YT3-X90F|YT3-X90X|Lenovo.*(S2109|S2110|S5000|S6000|K3011|A3000|A3500|A1000|A2107|A2109|A1107|A5500|A7600|B6000|B8000|B8080)(-|)(FL|F|HV|H|)|TB-X103F|TB-X304X|TB-X304F|TB-X304L|TB-X505F|TB-X505L|TB-X505X|TB-X605F|TB-X605L|TB-8703F|TB-8703X|TB-8703N|TB-8704N|TB-8704F|TB-8704X|TB-8704V|TB-7304F|TB-7304I|TB-7304X|Tab2A7-10F|Tab2A7-20F|TB2-X30L|YT3-X50L|YT3-X50F|YT3-X50M|YT-X705F|YT-X703F|YT-X703L|YT-X705L|YT-X705X|TB2-X30F|TB2-X30L|TB2-X30M|A2107A-F|A2107A-H|TB3-730F|TB3-730M|TB3-730X|TB-7504F|TB-7504X|TB-X704F|TB-X104F|TB3-X70F|TB-X705F|TB-8504F|TB3-X70L|TB3-710F|TB-X704L\",\n        \"DellTablet\": \"Venue 11|Venue 8|Venue 7|Dell Streak 10|Dell Streak 7\",\n        \"YarvikTablet\": \"Android.*\\\\b(TAB210|TAB211|TAB224|TAB250|TAB260|TAB264|TAB310|TAB360|TAB364|TAB410|TAB411|TAB420|TAB424|TAB450|TAB460|TAB461|TAB464|TAB465|TAB467|TAB468|TAB07-100|TAB07-101|TAB07-150|TAB07-151|TAB07-152|TAB07-200|TAB07-201-3G|TAB07-210|TAB07-211|TAB07-212|TAB07-214|TAB07-220|TAB07-400|TAB07-485|TAB08-150|TAB08-200|TAB08-201-3G|TAB08-201-30|TAB09-100|TAB09-211|TAB09-410|TAB10-150|TAB10-201|TAB10-211|TAB10-400|TAB10-410|TAB13-201|TAB274EUK|TAB275EUK|TAB374EUK|TAB462EUK|TAB474EUK|TAB9-200)\\\\b\",\n        \"MedionTablet\": \"Android.*\\\\bOYO\\\\b|LIFE.*(P9212|P9514|P9516|S9512)|LIFETAB\",\n        \"ArnovaTablet\": \"97G4|AN10G2|AN7bG3|AN7fG3|AN8G3|AN8cG3|AN7G3|AN9G3|AN7dG3|AN7dG3ST|AN7dG3ChildPad|AN10bG3|AN10bG3DT|AN9G2\",\n        \"IntensoTablet\": \"INM8002KP|INM1010FP|INM805ND|Intenso Tab|TAB1004\",\n        \"IRUTablet\": \"M702pro\",\n        \"MegafonTablet\": \"MegaFon V9|\\\\bZTE V9\\\\b|Android.*\\\\bMT7A\\\\b\",\n        \"EbodaTablet\": \"E-Boda (Supreme|Impresspeed|Izzycomm|Essential)\",\n        \"AllViewTablet\": \"Allview.*(Viva|Alldro|City|Speed|All TV|Frenzy|Quasar|Shine|TX1|AX1|AX2)\",\n        \"ArchosTablet\": \"\\\\b(101G9|80G9|A101IT)\\\\b|Qilive 97R|Archos5|\\\\bARCHOS (70|79|80|90|97|101|FAMILYPAD|)(b|c|)(G10| Cobalt| TITANIUM(HD|)| Xenon| Neon|XSK| 2| XS 2| PLATINUM| CARBON|GAMEPAD)\\\\b\",\n        \"AinolTablet\": \"NOVO7|NOVO8|NOVO10|Novo7Aurora|Novo7Basic|NOVO7PALADIN|novo9-Spark\",\n        \"NokiaLumiaTablet\": \"Lumia 2520\",\n        \"SonyTablet\": \"Sony.*Tablet|Xperia Tablet|Sony Tablet S|SO-03E|SGPT12|SGPT13|SGPT114|SGPT121|SGPT122|SGPT123|SGPT111|SGPT112|SGPT113|SGPT131|SGPT132|SGPT133|SGPT211|SGPT212|SGPT213|SGP311|SGP312|SGP321|EBRD1101|EBRD1102|EBRD1201|SGP351|SGP341|SGP511|SGP512|SGP521|SGP541|SGP551|SGP621|SGP641|SGP612|SOT31|SGP771|SGP611|SGP612|SGP712\",\n        \"PhilipsTablet\": \"\\\\b(PI2010|PI3000|PI3100|PI3105|PI3110|PI3205|PI3210|PI3900|PI4010|PI7000|PI7100)\\\\b\",\n        \"CubeTablet\": \"Android.*(K8GT|U9GT|U10GT|U16GT|U17GT|U18GT|U19GT|U20GT|U23GT|U30GT)|CUBE U8GT\",\n        \"CobyTablet\": \"MID1042|MID1045|MID1125|MID1126|MID7012|MID7014|MID7015|MID7034|MID7035|MID7036|MID7042|MID7048|MID7127|MID8042|MID8048|MID8127|MID9042|MID9740|MID9742|MID7022|MID7010\",\n        \"MIDTablet\": \"M9701|M9000|M9100|M806|M1052|M806|T703|MID701|MID713|MID710|MID727|MID760|MID830|MID728|MID933|MID125|MID810|MID732|MID120|MID930|MID800|MID731|MID900|MID100|MID820|MID735|MID980|MID130|MID833|MID737|MID960|MID135|MID860|MID736|MID140|MID930|MID835|MID733|MID4X10\",\n        \"MSITablet\": \"MSI \\\\b(Primo 73K|Primo 73L|Primo 81L|Primo 77|Primo 93|Primo 75|Primo 76|Primo 73|Primo 81|Primo 91|Primo 90|Enjoy 71|Enjoy 7|Enjoy 10)\\\\b\",\n        \"SMiTTablet\": \"Android.*(\\\\bMID\\\\b|MID-560|MTV-T1200|MTV-PND531|MTV-P1101|MTV-PND530)\",\n        \"RockChipTablet\": \"Android.*(RK2818|RK2808A|RK2918|RK3066)|RK2738|RK2808A\",\n        \"FlyTablet\": \"IQ310|Fly Vision\",\n        \"bqTablet\": \"Android.*(bq)?.*\\\\b(Elcano|Curie|Edison|Maxwell|Kepler|Pascal|Tesla|Hypatia|Platon|Newton|Livingstone|Cervantes|Avant|Aquaris ([E|M]10|M8))\\\\b|Maxwell.*Lite|Maxwell.*Plus\",\n        \"HuaweiTablet\": \"MediaPad|MediaPad 7 Youth|IDEOS S7|S7-201c|S7-202u|S7-101|S7-103|S7-104|S7-105|S7-106|S7-201|S7-Slim|M2-A01L|BAH-L09|BAH-W09|AGS-L09|CMR-AL19\",\n        \"NecTablet\": \"\\\\bN-06D|\\\\bN-08D\",\n        \"PantechTablet\": \"Pantech.*P4100\",\n        \"BronchoTablet\": \"Broncho.*(N701|N708|N802|a710)\",\n        \"VersusTablet\": \"TOUCHPAD.*[78910]|\\\\bTOUCHTAB\\\\b\",\n        \"ZyncTablet\": \"z1000|Z99 2G|z930|z990|z909|Z919|z900\",\n        \"PositivoTablet\": \"TB07STA|TB10STA|TB07FTA|TB10FTA\",\n        \"NabiTablet\": \"Android.*\\\\bNabi\",\n        \"KoboTablet\": \"Kobo Touch|\\\\bK080\\\\b|\\\\bVox\\\\b Build|\\\\bArc\\\\b Build\",\n        \"DanewTablet\": \"DSlide.*\\\\b(700|701R|702|703R|704|802|970|971|972|973|974|1010|1012)\\\\b\",\n        \"TexetTablet\": \"NaviPad|TB-772A|TM-7045|TM-7055|TM-9750|TM-7016|TM-7024|TM-7026|TM-7041|TM-7043|TM-7047|TM-8041|TM-9741|TM-9747|TM-9748|TM-9751|TM-7022|TM-7021|TM-7020|TM-7011|TM-7010|TM-7023|TM-7025|TM-7037W|TM-7038W|TM-7027W|TM-9720|TM-9725|TM-9737W|TM-1020|TM-9738W|TM-9740|TM-9743W|TB-807A|TB-771A|TB-727A|TB-725A|TB-719A|TB-823A|TB-805A|TB-723A|TB-715A|TB-707A|TB-705A|TB-709A|TB-711A|TB-890HD|TB-880HD|TB-790HD|TB-780HD|TB-770HD|TB-721HD|TB-710HD|TB-434HD|TB-860HD|TB-840HD|TB-760HD|TB-750HD|TB-740HD|TB-730HD|TB-722HD|TB-720HD|TB-700HD|TB-500HD|TB-470HD|TB-431HD|TB-430HD|TB-506|TB-504|TB-446|TB-436|TB-416|TB-146SE|TB-126SE\",\n        \"PlaystationTablet\": \"Playstation.*(Portable|Vita)\",\n        \"TrekstorTablet\": \"ST10416-1|VT10416-1|ST70408-1|ST702xx-1|ST702xx-2|ST80208|ST97216|ST70104-2|VT10416-2|ST10216-2A|SurfTab\",\n        \"PyleAudioTablet\": \"\\\\b(PTBL10CEU|PTBL10C|PTBL72BC|PTBL72BCEU|PTBL7CEU|PTBL7C|PTBL92BC|PTBL92BCEU|PTBL9CEU|PTBL9CUK|PTBL9C)\\\\b\",\n        \"AdvanTablet\": \"Android.* \\\\b(E3A|T3X|T5C|T5B|T3E|T3C|T3B|T1J|T1F|T2A|T1H|T1i|E1C|T1-E|T5-A|T4|E1-B|T2Ci|T1-B|T1-D|O1-A|E1-A|T1-A|T3A|T4i)\\\\b \",\n        \"DanyTechTablet\": \"Genius Tab G3|Genius Tab S2|Genius Tab Q3|Genius Tab G4|Genius Tab Q4|Genius Tab G-II|Genius TAB GII|Genius TAB GIII|Genius Tab S1\",\n        \"GalapadTablet\": \"Android [0-9.]+; [a-z-]+; \\\\bG1\\\\b\",\n        \"MicromaxTablet\": \"Funbook|Micromax.*\\\\b(P250|P560|P360|P362|P600|P300|P350|P500|P275)\\\\b\",\n        \"KarbonnTablet\": \"Android.*\\\\b(A39|A37|A34|ST8|ST10|ST7|Smart Tab3|Smart Tab2)\\\\b\",\n        \"AllFineTablet\": \"Fine7 Genius|Fine7 Shine|Fine7 Air|Fine8 Style|Fine9 More|Fine10 Joy|Fine11 Wide\",\n        \"PROSCANTablet\": \"\\\\b(PEM63|PLT1023G|PLT1041|PLT1044|PLT1044G|PLT1091|PLT4311|PLT4311PL|PLT4315|PLT7030|PLT7033|PLT7033D|PLT7035|PLT7035D|PLT7044K|PLT7045K|PLT7045KB|PLT7071KG|PLT7072|PLT7223G|PLT7225G|PLT7777G|PLT7810K|PLT7849G|PLT7851G|PLT7852G|PLT8015|PLT8031|PLT8034|PLT8036|PLT8080K|PLT8082|PLT8088|PLT8223G|PLT8234G|PLT8235G|PLT8816K|PLT9011|PLT9045K|PLT9233G|PLT9735|PLT9760G|PLT9770G)\\\\b\",\n        \"YONESTablet\": \"BQ1078|BC1003|BC1077|RK9702|BC9730|BC9001|IT9001|BC7008|BC7010|BC708|BC728|BC7012|BC7030|BC7027|BC7026\",\n        \"ChangJiaTablet\": \"TPC7102|TPC7103|TPC7105|TPC7106|TPC7107|TPC7201|TPC7203|TPC7205|TPC7210|TPC7708|TPC7709|TPC7712|TPC7110|TPC8101|TPC8103|TPC8105|TPC8106|TPC8203|TPC8205|TPC8503|TPC9106|TPC9701|TPC97101|TPC97103|TPC97105|TPC97106|TPC97111|TPC97113|TPC97203|TPC97603|TPC97809|TPC97205|TPC10101|TPC10103|TPC10106|TPC10111|TPC10203|TPC10205|TPC10503\",\n        \"GUTablet\": \"TX-A1301|TX-M9002|Q702|kf026\",\n        \"PointOfViewTablet\": \"TAB-P506|TAB-navi-7-3G-M|TAB-P517|TAB-P-527|TAB-P701|TAB-P703|TAB-P721|TAB-P731N|TAB-P741|TAB-P825|TAB-P905|TAB-P925|TAB-PR945|TAB-PL1015|TAB-P1025|TAB-PI1045|TAB-P1325|TAB-PROTAB[0-9]+|TAB-PROTAB25|TAB-PROTAB26|TAB-PROTAB27|TAB-PROTAB26XL|TAB-PROTAB2-IPS9|TAB-PROTAB30-IPS9|TAB-PROTAB25XXL|TAB-PROTAB26-IPS10|TAB-PROTAB30-IPS10\",\n        \"OvermaxTablet\": \"OV-(SteelCore|NewBase|Basecore|Baseone|Exellen|Quattor|EduTab|Solution|ACTION|BasicTab|TeddyTab|MagicTab|Stream|TB-08|TB-09)|Qualcore 1027\",\n        \"HCLTablet\": \"HCL.*Tablet|Connect-3G-2.0|Connect-2G-2.0|ME Tablet U1|ME Tablet U2|ME Tablet G1|ME Tablet X1|ME Tablet Y2|ME Tablet Sync\",\n        \"DPSTablet\": \"DPS Dream 9|DPS Dual 7\",\n        \"VistureTablet\": \"V97 HD|i75 3G|Visture V4( HD)?|Visture V5( HD)?|Visture V10\",\n        \"CrestaTablet\": \"CTP(-)?810|CTP(-)?818|CTP(-)?828|CTP(-)?838|CTP(-)?888|CTP(-)?978|CTP(-)?980|CTP(-)?987|CTP(-)?988|CTP(-)?989\",\n        \"MediatekTablet\": \"\\\\bMT8125|MT8389|MT8135|MT8377\\\\b\",\n        \"ConcordeTablet\": \"Concorde([ ]+)?Tab|ConCorde ReadMan\",\n        \"GoCleverTablet\": \"GOCLEVER TAB|A7GOCLEVER|M1042|M7841|M742|R1042BK|R1041|TAB A975|TAB A7842|TAB A741|TAB A741L|TAB M723G|TAB M721|TAB A1021|TAB I921|TAB R721|TAB I720|TAB T76|TAB R70|TAB R76.2|TAB R106|TAB R83.2|TAB M813G|TAB I721|GCTA722|TAB I70|TAB I71|TAB S73|TAB R73|TAB R74|TAB R93|TAB R75|TAB R76.1|TAB A73|TAB A93|TAB A93.2|TAB T72|TAB R83|TAB R974|TAB R973|TAB A101|TAB A103|TAB A104|TAB A104.2|R105BK|M713G|A972BK|TAB A971|TAB R974.2|TAB R104|TAB R83.3|TAB A1042\",\n        \"ModecomTablet\": \"FreeTAB 9000|FreeTAB 7.4|FreeTAB 7004|FreeTAB 7800|FreeTAB 2096|FreeTAB 7.5|FreeTAB 1014|FreeTAB 1001 |FreeTAB 8001|FreeTAB 9706|FreeTAB 9702|FreeTAB 7003|FreeTAB 7002|FreeTAB 1002|FreeTAB 7801|FreeTAB 1331|FreeTAB 1004|FreeTAB 8002|FreeTAB 8014|FreeTAB 9704|FreeTAB 1003\",\n        \"VoninoTablet\": \"\\\\b(Argus[ _]?S|Diamond[ _]?79HD|Emerald[ _]?78E|Luna[ _]?70C|Onyx[ _]?S|Onyx[ _]?Z|Orin[ _]?HD|Orin[ _]?S|Otis[ _]?S|SpeedStar[ _]?S|Magnet[ _]?M9|Primus[ _]?94[ _]?3G|Primus[ _]?94HD|Primus[ _]?QS|Android.*\\\\bQ8\\\\b|Sirius[ _]?EVO[ _]?QS|Sirius[ _]?QS|Spirit[ _]?S)\\\\b\",\n        \"ECSTablet\": \"V07OT2|TM105A|S10OT1|TR10CS1\",\n        \"StorexTablet\": \"eZee[_']?(Tab|Go)[0-9]+|TabLC7|Looney Tunes Tab\",\n        \"VodafoneTablet\": \"SmartTab([ ]+)?[0-9]+|SmartTabII10|SmartTabII7|VF-1497|VFD 1400\",\n        \"EssentielBTablet\": \"Smart[ ']?TAB[ ]+?[0-9]+|Family[ ']?TAB2\",\n        \"RossMoorTablet\": \"RM-790|RM-997|RMD-878G|RMD-974R|RMT-705A|RMT-701|RME-601|RMT-501|RMT-711\",\n        \"iMobileTablet\": \"i-mobile i-note\",\n        \"TolinoTablet\": \"tolino tab [0-9.]+|tolino shine\",\n        \"AudioSonicTablet\": \"\\\\bC-22Q|T7-QC|T-17B|T-17P\\\\b\",\n        \"AMPETablet\": \"Android.* A78 \",\n        \"SkkTablet\": \"Android.* (SKYPAD|PHOENIX|CYCLOPS)\",\n        \"TecnoTablet\": \"TECNO P9|TECNO DP8D\",\n        \"JXDTablet\": \"Android.* \\\\b(F3000|A3300|JXD5000|JXD3000|JXD2000|JXD300B|JXD300|S5800|S7800|S602b|S5110b|S7300|S5300|S602|S603|S5100|S5110|S601|S7100a|P3000F|P3000s|P101|P200s|P1000m|P200m|P9100|P1000s|S6600b|S908|P1000|P300|S18|S6600|S9100)\\\\b\",\n        \"iJoyTablet\": \"Tablet (Spirit 7|Essentia|Galatea|Fusion|Onix 7|Landa|Titan|Scooby|Deox|Stella|Themis|Argon|Unique 7|Sygnus|Hexen|Finity 7|Cream|Cream X2|Jade|Neon 7|Neron 7|Kandy|Scape|Saphyr 7|Rebel|Biox|Rebel|Rebel 8GB|Myst|Draco 7|Myst|Tab7-004|Myst|Tadeo Jones|Tablet Boing|Arrow|Draco Dual Cam|Aurix|Mint|Amity|Revolution|Finity 9|Neon 9|T9w|Amity 4GB Dual Cam|Stone 4GB|Stone 8GB|Andromeda|Silken|X2|Andromeda II|Halley|Flame|Saphyr 9,7|Touch 8|Planet|Triton|Unique 10|Hexen 10|Memphis 4GB|Memphis 8GB|Onix 10)\",\n        \"FX2Tablet\": \"FX2 PAD7|FX2 PAD10\",\n        \"XoroTablet\": \"KidsPAD 701|PAD[ ]?712|PAD[ ]?714|PAD[ ]?716|PAD[ ]?717|PAD[ ]?718|PAD[ ]?720|PAD[ ]?721|PAD[ ]?722|PAD[ ]?790|PAD[ ]?792|PAD[ ]?900|PAD[ ]?9715D|PAD[ ]?9716DR|PAD[ ]?9718DR|PAD[ ]?9719QR|PAD[ ]?9720QR|TelePAD1030|Telepad1032|TelePAD730|TelePAD731|TelePAD732|TelePAD735Q|TelePAD830|TelePAD9730|TelePAD795|MegaPAD 1331|MegaPAD 1851|MegaPAD 2151\",\n        \"ViewsonicTablet\": \"ViewPad 10pi|ViewPad 10e|ViewPad 10s|ViewPad E72|ViewPad7|ViewPad E100|ViewPad 7e|ViewSonic VB733|VB100a\",\n        \"VerizonTablet\": \"QTAQZ3|QTAIR7|QTAQTZ3|QTASUN1|QTASUN2|QTAXIA1\",\n        \"OdysTablet\": \"LOOX|XENO10|ODYS[ -](Space|EVO|Xpress|NOON)|\\\\bXELIO\\\\b|Xelio10Pro|XELIO7PHONETAB|XELIO10EXTREME|XELIOPT2|NEO_QUAD10\",\n        \"CaptivaTablet\": \"CAPTIVA PAD\",\n        \"IconbitTablet\": \"NetTAB|NT-3702|NT-3702S|NT-3702S|NT-3603P|NT-3603P|NT-0704S|NT-0704S|NT-3805C|NT-3805C|NT-0806C|NT-0806C|NT-0909T|NT-0909T|NT-0907S|NT-0907S|NT-0902S|NT-0902S\",\n        \"TeclastTablet\": \"T98 4G|\\\\bP80\\\\b|\\\\bX90HD\\\\b|X98 Air|X98 Air 3G|\\\\bX89\\\\b|P80 3G|\\\\bX80h\\\\b|P98 Air|\\\\bX89HD\\\\b|P98 3G|\\\\bP90HD\\\\b|P89 3G|X98 3G|\\\\bP70h\\\\b|P79HD 3G|G18d 3G|\\\\bP79HD\\\\b|\\\\bP89s\\\\b|\\\\bA88\\\\b|\\\\bP10HD\\\\b|\\\\bP19HD\\\\b|G18 3G|\\\\bP78HD\\\\b|\\\\bA78\\\\b|\\\\bP75\\\\b|G17s 3G|G17h 3G|\\\\bP85t\\\\b|\\\\bP90\\\\b|\\\\bP11\\\\b|\\\\bP98t\\\\b|\\\\bP98HD\\\\b|\\\\bG18d\\\\b|\\\\bP85s\\\\b|\\\\bP11HD\\\\b|\\\\bP88s\\\\b|\\\\bA80HD\\\\b|\\\\bA80se\\\\b|\\\\bA10h\\\\b|\\\\bP89\\\\b|\\\\bP78s\\\\b|\\\\bG18\\\\b|\\\\bP85\\\\b|\\\\bA70h\\\\b|\\\\bA70\\\\b|\\\\bG17\\\\b|\\\\bP18\\\\b|\\\\bA80s\\\\b|\\\\bA11s\\\\b|\\\\bP88HD\\\\b|\\\\bA80h\\\\b|\\\\bP76s\\\\b|\\\\bP76h\\\\b|\\\\bP98\\\\b|\\\\bA10HD\\\\b|\\\\bP78\\\\b|\\\\bP88\\\\b|\\\\bA11\\\\b|\\\\bA10t\\\\b|\\\\bP76a\\\\b|\\\\bP76t\\\\b|\\\\bP76e\\\\b|\\\\bP85HD\\\\b|\\\\bP85a\\\\b|\\\\bP86\\\\b|\\\\bP75HD\\\\b|\\\\bP76v\\\\b|\\\\bA12\\\\b|\\\\bP75a\\\\b|\\\\bA15\\\\b|\\\\bP76Ti\\\\b|\\\\bP81HD\\\\b|\\\\bA10\\\\b|\\\\bT760VE\\\\b|\\\\bT720HD\\\\b|\\\\bP76\\\\b|\\\\bP73\\\\b|\\\\bP71\\\\b|\\\\bP72\\\\b|\\\\bT720SE\\\\b|\\\\bC520Ti\\\\b|\\\\bT760\\\\b|\\\\bT720VE\\\\b|T720-3GE|T720-WiFi\",\n        \"OndaTablet\": \"\\\\b(V975i|Vi30|VX530|V701|Vi60|V701s|Vi50|V801s|V719|Vx610w|VX610W|V819i|Vi10|VX580W|Vi10|V711s|V813|V811|V820w|V820|Vi20|V711|VI30W|V712|V891w|V972|V819w|V820w|Vi60|V820w|V711|V813s|V801|V819|V975s|V801|V819|V819|V818|V811|V712|V975m|V101w|V961w|V812|V818|V971|V971s|V919|V989|V116w|V102w|V973|Vi40)\\\\b[\\\\s]+|V10 \\\\b4G\\\\b\",\n        \"JaytechTablet\": \"TPC-PA762\",\n        \"BlaupunktTablet\": \"Endeavour 800NG|Endeavour 1010\",\n        \"DigmaTablet\": \"\\\\b(iDx10|iDx9|iDx8|iDx7|iDxD7|iDxD8|iDsQ8|iDsQ7|iDsQ8|iDsD10|iDnD7|3TS804H|iDsQ11|iDj7|iDs10)\\\\b\",\n        \"EvolioTablet\": \"ARIA_Mini_wifi|Aria[ _]Mini|Evolio X10|Evolio X7|Evolio X8|\\\\bEvotab\\\\b|\\\\bNeura\\\\b\",\n        \"LavaTablet\": \"QPAD E704|\\\\bIvoryS\\\\b|E-TAB IVORY|\\\\bE-TAB\\\\b\",\n        \"AocTablet\": \"MW0811|MW0812|MW0922|MTK8382|MW1031|MW0831|MW0821|MW0931|MW0712\",\n        \"MpmanTablet\": \"MP11 OCTA|MP10 OCTA|MPQC1114|MPQC1004|MPQC994|MPQC974|MPQC973|MPQC804|MPQC784|MPQC780|\\\\bMPG7\\\\b|MPDCG75|MPDCG71|MPDC1006|MP101DC|MPDC9000|MPDC905|MPDC706HD|MPDC706|MPDC705|MPDC110|MPDC100|MPDC99|MPDC97|MPDC88|MPDC8|MPDC77|MP709|MID701|MID711|MID170|MPDC703|MPQC1010\",\n        \"CelkonTablet\": \"CT695|CT888|CT[\\\\s]?910|CT7 Tab|CT9 Tab|CT3 Tab|CT2 Tab|CT1 Tab|C820|C720|\\\\bCT-1\\\\b\",\n        \"WolderTablet\": \"miTab \\\\b(DIAMOND|SPACE|BROOKLYN|NEO|FLY|MANHATTAN|FUNK|EVOLUTION|SKY|GOCAR|IRON|GENIUS|POP|MINT|EPSILON|BROADWAY|JUMP|HOP|LEGEND|NEW AGE|LINE|ADVANCE|FEEL|FOLLOW|LIKE|LINK|LIVE|THINK|FREEDOM|CHICAGO|CLEVELAND|BALTIMORE-GH|IOWA|BOSTON|SEATTLE|PHOENIX|DALLAS|IN 101|MasterChef)\\\\b\",\n        \"MediacomTablet\": \"M-MPI10C3G|M-SP10EG|M-SP10EGP|M-SP10HXAH|M-SP7HXAH|M-SP10HXBH|M-SP8HXAH|M-SP8MXA\",\n        \"MiTablet\": \"\\\\bMI PAD\\\\b|\\\\bHM NOTE 1W\\\\b\",\n        \"NibiruTablet\": \"Nibiru M1|Nibiru Jupiter One\",\n        \"NexoTablet\": \"NEXO NOVA|NEXO 10|NEXO AVIO|NEXO FREE|NEXO GO|NEXO EVO|NEXO 3G|NEXO SMART|NEXO KIDDO|NEXO MOBI\",\n        \"LeaderTablet\": \"TBLT10Q|TBLT10I|TBL-10WDKB|TBL-10WDKBO2013|TBL-W230V2|TBL-W450|TBL-W500|SV572|TBLT7I|TBA-AC7-8G|TBLT79|TBL-8W16|TBL-10W32|TBL-10WKB|TBL-W100\",\n        \"UbislateTablet\": \"UbiSlate[\\\\s]?7C\",\n        \"PocketBookTablet\": \"Pocketbook\",\n        \"KocasoTablet\": \"\\\\b(TB-1207)\\\\b\",\n        \"HisenseTablet\": \"\\\\b(F5281|E2371)\\\\b\",\n        \"Hudl\": \"Hudl HT7S3|Hudl 2\",\n        \"TelstraTablet\": \"T-Hub2\",\n        \"GenericTablet\": \"Android.*\\\\b97D\\\\b|Tablet(?!.*PC)|BNTV250A|MID-WCDMA|LogicPD Zoom2|\\\\bA7EB\\\\b|CatNova8|A1_07|CT704|CT1002|\\\\bM721\\\\b|rk30sdk|\\\\bEVOTAB\\\\b|M758A|ET904|ALUMIUM10|Smartfren Tab|Endeavour 1010|Tablet-PC-4|Tagi Tab|\\\\bM6pro\\\\b|CT1020W|arc 10HD|\\\\bTP750\\\\b|\\\\bQTAQZ3\\\\b|WVT101|TM1088|KT107\"\n    },\n    \"oss\": {\n        \"AndroidOS\": \"Android\",\n        \"BlackBerryOS\": \"blackberry|\\\\bBB10\\\\b|rim tablet os\",\n        \"PalmOS\": \"PalmOS|avantgo|blazer|elaine|hiptop|palm|plucker|xiino\",\n        \"SymbianOS\": \"Symbian|SymbOS|Series60|Series40|SYB-[0-9]+|\\\\bS60\\\\b\",\n        \"WindowsMobileOS\": \"Windows CE.*(PPC|Smartphone|Mobile|[0-9]{3}x[0-9]{3})|Windows Mobile|Windows Phone [0-9.]+|WCE;\",\n        \"WindowsPhoneOS\": \"Windows Phone 10.0|Windows Phone 8.1|Windows Phone 8.0|Windows Phone OS|XBLWP7|ZuneWP7|Windows NT 6.[23]; ARM;\",\n        \"iOS\": \"\\\\biPhone.*Mobile|\\\\biPod|\\\\biPad|AppleCoreMedia\",\n        \"iPadOS\": \"CPU OS 13\",\n        \"SailfishOS\": \"Sailfish\",\n        \"MeeGoOS\": \"MeeGo\",\n        \"MaemoOS\": \"Maemo\",\n        \"JavaOS\": \"J2ME\\/|\\\\bMIDP\\\\b|\\\\bCLDC\\\\b\",\n        \"webOS\": \"webOS|hpwOS\",\n        \"badaOS\": \"\\\\bBada\\\\b\",\n        \"BREWOS\": \"BREW\"\n    },\n    \"uas\": {\n        \"Chrome\": \"\\\\bCrMo\\\\b|CriOS|Android.*Chrome\\/[.0-9]* (Mobile)?\",\n        \"Dolfin\": \"\\\\bDolfin\\\\b\",\n        \"Opera\": \"Opera.*Mini|Opera.*Mobi|Android.*Opera|Mobile.*OPR\\/[0-9.]+$|Coast\\/[0-9.]+\",\n        \"Skyfire\": \"Skyfire\",\n        \"Edge\": \"\\\\bEdgiOS\\\\b|Mobile Safari\\/[.0-9]* Edge\",\n        \"IE\": \"IEMobile|MSIEMobile\",\n        \"Firefox\": \"fennec|firefox.*maemo|(Mobile|Tablet).*Firefox|Firefox.*Mobile|FxiOS\",\n        \"Bolt\": \"bolt\",\n        \"TeaShark\": \"teashark\",\n        \"Blazer\": \"Blazer\",\n        \"Safari\": \"Version((?!\\\\bEdgiOS\\\\b).)*Mobile.*Safari|Safari.*Mobile|MobileSafari\",\n        \"WeChat\": \"\\\\bMicroMessenger\\\\b\",\n        \"UCBrowser\": \"UC.*Browser|UCWEB\",\n        \"baiduboxapp\": \"baiduboxapp\",\n        \"baidubrowser\": \"baidubrowser\",\n        \"DiigoBrowser\": \"DiigoBrowser\",\n        \"Mercury\": \"\\\\bMercury\\\\b\",\n        \"ObigoBrowser\": \"Obigo\",\n        \"NetFront\": \"NF-Browser\",\n        \"GenericBrowser\": \"NokiaBrowser|OviBrowser|OneBrowser|TwonkyBeamBrowser|SEMC.*Browser|FlyFlow|Minimo|NetFront|Novarra-Vision|MQQBrowser|MicroMessenger\",\n        \"PaleMoon\": \"Android.*PaleMoon|Mobile.*PaleMoon\"\n    },\n    \"props\": {\n        \"Mobile\": \"Mobile\\/[VER]\",\n        \"Build\": \"Build\\/[VER]\",\n        \"Version\": \"Version\\/[VER]\",\n        \"VendorID\": \"VendorID\\/[VER]\",\n        \"iPad\": \"iPad.*CPU[a-z ]+[VER]\",\n        \"iPhone\": \"iPhone.*CPU[a-z ]+[VER]\",\n        \"iPod\": \"iPod.*CPU[a-z ]+[VER]\",\n        \"Kindle\": \"Kindle\\/[VER]\",\n        \"Chrome\": [\n            \"Chrome\\/[VER]\",\n            \"CriOS\\/[VER]\",\n            \"CrMo\\/[VER]\"\n        ],\n        \"Coast\": [\n            \"Coast\\/[VER]\"\n        ],\n        \"Dolfin\": \"Dolfin\\/[VER]\",\n        \"Firefox\": [\n            \"Firefox\\/[VER]\",\n            \"FxiOS\\/[VER]\"\n        ],\n        \"Fennec\": \"Fennec\\/[VER]\",\n        \"Edge\": \"Edge\\/[VER]\",\n        \"IE\": [\n            \"IEMobile\\/[VER];\",\n            \"IEMobile [VER]\",\n            \"MSIE [VER];\",\n            \"Trident\\/[0-9.]+;.*rv:[VER]\"\n        ],\n        \"NetFront\": \"NetFront\\/[VER]\",\n        \"NokiaBrowser\": \"NokiaBrowser\\/[VER]\",\n        \"Opera\": [\n            \" OPR\\/[VER]\",\n            \"Opera Mini\\/[VER]\",\n            \"Version\\/[VER]\"\n        ],\n        \"Opera Mini\": \"Opera Mini\\/[VER]\",\n        \"Opera Mobi\": \"Version\\/[VER]\",\n        \"UCBrowser\": [\n            \"UCWEB[VER]\",\n            \"UC.*Browser\\/[VER]\"\n        ],\n        \"MQQBrowser\": \"MQQBrowser\\/[VER]\",\n        \"MicroMessenger\": \"MicroMessenger\\/[VER]\",\n        \"baiduboxapp\": \"baiduboxapp\\/[VER]\",\n        \"baidubrowser\": \"baidubrowser\\/[VER]\",\n        \"SamsungBrowser\": \"SamsungBrowser\\/[VER]\",\n        \"Iron\": \"Iron\\/[VER]\",\n        \"Safari\": [\n            \"Version\\/[VER]\",\n            \"Safari\\/[VER]\"\n        ],\n        \"Skyfire\": \"Skyfire\\/[VER]\",\n        \"Tizen\": \"Tizen\\/[VER]\",\n        \"Webkit\": \"webkit[ \\/][VER]\",\n        \"PaleMoon\": \"PaleMoon\\/[VER]\",\n        \"SailfishBrowser\": \"SailfishBrowser\\/[VER]\",\n        \"Gecko\": \"Gecko\\/[VER]\",\n        \"Trident\": \"Trident\\/[VER]\",\n        \"Presto\": \"Presto\\/[VER]\",\n        \"Goanna\": \"Goanna\\/[VER]\",\n        \"iOS\": \" \\\\bi?OS\\\\b [VER][ ;]{1}\",\n        \"Android\": \"Android [VER]\",\n        \"Sailfish\": \"Sailfish [VER]\",\n        \"BlackBerry\": [\n            \"BlackBerry[\\\\w]+\\/[VER]\",\n            \"BlackBerry.*Version\\/[VER]\",\n            \"Version\\/[VER]\"\n        ],\n        \"BREW\": \"BREW [VER]\",\n        \"Java\": \"Java\\/[VER]\",\n        \"Windows Phone OS\": [\n            \"Windows Phone OS [VER]\",\n            \"Windows Phone [VER]\"\n        ],\n        \"Windows Phone\": \"Windows Phone [VER]\",\n        \"Windows CE\": \"Windows CE\\/[VER]\",\n        \"Windows NT\": \"Windows NT [VER]\",\n        \"Symbian\": [\n            \"SymbianOS\\/[VER]\",\n            \"Symbian\\/[VER]\"\n        ],\n        \"webOS\": [\n            \"webOS\\/[VER]\",\n            \"hpwOS\\/[VER];\"\n        ]\n    },\n    \"utils\": {\n        \"Bot\": \"Googlebot|facebookexternalhit|Google-AMPHTML|s~amp-validator|AdsBot-Google|Google Keyword Suggestion|Facebot|YandexBot|YandexMobileBot|bingbot|ia_archiver|AhrefsBot|Ezooms|GSLFbot|WBSearchBot|Twitterbot|TweetmemeBot|Twikle|PaperLiBot|Wotbox|UnwindFetchor|Exabot|MJ12bot|YandexImages|TurnitinBot|Pingdom|contentkingapp|AspiegelBot\",\n        \"MobileBot\": \"Googlebot-Mobile|AdsBot-Google-Mobile|YahooSeeker\\/M1A1-R2D2\",\n        \"DesktopMode\": \"WPDesktop\",\n        \"TV\": \"SonyDTV|HbbTV\",\n        \"WebKit\": \"(webkit)[ \\/]([\\\\w.]+)\",\n        \"Console\": \"\\\\b(Nintendo|Nintendo WiiU|Nintendo 3DS|Nintendo Switch|PLAYSTATION|Xbox)\\\\b\",\n        \"Watch\": \"SM-V700\"\n    }\n};\n\n    // following patterns come from http://detectmobilebrowsers.com/\n    impl.detectMobileBrowsers = {\n        fullPattern: /(android|bb\\d+|meego).+mobile|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i,\n        shortPattern: /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\\-(n|u)|c55\\/|capi|ccwa|cdm\\-|cell|chtm|cldc|cmd\\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\\-s|devi|dica|dmob|do(c|p)o|ds(12|\\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\\-|_)|g1 u|g560|gene|gf\\-5|g\\-mo|go(\\.w|od)|gr(ad|un)|haie|hcit|hd\\-(m|p|t)|hei\\-|hi(pt|ta)|hp( i|ip)|hs\\-c|ht(c(\\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\\-(20|go|ma)|i230|iac( |\\-|\\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\\/)|klon|kpt |kwc\\-|kyo(c|k)|le(no|xi)|lg( g|\\/(k|l|u)|50|54|\\-[a-w])|libw|lynx|m1\\-w|m3ga|m50\\/|ma(te|ui|xo)|mc(01|21|ca)|m\\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\\-2|po(ck|rt|se)|prox|psio|pt\\-g|qa\\-a|qc(07|12|21|32|60|\\-[2-7]|i\\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\\-|oo|p\\-)|sdk\\/|se(c(\\-|0|1)|47|mc|nd|ri)|sgh\\-|shar|sie(\\-|m)|sk\\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\\-|v\\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\\-|tdg\\-|tel(i|m)|tim\\-|t\\-mo|to(pl|sh)|ts(70|m\\-|m3|m5)|tx\\-9|up(\\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\\-|your|zeto|zte\\-/i,\n        tabletPattern: /android|ipad|playbook|silk/i\n    };\n\n    var hasOwnProp = Object.prototype.hasOwnProperty,\n        isArray;\n\n    impl.FALLBACK_PHONE = 'UnknownPhone';\n    impl.FALLBACK_TABLET = 'UnknownTablet';\n    impl.FALLBACK_MOBILE = 'UnknownMobile';\n\n    isArray = ('isArray' in Array) ?\n        Array.isArray : function (value) { return Object.prototype.toString.call(value) === '[object Array]'; };\n\n    function equalIC(a, b) {\n        return a != null && b != null && a.toLowerCase() === b.toLowerCase();\n    }\n\n    function containsIC(array, value) {\n        var valueLC, i, len = array.length;\n        if (!len || !value) {\n            return false;\n        }\n        valueLC = value.toLowerCase();\n        for (i = 0; i < len; ++i) {\n            if (valueLC === array[i].toLowerCase()) {\n                return true;\n            }\n        }\n        return false;\n    }\n\n    function convertPropsToRegExp(object) {\n        for (var key in object) {\n            if (hasOwnProp.call(object, key)) {\n                object[key] = new RegExp(object[key], 'i');\n            }\n        }\n    }\n\n    function prepareUserAgent(userAgent) {\n        return (userAgent || '').substr(0, 500); // mitigate vulnerable to ReDoS\n    }\n\n    (function init() {\n        var key, values, value, i, len, verPos, mobileDetectRules = impl.mobileDetectRules;\n        for (key in mobileDetectRules.props) {\n            if (hasOwnProp.call(mobileDetectRules.props, key)) {\n                values = mobileDetectRules.props[key];\n                if (!isArray(values)) {\n                    values = [values];\n                }\n                len = values.length;\n                for (i = 0; i < len; ++i) {\n                    value = values[i];\n                    verPos = value.indexOf('[VER]');\n                    if (verPos >= 0) {\n                        value = value.substring(0, verPos) + '([\\\\w._\\\\+]+)' + value.substring(verPos + 5);\n                    }\n                    values[i] = new RegExp(value, 'i');\n                }\n                mobileDetectRules.props[key] = values;\n            }\n        }\n        convertPropsToRegExp(mobileDetectRules.oss);\n        convertPropsToRegExp(mobileDetectRules.phones);\n        convertPropsToRegExp(mobileDetectRules.tablets);\n        convertPropsToRegExp(mobileDetectRules.uas);\n        convertPropsToRegExp(mobileDetectRules.utils);\n\n        // copy some patterns to oss0 which are tested first (see issue#15)\n        mobileDetectRules.oss0 = {\n            WindowsPhoneOS: mobileDetectRules.oss.WindowsPhoneOS,\n            WindowsMobileOS: mobileDetectRules.oss.WindowsMobileOS\n        };\n    }());\n\n    /**\n     * Test userAgent string against a set of rules and find the first matched key.\n     * @param {Object} rules (key is String, value is RegExp)\n     * @param {String} userAgent the navigator.userAgent (or HTTP-Header 'User-Agent').\n     * @returns {String|null} the matched key if found, otherwise <tt>null</tt>\n     * @private\n     */\n    impl.findMatch = function(rules, userAgent) {\n        for (var key in rules) {\n            if (hasOwnProp.call(rules, key)) {\n                if (rules[key].test(userAgent)) {\n                    return key;\n                }\n            }\n        }\n        return null;\n    };\n\n    /**\n     * Test userAgent string against a set of rules and return an array of matched keys.\n     * @param {Object} rules (key is String, value is RegExp)\n     * @param {String} userAgent the navigator.userAgent (or HTTP-Header 'User-Agent').\n     * @returns {Array} an array of matched keys, may be empty when there is no match, but not <tt>null</tt>\n     * @private\n     */\n    impl.findMatches = function(rules, userAgent) {\n        var result = [];\n        for (var key in rules) {\n            if (hasOwnProp.call(rules, key)) {\n                if (rules[key].test(userAgent)) {\n                    result.push(key);\n                }\n            }\n        }\n        return result;\n    };\n\n    /**\n     * Check the version of the given property in the User-Agent.\n     *\n     * @param {String} propertyName\n     * @param {String} userAgent\n     * @return {String} version or <tt>null</tt> if version not found\n     * @private\n     */\n    impl.getVersionStr = function (propertyName, userAgent) {\n        var props = impl.mobileDetectRules.props, patterns, i, len, match;\n        if (hasOwnProp.call(props, propertyName)) {\n            patterns = props[propertyName];\n            len = patterns.length;\n            for (i = 0; i < len; ++i) {\n                match = patterns[i].exec(userAgent);\n                if (match !== null) {\n                    return match[1];\n                }\n            }\n        }\n        return null;\n    };\n\n    /**\n     * Check the version of the given property in the User-Agent.\n     * Will return a float number. (eg. 2_0 will return 2.0, 4.3.1 will return 4.31)\n     *\n     * @param {String} propertyName\n     * @param {String} userAgent\n     * @return {Number} version or <tt>NaN</tt> if version not found\n     * @private\n     */\n    impl.getVersion = function (propertyName, userAgent) {\n        var version = impl.getVersionStr(propertyName, userAgent);\n        return version ? impl.prepareVersionNo(version) : NaN;\n    };\n\n    /**\n     * Prepare the version number.\n     *\n     * @param {String} version\n     * @return {Number} the version number as a floating number\n     * @private\n     */\n    impl.prepareVersionNo = function (version) {\n        var numbers;\n\n        numbers = version.split(/[a-z._ \\/\\-]/i);\n        if (numbers.length === 1) {\n            version = numbers[0];\n        }\n        if (numbers.length > 1) {\n            version = numbers[0] + '.';\n            numbers.shift();\n            version += numbers.join('');\n        }\n        return Number(version);\n    };\n\n    impl.isMobileFallback = function (userAgent) {\n        return impl.detectMobileBrowsers.fullPattern.test(userAgent) ||\n            impl.detectMobileBrowsers.shortPattern.test(userAgent.substr(0,4));\n    };\n\n    impl.isTabletFallback = function (userAgent) {\n        return impl.detectMobileBrowsers.tabletPattern.test(userAgent);\n    };\n\n    impl.prepareDetectionCache = function (cache, userAgent, maxPhoneWidth) {\n        if (cache.mobile !== undefined) {\n            return;\n        }\n        var phone, tablet, phoneSized;\n\n        // first check for stronger tablet rules, then phone (see issue#5)\n        tablet = impl.findMatch(impl.mobileDetectRules.tablets, userAgent);\n        if (tablet) {\n            cache.mobile = cache.tablet = tablet;\n            cache.phone = null;\n            return; // unambiguously identified as tablet\n        }\n\n        phone = impl.findMatch(impl.mobileDetectRules.phones, userAgent);\n        if (phone) {\n            cache.mobile = cache.phone = phone;\n            cache.tablet = null;\n            return; // unambiguously identified as phone\n        }\n\n        // our rules haven't found a match -> try more general fallback rules\n        if (impl.isMobileFallback(userAgent)) {\n            phoneSized = MobileDetect.isPhoneSized(maxPhoneWidth);\n            if (phoneSized === undefined) {\n                cache.mobile = impl.FALLBACK_MOBILE;\n                cache.tablet = cache.phone = null;\n            } else if (phoneSized) {\n                cache.mobile = cache.phone = impl.FALLBACK_PHONE;\n                cache.tablet = null;\n            } else {\n                cache.mobile = cache.tablet = impl.FALLBACK_TABLET;\n                cache.phone = null;\n            }\n        } else if (impl.isTabletFallback(userAgent)) {\n            cache.mobile = cache.tablet = impl.FALLBACK_TABLET;\n            cache.phone = null;\n        } else {\n            // not mobile at all!\n            cache.mobile = cache.tablet = cache.phone = null;\n        }\n    };\n\n    // t is a reference to a MobileDetect instance\n    impl.mobileGrade = function (t) {\n        // impl note:\n        // To keep in sync w/ Mobile_Detect.php easily, the following code is tightly aligned to the PHP version.\n        // When changes are made in Mobile_Detect.php, copy this method and replace:\n        //     $this-> / t.\n        //     self::MOBILE_GRADE_(.) / '$1'\n        //     , self::VERSION_TYPE_FLOAT / (nothing)\n        //     isIOS() / os('iOS')\n        //     [reg] / (nothing)   <-- jsdelivr complaining about unescaped unicode character U+00AE\n        var $isMobile = t.mobile() !== null;\n\n        if (\n            // Apple iOS 3.2-5.1 - Tested on the original iPad (4.3 / 5.0), iPad 2 (4.3), iPad 3 (5.1), original iPhone (3.1), iPhone 3 (3.2), 3GS (4.3), 4 (4.3 / 5.0), and 4S (5.1)\n            t.os('iOS') && t.version('iPad')>=4.3 ||\n            t.os('iOS') && t.version('iPhone')>=3.1 ||\n            t.os('iOS') && t.version('iPod')>=3.1 ||\n\n            // Android 2.1-2.3 - Tested on the HTC Incredible (2.2), original Droid (2.2), HTC Aria (2.1), Google Nexus S (2.3). Functional on 1.5 & 1.6 but performance may be sluggish, tested on Google G1 (1.5)\n            // Android 3.1 (Honeycomb)  - Tested on the Samsung Galaxy Tab 10.1 and Motorola XOOM\n            // Android 4.0 (ICS)  - Tested on a Galaxy Nexus. Note: transition performance can be poor on upgraded devices\n            // Android 4.1 (Jelly Bean)  - Tested on a Galaxy Nexus and Galaxy 7\n            ( t.version('Android')>2.1 && t.is('Webkit') ) ||\n\n            // Windows Phone 7-7.5 - Tested on the HTC Surround (7.0) HTC Trophy (7.5), LG-E900 (7.5), Nokia Lumia 800\n            t.version('Windows Phone OS')>=7.0 ||\n\n            // Blackberry 7 - Tested on BlackBerry Torch 9810\n            // Blackberry 6.0 - Tested on the Torch 9800 and Style 9670\n            t.is('BlackBerry') && t.version('BlackBerry')>=6.0 ||\n            // Blackberry Playbook (1.0-2.0) - Tested on PlayBook\n            t.match('Playbook.*Tablet') ||\n\n            // Palm WebOS (1.4-2.0) - Tested on the Palm Pixi (1.4), Pre (1.4), Pre 2 (2.0)\n            ( t.version('webOS')>=1.4 && t.match('Palm|Pre|Pixi') ) ||\n            // Palm WebOS 3.0  - Tested on HP TouchPad\n            t.match('hp.*TouchPad') ||\n\n            // Firefox Mobile (12 Beta) - Tested on Android 2.3 device\n            ( t.is('Firefox') && t.version('Firefox')>=12 ) ||\n\n            // Chrome for Android - Tested on Android 4.0, 4.1 device\n            ( t.is('Chrome') && t.is('AndroidOS') && t.version('Android')>=4.0 ) ||\n\n            // Skyfire 4.1 - Tested on Android 2.3 device\n            ( t.is('Skyfire') && t.version('Skyfire')>=4.1 && t.is('AndroidOS') && t.version('Android')>=2.3 ) ||\n\n            // Opera Mobile 11.5-12: Tested on Android 2.3\n            ( t.is('Opera') && t.version('Opera Mobi')>11 && t.is('AndroidOS') ) ||\n\n            // Meego 1.2 - Tested on Nokia 950 and N9\n            t.is('MeeGoOS') ||\n\n            // Tizen (pre-release) - Tested on early hardware\n            t.is('Tizen') ||\n\n            // Samsung Bada 2.0 - Tested on a Samsung Wave 3, Dolphin browser\n            // @todo: more tests here!\n            t.is('Dolfin') && t.version('Bada')>=2.0 ||\n\n            // UC Browser - Tested on Android 2.3 device\n            ( (t.is('UC Browser') || t.is('Dolfin')) && t.version('Android')>=2.3 ) ||\n\n            // Kindle 3 and Fire  - Tested on the built-in WebKit browser for each\n            ( t.match('Kindle Fire') ||\n                t.is('Kindle') && t.version('Kindle')>=3.0 ) ||\n\n            // Nook Color 1.4.1 - Tested on original Nook Color, not Nook Tablet\n            t.is('AndroidOS') && t.is('NookTablet') ||\n\n            // Chrome Desktop 11-21 - Tested on OS X 10.7 and Windows 7\n            t.version('Chrome')>=11 && !$isMobile ||\n\n            // Safari Desktop 4-5 - Tested on OS X 10.7 and Windows 7\n            t.version('Safari')>=5.0 && !$isMobile ||\n\n            // Firefox Desktop 4-13 - Tested on OS X 10.7 and Windows 7\n            t.version('Firefox')>=4.0 && !$isMobile ||\n\n            // Internet Explorer 7-9 - Tested on Windows XP, Vista and 7\n            t.version('MSIE')>=7.0 && !$isMobile ||\n\n            // Opera Desktop 10-12 - Tested on OS X 10.7 and Windows 7\n            // @reference: http://my.opera.com/community/openweb/idopera/\n            t.version('Opera')>=10 && !$isMobile\n\n            ){\n            return 'A';\n        }\n\n        if (\n            t.os('iOS') && t.version('iPad')<4.3 ||\n            t.os('iOS') && t.version('iPhone')<3.1 ||\n            t.os('iOS') && t.version('iPod')<3.1 ||\n\n            // Blackberry 5.0: Tested on the Storm 2 9550, Bold 9770\n            t.is('Blackberry') && t.version('BlackBerry')>=5 && t.version('BlackBerry')<6 ||\n\n            //Opera Mini (5.0-6.5) - Tested on iOS 3.2/4.3 and Android 2.3\n            ( t.version('Opera Mini')>=5.0 && t.version('Opera Mini')<=6.5 &&\n                (t.version('Android')>=2.3 || t.is('iOS')) ) ||\n\n            // Nokia Symbian^3 - Tested on Nokia N8 (Symbian^3), C7 (Symbian^3), also works on N97 (Symbian^1)\n            t.match('NokiaN8|NokiaC7|N97.*Series60|Symbian/3') ||\n\n            // @todo: report this (tested on Nokia N71)\n            t.version('Opera Mobi')>=11 && t.is('SymbianOS')\n            ){\n            return 'B';\n        }\n\n        if (\n        // Blackberry 4.x - Tested on the Curve 8330\n            t.version('BlackBerry')<5.0 ||\n            // Windows Mobile - Tested on the HTC Leo (WinMo 5.2)\n            t.match('MSIEMobile|Windows CE.*Mobile') || t.version('Windows Mobile')<=5.2\n\n            ){\n            return 'C';\n        }\n\n        //All older smartphone platforms and featurephones - Any device that doesn't support media queries\n        //will receive the basic, C grade experience.\n        return 'C';\n    };\n\n    impl.detectOS = function (ua) {\n        return impl.findMatch(impl.mobileDetectRules.oss0, ua) ||\n            impl.findMatch(impl.mobileDetectRules.oss, ua);\n    };\n\n    impl.getDeviceSmallerSide = function () {\n        return window.screen.width < window.screen.height ?\n            window.screen.width :\n            window.screen.height;\n    };\n\n    /**\n     * Constructor for MobileDetect object.\n     * <br>\n     * Such an object will keep a reference to the given user-agent string and cache most of the detect queries.<br>\n     * <div style=\"background-color: #d9edf7; border: 1px solid #bce8f1; color: #3a87ad; padding: 14px; border-radius: 2px; margin-top: 20px\">\n     *     <strong>Find information how to download and install:</strong>\n     *     <a href=\"https://github.com/hgoebl/mobile-detect.js/\">github.com/hgoebl/mobile-detect.js/</a>\n     * </div>\n     *\n     * @example <pre>\n     *     var md = new MobileDetect(window.navigator.userAgent);\n     *     if (md.mobile()) {\n     *         location.href = (md.mobileGrade() === 'A') ? '/mobile/' : '/lynx/';\n     *     }\n     * </pre>\n     *\n     * @param {string} userAgent typically taken from window.navigator.userAgent or http_header['User-Agent']\n     * @param {number} [maxPhoneWidth=600] <strong>only for browsers</strong> specify a value for the maximum\n     *        width of smallest device side (in logical \"CSS\" pixels) until a device detected as mobile will be handled\n     *        as phone.\n     *        This is only used in cases where the device cannot be classified as phone or tablet.<br>\n     *        See <a href=\"http://developer.android.com/guide/practices/screens_support.html\">Declaring Tablet Layouts\n     *        for Android</a>.<br>\n     *        If you provide a value < 0, then this \"fuzzy\" check is disabled.\n     * @constructor\n     * @global\n     */\n    function MobileDetect(userAgent, maxPhoneWidth) {\n        this.ua = prepareUserAgent(userAgent);\n        this._cache = {};\n        //600dp is typical 7\" tablet minimum width\n        this.maxPhoneWidth = maxPhoneWidth || 600;\n    }\n\n    MobileDetect.prototype = {\n        constructor: MobileDetect,\n\n        /**\n         * Returns the detected phone or tablet type or <tt>null</tt> if it is not a mobile device.\n         * <br>\n         * For a list of possible return values see {@link MobileDetect#phone} and {@link MobileDetect#tablet}.<br>\n         * <br>\n         * If the device is not detected by the regular expressions from Mobile-Detect, a test is made against\n         * the patterns of <a href=\"http://detectmobilebrowsers.com/\">detectmobilebrowsers.com</a>. If this test\n         * is positive, a value of <code>UnknownPhone</code>, <code>UnknownTablet</code> or\n         * <code>UnknownMobile</code> is returned.<br>\n         * When used in browser, the decision whether phone or tablet is made based on <code>screen.width/height</code>.<br>\n         * <br>\n         * When used server-side (node.js), there is no way to tell the difference between <code>UnknownTablet</code>\n         * and <code>UnknownMobile</code>, so you will get <code>UnknownMobile</code> here.<br>\n         * Be aware that since v1.0.0 in this special case you will get <code>UnknownMobile</code> only for:\n         * {@link MobileDetect#mobile}, not for {@link MobileDetect#phone} and {@link MobileDetect#tablet}.\n         * In versions before v1.0.0 all 3 methods returned <code>UnknownMobile</code> which was tedious to use.\n         * <br>\n         * In most cases you will use the return value just as a boolean.\n         *\n         * @returns {String} the key for the phone family or tablet family, e.g. \"Nexus\".\n         * @function MobileDetect#mobile\n         */\n        mobile: function () {\n            impl.prepareDetectionCache(this._cache, this.ua, this.maxPhoneWidth);\n            return this._cache.mobile;\n        },\n\n        /**\n         * Returns the detected phone type/family string or <tt>null</tt>.\n         * <br>\n         * The returned tablet (family or producer) is one of following keys:<br>\n         * <br><tt>iPhone, BlackBerry, Pixel, HTC, Nexus, Dell, Motorola, Samsung, LG, Sony, Asus,\n         * Xiaomi, NokiaLumia, Micromax, Palm, Vertu, Pantech, Fly, Wiko, iMobile,\n         * SimValley, Wolfgang, Alcatel, Nintendo, Amoi, INQ, OnePlus, GenericPhone</tt><br>\n         * <br>\n         * If the device is not detected by the regular expressions from Mobile-Detect, a test is made against\n         * the patterns of <a href=\"http://detectmobilebrowsers.com/\">detectmobilebrowsers.com</a>. If this test\n         * is positive, a value of <code>UnknownPhone</code> or <code>UnknownMobile</code> is returned.<br>\n         * When used in browser, the decision whether phone or tablet is made based on <code>screen.width/height</code>.<br>\n         * <br>\n         * When used server-side (node.js), there is no way to tell the difference between <code>UnknownTablet</code>\n         * and <code>UnknownMobile</code>, so you will get <code>null</code> here, while {@link MobileDetect#mobile}\n         * will return <code>UnknownMobile</code>.<br>\n         * Be aware that since v1.0.0 in this special case you will get <code>UnknownMobile</code> only for:\n         * {@link MobileDetect#mobile}, not for {@link MobileDetect#phone} and {@link MobileDetect#tablet}.\n         * In versions before v1.0.0 all 3 methods returned <code>UnknownMobile</code> which was tedious to use.\n         * <br>\n         * In most cases you will use the return value just as a boolean.\n         *\n         * @returns {String} the key of the phone family or producer, e.g. \"iPhone\"\n         * @function MobileDetect#phone\n         */\n        phone: function () {\n            impl.prepareDetectionCache(this._cache, this.ua, this.maxPhoneWidth);\n            return this._cache.phone;\n        },\n\n        /**\n         * Returns the detected tablet type/family string or <tt>null</tt>.\n         * <br>\n         * The returned tablet (family or producer) is one of following keys:<br>\n         * <br><tt>iPad, NexusTablet, GoogleTablet, SamsungTablet, Kindle, SurfaceTablet,\n         * HPTablet, AsusTablet, BlackBerryTablet, HTCtablet, MotorolaTablet, NookTablet,\n         * AcerTablet, ToshibaTablet, LGTablet, FujitsuTablet, PrestigioTablet,\n         * LenovoTablet, DellTablet, YarvikTablet, MedionTablet, ArnovaTablet,\n         * IntensoTablet, IRUTablet, MegafonTablet, EbodaTablet, AllViewTablet,\n         * ArchosTablet, AinolTablet, NokiaLumiaTablet, SonyTablet, PhilipsTablet,\n         * CubeTablet, CobyTablet, MIDTablet, MSITablet, SMiTTablet, RockChipTablet,\n         * FlyTablet, bqTablet, HuaweiTablet, NecTablet, PantechTablet, BronchoTablet,\n         * VersusTablet, ZyncTablet, PositivoTablet, NabiTablet, KoboTablet, DanewTablet,\n         * TexetTablet, PlaystationTablet, TrekstorTablet, PyleAudioTablet, AdvanTablet,\n         * DanyTechTablet, GalapadTablet, MicromaxTablet, KarbonnTablet, AllFineTablet,\n         * PROSCANTablet, YONESTablet, ChangJiaTablet, GUTablet, PointOfViewTablet,\n         * OvermaxTablet, HCLTablet, DPSTablet, VistureTablet, CrestaTablet,\n         * MediatekTablet, ConcordeTablet, GoCleverTablet, ModecomTablet, VoninoTablet,\n         * ECSTablet, StorexTablet, VodafoneTablet, EssentielBTablet, RossMoorTablet,\n         * iMobileTablet, TolinoTablet, AudioSonicTablet, AMPETablet, SkkTablet,\n         * TecnoTablet, JXDTablet, iJoyTablet, FX2Tablet, XoroTablet, ViewsonicTablet,\n         * VerizonTablet, OdysTablet, CaptivaTablet, IconbitTablet, TeclastTablet,\n         * OndaTablet, JaytechTablet, BlaupunktTablet, DigmaTablet, EvolioTablet,\n         * LavaTablet, AocTablet, MpmanTablet, CelkonTablet, WolderTablet, MediacomTablet,\n         * MiTablet, NibiruTablet, NexoTablet, LeaderTablet, UbislateTablet,\n         * PocketBookTablet, KocasoTablet, HisenseTablet, Hudl, TelstraTablet,\n         * GenericTablet</tt><br>\n         * <br>\n         * If the device is not detected by the regular expressions from Mobile-Detect, a test is made against\n         * the patterns of <a href=\"http://detectmobilebrowsers.com/\">detectmobilebrowsers.com</a>. If this test\n         * is positive, a value of <code>UnknownTablet</code> or <code>UnknownMobile</code> is returned.<br>\n         * When used in browser, the decision whether phone or tablet is made based on <code>screen.width/height</code>.<br>\n         * <br>\n         * When used server-side (node.js), there is no way to tell the difference between <code>UnknownTablet</code>\n         * and <code>UnknownMobile</code>, so you will get <code>null</code> here, while {@link MobileDetect#mobile}\n         * will return <code>UnknownMobile</code>.<br>\n         * Be aware that since v1.0.0 in this special case you will get <code>UnknownMobile</code> only for:\n         * {@link MobileDetect#mobile}, not for {@link MobileDetect#phone} and {@link MobileDetect#tablet}.\n         * In versions before v1.0.0 all 3 methods returned <code>UnknownMobile</code> which was tedious to use.\n         * <br>\n         * In most cases you will use the return value just as a boolean.\n         *\n         * @returns {String} the key of the tablet family or producer, e.g. \"SamsungTablet\"\n         * @function MobileDetect#tablet\n         */\n        tablet: function () {\n            impl.prepareDetectionCache(this._cache, this.ua, this.maxPhoneWidth);\n            return this._cache.tablet;\n        },\n\n        /**\n         * Returns the (first) detected user-agent string or <tt>null</tt>.\n         * <br>\n         * The returned user-agent is one of following keys:<br>\n         * <br><tt>Chrome, Dolfin, Opera, Skyfire, Edge, IE, Firefox, Bolt, TeaShark, Blazer,\n         * Safari, WeChat, UCBrowser, baiduboxapp, baidubrowser, DiigoBrowser, Mercury,\n         * ObigoBrowser, NetFront, GenericBrowser, PaleMoon</tt><br>\n         * <br>\n         * In most cases calling {@link MobileDetect#userAgent} will be sufficient. But there are rare\n         * cases where a mobile device pretends to be more than one particular browser. You can get the\n         * list of all matches with {@link MobileDetect#userAgents} or check for a particular value by\n         * providing one of the defined keys as first argument to {@link MobileDetect#is}.\n         *\n         * @returns {String} the key for the detected user-agent or <tt>null</tt>\n         * @function MobileDetect#userAgent\n         */\n        userAgent: function () {\n            if (this._cache.userAgent === undefined) {\n                this._cache.userAgent = impl.findMatch(impl.mobileDetectRules.uas, this.ua);\n            }\n            return this._cache.userAgent;\n        },\n\n        /**\n         * Returns all detected user-agent strings.\n         * <br>\n         * The array is empty or contains one or more of following keys:<br>\n         * <br><tt>Chrome, Dolfin, Opera, Skyfire, Edge, IE, Firefox, Bolt, TeaShark, Blazer,\n         * Safari, WeChat, UCBrowser, baiduboxapp, baidubrowser, DiigoBrowser, Mercury,\n         * ObigoBrowser, NetFront, GenericBrowser, PaleMoon</tt><br>\n         * <br>\n         * In most cases calling {@link MobileDetect#userAgent} will be sufficient. But there are rare\n         * cases where a mobile device pretends to be more than one particular browser. You can get the\n         * list of all matches with {@link MobileDetect#userAgents} or check for a particular value by\n         * providing one of the defined keys as first argument to {@link MobileDetect#is}.\n         *\n         * @returns {Array} the array of detected user-agent keys or <tt>[]</tt>\n         * @function MobileDetect#userAgents\n         */\n        userAgents: function () {\n            if (this._cache.userAgents === undefined) {\n                this._cache.userAgents = impl.findMatches(impl.mobileDetectRules.uas, this.ua);\n            }\n            return this._cache.userAgents;\n        },\n\n        /**\n         * Returns the detected operating system string or <tt>null</tt>.\n         * <br>\n         * The operating system is one of following keys:<br>\n         * <br><tt>AndroidOS, BlackBerryOS, PalmOS, SymbianOS, WindowsMobileOS, WindowsPhoneOS,\n         * iOS, iPadOS, SailfishOS, MeeGoOS, MaemoOS, JavaOS, webOS, badaOS, BREWOS</tt><br>\n         *\n         * @returns {String} the key for the detected operating system.\n         * @function MobileDetect#os\n         */\n        os: function () {\n            if (this._cache.os === undefined) {\n                this._cache.os = impl.detectOS(this.ua);\n            }\n            return this._cache.os;\n        },\n\n        /**\n         * Get the version (as Number) of the given property in the User-Agent.\n         * <br>\n         * Will return a float number. (eg. 2_0 will return 2.0, 4.3.1 will return 4.31)\n         *\n         * @param {String} key a key defining a thing which has a version.<br>\n         *        You can use one of following keys:<br>\n         * <br><tt>Mobile, Build, Version, VendorID, iPad, iPhone, iPod, Kindle, Chrome, Coast,\n         * Dolfin, Firefox, Fennec, Edge, IE, NetFront, NokiaBrowser, Opera, Opera Mini,\n         * Opera Mobi, UCBrowser, MQQBrowser, MicroMessenger, baiduboxapp, baidubrowser,\n         * SamsungBrowser, Iron, Safari, Skyfire, Tizen, Webkit, PaleMoon,\n         * SailfishBrowser, Gecko, Trident, Presto, Goanna, iOS, Android, Sailfish,\n         * BlackBerry, BREW, Java, Windows Phone OS, Windows Phone, Windows CE, Windows\n         * NT, Symbian, webOS</tt><br>\n         *\n         * @returns {Number} the version as float or <tt>NaN</tt> if User-Agent doesn't contain this version.\n         *          Be careful when comparing this value with '==' operator!\n         * @function MobileDetect#version\n         */\n        version: function (key) {\n            return impl.getVersion(key, this.ua);\n        },\n\n        /**\n         * Get the version (as String) of the given property in the User-Agent.\n         * <br>\n         *\n         * @param {String} key a key defining a thing which has a version.<br>\n         *        You can use one of following keys:<br>\n         * <br><tt>Mobile, Build, Version, VendorID, iPad, iPhone, iPod, Kindle, Chrome, Coast,\n         * Dolfin, Firefox, Fennec, Edge, IE, NetFront, NokiaBrowser, Opera, Opera Mini,\n         * Opera Mobi, UCBrowser, MQQBrowser, MicroMessenger, baiduboxapp, baidubrowser,\n         * SamsungBrowser, Iron, Safari, Skyfire, Tizen, Webkit, PaleMoon,\n         * SailfishBrowser, Gecko, Trident, Presto, Goanna, iOS, Android, Sailfish,\n         * BlackBerry, BREW, Java, Windows Phone OS, Windows Phone, Windows CE, Windows\n         * NT, Symbian, webOS</tt><br>\n         *\n         * @returns {String} the \"raw\" version as String or <tt>null</tt> if User-Agent doesn't contain this version.\n         *\n         * @function MobileDetect#versionStr\n         */\n        versionStr: function (key) {\n            return impl.getVersionStr(key, this.ua);\n        },\n\n        /**\n         * Global test key against userAgent, os, phone, tablet and some other properties of userAgent string.\n         *\n         * @param {String} key the key (case-insensitive) of a userAgent, an operating system, phone or\n         *        tablet family.<br>\n         *        For a complete list of possible values, see {@link MobileDetect#userAgent},\n         *        {@link MobileDetect#os}, {@link MobileDetect#phone}, {@link MobileDetect#tablet}.<br>\n         *        Additionally you have following keys:<br>\n         * <br><tt>Bot, MobileBot, DesktopMode, TV, WebKit, Console, Watch</tt><br>\n         *\n         * @returns {boolean} <tt>true</tt> when the given key is one of the defined keys of userAgent, os, phone,\n         *                    tablet or one of the listed additional keys, otherwise <tt>false</tt>\n         * @function MobileDetect#is\n         */\n        is: function (key) {\n            return containsIC(this.userAgents(), key) ||\n                   equalIC(key, this.os()) ||\n                   equalIC(key, this.phone()) ||\n                   equalIC(key, this.tablet()) ||\n                   containsIC(impl.findMatches(impl.mobileDetectRules.utils, this.ua), key);\n        },\n\n        /**\n         * Do a quick test against navigator::userAgent.\n         *\n         * @param {String|RegExp} pattern the pattern, either as String or RegExp\n         *                        (a string will be converted to a case-insensitive RegExp).\n         * @returns {boolean} <tt>true</tt> when the pattern matches, otherwise <tt>false</tt>\n         * @function MobileDetect#match\n         */\n        match: function (pattern) {\n            if (!(pattern instanceof RegExp)) {\n                pattern = new RegExp(pattern, 'i');\n            }\n            return pattern.test(this.ua);\n        },\n\n        /**\n         * Checks whether the mobile device can be considered as phone regarding <code>screen.width</code>.\n         * <br>\n         * Obviously this method makes sense in browser environments only (not for Node.js)!\n         * @param {number} [maxPhoneWidth] the maximum logical pixels (aka. CSS-pixels) to be considered as phone.<br>\n         *        The argument is optional and if not present or falsy, the value of the constructor is taken.\n         * @returns {boolean|undefined} <code>undefined</code> if screen size wasn't detectable, else <code>true</code>\n         *          when screen.width is less or equal to maxPhoneWidth, otherwise <code>false</code>.<br>\n         *          Will always return <code>undefined</code> server-side.\n         */\n        isPhoneSized: function (maxPhoneWidth) {\n            return MobileDetect.isPhoneSized(maxPhoneWidth || this.maxPhoneWidth);\n        },\n\n        /**\n         * Returns the mobile grade ('A', 'B', 'C').\n         *\n         * @returns {String} one of the mobile grades ('A', 'B', 'C').\n         * @function MobileDetect#mobileGrade\n         */\n        mobileGrade: function () {\n            if (this._cache.grade === undefined) {\n                this._cache.grade = impl.mobileGrade(this);\n            }\n            return this._cache.grade;\n        }\n    };\n\n    // environment-dependent\n    if (typeof window !== 'undefined' && window.screen) {\n        MobileDetect.isPhoneSized = function (maxPhoneWidth) {\n            return maxPhoneWidth < 0 ? undefined : impl.getDeviceSmallerSide() <= maxPhoneWidth;\n        };\n    } else {\n        MobileDetect.isPhoneSized = function () {};\n    }\n\n    // should not be replaced by a completely new object - just overwrite existing methods\n    MobileDetect._impl = impl;\n    \n    MobileDetect.version = '1.4.5 2021-03-13';\n\n    return MobileDetect;\n}); // end of call of define()\n})((function (undefined) {\n    if (typeof module !== 'undefined' && module.exports) {\n        return function (factory) { module.exports = factory(); };\n    } else if (typeof define === 'function' && define.amd) {\n        return define;\n    } else if (typeof window !== 'undefined') {\n        return function (factory) { window.MobileDetect = factory(); };\n    } else {\n        // please file a bug if you get this error!\n        throw new Error('unknown environment');\n    }\n})());","/*!\r\n * jQuery Validation Plugin v1.19.3\r\n *\r\n * https://jqueryvalidation.org/\r\n *\r\n * Copyright (c) 2021 Jörn Zaefferer\r\n * Released under the MIT license\r\n */\r\n(function( factory ) {\r\n\tif ( typeof define === \"function\" && define.amd ) {\r\n\t\tdefine( [\"jquery\"], factory );\r\n\t} else if (typeof module === \"object\" && module.exports) {\r\n\t\tmodule.exports = factory( require( \"jquery\" ) );\r\n\t} else {\r\n\t\tfactory( jQuery );\r\n\t}\r\n}(function( $ ) {\r\n\r\n$.extend( $.fn, {\n\n\t// https://jqueryvalidation.org/validate/\n\tvalidate: function( options ) {\n\n\t\t// If nothing is selected, return nothing; can't chain anyway\n\t\tif ( !this.length ) {\n\t\t\tif ( options && options.debug && window.console ) {\n\t\t\t\tconsole.warn( \"Nothing selected, can't validate, returning nothing.\" );\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Check if a validator for this form was already created\n\t\tvar validator = $.data( this[ 0 ], \"validator\" );\n\t\tif ( validator ) {\n\t\t\treturn validator;\n\t\t}\n\n\t\t// Add novalidate tag if HTML5.\n\t\tthis.attr( \"novalidate\", \"novalidate\" );\n\n\t\tvalidator = new $.validator( options, this[ 0 ] );\n\t\t$.data( this[ 0 ], \"validator\", validator );\n\n\t\tif ( validator.settings.onsubmit ) {\n\n\t\t\tthis.on( \"click.validate\", \":submit\", function( event ) {\n\n\t\t\t\t// Track the used submit button to properly handle scripted\n\t\t\t\t// submits later.\n\t\t\t\tvalidator.submitButton = event.currentTarget;\n\n\t\t\t\t// Allow suppressing validation by adding a cancel class to the submit button\n\t\t\t\tif ( $( this ).hasClass( \"cancel\" ) ) {\n\t\t\t\t\tvalidator.cancelSubmit = true;\n\t\t\t\t}\n\n\t\t\t\t// Allow suppressing validation by adding the html5 formnovalidate attribute to the submit button\n\t\t\t\tif ( $( this ).attr( \"formnovalidate\" ) !== undefined ) {\n\t\t\t\t\tvalidator.cancelSubmit = true;\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\t// Validate the form on submit\n\t\t\tthis.on( \"submit.validate\", function( event ) {\n\t\t\t\tif ( validator.settings.debug ) {\n\n\t\t\t\t\t// Prevent form submit to be able to see console output\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\n\t\t\t\tfunction handle() {\n\t\t\t\t\tvar hidden, result;\n\n\t\t\t\t\t// Insert a hidden input as a replacement for the missing submit button\n\t\t\t\t\t// The hidden input is inserted in two cases:\n\t\t\t\t\t//   - A user defined a `submitHandler`\n\t\t\t\t\t//   - There was a pending request due to `remote` method and `stopRequest()`\n\t\t\t\t\t//     was called to submit the form in case it's valid\n\t\t\t\t\tif ( validator.submitButton && ( validator.settings.submitHandler || validator.formSubmitted ) ) {\n\t\t\t\t\t\thidden = $( \"<input type='hidden'/>\" )\n\t\t\t\t\t\t\t.attr( \"name\", validator.submitButton.name )\n\t\t\t\t\t\t\t.val( $( validator.submitButton ).val() )\n\t\t\t\t\t\t\t.appendTo( validator.currentForm );\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( validator.settings.submitHandler && !validator.settings.debug ) {\n\t\t\t\t\t\tresult = validator.settings.submitHandler.call( validator, validator.currentForm, event );\n\t\t\t\t\t\tif ( hidden ) {\n\n\t\t\t\t\t\t\t// And clean up afterwards; thanks to no-block-scope, hidden can be referenced\n\t\t\t\t\t\t\thidden.remove();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( result !== undefined ) {\n\t\t\t\t\t\t\treturn result;\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\t// Prevent submit for invalid forms or custom submit handlers\n\t\t\t\tif ( validator.cancelSubmit ) {\n\t\t\t\t\tvalidator.cancelSubmit = false;\n\t\t\t\t\treturn handle();\n\t\t\t\t}\n\t\t\t\tif ( validator.form() ) {\n\t\t\t\t\tif ( validator.pendingRequest ) {\n\t\t\t\t\t\tvalidator.formSubmitted = true;\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\treturn handle();\n\t\t\t\t} else {\n\t\t\t\t\tvalidator.focusInvalid();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\treturn validator;\n\t},\n\n\t// https://jqueryvalidation.org/valid/\n\tvalid: function() {\n\t\tvar valid, validator, errorList;\n\n\t\tif ( $( this[ 0 ] ).is( \"form\" ) ) {\n\t\t\tvalid = this.validate().form();\n\t\t} else {\n\t\t\terrorList = [];\n\t\t\tvalid = true;\n\t\t\tvalidator = $( this[ 0 ].form ).validate();\n\t\t\tthis.each( function() {\n\t\t\t\tvalid = validator.element( this ) && valid;\n\t\t\t\tif ( !valid ) {\n\t\t\t\t\terrorList = errorList.concat( validator.errorList );\n\t\t\t\t}\n\t\t\t} );\n\t\t\tvalidator.errorList = errorList;\n\t\t}\n\t\treturn valid;\n\t},\n\n\t// https://jqueryvalidation.org/rules/\n\trules: function( command, argument ) {\n\t\tvar element = this[ 0 ],\n\t\t\tisContentEditable = typeof this.attr( \"contenteditable\" ) !== \"undefined\" && this.attr( \"contenteditable\" ) !== \"false\",\n\t\t\tsettings, staticRules, existingRules, data, param, filtered;\n\n\t\t// If nothing is selected, return empty object; can't chain anyway\n\t\tif ( element == null ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( !element.form && isContentEditable ) {\n\t\t\telement.form = this.closest( \"form\" )[ 0 ];\n\t\t\telement.name = this.attr( \"name\" );\n\t\t}\n\n\t\tif ( element.form == null ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( command ) {\n\t\t\tsettings = $.data( element.form, \"validator\" ).settings;\n\t\t\tstaticRules = settings.rules;\n\t\t\texistingRules = $.validator.staticRules( element );\n\t\t\tswitch ( command ) {\n\t\t\tcase \"add\":\n\t\t\t\t$.extend( existingRules, $.validator.normalizeRule( argument ) );\n\n\t\t\t\t// Remove messages from rules, but allow them to be set separately\n\t\t\t\tdelete existingRules.messages;\n\t\t\t\tstaticRules[ element.name ] = existingRules;\n\t\t\t\tif ( argument.messages ) {\n\t\t\t\t\tsettings.messages[ element.name ] = $.extend( settings.messages[ element.name ], argument.messages );\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"remove\":\n\t\t\t\tif ( !argument ) {\n\t\t\t\t\tdelete staticRules[ element.name ];\n\t\t\t\t\treturn existingRules;\n\t\t\t\t}\n\t\t\t\tfiltered = {};\n\t\t\t\t$.each( argument.split( /\\s/ ), function( index, method ) {\n\t\t\t\t\tfiltered[ method ] = existingRules[ method ];\n\t\t\t\t\tdelete existingRules[ method ];\n\t\t\t\t} );\n\t\t\t\treturn filtered;\n\t\t\t}\n\t\t}\n\n\t\tdata = $.validator.normalizeRules(\n\t\t$.extend(\n\t\t\t{},\n\t\t\t$.validator.classRules( element ),\n\t\t\t$.validator.attributeRules( element ),\n\t\t\t$.validator.dataRules( element ),\n\t\t\t$.validator.staticRules( element )\n\t\t), element );\n\n\t\t// Make sure required is at front\n\t\tif ( data.required ) {\n\t\t\tparam = data.required;\n\t\t\tdelete data.required;\n\t\t\tdata = $.extend( { required: param }, data );\n\t\t}\n\n\t\t// Make sure remote is at back\n\t\tif ( data.remote ) {\n\t\t\tparam = data.remote;\n\t\t\tdelete data.remote;\n\t\t\tdata = $.extend( data, { remote: param } );\n\t\t}\n\n\t\treturn data;\n\t}\n} );\n\n// JQuery trim is deprecated, provide a trim method based on String.prototype.trim\nvar trim = function( str ) {\n\n\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/trim#Polyfill\n\treturn str.replace( /^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, \"\" );\n};\n\n// Custom selectors\n$.extend( $.expr.pseudos || $.expr[ \":\" ], {\t\t// '|| $.expr[ \":\" ]' here enables backwards compatibility to jQuery 1.7. Can be removed when dropping jQ 1.7.x support\n\n\t// https://jqueryvalidation.org/blank-selector/\n\tblank: function( a ) {\n\t\treturn !trim( \"\" + $( a ).val() );\n\t},\n\n\t// https://jqueryvalidation.org/filled-selector/\n\tfilled: function( a ) {\n\t\tvar val = $( a ).val();\n\t\treturn val !== null && !!trim( \"\" + val );\n\t},\n\n\t// https://jqueryvalidation.org/unchecked-selector/\n\tunchecked: function( a ) {\n\t\treturn !$( a ).prop( \"checked\" );\n\t}\n} );\n\n// Constructor for validator\n$.validator = function( options, form ) {\n\tthis.settings = $.extend( true, {}, $.validator.defaults, options );\n\tthis.currentForm = form;\n\tthis.init();\n};\n\n// https://jqueryvalidation.org/jQuery.validator.format/\n$.validator.format = function( source, params ) {\n\tif ( arguments.length === 1 ) {\n\t\treturn function() {\n\t\t\tvar args = $.makeArray( arguments );\n\t\t\targs.unshift( source );\n\t\t\treturn $.validator.format.apply( this, args );\n\t\t};\n\t}\n\tif ( params === undefined ) {\n\t\treturn source;\n\t}\n\tif ( arguments.length > 2 && params.constructor !== Array  ) {\n\t\tparams = $.makeArray( arguments ).slice( 1 );\n\t}\n\tif ( params.constructor !== Array ) {\n\t\tparams = [ params ];\n\t}\n\t$.each( params, function( i, n ) {\n\t\tsource = source.replace( new RegExp( \"\\\\{\" + i + \"\\\\}\", \"g\" ), function() {\n\t\t\treturn n;\n\t\t} );\n\t} );\n\treturn source;\n};\n\n$.extend( $.validator, {\n\n\tdefaults: {\n\t\tmessages: {},\n\t\tgroups: {},\n\t\trules: {},\n\t\terrorClass: \"error\",\n\t\tpendingClass: \"pending\",\n\t\tvalidClass: \"valid\",\n\t\terrorElement: \"label\",\n\t\tfocusCleanup: false,\n\t\tfocusInvalid: true,\n\t\terrorContainer: $( [] ),\n\t\terrorLabelContainer: $( [] ),\n\t\tonsubmit: true,\n\t\tignore: \":hidden\",\n\t\tignoreTitle: false,\n\t\tonfocusin: function( element ) {\n\t\t\tthis.lastActive = element;\n\n\t\t\t// Hide error label and remove error class on focus if enabled\n\t\t\tif ( this.settings.focusCleanup ) {\n\t\t\t\tif ( this.settings.unhighlight ) {\n\t\t\t\t\tthis.settings.unhighlight.call( this, element, this.settings.errorClass, this.settings.validClass );\n\t\t\t\t}\n\t\t\t\tthis.hideThese( this.errorsFor( element ) );\n\t\t\t}\n\t\t},\n\t\tonfocusout: function( element ) {\n\t\t\tif ( !this.checkable( element ) && ( element.name in this.submitted || !this.optional( element ) ) ) {\n\t\t\t\tthis.element( element );\n\t\t\t}\n\t\t},\n\t\tonkeyup: function( element, event ) {\n\n\t\t\t// Avoid revalidate the field when pressing one of the following keys\n\t\t\t// Shift       => 16\n\t\t\t// Ctrl        => 17\n\t\t\t// Alt         => 18\n\t\t\t// Caps lock   => 20\n\t\t\t// End         => 35\n\t\t\t// Home        => 36\n\t\t\t// Left arrow  => 37\n\t\t\t// Up arrow    => 38\n\t\t\t// Right arrow => 39\n\t\t\t// Down arrow  => 40\n\t\t\t// Insert      => 45\n\t\t\t// Num lock    => 144\n\t\t\t// AltGr key   => 225\n\t\t\tvar excludedKeys = [\n\t\t\t\t16, 17, 18, 20, 35, 36, 37,\n\t\t\t\t38, 39, 40, 45, 144, 225\n\t\t\t];\n\n\t\t\tif ( event.which === 9 && this.elementValue( element ) === \"\" || $.inArray( event.keyCode, excludedKeys ) !== -1 ) {\n\t\t\t\treturn;\n\t\t\t} else if ( element.name in this.submitted || element.name in this.invalid ) {\n\t\t\t\tthis.element( element );\n\t\t\t}\n\t\t},\n\t\tonclick: function( element ) {\n\n\t\t\t// Click on selects, radiobuttons and checkboxes\n\t\t\tif ( element.name in this.submitted ) {\n\t\t\t\tthis.element( element );\n\n\t\t\t// Or option elements, check parent select in that case\n\t\t\t} else if ( element.parentNode.name in this.submitted ) {\n\t\t\t\tthis.element( element.parentNode );\n\t\t\t}\n\t\t},\n\t\thighlight: function( element, errorClass, validClass ) {\n\t\t\tif ( element.type === \"radio\" ) {\n\t\t\t\tthis.findByName( element.name ).addClass( errorClass ).removeClass( validClass );\n\t\t\t} else {\n\t\t\t\t$( element ).addClass( errorClass ).removeClass( validClass );\n\t\t\t}\n\t\t},\n\t\tunhighlight: function( element, errorClass, validClass ) {\n\t\t\tif ( element.type === \"radio\" ) {\n\t\t\t\tthis.findByName( element.name ).removeClass( errorClass ).addClass( validClass );\n\t\t\t} else {\n\t\t\t\t$( element ).removeClass( errorClass ).addClass( validClass );\n\t\t\t}\n\t\t}\n\t},\n\n\t// https://jqueryvalidation.org/jQuery.validator.setDefaults/\n\tsetDefaults: function( settings ) {\n\t\t$.extend( $.validator.defaults, settings );\n\t},\n\n\tmessages: {\n\t\trequired: \"This field is required.\",\n\t\tremote: \"Please fix this field.\",\n\t\temail: \"Please enter a valid email address.\",\n\t\turl: \"Please enter a valid URL.\",\n\t\tdate: \"Please enter a valid date.\",\n\t\tdateISO: \"Please enter a valid date (ISO).\",\n\t\tnumber: \"Please enter a valid number.\",\n\t\tdigits: \"Please enter only digits.\",\n\t\tequalTo: \"Please enter the same value again.\",\n\t\tmaxlength: $.validator.format( \"Please enter no more than {0} characters.\" ),\n\t\tminlength: $.validator.format( \"Please enter at least {0} characters.\" ),\n\t\trangelength: $.validator.format( \"Please enter a value between {0} and {1} characters long.\" ),\n\t\trange: $.validator.format( \"Please enter a value between {0} and {1}.\" ),\n\t\tmax: $.validator.format( \"Please enter a value less than or equal to {0}.\" ),\n\t\tmin: $.validator.format( \"Please enter a value greater than or equal to {0}.\" ),\n\t\tstep: $.validator.format( \"Please enter a multiple of {0}.\" )\n\t},\n\n\tautoCreateRanges: false,\n\n\tprototype: {\n\n\t\tinit: function() {\n\t\t\tthis.labelContainer = $( this.settings.errorLabelContainer );\n\t\t\tthis.errorContext = this.labelContainer.length && this.labelContainer || $( this.currentForm );\n\t\t\tthis.containers = $( this.settings.errorContainer ).add( this.settings.errorLabelContainer );\n\t\t\tthis.submitted = {};\n\t\t\tthis.valueCache = {};\n\t\t\tthis.pendingRequest = 0;\n\t\t\tthis.pending = {};\n\t\t\tthis.invalid = {};\n\t\t\tthis.reset();\n\n\t\t\tvar currentForm = this.currentForm,\n\t\t\t\tgroups = ( this.groups = {} ),\n\t\t\t\trules;\n\t\t\t$.each( this.settings.groups, function( key, value ) {\n\t\t\t\tif ( typeof value === \"string\" ) {\n\t\t\t\t\tvalue = value.split( /\\s/ );\n\t\t\t\t}\n\t\t\t\t$.each( value, function( index, name ) {\n\t\t\t\t\tgroups[ name ] = key;\n\t\t\t\t} );\n\t\t\t} );\n\t\t\trules = this.settings.rules;\n\t\t\t$.each( rules, function( key, value ) {\n\t\t\t\trules[ key ] = $.validator.normalizeRule( value );\n\t\t\t} );\n\n\t\t\tfunction delegate( event ) {\n\t\t\t\tvar isContentEditable = typeof $( this ).attr( \"contenteditable\" ) !== \"undefined\" && $( this ).attr( \"contenteditable\" ) !== \"false\";\n\n\t\t\t\t// Set form expando on contenteditable\n\t\t\t\tif ( !this.form && isContentEditable ) {\n\t\t\t\t\tthis.form = $( this ).closest( \"form\" )[ 0 ];\n\t\t\t\t\tthis.name = $( this ).attr( \"name\" );\n\t\t\t\t}\n\n\t\t\t\t// Ignore the element if it belongs to another form. This will happen mainly\n\t\t\t\t// when setting the `form` attribute of an input to the id of another form.\n\t\t\t\tif ( currentForm !== this.form ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvar validator = $.data( this.form, \"validator\" ),\n\t\t\t\t\teventType = \"on\" + event.type.replace( /^validate/, \"\" ),\n\t\t\t\t\tsettings = validator.settings;\n\t\t\t\tif ( settings[ eventType ] && !$( this ).is( settings.ignore ) ) {\n\t\t\t\t\tsettings[ eventType ].call( validator, this, event );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t$( this.currentForm )\n\t\t\t\t.on( \"focusin.validate focusout.validate keyup.validate\",\n\t\t\t\t\t\":text, [type='password'], [type='file'], select, textarea, [type='number'], [type='search'], \" +\n\t\t\t\t\t\"[type='tel'], [type='url'], [type='email'], [type='datetime'], [type='date'], [type='month'], \" +\n\t\t\t\t\t\"[type='week'], [type='time'], [type='datetime-local'], [type='range'], [type='color'], \" +\n\t\t\t\t\t\"[type='radio'], [type='checkbox'], [contenteditable], [type='button']\", delegate )\n\n\t\t\t\t// Support: Chrome, oldIE\n\t\t\t\t// \"select\" is provided as event.target when clicking a option\n\t\t\t\t.on( \"click.validate\", \"select, option, [type='radio'], [type='checkbox']\", delegate );\n\n\t\t\tif ( this.settings.invalidHandler ) {\n\t\t\t\t$( this.currentForm ).on( \"invalid-form.validate\", this.settings.invalidHandler );\n\t\t\t}\n\t\t},\n\n\t\t// https://jqueryvalidation.org/Validator.form/\n\t\tform: function() {\n\t\t\tthis.checkForm();\n\t\t\t$.extend( this.submitted, this.errorMap );\n\t\t\tthis.invalid = $.extend( {}, this.errorMap );\n\t\t\tif ( !this.valid() ) {\n\t\t\t\t$( this.currentForm ).triggerHandler( \"invalid-form\", [ this ] );\n\t\t\t}\n\t\t\tthis.showErrors();\n\t\t\treturn this.valid();\n\t\t},\n\n\t\tcheckForm: function() {\n\t\t\tthis.prepareForm();\n\t\t\tfor ( var i = 0, elements = ( this.currentElements = this.elements() ); elements[ i ]; i++ ) {\n\t\t\t\tthis.check( elements[ i ] );\n\t\t\t}\n\t\t\treturn this.valid();\n\t\t},\n\n\t\t// https://jqueryvalidation.org/Validator.element/\n\t\telement: function( element ) {\n\t\t\tvar cleanElement = this.clean( element ),\n\t\t\t\tcheckElement = this.validationTargetFor( cleanElement ),\n\t\t\t\tv = this,\n\t\t\t\tresult = true,\n\t\t\t\trs, group;\n\n\t\t\tif ( checkElement === undefined ) {\n\t\t\t\tdelete this.invalid[ cleanElement.name ];\n\t\t\t} else {\n\t\t\t\tthis.prepareElement( checkElement );\n\t\t\t\tthis.currentElements = $( checkElement );\n\n\t\t\t\t// If this element is grouped, then validate all group elements already\n\t\t\t\t// containing a value\n\t\t\t\tgroup = this.groups[ checkElement.name ];\n\t\t\t\tif ( group ) {\n\t\t\t\t\t$.each( this.groups, function( name, testgroup ) {\n\t\t\t\t\t\tif ( testgroup === group && name !== checkElement.name ) {\n\t\t\t\t\t\t\tcleanElement = v.validationTargetFor( v.clean( v.findByName( name ) ) );\n\t\t\t\t\t\t\tif ( cleanElement && cleanElement.name in v.invalid ) {\n\t\t\t\t\t\t\t\tv.currentElements.push( cleanElement );\n\t\t\t\t\t\t\t\tresult = v.check( cleanElement ) && result;\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}\n\n\t\t\t\trs = this.check( checkElement ) !== false;\n\t\t\t\tresult = result && rs;\n\t\t\t\tif ( rs ) {\n\t\t\t\t\tthis.invalid[ checkElement.name ] = false;\n\t\t\t\t} else {\n\t\t\t\t\tthis.invalid[ checkElement.name ] = true;\n\t\t\t\t}\n\n\t\t\t\tif ( !this.numberOfInvalids() ) {\n\n\t\t\t\t\t// Hide error containers on last error\n\t\t\t\t\tthis.toHide = this.toHide.add( this.containers );\n\t\t\t\t}\n\t\t\t\tthis.showErrors();\n\n\t\t\t\t// Add aria-invalid status for screen readers\n\t\t\t\t$( element ).attr( \"aria-invalid\", !rs );\n\t\t\t}\n\n\t\t\treturn result;\n\t\t},\n\n\t\t// https://jqueryvalidation.org/Validator.showErrors/\n\t\tshowErrors: function( errors ) {\n\t\t\tif ( errors ) {\n\t\t\t\tvar validator = this;\n\n\t\t\t\t// Add items to error list and map\n\t\t\t\t$.extend( this.errorMap, errors );\n\t\t\t\tthis.errorList = $.map( this.errorMap, function( message, name ) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tmessage: message,\n\t\t\t\t\t\telement: validator.findByName( name )[ 0 ]\n\t\t\t\t\t};\n\t\t\t\t} );\n\n\t\t\t\t// Remove items from success list\n\t\t\t\tthis.successList = $.grep( this.successList, function( element ) {\n\t\t\t\t\treturn !( element.name in errors );\n\t\t\t\t} );\n\t\t\t}\n\t\t\tif ( this.settings.showErrors ) {\n\t\t\t\tthis.settings.showErrors.call( this, this.errorMap, this.errorList );\n\t\t\t} else {\n\t\t\t\tthis.defaultShowErrors();\n\t\t\t}\n\t\t},\n\n\t\t// https://jqueryvalidation.org/Validator.resetForm/\n\t\tresetForm: function() {\n\t\t\tif ( $.fn.resetForm ) {\n\t\t\t\t$( this.currentForm ).resetForm();\n\t\t\t}\n\t\t\tthis.invalid = {};\n\t\t\tthis.submitted = {};\n\t\t\tthis.prepareForm();\n\t\t\tthis.hideErrors();\n\t\t\tvar elements = this.elements()\n\t\t\t\t.removeData( \"previousValue\" )\n\t\t\t\t.removeAttr( \"aria-invalid\" );\n\n\t\t\tthis.resetElements( elements );\n\t\t},\n\n\t\tresetElements: function( elements ) {\n\t\t\tvar i;\n\n\t\t\tif ( this.settings.unhighlight ) {\n\t\t\t\tfor ( i = 0; elements[ i ]; i++ ) {\n\t\t\t\t\tthis.settings.unhighlight.call( this, elements[ i ],\n\t\t\t\t\t\tthis.settings.errorClass, \"\" );\n\t\t\t\t\tthis.findByName( elements[ i ].name ).removeClass( this.settings.validClass );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\telements\n\t\t\t\t\t.removeClass( this.settings.errorClass )\n\t\t\t\t\t.removeClass( this.settings.validClass );\n\t\t\t}\n\t\t},\n\n\t\tnumberOfInvalids: function() {\n\t\t\treturn this.objectLength( this.invalid );\n\t\t},\n\n\t\tobjectLength: function( obj ) {\n\t\t\t/* jshint unused: false */\n\t\t\tvar count = 0,\n\t\t\t\ti;\n\t\t\tfor ( i in obj ) {\n\n\t\t\t\t// This check allows counting elements with empty error\n\t\t\t\t// message as invalid elements\n\t\t\t\tif ( obj[ i ] !== undefined && obj[ i ] !== null && obj[ i ] !== false ) {\n\t\t\t\t\tcount++;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn count;\n\t\t},\n\n\t\thideErrors: function() {\n\t\t\tthis.hideThese( this.toHide );\n\t\t},\n\n\t\thideThese: function( errors ) {\n\t\t\terrors.not( this.containers ).text( \"\" );\n\t\t\tthis.addWrapper( errors ).hide();\n\t\t},\n\n\t\tvalid: function() {\n\t\t\treturn this.size() === 0;\n\t\t},\n\n\t\tsize: function() {\n\t\t\treturn this.errorList.length;\n\t\t},\n\n\t\tfocusInvalid: function() {\n\t\t\tif ( this.settings.focusInvalid ) {\n\t\t\t\ttry {\n\t\t\t\t\t$( this.findLastActive() || this.errorList.length && this.errorList[ 0 ].element || [] )\n\t\t\t\t\t.filter( \":visible\" )\n\t\t\t\t\t.trigger( \"focus\" )\n\n\t\t\t\t\t// Manually trigger focusin event; without it, focusin handler isn't called, findLastActive won't have anything to find\n\t\t\t\t\t.trigger( \"focusin\" );\n\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t// Ignore IE throwing errors when focusing hidden elements\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tfindLastActive: function() {\n\t\t\tvar lastActive = this.lastActive;\n\t\t\treturn lastActive && $.grep( this.errorList, function( n ) {\n\t\t\t\treturn n.element.name === lastActive.name;\n\t\t\t} ).length === 1 && lastActive;\n\t\t},\n\n\t\telements: function() {\n\t\t\tvar validator = this,\n\t\t\t\trulesCache = {};\n\n\t\t\t// Select all valid inputs inside the form (no submit or reset buttons)\n\t\t\treturn $( this.currentForm )\n\t\t\t.find( \"input, select, textarea, [contenteditable]\" )\n\t\t\t.not( \":submit, :reset, :image, :disabled\" )\n\t\t\t.not( this.settings.ignore )\n\t\t\t.filter( function() {\n\t\t\t\tvar name = this.name || $( this ).attr( \"name\" ); // For contenteditable\n\t\t\t\tvar isContentEditable = typeof $( this ).attr( \"contenteditable\" ) !== \"undefined\" && $( this ).attr( \"contenteditable\" ) !== \"false\";\n\n\t\t\t\tif ( !name && validator.settings.debug && window.console ) {\n\t\t\t\t\tconsole.error( \"%o has no name assigned\", this );\n\t\t\t\t}\n\n\t\t\t\t// Set form expando on contenteditable\n\t\t\t\tif ( isContentEditable ) {\n\t\t\t\t\tthis.form = $( this ).closest( \"form\" )[ 0 ];\n\t\t\t\t\tthis.name = name;\n\t\t\t\t}\n\n\t\t\t\t// Ignore elements that belong to other/nested forms\n\t\t\t\tif ( this.form !== validator.currentForm ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\t// Select only the first element for each name, and only those with rules specified\n\t\t\t\tif ( name in rulesCache || !validator.objectLength( $( this ).rules() ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\trulesCache[ name ] = true;\n\t\t\t\treturn true;\n\t\t\t} );\n\t\t},\n\n\t\tclean: function( selector ) {\n\t\t\treturn $( selector )[ 0 ];\n\t\t},\n\n\t\terrors: function() {\n\t\t\tvar errorClass = this.settings.errorClass.split( \" \" ).join( \".\" );\n\t\t\treturn $( this.settings.errorElement + \".\" + errorClass, this.errorContext );\n\t\t},\n\n\t\tresetInternals: function() {\n\t\t\tthis.successList = [];\n\t\t\tthis.errorList = [];\n\t\t\tthis.errorMap = {};\n\t\t\tthis.toShow = $( [] );\n\t\t\tthis.toHide = $( [] );\n\t\t},\n\n\t\treset: function() {\n\t\t\tthis.resetInternals();\n\t\t\tthis.currentElements = $( [] );\n\t\t},\n\n\t\tprepareForm: function() {\n\t\t\tthis.reset();\n\t\t\tthis.toHide = this.errors().add( this.containers );\n\t\t},\n\n\t\tprepareElement: function( element ) {\n\t\t\tthis.reset();\n\t\t\tthis.toHide = this.errorsFor( element );\n\t\t},\n\n\t\telementValue: function( element ) {\n\t\t\tvar $element = $( element ),\n\t\t\t\ttype = element.type,\n\t\t\t\tisContentEditable = typeof $element.attr( \"contenteditable\" ) !== \"undefined\" && $element.attr( \"contenteditable\" ) !== \"false\",\n\t\t\t\tval, idx;\n\n\t\t\tif ( type === \"radio\" || type === \"checkbox\" ) {\n\t\t\t\treturn this.findByName( element.name ).filter( \":checked\" ).val();\n\t\t\t} else if ( type === \"number\" && typeof element.validity !== \"undefined\" ) {\n\t\t\t\treturn element.validity.badInput ? \"NaN\" : $element.val();\n\t\t\t}\n\n\t\t\tif ( isContentEditable ) {\n\t\t\t\tval = $element.text();\n\t\t\t} else {\n\t\t\t\tval = $element.val();\n\t\t\t}\n\n\t\t\tif ( type === \"file\" ) {\n\n\t\t\t\t// Modern browser (chrome & safari)\n\t\t\t\tif ( val.substr( 0, 12 ) === \"C:\\\\fakepath\\\\\" ) {\n\t\t\t\t\treturn val.substr( 12 );\n\t\t\t\t}\n\n\t\t\t\t// Legacy browsers\n\t\t\t\t// Unix-based path\n\t\t\t\tidx = val.lastIndexOf( \"/\" );\n\t\t\t\tif ( idx >= 0 ) {\n\t\t\t\t\treturn val.substr( idx + 1 );\n\t\t\t\t}\n\n\t\t\t\t// Windows-based path\n\t\t\t\tidx = val.lastIndexOf( \"\\\\\" );\n\t\t\t\tif ( idx >= 0 ) {\n\t\t\t\t\treturn val.substr( idx + 1 );\n\t\t\t\t}\n\n\t\t\t\t// Just the file name\n\t\t\t\treturn val;\n\t\t\t}\n\n\t\t\tif ( typeof val === \"string\" ) {\n\t\t\t\treturn val.replace( /\\r/g, \"\" );\n\t\t\t}\n\t\t\treturn val;\n\t\t},\n\n\t\tcheck: function( element ) {\n\t\t\telement = this.validationTargetFor( this.clean( element ) );\n\n\t\t\tvar rules = $( element ).rules(),\n\t\t\t\trulesCount = $.map( rules, function( n, i ) {\n\t\t\t\t\treturn i;\n\t\t\t\t} ).length,\n\t\t\t\tdependencyMismatch = false,\n\t\t\t\tval = this.elementValue( element ),\n\t\t\t\tresult, method, rule, normalizer;\n\n\t\t\t// Prioritize the local normalizer defined for this element over the global one\n\t\t\t// if the former exists, otherwise user the global one in case it exists.\n\t\t\tif ( typeof rules.normalizer === \"function\" ) {\n\t\t\t\tnormalizer = rules.normalizer;\n\t\t\t} else if (\ttypeof this.settings.normalizer === \"function\" ) {\n\t\t\t\tnormalizer = this.settings.normalizer;\n\t\t\t}\n\n\t\t\t// If normalizer is defined, then call it to retreive the changed value instead\n\t\t\t// of using the real one.\n\t\t\t// Note that `this` in the normalizer is `element`.\n\t\t\tif ( normalizer ) {\n\t\t\t\tval = normalizer.call( element, val );\n\n\t\t\t\t// Delete the normalizer from rules to avoid treating it as a pre-defined method.\n\t\t\t\tdelete rules.normalizer;\n\t\t\t}\n\n\t\t\tfor ( method in rules ) {\n\t\t\t\trule = { method: method, parameters: rules[ method ] };\n\t\t\t\ttry {\n\t\t\t\t\tresult = $.validator.methods[ method ].call( this, val, element, rule.parameters );\n\n\t\t\t\t\t// If a method indicates that the field is optional and therefore valid,\n\t\t\t\t\t// don't mark it as valid when there are no other rules\n\t\t\t\t\tif ( result === \"dependency-mismatch\" && rulesCount === 1 ) {\n\t\t\t\t\t\tdependencyMismatch = true;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tdependencyMismatch = false;\n\n\t\t\t\t\tif ( result === \"pending\" ) {\n\t\t\t\t\t\tthis.toHide = this.toHide.not( this.errorsFor( element ) );\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( !result ) {\n\t\t\t\t\t\tthis.formatAndAdd( element, rule );\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t} catch ( e ) {\n\t\t\t\t\tif ( this.settings.debug && window.console ) {\n\t\t\t\t\t\tconsole.log( \"Exception occurred when checking element \" + element.id + \", check the '\" + rule.method + \"' method.\", e );\n\t\t\t\t\t}\n\t\t\t\t\tif ( e instanceof TypeError ) {\n\t\t\t\t\t\te.message += \".  Exception occurred when checking element \" + element.id + \", check the '\" + rule.method + \"' method.\";\n\t\t\t\t\t}\n\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( dependencyMismatch ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif ( this.objectLength( rules ) ) {\n\t\t\t\tthis.successList.push( element );\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\n\t\t// Return the custom message for the given element and validation method\n\t\t// specified in the element's HTML5 data attribute\n\t\t// return the generic message if present and no method specific message is present\n\t\tcustomDataMessage: function( element, method ) {\n\t\t\treturn $( element ).data( \"msg\" + method.charAt( 0 ).toUpperCase() +\n\t\t\t\tmethod.substring( 1 ).toLowerCase() ) || $( element ).data( \"msg\" );\n\t\t},\n\n\t\t// Return the custom message for the given element name and validation method\n\t\tcustomMessage: function( name, method ) {\n\t\t\tvar m = this.settings.messages[ name ];\n\t\t\treturn m && ( m.constructor === String ? m : m[ method ] );\n\t\t},\n\n\t\t// Return the first defined argument, allowing empty strings\n\t\tfindDefined: function() {\n\t\t\tfor ( var i = 0; i < arguments.length; i++ ) {\n\t\t\t\tif ( arguments[ i ] !== undefined ) {\n\t\t\t\t\treturn arguments[ i ];\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn undefined;\n\t\t},\n\n\t\t// The second parameter 'rule' used to be a string, and extended to an object literal\n\t\t// of the following form:\n\t\t// rule = {\n\t\t//     method: \"method name\",\n\t\t//     parameters: \"the given method parameters\"\n\t\t// }\n\t\t//\n\t\t// The old behavior still supported, kept to maintain backward compatibility with\n\t\t// old code, and will be removed in the next major release.\n\t\tdefaultMessage: function( element, rule ) {\n\t\t\tif ( typeof rule === \"string\" ) {\n\t\t\t\trule = { method: rule };\n\t\t\t}\n\n\t\t\tvar message = this.findDefined(\n\t\t\t\t\tthis.customMessage( element.name, rule.method ),\n\t\t\t\t\tthis.customDataMessage( element, rule.method ),\n\n\t\t\t\t\t// 'title' is never undefined, so handle empty string as undefined\n\t\t\t\t\t!this.settings.ignoreTitle && element.title || undefined,\n\t\t\t\t\t$.validator.messages[ rule.method ],\n\t\t\t\t\t\"<strong>Warning: No message defined for \" + element.name + \"</strong>\"\n\t\t\t\t),\n\t\t\t\ttheregex = /\\$?\\{(\\d+)\\}/g;\n\t\t\tif ( typeof message === \"function\" ) {\n\t\t\t\tmessage = message.call( this, rule.parameters, element );\n\t\t\t} else if ( theregex.test( message ) ) {\n\t\t\t\tmessage = $.validator.format( message.replace( theregex, \"{$1}\" ), rule.parameters );\n\t\t\t}\n\n\t\t\treturn message;\n\t\t},\n\n\t\tformatAndAdd: function( element, rule ) {\n\t\t\tvar message = this.defaultMessage( element, rule );\n\n\t\t\tthis.errorList.push( {\n\t\t\t\tmessage: message,\n\t\t\t\telement: element,\n\t\t\t\tmethod: rule.method\n\t\t\t} );\n\n\t\t\tthis.errorMap[ element.name ] = message;\n\t\t\tthis.submitted[ element.name ] = message;\n\t\t},\n\n\t\taddWrapper: function( toToggle ) {\n\t\t\tif ( this.settings.wrapper ) {\n\t\t\t\ttoToggle = toToggle.add( toToggle.parent( this.settings.wrapper ) );\n\t\t\t}\n\t\t\treturn toToggle;\n\t\t},\n\n\t\tdefaultShowErrors: function() {\n\t\t\tvar i, elements, error;\n\t\t\tfor ( i = 0; this.errorList[ i ]; i++ ) {\n\t\t\t\terror = this.errorList[ i ];\n\t\t\t\tif ( this.settings.highlight ) {\n\t\t\t\t\tthis.settings.highlight.call( this, error.element, this.settings.errorClass, this.settings.validClass );\n\t\t\t\t}\n\t\t\t\tthis.showLabel( error.element, error.message );\n\t\t\t}\n\t\t\tif ( this.errorList.length ) {\n\t\t\t\tthis.toShow = this.toShow.add( this.containers );\n\t\t\t}\n\t\t\tif ( this.settings.success ) {\n\t\t\t\tfor ( i = 0; this.successList[ i ]; i++ ) {\n\t\t\t\t\tthis.showLabel( this.successList[ i ] );\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( this.settings.unhighlight ) {\n\t\t\t\tfor ( i = 0, elements = this.validElements(); elements[ i ]; i++ ) {\n\t\t\t\t\tthis.settings.unhighlight.call( this, elements[ i ], this.settings.errorClass, this.settings.validClass );\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.toHide = this.toHide.not( this.toShow );\n\t\t\tthis.hideErrors();\n\t\t\tthis.addWrapper( this.toShow ).show();\n\t\t},\n\n\t\tvalidElements: function() {\n\t\t\treturn this.currentElements.not( this.invalidElements() );\n\t\t},\n\n\t\tinvalidElements: function() {\n\t\t\treturn $( this.errorList ).map( function() {\n\t\t\t\treturn this.element;\n\t\t\t} );\n\t\t},\n\n\t\tshowLabel: function( element, message ) {\n\t\t\tvar place, group, errorID, v,\n\t\t\t\terror = this.errorsFor( element ),\n\t\t\t\telementID = this.idOrName( element ),\n\t\t\t\tdescribedBy = $( element ).attr( \"aria-describedby\" );\n\n\t\t\tif ( error.length ) {\n\n\t\t\t\t// Refresh error/success class\n\t\t\t\terror.removeClass( this.settings.validClass ).addClass( this.settings.errorClass );\n\n\t\t\t\t// Replace message on existing label\n\t\t\t\terror.html( message );\n\t\t\t} else {\n\n\t\t\t\t// Create error element\n\t\t\t\terror = $( \"<\" + this.settings.errorElement + \">\" )\n\t\t\t\t\t.attr( \"id\", elementID + \"-error\" )\n\t\t\t\t\t.addClass( this.settings.errorClass )\n\t\t\t\t\t.html( message || \"\" );\n\n\t\t\t\t// Maintain reference to the element to be placed into the DOM\n\t\t\t\tplace = error;\n\t\t\t\tif ( this.settings.wrapper ) {\n\n\t\t\t\t\t// Make sure the element is visible, even in IE\n\t\t\t\t\t// actually showing the wrapped element is handled elsewhere\n\t\t\t\t\tplace = error.hide().show().wrap( \"<\" + this.settings.wrapper + \"/>\" ).parent();\n\t\t\t\t}\n\t\t\t\tif ( this.labelContainer.length ) {\n\t\t\t\t\tthis.labelContainer.append( place );\n\t\t\t\t} else if ( this.settings.errorPlacement ) {\n\t\t\t\t\tthis.settings.errorPlacement.call( this, place, $( element ) );\n\t\t\t\t} else {\n\t\t\t\t\tplace.insertAfter( element );\n\t\t\t\t}\n\n\t\t\t\t// Link error back to the element\n\t\t\t\tif ( error.is( \"label\" ) ) {\n\n\t\t\t\t\t// If the error is a label, then associate using 'for'\n\t\t\t\t\terror.attr( \"for\", elementID );\n\n\t\t\t\t\t// If the element is not a child of an associated label, then it's necessary\n\t\t\t\t\t// to explicitly apply aria-describedby\n\t\t\t\t} else if ( error.parents( \"label[for='\" + this.escapeCssMeta( elementID ) + \"']\" ).length === 0 ) {\n\t\t\t\t\terrorID = error.attr( \"id\" );\n\n\t\t\t\t\t// Respect existing non-error aria-describedby\n\t\t\t\t\tif ( !describedBy ) {\n\t\t\t\t\t\tdescribedBy = errorID;\n\t\t\t\t\t} else if ( !describedBy.match( new RegExp( \"\\\\b\" + this.escapeCssMeta( errorID ) + \"\\\\b\" ) ) ) {\n\n\t\t\t\t\t\t// Add to end of list if not already present\n\t\t\t\t\t\tdescribedBy += \" \" + errorID;\n\t\t\t\t\t}\n\t\t\t\t\t$( element ).attr( \"aria-describedby\", describedBy );\n\n\t\t\t\t\t// If this element is grouped, then assign to all elements in the same group\n\t\t\t\t\tgroup = this.groups[ element.name ];\n\t\t\t\t\tif ( group ) {\n\t\t\t\t\t\tv = this;\n\t\t\t\t\t\t$.each( v.groups, function( name, testgroup ) {\n\t\t\t\t\t\t\tif ( testgroup === group ) {\n\t\t\t\t\t\t\t\t$( \"[name='\" + v.escapeCssMeta( name ) + \"']\", v.currentForm )\n\t\t\t\t\t\t\t\t\t.attr( \"aria-describedby\", error.attr( \"id\" ) );\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}\n\t\t\t}\n\t\t\tif ( !message && this.settings.success ) {\n\t\t\t\terror.text( \"\" );\n\t\t\t\tif ( typeof this.settings.success === \"string\" ) {\n\t\t\t\t\terror.addClass( this.settings.success );\n\t\t\t\t} else {\n\t\t\t\t\tthis.settings.success( error, element );\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.toShow = this.toShow.add( error );\n\t\t},\n\n\t\terrorsFor: function( element ) {\n\t\t\tvar name = this.escapeCssMeta( this.idOrName( element ) ),\n\t\t\t\tdescriber = $( element ).attr( \"aria-describedby\" ),\n\t\t\t\tselector = \"label[for='\" + name + \"'], label[for='\" + name + \"'] *\";\n\n\t\t\t// 'aria-describedby' should directly reference the error element\n\t\t\tif ( describer ) {\n\t\t\t\tselector = selector + \", #\" + this.escapeCssMeta( describer )\n\t\t\t\t\t.replace( /\\s+/g, \", #\" );\n\t\t\t}\n\n\t\t\treturn this\n\t\t\t\t.errors()\n\t\t\t\t.filter( selector );\n\t\t},\n\n\t\t// See https://api.jquery.com/category/selectors/, for CSS\n\t\t// meta-characters that should be escaped in order to be used with JQuery\n\t\t// as a literal part of a name/id or any selector.\n\t\tescapeCssMeta: function( string ) {\n\t\t\treturn string.replace( /([\\\\!\"#$%&'()*+,./:;<=>?@\\[\\]^`{|}~])/g, \"\\\\$1\" );\n\t\t},\n\n\t\tidOrName: function( element ) {\n\t\t\treturn this.groups[ element.name ] || ( this.checkable( element ) ? element.name : element.id || element.name );\n\t\t},\n\n\t\tvalidationTargetFor: function( element ) {\n\n\t\t\t// If radio/checkbox, validate first element in group instead\n\t\t\tif ( this.checkable( element ) ) {\n\t\t\t\telement = this.findByName( element.name );\n\t\t\t}\n\n\t\t\t// Always apply ignore filter\n\t\t\treturn $( element ).not( this.settings.ignore )[ 0 ];\n\t\t},\n\n\t\tcheckable: function( element ) {\n\t\t\treturn ( /radio|checkbox/i ).test( element.type );\n\t\t},\n\n\t\tfindByName: function( name ) {\n\t\t\treturn $( this.currentForm ).find( \"[name='\" + this.escapeCssMeta( name ) + \"']\" );\n\t\t},\n\n\t\tgetLength: function( value, element ) {\n\t\t\tswitch ( element.nodeName.toLowerCase() ) {\n\t\t\tcase \"select\":\n\t\t\t\treturn $( \"option:selected\", element ).length;\n\t\t\tcase \"input\":\n\t\t\t\tif ( this.checkable( element ) ) {\n\t\t\t\t\treturn this.findByName( element.name ).filter( \":checked\" ).length;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn value.length;\n\t\t},\n\n\t\tdepend: function( param, element ) {\n\t\t\treturn this.dependTypes[ typeof param ] ? this.dependTypes[ typeof param ]( param, element ) : true;\n\t\t},\n\n\t\tdependTypes: {\n\t\t\t\"boolean\": function( param ) {\n\t\t\t\treturn param;\n\t\t\t},\n\t\t\t\"string\": function( param, element ) {\n\t\t\t\treturn !!$( param, element.form ).length;\n\t\t\t},\n\t\t\t\"function\": function( param, element ) {\n\t\t\t\treturn param( element );\n\t\t\t}\n\t\t},\n\n\t\toptional: function( element ) {\n\t\t\tvar val = this.elementValue( element );\n\t\t\treturn !$.validator.methods.required.call( this, val, element ) && \"dependency-mismatch\";\n\t\t},\n\n\t\tstartRequest: function( element ) {\n\t\t\tif ( !this.pending[ element.name ] ) {\n\t\t\t\tthis.pendingRequest++;\n\t\t\t\t$( element ).addClass( this.settings.pendingClass );\n\t\t\t\tthis.pending[ element.name ] = true;\n\t\t\t}\n\t\t},\n\n\t\tstopRequest: function( element, valid ) {\n\t\t\tthis.pendingRequest--;\n\n\t\t\t// Sometimes synchronization fails, make sure pendingRequest is never < 0\n\t\t\tif ( this.pendingRequest < 0 ) {\n\t\t\t\tthis.pendingRequest = 0;\n\t\t\t}\n\t\t\tdelete this.pending[ element.name ];\n\t\t\t$( element ).removeClass( this.settings.pendingClass );\n\t\t\tif ( valid && this.pendingRequest === 0 && this.formSubmitted && this.form() ) {\n\t\t\t\t$( this.currentForm ).submit();\n\n\t\t\t\t// Remove the hidden input that was used as a replacement for the\n\t\t\t\t// missing submit button. The hidden input is added by `handle()`\n\t\t\t\t// to ensure that the value of the used submit button is passed on\n\t\t\t\t// for scripted submits triggered by this method\n\t\t\t\tif ( this.submitButton ) {\n\t\t\t\t\t$( \"input:hidden[name='\" + this.submitButton.name + \"']\", this.currentForm ).remove();\n\t\t\t\t}\n\n\t\t\t\tthis.formSubmitted = false;\n\t\t\t} else if ( !valid && this.pendingRequest === 0 && this.formSubmitted ) {\n\t\t\t\t$( this.currentForm ).triggerHandler( \"invalid-form\", [ this ] );\n\t\t\t\tthis.formSubmitted = false;\n\t\t\t}\n\t\t},\n\n\t\tpreviousValue: function( element, method ) {\n\t\t\tmethod = typeof method === \"string\" && method || \"remote\";\n\n\t\t\treturn $.data( element, \"previousValue\" ) || $.data( element, \"previousValue\", {\n\t\t\t\told: null,\n\t\t\t\tvalid: true,\n\t\t\t\tmessage: this.defaultMessage( element, { method: method } )\n\t\t\t} );\n\t\t},\n\n\t\t// Cleans up all forms and elements, removes validator-specific events\n\t\tdestroy: function() {\n\t\t\tthis.resetForm();\n\n\t\t\t$( this.currentForm )\n\t\t\t\t.off( \".validate\" )\n\t\t\t\t.removeData( \"validator\" )\n\t\t\t\t.find( \".validate-equalTo-blur\" )\n\t\t\t\t\t.off( \".validate-equalTo\" )\n\t\t\t\t\t.removeClass( \"validate-equalTo-blur\" )\n\t\t\t\t.find( \".validate-lessThan-blur\" )\n\t\t\t\t\t.off( \".validate-lessThan\" )\n\t\t\t\t\t.removeClass( \"validate-lessThan-blur\" )\n\t\t\t\t.find( \".validate-lessThanEqual-blur\" )\n\t\t\t\t\t.off( \".validate-lessThanEqual\" )\n\t\t\t\t\t.removeClass( \"validate-lessThanEqual-blur\" )\n\t\t\t\t.find( \".validate-greaterThanEqual-blur\" )\n\t\t\t\t\t.off( \".validate-greaterThanEqual\" )\n\t\t\t\t\t.removeClass( \"validate-greaterThanEqual-blur\" )\n\t\t\t\t.find( \".validate-greaterThan-blur\" )\n\t\t\t\t\t.off( \".validate-greaterThan\" )\n\t\t\t\t\t.removeClass( \"validate-greaterThan-blur\" );\n\t\t}\n\n\t},\n\n\tclassRuleSettings: {\n\t\trequired: { required: true },\n\t\temail: { email: true },\n\t\turl: { url: true },\n\t\tdate: { date: true },\n\t\tdateISO: { dateISO: true },\n\t\tnumber: { number: true },\n\t\tdigits: { digits: true },\n\t\tcreditcard: { creditcard: true }\n\t},\n\n\taddClassRules: function( className, rules ) {\n\t\tif ( className.constructor === String ) {\n\t\t\tthis.classRuleSettings[ className ] = rules;\n\t\t} else {\n\t\t\t$.extend( this.classRuleSettings, className );\n\t\t}\n\t},\n\n\tclassRules: function( element ) {\n\t\tvar rules = {},\n\t\t\tclasses = $( element ).attr( \"class\" );\n\n\t\tif ( classes ) {\n\t\t\t$.each( classes.split( \" \" ), function() {\n\t\t\t\tif ( this in $.validator.classRuleSettings ) {\n\t\t\t\t\t$.extend( rules, $.validator.classRuleSettings[ this ] );\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\t\treturn rules;\n\t},\n\n\tnormalizeAttributeRule: function( rules, type, method, value ) {\n\n\t\t// Convert the value to a number for number inputs, and for text for backwards compability\n\t\t// allows type=\"date\" and others to be compared as strings\n\t\tif ( /min|max|step/.test( method ) && ( type === null || /number|range|text/.test( type ) ) ) {\n\t\t\tvalue = Number( value );\n\n\t\t\t// Support Opera Mini, which returns NaN for undefined minlength\n\t\t\tif ( isNaN( value ) ) {\n\t\t\t\tvalue = undefined;\n\t\t\t}\n\t\t}\n\n\t\tif ( value || value === 0 ) {\n\t\t\trules[ method ] = value;\n\t\t} else if ( type === method && type !== \"range\" ) {\n\n\t\t\t// Exception: the jquery validate 'range' method\n\t\t\t// does not test for the html5 'range' type\n\t\t\trules[ method ] = true;\n\t\t}\n\t},\n\n\tattributeRules: function( element ) {\n\t\tvar rules = {},\n\t\t\t$element = $( element ),\n\t\t\ttype = element.getAttribute( \"type\" ),\n\t\t\tmethod, value;\n\n\t\tfor ( method in $.validator.methods ) {\n\n\t\t\t// Support for <input required> in both html5 and older browsers\n\t\t\tif ( method === \"required\" ) {\n\t\t\t\tvalue = element.getAttribute( method );\n\n\t\t\t\t// Some browsers return an empty string for the required attribute\n\t\t\t\t// and non-HTML5 browsers might have required=\"\" markup\n\t\t\t\tif ( value === \"\" ) {\n\t\t\t\t\tvalue = true;\n\t\t\t\t}\n\n\t\t\t\t// Force non-HTML5 browsers to return bool\n\t\t\t\tvalue = !!value;\n\t\t\t} else {\n\t\t\t\tvalue = $element.attr( method );\n\t\t\t}\n\n\t\t\tthis.normalizeAttributeRule( rules, type, method, value );\n\t\t}\n\n\t\t// 'maxlength' may be returned as -1, 2147483647 ( IE ) and 524288 ( safari ) for text inputs\n\t\tif ( rules.maxlength && /-1|2147483647|524288/.test( rules.maxlength ) ) {\n\t\t\tdelete rules.maxlength;\n\t\t}\n\n\t\treturn rules;\n\t},\n\n\tdataRules: function( element ) {\n\t\tvar rules = {},\n\t\t\t$element = $( element ),\n\t\t\ttype = element.getAttribute( \"type\" ),\n\t\t\tmethod, value;\n\n\t\tfor ( method in $.validator.methods ) {\n\t\t\tvalue = $element.data( \"rule\" + method.charAt( 0 ).toUpperCase() + method.substring( 1 ).toLowerCase() );\n\n\t\t\t// Cast empty attributes like `data-rule-required` to `true`\n\t\t\tif ( value === \"\" ) {\n\t\t\t\tvalue = true;\n\t\t\t}\n\n\t\t\tthis.normalizeAttributeRule( rules, type, method, value );\n\t\t}\n\t\treturn rules;\n\t},\n\n\tstaticRules: function( element ) {\n\t\tvar rules = {},\n\t\t\tvalidator = $.data( element.form, \"validator\" );\n\n\t\tif ( validator.settings.rules ) {\n\t\t\trules = $.validator.normalizeRule( validator.settings.rules[ element.name ] ) || {};\n\t\t}\n\t\treturn rules;\n\t},\n\n\tnormalizeRules: function( rules, element ) {\n\n\t\t// Handle dependency check\n\t\t$.each( rules, function( prop, val ) {\n\n\t\t\t// Ignore rule when param is explicitly false, eg. required:false\n\t\t\tif ( val === false ) {\n\t\t\t\tdelete rules[ prop ];\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif ( val.param || val.depends ) {\n\t\t\t\tvar keepRule = true;\n\t\t\t\tswitch ( typeof val.depends ) {\n\t\t\t\tcase \"string\":\n\t\t\t\t\tkeepRule = !!$( val.depends, element.form ).length;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"function\":\n\t\t\t\t\tkeepRule = val.depends.call( element, element );\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif ( keepRule ) {\n\t\t\t\t\trules[ prop ] = val.param !== undefined ? val.param : true;\n\t\t\t\t} else {\n\t\t\t\t\t$.data( element.form, \"validator\" ).resetElements( $( element ) );\n\t\t\t\t\tdelete rules[ prop ];\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\n\t\t// Evaluate parameters\n\t\t$.each( rules, function( rule, parameter ) {\n\t\t\trules[ rule ] = typeof parameter === \"function\" && rule !== \"normalizer\" ? parameter( element ) : parameter;\n\t\t} );\n\n\t\t// Clean number parameters\n\t\t$.each( [ \"minlength\", \"maxlength\" ], function() {\n\t\t\tif ( rules[ this ] ) {\n\t\t\t\trules[ this ] = Number( rules[ this ] );\n\t\t\t}\n\t\t} );\n\t\t$.each( [ \"rangelength\", \"range\" ], function() {\n\t\t\tvar parts;\n\t\t\tif ( rules[ this ] ) {\n\t\t\t\tif ( Array.isArray( rules[ this ] ) ) {\n\t\t\t\t\trules[ this ] = [ Number( rules[ this ][ 0 ] ), Number( rules[ this ][ 1 ] ) ];\n\t\t\t\t} else if ( typeof rules[ this ] === \"string\" ) {\n\t\t\t\t\tparts = rules[ this ].replace( /[\\[\\]]/g, \"\" ).split( /[\\s,]+/ );\n\t\t\t\t\trules[ this ] = [ Number( parts[ 0 ] ), Number( parts[ 1 ] ) ];\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\n\t\tif ( $.validator.autoCreateRanges ) {\n\n\t\t\t// Auto-create ranges\n\t\t\tif ( rules.min != null && rules.max != null ) {\n\t\t\t\trules.range = [ rules.min, rules.max ];\n\t\t\t\tdelete rules.min;\n\t\t\t\tdelete rules.max;\n\t\t\t}\n\t\t\tif ( rules.minlength != null && rules.maxlength != null ) {\n\t\t\t\trules.rangelength = [ rules.minlength, rules.maxlength ];\n\t\t\t\tdelete rules.minlength;\n\t\t\t\tdelete rules.maxlength;\n\t\t\t}\n\t\t}\n\n\t\treturn rules;\n\t},\n\n\t// Converts a simple string to a {string: true} rule, e.g., \"required\" to {required:true}\n\tnormalizeRule: function( data ) {\n\t\tif ( typeof data === \"string\" ) {\n\t\t\tvar transformed = {};\n\t\t\t$.each( data.split( /\\s/ ), function() {\n\t\t\t\ttransformed[ this ] = true;\n\t\t\t} );\n\t\t\tdata = transformed;\n\t\t}\n\t\treturn data;\n\t},\n\n\t// https://jqueryvalidation.org/jQuery.validator.addMethod/\n\taddMethod: function( name, method, message ) {\n\t\t$.validator.methods[ name ] = method;\n\t\t$.validator.messages[ name ] = message !== undefined ? message : $.validator.messages[ name ];\n\t\tif ( method.length < 3 ) {\n\t\t\t$.validator.addClassRules( name, $.validator.normalizeRule( name ) );\n\t\t}\n\t},\n\n\t// https://jqueryvalidation.org/jQuery.validator.methods/\n\tmethods: {\n\n\t\t// https://jqueryvalidation.org/required-method/\n\t\trequired: function( value, element, param ) {\n\n\t\t\t// Check if dependency is met\n\t\t\tif ( !this.depend( param, element ) ) {\n\t\t\t\treturn \"dependency-mismatch\";\n\t\t\t}\n\t\t\tif ( element.nodeName.toLowerCase() === \"select\" ) {\n\n\t\t\t\t// Could be an array for select-multiple or a string, both are fine this way\n\t\t\t\tvar val = $( element ).val();\n\t\t\t\treturn val && val.length > 0;\n\t\t\t}\n\t\t\tif ( this.checkable( element ) ) {\n\t\t\t\treturn this.getLength( value, element ) > 0;\n\t\t\t}\n\t\t\treturn value !== undefined && value !== null && value.length > 0;\n\t\t},\n\n\t\t// https://jqueryvalidation.org/email-method/\n\t\temail: function( value, element ) {\n\n\t\t\t// From https://html.spec.whatwg.org/multipage/forms.html#valid-e-mail-address\n\t\t\t// Retrieved 2014-01-14\n\t\t\t// If you have a problem with this implementation, report a bug against the above spec\n\t\t\t// Or use custom methods to implement your own email validation\n\t\t\treturn this.optional( element ) || /^[a-zA-Z0-9.!#$%&'*+\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test( value );\n\t\t},\n\n\t\t// https://jqueryvalidation.org/url-method/\n\t\turl: function( value, element ) {\n\n\t\t\t// Copyright (c) 2010-2013 Diego Perini, MIT licensed\n\t\t\t// https://gist.github.com/dperini/729294\n\t\t\t// see also https://mathiasbynens.be/demo/url-regex\n\t\t\t// modified to allow protocol-relative URLs\n\t\t\treturn this.optional( element ) || /^(?:(?:(?:https?|ftp):)?\\/\\/)(?:\\S+(?::\\S*)?@)?(?:(?!(?:10|127)(?:\\.\\d{1,3}){3})(?!(?:169\\.254|192\\.168)(?:\\.\\d{1,3}){2})(?!172\\.(?:1[6-9]|2\\d|3[0-1])(?:\\.\\d{1,3}){2})(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z0-9\\u00a1-\\uffff][a-z0-9\\u00a1-\\uffff_-]{0,62})?[a-z0-9\\u00a1-\\uffff]\\.)+(?:[a-z\\u00a1-\\uffff]{2,}\\.?))(?::\\d{2,5})?(?:[/?#]\\S*)?$/i.test( value );\n\t\t},\n\n\t\t// https://jqueryvalidation.org/date-method/\n\t\tdate: ( function() {\n\t\t\tvar called = false;\n\n\t\t\treturn function( value, element ) {\n\t\t\t\tif ( !called ) {\n\t\t\t\t\tcalled = true;\n\t\t\t\t\tif ( this.settings.debug && window.console ) {\n\t\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t\t\"The `date` method is deprecated and will be removed in version '2.0.0'.\\n\" +\n\t\t\t\t\t\t\t\"Please don't use it, since it relies on the Date constructor, which\\n\" +\n\t\t\t\t\t\t\t\"behaves very differently across browsers and locales. Use `dateISO`\\n\" +\n\t\t\t\t\t\t\t\"instead or one of the locale specific methods in `localizations/`\\n\" +\n\t\t\t\t\t\t\t\"and `additional-methods.js`.\"\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn this.optional( element ) || !/Invalid|NaN/.test( new Date( value ).toString() );\n\t\t\t};\n\t\t}() ),\n\n\t\t// https://jqueryvalidation.org/dateISO-method/\n\t\tdateISO: function( value, element ) {\n\t\t\treturn this.optional( element ) || /^\\d{4}[\\/\\-](0?[1-9]|1[012])[\\/\\-](0?[1-9]|[12][0-9]|3[01])$/.test( value );\n\t\t},\n\n\t\t// https://jqueryvalidation.org/number-method/\n\t\tnumber: function( value, element ) {\n\t\t\treturn this.optional( element ) || /^(?:-?\\d+|-?\\d{1,3}(?:,\\d{3})+)?(?:\\.\\d+)?$/.test( value );\n\t\t},\n\n\t\t// https://jqueryvalidation.org/digits-method/\n\t\tdigits: function( value, element ) {\n\t\t\treturn this.optional( element ) || /^\\d+$/.test( value );\n\t\t},\n\n\t\t// https://jqueryvalidation.org/minlength-method/\n\t\tminlength: function( value, element, param ) {\n\t\t\tvar length = Array.isArray( value ) ? value.length : this.getLength( value, element );\n\t\t\treturn this.optional( element ) || length >= param;\n\t\t},\n\n\t\t// https://jqueryvalidation.org/maxlength-method/\n\t\tmaxlength: function( value, element, param ) {\n\t\t\tvar length = Array.isArray( value ) ? value.length : this.getLength( value, element );\n\t\t\treturn this.optional( element ) || length <= param;\n\t\t},\n\n\t\t// https://jqueryvalidation.org/rangelength-method/\n\t\trangelength: function( value, element, param ) {\n\t\t\tvar length = Array.isArray( value ) ? value.length : this.getLength( value, element );\n\t\t\treturn this.optional( element ) || ( length >= param[ 0 ] && length <= param[ 1 ] );\n\t\t},\n\n\t\t// https://jqueryvalidation.org/min-method/\n\t\tmin: function( value, element, param ) {\n\t\t\treturn this.optional( element ) || value >= param;\n\t\t},\n\n\t\t// https://jqueryvalidation.org/max-method/\n\t\tmax: function( value, element, param ) {\n\t\t\treturn this.optional( element ) || value <= param;\n\t\t},\n\n\t\t// https://jqueryvalidation.org/range-method/\n\t\trange: function( value, element, param ) {\n\t\t\treturn this.optional( element ) || ( value >= param[ 0 ] && value <= param[ 1 ] );\n\t\t},\n\n\t\t// https://jqueryvalidation.org/step-method/\n\t\tstep: function( value, element, param ) {\n\t\t\tvar type = $( element ).attr( \"type\" ),\n\t\t\t\terrorMessage = \"Step attribute on input type \" + type + \" is not supported.\",\n\t\t\t\tsupportedTypes = [ \"text\", \"number\", \"range\" ],\n\t\t\t\tre = new RegExp( \"\\\\b\" + type + \"\\\\b\" ),\n\t\t\t\tnotSupported = type && !re.test( supportedTypes.join() ),\n\t\t\t\tdecimalPlaces = function( num ) {\n\t\t\t\t\tvar match = ( \"\" + num ).match( /(?:\\.(\\d+))?$/ );\n\t\t\t\t\tif ( !match ) {\n\t\t\t\t\t\treturn 0;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Number of digits right of decimal point.\n\t\t\t\t\treturn match[ 1 ] ? match[ 1 ].length : 0;\n\t\t\t\t},\n\t\t\t\ttoInt = function( num ) {\n\t\t\t\t\treturn Math.round( num * Math.pow( 10, decimals ) );\n\t\t\t\t},\n\t\t\t\tvalid = true,\n\t\t\t\tdecimals;\n\n\t\t\t// Works only for text, number and range input types\n\t\t\t// TODO find a way to support input types date, datetime, datetime-local, month, time and week\n\t\t\tif ( notSupported ) {\n\t\t\t\tthrow new Error( errorMessage );\n\t\t\t}\n\n\t\t\tdecimals = decimalPlaces( param );\n\n\t\t\t// Value can't have too many decimals\n\t\t\tif ( decimalPlaces( value ) > decimals || toInt( value ) % toInt( param ) !== 0 ) {\n\t\t\t\tvalid = false;\n\t\t\t}\n\n\t\t\treturn this.optional( element ) || valid;\n\t\t},\n\n\t\t// https://jqueryvalidation.org/equalTo-method/\n\t\tequalTo: function( value, element, param ) {\n\n\t\t\t// Bind to the blur event of the target in order to revalidate whenever the target field is updated\n\t\t\tvar target = $( param );\n\t\t\tif ( this.settings.onfocusout && target.not( \".validate-equalTo-blur\" ).length ) {\n\t\t\t\ttarget.addClass( \"validate-equalTo-blur\" ).on( \"blur.validate-equalTo\", function() {\n\t\t\t\t\t$( element ).valid();\n\t\t\t\t} );\n\t\t\t}\n\t\t\treturn value === target.val();\n\t\t},\n\n\t\t// https://jqueryvalidation.org/remote-method/\n\t\tremote: function( value, element, param, method ) {\n\t\t\tif ( this.optional( element ) ) {\n\t\t\t\treturn \"dependency-mismatch\";\n\t\t\t}\n\n\t\t\tmethod = typeof method === \"string\" && method || \"remote\";\n\n\t\t\tvar previous = this.previousValue( element, method ),\n\t\t\t\tvalidator, data, optionDataString;\n\n\t\t\tif ( !this.settings.messages[ element.name ] ) {\n\t\t\t\tthis.settings.messages[ element.name ] = {};\n\t\t\t}\n\t\t\tprevious.originalMessage = previous.originalMessage || this.settings.messages[ element.name ][ method ];\n\t\t\tthis.settings.messages[ element.name ][ method ] = previous.message;\n\n\t\t\tparam = typeof param === \"string\" && { url: param } || param;\n\t\t\toptionDataString = $.param( $.extend( { data: value }, param.data ) );\n\t\t\tif ( previous.old === optionDataString ) {\n\t\t\t\treturn previous.valid;\n\t\t\t}\n\n\t\t\tprevious.old = optionDataString;\n\t\t\tvalidator = this;\n\t\t\tthis.startRequest( element );\n\t\t\tdata = {};\n\t\t\tdata[ element.name ] = value;\n\t\t\t$.ajax( $.extend( true, {\n\t\t\t\tmode: \"abort\",\n\t\t\t\tport: \"validate\" + element.name,\n\t\t\t\tdataType: \"json\",\n\t\t\t\tdata: data,\n\t\t\t\tcontext: validator.currentForm,\n\t\t\t\tsuccess: function( response ) {\n\t\t\t\t\tvar valid = response === true || response === \"true\",\n\t\t\t\t\t\terrors, message, submitted;\n\n\t\t\t\t\tvalidator.settings.messages[ element.name ][ method ] = previous.originalMessage;\n\t\t\t\t\tif ( valid ) {\n\t\t\t\t\t\tsubmitted = validator.formSubmitted;\n\t\t\t\t\t\tvalidator.resetInternals();\n\t\t\t\t\t\tvalidator.toHide = validator.errorsFor( element );\n\t\t\t\t\t\tvalidator.formSubmitted = submitted;\n\t\t\t\t\t\tvalidator.successList.push( element );\n\t\t\t\t\t\tvalidator.invalid[ element.name ] = false;\n\t\t\t\t\t\tvalidator.showErrors();\n\t\t\t\t\t} else {\n\t\t\t\t\t\terrors = {};\n\t\t\t\t\t\tmessage = response || validator.defaultMessage( element, { method: method, parameters: value } );\n\t\t\t\t\t\terrors[ element.name ] = previous.message = message;\n\t\t\t\t\t\tvalidator.invalid[ element.name ] = true;\n\t\t\t\t\t\tvalidator.showErrors( errors );\n\t\t\t\t\t}\n\t\t\t\t\tprevious.valid = valid;\n\t\t\t\t\tvalidator.stopRequest( element, valid );\n\t\t\t\t}\n\t\t\t}, param ) );\n\t\t\treturn \"pending\";\n\t\t}\n\t}\n\n} );\n\r\n// Ajax mode: abort\n// usage: $.ajax({ mode: \"abort\"[, port: \"uniqueport\"]});\n// if mode:\"abort\" is used, the previous request on that port (port can be undefined) is aborted via XMLHttpRequest.abort()\n\nvar pendingRequests = {},\n\tajax;\n\n// Use a prefilter if available (1.5+)\nif ( $.ajaxPrefilter ) {\n\t$.ajaxPrefilter( function( settings, _, xhr ) {\n\t\tvar port = settings.port;\n\t\tif ( settings.mode === \"abort\" ) {\n\t\t\tif ( pendingRequests[ port ] ) {\n\t\t\t\tpendingRequests[ port ].abort();\n\t\t\t}\n\t\t\tpendingRequests[ port ] = xhr;\n\t\t}\n\t} );\n} else {\n\n\t// Proxy ajax\n\tajax = $.ajax;\n\t$.ajax = function( settings ) {\n\t\tvar mode = ( \"mode\" in settings ? settings : $.ajaxSettings ).mode,\n\t\t\tport = ( \"port\" in settings ? settings : $.ajaxSettings ).port;\n\t\tif ( mode === \"abort\" ) {\n\t\t\tif ( pendingRequests[ port ] ) {\n\t\t\t\tpendingRequests[ port ].abort();\n\t\t\t}\n\t\t\tpendingRequests[ port ] = ajax.apply( this, arguments );\n\t\t\treturn pendingRequests[ port ];\n\t\t}\n\t\treturn ajax.apply( this, arguments );\n\t};\n}\nreturn $;\r\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 * Lazy Load - JavaScript plugin for lazy loading images\n *\n * Copyright (c) 2007-2019 Mika Tuupola\n *\n * Licensed under the MIT license:\n *   http://www.opensource.org/licenses/mit-license.php\n *\n * Project home:\n *   https://appelsiini.net/projects/lazyload\n *\n * Version: 2.0.0-rc.2\n *\n */\n\n(function (root, factory) {\n    if (typeof exports === \"object\") {\n        module.exports = factory(root);\n    } else if (typeof define === \"function\" && define.amd) {\n        define([], factory);\n    } else {\n        root.LazyLoad = factory(root);\n    }\n}) (typeof global !== \"undefined\" ? global : this.window || this.global, function (root) {\n\n    \"use strict\";\n\n    if (typeof define === \"function\" && define.amd){\n        root = window;\n    }\n\n    const defaults = {\n        src: \"data-src\",\n        srcset: \"data-srcset\",\n        selector: \".lazyload\",\n        root: null,\n        rootMargin: \"0px\",\n        threshold: 0\n    };\n\n    /**\n    * Merge two or more objects. Returns a new object.\n    * @private\n    * @param {Boolean}  deep     If true, do a deep (or recursive) merge [optional]\n    * @param {Object}   objects  The objects to merge together\n    * @returns {Object}          Merged values of defaults and options\n    */\n    const extend = function ()  {\n\n        let extended = {};\n        let deep = false;\n        let i = 0;\n        let length = arguments.length;\n\n        /* Check if a deep merge */\n        if (Object.prototype.toString.call(arguments[0]) === \"[object Boolean]\") {\n            deep = arguments[0];\n            i++;\n        }\n\n        /* Merge the object into the extended object */\n        let merge = function (obj) {\n            for (let prop in obj) {\n                if (Object.prototype.hasOwnProperty.call(obj, prop)) {\n                    /* If deep merge and property is an object, merge properties */\n                    if (deep && Object.prototype.toString.call(obj[prop]) === \"[object Object]\") {\n                        extended[prop] = extend(true, extended[prop], obj[prop]);\n                    } else {\n                        extended[prop] = obj[prop];\n                    }\n                }\n            }\n        };\n\n        /* Loop through each object and conduct a merge */\n        for (; i < length; i++) {\n            let obj = arguments[i];\n            merge(obj);\n        }\n\n        return extended;\n    };\n\n    function LazyLoad(images, options) {\n        this.settings = extend(defaults, options || {});\n        this.images = images || document.querySelectorAll(this.settings.selector);\n        this.observer = null;\n        this.init();\n    }\n\n    LazyLoad.prototype = {\n        init: function() {\n\n            /* Without observers load everything and bail out early. */\n            if (!root.IntersectionObserver) {\n                this.loadImages();\n                return;\n            }\n\n            let self = this;\n            let observerConfig = {\n                root: this.settings.root,\n                rootMargin: this.settings.rootMargin,\n                threshold: [this.settings.threshold]\n            };\n\n            this.observer = new IntersectionObserver(function(entries) {\n                Array.prototype.forEach.call(entries, function (entry) {\n                    if (entry.isIntersecting) {\n                        self.observer.unobserve(entry.target);\n                        let src = entry.target.getAttribute(self.settings.src);\n                        let srcset = entry.target.getAttribute(self.settings.srcset);\n                        if (\"img\" === entry.target.tagName.toLowerCase()) {\n                            if (src) {\n                                entry.target.src = src;\n                            }\n                            if (srcset) {\n                                entry.target.srcset = srcset;\n                            }\n                        } else {\n                            entry.target.style.backgroundImage = \"url(\" + src + \")\";\n                        }\n                    }\n                });\n            }, observerConfig);\n\n            Array.prototype.forEach.call(this.images, function (image) {\n                self.observer.observe(image);\n            });\n        },\n\n        loadAndDestroy: function () {\n            if (!this.settings) { return; }\n            this.loadImages();\n            this.destroy();\n        },\n\n        loadImages: function () {\n            if (!this.settings) { return; }\n\n            let self = this;\n            Array.prototype.forEach.call(this.images, function (image) {\n                let src = image.getAttribute(self.settings.src);\n                let srcset = image.getAttribute(self.settings.srcset);\n                if (\"img\" === image.tagName.toLowerCase()) {\n                    if (src) {\n                        image.src = src;\n                    }\n                    if (srcset) {\n                        image.srcset = srcset;\n                    }\n                } else {\n                    image.style.backgroundImage = \"url('\" + src + \"')\";\n                }\n            });\n        },\n\n        destroy: function () {\n            if (!this.settings) { return; }\n            this.observer.disconnect();\n            this.settings = null;\n        }\n    };\n\n    root.lazyload = function(images, options) {\n        return new LazyLoad(images, options);\n    };\n\n    if (root.jQuery) {\n        const $ = root.jQuery;\n        $.fn.lazyload = function (options) {\n            options = options || {};\n            options.attribute = options.attribute || \"data-src\";\n            new LazyLoad($.makeArray(this), options);\n            return this;\n        };\n    }\n\n    return LazyLoad;\n});\n","jQuery.bind = function(object, method) {\r\n    var args = Array.prototype.slice.call(arguments, 2);\r\n    return function() {\r\n        var args2 = [this].concat(args, $.makeArray(arguments));\r\n        return method.apply(object, args2);\r\n    };\r\n};\r\n(function($) {\r\n    SexyLightbox = {\r\n        getOptions: function() {\r\n            return {\r\n                find: 'sexylightbox'\r\n            };\r\n        },\r\n        initialize: function(options) {\r\n\t\t\tthis.options = $.extend(this.getOptions(), options);\r\n\t\t\tthis.refresh();\r\n\t\t\teModal.setEModalOptions({\r\n\t\t\t\tloadingHtml: '<h5>Yükleniyor...</h5><div class=\"progress\"><div class=\"progress-bar progress-bar-striped active\" style=\"width: 100%\"></div></div><script>$(\"div.progress\").parent().css(\"height\", \"auto\");</script>',\r\n\t\t\t\ttitle: 'Bilgi'\r\n\t\t\t});\r\n\t\t\treturn;\r\n        },\r\n        hook: function(enlace) {\r\n            enlace = $(enlace);\r\n            enlace.trigger('blur');\r\n            this.show((enlace.attr(\"title\") || enlace.attr(\"name\") || \"\"), enlace.attr(\"href\"), (enlace.attr('rel') || false));\r\n        },\r\n        close: function() {\r\n            eModal.close();\r\n        },\r\n        refresh: function() {\r\n            var self = this;\r\n            this.anchors = [];\r\n            $(\"a, area\").each(function() {\r\n                if ($(this).attr('rel') && new RegExp(\"^\" + self.options.find).test($(this).attr('rel'))) {\r\n                    $(this).on('click', function(event) {\r\n                        event.preventDefault();\r\n                        self.hook(this);\r\n                    });\r\n                    $(this).on('contextmenu', function() {\r\n                        return false;\r\n                    });\r\n                    if (!($(this).attr('id') == self.options.name + \"-Left\" || $(this).attr('id') == self.options.name + \"-Right\")) {\r\n                        self.anchors.push(this);\r\n                    }\r\n                }\r\n            });\r\n\t\t\tif (window.PM) {\r\n\t\t\t\t(function(sexy){\r\n\t\t\t\t\twindow.PM.on(\"ready.iframe\", function(_window){\r\n\t\t\t\t\t\tif(!PM.IsMobile()) sexy.refreshBox(_window);\r\n\t\t\t\t\t});\r\n\t\t\t\t})(this);\r\n\t\t\t}\r\n        },\r\n        show: function(caption, url, rel, force) {\r\n            var baseURL = url.match(/(.+)?/)[1] || url;\r\n            var imageURL = /\\.(jpe?g|png|gif|bmp)/gi;\r\n            var queryString = url.match(/\\?(.+)/);\r\n            if (queryString) queryString = queryString[1];\r\n            var params = this.parseQuery(queryString);\r\n            params = $.extend({}, {\r\n                'width': 0,\r\n                'height': 0,\r\n                'modal': 1,\r\n                'background': '',\r\n                'title': caption\r\n            }, params || {});\r\n            params['width'] = parseInt(params['width']);\r\n            params['height'] = parseInt(params['height']);\r\n            params['modal'] = parseInt(params['modal']);\r\n            if (force == 'image' || baseURL.match(imageURL)) {\r\n                this.img = new Image();\r\n                eModal.alert(img, params.title);\r\n\t\t\t\tthis.img.onload = $.bind(this, function() {\r\n                    params['width'] = this.img.width;\r\n\t\t\t\t\tparams['height'] = this.img.height;\r\n                });\r\n                this.img.onerror = $.bind(this, function() {\r\n\t\t\t\t\tthis.show('', this.options.imagesdir + '/' + this.options.color + '/404.png', this.options.find);\r\n                });\r\n                this.img.src = url;\r\n            } else {\r\n                if (url.indexOf('TB_inline') != -1) {\r\n\t\t\t\t\teModal.alert($('#' + params['inlineId']).html(), params.title);\r\n                } else if (url.indexOf('TB_iframe') != -1) {\r\n                    var urlNoQuery = url.split('TB_');\r\n\t\t\t\t\tthis.showIframe(urlNoQuery[0], params);\r\n                } else {\r\n\t\t\t\t\t(function(sexy, params, url){\r\n\t\t\t\t\t\teModal\r\n\t\t\t\t\t\t\t.ajax({url: url, buttons: false, title: params.title})\r\n\t\t\t\t\t\t\t.then(function($modal){\r\n\t\t\t\t\t\t\t\tvar _window = $modal[0];\r\n\t\t\t\t\t\t\t\tparams[\"width\"] = params[\"width\"] + 30;\r\n\t\t\t\t\t\t\t\tparams[\"height\"] = params[\"height\"] + 30;\r\n\t\t\t\t\t\t\t\tsexy.refreshBox(_window, params);\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t})(this, params, url);\r\n                }\r\n            }\r\n        },\r\n\t\tresize: function(w, h, _modal) {\r\n\t\t\tvar _base = _modal || $(\"body\");\r\n\t\t\tif (w) _base.find(\".modal-dialog\").css(\"width\", w.toString() + \"px\");\r\n\t\t\tif (h) {\r\n\t\t\t\tif (_base.find(\".modal-dialog .modal-content iframe\").length > 0) return _base.find(\".modal-dialog .modal-content iframe\").css(\"height\", h + \"px\");\r\n\t\t\t\t_base.find(\".modal-dialog .modal-content div:eq(1)\").css(\"height\", h + \"px\");\r\n\t\t\t}\r\n\t\t},\r\n\t\trefreshBox: function(_window, params) {\r\n\t\t\tvar _base = _window.document || _window;\r\n\t\t\tif ($(_base).find(\"title, .baslik\").length > 0) {\r\n\t\t\t\tvar title = $(_base).find(\"title, .baslik\").first().text();\r\n\t\t\t\tthis.title(title);\r\n\t\t\t\t$(_base).find(\"title, .baslik\").remove();\r\n\t\t\t}\r\n\t\t\tif ($(_base).find(\".modal-footer\").length > 0) $(_base).find(\".modal-footer\").remove();\r\n\t\t\tvar size = {};\r\n\t\t\tif (params && params.width) size[\"width\"] = params.width;\r\n\t\t\tif (params && params.height) size[\"height\"] = params.height;\r\n\t\t\tif ($(_base).find(\"meta[name='modal-width']\")[0]) size[\"width\"] = parseInt($(_base).find(\"meta[name='modal-width']\").attr(\"content\"), 10);\r\n\t\t\tif ($(_base).find(\"meta[name='modal-height']\")[0]) size[\"height\"] = parseInt($(_base).find(\"meta[name='modal-height']\").attr(\"content\"), 10);\r\n\t\t\tthis.resize(size.width, size.height, _window.document ? undefined : $(_window));\r\n\t\t},\r\n\t\ttitle: function(_title) {\r\n\t\t\t$(\".modal-dialog .modal-title\").html(_title);\r\n\t\t},\r\n        showIframe: function(src, params) {\r\n\t\t\t(function(sexy, params, src){\r\n\t\t\t\teModal\r\n\t\t\t\t\t.iframe({url: src, title: params.title, buttons: false})\r\n\t\t\t\t\t.then(function(){\r\n                        var _iFrame = $(\"iframe[src='\" + src + \"']\");\r\n                        _iFrame.css(\"border-radius\", \"0 0 6px 6px\");\r\n\t\t\t\t\t\t_iFrame[0].contentWindow.parentIFrame = _iFrame[0];\r\n\t\t\t\t\t\t_iFrame[0].contentWindow.parentIFrameParams = params;\r\n\t\t\t\t\t});\r\n\t\t\t})(this, params, src);\r\n        },\r\n        parseQuery: function(query) {\r\n            if (!query)\r\n                return {};\r\n            var params = {};\r\n            var pairs = query.split(/[;&]/);\r\n            for (var i = 0; i < pairs.length; i++) {\r\n                var pair = pairs[i].split('=');\r\n                if (!pair || pair.length != 2)\r\n                    continue;\r\n                params[unescape(pair[0])] = unescape(pair[1]).replace(/\\+/g, ' ');\r\n            }\r\n            return params;\r\n        },\r\n        shake: function() {\r\n\t\t\tconsole.log(\"shake called\");\r\n\t\t\treturn;\r\n        },\r\n        boyutla: function(w, h) {\r\n\t\t\tconsole.log(arguments);\r\n\t\t\treturn;\r\n\t\t\tthis.resize(w, h);\r\n        }\r\n    }\r\n})(jQuery);","/*\r\n * jQuery Autocomplete plugin 1.2.3\r\n *\r\n * Copyright (c) 2009 Jörn Zaefferer\r\n *\r\n * Dual licensed under the MIT and GPL licenses:\r\n *   http://www.opensource.org/licenses/mit-license.php\r\n *   http://www.gnu.org/licenses/gpl.html\r\n *\r\n * With small modifications by Alfonso Gómez-Arzola.\r\n * See changelog for details.\r\n *\r\n */\r\n\r\n;(function($) {\r\n\r\n$.fn.extend({\r\n\tautocomplete: function(urlOrData, options) {\r\n\t\tvar isUrl = typeof urlOrData == \"string\";\r\n\t\toptions = $.extend({}, $.Autocompleter.defaults, {\r\n\t\t\turl: isUrl ? urlOrData : null,\r\n\t\t\tdata: isUrl ? null : urlOrData,\r\n\t\t\tdelay: isUrl ? $.Autocompleter.defaults.delay : 10,\r\n\t\t\tmax: options && !options.scroll ? 10 : 150,\r\n\t\t\tnoRecord: false\r\n\t\t}, options);\r\n\r\n\t\t// if highlight is set to false, replace it with a do-nothing function\r\n\t\toptions.highlight = options.highlight || function(value) { return value; };\r\n\r\n\t\t// if the formatMatch option is not specified, then use formatItem for backwards compatibility\r\n\t\toptions.formatMatch = options.formatMatch || options.formatItem;\r\n\r\n\t\treturn this.each(function() {\r\n\t\t\tnew $.Autocompleter(this, options);\r\n\t\t});\r\n\t},\r\n\tresult: function(handler) {\r\n\t\treturn this.on(\"result\", handler);\r\n\t},\r\n\tsearch: function(handler) {\r\n\t\treturn this.trigger(\"search\", [handler]);\r\n\t},\r\n\tflushCache: function() {\r\n\t\treturn this.trigger(\"flushCache\");\r\n\t},\r\n\tsetOptions: function(options){\r\n\t\treturn this.trigger(\"setOptions\", [options]);\r\n\t},\r\n\tunautocomplete: function() {\r\n\t\treturn this.trigger(\"unautocomplete\");\r\n\t}\r\n});\r\n\r\n$.Autocompleter = function(input, options) {\r\n\r\n\tvar KEY = {\r\n\t\tUP: 38,\r\n\t\tDOWN: 40,\r\n\t\tDEL: 46,\r\n\t\tTAB: 9,\r\n\t\tRETURN: 13,\r\n\t\tESC: 27,\r\n\t\tCOMMA: 188,\r\n\t\tPAGEUP: 33,\r\n\t\tPAGEDOWN: 34,\r\n\t\tBACKSPACE: 8\r\n\t};\r\n\r\n\tvar globalFailure = null;\r\n\tif(options.failure != null && typeof options.failure == \"function\") {\r\n\t  globalFailure = options.failure;\r\n\t}\r\n\r\n\t// Create $ object for input element\r\n\tvar $input = $(input).attr(\"autocomplete\", \"off\").addClass(options.inputClass);\r\n\r\n\tvar timeout;\r\n\tvar previousValue = \"\";\r\n\tvar cache = $.Autocompleter.Cache(options);\r\n\tvar hasFocus = 0;\r\n\tvar lastKeyPressCode;\r\n\tvar config = {\r\n\t\tmouseDownOnSelect: false\r\n\t};\r\n\tvar select = $.Autocompleter.Select(options, input, selectCurrent, config);\r\n\r\n\tvar blockSubmit;\r\n\r\n\t// prevent form submit in opera when selecting with return key\r\n  navigator.userAgent.indexOf(\"Opera\") != -1 && $(input.form).on(\"submit.autocomplete\", function() {\r\n\t\tif (blockSubmit) {\r\n\t\t\tblockSubmit = false;\r\n\t\t\treturn false;\r\n\t\t}\r\n\t});\r\n\r\n\t// older versions of opera don't trigger keydown multiple times while pressed, others don't work with keypress at all\r\n\t$input.on((navigator.userAgent.indexOf(\"Opera\") != -1 && !'KeyboardEvent' in window ? \"keypress\" : \"keydown\") + \".autocomplete\", function(event) {\r\n\t\t// a keypress means the input has focus\r\n\t\t// avoids issue where input had focus before the autocomplete was applied\r\n\t\thasFocus = 1;\r\n\t\t// track last key pressed\r\n\t\tlastKeyPressCode = event.keyCode;\r\n\t\tswitch(event.keyCode) {\r\n\r\n\t\t\tcase KEY.UP:\r\n\t\t\t\tif ( select.visible() ) {\r\n\t\t\t\t\tevent.preventDefault();\r\n\t\t\t\t\tselect.prev();\r\n\t\t\t\t} else {\r\n\t\t\t\t\tonChange(0, true);\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tcase KEY.DOWN:\r\n\t\t\t\tif ( select.visible() ) {\r\n\t\t\t\t\tevent.preventDefault();\r\n\t\t\t\t\tselect.next();\r\n\t\t\t\t} else {\r\n\t\t\t\t\tonChange(0, true);\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tcase KEY.PAGEUP:\r\n\t\t\t\tif ( select.visible() ) {\r\n  \t\t\t\tevent.preventDefault();\r\n\t\t\t\t\tselect.pageUp();\r\n\t\t\t\t} else {\r\n\t\t\t\t\tonChange(0, true);\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tcase KEY.PAGEDOWN:\r\n\t\t\t\tif ( select.visible() ) {\r\n  \t\t\t\tevent.preventDefault();\r\n\t\t\t\t\tselect.pageDown();\r\n\t\t\t\t} else {\r\n\t\t\t\t\tonChange(0, true);\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\r\n\t\t\t// matches also semicolon\r\n\t\t\tcase options.multiple && options.multipleSeparator.trim() == \",\" && KEY.COMMA:\r\n\t\t\tcase KEY.TAB:\r\n\t\t\tcase KEY.RETURN:\r\n\t\t\t\tif( selectCurrent() ) {\r\n\t\t\t\t\t// stop default to prevent a form submit, Opera needs special handling\r\n\t\t\t\t\tevent.preventDefault();\r\n\t\t\t\t\tblockSubmit = true;\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tcase KEY.ESC:\r\n\t\t\t\tselect.hide();\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tdefault:\r\n\t\t\t\tclearTimeout(timeout);\r\n\t\t\t\ttimeout = setTimeout(onChange, options.delay);\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t}).on('focus', function(){\r\n\t\t// track whether the field has focus, we shouldn't process any\r\n\t\t// results if the field no longer has focus\r\n\t\thasFocus++;\r\n\t}).on('blur', function() {\r\n\t  hasFocus = 0;\r\n\t\tif (!config.mouseDownOnSelect) {\r\n\t\t\thideResults();\r\n\t\t}\r\n\t}).on('click', function() {\r\n\t\t// show select when clicking in a focused field\r\n\t\t// but if clickFire is true, don't require field\r\n\t\t// to be focused to begin with; just show select\r\n\t\tif( options.clickFire ) {\r\n\t\t  if ( !select.visible() ) {\r\n  \t\t\tonChange(0, true);\r\n  \t\t}\r\n\t\t} else {\r\n\t\t  if ( hasFocus++ > 1 && !select.visible() ) {\r\n  \t\t\tonChange(0, true);\r\n  \t\t}\r\n\t\t}\r\n\t}).on(\"search\", function() {\r\n\t\t// TODO why not just specifying both arguments?\r\n\t\tvar fn = (arguments.length > 1) ? arguments[1] : null;\r\n\t\tfunction findValueCallback(q, data) {\r\n\t\t\tvar result;\r\n\t\t\tif( data && data.length ) {\r\n\t\t\t\tfor (var i=0; i < data.length; i++) {\r\n\t\t\t\t\tif( data[i].result.toLowerCase() == q.toLowerCase() ) {\r\n\t\t\t\t\t\tresult = data[i];\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif( typeof fn == \"function\" ) fn(result);\r\n\t\t\telse $input.trigger(\"result\", result && [result.data, result.value]);\r\n\t\t}\r\n\t\t$.each(trimWords($input.val()), function(i, value) {\r\n\t\t\trequest(value, findValueCallback, findValueCallback);\r\n\t\t});\r\n\t}).on(\"flushCache\", function() {\r\n\t\tcache.flush();\r\n\t}).on(\"setOptions\", function() {\r\n\t\t$.extend(true, options, arguments[1]);\r\n\t\t// if we've updated the data, repopulate\r\n\t\tif ( \"data\" in arguments[1] )\r\n\t\t\tcache.populate();\r\n\t}).on(\"unautocomplete\", function() {\r\n\t\tselect.unbind();\r\n\t\t$input.off();\r\n\t\t$(input.form).unbind(\".autocomplete\");\r\n\t});\r\n\r\n\r\n\tfunction selectCurrent() {\r\n\t\tvar selected = select.selected();\r\n\t\tif( !selected )\r\n\t\t\treturn false;\r\n\r\n\t\tvar v = selected.result;\r\n\t\tpreviousValue = v;\r\n\r\n\t\tif ( options.multiple ) {\r\n\t\t\tvar words = trimWords($input.val());\r\n\t\t\tif ( words.length > 1 ) {\r\n\t\t\t\tvar seperator = options.multipleSeparator.length;\r\n\t\t\t\tvar cursorAt = $(input).selection().start;\r\n\t\t\t\tvar wordAt, progress = 0;\r\n\t\t\t\t$.each(words, function(i, word) {\r\n\t\t\t\t\tprogress += word.length;\r\n\t\t\t\t\tif (cursorAt <= progress) {\r\n\t\t\t\t\t\twordAt = i;\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tprogress += seperator;\r\n\t\t\t\t});\r\n\t\t\t\twords[wordAt] = v;\r\n\t\t\t\t// TODO this should set the cursor to the right position, but it gets overriden somewhere\r\n\t\t\t\t//$.Autocompleter.Selection(input, progress + seperator, progress + seperator);\r\n\t\t\t\tv = words.join( options.multipleSeparator );\r\n\t\t\t}\r\n\t\t\tv += options.multipleSeparator;\r\n\t\t}\r\n\r\n\t\tvar resultEvent = $.Event(\"result\");\r\n\t\tresultEvent['v'] = v;\r\n\t\t$input.trigger(resultEvent, [selected.data, selected.value]);\r\n\t\t$input.val(resultEvent.v);\r\n\t\thideResultsNow();\r\n\t\treturn true;\r\n\t}\r\n\r\n\tfunction onChange(crap, skipPrevCheck) {\r\n\t\tif( lastKeyPressCode == KEY.DEL ) {\r\n\t\t\tselect.hide();\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tvar currentValue = $input.val();\r\n\r\n\t\tif ( !skipPrevCheck && currentValue == previousValue )\r\n\t\t\treturn;\r\n\r\n\t\tpreviousValue = currentValue;\r\n\r\n\t\tcurrentValue = lastWord(currentValue);\r\n\t\tif ( currentValue.length >= options.minChars) {\r\n\t\t\t$input.addClass(options.loadingClass);\r\n\t\t\tif (!options.matchCase)\r\n\t\t\t\tcurrentValue = currentValue.toLowerCase();\r\n\t\t\trequest(currentValue, receiveData, hideResultsNow);\r\n\t\t} else {\r\n\t\t\tstopLoading();\r\n\t\t\tselect.hide();\r\n\t\t}\r\n\t};\r\n\r\n\tfunction trimWords(value) {\r\n\t\tif (!value)\r\n\t\t\treturn [\"\"];\r\n\t\tif (!options.multiple)\r\n\t\t\treturn [value.trim()];\r\n\t\treturn $.map(value.split(options.multipleSeparator), function(word) {\r\n\t\t\treturn value.trim().length ? word.trim() : null;\r\n\t\t});\r\n\t}\r\n\r\n\tfunction lastWord(value) {\r\n\t\tif ( !options.multiple )\r\n\t\t\treturn value;\r\n\t\tvar words = trimWords(value);\r\n\t\tif (words.length == 1)\r\n\t\t\treturn words[0];\r\n\t\tvar cursorAt = $(input).selection().start;\r\n\t\tif (cursorAt == value.length) {\r\n\t\t\twords = trimWords(value)\r\n\t\t} else {\r\n\t\t\twords = trimWords(value.replace(value.substring(cursorAt), \"\"));\r\n\t\t}\r\n\t\treturn words[words.length - 1];\r\n\t}\r\n\r\n\t// fills in the input box w/the first match (assumed to be the best match)\r\n\t// q: the term entered\r\n\t// sValue: the first matching result\r\n\tfunction autoFill(q, sValue){\r\n\t\t// autofill in the complete box w/the first match as long as the user hasn't entered in more data\r\n\t\t// if the last user key pressed was backspace, don't autofill\r\n\t\tif( options.autoFill && (lastWord($input.val()).toLowerCase() == q.toLowerCase()) && lastKeyPressCode != KEY.BACKSPACE ) {\r\n\t\t\t// fill in the value (keep the case the user has typed)\r\n\t\t\t$input.val($input.val() + sValue.substring(lastWord(previousValue).length));\r\n\t\t\t// select the portion of the value not typed by the user (so the next character will erase)\r\n\t\t\t$(input).selection(previousValue.length, previousValue.length + sValue.length);\r\n\t\t}\r\n\t};\r\n\r\n\tfunction hideResults() {\r\n\t\tclearTimeout(timeout);\r\n\t\ttimeout = setTimeout(hideResultsNow, 200);\r\n\t};\r\n\r\n\tfunction hideResultsNow() {\r\n\t\tvar wasVisible = select.visible();\r\n\t\tselect.hide();\r\n\t\tclearTimeout(timeout);\r\n\t\tstopLoading();\r\n\t\tif (options.mustMatch) {\r\n\t\t\t// call search and run callback\r\n\t\t\t$input.search(\r\n\t\t\t\tfunction (result){\r\n\t\t\t\t\t// if no value found, clear the input box\r\n\t\t\t\t\tif( !result ) {\r\n\t\t\t\t\t\tif (options.multiple) {\r\n\t\t\t\t\t\t\tvar words = trimWords($input.val()).slice(0, -1);\r\n\t\t\t\t\t\t\t$input.val( words.join(options.multipleSeparator) + (words.length ? options.multipleSeparator : \"\") );\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\t$input.val( \"\" );\r\n\t\t\t\t\t\t\t$input.trigger(\"result\", null);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t);\r\n\t\t}\r\n\t};\r\n\r\n\tfunction receiveData(q, data) {\r\n\t\tif ( data && data.length && hasFocus ) {\r\n\t\t\tstopLoading();\r\n\t\t\tselect.display(data, q);\r\n\t\t\tautoFill(q, data[0].value);\r\n\t\t\tselect.show();\r\n\t\t} else {\r\n\t\t\thideResultsNow();\r\n\t\t}\r\n\t};\r\n\r\n\tfunction request(term, success, failure) {\r\n\t\tif (!options.matchCase)\r\n\t\t\tterm = term.toLowerCase();\r\n\t\tvar data = cache.load(term);\r\n\t\t// recieve the cached data\r\n\t\tif (data) {\r\n\t\t\tif(data.length)\t{\r\n\t\t\t\tsuccess(term, data);\r\n\t\t\t}\r\n\t\t\telse{\r\n\t\t\t\tvar parsed = options.parse && options.parse(options.noRecord) || parse(options.noRecord);\t\r\n\t\t\t\tsuccess(term,parsed);\r\n\t\t\t}\r\n\t\t// if an AJAX url has been supplied, try loading the data now\r\n\t\t} else if( (typeof options.url == \"string\") && (options.url.length > 0) ){\r\n\r\n\t\t\tvar extraParams = {\r\n\t\t\t\ttimestamp: +new Date()\r\n\t\t\t};\r\n\t\t\t$.each(options.extraParams, function(key, param) {\r\n\t\t\t\textraParams[key] = typeof param == \"function\" ? param() : param;\r\n\t\t\t});\r\n\r\n\t\t\t$.ajax({\r\n\t\t\t\t// try to leverage ajaxQueue plugin to abort previous requests\r\n\t\t\t\tmode: \"abort\",\r\n\t\t\t\t// limit abortion to this input\r\n\t\t\t\tport: \"autocomplete\" + input.name,\r\n\t\t\t\tdataType: options.dataType,\r\n\t\t\t\turl: options.url,\r\n\t\t\t\tdata: $.extend({\r\n\t\t\t\t\tq: lastWord(term),\r\n\t\t\t\t\tlimit: options.max\r\n\t\t\t\t}, extraParams),\r\n\t\t\t\tsuccess: function(data) {\r\n\t\t\t\t\tvar parsed = options.parse && options.parse(data) || parse(data);\r\n\t\t\t\t\tcache.add(term, parsed);\r\n\t\t\t\t\tsuccess(term, parsed);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t} else {\r\n\t\t\t// if we have a failure, we need to empty the list -- this prevents the the [TAB] key from selecting the last successful match\r\n\t\t\tselect.emptyList();\r\n\t\t\tif(globalFailure != null) {\r\n        globalFailure();\r\n      }\r\n      else {\r\n        failure(term);\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\r\n\tfunction parse(data) {\r\n\t\tvar parsed = [];\r\n\t\tvar rows = data.split(\"\\n\");\r\n\t\tfor (var i=0; i < rows.length; i++) {\r\n\t\t\tvar row = rows[i].trim();\r\n\t\t\tif (row) {\r\n\t\t\t\trow = row.split(\"|\");\r\n\t\t\t\tparsed[parsed.length] = {\r\n\t\t\t\t\tdata: row,\r\n\t\t\t\t\tvalue: row[0],\r\n\t\t\t\t\tresult: options.formatResult && options.formatResult(row, row[0]) || row[0]\r\n\t\t\t\t};\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn parsed;\r\n\t};\r\n\r\n\tfunction stopLoading() {\r\n\t\t$input.removeClass(options.loadingClass);\r\n\t};\r\n\r\n};\r\n\r\n$.Autocompleter.defaults = {\r\n\tinputClass: \"ac_input\",\r\n\tresultsClass: \"ac_results\",\r\n\tloadingClass: \"ac_loading\",\r\n\tminChars: 1,\r\n\tdelay: 400,\r\n\tmatchCase: false,\r\n\tmatchSubset: true,\r\n\tmatchContains: false,\r\n\tcacheLength: 0,\r\n\tmax: 1000,\r\n\tmustMatch: false,\r\n\textraParams: {},\r\n\tselectFirst: true,\r\n\tformatItem: function(row) { return row[0]; },\r\n\tformatMatch: null,\r\n\tautoFill: false,\r\n\twidth: 0,\r\n\tmultiple: false,\r\n\tmultipleSeparator: \" \",\r\n\tinputFocus: true,\r\n\tclickFire: false,\r\n\thighlight: function(value, term) {\r\n\t\treturn value.replace(new RegExp(\"(?![^&;]+;)(?!<[^<>]*)(\" + term.replace(/([\\^\\$\\(\\)\\[\\]\\{\\}\\*\\.\\+\\?\\|\\\\])/gi, \"\\\\$1\") + \")(?![^<>]*>)(?![^&;]+;)\", \"gi\"), \"<strong>$1</strong>\");\r\n\t},\r\n    scroll: true,\r\n    scrollHeight: 180,\r\n    scrollJumpPosition: true\r\n};\r\n\r\n$.Autocompleter.Cache = function(options) {\r\n\r\n\tvar data = {};\r\n\tvar length = 0;\r\n\r\n\tfunction matchSubset(s, sub) {\r\n\t\tif (!options.matchCase)\r\n\t\t\ts = s.toLowerCase();\r\n\t\tvar i = s.indexOf(sub);\r\n\t\tif (options.matchContains == \"word\"){\r\n\t\t\ti = s.toLowerCase().search(\"\\\\b\" + sub.toLowerCase());\r\n\t\t}\r\n\t\tif (i == -1) return false;\r\n\t\treturn i == 0 || options.matchContains;\r\n\t};\r\n\r\n\tfunction add(q, value) {\r\n\t\tif (length > options.cacheLength){\r\n\t\t\tflush();\r\n\t\t}\r\n\t\tif (!data[q]){\r\n\t\t\tlength++;\r\n\t\t}\r\n\t\tdata[q] = value;\r\n\t}\r\n\r\n\tfunction populate(){\r\n\t\tif( !options.data ) return false;\r\n\t\t// track the matches\r\n\t\tvar stMatchSets = {},\r\n\t\t\tnullData = 0;\r\n\r\n\t\t// no url was specified, we need to adjust the cache length to make sure it fits the local data store\r\n\t\tif( !options.url ) options.cacheLength = 1;\r\n\r\n\t\t// track all options for minChars = 0\r\n\t\tstMatchSets[\"\"] = [];\r\n\r\n\t\t// loop through the array and create a lookup structure\r\n\t\tfor ( var i = 0, ol = options.data.length; i < ol; i++ ) {\r\n\t\t\tvar rawValue = options.data[i];\r\n\t\t\t// if rawValue is a string, make an array otherwise just reference the array\r\n\t\t\trawValue = (typeof rawValue == \"string\") ? [rawValue] : rawValue;\r\n\r\n\t\t\tvar value = options.formatMatch(rawValue, i+1, options.data.length);\r\n\t\t\tif ( typeof(value) === 'undefined' || value === false )\r\n\t\t\t\tcontinue;\r\n\r\n\t\t\tvar firstChar = value.charAt(0).toLowerCase();\r\n\t\t\t// if no lookup array for this character exists, look it up now\r\n\t\t\tif( !stMatchSets[firstChar] )\r\n\t\t\t\tstMatchSets[firstChar] = [];\r\n\r\n\t\t\t// if the match is a string\r\n\t\t\tvar row = {\r\n\t\t\t\tvalue: value,\r\n\t\t\t\tdata: rawValue,\r\n\t\t\t\tresult: options.formatResult && options.formatResult(rawValue) || value\r\n\t\t\t};\r\n\r\n\t\t\t// push the current match into the set list\r\n\t\t\tstMatchSets[firstChar].push(row);\r\n\r\n\t\t\t// keep track of minChars zero items\r\n\t\t\tif ( nullData++ < options.max ) {\r\n\t\t\t\tstMatchSets[\"\"].push(row);\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\t// add the data items to the cache\r\n\t\t$.each(stMatchSets, function(i, value) {\r\n\t\t\t// increase the cache size\r\n\t\t\toptions.cacheLength++;\r\n\t\t\t// add to the cache\r\n\t\t\tadd(i, value);\r\n\t\t});\r\n\t}\r\n\r\n\t// populate any existing data\r\n\tsetTimeout(populate, 25);\r\n\r\n\tfunction flush(){\r\n\t\tdata = {};\r\n\t\tlength = 0;\r\n\t}\r\n\r\n\treturn {\r\n\t\tflush: flush,\r\n\t\tadd: add,\r\n\t\tpopulate: populate,\r\n\t\tload: function(q) {\r\n\t\t\tif (!options.cacheLength || !length)\r\n\t\t\t\treturn null;\r\n\t\t\t/*\r\n\t\t\t * if dealing w/local data and matchContains than we must make sure\r\n\t\t\t * to loop through all the data collections looking for matches\r\n\t\t\t */\r\n\t\t\tif( !options.url && options.matchContains ){\r\n\t\t\t\t// track all matches\r\n\t\t\t\tvar csub = [];\r\n\t\t\t\t// loop through all the data grids for matches\r\n\t\t\t\tfor( var k in data ){\r\n\t\t\t\t\t// don't search through the stMatchSets[\"\"] (minChars: 0) cache\r\n\t\t\t\t\t// this prevents duplicates\r\n\t\t\t\t\tif( k.length > 0 ){\r\n\t\t\t\t\t\tvar c = data[k];\r\n\t\t\t\t\t\t$.each(c, function(i, x) {\r\n\t\t\t\t\t\t\t// if we've got a match, add it to the array\r\n\t\t\t\t\t\t\tif (matchSubset(x.value, q)) {\r\n\t\t\t\t\t\t\t\tcsub.push(x);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\treturn csub;\r\n\t\t\t} else\r\n\t\t\t// if the exact item exists, use it\r\n\t\t\tif (data[q]){\r\n\t\t\t\treturn data[q];\r\n\t\t\t} else\r\n\t\t\tif (options.matchSubset) {\r\n\t\t\t\tfor (var i = q.length - 1; i >= options.minChars; i--) {\r\n\t\t\t\t\tvar c = data[q.substr(0, i)];\r\n\t\t\t\t\tif (c) {\r\n\t\t\t\t\t\tvar csub = [];\r\n\t\t\t\t\t\t$.each(c, function(i, x) {\r\n\t\t\t\t\t\t\tif (matchSubset(x.value, q)) {\r\n\t\t\t\t\t\t\t\tcsub[csub.length] = x;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t\treturn csub;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn null;\r\n\t\t}\r\n\t};\r\n};\r\n\r\n$.Autocompleter.Select = function (options, input, select, config) {\r\n\tvar CLASSES = {\r\n\t\tACTIVE: \"ac_over\"\r\n\t};\r\n\r\n\tvar listItems,\r\n\t\tactive = -1,\r\n\t\tdata,\r\n\t\tterm = \"\",\r\n\t\tneedsInit = true,\r\n\t\telement,\r\n\t\tlist;\r\n\r\n\t// Create results\r\n\tfunction init() {\r\n\t\tif (!needsInit)\r\n\t\t\treturn;\r\n\t\telement = $(\"<div/>\")\r\n\t\t.hide()\r\n\t\t.addClass(options.resultsClass)\r\n\t\t.css(\"position\", \"absolute\")\r\n\t\t.appendTo(document.body)\r\n\t\t.on('mouseenter', function(event) {\r\n\t\t  // Browsers except FF do not fire mouseup event on scrollbars, resulting in mouseDownOnSelect remaining true, and results list not always hiding.\r\n\t\t  if($(this).is(\":visible\")) {\r\n\t\t    input.focus();\r\n\t\t  }\r\n\t\t  config.mouseDownOnSelect = false;\r\n\t\t});\r\n\r\n\t\tlist = $(\"<ul/>\").appendTo(element).on('mouseover', function(event) {\r\n\t\t\tif(target(event).nodeName && target(event).nodeName.toUpperCase() == 'LI') {\r\n\t            active = $(\"li\", list).removeClass(CLASSES.ACTIVE).index(target(event));\r\n\t\t\t    $(target(event)).addClass(CLASSES.ACTIVE);\r\n\t        }\r\n\t\t}).on('click', function(event) {\r\n\t\t\t$(target(event)).addClass(CLASSES.ACTIVE);\r\n\t\t\tselect();\r\n\t\t\tif( options.inputFocus )\r\n\t\t\t  input.focus();\r\n\t\t\treturn false;\r\n\t\t}).on('mousedown', function() {\r\n\t\t\tconfig.mouseDownOnSelect = true;\r\n\t\t}).on('mouseup', function() {\r\n\t\t\tconfig.mouseDownOnSelect = false;\r\n\t\t});\r\n\r\n\t\tif( options.width > 0 )\r\n\t\t\telement.css(\"width\", options.width);\r\n\r\n\t\tneedsInit = false;\r\n\t}\r\n\r\n\tfunction target(event) {\r\n\t\tvar element = event.target;\r\n\t\twhile(element && element.tagName != \"LI\")\r\n\t\t\telement = element.parentNode;\r\n\t\t// more fun with IE, sometimes event.target is empty, just ignore it then\r\n\t\tif(!element)\r\n\t\t\treturn [];\r\n\t\treturn element;\r\n\t}\r\n\r\n\tfunction moveSelect(step) {\r\n\t\tlistItems.slice(active, active + 1).removeClass(CLASSES.ACTIVE);\r\n\t\tmovePosition(step);\r\n        var activeItem = listItems.slice(active, active + 1).addClass(CLASSES.ACTIVE);\r\n        if(options.scroll) {\r\n            var offset = 0;\r\n            listItems.slice(0, active).each(function() {\r\n\t\t\t\toffset += this.offsetHeight;\r\n\t\t\t});\r\n            if((offset + activeItem[0].offsetHeight - list.scrollTop()) > list[0].clientHeight) {\r\n                list.scrollTop(offset + activeItem[0].offsetHeight - list.innerHeight());\r\n            } else if(offset < list.scrollTop()) {\r\n                list.scrollTop(offset);\r\n            }\r\n        }\r\n\t};\r\n\r\n\tfunction movePosition(step) {\r\n\t\tif (options.scrollJumpPosition || (!options.scrollJumpPosition && !((step < 0 && active == 0) || (step > 0 && active == listItems.length - 1)) )) {\r\n\t\t\tactive += step;\r\n\t\t\tif (active < 0) {\r\n\t\t\t\tactive = listItems.length - 1;\r\n\t\t\t} else if (active >= listItems.length) {\r\n\t\t\t\tactive = 0;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\r\n\tfunction limitNumberOfItems(available) {\r\n\t\treturn options.max && options.max < available\r\n\t\t\t? options.max\r\n\t\t\t: available;\r\n\t}\r\n\r\n\tfunction fillList() {\r\n\t\tlist.empty();\r\n\t\tvar max = limitNumberOfItems(data.length);\r\n\t\tfor (var i=0; i < max; i++) {\r\n\t\t\tif (!data[i])\r\n\t\t\t\tcontinue;\r\n\t\t\tvar formatted = options.formatItem(data[i].data, i+1, max, data[i].value, term);\r\n\t\t\tif ( formatted === false )\r\n\t\t\t\tcontinue;\r\n\t\t\tvar li = $(\"<li/>\").html( options.highlight(formatted, term) ).addClass(i%2 == 0 ? \"ac_even\" : \"ac_odd\").appendTo(list)[0];\r\n\t\t\t$.data(li, \"ac_data\", data[i]);\r\n\t\t}\r\n\t\tlistItems = list.find(\"li\");\r\n\t\tif ( options.selectFirst ) {\r\n\t\t\tlistItems.slice(0, 1).addClass(CLASSES.ACTIVE);\r\n\t\t\tactive = 0;\r\n\t\t}\r\n\t\t// apply bgiframe if available\r\n\t\tif ( $.fn.bgiframe )\r\n\t\t\tlist.bgiframe();\r\n\t}\r\n\r\n\treturn {\r\n\t\tdisplay: function(d, q) {\r\n\t\t\tinit();\r\n\t\t\tdata = d;\r\n\t\t\tterm = q;\r\n\t\t\tfillList();\r\n\t\t},\r\n\t\tnext: function() {\r\n\t\t\tmoveSelect(1);\r\n\t\t},\r\n\t\tprev: function() {\r\n\t\t\tmoveSelect(-1);\r\n\t\t},\r\n\t\tpageUp: function() {\r\n\t\t\tif (active != 0 && active - 8 < 0) {\r\n\t\t\t\tmoveSelect( -active );\r\n\t\t\t} else {\r\n\t\t\t\tmoveSelect(-8);\r\n\t\t\t}\r\n\t\t},\r\n\t\tpageDown: function() {\r\n\t\t\tif (active != listItems.length - 1 && active + 8 > listItems.length) {\r\n\t\t\t\tmoveSelect( listItems.length - 1 - active );\r\n\t\t\t} else {\r\n\t\t\t\tmoveSelect(8);\r\n\t\t\t}\r\n\t\t},\r\n\t\thide: function() {\r\n\t\t\telement && element.hide();\r\n\t\t\tlistItems && listItems.removeClass(CLASSES.ACTIVE);\r\n\t\t\tactive = -1;\r\n\t\t},\r\n\t\tvisible : function() {\r\n\t\t\treturn element && element.is(\":visible\");\r\n\t\t},\r\n\t\tcurrent: function() {\r\n\t\t\treturn this.visible() && (listItems.filter(\".\" + CLASSES.ACTIVE)[0] || options.selectFirst && listItems[0]);\r\n\t\t},\r\n\t\tshow: function() {\r\n\t\t\tvar offset = $(input).offset();\r\n\t\t\telement.css({\r\n\t\t\t\twidth: typeof options.width == \"string\" || options.width > 0 ? options.width : $(input).width(),\r\n\t\t\t\ttop: offset.top + input.offsetHeight,\r\n\t\t\t\tleft: offset.left\r\n\t\t\t}).show();\r\n            if(options.scroll) {\r\n                list.scrollTop(0);\r\n                list.css({\r\n\t\t\t\t\tmaxHeight: options.scrollHeight,\r\n\t\t\t\t\toverflow: 'auto'\r\n\t\t\t\t});\r\n\r\n                if(navigator.userAgent.indexOf(\"MSIE\") != -1 && typeof document.body.style.maxHeight === \"undefined\") {\r\n\t\t\t\t\tvar listHeight = 0;\r\n\t\t\t\t\tlistItems.each(function() {\r\n\t\t\t\t\t\tlistHeight += this.offsetHeight;\r\n\t\t\t\t\t});\r\n\t\t\t\t\tvar scrollbarsVisible = listHeight > options.scrollHeight;\r\n                    list.css('height', scrollbarsVisible ? options.scrollHeight : listHeight );\r\n\t\t\t\t\tif (!scrollbarsVisible) {\r\n\t\t\t\t\t\t// IE doesn't recalculate width when scrollbar disappears\r\n\t\t\t\t\t\tlistItems.width( list.width() - parseInt(listItems.css(\"padding-left\")) - parseInt(listItems.css(\"padding-right\")) );\r\n\t\t\t\t\t}\r\n                }\r\n\r\n            }\r\n\t\t},\r\n\t\tselected: function() {\r\n\t\t\tvar selected = listItems && listItems.filter(\".\" + CLASSES.ACTIVE).removeClass(CLASSES.ACTIVE);\r\n\t\t\treturn selected && selected.length && $.data(selected[0], \"ac_data\");\r\n\t\t},\r\n\t\temptyList: function (){\r\n\t\t\tlist && list.empty();\r\n\t\t},\r\n\t\tunbind: function() {\r\n\t\t\telement && element.remove();\r\n\t\t}\r\n\t};\r\n};\r\n\r\n$.fn.selection = function(start, end) {\r\n\tif (start !== undefined) {\r\n\t\treturn this.each(function() {\r\n\t\t\tif( this.createTextRange ){\r\n\t\t\t\tvar selRange = this.createTextRange();\r\n\t\t\t\tif (end === undefined || start == end) {\r\n\t\t\t\t\tselRange.move(\"character\", start);\r\n\t\t\t\t\tselRange.select();\r\n\t\t\t\t} else {\r\n\t\t\t\t\tselRange.collapse(true);\r\n\t\t\t\t\tselRange.moveStart(\"character\", start);\r\n\t\t\t\t\tselRange.moveEnd(\"character\", end);\r\n\t\t\t\t\tselRange.select();\r\n\t\t\t\t}\r\n\t\t\t} else if( this.setSelectionRange ){\r\n\t\t\t\tthis.setSelectionRange(start, end);\r\n\t\t\t} else if( this.selectionStart ){\r\n\t\t\t\tthis.selectionStart = start;\r\n\t\t\t\tthis.selectionEnd = end;\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\tvar field = this[0];\r\n\tif ( field.createTextRange ) {\r\n\t\tvar range = document.selection.createRange(),\r\n\t\t\torig = field.value,\r\n\t\t\tteststring = \"<->\",\r\n\t\t\ttextLength = range.text.length;\r\n\t\trange.text = teststring;\r\n\t\tvar caretAt = field.value.indexOf(teststring);\r\n\t\tfield.value = orig;\r\n\t\tthis.selection(caretAt, caretAt + textLength);\r\n\t\treturn {\r\n\t\t\tstart: caretAt,\r\n\t\t\tend: caretAt + textLength\r\n\t\t}\r\n\t} else if( field.selectionStart !== undefined ){\r\n\t\treturn {\r\n\t\t\tstart: field.selectionStart,\r\n\t\t\tend: field.selectionEnd\r\n\t\t}\r\n\t}\r\n};\r\n\r\n})(jQuery);\r\n"," /*\r\n * TipTip\r\n * Copyright 2010 Drew Wilson\r\n * www.drewwilson.com\r\n * code.drewwilson.com/entry/tiptip-jquery-plugin\r\n *\r\n * Version 1.3   -   Updated: Mar. 23, 2010\r\n *\r\n * This Plug-In will create a custom tooltip to replace the default\r\n * browser tooltip. It is extremely lightweight and very smart in\r\n * that it detects the edges of the browser window and will make sure\r\n * the tooltip stays within the current window size. As a result the\r\n * tooltip will adjust itself to be displayed above, below, to the left \r\n * or to the right depending on what is necessary to stay within the\r\n * browser window. It is completely customizable as well via CSS.\r\n *\r\n * This TipTip jQuery plug-in is dual licensed under the MIT and GPL licenses:\r\n *   http://www.opensource.org/licenses/mit-license.php\r\n *   http://www.gnu.org/licenses/gpl.html\r\n */\r\n\r\n(function($){\r\n\t$.fn.tipTip = function(options) {\r\n\t\tvar defaults = { \r\n\t\t\tactivation: \"hover\",\r\n\t\t\tkeepAlive: false,\r\n\t\t\tmaxWidth: \"200px\",\r\n\t\t\tedgeOffset: 3,\r\n\t\t\tdefaultPosition: \"bottom\",\r\n\t\t\tdelay: 400,\r\n\t\t\tfadeIn: 200,\r\n\t\t\tfadeOut: 200,\r\n\t\t\tattribute: \"title\",\r\n\t\t\tcontent: false, // HTML or String to fill TipTIp with\r\n\t\t  \tenter: function(){},\r\n\t\t  \texit: function(){}\r\n\t  \t};\r\n\t \tvar opts = $.extend(defaults, options);\r\n\t \t\r\n\t \t// Setup tip tip elements and render them to the DOM\r\n\t \tif($(\"#tiptip_holder\").length <= 0){\r\n\t \t\tvar tiptip_holder = $('<div id=\"tiptip_holder\" style=\"max-width:'+ opts.maxWidth +';\"></div>');\r\n\t\t\tvar tiptip_content = $('<div id=\"tiptip_content\"></div>');\r\n\t\t\tvar tiptip_arrow = $('<div id=\"tiptip_arrow\"></div>');\r\n\t\t\t$(\"body\").append(tiptip_holder.html(tiptip_content).prepend(tiptip_arrow.html('<div id=\"tiptip_arrow_inner\"></div>')));\r\n\t\t} else {\r\n\t\t\tvar tiptip_holder = $(\"#tiptip_holder\");\r\n\t\t\tvar tiptip_content = $(\"#tiptip_content\");\r\n\t\t\tvar tiptip_arrow = $(\"#tiptip_arrow\");\r\n\t\t}\r\n\t\t\r\n\t\treturn this.each(function(){\r\n\t\t\tvar org_elem = $(this);\r\n\t\t\tif(opts.content){\r\n\t\t\t\tvar org_title = opts.content;\r\n\t\t\t} else {\r\n\t\t\t\tvar org_title = org_elem.attr(opts.attribute);\r\n\t\t\t}\r\n\t\t\tif(org_title != \"\"){\r\n\t\t\t\tif(!opts.content){\r\n\t\t\t\t\torg_elem.removeAttr(opts.attribute); //remove original Attribute\r\n\t\t\t\t}\r\n\t\t\t\tvar timeout = false;\r\n\t\t\t\t\r\n\t\t\t\tif(opts.activation == \"hover\"){\r\n\t\t\t\t\torg_elem.on('mouseenter', function(){\r\n\t\t\t\t\t\tactive_tiptip();\r\n\t\t\t\t\t}).on('mouseleave', function(){\r\n\t\t\t\t\t\tif(!opts.keepAlive){\r\n\t\t\t\t\t\t\tdeactive_tiptip();\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t});\r\n\t\t\t\t\tif(opts.keepAlive){\r\n\t\t\t\t\t\ttiptip_holder.on('mouseleave', function(){\r\n\t\t\t\t\t\t\tdeactive_tiptip();\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\t\t\t\t} else if(opts.activation == \"focus\"){\r\n\t\t\t\t\torg_elem.on('focus', function(){\r\n\t\t\t\t\t\tactive_tiptip();\r\n\t\t\t\t\t}).on('blur', function(){\r\n\t\t\t\t\t\tdeactive_tiptip();\r\n\t\t\t\t\t});\r\n\t\t\t\t} else if(opts.activation == \"click\"){\r\n\t\t\t\t\torg_elem.on('click', function(){\r\n\t\t\t\t\t\tactive_tiptip();\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t}).on('mouseleave', function(){\r\n\t\t\t\t\t\tif(!opts.keepAlive){\r\n\t\t\t\t\t\t\tdeactive_tiptip();\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t});\r\n\t\t\t\t\tif(opts.keepAlive){\r\n\t\t\t\t\t\ttiptip_holder.hover(function(){}, function(){\r\n\t\t\t\t\t\t\tdeactive_tiptip();\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\r\n\t\t\t\tfunction active_tiptip(){\r\n\t\t\t\t\topts.enter.call(this);\r\n\t\t\t\t\ttiptip_content.html(org_title);\r\n\t\t\t\t\ttiptip_holder.hide().removeAttr(\"class\").css(\"margin\",\"0\");\r\n\t\t\t\t\ttiptip_arrow.removeAttr(\"style\");\r\n\t\t\t\t\t\r\n\t\t\t\t\tvar top = parseInt(org_elem.offset()['top']);\r\n\t\t\t\t\tvar left = parseInt(org_elem.offset()['left']);\r\n\t\t\t\t\tvar org_width = parseInt(org_elem.outerWidth());\r\n\t\t\t\t\tvar org_height = parseInt(org_elem.outerHeight());\r\n\t\t\t\t\tvar tip_w = tiptip_holder.outerWidth();\r\n\t\t\t\t\tvar tip_h = tiptip_holder.outerHeight();\r\n\t\t\t\t\tvar w_compare = Math.round((org_width - tip_w) / 2);\r\n\t\t\t\t\tvar h_compare = Math.round((org_height - tip_h) / 2);\r\n\t\t\t\t\tvar marg_left = Math.round(left + w_compare);\r\n\t\t\t\t\tvar marg_top = Math.round(top + org_height + opts.edgeOffset);\r\n\t\t\t\t\tvar t_class = \"\";\r\n\t\t\t\t\tvar arrow_top = \"\";\r\n\t\t\t\t\tvar arrow_left = Math.round(tip_w - 12) / 2;\r\n\r\n                    if(opts.defaultPosition == \"bottom\"){\r\n                    \tt_class = \"_bottom\";\r\n                   \t} else if(opts.defaultPosition == \"top\"){ \r\n                   \t\tt_class = \"_top\";\r\n                   \t} else if(opts.defaultPosition == \"left\"){\r\n                   \t\tt_class = \"_left\";\r\n                   \t} else if(opts.defaultPosition == \"right\"){\r\n                   \t\tt_class = \"_right\";\r\n                   \t}\r\n\t\t\t\t\t\r\n\t\t\t\t\tvar right_compare = (w_compare + left) < parseInt($(window).scrollLeft());\r\n\t\t\t\t\tvar left_compare = (tip_w + left) > parseInt($(window).width());\r\n\t\t\t\t\t\r\n\t\t\t\t\tif((right_compare && w_compare < 0) || (t_class == \"_right\" && !left_compare) || (t_class == \"_left\" && left < (tip_w + opts.edgeOffset + 5))){\r\n\t\t\t\t\t\tt_class = \"_right\";\r\n\t\t\t\t\t\tarrow_top = Math.round(tip_h - 13) / 2;\r\n\t\t\t\t\t\tarrow_left = -12;\r\n\t\t\t\t\t\tmarg_left = Math.round(left + org_width + opts.edgeOffset);\r\n\t\t\t\t\t\tmarg_top = Math.round(top + h_compare);\r\n\t\t\t\t\t} else if((left_compare && w_compare < 0) || (t_class == \"_left\" && !right_compare)){\r\n\t\t\t\t\t\tt_class = \"_left\";\r\n\t\t\t\t\t\tarrow_top = Math.round(tip_h - 13) / 2;\r\n\t\t\t\t\t\tarrow_left =  Math.round(tip_w);\r\n\t\t\t\t\t\tmarg_left = Math.round(left - (tip_w + opts.edgeOffset + 5));\r\n\t\t\t\t\t\tmarg_top = Math.round(top + h_compare);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tvar top_compare = (top + org_height + opts.edgeOffset + tip_h + 8) > parseInt($(window).height() + $(window).scrollTop());\r\n\t\t\t\t\tvar bottom_compare = ((top + org_height) - (opts.edgeOffset + tip_h + 8)) < 0;\r\n\t\t\t\t\t\r\n\t\t\t\t\tif(top_compare || (t_class == \"_bottom\" && top_compare) || (t_class == \"_top\" && !bottom_compare)){\r\n\t\t\t\t\t\tif(t_class == \"_top\" || t_class == \"_bottom\"){\r\n\t\t\t\t\t\t\tt_class = \"_top\";\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tt_class = t_class+\"_top\";\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tarrow_top = tip_h;\r\n\t\t\t\t\t\tmarg_top = Math.round(top - (tip_h + 5 + opts.edgeOffset));\r\n\t\t\t\t\t} else if(bottom_compare | (t_class == \"_top\" && bottom_compare) || (t_class == \"_bottom\" && !top_compare)){\r\n\t\t\t\t\t\tif(t_class == \"_top\" || t_class == \"_bottom\"){\r\n\t\t\t\t\t\t\tt_class = \"_bottom\";\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tt_class = t_class+\"_bottom\";\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tarrow_top = -12;\t\t\t\t\t\t\r\n\t\t\t\t\t\tmarg_top = Math.round(top + org_height + opts.edgeOffset);\r\n\t\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\t\tif(t_class == \"_right_top\" || t_class == \"_left_top\"){\r\n\t\t\t\t\t\tmarg_top = marg_top + 5;\r\n\t\t\t\t\t} else if(t_class == \"_right_bottom\" || t_class == \"_left_bottom\"){\t\t\r\n\t\t\t\t\t\tmarg_top = marg_top - 5;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif(t_class == \"_left_top\" || t_class == \"_left_bottom\"){\t\r\n\t\t\t\t\t\tmarg_left = marg_left + 5;\r\n\t\t\t\t\t}\r\n\t\t\t\t\ttiptip_arrow.css({\"margin-left\": arrow_left+\"px\", \"margin-top\": arrow_top+\"px\"});\r\n\t\t\t\t\ttiptip_holder.css({\"margin-left\": marg_left+\"px\", \"margin-top\": marg_top+\"px\"}).attr(\"class\",\"tip\"+t_class);\r\n\t\t\t\t\t\r\n\t\t\t\t\tif (timeout){ clearTimeout(timeout); }\r\n\t\t\t\t\ttimeout = setTimeout(function(){ tiptip_holder.stop(true,true).fadeIn(opts.fadeIn); }, opts.delay);\t\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\tfunction deactive_tiptip(){\r\n\t\t\t\t\topts.exit.call(this);\r\n\t\t\t\t\tif (timeout){ clearTimeout(timeout); }\r\n\t\t\t\t\ttiptip_holder.fadeOut(opts.fadeOut);\r\n\t\t\t\t}\r\n\t\t\t}\t\t\t\t\r\n\t\t});\r\n\t}\r\n})(jQuery);  \t","  /**\r\n * PlatinMarket Sanal Mağaza Sistemi Javascript Kütüphanesi v1.0.0\r\n * Burak DOĞAN <burak@platinmarket.com>\r\n * Tüm hakları saklıdır.\r\n */\r\n\r\n(function(global, factory) {\r\n\t'use strict';\r\n\t[ global.PlatinMarket, global.Statr ] = factory(window.EvEmitter);\r\n})(this,\r\n\r\n// --------------------------  factory -------------------------- //\r\n\r\nfunction factory(EvEmitter) {\r\n\r\n\tvar $ = window.jQuery;\r\n\tvar console = window.console;\r\n\r\n\t// -------------------------- helpers -------------------------- //\r\n\r\n\t// Get Object key by dot notation path\r\n\tfunction dot_get(obj, path) {\r\n\t\tvar currentObj = obj,\r\n        keys = path.split(\".\"), i, l = keys.length, key;\r\n        for( i = 0; i <= keys.length - 1; ++i ) {\r\n\t\t\tkey = keys[i];\r\n\t\t\tif (!currentObj.hasOwnProperty(key)) return undefined;\r\n\t\t\tcurrentObj = currentObj[key];\r\n        }\r\n\t\treturn currentObj;\r\n\t}\r\n\r\n\t// Set Object key by dot notation path\r\n\tfunction dot_set(obj, path, value) {\r\n\t\tvar currentObj = obj,\r\n        keys = path.split(\".\"), i, l = keys.length, key;\r\n        for( i = 0; i <= keys.length - 1; ++i ) {\r\n\t\t\tkey = keys[i];\r\n\t\t\tcurrentObj[key] = keys.length - 1 === i ? value : typeof currentObj[key] == \"object\" ? currentObj[key] : {};\r\n\t\t\tcurrentObj = currentObj[key];\r\n        }\r\n\t}\r\n\r\n\t// extend objects\r\n\tfunction extend( a, b ) {\r\n\t  for ( var prop in b ) {\r\n\t\ta[ prop ] = b[ prop ];\r\n\t  }\r\n\t  return a;\r\n\t}\r\n\r\n\t// clone object\r\n\tfunction clone(obj) {\r\n      if (obj === null || !$.isPlainObject(obj) || 'isActiveClone' in obj)\r\n        return obj;\r\n\r\n      if (obj instanceof Date)\r\n        var temp = new obj.constructor(); //or new Date(obj);\r\n      else\r\n        var temp = obj.constructor();\r\n\r\n      for (var key in obj) {\r\n        if (Object.prototype.hasOwnProperty.call(obj, key)) {\r\n          obj['isActiveClone'] = null;\r\n          temp[key] = clone(obj[key]);\r\n          delete obj['isActiveClone'];\r\n        }\r\n      }\r\n\r\n      return temp;\r\n    }\r\n\r\n\t// turn element or nodeList into an array\r\n\tfunction makeArray( obj ) {\r\n\t  var ary = [];\r\n\t  if ( Array.isArray( obj ) ) {\r\n\t\t// use object if already an array\r\n\t\tary = obj;\r\n\t  } else if ( typeof obj.length == 'number' ) {\r\n\t\t// convert nodeList to array\r\n\t\tfor ( var i=0; i < obj.length; i++ ) {\r\n\t\t  ary.push( obj[i] );\r\n\t\t}\r\n\t  } else {\r\n\t\t// array of single index\r\n\t\tary.push( obj );\r\n\t  }\r\n\t  return ary;\r\n\t}\r\n\r\n\t// Get querystring parameter from url\r\n\tfunction getQueryString(name, url) {\r\n\t\tif (!url) url = window.location.href;\r\n\t\tname = name.replace(/[\\[\\]]/g, \"\\\\$&\");\r\n\t\tvar regex = new RegExp(\"[?&]\" + name + \"(=([^&#]*)|&|#|$)\", \"i\"),\r\n\t\t\tresults = regex.exec(url);\r\n\t\tif (!results) return null;\r\n\t\tif (!results[2]) return '';\r\n\t\treturn decodeURIComponent(results[2].replace(/\\+/g, \" \"));\r\n\t}\r\n\r\n\t(function () {\r\n\r\n\t\t if ( typeof window.CustomEvent === \"function\" ) return false;\r\n\r\n\t\t function CustomEvent ( event, params ) {\r\n\t\t\t params = params || { bubbles: false, cancelable: false, detail: undefined };\r\n\t\t\t var evt = document.createEvent('CustomEvent');\r\n\t\t\t evt.initCustomEvent( event, params.bubbles, params.cancelable, params.detail );\r\n\t\t\t return evt;\r\n\t\t }\r\n\r\n\t\t CustomEvent.prototype = window.Event.prototype;\r\n\r\n\t\t window.CustomEvent = CustomEvent;\r\n\t})();\r\n\r\n\t// -------------------------- Data -------------------------- //\r\n\r\n\tvar _data = {};\r\n\r\n\t// -------------------------- Default Configure -------------------------- //\r\n\r\n\t_data = {\r\n\t\tConfigure: {\r\n\r\n\t\t\t// JqZoom Options\r\n\t\t\tJqZoom: {\r\n\t\t\t\tzoomType: 'standart',\r\n\t\t\t\tpreloadText: 'Yükleniyor..',\r\n\t\t\t\tpreloadImages: false,\r\n\t\t\t\ttitle: false,\r\n\t\t\t\tshowEffect: 'show',\r\n\t\t\t\thideEffect: 'hide',\r\n\t\t\t\tzoomWidth: 300,\r\n\t\t\t\tzoomHeight: 300,\r\n\t\t\t\txOffset: 10\r\n\t\t\t},\r\n\r\n\t\t\t// KeepSession Options\r\n\t\t\tKeepSession: {\r\n\t\t\t\tinterval: 180000,\r\n\t\t\t\turl: \"/main/order_steps_keep_session.asp\"\r\n\t\t\t},\r\n\r\n\t\t\t// Lightbox Options\r\n\t\t\tLightbox: {\r\n\t\t\t\tfullscreenEl: false,\r\n\t\t\t\thistory: false,\r\n\t\t\t\tshareEl: false,\r\n\t\t\t\tcloseOnScroll: false,\r\n\t\t\t\tpinchToClose: false,\r\n\t\t\t\tcloseElClasses: [ ],\r\n\t\t\t\tclickToCloseNonZoomable: false\r\n\t\t\t},\r\n\r\n\t\t\t// JCarousel Options\r\n\t\t\tJCarousel: {\r\n\t\t\t\tjcarousel: {\r\n\t\t\t\t\twrap: 'last',\r\n\t\t\t\t\tscroll: 1,\r\n\t\t\t\t\tanimation: {\r\n\t\t\t\t\t\tduration: 500\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\tautoscroll: {\r\n\t\t\t\t\ttarget: '+=1',\r\n\t\t\t\t\tinterval: 3000,\r\n\t\t\t\t\tautostart: true\r\n\t\t\t\t},\r\n\t\t\t\tequalHeight: true,\r\n\t\t\t\tbuttons: true,\r\n\t\t\t\tprev: function(element){\r\n\t\t\t\t\treturn $(element).next(\"div.jcarousel-prev\");\r\n\t\t\t\t},\r\n\t\t\t\tnext: function(element){\r\n\t\t\t\t\treturn $(element).next(\"div.jcarousel-prev\").next(\"div.jcarousel-next\")\r\n\t\t\t\t},\r\n\t\t\t\tgroup: 1\r\n\t\t\t},\r\n\r\n\t\t\t// SexyLightbox Options\r\n\t\t\tSexylightbox: {\r\n\t\t\t\tcolor: 'white',\r\n\t\t\t\tdir: '/js/src/sexylightbox',\r\n\t\t\t\timagesdir: '/js/src/sexylightbox'\r\n\t\t\t},\r\n\r\n\t\t\t// Autocomplate Options\r\n\t\t\tAutocomplate: {\r\n\t\t\t\tdelay: 400,\r\n\t\t\t\tminChars: 0,\r\n\t\t\t\tscrollHeight: 250,\r\n\t\t\t\tselectFirst: false,\r\n\t\t\t\tmultiple: false,\r\n\t\t\t\tmatchContains: false,\r\n\t\t\t\tmustMatch: false,\r\n\t\t\t\tmatchCase: true,\r\n\t\t\t\tautoFill: false\r\n\t\t\t},\r\n\r\n\t\t\t// Validation definations\r\n\t\t\tValidationRules: {\r\n\t\t\t\t_messages: {\r\n\t\t\t\t\tadres_tanimi: \"Lütfen adres tanımı belirleyin.\",\r\n\t\t\t\t\til: \"Lütfen şehir seçiniz/yazınız.\",\r\n\t\t\t\t\tilce: \"Lütfen ilçe seçiniz/yazınız.\",\r\n\t\t\t\t\tadres: \"Lütfen adres yazınız.\",\r\n\t\t\t\t\ttel: \"Lütfen telefon no. yazınız.\",\r\n\t\t\t\t\tgsm: \"Lütfen gsm no. yazınız.\",\r\n\t\t\t\t\tad: \"Lütfen adınızı yazınız.\",\r\n\t\t\t\t\tkonuk_ad: \"Lütfen adınızı yazınız.\",\r\n\t\t\t\t\tsoyad: \"Lütfen soyadınızı yazınız.\",\r\n\t\t\t\t\ttc_kimlik: \"TC kimlik no hatalı. Kontrol ediniz.\",\r\n\t\t\t\t\tfirma_unvan: \"Lütfen firma unvanını yazınız.\",\r\n\t\t\t\t\tvergi_daire: \"Lütfen vergi dairesi yazınız.\",\r\n\t\t\t\t\tvergi_no: \"Lütfen vergi numarası yazınız.\",\r\n\t\t\t\t\tTcIdentity: \"Lütfen kimlik numarasını kontrol ediniz.\",\r\n\t\t\t\t\tchecked: \"Lütfen işaretleyiniz\",\r\n\t\t\t\t\tgizlilik_politikasi_onay: \"Devam etmek için gizlilik politikasını kabul etmeniz gerekiyor.\"\r\n\t\t\t\t},\r\n\t\t\t\tadres: {\r\n\t\t\t\t\t_base: {\r\n\t\t\t\t\t\tadres_tanimi : \"required\",\r\n\t\t\t\t\t\til: \"required\",\r\n\t\t\t\t\t\tilce: \"required\",\r\n\t\t\t\t\t\tadres: \"required\",\r\n\t\t\t\t\t\ttel: \"Telefon\",\r\n\t\t\t\t\t\tgsm: \"gsm\",\r\n\t\t\t\t\t\tad: \"required\",\r\n\t\t\t\t\t\tsoyad: \"required\",\r\n\t\t\t\t\t\ttc_kimlik: \"TcIdentity\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\tfatura: {\r\n\t\t\t\t\t\tad: { required: { depends: function(){ return $(\"form [name='fatura_tip']\").data(\"value\") == \"bireysel\"; } } },\r\n\t\t\t\t\t\tsoyad: { required: { depends: function(){ return $(\"form [name='fatura_tip']\").data(\"value\") == \"bireysel\"; } } },\r\n\t\t\t\t\t\ttc_kimlik: { TcIdentity: { depends: function(){ return $(\"form [name='fatura_tip']\").data(\"value\") == \"bireysel\"; } } },\r\n\t\t\t\t\t\tfirma_unvan: { required: { depends: function(){ return $(\"form [name='fatura_tip']\").data(\"value\") == \"kurumsal\"; } } },\r\n\t\t\t\t\t\tvergi_daire: { required: { depends: function(){ return $(\"form [name='fatura_tip']\").data(\"value\") == \"kurumsal\"; } } },\r\n\t\t\t\t\t\tvergi_no: { required: { depends: function(){ return $(\"form [name='fatura_tip']\").data(\"value\") == \"kurumsal\"; } } }\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\tteslimat_fatura_bilgileri: {\r\n\t\t\t\t\t_base: {\r\n\t\t\t\t\t\tgizlilik_politikasi_onay: \"checked\",\r\n\t\t\t\t\t\tkonuk_ad: \"required\",\r\n\t\t\t\t\t\tkonuk_soyad: \"required\",\r\n\t\t\t\t\t\tkonuk_email: {required: true, email: true},\r\n\t\t\t\t\t\tsiparis_notu: { required: { depends: function(){ return PM.Get(\"Application\" , \"x_not_zorunlu\") === 1; } } },\r\n\t\t\t\t\t\tteslimat_tanim: \"required\",\r\n\t\t\t\t\t\tteslimat_ad: \"required\",\r\n\t\t\t\t\t\tteslimat_soyad: \"required\",\r\n\t\t\t\t\t\tteslimat_tc_kimlik: { TcIdentity: { depends: function(){ return !$(this).data(\"same_invoice_data\"); } } },\r\n\t\t\t\t\t\tteslimat_ulke: \"required\",\r\n\t\t\t\t\t\tteslimat_sehir: \"required\",\r\n\t\t\t\t\t\tteslimat_ilce: \"required\",\r\n\t\t\t\t\t\tteslimat_adres: \"required\",\r\n\t\t\t\t\t\tteslimat_gsm: { required:true, gsm: { depends: function(){ return $(this).closest(\"form\").find(\"[name='teslimat_ulke']\")[0].value === 'Türkiye'; } }, Telefon: { depends: function(){ return !$(this).closest(\"form\").find(\"[name='teslimat_ulke']\")[0].value === 'Türkiye'; } } },\r\n\t\t\t\t\t\tfatura_tanim: { required: { depends: function(){ return !$(this).closest(\"form\").data(\"same_invoice_data\"); } } },\r\n\t\t\t\t\t\tfatura_tip: { required: { depends: function(){ return !$(this).closest(\"form\").data(\"same_invoice_data\"); } } },\r\n\t\t\t\t\t\tfatura_ad: { required: { depends: function(){ return !$(this).closest(\"form\").data(\"same_invoice_data\") && $(this).closest(\"form\").data(\"invoice_type\") == \"bireysel\"; } } },\r\n\t\t\t\t\t\tfatura_soyad: { required: { depends: function(){ return !$(this).closest(\"form\").data(\"same_invoice_data\") && $(this).closest(\"form\").data(\"invoice_type\") == \"bireysel\"; } } },\r\n\t\t\t\t\t\tfatura_tc_kimlik: { required: { depends: function(){ return !$(this).closest(\"form\").data(\"same_invoice_data\") && $(this).closest(\"form\").data(\"invoice_type\") == \"bireysel\" && PM.Get(\"Application\" , \"x_tc_kimlik_zorunlu\") == 1; } } },\r\n\t\t\t\t\t\tfatura_ulke: { required: { depends: function(){ return !$(this).closest(\"form\").data(\"same_invoice_data\"); } } },\r\n\t\t\t\t\t\tfatura_sehir: { required: { depends: function(){ return !$(this).closest(\"form\").data(\"same_invoice_data\"); } } },\r\n\t\t\t\t\t\tfatura_ilce: { required: { depends: function(){ return !$(this).closest(\"form\").data(\"same_invoice_data\"); } } },\r\n\t\t\t\t\t\tfatura_adres: { required: { depends: function(){ return !$(this).closest(\"form\").data(\"same_invoice_data\"); } } },\r\n\t\t\t\t\t\tfatura_tel: { Telefon: { depends: function(){ return !$(this).closest(\"form\").data(\"same_invoice_data\"); } } },\r\n\t\t\t\t\t\tfatura_gsm: { gsm: { depends: function(){ return !$(this).closest(\"form\").data(\"same_invoice_data\"); } } },\r\n\t\t\t\t\t\tfaturam_siparisimle_gelsin: { checked: false },\r\n\t\t\t\t\t\tfatura_firma_unvan: { required: { depends: function(){ return !$(this).closest(\"form\").data(\"same_invoice_data\") && $(this).closest(\"form\").data(\"invoice_type\") == \"kurumsal\"; } } },\r\n\t\t\t\t\t\tfatura_vergi_daire: { required: { depends: function(){ return !$(this).closest(\"form\").data(\"same_invoice_data\") && $(this).closest(\"form\").data(\"invoice_type\") == \"kurumsal\"; } } },\r\n\t\t\t\t\t\tfatura_vergi_no: { required: { depends: function(){ return !$(this).closest(\"form\").data(\"same_invoice_data\") && $(this).closest(\"form\").data(\"invoice_type\") == \"kurumsal\"; } } }\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t// Custom Validation Methods\r\n\t\t\tValidationMethods: {\r\n\t\t\t\t// Gsm number validation\r\n\t\t\t\tgsm: function(value, element){\r\n\t\t\t\t\tif (!value) return true;\r\n\t\t\t\t\tvar stripped = value.replace(/[\\D()+-]|ext\\.?/gi,\"\");\r\n\t\t\t\t\tif (stripped.length != 10) return true;\r\n\t\t\t\t\treturn stripped.match(/((54\\d)|(53\\d)|(50\\d)|(55\\d)|(56\\d))\\d{7}/);\r\n\t\t\t\t},\r\n\t\t\t\tGSM: function(value, element){\r\n\t\t\t\t\tif (!value) return true;\r\n\t\t\t\t\tvar stripped = value.replace(/[\\D()+-]|ext\\.?/gi,\"\");\r\n\t\t\t\t\tif (stripped.length != 10) return true;\r\n\t\t\t\t\treturn stripped.match(/((54\\d)|(53\\d)|(50\\d)|(55\\d)|(56\\d))\\d{7}/);\r\n\t\t\t\t},\r\n\t\t\t\t// Turkey Citizen Identity number validation\r\n\t\t\t\tTcIdentity: function(value, element){\r\n\t\t\t\t\tif ($(element).prop(\"disabled\") || PM.Get(\"Application\" , \"x_tc_kimlik_zorunlu\") !== 1) return true;\r\n\t\t\t\t\tvar toplam = Number(value.substring(0,1)) + Number(value.substring(1,2)) + Number(value.substring(2,3)) + Number(value.substring(3,4)) + Number(value.substring(4,5)) + Number(value.substring(5,6)) + Number(value.substring(6,7)) + Number(value.substring(7,8)) + Number(value.substring(8,9)) + Number(value.substring(9,10));\r\n\t\t\t\t\tvar strtoplam = String(toplam);\r\n\t\t\t\t\tvar onunbirlerbas = strtoplam.substring(strtoplam.length,strtoplam.length-1);\r\n\t\t\t\t\treturn onunbirlerbas == value.substring(10,11);\r\n\t\t\t\t},\r\n\t\t\t\t// Telephone number validation\r\n\t\t\t\tTelefon: function(value, element){\r\n\t\t\t\t\tif (!value) return true;\r\n\t\t\t\t\tif ($(element).prop(\"disabled\")) return true;\r\n\t\t\t\t\tif (value.trim().length === 0) return false;\r\n\t\t\t\t\tvar stripped = value.replace(/[\\D()+-]|ext\\.?/gi,\"\");\r\n\t\t\t\t\tif(stripped.length != 10) return true;\r\n\t\t\t\t\treturn stripped.match(/([2-5]\\d\\d)\\d{7}/);\r\n\t\t\t\t},\r\n\t\t\t\t// Checked for type checkbox\r\n\t\t\t\tchecked: function(value, element){\r\n\t\t\t\t\tif ($(element).attr(\"type\") != \"checkbox\" || $(element).prop(\"disabled\")) return true;\r\n\t\t\t\t\treturn $(element).prop(\"checked\");\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t// -------------------------- Statr -------------------------- //\r\n\r\n\tfunction Statr(data) {\r\n\t\tthis.data = data || {};\r\n\t}\r\n\r\n\tfunction dot_get(obj, path) {\r\n\t\tvar currentObj = obj,\r\n        keys = path.split(\".\"), i, l = keys.length, key;\r\n        for( i = 0; i <= keys.length - 1; ++i ) {\r\n\t\t\tkey = keys[i];\r\n\t\t\tif (!currentObj.hasOwnProperty(key)) return undefined;\r\n\t\t\tcurrentObj = currentObj[key];\r\n        }\r\n\t\treturn currentObj;\r\n\t}\r\n\r\n\tStatr.prototype = Object.create(EvEmitter.prototype);\r\n\r\n\t// Get value by key\r\n\tStatr.prototype.get = function(key) {\r\n\t\treturn dot_get(this.data, key) || null;\r\n\t}\r\n\r\n\t// Set value by key & value\r\n\tStatr.prototype.set = function(key, value) {\r\n\t\tconst oldValue = this.get(key);\r\n\t\tconst oldObj = Object.assign({}, this.data);\r\n\t\tdot_set(this.data, key, value);\r\n\t\tthis.emitEvent(key, [ value, oldValue ]);\r\n\t\tthis.emitEvent('change', [ Object.assign({}, this.data), oldObj ]);\r\n\t}\r\n\r\n\t// Set value by key & value\r\n\tStatr.prototype.connect = function(key, cb) {\r\n\t\tconst _self = this;\r\n\t\treturn function(v) {\r\n\t\t\t_self.set(key, v);\r\n\t\t\tif (!!cb) cb.apply(_self, arguments);\r\n\t\t}\r\n\t}\r\n\r\n\t// -------------------------- PlatinMarket -------------------------- //\r\n\r\n\tfunction PlatinMarket(_CsrfToken, _ActionPage, _ServerTime) {\r\n\t\tthis.CSRFToken = _CsrfToken;\r\n\t\tthis.ActionPage = _ActionPage;\r\n\t\tthis.ServerTime = _ServerTime;\r\n\t\tthis.on(\"before.init.platinmarket\", function(){\r\n\t\t\tif (window && CustomEvent && window.dispatchEvent) {\r\n\t\t\t\twindow.dispatchEvent(new CustomEvent(\"before.init.platinmarket\"));\r\n\t\t\t}\r\n\t\t});\r\n\t\t// PM Ready Event\r\n\t\tthis.on(\"ready\", function(){\r\n\r\n\t\t\t// InFrame Emit Ready Event\r\n\t\t\tif (this.InIframe() && parent.PM) parent.PM.emitEvent('ready.iframe', [window]);\r\n\r\n\t\t});\r\n\t}\r\n\r\n\tPlatinMarket.prototype = Object.create(EvEmitter.prototype);\r\n\r\n\t// Set Scope Variables like Application, Session etc.\r\n\tPlatinMarket.prototype.Set = function(Scope, Name, Value) {\r\n\t\tdot_set(_data, Scope + \".\" + Name, Value);\r\n\t\treturn Value;\r\n\t};\r\n\r\n\t// Get Scope Variables like Application, Session etc.\r\n\tPlatinMarket.prototype.Get = function(Scope, Name) {\r\n\t\treturn clone(dot_get(_data, Scope + \".\" + Name));\r\n\t};\r\n\r\n\t// Check Scope Variables defined Before.\r\n\tPlatinMarket.prototype.Defined = function(Scope, Name) {\r\n\t\treturn dot_get(_data, Scope + \".\" + Name) != undefined;\r\n\t};\r\n\r\n\t// Define if not defined\r\n\tPlatinMarket.prototype.SetDefault = function(Scope, Name, Value) {\r\n\t\tif (this.Defined(Scope, Name)) return;\r\n\t\tthis.Set(Scope, Name, Value);\r\n\t};\r\n\r\n\t// Call Page Functions\r\n\tPlatinMarket.prototype.OnPage = function(_ActionPage, _PageFunctions){\r\n\t\tif (!Array.isArray(_ActionPage)) _ActionPage = [_ActionPage];\r\n\t\tif (_ActionPage.indexOf(this.ActionPage) === -1 && _ActionPage.indexOf(\"*\") === -1) return;\r\n\t\t_PageFunctions();\r\n\t};\r\n\r\n\t// -------------------------- Methods -------------------------- //\r\n\r\n\t// Deprecated for: hizli_satin_al\r\n\tPlatinMarket.prototype.HizliSatinAl = function(type, product_id){\r\n\t\tif (type == 'tek')\r\n\t\t\t return window.location.href = \"?islem=hizli_satin_al_tek2&sid=\" + encodeURIComponent(this.CSRFToken) + \"&uid=\" + product_id.toString();\r\n\t\tif (type == 'beraber')\r\n\t\t\treturn window.location.href = \"?islem=hizli_satin_al_beraber2&sid=\" + encodeURIComponent(this.CSRFToken) + \"&uid=\" + product_id.toString();\r\n\t};\r\n\r\n\t// Deprecated for: hemenal_fonksiyon\r\n\tPlatinMarket.prototype.HemenAl = function(product_id) {\r\n\t\tPM.HizliSatinAl('beraber',product_id.toString());\r\n\t\t//window.location.href = \"?islem=hizli_satin_al_tek2&sid=\" + encodeURIComponent(this.CSRFToken) + \"&uid=\" + product_id.toString();\r\n\t};\r\n\r\n\t// UserFS Wrapper\r\n\tPlatinMarket.prototype.UserFS = {\r\n\t\tPublicUrl: function(file) { return PM.Get(\"UserFS\", 'PublicUrl(\"\")') + file.replace(/^\\/+/, \"\"); }\r\n\t};\r\n\r\n\t// SharedFS Wrapper\r\n\tPlatinMarket.prototype.SharedFS = {\r\n\t\tPublicUrl: function(file) { return PM.Get(\"SharedFS\", 'PublicUrl(\"\")') + file.replace(/^\\/+/, \"\"); }\r\n\t};\r\n\r\n\t// Keep Session Open\r\n\tPlatinMarket.prototype.KeepSession = function(_options){\r\n\t\t(function(PM){\r\n\t\t\t_options = extend(PM.Get(\"Configure\", \"KeepSession\"), _options || {});\r\n\t\t\treturn PM.Timer(_options.interval, function(){\r\n\t\t\t\tPM.Ajax({ url: _options.url + \"?_t=\" + (new Date().getTime()), dataType: \"html\" })\r\n\t\t\t\t\t.then(function(response){\r\n\t\t\t\t\t\tconsole.info(\"Session refresh complated. Got response \" + response);\r\n\t\t\t\t\t}, function(err){\r\n\t\t\t\t\t\tconsole.warn(\"Session refresh error.\", err);\r\n\t\t\t\t\t});\r\n\t\t\t});\r\n\t\t})(this);\r\n\t};\r\n\r\n\t// Make ajax call\r\n\tPlatinMarket.prototype.Ajax = function(_options, _data) {\r\n\t\treturn new Promise((resolve, reject) => {\r\n\t\t\tif (typeof _options == \"string\") _options = {url: _options};\r\n\t\t\t_options = _options || {};\r\n\t\t\t_options.data = _options.data || _data;\r\n\t\t\t_options = extend({\r\n\t\t\t\ttype: _options.data ? \"POST\" : \"GET\",\r\n\t\t\t\tdataType: \"xml\",\r\n\t\t\t\tcache: true,\r\n\t\t\t\tsuccess: function(data) {\r\n\t\t\t\t\treturn resolve(data);\r\n\t\t\t\t},\r\n\t\t\t\terror: function(xhr) {\r\n\t\t\t\t\tvar err = new Error(xhr.status.toString() + \" \" + xhr.statusText);\r\n\t\t\t\t\terr.responseText = xhr.responseText;\r\n\t\t\t\t\treturn reject(err);\r\n\t\t\t\t}\r\n\t\t\t}, _options);\r\n\t\t\t$.ajax(_options);\r\n\t\t});\r\n\t};\r\n\r\n\t// Cache remember url\r\n\tPlatinMarket.prototype.RememberUrl = function(url) {\r\n\t\tif (this.Defined(\"Cache\", url)) return Promise.resolve(this.Get(\"Cache\", url));\r\n\t\treturn this.Ajax(url).then((data) => this.Set(\"Cache\", url, data), console.error);\r\n\t}\r\n\r\n\t// Get Countries\r\n\tPlatinMarket.prototype.Countries = function() {\r\n\t\treturn this.RememberUrl(this.SharedFS.PublicUrl(\"data/ilceler.xml?q=\" + this.Get(\"AppConfig\", \"DataCacheKey\")))\r\n\t\t\t.then((data) => $(data).find(\"ulke\").toArray().map(e => $(e).attr(\"isim\").toString().trim()), console.error);\r\n\t};\r\n\r\n\t// Get Cities\r\n\tPlatinMarket.prototype.Cities = function(country) {\r\n\t\treturn this.RememberUrl(this.SharedFS.PublicUrl(\"data/ilceler.xml?q=\" + this.Get(\"AppConfig\", \"DataCacheKey\")))\r\n\t\t\t.then(d => $(d).find(\"ulke[isim='\" + country + \"'] il\").toArray().map(e => $(e).attr(\"isim\").toString().trim()));\r\n\t};\r\n\r\n\t// Get Towns\r\n\tPlatinMarket.prototype.Towns = function(country, city) {\r\n\t\treturn this.RememberUrl(this.SharedFS.PublicUrl(\"data/ilceler.xml?q=\" + this.Get(\"AppConfig\", \"DataCacheKey\")))\r\n\t\t\t.then(d => $(d).find(\"ulke[isim='\" + country + \"'] il[isim='\" + city + \"'] ilce\").toArray().map((el) => $(el).text().toString().trim()))\r\n\t};\r\n\r\n\t// Get Product detail\r\n\tPlatinMarket.prototype.ProductDetail = function(id) {\r\n\t\treturn this.Ajax({ url: \"/ajax/product/\" + id.toString(), dataType: 'json' });\r\n\t}\r\n\r\n\t// Get Product variant detail\r\n\tPlatinMarket.prototype.ProductVariantDetail = function(proId, subProId) {\r\n\t\treturn this.Ajax({ url: \"/ajax/product/\" + proId.toString() + \"/variant/\" + subProId, dataType: 'json' });\r\n\t}\r\n\r\n\t// Get product variants\r\n\tPlatinMarket.prototype.ProductVariants = function(id) {\r\n\t\treturn this.ProductDetail(id)\r\n\t\t\t.then((detail) => detail.pro_VARIANTS.map((variant) => {\r\n\t\t\t\treturn {\r\n\t\t\t\t\tid: variant.alt_urun_ID,\r\n\t\t\t\t\timage: variant.alt_URUN_RESIM || null,\r\n\t\t\t\t\tprice: (variant.alt_urun_FIYAT_TIPI === 0 ? (detail.pro_PRICE + variant.alt_urun_FIYAT) : (variant.alt_urun_FIYAT_TIPI === 1 ? (detail.pro_PRICE - variant.alt_urun_FIYAT) : variant.alt_urun_FIYAT)),\r\n\t\t\t\t\tquantity: variant.alt_urun_STOK,\r\n\t\t\t\t\tsku: variant.alt_urun_STOK_KODU,\r\n\t\t\t\t\tvalues: variant.alt_urun_VAR_DEGER.map(function(variantId) {\r\n\t\t\t\t\t\tvar _variant = detail.pro_VARIANT_NAMES.find(function(_v) { return _v.varyasyon_ID.toString() ===  variantId.toString(); });\r\n\t\t\t\t\t\treturn {\r\n\t\t\t\t\t\t\tid: _variant.varyasyon_ID,\r\n\t\t\t\t\t\t\tname: _variant.varyasyon_ISMI,\r\n\t\t\t\t\t\t\tvalue: _variant.varyasyon_DEGERLERI\r\n\t\t\t\t\t\t};\r\n\t\t\t\t\t})\r\n\t\t\t\t};\r\n\t\t\t}));\r\n\t}\r\n\r\n\t// Apply data on dom\r\n\tPlatinMarket.prototype.ApplyData = function(node, data) {\r\n\t\treturn new Promise((resolve, reject) => {\r\n\t\t\tsetTimeout(function(){\r\n\t\t\t\tnode = node.jquery ? node : $(node);\r\n\t\t\t});\r\n\t\t});\r\n\t}\r\n\r\n\t// Check Is Mobile\r\n\tPlatinMarket.prototype.IsMobile = function() {\r\n\t\tvar md = window.md ? window.md : window.md = new MobileDetect(window.navigator.userAgent);\r\n\t\treturn (md.mobile() !== null && md.tablet() === null);\r\n\t};\r\n\r\n\t// Global load images lazy-load or etc.\r\n\tPlatinMarket.prototype.LoadImages = function() {\r\n\t\twindow.callCount = window.callCount || 0;\r\n\t\tfunction _LoadImages() {\r\n\t\t\twindow.callCount++;\r\n\t\t\tif ($(\"img[data-original]\")) $(\"img[data-original]:not(.st_tab_view img, .jcarousel-container img)\").each(function(){ if ($(this).attr(\"data-lazyload-ready\") != \"true\") $(this).lazyload().attr(\"data-lazyload-ready\", \"true\"); });\r\n\t\t\t$(\"img[data-original]:not([data-lazyload-ready='true'], .st_tab_view img[data-original])\").each(function(){\r\n\t\t\t\tif ($(this).attr(\"data-lazyload-ready\") == \"true\") return;\r\n\t\t\t\t$(this).attr(\"src\", $(this).attr(\"data-original\"));\r\n\t\t\t\t$(this).attr(\"data-lazyload-ready\", \"true\");\r\n\t\t\t});\r\n\t\t\t$(\".st_tab_view\").each(function(index, element){\r\n\t\t\t\tif ($(\".st_tab_view\").length - 1 === index) return $(element).find(\"img[data-original]\").each(function(){ if ($(this).attr(\"data-lazyload-ready\") != \"true\") $(this).lazyload().attr(\"data-lazyload-ready\", \"true\"); });\r\n\t\t\t\t$(element).on(\"fadeIn\", function(){\r\n\t\t\t\t\tif ($(element).css(\"display\") != \"block\") return;\r\n\t\t\t\t\t$(element).find(\"img[data-original]:not([data-lazyload-ready='true'])\").each(function(){ if ($(this).attr(\"data-lazyload-ready\") != \"true\") $(this).lazyload().attr(\"data-lazyload-ready\", \"true\"); });\r\n\t\t\t\t\t$(window).triggerHandler(\"resize\");\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t}\r\n\t\tif (window.callCount == 0) {\r\n\t\t\t$(\"body\").off(\"load_images\").on(\"load_images\", _LoadImages);\r\n\t\t\t$(document).ready(_LoadImages);\r\n\t\t\t$(window).on('load', _LoadImages);\r\n\t\t\treturn;\r\n\t\t}\r\n\t\t_LoadImages();\r\n\t};\r\n\r\n\t// Detect iframe\r\n\tPlatinMarket.prototype.InIframe = function() {\r\n\t\ttry {\r\n\t\t\treturn window.self !== window.top;\r\n\t\t} catch (e) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\t};\r\n\r\n\t// Timer\r\n\tPlatinMarket.prototype.Timer = function(interval, callback){\r\n\t\tvar interval = interval || 100;\r\n\t\tif (!callback) return false;\r\n\t\t_timer = function (interval, callback) {\r\n\t\t\tthis.stop = function () {\r\n\t\t\t\tclearInterval(self.id);\r\n\t\t\t};\r\n\t\t\tthis.internalCallback = function () {\r\n\t\t\t\tcallback(self);\r\n\t\t\t};\r\n\t\t\tthis.reset = function (val) {\r\n\t\t\t\tif (self.id)\r\n\t\t\t\tclearInterval(self.id);\r\n\t\t\t\tvar val = val || 100;\r\n\t\t\t\tthis.id = setInterval(this.internalCallback, val);\r\n\t\t\t};\r\n\t\t\tthis.interval = interval;\r\n\t\t\tthis.id = setInterval(this.internalCallback, this.interval);\r\n\t\t\tvar self = this;\r\n\t\t};\r\n\t\treturn new _timer(interval, callback);\r\n\t};\r\n\r\n\tPlatinMarket.prototype.isNumeric = function(obj) {\r\n\t\t// parseFloat NaNs numeric-cast false positives (null|true|false|\"\")\r\n\t\t// ...but misinterprets leading-number strings, particularly hex literals (\"0x...\")\r\n\t\t// subtraction forces infinities to NaN\r\n\t\t// adding 1 corrects loss of precision from parseFloat (#15100)\r\n\t\treturn !Array.isArray( obj ) && (obj - parseFloat( obj ) + 1) >= 0;\r\n\t};\r\n\r\n\t// Validate Options\r\n\tPlatinMarket.prototype.ValidationOptions = function(_options, form_name){\r\n\t\tif (typeof _options == \"string\") {\r\n\t\t\tform_name = _options;\r\n\t\t\t_options = {};\r\n\t\t}\r\n\t\treturn $.extend({\r\n\t\t\terrorElement: this.InIframe() ? \"span\" : \"em\",\r\n\t\t\terrorClass: \"help-block \" + this.ActionPage + \"_error\",\r\n\t\t\terrorPlacement: function(error, element) {\r\n\t\t\t\telement.parent().find(\"span.help-block, em\").remove();\r\n\t\t\t\telement.parent().append(error);\r\n\t\t\t},\r\n\t\t\thighlight: function(element, errorClass, validClass) {\r\n\t\t\t\tif ($(element).parent(\"div\")[0] && $(element).parent(\"div\")[0].nodeName == \"DIV\") $(element).parent().addClass(\"has-error\");\r\n\t\t\t\t$(element).addClass(errorClass).removeClass(validClass);\r\n\t\t\t\tif (element.id) $(element.form).find(this.errorElement + \"[for=\" + element.id + \"]\").addClass(errorClass);\r\n\t\t\t},\r\n\t\t\tunhighlight: function(element, errorClass, validClass) {\r\n\t\t\t\tif ($(element).parent(\"div\")[0] && $(element).parent(\"div\")[0].nodeName == \"DIV\") $(element).parent().removeClass(\"has-error\");\r\n\t\t\t\t$(element).removeClass(errorClass).addClass(validClass);\r\n\t\t\t\tif (element.id) $(element.form).find(this.errorElement + \"[for=\" + element.id + \"]\").removeClass(errorClass);\r\n\t\t\t},\r\n\t\t\tsubmitHandler: function(form) {\r\n\t\t\t\t$(form).find(\"button[type='submit'], input[type='submit']\").disable();\r\n\t\t\t\tvar e = new $.Event(\"submit.\" + this.ActionPage + \".form\");\r\n\t\t\t\t$(form).triggerHandler(e);\r\n\t\t\t\tif (e.isDefaultPrevented()) return false;\r\n\t\t\t\tform.trigger('submit');\r\n\t\t\t}\r\n\t\t}, $.extend(this.GetValidationRules(form_name), _options || {}));\r\n\t};\r\n\r\n\t// Validation Rules\r\n\tPlatinMarket.prototype.GetValidationRules = function(form_name) {\r\n\t\tform_name = form_name || PM.ActionPage;\r\n\t\tvar messages = this.Get(\"Configure\", \"ValidationRules._messages\");\r\n\t\tif (form_name.indexOf(\".\") == -1) form_name = form_name + \"._base\";\r\n\t\tvar rules = this.Get(\"Configure\", \"ValidationRules.\" + form_name) || {};\r\n\t\tif (form_name.indexOf(\"._base\") == -1) rules = $.extend(this.Get(\"Configure\", \"ValidationRules.\" + form_name.replace(/\\.(.*)/, \"._base\")) || {}, rules);\r\n\t\trules = {\r\n\t\t\trules: rules,\r\n\t\t\tmessages: messages\r\n\t\t};\r\n\t\tthis.emitEvent(\"set.\" + form_name, [rules]);\r\n\t\treturn rules;\r\n\t};\r\n\r\n\t// Rate Product\r\n\tPlatinMarket.prototype.RateProduct = function(productId, rating){\r\n\t\treturn PM.Ajax({url: \"/scripts/urune_oy_ver.asp?islem=urune_oy_ver&sid=\" + this.CSRFToken + \"&urun_id=\" + productId.toString() + \"&_t\" + (new Date().getTime()), dataType: \"html\"}, {rating: rating});\r\n\t}\r\n\r\n\t// Init Location Selector\r\n\tPlatinMarket.prototype.InitLocationSelector = function(_countrySelector, _citySelector, _townSelector, _countryFilter) {\r\n\t\tif (typeof _countryFilter != \"function\") _countryFilter = function(country){ return PM.Get(\"Application\", \"strSIPARIS_ULKELERI\").indexOf(\"{\" + country + \"}\") > -1; };\r\n\r\n\t\treturn new Promise((resolve, reject) => {\r\n\t\t\tvar $_country = $(_countrySelector).length > 0 ? $(_countrySelector) : undefined;\r\n\t\t\tvar $_city = $(_citySelector).length > 0 ? $(_citySelector) : undefined;\r\n\t\t\tvar $_town = $(_townSelector).length > 0 ? $(_townSelector) : undefined;\r\n\r\n\t\t\tif (!$_country || ($_town && !$_city)) return resolve();\r\n\r\n\t\t\t$_country.on(\"change\", function(){\r\n\t\t\t\tif (!$_city) return;\r\n\t\t\t\t$_city.clear().disable();\r\n\t\t\t\tif ($_town) $_town.clear().disable();\r\n\t\t\t\tPM.Cities($(this).val())\r\n\t\t\t\t\t.then(function(cities){\r\n\r\n\t\t\t\t\t\t// Emit event for fill\r\n\t\t\t\t\t\tvar e = new $.Event('before.fill', { cities: cities });\r\n\t\t\t\t\t\t$_city.trigger(e);\r\n\t\t\t\t\t\tcities = e.cities;\r\n\r\n\t\t\t\t\t\tif (!cities.length) return $_city.add($_town).convertInputBox({show: true}).trigger(\"change\");\r\n\r\n\t\t\t\t\t\t$_town.convertInputBox({show: false});\r\n\t\t\t\t\t\t$_city\r\n\t\t\t\t\t\t\t.convertInputBox({show: false})\r\n\t\t\t\t\t\t\t.fill(([{name: \"Seçiniz\", value:\"\"}]).concat(cities))\r\n\t\t\t\t\t\t\t.val($_city.attr(\"data-selected\") && cities.indexOf($_city.attr(\"data-selected\")) > -1 ? $_city.attr(\"data-selected\") : \"\")\r\n\t\t\t\t\t\t\t.trigger(\"change\")\r\n\t\t\t\t\t\t\t.enable();\r\n\t\t\t\t\t});\r\n\t\t\t});\r\n\r\n\t\t\t$_city.on(\"change\", function(){\r\n\t\t\t\tif (!$_town || !$(this).val()) return;\r\n\t\t\t\t$_town.clear().disable();\r\n\t\t\t\tPM.Towns($_country.val(), $(this).val())\r\n\t\t\t\t\t.then(function(towns){\r\n\r\n\t\t\t\t\t\t// Emit event for fill\r\n\t\t\t\t\t\tvar e = new $.Event('before.fill', { towns: towns });\r\n\t\t\t\t\t\t$_town.trigger(e);\r\n\t\t\t\t\t\ttowns = e.towns;\r\n\r\n\t\t\t\t\t\tif (!towns.length) return $_town.convertInputBox({show: true}).trigger(\"change\");\r\n\r\n\t\t\t\t\t\t$_town\r\n\t\t\t\t\t\t\t.convertInputBox({show: false})\r\n\t\t\t\t\t\t\t.fill(([{name: \"Seçiniz\", value:\"\"}]).concat(towns))\r\n\t\t\t\t\t\t\t.val($_town.attr(\"data-selected\") && towns.indexOf($_town.attr(\"data-selected\")) > -1 ? $_town.attr(\"data-selected\") : \"\")\r\n\t\t\t\t\t\t\t.trigger(\"change\")\r\n\t\t\t\t\t\t\t.enable();\r\n\t\t\t\t\t});\r\n\t\t\t});\r\n\r\n\t\t\tPM.Countries()\r\n\t\t\t\t.then(function(countries){\r\n\r\n\t\t\t\t\t// Emit event for fill\r\n\t\t\t\t\tvar e = new $.Event('before.fill', { countries: countries });\r\n\t\t\t\t\t$_country.trigger(e);\r\n\t\t\t\t\tcountries = e.countries;\r\n\r\n\t\t\t\t\t$_country.clear().fill(_.filter(countries, _countryFilter));\r\n\t\t\t\t\t$_country.val($_country.attr(\"data-selected\") || countries[0]);\r\n\t\t\t\t\t$_country.trigger(\"change\");\r\n\t\t\t\t\tresolve();\r\n\t\t\t\t});\r\n\t\t});\r\n\t};\r\n\r\n\t// Depends to field for validation\r\n\tPlatinMarket.prototype.depends = function(field, expectedVal) {\r\n\t\treturn function(){\r\n\t\t\treturn $(field).val().toString() === expectedVal.toString();\r\n\t\t}\r\n\t};\r\n\r\n\t// -------------------------- jQuery -------------------------- //\r\n\r\n\tPlatinMarket.makeJQueryPlugins = function(jQuery) {\r\n\t\tjQuery = jQuery || window.jQuery;\r\n\t\tif ( !jQuery ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// set local variable\r\n\t\t$ = jQuery;\r\n\r\n\t\t// Tab selector\r\n\t\t$.fn.tabSelector = function(options) {\r\n\r\n\t\t\t// Return given tab\r\n\t\t\tif (['string', 'number'].indexOf(typeof options) > -1) {\r\n\t\t\t\tif (options === 'all') return $(this).toArray().map(el => $(el).data('_tab'));\r\n\t\t\t\treturn $(this).toArray().map(el => $(el).data('_tab')).find(i => !!i && i[0] === options);\r\n\t\t\t}\r\n\r\n\t\t\t// Parse options\r\n\t\t\toptions = Object.assign({\r\n\t\t\t\ttarget: 'tabTarget',\r\n\t\t\t\tselected: null,\r\n\t\t\t\tactiveClass: 'active',\r\n\t\t\t\tvalue: null,\r\n\t\t\t\tchange: () => {}\r\n\t\t\t}, options || {});\r\n\r\n\t\t\t// Get target contents\r\n\t\t\tconst tabs = $(this).toArray().map((el, i) => [ (options.value ? $(el).data(options.value) : i), $(el), $($(el).data(options.target)), false ]);\r\n\r\n\t\t\t// Set tabs to element\r\n\t\t\ttabs.forEach(t => t[1].data('_tab', t));\r\n\r\n\t\t\t// Set selected\r\n\t\t\tif (options.selected === null) {\r\n\t\t\t\tconst selectedNode = tabs.find(t => t[0] === options.value);\r\n\t\t\t\toptions.selected = !!selectedNode ? selectedNode[0] : tabs[0][0];\r\n\t\t\t}\r\n\r\n\t\t\t// Holds current value\r\n\t\t\tlet currentValue = null;\r\n\r\n\t\t\t// Tab changer\r\n\t\t\tconst changeTab = (tab) => {\r\n\t\t\t\t// Check already selected\r\n\t\t\t\tif (!tab || currentValue === tab[0]) return;\r\n\r\n\t\t\t\t// Emit event\r\n\t\t\t\tconst changeEvt = $.Event('change.tab');\r\n\t\t\t\t$(this).trigger(changeEvt, tab[0]);\r\n\t\t\t\tif (changeEvt.isDefaultPrevented()) return;\r\n\r\n\t\t\t\t// Maintain current active tab\r\n\t\t\t\tconst currentTab = tabs.find(t => t[0] === currentValue);\r\n\t\t\t\tif (currentTab) {\r\n\t\t\t\t\tcurrentTab[1].removeClass(options.activeClass);\r\n\t\t\t\t\tcurrentTab[2].hide();\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Select new tab\r\n\t\t\t\tconst newTab = tabs.find(t => t[0] === tab[0]);\r\n\t\t\t\tif (newTab) {\r\n\t\t\t\t\tnewTab[1].addClass(options.activeClass);\r\n\t\t\t\t\tnewTab[2].show();\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Set tabs\r\n\t\t\t\ttabs.forEach(t => t[3] = (t === tab));\r\n\r\n\t\t\t\t// Emit event\r\n\t\t\t\tconst changedEvt = $.Event('changed.tab');\r\n\t\t\t\tnewTab[1].trigger(changedEvt, currentValue = tab[0]);\r\n\r\n\t\t\t\t// Callback\r\n\t\t\t\toptions.change.call(options, tab[0], tab);\r\n\t\t\t};\r\n\r\n\t\t\t// Select default tab\r\n\t\t\tconst initialSelected = tabs.find(t => t[0] === options.selected);\r\n\t\t\tchangeTab(initialSelected);\r\n\t\t\ttabs.filter(t => t !== initialSelected).forEach(t => t[2].hide());\r\n\r\n\t\t\t// Listen click event\r\n\t\t\t$(this).on('click', function(e) {\r\n\t\t\t\te.preventDefault();\r\n\t\t\t\tchangeTab(tabs.find(t => t[1].is($(this))));\r\n\t\t\t});\r\n\r\n\t\t\t// Return tabs\r\n\t\t\treturn $(tabs);\r\n\t\t};\r\n\r\n\t\t// List selector\r\n\t\t$.fn.listSelector = function(options) {\r\n\r\n\t\t\t// Return given item\r\n\t\t\tif (['string', 'number'].indexOf(typeof options) > -1) {\r\n\t\t\t\tif (options === 'all') return $(this).toArray().map(el => $(el).data('_item'));\r\n\t\t\t\treturn $(this).toArray().map(el => $(el).data('_item')).find(i => i[0] === options);\r\n\t\t\t}\r\n\r\n\t\t\t// Parse options\r\n\t\t\toptions = Object.assign({\r\n\t\t\t\tselected: null,\r\n\t\t\t\tactiveClass: 'active',\r\n\t\t\t\tvalue: null,\r\n\t\t\t\tchange: () => {}\r\n\t\t\t}, options || {});\r\n\r\n\t\t\t// Get items\r\n\t\t\tconst items = $(this).toArray().map((el, i) => [ (options.value ? $(el).data(options.value) : i), $(el), false ]);\r\n\r\n\t\t\t// Set items to element\r\n\t\t\titems.forEach(i => i[1].data('_item', i));\r\n\r\n\t\t\t// Set selected\r\n\t\t\tif (options.selected === null) {\r\n\t\t\t\tconst selectedNode = items.find(t => t[0] === options.value);\r\n\t\t\t\toptions.selected = !!selectedNode ? selectedNode[0] : (items.length ? items[0][0] : null);\r\n\t\t\t}\r\n\r\n\t\t\t// Holds current value\r\n\t\t\tlet currentValue = null;\r\n\r\n\t\t\t// Item changer\r\n\t\t\tconst changeItem = (item) => {\r\n\t\t\t\t// Check already selected\r\n\t\t\t\tif (!item || currentValue === item[0]) return;\r\n\r\n\t\t\t\t// Emit event\r\n\t\t\t\tconst changeEvt = $.Event('change.item');\r\n\t\t\t\t$(this).trigger(changeEvt, item[0]);\r\n\t\t\t\tif (changeEvt.isDefaultPrevented()) return;\r\n\r\n\t\t\t\t// Maintain current active item\r\n\t\t\t\tconst currentItem = items.find(t => t[0] === currentValue);\r\n\t\t\t\tif (currentItem) {\r\n\t\t\t\t\tcurrentItem[1]\r\n\t\t\t\t\t\t.removeClass(options.activeClass)\r\n\t\t\t\t\t\t.find(\"input[type='radio'], input[type='checkbox']\").prop('checked', false);\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Select new item\r\n\t\t\t\tconst newItem = items.find(t => t[0] === item[0]);\r\n\t\t\t\tif (newItem) {\r\n\t\t\t\t\tnewItem[1]\r\n\t\t\t\t\t\t.addClass(options.activeClass)\r\n\t\t\t\t\t\t.find(\"input[type='radio'], input[type='checkbox']\").prop('checked', true);\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Set items\r\n\t\t\t\titems.forEach(i => i[2] = (i === item));\r\n\r\n\t\t\t\t// Emit event\r\n\t\t\t\tconst changedEvt = $.Event('changed.tab');\r\n\t\t\t\tnewItem[1].trigger(changedEvt, currentValue = item[0]);\r\n\r\n\t\t\t\t// Callback\r\n\t\t\t\toptions.change.call(options, item[0], item);\r\n\t\t\t};\r\n\r\n\t\t\t// Select default tab\r\n\t\t\tconst initialSelected = items.find(t => t[0] === options.selected);\r\n\t\t\tchangeItem(initialSelected);\r\n\t\t\titems.filter(t => t !== initialSelected).forEach(t => t[1].find(\"input[type='radio'], input[type='checkbox']\").prop(\"checked\", false));\r\n\r\n\t\t\t// Listen click event\r\n\t\t\t$(this).on('click', function(e) {\r\n\t\t\t\te.preventDefault();\r\n\t\t\t\tchangeItem(items.find(t => t[1].is($(this))));\r\n\t\t\t});\r\n\r\n\t\t\t// Return items\r\n\t\t\treturn $(items);\r\n\t\t};\r\n\r\n\t\t// Scroll to top\r\n\t\t$.fn.scrollToTop = function() {\r\n\t\t\t$(this).each(function(){\r\n\t\t\t\tvar scrollDiv = $(this);\r\n\t\t\t\twindow.addEventListener('scroll', () => $(scrollDiv).clearQueue().animate({ opacity: $(window).scrollTop() === 0 ? 0 : 1 }, 100), { passive: true });\r\n\t\t\t\t$(window).triggerHandler('scroll');\r\n\t\t\t\t$(this).css('opacity', 0).on('click', function(e){\r\n\t\t\t\t\te.preventDefault();\r\n\t\t\t\t\t$(\"html, body\").clearQueue().animate({ scrollTop: 0 }, \"fast\");\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t};\r\n\r\n\t\t// Delay Keyup\r\n\t\t$.fn.delayKeyup = function(callback, ms){\r\n\t\t\tvar timer = 0;\r\n\t\t\t$(this).each(function(){\r\n\t\t\t\t$(this).on('keyup', function(e) {\r\n\t\t\t\t\tvar node = this;\r\n\t\t\t\t\tvar timer = $(this).data(\"keyup_timer\");\r\n\t\t\t\t\tif (timer) clearTimeout(timer);\r\n\t\t\t\t\t$(node).data(\"keyup_timer\", setTimeout(function(){\r\n\t\t\t\t\t\tcallback.apply($(node), [e]);\r\n\t\t\t\t\t}, ms));\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t\treturn $(this);\r\n\t\t};\r\n\r\n\t\t// Lazyload change src\r\n\t\tconst _lazyLoad = $.fn.lazyload;\r\n\t\t$.fn.lazyload = function(options) {\r\n\t\t\toptions = Object.assign({ src: 'data-original' }, options || {});\r\n\t\t\treturn _lazyLoad.call(this, options);\r\n\t\t};\r\n\r\n\t\t// $().imagesLoaded()\r\n\t\t$.fn.imagesLoaded = function(callback) {\r\n\t\t\tvar $images = this.find(\"img\");\r\n\t\t\tif ($images.length === 0) return callback();\r\n\t\t\tvar loadCount = $images.length;\r\n\t\t\tfunction IsImageOk(img) {\r\n\t\t\t\tif (!img.complete) return false;\r\n\t\t\t\tif (typeof img.naturalWidth !== \"undefined\" && img.naturalWidth === 0) return false;\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t\tfunction CheckImages(imgs) {\r\n\t\t\t\tvar imagesAllOk = false;\r\n\t\t\t\t$images.each(function(i, elem){\r\n\t\t\t\t\timagesAllOk = IsImageOk(elem);\r\n\t\t\t\t});\r\n\t\t\t\treturn imagesAllOk;\r\n\t\t\t}\r\n\t\t\tvar checkImages = setInterval(function(){\r\n\t\t\t\tif (!CheckImages($images)) return;\r\n\t\t\t\tclearInterval(checkImages);\r\n\t\t\t\tcallback();\r\n\t\t\t}, 50);\r\n\t\t};\r\n\r\n\t\t// EqualHeights\r\n\t\t$.fn.equalHeight = function(cb) {\r\n\t\t\tif (!cb) cb = function(){};\r\n\t\t\tvar e = new $.Event(\"init.equal.height\");\r\n\t\t\t$('body').triggerHandler(e);\r\n\t\t\tif (e.isDefaultPrevented()) return cb(false);\r\n\t\t\t(function(nodes, cb){\r\n\t\t\t\tif (nodes.length === 0) return cb();\r\n\t\t\t\tnodes.imagesLoaded(function(){\r\n\t\t\t\t\tvar tallest = 0;\r\n\t\t\t\t\tnodes.each(function(elemIndex, elem) {\r\n\t\t\t\t\t\tvar thisHeight = $(elem).height();\r\n\t\t\t\t\t\tif(thisHeight > tallest) tallest = thisHeight;\r\n\t\t\t\t\t});\r\n\t\t\t\t\tnodes.height(tallest);\r\n\t\t\t\t\treturn cb(tallest);\r\n\t\t\t\t});\r\n\t\t\t})(this, cb);\r\n\t\t};\r\n\r\n\t\t// Set Loading\r\n\t\t$.fn.dataLoading = function(state) {\r\n\t\t\tif (typeof state != \"boolean\") state = !$(this).hasClass(\"data-loading\");\r\n\t\t\tif (state === true && $(this).hasClass(\"data-loading\")) return this;\r\n\t\t\treturn (state ? $(this).addClass(\"data-loading\") : $(this).removeClass(\"data-loading\"));\r\n\t\t};\r\n\r\n\t\t// Add option to selectbox\r\n\t\t$.fn.addOption = function(name, value) {\r\n\t\t\treturn $(this).each(function(){\r\n\t\t\t\tif (this.nodeName != \"SELECT\") return;\r\n\t\t\t\tvar _option = document.createElement(\"option\");\r\n\t\t\t\tif (typeof value == \"undefined\") value = name;\r\n\t\t\t\t$(_option)\r\n\t\t\t\t\t.attr(\"value\", value)\r\n\t\t\t\t\t.html(name);\r\n\t\t\t\t$(this).append(_option);\r\n\t\t\t});\r\n\t\t};\r\n\r\n\t\t// Clear node\r\n\t\t$.fn.clear = function() {\r\n\t\t\treturn $(this).each(function(){\r\n\t\t\t\tswitch (this.nodeName) {\r\n\t\t\t\t\tcase \"SELECT\":\r\n\t\t\t\t\t\t$(this).children(\"option\").remove();\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase \"INPUT\":\r\n\t\t\t\t\t\tif ($(this).attr(\"type\") == \"checkbox\")\r\n\t\t\t\t\t\t\tthis.checked = false;\r\n\t\t\t\t\t\telse\r\n\t\t\t\t\t\t\t$(this).val(\"\");\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase \"TEXTAREA\":\r\n\t\t\t\t\t\t$(this).val(\"\");\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tdefault:\r\n\t\t\t\t\t\t$(this).html(\"\");\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t};\r\n\r\n\t\t// Checkbox\r\n\t\t$.fn.checked = function(){\r\n\t\t\tvar node = $(this)[0];\r\n\t\t\tif (node.nodeName.toLowerCase() != \"input\" || ([\"checkbox\", \"radio\"]).indexOf($(node).attr(\"type\").toLowerCase()) === -1) return;\r\n\t\t\treturn node.checked === true;\r\n\t\t};\r\n\t\t// Check checkbox\r\n\t\t$.fn.check = function(state){\r\n\t\t\tvar node = $(this)[0];\r\n\t\t\tif (node.nodeName.toLowerCase() != \"input\" || ([\"checkbox\", \"radio\"]).indexOf($(node).attr(\"type\").toLowerCase()) === -1) return;\r\n\t\t\tnode.checked === state || true;\r\n\t\t\t$(node).triggerHandler(\"change\");\r\n\t\t};\r\n\r\n\t\t// Override orginal val function\r\n\t\t_val = $.fn.val;\r\n\t\t$.fn.val = function(newVal) {\r\n\t\t\tif (newVal) {\r\n\t\t\t\t$(this).each(function(){\r\n\t\t\t\t\tif (this.nodeName == \"SELECT\") $(this).attr(\"data-selected\", newVal);\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t\treturn _val.apply(this, arguments);\r\n\t\t};\r\n\r\n\t\t// Reset All\r\n\t\t$.fn.reset = function() {\r\n\t\t\treturn $(this).each (function() {\r\n\t\t\t\tthis.reset();\r\n\t\t\t});\r\n\t\t};\r\n\r\n\t\t// Convert selectbox to inputbox\r\n\t\t$.fn.convertInputBox = function(_options){\r\n\t\t\tif (typeof options != \"undefined\" && !$.isPlainObject(_options)) _options = {show: _options};\r\n\t\t\t_options = $.extend({\r\n\t\t\t\tinputClass: \"from_select_box\",\r\n\t\t\t\tshow: true,\r\n\t\t\t\tinputValue: \"\"\r\n\t\t\t}, _options || {});\r\n\t\t\tif (_options.show === false && !$(this).data(\"clone_input\")) return $(this);\r\n\t\t\treturn $(this).each(function(){\r\n\t\t\t\tif (this.nodeName != \"SELECT\") return;\r\n\t\t\t\tvar input = $(this).data(\"clone_input\");\r\n\t\t\t\tif (!input) { // Create input\r\n\t\t\t\t\tinput = document.createElement(\"input\");\r\n\t\t\t\t\t$(input)\r\n\t\t\t\t\t\t.attr(\"class\", $(this).attr(\"class\"))\r\n\t\t\t\t\t\t.attr(\"style\", $(this).attr(\"style\"))\r\n\t\t\t\t\t\t.attr(\"type\", \"text\")\r\n\t\t\t\t\t\t.addClass(_options.inputClass)\r\n\t\t\t\t\t\t.data(\"clone_select\", this)\r\n\t\t\t\t\t\t.data(\"clone_name\", $(this).attr(\"name\"))\r\n\t\t\t\t\t\t.hide();\r\n\t\t\t\t\t$(this)\r\n\t\t\t\t\t\t.after(input)\r\n\t\t\t\t\t\t.data(\"clone_input\", input);\r\n\t\t\t\t}\r\n\t\t\t\tif (_options.show === true) {\r\n\t\t\t\t\t$(this)\r\n\t\t\t\t\t\t.attr(\"name\", $(input).data(\"clone_name\") + \"_clone\")\r\n\t\t\t\t\t\t.hide();\r\n\t\t\t\t\t$(input)\r\n\t\t\t\t\t\t.attr(\"name\", $(input).data(\"clone_name\"))\r\n\t\t\t\t\t\t.val(_options.inputValue || $(this).attr(\"data-selected\"))\r\n\t\t\t\t\t\t.show();\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\t$(input)\r\n\t\t\t\t\t.attr(\"name\", $(input).data(\"clone_name\") + \"_clone\")\r\n\t\t\t\t\t.hide();\r\n\t\t\t\t$(this)\r\n\t\t\t\t\t.attr(\"name\", $(input).data(\"clone_name\"))\r\n\t\t\t\t\t.show();\r\n\t\t\t});\r\n\t\t};\r\n\r\n\t\t// Select option\r\n\t\t$.fn.selected = function(){\r\n\t\t\tvar node = $(this)[0];\r\n\t\t\tif (node.nodeName.toLowerCase() != \"option\") return;\r\n\t\t\treturn node.selected === true;\r\n\t\t};\r\n\r\n\t\t// Fill select box\r\n\t\t$.fn.fill = function(data){\r\n\t\t\treturn $(this).each(function(){\r\n\t\t\t\tswitch (this.nodeName) {\r\n\t\t\t\t\tcase \"SELECT\":\r\n\t\t\t\t\t\tif (!Array.isArray(data)) data = [data];\r\n\t\t\t\t\t\tvar node = this;\r\n\t\t\t\t\t\tdata.forEach(function(arrElement){\r\n\t\t\t\t\t\t\tvar name = typeof arrElement == \"object\" ? arrElement.name : arrElement;\r\n\t\t\t\t\t\t\tvar value = typeof arrElement == \"object\" ? arrElement.value : name;\r\n\t\t\t\t\t\t\t$(node).addOption(name, value);\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase \"INPUT\":\r\n\t\t\t\t\t\tif ($(this).attr(\"type\") == \"checkbox\")\r\n\t\t\t\t\t\t\tthis.checked = (data === true) ? true : false;\r\n\t\t\t\t\t\telse\r\n\t\t\t\t\t\t\t$(this).val(data);\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase \"TEXTAREA\":\r\n\t\t\t\t\t\t$(this).val(data);\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tdefault:\r\n\t\t\t\t\t\t$(this).html(data);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t};\r\n\r\n\t\t// Set node\r\n\t\t$.fn.set = function(data){\r\n\t\t\treturn $(this).each(function(){\r\n\t\t\t\tswitch (this.nodeName) {\r\n\t\t\t\t\tcase \"INPUT\":\r\n\t\t\t\t\t\tif ([\"checkbox\", \"radio\"].indexOf($(this).attr(\"type\")) > -1) return this.checked = (data == true) ? true : false;\r\n\t\t\t\t\t\t$(this).val(data);\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tdefault:\r\n\t\t\t\t\t\t$(this).val(data);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t};\r\n\r\n\t\t// Slide by mouse tiny images in product detail bottom of main picture\r\n\t\t$.fn.slideByMouse = function(options) {\r\n\t\t\tvar target = this;\r\n\t\t\tvar options = extend({\r\n\t\t\t\tscanOffset: 0\r\n\t\t\t}, options || {});\r\n\t\t\t// Set padding to zero\r\n\t\t\ttarget.css(\"padding\", \"0px\");\r\n\t\t\t// Set mouse to object\r\n\t\t\tvar Mouse = { x:0, y:0 };\r\n\t\t\t// Set or Get default values\r\n\t\t\ttarget.data('LeftOffset', target.outerWidth() - target.innerWidth());\r\n\t\t\ttarget.data('Width', target.outerWidth());\r\n\t\t\ttarget.data('Left', target.offset().left);\r\n\t\t\ttarget.data('Right', target.data('Left') + target.data('Width') + (target.data('LeftOffset') / 2));\r\n\t\t\ttarget.data('Top', target.offset().top);\r\n\t\t\ttarget.data('Bottom', target.outerHeight() + target.data('Top'));\r\n\t\t\t// Set slide elements\r\n\t\t\ttarget.data('Slides', (function(t){\r\n\t\t\t\tvar slideCount = parseInt(t.find('.urun_resmi_kucuk_content').length, 10);\r\n\t\t\t\tvar oneWidth = t.find('.urun_resmi_kucuk_content:last').outerWidth();\r\n\t\t\t\treturn {\r\n\t\t\t\t\tCount: slideCount,\r\n\t\t\t\t\tWidth: oneWidth * slideCount,\r\n\t\t\t\t\toneWidth: oneWidth\r\n\t\t\t\t};\r\n\t\t\t})(target));\r\n\t\t\t// Set container\r\n\t\t\ttarget.data('Container', target.find('.urun_resmi_kucuk_container'));\r\n\t\t\ttarget.data('Container').data('Width', target.data('Slides').Width);\r\n\t\t\ttarget.data('Container').css('width', target.data('Container').data('Width'));\r\n\t\t\ttarget.data('Container').data('CurrentLeft', function(){\r\n\t\t\t\treturn parseFloat(target.data('Container').css(\"left\").replace(\"px\", \"\"), 10);\r\n\t\t\t});\r\n\t\t\ttarget.data('Container').data('MouseXOffset', function(){\r\n\t\t\t\treturn Mouse.x - target.data('Left') - (options.scanOffset / 2);\r\n\t\t\t});\r\n\t\t\ttarget.data('Container').data('SetLeft', function(leftPos){\r\n\t\t\t\ttarget.data('Container').clearQueue();\r\n\t\t\t\tif (Math.abs(Math.abs(target.data('Container').data('CurrentLeft')()) - Math.abs(leftPos)) > 80)\r\n\t\t\t\t\treturn target.data('Container').animate({ left: leftPos }, 100);\r\n\t\t\t\ttarget.data('Container').css(\"left\", leftPos + \"px\");\r\n\t\t\t});\r\n\t\t\t// Set left to zero\r\n\t\t\ttarget.data('Container').data('SetLeft')(0);\r\n\t\t\ttarget.data('Container').data('SlideOffset', target.data('Container').data('Width') - target.data('Width'));\r\n\t\t\ttarget.data('Container').data('GetMouseOffset', function(){\r\n\t\t\t\treturn (target.data('Container').data('SlideOffset') * target.data('Container').data('MouseXOffset')()) / (target.data('Width') - options.scanOffset);\r\n\t\t\t});\r\n\r\n\t\t\t// Set scan offset to half of width\r\n\t\t\tif (options.scanOffset !== 0)\r\n\t\t\t\toptions.scanOffset = (target.data('Width') * options.scanOffset) / 100;\r\n\r\n\t\t\t// Load if required\r\n\t\t\tif (target.data('Slides').Width >= target.data('Width'))\t{\r\n\t\t\t\ttarget.on('mousemove', function(e){\r\n\t\t\t\t\tMouse.x = e.pageX;\r\n\t\t\t\t\tMouse.y = e.pageY;\r\n\t\t\t\t\tif (Mouse.x < (options.scanOffset / 2)  + target.data('Left'))\r\n\t\t\t\t\t\tMouse.x = target.data('Left') + (options.scanOffset / 2);\r\n\t\t\t\t\telse if (Mouse.x > (target.data('Left') + (target.data('Width') - (options.scanOffset / 2))))\r\n\t\t\t\t\t\tMouse.x = (target.data('Left') + (target.data('Width') - (options.scanOffset / 2)));\r\n\t\t\t\t\ttarget.data('Container').data('SetLeft')(0 - target.data('Container').data('GetMouseOffset')());\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\t// Toggle disable/enable\r\n\t\t$.fn.toggleDisable = function(){\r\n\t\t\t$(this).each(function(){\r\n\t\t\t\t$(this).prop(\"disabled\") ? $(this).enable() : $(this).disable();\r\n\t\t\t});\r\n\t\t};\r\n\r\n\t\t// Set disable\r\n\t\t$.fn.disable = function(){\r\n\t\t\t$(this).find(\"input, select, textarea\").add(this).each(function(){\r\n\t\t\t\t$(this).prop(\"disabled\", true);\r\n\t\t\t});\r\n\t\t};\r\n\r\n\t\t// Set enable\r\n\t\t$.fn.enable = function(){\r\n\t\t\t$(this).find(\"input, select, textarea\").add(this).each(function(){\r\n\t\t\t\t$(this).prop(\"disabled\", false);\r\n\t\t\t});\r\n\t\t};\r\n\r\n\t\t// Set readonly\r\n\t\t$.fn.readOnly = function(_state){\r\n\t\t\tif (typeof _state != \"boolean\") _state = true;\r\n\t\t\treturn $(this).each(function(){\r\n\t\t\t\t$(this).prop(\"readOnly\", _state);\r\n\t\t\t});\r\n\t\t};\r\n\r\n\t\t// Disable Bind\r\n\t\t$.fn.bindDisable = function(){\r\n\t\t\treturn $(this).each(function(){\r\n\t\t\t\tvar fn = $(this).attr(\"data-disable\") || $(this).attr(\"data-enable\");\r\n\t\t\t\tvar _fn = $(this).attr(\"data-enable\") ? \"enable\" : \"disable\";\r\n\t\t\t\tvar value = fn[0] == \"#\" || fn[0] == \".\" ? $(fn) : eval(fn);\r\n\t\t\t\tif (value instanceof $) {\r\n\t\t\t\t\t(function(listener, target, _fn){\r\n\t\t\t\t\t\tlistener.on(\"change click keyup\", function(){\r\n\t\t\t\t\t\t\t$(this).attr(\"type\") == \"checkbox\" && this.checked || $(this).attr(\"type\") != \"checkbox\" && $(this).val() ? $(target)[_fn]() : $(target)[_fn == \"enable\" ? \"disable\" : \"enable\"]();\r\n\t\t\t\t\t\t}).triggerHandler(\"change\");\r\n\t\t\t\t\t})(value, this, _fn);\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tvalue ? $(this)[_fn]() : $(this)[_fn == \"enable\" ? \"disable\" : \"enable\"]();\r\n\t\t\t});\r\n\t\t};\r\n\r\n\t\t// JCarousel Wrapper\r\n\t\t$.fn.platinCarousel = function(_options){\r\n\t\t\tif (!$.fn.jcarousel) return console.error(\"JCarousel not found!\");\r\n\r\n\t\t\t_options = $.extend(PM.Get(\"Configure\", \"JCarousel\"), _options || {});\r\n\r\n\t\t\treturn $(this).each(function(){\r\n\t\t\t\tif (!$(this).find(\"li\")[0]) return $(this).next().remove();\r\n\r\n\t\t\t\t$(this).find(\"li\").addClass(\"jcarousel-item\");\r\n\r\n\t\t\t\t// Emit event for init jcarousel\r\n\t\t\t\tvar e = new $.Event('init.jcarousel');\r\n\t\t\t\tPM.emitEvent(e.type, [e, this, _options]);\r\n\t\t\t\tif (e.isDefaultPrevented()) return $(this).next().remove();\r\n\r\n\t\t\t\t// Prevent LazyLoad\r\n\t\t\t\t$(this).find(\"img[data-original]\").each(function(){\r\n\t\t\t\t\t$(this)\r\n\t\t\t\t\t\t.attr(\"src\", $(this).attr(\"data-original\"))\r\n\t\t\t\t\t\t.attr(\"data-lazyload-ready\", \"true\");\r\n\t\t\t\t});\r\n\r\n\t\t\t\t// Equal carousel height\r\n\t\t\t\tif (_options.equalHeight && $(this).find(\".urun\").length > 0) $(this).find(\".urun\").equalHeight();\r\n\r\n\t\t\t\t_options.autoscroll.target = \"+=\" + _options.group.toString();\r\n\r\n\t\t\t\tvar wrapper = document.createElement(\"div\");\r\n\t\t\t\tvar container = document.createElement(\"div\");\r\n\r\n\t\t\t\t$(container)\r\n\t\t\t\t\t.addClass(\"jcarousel-container jcarousel-container-horizontal\")\r\n\t\t\t\t\t.attr(\"style\", \"position: relative; display: block;\")\r\n\t\t\t\t\t.prependTo($(this).closest(\"div\"));\r\n\r\n\t\t\t\tvar buttons = $();\r\n\t\t\t\tif (_options.buttons === true) {\r\n\t\t\t\t\tbuttons = buttons.add($(\"<div class=\\\"jcarousel-prev jcarousel-prev-horizontal\\\" style=\\\"display: block;\\\"></div>\"))\r\n\t\t\t\t\tbuttons = buttons.add($(\"<div class=\\\"jcarousel-next jcarousel-next-horizontal\\\" style=\\\"display: block;\\\"></div>\"))\r\n\t\t\t\t}\r\n\r\n\t\t\t\t(function(wrapper, list, container, buttons, _options){\r\n\t\t\t\t\t$(wrapper)\r\n\t\t\t\t\t\t.addClass(\"jcarousel jcarousel-clip jcarousel-clip-horizontal\")\r\n\t\t\t\t\t\t.append(list)\r\n\t\t\t\t\t\t.appendTo(container)\r\n\t\t\t\t\t\t.jcarousel(_options.jcarousel)\r\n\t\t\t\t\t\t.jcarouselAutoscroll(_options.autoscroll)\r\n\r\n\t\t\t\t\t$(buttons)\r\n\t\t\t\t\t\t.appendTo(container);\r\n\r\n\t\t\t\t\tif (_options.prev) if (prevButton = _options.prev(wrapper)) _options.prev(wrapper).on(\"click\", function(){\r\n\t\t\t\t\t\t$(wrapper).jcarousel('scroll', _options.autoscroll.target.replace(\"+\", \"-\"));\r\n\t\t\t\t\t});\r\n\t\t\t\t\tif (_options.next) if (nextButton = _options.next(wrapper)) nextButton.on(\"click\", function(){\r\n\t\t\t\t\t\t$(wrapper).jcarousel('scroll', _options.autoscroll.target.replace(\"-\", \"+\"));\r\n\t\t\t\t\t});\r\n\t\t\t\t})(wrapper, this, container, buttons, _options);\r\n\t\t\t});\r\n\t\t};\r\n\t};\r\n\r\n\t// Try making plugin\r\n\tPlatinMarket.makeJQueryPlugins();\r\n\r\n\t// PM Ready Event\r\n\tPlatinMarket.prototype.on(\"ready\", function(){\r\n\r\n\t\t// Set Validator Custom Methods\r\n\t\tif ($.validator) {\r\n\t\t\tif (PM.Get(\"Configure\", \"ValidationMethods\")) {\r\n\t\t\t\tvar _validators = PM.Get(\"Configure\", \"ValidationMethods\");\r\n\t\t\t\tObject.keys(_validators).forEach(function(_validatorName){\r\n\t\t\t\t\t$.validator.addMethod(_validatorName, _validators[_validatorName], PM.Get(\"Configure\" , \"ValidationRules._messages\" + _validatorName));\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Bind Disable\r\n\t\t$(\"[data-disable], [data-enable]\").bindDisable();\r\n\r\n\t});\r\n\r\n\treturn [ PlatinMarket, Statr ];\r\n});\r\n"]}