{"version":3,"file":"/uxab/ui-core-analytics-bundle.map.jsdbx","sections":[{"offset":{"line":18,"column":0},"map":{"mappings":"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","file":"externals/@servicenow/ui-analytics-bundle/bundled-assets.min.js","names":["undefined","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","RegExp","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","rsAstralRange","rsComboRange","rsComboMarksRange","rsDingbatRange","rsLowerRange","rsUpperRange","rsVarRange","rsBreakRange","rsMathOpRange","rsApos","rsAstral","rsBreak","rsCombo","rsDigits","rsDingbat","rsLower","rsMisc","rsFitz","rsNonAstral","rsRegional","rsSurrPair","rsUpper","rsZWJ","rsMiscLower","rsMiscUpper","rsOptContrLower","rsOptContrUpper","reOptMod","rsOptVar","rsSeq","join","rsEmoji","rsSymbol","reApos","reComboMark","reUnicode","reUnicodeWord","reHasUnicode","reHasUnicodeWord","contextProps","templateCounter","typedArrayTags","cloneableTags","stringEscapes","freeParseFloat","parseFloat","freeParseInt","parseInt","freeGlobal","global","Object","freeSelf","self","root","Function","freeExports","exports","nodeType","freeModule","module","moduleExports","freeProcess","process","nodeUtil","types","require","binding","e","nodeIsArrayBuffer","isArrayBuffer","nodeIsDate","isDate","nodeIsMap","isMap","nodeIsRegExp","isRegExp","nodeIsSet","isSet","nodeIsTypedArray","isTypedArray","apply","func","thisArg","args","length","call","arrayAggregator","array","setter","iteratee","accumulator","index","value","arrayEach","arrayEachRight","arrayEvery","predicate","arrayFilter","resIndex","result","arrayIncludes","baseIndexOf","arrayIncludesWith","comparator","arrayMap","Array","arrayPush","values","offset","arrayReduce","initAccum","arrayReduceRight","arraySome","asciiSize","baseProperty","baseFindKey","collection","eachFunc","key","baseFindIndex","fromIndex","fromRight","strictIndexOf","baseIsNaN","baseIndexOfWith","baseMean","baseSum","object","basePropertyOf","baseReduce","current","baseTimes","n","baseTrim","string","slice","trimmedEndIndex","replace","baseUnary","baseValues","props","cacheHas","cache","has","charsStartIndex","strSymbols","chrSymbols","charsEndIndex","deburrLetter","escapeHtmlChar","escapeStringChar","chr","hasUnicode","test","mapToArray","map","size","forEach","overArg","transform","arg","replaceHolders","placeholder","setToArray","set","setToPairs","stringSize","lastIndex","unicodeSize","stringToArray","match","unicodeToArray","split","asciiToArray","charAt","unescapeHtmlChar","_","runInContext","context","uid","defaults","pick","Date","Error","Math","String","TypeError","arrayProto","prototype","funcProto","objectProto","coreJsData","funcToString","toString","hasOwnProperty","idCounter","maskSrcKey","exec","keys","IE_PROTO","nativeObjectToString","objectCtorString","oldDash","reIsNative","Buffer","Symbol","Uint8Array","allocUnsafe","getPrototype","getPrototypeOf","objectCreate","create","propertyIsEnumerable","splice","spreadableSymbol","isConcatSpreadable","symIterator","iterator","symToStringTag","toStringTag","defineProperty","getNative","ctxClearTimeout","clearTimeout","ctxNow","now","ctxSetTimeout","setTimeout","nativeCeil","ceil","nativeFloor","floor","nativeGetSymbols","getOwnPropertySymbols","nativeIsBuffer","isBuffer","nativeIsFinite","isFinite","nativeJoin","nativeKeys","nativeMax","max","nativeMin","min","nativeNow","nativeParseInt","nativeRandom","random","nativeReverse","reverse","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","proto","isObject","baseLodash","chainAll","this","__wrapped__","__actions__","__chain__","__index__","__values__","__dir__","__filtered__","__iteratees__","__takeCount__","__views__","Hash","entries","clear","entry","ListCache","MapCache","SetCache","__data__","add","Stack","data","arrayLikeKeys","inherited","isArr","isArg","isArguments","isBuff","isType","skipIndexes","isIndex","push","arraySample","baseRandom","arraySampleSize","shuffleSelf","copyArray","baseClamp","arrayShuffle","assignMergeValue","eq","baseAssignValue","assignValue","objValue","assocIndexOf","baseAggregator","baseEach","baseAssign","copyObject","baseAt","paths","skip","get","number","lower","upper","baseClone","bitmask","customizer","stack","isDeep","isFlat","isFull","constructor","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","pop","getMapData","pairs","LARGE_ARRAY_SIZE","createBaseEach","baseForOwn","baseEachRight","baseForOwnRight","baseEvery","baseExtremum","isSymbol","baseFilter","baseFlatten","depth","isStrict","isFlattenable","baseFor","createBaseFor","baseForRight","baseFunctions","isFunction","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","parent","last","baseIsArguments","baseIsEqual","equalFunc","objIsArr","othIsArr","objTag","othTag","objIsObj","othIsObj","isSameTag","equalArrays","name","message","convert","isPartial","equalByTag","objIsWrapped","othIsWrapped","objUnwrapped","othUnwrapped","objProps","objLength","othProps","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","criteria","comparer","sort","baseSortBy","objCriteria","othCriteria","ordersLength","compareAscending","compareMultiple","basePickBy","baseSet","basePullAll","indexOf","basePullAt","indexes","previous","baseUnset","baseRepeat","baseRest","start","setToString","overRest","baseSample","baseSampleSize","nested","baseSetData","baseSetToString","constant","baseShuffle","baseSlice","end","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","action","baseXor","baseZipObject","assignFunc","valsLength","castArrayLikeObject","castFunction","stringToPath","castRest","castSlice","id","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","callback","words","deburr","createCtor","arguments","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","countHolders","newHolders","createRecurry","fn","arrLength","oldArray","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","noop","createToPairs","baseToPairs","createWrap","srcBitmask","newBitmask","isCombo","mergeData","createCurry","createPartial","createBind","customDefaultsAssignIn","customDefaultsMerge","customOmitClone","arrStacked","arrValue","flatten","otherFunc","type","getValue","stubArray","hasPath","hasFunc","isLength","ArrayBuffer","resolve","ctorString","isMaskable","stubFalse","otherArgs","shortOut","reference","details","insertWrapDetails","updateWrapDetails","getWrapDetails","count","lastCalled","stamp","remaining","rand","memoize","memoizeCapped","charCodeAt","quote","subString","clone","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","find","findLast","forEachRight","groupBy","invokeMap","keyBy","partition","sortBy","before","bind","bindKey","WRAP_BIND_FLAG","debounce","options","lastArgs","lastThis","maxWait","timerId","lastCallTime","lastInvokeTime","leading","maxing","invokeFunc","time","shouldInvoke","timeSinceLastCall","timerExpired","trailingEdge","timeWaiting","remainingWait","debounced","isInvoking","leadingEdge","cancel","flush","defer","delay","resolver","memoized","Cache","negate","overArgs","transforms","funcsLength","partial","partialRight","rearg","gt","gte","isError","isInteger","isNumber","isString","lt","lte","toArray","next","done","iteratorToArray","remainder","toLength","isBinary","assign","assignIn","assignInWith","assignWith","at","propsIndex","propsLength","defaultsDeep","mergeWith","invert","invertBy","invoke","merge","omit","CLONE_DEEP_FLAG","basePick","pickBy","prop","toPairs","toPairsIn","camelCase","word","toLowerCase","capitalize","upperFirst","kebabCase","lowerCase","lowerFirst","snakeCase","startCase","upperCase","toUpperCase","pattern","hasUnicodeWord","unicodeWords","asciiWords","attempt","bindAll","methodNames","flow","flowRight","method","methodOf","mixin","over","overEvery","overSome","basePropertyDeep","range","rangeRight","augend","addend","divide","dividend","divisor","multiply","multiplier","multiplicand","round","subtract","minuend","subtrahend","after","castArray","chunk","compact","concat","cond","conforms","baseConforms","properties","curry","curryRight","drop","dropRight","dropRightWhile","dropWhile","fill","baseFill","filter","flatMap","flatMapDeep","flatMapDepth","flattenDeep","flattenDepth","flip","fromPairs","functions","functionsIn","initial","mapKeys","mapValues","matches","matchesProperty","nthArg","omitBy","once","orderBy","propertyOf","pullAllBy","pullAllWith","reject","remove","rest","sampleSize","setWith","shuffle","sortedUniq","sortedUniqBy","separator","limit","spread","tail","take","takeRight","takeRightWhile","takeWhile","tap","throttle","toPath","isArrLike","unary","uniq","uniqBy","uniqWith","unset","update","updateWith","valuesIn","wrap","zipObject","zipObjectDeep","entriesIn","extend","extendWith","clamp","cloneDeep","cloneDeepWith","cloneWith","conformsTo","defaultTo","endsWith","target","position","escape","escapeRegExp","every","findKey","findLastKey","forIn","forInRight","forOwn","forOwnRight","inRange","baseInRange","isBoolean","isElement","isEmpty","isEqual","isEqualWith","isMatch","isMatchWith","isNaN","isNative","isNil","isNull","isSafeInteger","isUndefined","isWeakMap","isWeakSet","lastIndexOf","strictLastIndexOf","maxBy","mean","meanBy","minBy","stubObject","stubString","stubTrue","nth","noConflict","pad","strLength","padEnd","padStart","radix","floating","temp","reduce","reduceRight","repeat","sample","some","sortedIndex","sortedIndexBy","sortedIndexOf","sortedLastIndex","sortedLastIndexBy","sortedLastIndexOf","startsWith","sum","sumBy","template","settings","isEscaping","isEvaluating","imports","importsKeys","importsValues","interpolate","reDelimiters","evaluate","sourceURL","escapeValue","interpolateValue","esTemplateValue","evaluateValue","variable","times","toLower","toSafeInteger","toUpper","trim","trimEnd","trimStart","truncate","omission","search","substring","newEnd","unescape","uniqueId","prefix","each","eachRight","first","VERSION","isFilter","takeName","dropName","checkIteratee","isTaker","lodashFunc","retUnwrapped","isLazy","useLazy","isHybrid","isUnwrapped","onlyLazy","chainName","dir","isRight","view","getView","iterLength","takeCount","iterIndex","commit","wrapped","toJSON","define","import","ReferenceError","__esModule","a","isNativeReflectConstruct","setPrototypeOf","t","r","Reflect","construct","o","p","toPropertyKey","_defineProperties","enumerable","configurable","writable","_extends","_getPrototypeOf","__proto__","_isNativeReflectConstruct","Boolean","_typeof","assertThisInitialized","_setPrototypeOf","toPrimitive","i","Number","isNativeFunction","_wrapNativeSuper","Wrapper","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","loaded","__webpack_modules__","getter","d","definition","g","globalThis","window","obj","T","nmd","children","len","crypto","getRandomValues","IDX","HEX","to_hex","arr","output","trace_id_size","parent_id_size","W3C_TRACEPARENT_VERSION","SAMPLED_FLAG","traceparent","version","trace_id","parent_id","flags","child","sampled","make","total_size","INVALID_TRACE_ID","INVALID_SPAN_ID","APP_NAME","CONFIG_CHANGED","eventEmitter","_createClass","EventEmitter","_classCallCheck","listeners","event","_len","_key","eventListeners","config","debug","enableTrace","enableCounter","enableGauge","enableHistogram","enableInteractions","enableTrack","enableMousemoveInteractions","enableScrollInteractions","enableKeypressInteractions","enableClickInteractions","oldValue","emit","metaEl","from","document","getElementsByTagName","getAttribute","content","segs","parse","defaultTraceParent","createTraceId","createTraceParentHeader","spanId","traceId","user","attributes","page","location","href","origin","application","getItemMetadata","getApplication","getUser","getPage","createTracker","exporter","getConfigValue","timestamp","documentTraceParent","createMetric","cb","isEnabled","applyAppUserAttributes","metric","createMetrics","metricCallback","createCounter","createGauge","createHistogram","observedScrollElements","globalKey","globalObj","events","flushed","notifyTraceSubscriber","span","_span","parentSpanId","kind","startTime","endTime","duration","links","status","relativeStartTime","relativeEndTime","timeOrigin","observers","observer","err","console","error","handleTraceEvents","Context","ContextManager","_context","_fn","_thisArg","_target","BaseContext","_Context","parentContext","_this","_currentContext","setValue","deleteValue","delete","_inherits","ROOT_CONTEXT","SPAN_CONTEXT_KEY","for","ROOT_LEVEL_EVENTS","SPAN_KIND_CLIENT","ROOT_SPAN_CLOSE_WAIT_MS","StackContextManager","_ContextManager","_contextStack","_enabled","enable","manager","contextWrapper","with","active","_bindFunction","activeContext","enter","_len2","_key2","leave","NoopContextManager","handler","getInteractionHandler","BrowserPatcher","_originalAPIs","_patched","processedEvents","WeakSet","_manager","alwaysBind","api","_patchAPI","_patchPromise","_patchEventTarget","_patchDOMAPIs","_patchMessageChannel","original","isDescriptor","className","propName","_ref","patchType","_original","_class","_callSuper","_assertThisInitialized","boundFn","_len3","_key3","originalThen","then","onFulfilled","onRejected","wrappedFulfilled","wrappedRejected","originalAddEventListener","EventTarget","addEventListener","listenerMapKey","listener","isCustomElement","tagName","_isContextWrapped","wrappedListener","_len4","_key4","CustomEvent","isTrusted","isCustomEvent","_isUserInteractionEvent","eventPhase","Event","CAPTURING_PHASE","_handleUserInteraction","originalRemoveEventListener","removeEventListener","_this$listenerMapKey","Element","_len5","_key5","MessagePort","originalDescriptor","getOwnPropertyDescriptor","isTracingEnabled","DynamicContextManager","_patcher","_stackManager","_noopManager","setManager","onConfigUpdate","on","enabled","patchAll","unpatchAll","TraceApi","contextManager","getSpan","BatchSpanProcessor","_SpanProcessor","_exporter","_maxQueueSize","maxQueueSize","_scheduledDelayMillis","scheduledDelayMillis","_queue","_timer","_isShutdown","_flush","_scheduleFlush","async","forceFlush","shutdown","spans","unshift","SpanProcessor","SPAN_KIND","UNSPECIFIED","INTERNAL","SERVER","CLIENT","PRODUCER","CONSUMER","NonRecordingSpan","_defineProperty","code","traceFlags","getElementLabel","element","_element$textContent","ariaLabel","alt","textContent","title","createEventTracer","tracer","handleUserEvent","_target$tagName","rootSpan","startSpan","nowId","localName","newRootContext","setStatus","_window$nowAnalytics","nowAnalytics","rootSpanTimeout","init","destroy","VALID_TRACE_ID_REGEX","VALID_SPAN_ID_REGEX","isValidTraceId","isValidSpanId","isSpanContextValid","spanContext","isValidAttributeKey","isValidAttributeValue","val","isValidPrimitiveAttributeValue","performance","getCurrentTime","RecordingSpan","spanProcessor","parentSpan","traceApi","sanitizeAttributes","warn","_spanProcessor","_ended","onStart","isRecording","onEnd","exception","addEvent","processedValue","setAttribute","link","SamplingDecision","AlwaysOnSampler","_options","NoopTracer","_name","newContext","noopTracer","TracerImpl","sampler","instrumentationScope","_sampler","_instrumentationScope","shouldSample","activeSpan","contextWithCurrentSpan","setSpan","Tracer","_noOpTracer","_realTracer","_setCurrentTracer","currentImpl","_impl","startActiveSpan","withSpan","getActiveSpan","TracerProvider","createAnalyticsApi","apiConfig","k","setConfigValue","setPage","lastResize","windowWidth","innerWidth","windowHeight","innerHeight","pageWidth","documentElement","scrollWidth","pageHeight","scrollHeight","createEvent","clientX","clientY","pageX","pageY","screenX","screenY","scrollTop","el","lastScroll","lastMovement","initInteractionsTracker","getTracer","trace","track","metrics","addObserver","getQueuedEvents","queuedEvents","CONTROL_VARIANT","ExperimentationAPIClient","baseUrl","contextParams","requestBody","experimentKey","fallbackVariantValue","url","response","fetch","body","JSON","stringify","credentials","headers","Accept","g_ck","ok","statusText","json","processedData","_processContextResponse","errorMessage","params","searchParams","URLSearchParams","experimentId","variant","configurationContext","clientId","instanceName","glideCookie","sessionValid","analyticsChannel","sessionTiming","CacheManager","memoryCache","storageKey","defaultTTL","memoryCached","_isValid","localStorage","storage","getItem","cached","ttl","cacheEntry","_cloneData","_cleanupExpiredEntries","setItem","keyData","str","hash","abs","experiments","removeItem","exp","metadata","localStorageEntries","memoryEntries","defaultTTLHours","EVENT_PREFIX","ExperimentsStore","_experiments","experiment","normalized","_normalizeExperiment","_publicShape","eventMap","identifier","_deriveEventNames","_merged$experimentId","_merged$experimentKey","_merged$value","_merged$type","_merged$metrics","_merged$errorMessage","_merged$attributes","fallbackContext","merged","_buildKey","_ref2","names","eventName","experimentsStore","apiClient","cacheManager","defaultExperimentsStore","defaultOptions","enableCaching","cacheTTL","retryAttempts","retryDelay","_hydrateFromCache","getAllCachedExperiments","upsertFromContext","_normalizeParams","_validateParams","requestOptions","cacheKey","generateKey","_fetchWithRetry","enriched","_enrichContext","getAll","getList","getEventMap","getStats","_params$experimentKey","_params$fallbackVaria","lastError","getContext","ExperimentationSDK","initialized","initPromise","initialize","clearCache","clearExperiments","getExperiments","getExperimentList","getExperimentEventMap","_performInitialization","_ensureInitialized","experimentList","eventNamesSet","eventNames","getOptions","list","mergedOptions","_extractContextOptions","setOptions","contextOptions","legacyOptions","_objectWithoutPropertiesLoose","_excluded","sdkInstance","sn_exp","catch","namespace","exposeNamespace","selectorCache","SelectorCache","sizeLimit","accessOrder","uniqueMatchCache","uniqueAccessOrder","selectorKey","elements","trimLRU","hasElements","getElements","trimUniqueLRU","sortedEntries","b","deleteCount","querySelectorAllDeep","selector","_querySelectorDeep","findMany","allElements","sel","saveUnmatched","unmatched","tokens","regex","prev_match_idx","state","next_match_idx","not_escaped_pattern","whitespace_pattern","state_patterns","substr","normalizeSelector","lightElement","querySelector","createShadowRoot","attachShadow","splitByCharacterUnlessQuoted","acc","minimalSelector","splitSelector","possibleElementsIndex","possibleElements","cachedElements","findAllElements","nodes","shadowRoot","querySelectorAll","collectAllElementsDeep","findElements","foundElement","isDocumentNode","foundMatch","reversedParts","newParent","part","findParentOrHost","findMatchingElement","character","c","sQuote","node","Node","DOCUMENT_FRAGMENT_NODE","DOCUMENT_NODE","parentNode","host","REQUIRED_ATTRIBUTES","UXF_ATTRIBUTES","parseComponentId","componentId","repeaterMatch","suffixMatch","extractMeaningfulSuffixFromComponentId","parsed","isRepeaterComponent","generatePathStep","ELEMENT_NODE","isOptimized","attributeList","getAttributeNames","attr","getRequiredAttributes","elementId","dataTestId","dataId","dataItemId","stableId","getStableComponentId","siblings","componentName","macroponentId","instanceId","filteredClasses","classList","isSelectorUnique","_root$host","isUnique","setUniqueMatch","hasUniqueMatch","getUniqueMatch","setElements","getElementParent","parentElement","rootNode","getRootNode","ShadowRoot","generateSelectorPath","maxDepth","idSelector","ownerDocument","currentNode","pathParts","currentSelector","hasDataTestId","hasAttribute","hasComponentId","hasUniqueId","generateElementPath","log","getChildrenSignature","_el$children","getSiblingIndex","getKeyAttributes","generateCssSelector","_el$parentNode","getShadowInfo","mode","hostId","hostTagName","hostClasses","slotName","isElementUnderComponent","componentTag","findClosestElementByTagName","getElementIdFromComponent","componentIdParts","getFrameworkIdentifiers","_closestMacroponent$t","_el$tagName","_el$tagName2","dynamicId","closestMacroponent","subComponentIds","getDynamicId","componentIdSuffix","idSuffix","isUnderCanvasScreen","isUnderExpShell","macroponentTag","ngClick","ngSubmit","ngHref","uxfId","uxfType","dataGtdEid","isMacroponent","isCanvasScreen","isCanvasExperienceShell","getLanguageIndependentFeatures","textLength","hasText","text","numberCount","hasSpecialChars","wordCount","isProminent","isVisuallyProminent","positionSignature","getPositionSignature","style","getComputedStyle","isBold","fontWeight","isLarge","fontSize","total","relativePosition","ariaAttributes","getEnhancedPosition","getBoundingClientRect","top","left","width","height","rect","scrollY","scrollX","zIndex","isVisible","display","visibility","opacity","getRelativePosition","boundingBoxRatio","topRatio","leftRatio","widthRatio","heightRatio","isFirst","isLast","totalSiblings","getTagPath","fingerprint","includeText","structureOnly","identifiers","aria","dataset","basicIdentifiers","classNames","tagPath","enhancedIdentifiers","childrenStructure","siblingIndex","cssSelector","shadowInfo","framework","textFeatures","getIdentifiers","selectorPath","meta","pathname","viewport","compareClassNames","filterClasses","classes","setA","setB","x","compareTagPath","matchCount","compareBox","score","diff","avg","relDiff","compareAttribute","compareObjects","isParentChild","fingerprintA","fingerprintB","tagPathA","tagPathB","shorterPath","longerPath","getCachedElements","doc","iframeDoc","iframes","contentDocument","getGsftMainIframeDocument","iframeError","defaultWeights","attributesMatch","dataAttrMatch","boundingBoxSimilarity","parentChildRelationship","scoreCache","SCORE_CACHE_SIZE_LIMIT","simpleDeterministicHash","calculateComponentScore","fpA","fpB","_fpA$position5","_fpB$position5","_fpA$position6","_fpB$position6","_fpA$textFeatures2","_fpB$textFeatures2","_fpA$position7","_fpB$position7","_fpA$position8","_fpB$position8","y","targetDocument","scorePerformance","hashTime","componentTime","weightTime","componentTimes","hashStart","fingerPrintHash","selectorA","selectorB","elementsA","elementsB","isUniqueMatch","weights","componentStart","compStart","_fpA$position","_fpB$position","_fpA$position2","_fpB$position2","_fpA$textFeatures","_fpB$textFeatures","_fpA$position3","_fpB$position3","_fpA$position4","_fpB$position4","weightStart","totalWeight","_weights$key","weightedScore","_weights$key2","_c$key","scoreResult","totalTime","rankMatches","fps","fp","getBestMatch","_options$threshold","_ranked$","threshold","ranked","_fp$position","isMultilingual","ignorePosition","currentFp","diffClassNames","candidate","_currentFp$position","_match$classNames","isPartialMatch","base","extraneous","findElementByFingerprint","results","getNextParentElement","traverseShadowDom","slot","assignedSlot","hostRoot","parentCandidates","contains","yieldToMain","requestAnimationFrame","findBestMatchingElement","fingerprints","maxDepthUp","maxDepthDown","timeSlice","enableTimeSlicing","parentTraversalTime","childTraversalTime","selfMatchTime","totalElements","parentElements","childElements","selfStartTime","bestSelfMatch","bestMatch","bestScore","fpTime","sliceStart","yieldCount","isExactMatch","findBestMatchAsync","parentStartTime","parentMatches","fingerprintGenerationTime","scoreComparisonTime","elementsProcessed","fullComparisonsCount","currentElement","fpStartTime","scoreStartTime","proximity","findBestMatchingParentsWithShadowAsync","childStartTime","childMatches","maxChildElements","priorityElements","respectShadowBoundaries","seenElements","fingerptintTime","fullComparisons","queue","crossedShadowBoundary","elementsChecked","shift","isShadowHost","childNodes","_a$tagName","_b$tagName","aIsPriority","bIsPriority","shadowChildren","shadowChild","findBestMatchingChildrenAsync","allMatches","scoreDiff","_result$fingerprint$t","rootEl","finds","treeWalker","createTreeWalker","NodeFilter","SHOW_ELEMENT","nextNode","matched","f","getPath","includeShadowInfo","ancestors","shadowRoots","ancestorInfo","shadowContext","getSelectorPath","getCompactPath","ancestor","LogLevel","TrackingLevel","UXCollectionMode","isDefined","isNullOrUndefined","isNonEmptyString","isPositiveInteger","allowZero","setSelfPrototype","SNError","_Error","SNTypeError","_SNError","_this2","HttpError","_SNError2","errorCode","_this3","uuidV4","Consts","inBrowser","getGuid","inBrowserWindow","baseServerUrl","allowedSystemProperties","instanceDomainName","IS_PRODUCTION","DEFAULT_CLIENT_ID","DEFAULT_LOG_LEVEL","DEFAULT_TRACKING_CONSENT","Disabled","MAX_METRIC_CALL_ATTEMPTS","SYSTEM_PROPERTY_PREFIX","LOGGER_PREFIX","removeFalsyEntries","fromEntries","tryGetEnumValue","keyOrValue","enumObj","ignoreCase","_mapKeyToValue$get","mapKeyToValue","mapValueToValue","_ref4","searchKeyOrValue","getValuesOrDefaults","defaultObj","validatorObj","_ref3","getValueOrDefault","validator","Logger","logMethods","handleLogLevel","channel","BroadcastChannel","onmessage","onBroadcastMessage","ev","logLevel","_this$channel","postMessage","notify","validLogLevel","level","methods","getTime","lastTime","getUniqueTime","DEFAULT_CONFIG_RESPONSE","ClientId","SessionId","MaxDataPointsPerHeartbeat","HeartbeatInterval","IdleTimeout","SessionTimeout","RecordMetadata","RequestId","AnalyticsChannelType","AnalyticsChannelNumber","InstanceName","ConfigReceivedTime","ConfigReloadTime","SessionIdCreatedTime","AppUserId","IgnorePerformanceData","IsGettingConfiguration","uxToken","CONFIG_RESPONSE_VALIDATOR","isEnum","enumClass","ConfigurationProvider","store","apiKey","appUserIdProvider","configuration","buildConfiguration","resetSessionIfNeeded","observeConfigurationChange","_this$store$get","_this$store$get2","LastServerResponseTime","ApiKey","LastDatapointQueuedTime","isIdleSessionTimedOut","isSessionTimedOut","shouldForceReset","isInvalidSession","resetSession","isInvalidConfiguration","requestId","instanceConfigCompleted","updatedConfig","mandatoryKeys","newConfig","sessionId","deleteData","updatedQueuedTime","isInProgress","configResponse","mergedConfiguration","getValidConfigReloadTime","milliseconds","oneDayInMilliseconds","getStoreKey","DataPointField","isSystemPropertyKey","isValidProperty","allowLists","transformToPropertyValue","toLocaleString","timeZone","getValidProperties","allowNulls","validProperties","_value","logger","validArray","item","DataPointsProvider","configurationProvider","appContextProvider","systemProperties","dataPoint","addSystemPropertyPrefix","allProperties","isEmptyObject","prepareQueueToInsert","ctx","updateLastDatapointQueuedTime","sessionIdCreatedTime","appUserId","dataContext","trackingLevel","trackingConsent","configReceivedTime","appContext","sid","rid","sidt","auid","trackinglevel","lastSessionQueue","lastAppContextQueue","_queue$","_queue$2","_queue$4","_queue$3","row","filteredData","channelType","channelNumber","_firstQueueItem$ctx$","_firstQueueItem$ctx$2","_firstQueueItem$ctx$3","firstQueueItem","appContextId","appContextName","dataPoints","NodeStorage","randomId","randomNumber","ms","CREATE_BROWSER_ID_LOCK","Lock","expiry","suffix","lockName","setLockHolder","outerLock","getLockHolderIdAndRemoveExpired","innerLock","acquireStartTime","tryGetLock","release","lock","expiresAt","lockParsed","BrowserIdProvider","legacyStore","browserId","acquire","getLegacyBrowserId","TabIdProvider","tabId","Store","disableSerialization","testKey","serializeItem","deserializeItem","LocalStore","_Store","SessionStore","sessionStorage","MemoryStorage","_Array$from$index","backup","info","memoryStorage","MemoryStore","backupStore","loadBackup","registerBackupBeforeUnload","loadEntries","getAllEntries","createBasicProvider","_store$get","DataContext","provider","legacyApiKey","localStore","legacyLocalStore","browserIdProvider","clientIdProvider","trackingConsentProvider","sessionStore","memoryStore","tabIdProvider","currentPageProvider","domainProvider","dataPointsProvider","validate","EventRecorder","extractedSystemProperties","extractSystemPropertyValues","Page","currentPage","Type","conversationId","ConversationId","newConsent","oldConsent","Value","PreviousValue","PageRecorder","description","_dataContext$currentP","_dataContext$dataPoin","Description","UserRecorder","setProperty","setProperties","getAppUserIdOrNull","operationToProperty","operation","MAX_DURATION","fixDuration","roundedDuration","fixLength","trimmed","PerformanceTraceImpl","Duration","TraceType","traceEnded","send","removeProperty","PerformanceTraceRecorder","validateTrace","durationMS","_startTime","MetadataRecorder","eventRecorder","pageRecorder","userRecorder","performanceRecorder","Environment","screen","navigator","language","Intl","DateTimeFormat","resolvedOptions","getTimezoneOffset","universalFetch","timeout","requestTimeoutId","controller","AbortController","signal","fetchPromise","abort","axios","default","withCredentials","responseBody","isResponseOk","responseStatusCode","statusCode","rejectWithError","getHttpHeaders","transaction_source","getMetricAPIHttpHeaders","_dataContext$configur","_dataContext$configur2","snOriginHeader","Version","APIKey","BrowserId","getOrCreate","Appsysid","Instancename","Userid","postData","endpoint","referrer","_dataContext$configur3","parsedStoredData","storedData","domain","appRegistrationMetadata","Browserid","ScreenHeight","getScreenDimension","ScreenWidth","DomainId","SystemLocale","getSystemLocale","ClientTimezone","getClientTimezone","ClientTimezoneOffset","TabId","Name","encodeURIComponent","Channeltype","Tablename","tableName","decorateMethod","descriptor","newDescriptor","decorators","decorator","CatchAll","originalMethod","CatchAllAndReturn","goodResponse","badResponse","getUrl","getToken","cookies","token","cookie","SERVER_REQUEST_TIMEOUT","Networker","configData","isValidConfigResponse","getMergedConfigurationWithConfigResponse","fillWithJson","updateServerResponseTime","dataPointsResult","serverData","Cookie","Origin","DataPoints","ChannelType","ClientTime","toISOString","DomainName","AppContextId","AppContextName","AppSysId","analyticsGatewayAuthToken","MetricManager","configurationLifecycleManager","metricTimeoutId","metricErrorCounter","readyState","sendMetric","select","deleteByCount","startNewConfiguration","ConfigurationState","ConfigurationLifecycleManager","isGettingCurrSessionConfig","metadataRecorder","isGettingConfiguration","reloadConfigurationIfNeeded","isUserChanged","Ended","Started","setIsGettingConfiguration","getConfiguration","updateInstanceConfigCallInProgress","gotConfiguration","deletePreSessionItems","assignPreSessionItems","setDebugLevel","setAppUserId","SessionLifecycleManager","deleteBySessionId","normalizeAppUserId","StartSession","startNewSessionIfNeeded","EnsureWired","isWired","Manager","sessionLifecycleManager","metricManager","isConfigCallInProgress","currentAppId","saveAppContext","parts","userId","deleteOtherSessions","saveDomain","setTrackingConsent","wire","unwire","addChat","validateSdkReady","incProperty","appendToProperty","Full","configCurrentState","getCurrentState","Basic","Essential","addConsentChange","Created","deleteUserData","stopSession","sessionState","changedGlideSession","checkGlideSessionHasChanged","getIsGettingCurrSessionConfig","currentGCK","setKeys","startMetrics","stopMetrics","taggedEvents","clearAll","domainId","domainName","SNAnalytics","apiAuth","startPage","addChatEvent","setUserId","setUserProperty","setUserProperties","removeUserProperty","incUserProperty","appendToUserProperty","startPerformanceTrace","addPerformanceTrace","getTrackingConsent","deleteCurrentUserData","enableExporter","exporterInterval","sumCounter","lastValueOnlyGauage","augmentPage","collecterUrl","enableCollection","legacyConfig","legacy","UXF_USER_NAV_LOAD_COMPLETE","EXPERIENCE_START","USER_NAVIGATE","EVENT_MAPPING","PARAMS_SEPARATOR","SUB_SEPARATOR","CLASSIC_URL_PARAMS","TRACKING_CONSENT","freeze","full","basic","disabled","missing","essential","ALLOWED_PERF_EVENTS","UXF_METADATA_EVENTS","ANALYTICS_SET_APPLICATION_OPTIONS","getExperimentDataForEvent","allExperiments","matchedExperiments","matchExperimentsForEvent","flattened","baseKey","flattenExperiments","markReceived","sdk","_markReceived$attribu","_markReceived$attribu2","_markReceived$attribu3","__type__","argsRaw","eventPayloadRaw","experimentData","enhancedPayload","payload","isMobileBridgeAvailable","SNMobileAnalytics","isMobileBridgeEnabled","_config","getNativeConfig","MobileBridgeAdapter","startScreen","screenName","getConfig","isAvailable","unsubscribe","isRolesUpdated","higherOrderSDKWrapper","onEvent","experienceId","experienceName","__isLegacy__","eventTarget","appRegistrationMetadataStorage","getAppRegistrationMetadataFromSessionStorage","storeAppRegistrationMetadataInSessionStorage","legacyConfigData","uxMetricsConfig","_uxMetricsConfig$user","_uxMetricsConfig$user2","_uxMetricsConfig$user3","_uxMetricsConfig$user4","uxCollectionMode","sessionConfig","serverEndpoint","endpointURL","hashId","roles","prepareAndGetLegacyConfig","_legacyConfig$session","isWebChannelApplication","_legacyConfig$session2","rolesList","__operation__","applications","applyMetadata","startExporter","setInterval","SPECIAL_EVENTS","markTypes","setUser","setUserNext","setPageNext","setApplication","setApplicationNext","setApiConfigValue","setApiConfigValueNext","__webAnalytics__GLIDE_UX_METRICS","_payload$config","_payload$config2","detail","eventProps","trackOptions","trackWithArguments","mask","getProcessedSelectedContentData","allParams","maskedUrl","urlParts","fieldsObject","fields","parentPrefix","checkSysId","urlFields","handleFields","paramsObject","paramsPrefix","urlParams","_params$k","paramValue","encodeUrlPart","handleParams","_timestamp","allUrlParams","RECORD","isClassicUrl","selectedContent","route","isSeismicApp","getWorkspacePageName","table","parentRoute","pageName","getWorkspaceParamsAndUrl","metaUrl","workspaceParams","finalUrl","subParts","parentData","childData","getReconstructedUrlAndParams","getPageParamsAndUrl","decodedUrl","decodeURIComponent","queryParams","truncateUrl","parameters","getClassicParamsAndUrl","getPageNameFromMeta","pageTitle","patternMatch","getClassicPageName","isValidType","propVal","isPrimitiveDataType","mark","remainingOptions","otherProps","_excluded2","switched","isEntryPage","allowList","filterEventProps","allowedPropsInPageNavigate","transformEventProps","pageUrl","addLegacyEvent","legacySdk","marks","processMarks","applicationContextId","applicationContextName","startSession","totalUiTime","screenRoute","screenFields","screenParent","argumentKey","navigationType","_metric$properties","_options$meta","_options$meta2","getPageName","resolveLegacySdk","enableNewWebSdk","getProvider","UsageProvider","LegacyAppseeProvider","MAX_EVENTS_PER_PAGE","startAutoCapture","attachGlobalClickListeners","listenerAttached","_iframe$","iframe","useCapture","handleGlobalClick","capture","passive","currentTarget","elementFromPoint","currentPageId","taggedEventsForApplication","processedTaggedEvents","allEvents","PageId","getEventsForPage","Fingerprint","EventId","displayName","DisplayName","FingerprintId","TaggedEventProperties","event_type","_bestMatch$fingerprin","_querySelectorAllDeep","elem","extractPropertyValues","page_url","SN_event_type","SN_SelectorPath","SN_FingerPrintHash","ingestEvent","runMatching","integrator","initExperimentation","createTraceParent","USER_TOKEN","UCM_URL","tojson","consent","__TECTONIC__$servicenow_ui_analytics_api","servicenowUiAnalyticsApi","__TECTONIC__$servicenow_ui_analytics_consumer","servicenowUiAnalyticsConsumer","__TECTONIC__$servicenow_ui_analytics_core","servicenowUiAnalyticsCore","__TECTONIC__$servicenow_ui_analytics_experimentation_sdk","servicenowUiAnalyticsExperimentationSdk","__TECTONIC__$servicenow_ui_analytics_fingerprint","servicenowUiAnalyticsFingerprint","__TECTONIC__$servicenow_ui_analytics_integrator","servicenowUiAnalyticsIntegrator","__TECTONIC__$servicenow_ui_analytics_providers","servicenowUiAnalyticsProviders","__TECTONIC__$servicenow_ui_analytics_ucm","servicenowUiAnalyticsUcm"],"sources":["webpack:///lodash/4.17.21/lodash.js","webpack:///external import \"/uxasset/externals/@devsnc/library-appsee-web-sdk/4.1.5/index.jsdbx\"","webpack:///external import \"/uxasset/externals/axios/1.18.1/index.jsdbx\"","webpack:///@babel/runtime/7.25.7/helpers/assertThisInitialized.js","webpack:///@babel/runtime/7.25.7/helpers/classCallCheck.js","webpack:///@babel/runtime/7.25.7/helpers/construct.js","webpack:///@babel/runtime/7.25.7/helpers/createClass.js","webpack:///@babel/runtime/7.25.7/helpers/defineProperty.js","webpack:///@babel/runtime/7.25.7/helpers/extends.js","webpack:///@babel/runtime/7.25.7/helpers/getPrototypeOf.js","webpack:///@babel/runtime/7.25.7/helpers/inherits.js","webpack:///@babel/runtime/7.25.7/helpers/isNativeFunction.js","webpack:///@babel/runtime/7.25.7/helpers/isNativeReflectConstruct.js","webpack:///@babel/runtime/7.25.7/helpers/objectWithoutPropertiesLoose.js","webpack:///@babel/runtime/7.25.7/helpers/possibleConstructorReturn.js","webpack:///@babel/runtime/7.25.7/helpers/setPrototypeOf.js","webpack:///@babel/runtime/7.25.7/helpers/toPrimitive.js","webpack:///@babel/runtime/7.25.7/helpers/toPropertyKey.js","webpack:///@babel/runtime/7.25.7/helpers/typeof.js","webpack:///@babel/runtime/7.25.7/helpers/wrapNativeSuper.js","webpack:///webpack/bootstrap","webpack:///webpack/runtime/compat get default export","webpack:///webpack/runtime/define property getters","webpack:///webpack/runtime/global","webpack:///webpack/runtime/hasOwnProperty shorthand","webpack:///webpack/runtime/make namespace object","webpack:///webpack/runtime/node module decorator","webpack:///@servicenow/ui-analytics-core/src/tctx.js","webpack:///@servicenow/ui-analytics-core/src/constants.js","webpack:///@servicenow/ui-analytics-core/src/EventEmitter.js","webpack:///@servicenow/ui-analytics-core/src/config.js","webpack:///@servicenow/ui-analytics-core/src/traceparent.js","webpack:///@servicenow/ui-analytics-core/src/user.js","webpack:///@servicenow/ui-analytics-core/src/page.js","webpack:///@servicenow/ui-analytics-core/src/application.js","webpack:///@servicenow/ui-analytics-core/src/getItemMetadata.js","webpack:///@servicenow/ui-analytics-core/src/createTracker.js","webpack:///@servicenow/ui-analytics-core/src/createMetrics.js","webpack:///@servicenow/ui-analytics-core/src/initInteractionsTracker.js","webpack:///@servicenow/ui-analytics-core/src/observers.js","webpack:///@servicenow/ui-analytics-core/src/queuedEvents.js","webpack:///@servicenow/ui-analytics-core/src/exporter.js","webpack:///@servicenow/ui-analytics-core/src/trace/context/types.js","webpack:///@servicenow/ui-analytics-core/src/trace/context/BaseContext.js","webpack:///@servicenow/ui-analytics-core/src/trace/constants.js","webpack:///@servicenow/ui-analytics-core/src/trace/context/StackContextManager.js","webpack:///@servicenow/ui-analytics-core/src/trace/context/NoopContextManager.js","webpack:///@servicenow/ui-analytics-core/src/trace/utils/interactionHandler.js","webpack:///@servicenow/ui-analytics-core/src/trace/utils/BrowserPatcher.js","webpack:///@servicenow/ui-analytics-core/src/trace/utils/isCustomEvent.js","webpack:///@servicenow/ui-analytics-core/src/trace/utils/isTracingEnabled.js","webpack:///@servicenow/ui-analytics-core/src/trace/context/Context.js","webpack:///@servicenow/ui-analytics-core/src/trace/context/TraceApi.js","webpack:///@servicenow/ui-analytics-core/src/trace/processor/BatchSpanProcessor.js","webpack:///@servicenow/ui-analytics-core/src/trace/processor/SpanProcessor.js","webpack:///@servicenow/ui-analytics-core/src/trace/spanKind.js","webpack:///@servicenow/ui-analytics-core/src/trace/span/NonRecordingSpan.js","webpack:///@servicenow/ui-analytics-core/src/trace/utils/userInteractionTracer.js","webpack:///@servicenow/ui-analytics-core/src/trace/utils/index.js","webpack:///@servicenow/ui-analytics-core/src/attributeValidator.js","webpack:///@servicenow/ui-analytics-core/src/trace/span/RecordingSpan.js","webpack:///@servicenow/ui-analytics-core/src/trace/sampler/sampler.js","webpack:///@servicenow/ui-analytics-core/src/trace/sampler/AlwaysOnSampler.js","webpack:///@servicenow/ui-analytics-core/src/trace/NoopTracer.js","webpack:///@servicenow/ui-analytics-core/src/trace/Tracer.js","webpack:///@servicenow/ui-analytics-core/src/trace/TracerProvider.js","webpack:///@servicenow/ui-analytics-core/src/createAnalyticsApi.js","webpack:///@servicenow/ui-analytics-core/src/addObserver.js","webpack:///@servicenow/ui-analytics-core/src/getQueuedEvents.js","webpack:///@servicenow/ui-analytics-api/src/index.js","webpack:///@servicenow/ui-analytics-experimentation-sdk/src/consts.js","webpack:///@servicenow/ui-analytics-experimentation-sdk/src/modules/api-client.js","webpack:///@servicenow/ui-analytics-experimentation-sdk/src/modules/cache-manager.js","webpack:///@servicenow/ui-analytics-experimentation-sdk/src/modules/experiments-store.js","webpack:///@servicenow/ui-analytics-experimentation-sdk/src/modules/context-manager.js","webpack:///@servicenow/ui-analytics-experimentation-sdk/src/experimentation-sdk.js","webpack:///@servicenow/ui-analytics-experimentation-sdk/src/index.js","webpack:///@servicenow/ui-analytics-fingerprint/src/cache-utility.js","webpack:///query-selector-shadow-dom/1.0.1/src/querySelectorDeep.js","webpack:///query-selector-shadow-dom/1.0.1/src/normalize.js","webpack:///@servicenow/ui-analytics-fingerprint/src/selector-path.js","webpack:///@servicenow/ui-analytics-fingerprint/src/utils.js","webpack:///@servicenow/ui-analytics-fingerprint/src/fingerprint.js","webpack:///@servicenow/ui-analytics-fingerprint/src/score.js","webpack:///@servicenow/ui-analytics-fingerprint/src/find.js","webpack:///@servicenow/ui-analytics-fingerprint/src/get-path.js","webpack:///@servicenow/ui-analytics-providers/src/usage/sdk/common/types.js","webpack:///@servicenow/ui-analytics-providers/src/usage/sdk/common/validators.js","webpack:///@servicenow/ui-analytics-providers/src/usage/sdk/common/errors.js","webpack:///@servicenow/ui-analytics-providers/src/usage/sdk/common/utils/string-utils.js","webpack:///@servicenow/ui-analytics-providers/src/usage/sdk/common/consts.js","webpack:///@servicenow/ui-analytics-providers/src/usage/sdk/common/utils/object-utils.js","webpack:///@servicenow/ui-analytics-providers/src/usage/sdk/common/logger.js","webpack:///@servicenow/ui-analytics-providers/src/usage/sdk/common/utils/date-utils.js","webpack:///@servicenow/ui-analytics-providers/src/usage/sdk/model/providers/configuration-provider.js","webpack:///@servicenow/ui-analytics-providers/src/usage/sdk/model/entities/data-point.js","webpack:///@servicenow/ui-analytics-providers/src/usage/sdk/common/utils/array-utils.js","webpack:///@servicenow/ui-analytics-providers/src/usage/sdk/common/utils/property-utils.js","webpack:///@servicenow/ui-analytics-providers/src/usage/sdk/model/providers/data-points-provider.js","webpack:///@servicenow/ui-analytics-providers/src/usage/sdk/common/node-storage.js","webpack:///@servicenow/ui-analytics-providers/src/usage/sdk/common/lock.js","webpack:///@servicenow/ui-analytics-providers/src/usage/sdk/model/providers/browser-id-provider.js","webpack:///@servicenow/ui-analytics-providers/src/usage/sdk/model/providers/tab-id-provider.js","webpack:///@servicenow/ui-analytics-providers/src/usage/sdk/database/store.js","webpack:///@servicenow/ui-analytics-providers/src/usage/sdk/database/local-store.js","webpack:///@servicenow/ui-analytics-providers/src/usage/sdk/database/session-store.js","webpack:///@servicenow/ui-analytics-providers/src/usage/sdk/database/memory-store.js","webpack:///@servicenow/ui-analytics-providers/src/usage/sdk/model/providers/basic-provider.js","webpack:///@servicenow/ui-analytics-providers/src/usage/sdk/data-context.js","webpack:///@servicenow/ui-analytics-providers/src/usage/sdk/recorders/event-recorder.js","webpack:///@servicenow/ui-analytics-providers/src/usage/sdk/recorders/page-recorder.js","webpack:///@servicenow/ui-analytics-providers/src/usage/sdk/recorders/user-recorder.js","webpack:///@servicenow/ui-analytics-providers/src/usage/sdk/recorders/performance-recorder.js","webpack:///@servicenow/ui-analytics-providers/src/usage/sdk/recorders/metadata-recorder.js","webpack:///@servicenow/ui-analytics-providers/src/usage/sdk/common/environment.js","webpack:///@servicenow/ui-analytics-providers/src/usage/sdk/network/fetch.js","webpack:///@servicenow/ui-analytics-providers/src/usage/sdk/network/server-proxy.js","webpack:///@servicenow/ui-analytics-providers/src/usage/sdk/decorator/utils.js","webpack:///@servicenow/ui-analytics-providers/src/usage/sdk/decorator/common.js","webpack:///@servicenow/ui-analytics-providers/src/usage/sdk/network/networker.js","webpack:///@servicenow/ui-analytics-providers/src/usage/sdk/metric-manager.js","webpack:///@servicenow/ui-analytics-providers/src/usage/sdk/configuration-lifecycle-manager.js","webpack:///@servicenow/ui-analytics-providers/src/usage/sdk/session-lifecycle-manager.js","webpack:///@servicenow/ui-analytics-providers/src/usage/sdk/common/utils/user-utils.js","webpack:///@servicenow/ui-analytics-providers/src/usage/sdk/decorator/session.js","webpack:///@servicenow/ui-analytics-providers/src/usage/sdk/manager.js","webpack:///@servicenow/ui-analytics-providers/src/usage/sdk/index.js","webpack:///@servicenow/ui-analytics-providers/src/config.js","webpack:///@servicenow/ui-analytics-providers/src/legacy/events.js","webpack:///@servicenow/ui-analytics-providers/src/constants.js","webpack:///@servicenow/ui-analytics-providers/src/usage/experimentIntegration.js","webpack:///@servicenow/ui-analytics-providers/src/usage/addEvent.js","webpack:///@servicenow/ui-analytics-providers/src/usage/mobileBridgeAdapter.js","webpack:///@servicenow/ui-analytics-providers/src/usage/higherOrderSDKWrapper.js","webpack:///@servicenow/ui-analytics-providers/src/legacy/send.js","webpack:///@servicenow/ui-analytics-providers/src/startExporter.js","webpack:///@servicenow/ui-analytics-providers/src/usage/coreUIEventHandler.js","webpack:///@servicenow/ui-analytics-providers/src/usage/usageProvider.js","webpack:///@servicenow/ui-analytics-providers/src/legacy/selectContentParser.js","webpack:///@servicenow/ui-analytics-providers/src/legacy/getPageName.js","webpack:///@servicenow/ui-analytics-providers/src/legacy/utils.js","webpack:///@servicenow/ui-analytics-providers/src/legacy/ux-config.js","webpack:///@servicenow/ui-analytics-providers/src/legacy/transformMarks.js","webpack:///@servicenow/ui-analytics-providers/src/legacy/addLegacyEvent.js","webpack:///@servicenow/ui-analytics-providers/src/legacy/higherOrderSDKWrapper.js","webpack:///@servicenow/ui-analytics-providers/src/legacy/legacyAppseeProvider.js","webpack:///@servicenow/ui-analytics-providers/src/providerFactory.js","webpack:///@servicenow/ui-analytics-providers/src/usage/sdk/auto-capture.js","webpack:///@servicenow/ui-analytics-providers/src/index.js","webpack:///@servicenow/ui-analytics-integrator/src/index.js","webpack:///@servicenow/ui-analytics-ucm/src/constants.js","webpack:///@servicenow/ui-analytics-ucm/src/get.js","webpack:///@servicenow/ui-analytics-ucm/src/set.js","webpack:///@servicenow/ui-analytics-bundle/__imaginary__/mono-asset-entry-wrapper.js"],"sourcesContent":["/**\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","module.exports = import(\"/uxasset/externals/@devsnc/library-appsee-web-sdk/4.1.5/index.jsdbx\");;","module.exports = import(\"/uxasset/externals/axios/1.18.1/index.jsdbx\");;","function _assertThisInitialized(e) {\n  if (void 0 === e) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n  return e;\n}\nmodule.exports = _assertThisInitialized, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","function _classCallCheck(a, n) {\n  if (!(a instanceof n)) throw new TypeError(\"Cannot call a class as a function\");\n}\nmodule.exports = _classCallCheck, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var isNativeReflectConstruct = require(\"./isNativeReflectConstruct.js\");\nvar setPrototypeOf = require(\"./setPrototypeOf.js\");\nfunction _construct(t, e, r) {\n  if (isNativeReflectConstruct()) return Reflect.construct.apply(null, arguments);\n  var o = [null];\n  o.push.apply(o, e);\n  var p = new (t.bind.apply(t, o))();\n  return r && setPrototypeOf(p, r.prototype), p;\n}\nmodule.exports = _construct, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var toPropertyKey = require(\"./toPropertyKey.js\");\nfunction _defineProperties(e, r) {\n  for (var t = 0; t < r.length; t++) {\n    var o = r[t];\n    o.enumerable = o.enumerable || !1, o.configurable = !0, \"value\" in o && (o.writable = !0), Object.defineProperty(e, toPropertyKey(o.key), o);\n  }\n}\nfunction _createClass(e, r, t) {\n  return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, \"prototype\", {\n    writable: !1\n  }), e;\n}\nmodule.exports = _createClass, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var toPropertyKey = require(\"./toPropertyKey.js\");\nfunction _defineProperty(e, r, t) {\n  return (r = toPropertyKey(r)) in e ? Object.defineProperty(e, r, {\n    value: t,\n    enumerable: !0,\n    configurable: !0,\n    writable: !0\n  }) : e[r] = t, e;\n}\nmodule.exports = _defineProperty, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","function _extends() {\n  return module.exports = _extends = Object.assign ? Object.assign.bind() : function (n) {\n    for (var e = 1; e < arguments.length; e++) {\n      var t = arguments[e];\n      for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);\n    }\n    return n;\n  }, module.exports.__esModule = true, module.exports[\"default\"] = module.exports, _extends.apply(null, arguments);\n}\nmodule.exports = _extends, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","function _getPrototypeOf(t) {\n  return module.exports = _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) {\n    return t.__proto__ || Object.getPrototypeOf(t);\n  }, module.exports.__esModule = true, module.exports[\"default\"] = module.exports, _getPrototypeOf(t);\n}\nmodule.exports = _getPrototypeOf, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var setPrototypeOf = require(\"./setPrototypeOf.js\");\nfunction _inherits(t, e) {\n  if (\"function\" != typeof e && null !== e) throw new TypeError(\"Super expression must either be null or a function\");\n  t.prototype = Object.create(e && e.prototype, {\n    constructor: {\n      value: t,\n      writable: !0,\n      configurable: !0\n    }\n  }), Object.defineProperty(t, \"prototype\", {\n    writable: !1\n  }), e && setPrototypeOf(t, e);\n}\nmodule.exports = _inherits, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","function _isNativeFunction(t) {\n  try {\n    return -1 !== Function.toString.call(t).indexOf(\"[native code]\");\n  } catch (n) {\n    return \"function\" == typeof t;\n  }\n}\nmodule.exports = _isNativeFunction, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","function _isNativeReflectConstruct() {\n  try {\n    var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));\n  } catch (t) {}\n  return (module.exports = _isNativeReflectConstruct = function _isNativeReflectConstruct() {\n    return !!t;\n  }, module.exports.__esModule = true, module.exports[\"default\"] = module.exports)();\n}\nmodule.exports = _isNativeReflectConstruct, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","function _objectWithoutPropertiesLoose(r, e) {\n  if (null == r) return {};\n  var t = {};\n  for (var n in r) if ({}.hasOwnProperty.call(r, n)) {\n    if (e.includes(n)) continue;\n    t[n] = r[n];\n  }\n  return t;\n}\nmodule.exports = _objectWithoutPropertiesLoose, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var _typeof = require(\"./typeof.js\")[\"default\"];\nvar assertThisInitialized = require(\"./assertThisInitialized.js\");\nfunction _possibleConstructorReturn(t, e) {\n  if (e && (\"object\" == _typeof(e) || \"function\" == typeof e)) return e;\n  if (void 0 !== e) throw new TypeError(\"Derived constructors may only return object or undefined\");\n  return assertThisInitialized(t);\n}\nmodule.exports = _possibleConstructorReturn, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","function _setPrototypeOf(t, e) {\n  return module.exports = _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) {\n    return t.__proto__ = e, t;\n  }, module.exports.__esModule = true, module.exports[\"default\"] = module.exports, _setPrototypeOf(t, e);\n}\nmodule.exports = _setPrototypeOf, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var _typeof = require(\"./typeof.js\")[\"default\"];\nfunction toPrimitive(t, r) {\n  if (\"object\" != _typeof(t) || !t) return t;\n  var e = t[Symbol.toPrimitive];\n  if (void 0 !== e) {\n    var i = e.call(t, r || \"default\");\n    if (\"object\" != _typeof(i)) return i;\n    throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n  }\n  return (\"string\" === r ? String : Number)(t);\n}\nmodule.exports = toPrimitive, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var _typeof = require(\"./typeof.js\")[\"default\"];\nvar toPrimitive = require(\"./toPrimitive.js\");\nfunction toPropertyKey(t) {\n  var i = toPrimitive(t, \"string\");\n  return \"symbol\" == _typeof(i) ? i : i + \"\";\n}\nmodule.exports = toPropertyKey, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","function _typeof(o) {\n  \"@babel/helpers - typeof\";\n\n  return module.exports = _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) {\n    return typeof o;\n  } : function (o) {\n    return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o;\n  }, module.exports.__esModule = true, module.exports[\"default\"] = module.exports, _typeof(o);\n}\nmodule.exports = _typeof, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var getPrototypeOf = require(\"./getPrototypeOf.js\");\nvar setPrototypeOf = require(\"./setPrototypeOf.js\");\nvar isNativeFunction = require(\"./isNativeFunction.js\");\nvar construct = require(\"./construct.js\");\nfunction _wrapNativeSuper(t) {\n  var r = \"function\" == typeof Map ? new Map() : void 0;\n  return module.exports = _wrapNativeSuper = function _wrapNativeSuper(t) {\n    if (null === t || !isNativeFunction(t)) return t;\n    if (\"function\" != typeof t) throw new TypeError(\"Super expression must either be null or a function\");\n    if (void 0 !== r) {\n      if (r.has(t)) return r.get(t);\n      r.set(t, Wrapper);\n    }\n    function Wrapper() {\n      return construct(t, arguments, getPrototypeOf(this).constructor);\n    }\n    return Wrapper.prototype = Object.create(t.prototype, {\n      constructor: {\n        value: Wrapper,\n        enumerable: !1,\n        writable: !0,\n        configurable: !0\n      }\n    }), setPrototypeOf(Wrapper, t);\n  }, module.exports.__esModule = true, module.exports[\"default\"] = module.exports, _wrapNativeSuper(t);\n}\nmodule.exports = _wrapNativeSuper, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.T = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n};","__webpack_require__.nmd = (module) => {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","const random = (len) => crypto.getRandomValues(new Uint8Array(len));\n\nlet IDX = 256,\n\tHEX = [];\nfor (; IDX--; ) HEX[IDX] = (IDX + 256).toString(16).substring(1);\n\n/*#__INLINE__*/\nconst to_hex = (arr) => {\n\tlet i = 0,\n\t\toutput = '';\n\t// @ts-ignore\n\tfor (; i < arr.length; i++) output += HEX[arr[i]];\n\treturn output;\n};\n\n/*\nAnatomy of a Traceparent\n\n00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01\n^  ^                                ^                ^ \n|  |                                |                |\n|  |                                |                flags (2 hex)\n|  |                                parent-id (16 hex)\n|  trace-id (32 hex)\nversion (2 hex)\n*/\n\nconst trace_id_size = 16;\nconst parent_id_size = 8;\n\nconst W3C_TRACEPARENT_VERSION = '00';\n\nconst SAMPLED_FLAG = 0b00000001;\n\nconst traceparent = (version, trace_id, parent_id, flags) => ({\n\tversion,\n\ttrace_id,\n\tparent_id,\n\tflags,\n\n\tchild(sampled) {\n\t\treturn traceparent(\n\t\t\tthis.version,\n\t\t\tthis.trace_id,\n\t\t\tto_hex(random(parent_id_size)),\n\t\t\tsampled === undefined\n\t\t\t\t? this.flags\n\t\t\t\t: sampled\n\t\t\t\t\t? this.flags | SAMPLED_FLAG\n\t\t\t\t\t: this.flags & ~SAMPLED_FLAG\n\t\t);\n\t},\n\n\ttoString() {\n\t\tconst flags = this.flags.toString(16).padStart(2, '0');\n\t\treturn `${this.version}-${this.trace_id}-${this.parent_id}-${flags}`;\n\t},\n});\n\nexport function make(sampled) {\n\tconst total_size = trace_id_size + parent_id_size;\n\tconst id = random(total_size);\n\n\treturn traceparent(\n\t\tW3C_TRACEPARENT_VERSION,\n\t\tto_hex(id.slice(0, trace_id_size)),\n\t\tto_hex(id.slice(trace_id_size, total_size)),\n\t\tsampled ? SAMPLED_FLAG : 0b00000000\n\t);\n}\n\nexport function parse(value) {\n\tif (value.length > 55) return null;\n\tconst segs = value.split('-');\n\treturn traceparent(segs[0], segs[1], segs[2], parseInt(segs[3], 16));\n}\n\n// ~> Utils\n\nexport function is_sampled(id) {\n\treturn !!(id.flags & SAMPLED_FLAG);\n}\n","// Invalid span\nexport const INVALID_TRACE_ID = '00000000000000000000000000000000';\nexport const INVALID_SPAN_ID = '0000000000000000';\nexport const APP_NAME = 'web-analytics';\nexport const CONFIG_CHANGED = 'configChanged';\n","export class EventEmitter {\n    constructor() {\n        this.listeners = {};\n    }\n\n    on(event, fn) {\n        if (!this.listeners[event]) {\n            this.listeners[event] = [];\n        }\n        this.listeners[event].push(fn);\n    }\n\n    emit(event, ...args) {\n        const eventListeners = this.listeners[event];\n        if (eventListeners) {\n            eventListeners.forEach(fn => fn(...args));\n        }\n    }\n}\nexport const eventEmitter = new EventEmitter();\n","import { CONFIG_CHANGED } from './constants';\nimport { eventEmitter } from './EventEmitter';\nconst config = {\n\tdebug: false,\n\tenableTrace: false,\n\tenableCounter: false,\n\tenableGauge: false,\n\tenableHistogram: false,\n\tenableInteractions: false,\n\tenableTrack: false,\n\tenableMousemoveInteractions: false,\n\tenableScrollInteractions: false,\n\tenableKeypressInteractions: false,\n\tenableClickInteractions: false,\n};\n\nexport const set = (key, value) => {\n    const oldValue = config[key];\n    config[key] = value;\n\tif(eventEmitter)\n    \teventEmitter.emit(CONFIG_CHANGED, { key, value, oldValue });\n};\nexport const get = (key) => config[key];\n\n/*\n\tinteractionScrollElements: []\n*/\n","import { parse, make } from './tctx';\n\nconst metaEl = Array.from(document.getElementsByTagName('meta')).find(\n\t(e) => e.getAttribute('name') === 'traceparent'\n);\nconst traceparent = metaEl && metaEl.content ? parse(metaEl.content) : make();\n\nexport const defaultParentId = traceparent.parent_id;\nexport const defaultTraceId = traceparent.trace_id;\nexport const defaultTraceFlag = traceparent.flags;\nexport const defaultTraceParent = traceparent.toString();\nexport const createSpanId = () => make().parent_id;\nexport const createTraceId = () => make().trace_id;\nexport const createTraceParentHeader = (spanId, traceId) =>\n\t`${traceparent.version}-${traceId}-${spanId}-${traceparent.flags.toString(16).padStart(2, '0')}`;\n","let user = {};\n\nexport const set = (id, attributes = {}) => {\n\tuser = { ...attributes, id };\n};\n\nexport const get = () => ({ ...user });\n","let page = {};\n\nexport const set = (id, attributes = {}) => {\n\tpage = {\n\t\t...attributes,\n\t\tid: id || location.href.replace(location.origin, ''),\n\t};\n};\n\nexport const get = () => ({ ...page });\n","let application = {};\n\nexport const set = (name, version, attributes = {}) => {\n\tapplication = { ...attributes, name, version };\n};\n\nexport const get = () => ({ ...application });\n","import { get as getUser } from './user';\nimport { get as getPage } from './page';\nimport { get as getApplication } from './application';\n\nexport default function getItemMetadata() {\n\treturn {\n\t\tapplication: getApplication(),\n\t\tuser: getUser(),\n\t\tpage: getPage(),\n\t};\n}\n","import { defaultTraceParent, createTraceId } from './traceparent';\nimport { get as getConfigValue } from './config';\nimport getItemMetadata from './getItemMetadata';\n\nexport default function createTracker(exporter) {\n\treturn function track(name, options = {}) {\n\t\tif (!getConfigValue('enableTrack')) return;\n\n\t\tconst { attributes, time = Date.now(), traceId } = options;\n\t\tconst { page, user, application } = getItemMetadata();\n\t\tconst event = {\n\t\t\tname,\n\t\t\ttype: 'usage',\n\t\t\tattributes,\n\t\t\tapplication,\n\t\t\tuser,\n\t\t\tpage,\n\t\t\ttimestamp: time,\n\t\t\ttraceId: traceId || createTraceId(),\n\t\t\tdocumentTraceParent: defaultTraceParent,\n\t\t};\n\n\t\texporter(event);\n\t};\n}\n","import { defaultTraceParent, createTraceId } from './traceparent';\nimport { make } from './tctx';\nimport { get as getConfigValue } from './config';\nimport getItemMetadata from './getItemMetadata';\n\nconst isEnabled = (type) => {\n\tswitch (type) {\n\t\tcase 'counter':\n\t\t\treturn getConfigValue('enableCounter');\n\t\t\tbreak;\n\t\tcase 'gauge':\n\t\t\treturn getConfigValue('enableGauge');\n\t\t\tbreak;\n\t\tcase 'histogram':\n\t\t\treturn getConfigValue('enableHistogram');\n\t\t\tbreak;\n\t}\n};\n\nconst createMetric = (name, options, type, cb) => {\n\tconst id = make().parent_id;\n\n\treturn function metric(value, attributes) {\n\t\tif (!isEnabled(type)) return;\n\n\t\tif (attributes)\n\t\t\toptions.attributes = { ...options.attributes, ...attributes };\n\n\t\tcb({\n\t\t\t...options,\n\t\t\tid,\n\t\t\tname,\n\t\t\ttype,\n\t\t\tvalue,\n\t\t\ttraceId: options.traceId || createTraceId(),\n\t\t});\n\t};\n};\n\nconst applyAppUserAttributes = (metric) => {\n\tif (!metric.attributes) metric.attributes = {};\n\n\tconst { page, application, user } = getItemMetadata();\n\n\tmetric.timestamp = Date.now();\n\tmetric.application = application;\n\tmetric.user = user;\n\tmetric.page = page;\n\tmetric.documentTraceParent = defaultTraceParent;\n\n\treturn metric;\n};\n\nexport default function createMetrics(exporter) {\n\tconst metricCallback = (metric) => exporter(applyAppUserAttributes(metric));\n\n\treturn {\n\t\tcreateCounter(name, options = {}) {\n\t\t\treturn createMetric(name, options, 'counter', metricCallback);\n\t\t},\n\t\tcreateGauge(name, options = {}) {\n\t\t\treturn createMetric(name, options, 'gauge', metricCallback);\n\t\t},\n\t\tcreateHistogram(name, options = {}) {\n\t\t\treturn createMetric(name, options, 'histogram', metricCallback);\n\t\t},\n\t};\n}\n","import { defaultTraceParent, createTraceId } from './traceparent';\nimport { get as getConfigValue } from './config';\nimport getItemMetadata from './getItemMetadata';\n\nconst observedScrollElements = new Set();\nobservedScrollElements.add(window);\n\nconst isEnabled = (type) => {\n\tif (!getConfigValue('enableInteractions')) return false;\n\n\tswitch (type) {\n\t\tcase 'move':\n\t\t\treturn getConfigValue('enableMousemoveInteractions');\n\t\tcase 'scroll':\n\t\t\treturn getConfigValue('enableScrollInteractions');\n\t\tcase 'keypress':\n\t\t\treturn getConfigValue('enableKeypressInteractions');\n\t\tcase 'click':\n\t\t\treturn getConfigValue('enableClickInteractions');\n\t}\n};\n\nexport default function initInteractionsTracker(exporter) {\n\tif (!getConfigValue('enableInteractions')) return false;\n\tconst movementInterval = 100;\n\tconst resizeInterval = 100;\n\tconst scrollInterval = 100;\n\n\tlet lastResize = 0;\n\tlet windowWidth = window.innerWidth;\n\tlet windowHeight = window.innerHeight;\n\tlet pageWidth = document.documentElement.scrollWidth;\n\tlet pageHeight = document.documentElement.scrollHeight;\n\n\twindow.addEventListener('resize', () => {\n\t\tconst now = Date.now();\n\t\tif (now > lastResize + resizeInterval) {\n\t\t\twindowWidth = window.innerWidth;\n\t\t\twindowHeight = window.innerHeight;\n\t\t\tpageWidth = document.documentElement.scrollWidth;\n\t\t\tpageHeight = document.documentElement.scrollHeight;\n\t\t\tlastResize = now;\n\t\t}\n\t});\n\n\tconst createEvent = (name, e) => {\n\t\tconst { clientX, clientY, pageX, pageY, screenX, screenY, target } = e;\n\t\tconst { page, user, application } = getItemMetadata();\n\n\t\treturn {\n\t\t\tattributes: {\n\t\t\t\tclientX,\n\t\t\t\tclientY,\n\t\t\t\tpageX,\n\t\t\t\tpageY,\n\t\t\t\tscreenX,\n\t\t\t\tscreenY,\n\t\t\t\ttarget: target.tagName.toLowerCase(),\n\t\t\t\twindowWidth,\n\t\t\t\twindowHeight,\n\t\t\t\tpageWidth,\n\t\t\t\tpageHeight,\n\t\t\t\tscrollTop: name === 'scroll' ? target.scrollTop : undefined,\n\t\t\t},\n\t\t\tname,\n\t\t\tapplication,\n\t\t\tuser,\n\t\t\tpage,\n\t\t\ttype: 'interaction',\n\t\t\ttimestamp: Date.now(),\n\t\t\ttraceId: createTraceId(),\n\t\t\tdocumentTraceParent: defaultTraceParent,\n\t\t};\n\t};\n\n\tobservedScrollElements.forEach((el) => {\n\t\tlet lastScroll = 0;\n\t\tel.addEventListener('scroll', (e) => {\n\t\t\tif (!isEnabled('scroll')) return;\n\t\t\tconst now = Date.now();\n\t\t\tif (now > lastScroll + scrollInterval) {\n\t\t\t\tconst event = createEvent('scroll', e);\n\t\t\t\tlastScroll = now;\n\t\t\t\texporter(event);\n\t\t\t}\n\t\t});\n\t});\n\n\tlet lastMovement = 0;\n\tdocument.addEventListener('mousemove', (e) => {\n\t\tif (!isEnabled('move')) return;\n\t\tconst now = Date.now();\n\t\tif (now > lastMovement + movementInterval) {\n\t\t\tconst event = createEvent('mousemove', e);\n\t\t\tlastMovement = now;\n\t\t\texporter(event);\n\t\t}\n\t});\n\n\tdocument.addEventListener('click', (e) => {\n\t\tif (!isEnabled('click')) return;\n\t\tconst event = createEvent('click', e);\n\t\texporter(event);\n\t});\n\n\tdocument.addEventListener('keypress', (e) => {\n\t\tif (!isEnabled('keypress')) return;\n\t\tconst event = createEvent('keypress', e);\n\t\texporter(event);\n\t});\n}\n","// const observers = new Set();\n// export default observers;\n\nconst globalKey = 'now.__SNANALYTICS_OBSERVER_SET__';\nconst globalObj = typeof window !== 'undefined' ? window : globalThis;\n\nif (!globalObj[globalKey]) {\n\tglobalObj[globalKey] = new Set();\n}\n\nconst observers = globalObj[globalKey];\n\nexport default observers;\n","const values = {\n\tevents: [],\n\tflushed: false,\n};\n\nexport const set = (key, value) => (values[key] = value);\n\nexport const get = (key) => values[key];\n","import { get as getConfigValue } from './config';\nimport observers from './observers';\nimport { get } from './queuedEvents';\n\n/**\n * Notify trace subscribers with a trace event\n * @private\n */\nconst notifyTraceSubscriber = (span) => {\n\tif (!span) return;\n\n\tconst _span = {\n\t\ttype: 'trace',\n\t\tid: span.id,\n\t\ttraceId: span.traceId,\n\t\tparentSpanId: span.parentSpanId,\n\t\tname: span.name,\n\t\tkind: span.kind,\n\t\tstartTime: span.startTime,\n\t\tendTime: span.endTime,\n\t\tduration: span.duration,\n\t\tattributes: span.attributes,\n\t\tevents: span.events,\n\t\tlinks: span.links,\n\t\tstatus: span.status,\n\t\tapplication: span.application,\n\t\tuser: span.user,\n\t\tpage: span.page,\n\t\tdocumentTraceParent: span.documentTraceParent,\n\t\trelativeStartTime: span.relativeStartTime,\n\t\trelativeEndTime: span.relativeEndTime,\n\t\ttimeOrigin: span.timeOrigin\n\t};\n\n\tobservers.forEach((observer) => {\n\t\ttry {\n\t\t\tobserver(_span);\n\t\t} catch (err) {\n\t\t\tconsole.error('Error in trace subscriber:', err);\n\t\t}\n\t});\n};\n\n/**\n * Processes trace events, handling both single spans and batches\n * @private\n */\nconst handleTraceEvents = (event) => {\n\t// Handle missing/invalid events\n\tif (!event) return false;\n\n\t// Handle array of spans (batch)\n\tif (Array.isArray(event)) {\n\t\t// Only process if all items are span events\n\t\tif (event.length > 0 && event.every(e => e && e.type === 'trace')) {\n\t\t\tevent.forEach(span => notifyTraceSubscriber(span));\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\t// Handle single span\n\tif (event.type === 'trace') {\n\t\tnotifyTraceSubscriber(event);\n\t\treturn true;\n\t}\n\n\treturn false;\n};\n\nexport default function exporter(event) {\n\tconst debug = getConfigValue('debug');\n\n\tif (debug) console.dir(event);\n\n\tif (handleTraceEvents(event)) {\n\t\treturn;\n\t}\n\n\tif (event.type !== 'trace') {\n\t\tobservers.forEach((observer) => {\n\t\t\ttry {\n\t\t\t\tobserver(event);\n\t\t\t} catch (err) {\n\t\t\t\tconsole.error('Error in event observer:', err);\n\t\t\t}\n\t\t});\n\n\t\t// Note: Removed queuedEvents.push() to prevent memory leak\n\t\t// The queuedEvents array was accumulating events indefinitely because\n\t}\n}\n","\n/**\n * Abstract base class for context.\n */\nexport class Context {\n\n    constructor() {\n        if(this.constructor === Context) {\n            throw new Error('Context is abstract and cannot be instantiated directly');\n        }\n    }\n    /**\n     * Get a value from the context.\n     *\n     * @param key key which identifies a context value\n     */\n    getValue(key) {\n        throw new Error('Not implemented');\n    }\n  \n    /**\n     * Create a new context which inherits from this context and has\n     * the given key set to the given value.\n     *\n     * @param key context key for which to set the value\n     * @param value value to set for the given key\n     */\n    setValue(key, value) {\n        throw new Error('Not implemented');\n    }\n  \n    /**\n     * Return a new context which inherits from this context but does\n     * not contain a value for the given key.\n     *\n     * @param key context key for which to clear a value\n     */\n    deleteValue(key) {\n       throw new Error('Not implemented');\n    }\n}\n\n/**\n * Abstract base class for context manager.\n */\nexport class ContextManager {\n    constructor(name) {\n        this.name = name;\n        if(this.constructor === ContextManager) {\n            throw new Error('ContextManager is abstract and cannot be instantiated directly');\n        }\n    }\n    /**\n     * Get the current context.\n     */\n    active() {\n        throw new Error('Not implemented');\n    }\n    /**\n     * Run the given function in the given context.\n     *\n     * @param {Context} _context context to use\n     * @param {Function} _fn function to run\n     * @param {Object} _thisArg optional receiver to be used for calling fn\n     * @param {Array} _args optional arguments forwarded to fn\n     * @returns {any} result of fn\n     */\n    with(\n        _context,\n        _fn,\n        _thisArg,\n        ..._args\n      ) {\n        throw new Error('Not implemented');\n    }\n    /**\n     * Bind an object as the current context (or a specific one)\n     *\n     * @param {Context} _context Optionally specify the context which you want to assign\n     * @param {Object} _target Any object to which a context need to be set\n     * @returns {Object} target\n     */\n    bind(_target, _context) {\n        throw new Error('Not implemented');\n    }\n    /**\n     * Enable context management\n     */\n    enable() {\n        throw new Error('Not implemented');\n    }\n    /**\n     * Disable context management\n     */\n    disable() {\n        throw new Error('Not implemented');\n    }\n\n    enter() {\n        throw new Error('Not implemented');\n    }\n\n    leave() {\n        throw new Error('Not implemented');\n    }\n}","import { Context } from \"./types\";\n\n/**\n * Represents a base context that manages a map of key-value pairs.\n * Allows for the creation of a new context that can optionally inherit\n * from a parent context.\n */\nclass BaseContext extends Context {\n    constructor(parentContext) {\n        super();\n        const self = this;\n\n        self._currentContext = parentContext ? new Map(parentContext) : new Map();\n\n        self.getValue = (key) => self._currentContext.get(key);\n\n        self.setValue = (key, value) => {\n            const context = new BaseContext(self._currentContext);\n            context._currentContext.set(key, value);\n            return context;\n        };\n\n        self.deleteValue = (key) => {\n            const context = new BaseContext(self._currentContext);\n            context._currentContext.delete(key);\n            return context;\n        };\n    }\n}\n\nconst ROOT_CONTEXT = new BaseContext();\n\nexport { ROOT_CONTEXT };\n","// Our own namespace for context keys, following OTEL's pattern\nexport const SPAN_CONTEXT_KEY = Symbol.for('sn.analytics.trace.span');\nexport const ROOT_LEVEL_EVENTS = [\n    'click',     // User wants to activate something\n    'submit',    // User wants to submit form  \n    'keydown',   // User is typing/using keyboard shortcuts\n    'input',     // User is entering data\n    'change'\n];\n\nexport const SPAN_KIND_CLIENT = 3;\nexport const ROOT_SPAN_CLOSE_WAIT_MS = 200;","import { ROOT_CONTEXT } from './BaseContext';\nimport { ContextManager } from './types';\n\n/**\n * A context manager that propagates context through asynchronous operations\n * by delegating patching to a BrowserPatcher.\n */\nclass StackContextManager extends ContextManager {\n  constructor() {\n    super(\"stackContextManager\");\n    this._contextStack = [ROOT_CONTEXT]; \n    this._enabled = false; \n    this.enable();\n  }\n\n  _bindFunction(context = ROOT_CONTEXT, target) {\n    const manager = this;\n    const contextWrapper = function (...args) {\n      return manager.with(context, () => target.apply(this, args));\n    };\n    Object.defineProperty(contextWrapper, 'length', {\n      enumerable: false,\n      configurable: true,\n      writable: false,\n      value: target.length,\n    });\n    return contextWrapper;\n  }\n\n\n  /**\n   * Return a function that will enter the given context and execute the given function.\n   * This is the core of the context propagation mechanism.\n   * @param {function} target A function to be executed in the given context.\n   * @param {*} [context] The context to enter before the function is executed. Defaults to the current active context.\n   * @returns {function} The wrapped function.\n   */\n  bind(target, context) {\n    if (!this._enabled) {\n      return target;\n    }\n    if (context === undefined) {\n      context = this.active();\n    }\n    if (typeof target === 'function') {\n      return this._bindFunction(context, target);\n    }\n    return target;\n  }\n\n  /**\n   * Manually enters a context, pushing it onto the stack.\n   * Must be paired with a call to leave().\n   * @param {*} context The context to enter.\n   */\n  enter(context) {\n    this._contextStack.push(context);\n  }\n\n  /**\n   * Manually leaves a context, popping it from the stack.\n   */\n  leave() {\n    if (this._contextStack.length > 1) { // Do not pop the root context\n        this._contextStack.pop();\n    }\n  }\n\n  /**\n   * Runs a function within a specific context.\n   * @param {*} activeContext The context to run the function in.\n   * @param {function} fn The function to execute.\n   * @param {*} [thisArg] The `this` context for the function.\n   * @param {...*} [args] Arguments to pass to the function.\n   * @returns {*} The result of the function.\n   */\n  with(activeContext, fn, thisArg, ...args) {\n    this.enter(activeContext);\n    try {\n      return fn.apply(thisArg, args);\n    } catch (error) {\n      console.error('StackContextManager.with error running provided function', error);\n      throw error;\n    } finally {\n      this.leave();\n    }\n  }\n\n  /**\n   * @returns {*} The active context.\n   */\n  active() {\n    return this._contextStack[this._contextStack.length - 1];\n  }\n\n  hasActiveContext() {\n    return this.active() !== ROOT_CONTEXT;\n  }\n\n  enable() {\n    if (this._enabled) return;\n    this._enabled = true;\n  }\n\n  disable() {\n    if (!this._enabled) return;\n    this._contextStack = [ROOT_CONTEXT];\n    this._enabled = false;\n  }\n\n  toString() {\n    return this.name;\n  }\n\n}\nexport default StackContextManager;","import { ContextManager } from \"./types\";\nimport { ROOT_CONTEXT } from \"./BaseContext\";\n\nclass NoopContextManager extends ContextManager {\n    constructor() {\n        super(\"noopContextManager\");\n        this._enabled = false;\n    }\n    \n    active() {\n      return ROOT_CONTEXT;\n    }\n  \n    with(_, fn, thisArg, ...args) {\n      return fn.call(thisArg, ...args);\n    }\n  \n    bind(target, _context) {\n      return target;\n    }\n  \n    enable() {\n      return this;\n    }\n  \n    disable() {\n      return this;\n    }\n\n    enter() {\n        return this;\n    }\n\n    leave() {\n        return this;\n    }\n\n    toString() {\n        return this.name;\n    }\n  }\nexport default NoopContextManager;\n","let handler = null;\n\nexport function setInteractionHandler(handlerFn) {\n    handler = handlerFn;\n}\n\nexport function getInteractionHandler() {\n    return handler;\n}\n\nexport function clearInteractionHandler() {\n    handler = null;\n}\n","import { ROOT_LEVEL_EVENTS } from '../constants';\nimport { ROOT_CONTEXT } from '../context/BaseContext';\nimport { getInteractionHandler } from './interactionHandler';\nimport { isCustomEvent } from './isCustomEvent';\n\n/**\n * A class responsible for patching native browser APIs to propagate context.\n * It is designed to be used by a context manager.\n */\nexport class BrowserPatcher {\n  constructor() {\n    this._originalAPIs = {};\n    this._patched = new Set();\n    this.processedEvents = new WeakSet();\n    this._manager = null;\n  }\n\n  setManager(manager) {\n    this._manager = manager;\n  }\n\n  patchAll() {\n    if (typeof window === 'undefined' || typeof document === 'undefined') return;\n    if (this._patched.size > 0) return;\n\n    const apisToPatch = [\n      { name: 'fetch', type: 'function' },\n      { name: 'setTimeout', type: 'callback', alwaysBind: true },\n      { name: 'setInterval', type: 'callback', alwaysBind: true },\n      { name: 'requestIdleCallback', type: 'callback', alwaysBind: true },\n      { name: 'requestAnimationFrame', type: 'callback', alwaysBind: true },\n      { name: 'MutationObserver', type: 'constructor' },\n      { name: 'ResizeObserver', type: 'constructor' },\n      { name: 'IntersectionObserver', type: 'constructor' },\n    ];\n\n    apisToPatch.forEach(api => this._patchAPI(api));\n\n    this._patchPromise();\n    this._patchEventTarget();\n    this._patchDOMAPIs();\n    this._patchMessageChannel();\n    console.debug('Patched async browser APIs for trace context propagation...');\n  }\n\n  unpatchAll() {\n    if (typeof window === 'undefined' || typeof document === 'undefined') return;\n    if (this._patched.size === 0) return;\n\n    for (const key of this._patched) {\n      const original = this._originalAPIs[key];\n      if (!original) continue;\n\n      if (original.isDescriptor) {\n        const [className, propName] = key.split('.prototype.');\n        if (window[className] && window[className].prototype) {\n            Object.defineProperty(window[className].prototype, propName, original.value);\n        }\n      } else if (key.includes('.prototype.')) {\n        const [className, propName] = key.split('.prototype.');\n        if (window[className] && window[className].prototype) {\n            window[className].prototype[propName] = original;\n        }\n      } else {\n        window[key] = original;\n      }\n    }\n    this._patched.clear();\n    this._originalAPIs = {};\n    console.debug('Unpatched async browser APIs for trace context propagation...');\n  }\n\n  _patchAPI({ name, type: patchType, alwaysBind = false }) {\n    if (this._patched.has(name) || typeof window[name] === 'undefined') return;\n\n    const original = window[name];\n    this._originalAPIs[name] = original;\n    this._patched.add(name);\n\n    const manager = this._manager;\n\n    if (patchType === 'constructor') {\n      window[name] = class extends original {\n        constructor(fn, ...args) {\n          const context = manager.active();\n          // Only wrap the function if there's a real context to propagate.\n          // The ROOT_CONTEXT is the default and doesn't need to be propagated explicitly.\n          if (manager._enabled && typeof fn === 'function' && context !== ROOT_CONTEXT) {\n            const boundFn = manager.bind(fn, context);\n            super(boundFn, ...args);\n          } else {\n            super(fn, ...args);\n          }\n        }\n      };\n    } else if (patchType === 'callback') {\n      window[name] = function (fn, ...args) {\n        const context = manager.active();\n        const shouldBind = manager._enabled && typeof fn === 'function' && (alwaysBind || context !== ROOT_CONTEXT);\n        const boundFn = shouldBind ? manager.bind(fn, context) : fn;\n        return original.call(this, boundFn, ...args);\n      };\n    } else {\n      window[name] = function (...args) {\n        if (!manager._enabled) return original.apply(this, args);\n        const context = manager.active();\n        const boundFn = manager.bind(original, context);\n        return boundFn.apply(this, args);\n      };\n    }\n  }\n\n  _patchPromise() {\n    if (this._patched.has('Promise.prototype.then')) return;\n    this._patched.add('Promise.prototype.then');\n\n    const manager = this._manager;\n    const originalThen = Promise.prototype.then;\n    this._originalAPIs['Promise.prototype.then'] = originalThen;\n\n    Promise.prototype.then = function (onFulfilled, onRejected) {\n      if (!manager._enabled) return originalThen.call(this, onFulfilled, onRejected);\n      const context = manager.active();\n      const wrappedFulfilled = onFulfilled && context ? manager.bind(onFulfilled, context) : onFulfilled;\n      const wrappedRejected = onRejected && context ? manager.bind(onRejected, context) : onRejected;\n      return originalThen.call(this, wrappedFulfilled, wrappedRejected);\n    };\n  }\n\n  _patchEventTarget() {\n    if (this._patched.has('EventTarget.prototype.addEventListener')) return;\n    this._patched.add('EventTarget.prototype.addEventListener');\n    const manager = this._manager;\n    const originalAddEventListener = EventTarget.prototype.addEventListener;\n    this._originalAPIs['EventTarget.prototype.addEventListener'] = originalAddEventListener;\n    const self = this;\n    const listenerMapKey = Symbol.for('sn.analytics.listenerMap');\n    EventTarget.prototype.addEventListener = function (type, listener, options) {\n      // Do not wrap listeners on custom elements to avoid interfering with framework internals.\n      const isCustomElement = this.tagName && this.tagName.includes('-');\n\n      if (!manager._enabled || typeof listener !== 'function' || listener._isContextWrapped || isCustomElement) {\n        return originalAddEventListener.call(this, type, listener, options);\n      }\n\n      const wrappedListener = function (...args) {\n        const event = args[0];\n\n        if (isCustomEvent(event)) {\n          return listener.apply(this, args);\n        }\n\n        if (self._isUserInteractionEvent(type)) {\n          if (event.eventPhase === Event.CAPTURING_PHASE) {\n            return listener.apply(this, args);\n          }\n\n          if (!self.processedEvents.has(event)) {\n            self.processedEvents.add(event);\n            return self._handleUserInteraction(type, event, listener, this, args);\n          }\n          return listener.apply(this, args);\n        } else {\n          const context = manager.active();\n          return context === ROOT_CONTEXT ? listener.apply(this, args) : manager.with(context, () => listener.apply(this, args));\n        }\n      };\n\n      wrappedListener._isContextWrapped = true;\n      (this[listenerMapKey] = this[listenerMapKey] || new WeakMap()).set(listener, wrappedListener);\n      return originalAddEventListener.call(this, type, wrappedListener, options);\n    };\n\n    const originalRemoveEventListener = EventTarget.prototype.removeEventListener;\n    this._originalAPIs['EventTarget.prototype.removeEventListener'] = originalRemoveEventListener;\n    this._patched.add('EventTarget.prototype.removeEventListener');\n\n    EventTarget.prototype.removeEventListener = function (type, listener, options) {\n      return originalRemoveEventListener.call(this, type, this[listenerMapKey]?.get(listener) || listener, options);\n    };\n  }\n\n  _patchDOMAPIs() {\n    const manager = this._manager;\n    const domAPIs = ['appendChild', 'insertBefore', 'removeChild', 'replaceChild'];\n\n    domAPIs.forEach(method => {\n      if (this._patched.has(`Element.prototype.${method}`)) return;\n      const original = Element.prototype[method];\n      this._originalAPIs[`Element.prototype.${method}`] = original;\n      this._patched.add(`Element.prototype.${method}`);\n\n      Element.prototype[method] = function (...args) {\n        if (!manager._enabled) return original.apply(this, args);\n        return manager.with(manager.active(), () => original.apply(this, args));\n      };\n    });\n  }\n\n  _patchMessageChannel() {\n    if (this._patched.has('MessagePort.prototype.onmessage')) return;\n    if (typeof MessagePort === 'undefined') return;\n\n    this._patched.add('MessagePort.prototype.onmessage');\n    const manager = this._manager;\n    const originalDescriptor = Object.getOwnPropertyDescriptor(MessagePort.prototype, 'onmessage');\n    if (originalDescriptor) {\n        this._originalAPIs['MessagePort.prototype.onmessage'] = { isDescriptor: true, value: originalDescriptor };\n\n        Object.defineProperty(MessagePort.prototype, 'onmessage', {\n            ...originalDescriptor,\n            set(value) {\n                const context = manager.active();\n                const boundFn = manager._enabled && typeof value === 'function' && context !== ROOT_CONTEXT\n                    ? manager.bind(value, context)\n                    : value;\n                originalDescriptor.set.call(this, boundFn);\n            },\n        });\n    }\n  }\n\n  _isUserInteractionEvent(type) {\n    return ROOT_LEVEL_EVENTS.includes(type);\n  }\n\n  _handleUserInteraction(type, event, listener, context, args) {\n    const handler = getInteractionHandler();\n    if (typeof handler === 'function') {\n      try {\n        return handler(type, event, () => {\n          return listener.apply(context, args);\n        });\n      } catch (error) {\n        console.error('Error in interaction handler:', error);\n      }\n    }\n  }\n}","export function isCustomEvent(event) {\n    return event && (event instanceof CustomEvent || event.constructor.name === 'CustomEvent' || event.isTrusted === false);\n}","\nimport { get as getConfigValue } from '../../config';\nexport function isTracingEnabled() {\n    return Boolean(getConfigValue('enableTrace'));\n}","import StackContextManager from \"./StackContextManager\";\nimport NoopContextManager from \"./NoopContextManager\";\nimport { BrowserPatcher } from \"../utils/BrowserPatcher\";\nimport { isTracingEnabled } from \"../utils/isTracingEnabled\";\nimport { eventEmitter } from \"../../EventEmitter\";\nimport { CONFIG_CHANGED } from \"../../constants\";\n\n/**\n * A dynamic context manager that can switch between a real (Stack) and a no-op\n * implementation at runtime based on the current configuration.\n */\nclass DynamicContextManager {\n    constructor() {\n        this._patcher = new BrowserPatcher();\n        this._stackManager = new StackContextManager();\n        this._noopManager = new NoopContextManager();\n        this._enabled = false; \n        this._patcher.setManager(this);\n\n        this.onConfigUpdate(isTracingEnabled());\n\n        eventEmitter.on(CONFIG_CHANGED, ({ key, value }) => {\n            if (key === 'enableTrace') {\n                this.onConfigUpdate(value);\n            }\n        });\n    }\n\n    onConfigUpdate(enabled) {\n        this._enabled = enabled;\n        this._manager = enabled ? this._stackManager : this._noopManager;\n        if (enabled) {\n            this._patcher.patchAll();\n        } else {\n            this._patcher.unpatchAll();\n        }\n    }\n\n    active() {\n        return this._manager.active();\n    }\n\n    bind(target, context = this.active()) {\n        return this._manager.bind(target, context);\n    }\n\n    with(context, fn, thisArg, span) {\n        return this._manager.with(context, fn, thisArg, span);\n    }\n    \n    enter(context) {\n        return this._manager.enter(context);\n    }\n    \n    leave() {\n        return this._manager.leave();\n    }\n    \n    toString() {\n        return this.constructor.name;\n    }\n}\nconst context = new DynamicContextManager();\nexport { context };","import {contextManager} from '.';\nimport { SPAN_CONTEXT_KEY } from '../constants';\n\n/**\n * Manages span context operations.\n * Follows OpenTelemetry's TracerProvider pattern.\n */\nexport class TraceApi {\n    getSpan(context) {\n        return context?.getValue(SPAN_CONTEXT_KEY);\n    }\n   \n    setSpan(context, span) {\n        return context?.setValue(SPAN_CONTEXT_KEY, span);\n    }\n   \n    getActiveSpan() {\n        const activeContext = contextManager.active();\n        return this.getSpan(activeContext);\n    }\n}\n\n// Export singleton instance\nconst traceApi = new TraceApi();\nexport default traceApi;","import { SpanProcessor } from './SpanProcessor';\nimport { isTracingEnabled } from '../utils/isTracingEnabled';\n\n// Default values for batch processing\nconst DEFAULT_MAX_QUEUE_SIZE = 200;\nconst DEFAULT_SCHEDULED_DELAY = 2000; // 2 seconds\n\n/**\n * BatchSpanProcessor batches ended spans and pushes them to the configured span exporter.\n */\nexport class BatchSpanProcessor extends SpanProcessor {\n    constructor(exporter, config = {}) {\n        super();\n        this._exporter = exporter;\n        this._maxQueueSize = config.maxQueueSize || DEFAULT_MAX_QUEUE_SIZE;\n        this._scheduledDelayMillis = config.scheduledDelayMillis || DEFAULT_SCHEDULED_DELAY;\n        this._queue = [];\n        this._timer = null;\n        this._isShutdown = false;\n    }\n\n    onStart(span) {\n        // Do nothing as spans are only processed when they end\n    }\n\n    onEnd(span) {\n        if (this._isShutdown || !isTracingEnabled()) {\n            return; \n        }\n\n        this._queue.push(span);\n        if (this._queue.length >= this._maxQueueSize) {\n            this._flush();\n        } else {\n            this._scheduleFlush();\n        }\n    }\n\n    async forceFlush() {\n        if (this._isShutdown || !isTracingEnabled()) {\n            return; \n        }\n\n        if (this._timer) {\n            clearTimeout(this._timer);\n            this._timer = null;\n        }\n\n        try {\n            await this._flush();\n        } catch (e) {\n            console.error('Error flushing spans:', e);\n        }\n    }\n\n    async shutdown() {\n        if (this._isShutdown || !isTracingEnabled()) {\n            return; \n        }\n\n        this._isShutdown = true;\n\n        if (this._timer) {\n            clearTimeout(this._timer);\n            this._timer = null;\n        }\n\n        // Flush any remaining spans\n        await this.forceFlush();\n\n        // Shutdown the exporter\n        if (this._exporter.shutdown) {\n            await this._exporter.shutdown();\n        }\n    }\n\n    _scheduleFlush() {\n        if (this._timer || this._isShutdown) {\n            return;\n        }\n\n        this._timer = setTimeout(() => {\n            this._flush();\n        }, this._scheduledDelayMillis);\n    }\n\n    async _flush() {\n        if (this._timer) {\n            clearTimeout(this._timer);\n            this._timer = null;\n        }\n\n        if (this._isShutdown || this._queue.length === 0) {\n            return;\n        }\n\n        const spans = this._queue.slice();\n        this._queue = [];\n\n        try {\n            await this._exporter(spans);\n        } catch (e) {\n            console.error('Error exporting spans:', e);\n            // Put spans back in the queue if export failed\n            this._queue.unshift(...spans);\n        }\n    }\n\n    toString() {\n        return this.constructor.name;\n    }\n}","/**\n * SpanProcessor is the interface Tracer SDK uses to batch and convert spans\n * to exportable representation and send them to the configured exporter.\n */\nexport class SpanProcessor {\n    /**\n     * Called when a Span is started, if the {@link Span#isRecording()} returns true.\n     * @param {Span} span The started Span.\n     */\n    onStart(_span) {\n        throw new Error('onStart must be implemented');\n    }\n\n    /**\n     * Called when a Span is ended, if the {@link Span#isRecording()} returns true.\n     * @param {Span} span The ended Span.\n     */\n    onEnd(_span) {\n        throw new Error('onEnd must be implemented');\n    }\n\n    /**\n     * Shuts down the processor. Called when SDK is shut down.\n     * @returns {Promise<void>}\n     */\n    async shutdown() {\n        throw new Error('shutdown must be implemented');\n    }\n\n    /**\n     * Forces the processor to flush all spans to the configured exporter.\n     * @returns {Promise<void>}\n     */\n    async forceFlush() {\n        throw new Error('forceFlush must be implemented');\n    }\n\n    toString() {\n        return this.constructor.name;\n    }\n}","export const SPAN_KIND = {\n\t// Unspecified. Do NOT use as default.\n\t// Implementations MAY assume SpanKind to be INTERNAL when receiving UNSPECIFIED.\n\tUNSPECIFIED: 0,\n\n\t// Indicates that the span represents an internal operation within an application,\n\t// as opposed to an operation happening at the boundaries. Default value.\n\tINTERNAL: 1,\n\n\t// Indicates that the span covers server-side handling of an RPC or other\n\t// remote network request.\n\tSERVER: 2,\n\n\t// Indicates that the span describes a request to some remote service.\n\tCLIENT: 3,\n\n\t// Indicates that the span describes a producer sending a message to a broker.\n\t// Unlike CLIENT and SERVER, there is often no direct critical path latency relationship\n\t// between producer and consumer spans. A PRODUCER span ends when the message was accepted\n\t// by the broker while the logical processing of the message might span a much longer time.\n\tPRODUCER: 4,\n\n\t// Indicates that the span describes consumer receiving a message from a broker.\n\t// Like the PRODUCER kind, there is often no direct critical path latency relationship\n\t// between producer and consumer spans.\n\tCONSUMER: 5,\n};\n","import { INVALID_SPAN_ID, INVALID_TRACE_ID } from '../../constants';\nimport { SPAN_KIND } from '../spanKind';\n\nexport default class NonRecordingSpan {\n    // Static values to avoid any initialization cost\n    id = INVALID_SPAN_ID;\n    traceId = INVALID_TRACE_ID;\n    parentSpanId = null;\n    name = '';\n    kind = SPAN_KIND.INTERNAL;\n    startTime = null;\n    endTime = null;\n    duration = null;\n    status = { code: 0 };\n    attributes = {};\n    events = [];\n    links = [];\n\n    // No-op methods\n    isRecording() { return false; }\n    spanContext() { return { traceId: this.traceId, spanId: this.id, traceFlags: 0 }; }\n    setAttribute() { return this; }\n    setAttributes() { return this; }\n    addEvent() { return this; }\n    setStatus() { return this; }\n    updateName() { return this; }\n    end() { return this; }\n    endSpan() { return this; }\n    recordException() { return this; }\n    addLink() { return this; }\n}","import { ROOT_CONTEXT } from \"../context\";\nimport { \n    SPAN_CONTEXT_KEY, \n    SPAN_KIND_CLIENT, \n    ROOT_SPAN_CLOSE_WAIT_MS } from \"../constants\";\nimport { setInteractionHandler, clearInteractionHandler } from './interactionHandler';\n\nfunction getElementLabel(element) {\n    if (!element) return 'undefined';\n\n    const ariaLabel = element.getAttribute('aria-label');\n    if (ariaLabel) return ariaLabel.trim();\n\n    if (element.tagName === 'IMG' && element.alt) return element.alt.trim();\n\n    if (element.tagName === 'INPUT' && ['button', 'submit', 'reset'].includes(element.type)) {\n        return element.value.trim();\n    }\n    const textContent = element.textContent?.trim();\n    if (textContent) return textContent;\n\n    if (element.placeholder) return element.placeholder.trim();\n\n    const title = element.getAttribute('title');\n    if (title) return title.trim();\n\n    return 'undefined';\n}\n\nexport default function createEventTracer(tracer, contextManager) {\n    function handleUserEvent(type, event, fn) {\n        const target = event.target;\n        const rootSpan = tracer.startSpan(`USER_${type.toUpperCase()}`, {\n            attributes: {\n                'event.type': type,\n                'element.target': target?.tagName?.toLowerCase(),\n                'element.id': target?.id,\n                'element.className': target?.className,\n                'user_interaction': true,\n                'componentId': target?.nowId || 'undefined',\n                'tagName': target?.localName || 'undefined',\n                'element.label': getElementLabel(target),\n            },\n            kind: SPAN_KIND_CLIENT\n        });\n\n        const newRootContext = ROOT_CONTEXT.setValue(SPAN_CONTEXT_KEY, rootSpan);\n\n        contextManager.enter(newRootContext);\n\n        try {\n            return fn();\n        } catch (error) {\n            rootSpan.setStatus({ code: 'ERROR', message: error.message });\n            contextManager.leave();\n            rootSpan.end();\n            throw error;\n        } finally {\n            setTimeout(() => {\n                if (contextManager.active() === newRootContext) {\n                    contextManager.leave();\n                }\n                rootSpan.end();\n            }, window.nowAnalytics?.rootSpanTimeout || ROOT_SPAN_CLOSE_WAIT_MS);\n        }\n    }\n\n    function init() {\n        if (typeof window !== 'undefined') {\n            setInteractionHandler(handleUserEvent);\n        }\n    }\n\n    function destroy() {\n        if (typeof window !== 'undefined') {\n            clearInteractionHandler();\n        }\n    }\n\n    return {\n        init,\n        destroy\n    }\n}\n","\nimport { INVALID_SPAN_ID, INVALID_TRACE_ID } from '../../constants';\nimport createEventTracer from './userInteractionTracer';\n\nconst VALID_TRACE_ID_REGEX = /^([0-9a-f]{32})$/i;\nconst VALID_SPAN_ID_REGEX = /^[0-9a-f]{16}$/i;\n\nexport function isValidTraceId(traceId) {\n    return VALID_TRACE_ID_REGEX.test(traceId) && traceId !== INVALID_TRACE_ID;\n}\n\nexport function isValidSpanId(spanId) {\n    return VALID_SPAN_ID_REGEX.test(spanId) && spanId !== INVALID_SPAN_ID;\n}\n\nexport function isSpanContextValid(spanContext) {\n    return (\n        isValidTraceId(spanContext.traceId) && isValidSpanId(spanContext.spanId)\n    );\n}\n \nexport { createEventTracer }\n\n","export function sanitizeAttributes(attributes) {\n\tconst sanitizeAttributes = {};\n\n\tif (typeof attributes !== 'object' || attributes == null) {\n\t\treturn sanitizeAttributes;\n\t}\n\n\tfor (const [key, val] of Object.entries(attributes)) {\n\t\tif (!isValidAttributeKey(key)) {\n\t\t\tconsole.warn(`Invalid attribute key: ${key}`);\n\t\t\tcontinue;\n\t\t}\n\t\tif (!isValidAttributeValue(val)) {\n\t\t\tconsole.warn(`Invalid attribute value set for key: ${key}`);\n\t\t\tcontinue;\n\t\t}\n\t\tif (Array.isArray(val)) {\n\t\t\tsanitizeAttributes[key] = val.slice();\n\t\t} else {\n\t\t\tsanitizeAttributes[key] = val;\n\t\t}\n\t}\n\n\treturn sanitizeAttributes;\n}\n\nexport function isValidAttributeKey(key) {\n\treturn typeof key === 'string' && key.length > 0;\n}\n\nexport function isValidAttributeValue(val) {\n\tif (val == null) {\n\t\treturn true;\n\t}\n\n\tif (Array.isArray(val)) {\n\t\treturn val.every((e) => e == null || isValidPrimitiveAttributeValue(e));\n\t}\n\n\treturn isValidPrimitiveAttributeValue(val);\n}\n\nexport function isValidPrimitiveAttributeValue(val) {\n\treturn (\n\t\ttypeof val === 'string' ||\n\t\ttypeof val === 'number' ||\n\t\ttypeof val === 'boolean'\n\t);\n}\n","import { isValidTraceId } from '../utils';\nimport getItemMetadata from '../../getItemMetadata';\nimport { sanitizeAttributes } from '../../attributeValidator';\nimport traceApi from '../context/TraceApi';\nimport { SPAN_KIND } from '../spanKind';\nimport { defaultTraceParent, createSpanId, createTraceId } from '../../traceparent';\n\nconst timeOrigin = typeof performance !== 'undefined' ? performance.timeOrigin : 0;\nconst getCurrentTime = () => timeOrigin + performance.now();\n\nconst MAX_ATTRIBUTES_COUNT = 50;\nconst MAX_ATTRIBUTE_VALUE_LENGTH = 16384;\nconst MAX_EVENTS_COUNT = 50;\nconst MAX_LINKS_COUNT = 50;\n\nexport default class RecordingSpan {\n    constructor(name, options, context, spanProcessor) {\n        const { attributes = {}, root = false, links = [], parentSpan, kind = SPAN_KIND.INTERNAL } = options || {};\n        const parentContext = parentSpan || traceApi.getSpan(context);\n\n        let traceId;\n        let parentSpanId = null;\n\n        if (!parentContext || root) {\n            traceId = createTraceId();\n        } else {\n            traceId = isValidTraceId(parentContext.traceId) ? parentContext.traceId : createTraceId();\n            parentSpanId = parentContext.id;\n        }\n        \n        const { page, user, application } = getItemMetadata();\n\n        this.type = 'trace';\n        this.id = createSpanId();\n        this.traceId = traceId;\n        this.parentSpanId = parentSpanId;\n        this.name = name;\n        this.kind = kind;\n        this.startTime = getCurrentTime();\n        this.attributes = sanitizeAttributes(attributes);\n        this.events = [];\n        this.links = links;\n        this.status = { code: 0 }; \n        this.application = application;\n        this.user = user;\n        this.page = page;\n        this.documentTraceParent = defaultTraceParent;\n        this.relativeStartTime = typeof performance !== 'undefined' ? performance.now() : 0;\n        this._spanProcessor = spanProcessor;\n        this._ended = false;\n\n        if (this._spanProcessor) {\n            this._spanProcessor.onStart(this);\n        }\n    }\n\n    isRecording() {\n        return !this._ended;\n    }\n\n    spanContext() {\n        return {\n            traceId: this.traceId,\n            spanId: this.id,\n            traceFlags: 0,\n        };\n    }\n\n    setStatus(status) {\n        if (!this.isRecording()) {\n            return this; \n        }\n        this.status = status;\n        return this;\n    }\n\n    addEvent(name, attributes, now = getCurrentTime()) {\n        if (!this.isRecording()) {\n            return this; \n        }\n        \n        if (this.events.length >= MAX_EVENTS_COUNT) {\n            console.warn(`Span event limit (${MAX_EVENTS_COUNT}) exceeded. Dropping event: ${name}`);\n            return this;\n        }\n        \n        this.events.push({ name, attributes, time: now });\n        return this;\n    }\n\n    end() {\n        if (!this.isRecording()) {\n            return; \n        }\n        this._ended = true;\n        this.endTime = getCurrentTime();\n        this.relativeEndTime = typeof performance !== 'undefined' ? performance.now() : 0;\n        this.duration = this.endTime - this.startTime;\n\n        if (this._spanProcessor) {\n            this._spanProcessor.onEnd(this);\n        }\n    }\n\n    endSpan() {\n        this.end();\n    }\n\n    recordException(exception, now = getCurrentTime()) {\n        if (!this.isRecording()) {\n            return this; \n        }\n        this.addEvent('exception', {\n            exception,\n            timestamp: now\n        });\n        return this;\n    }\n\n    setAttribute(key, value) {\n        if (!this.isRecording()) {\n            return this; \n        }\n        if (value !== undefined && value !== null) {\n            if (Object.keys(this.attributes).length >= MAX_ATTRIBUTES_COUNT && !(key in this.attributes)) {\n                console.warn(`Span attribute limit (${MAX_ATTRIBUTES_COUNT}) exceeded. Dropping attribute: ${key}`);\n                return this;\n            }\n            \n            let processedValue = value;\n            if (typeof value === 'function') {\n                processedValue = '[Function]';\n                console.warn(`Attribute value for key '${key}' is a function and has been sanitized. Functions are not serializable.`)\n            }\n            else if (typeof value === 'string' && value.length > MAX_ATTRIBUTE_VALUE_LENGTH) {\n                processedValue = value.substring(0, MAX_ATTRIBUTE_VALUE_LENGTH) + '...';\n                console.warn(`Attribute value truncated for key: ${key}`);\n            }\n            this.attributes[key] = processedValue;\n        }\n        return this;\n    }\n\n    setAttributes(attributes) {\n        if (!this.isRecording() || !attributes) {\n            return this;\n        }\n        Object.keys(attributes).forEach(key => {\n            this.setAttribute(key, attributes[key]);\n        });\n        return this;\n    }\n\n    updateName(name) {\n        if (!this.isRecording()) {\n            return this; \n        }\n        this.name = name;\n        return this;\n    }\n\n    addLink(link) {\n        if (!this.isRecording()) {\n            return this; \n        }\n        \n        if (this.links.length >= MAX_LINKS_COUNT) {\n            console.warn(`Span link limit (${MAX_LINKS_COUNT}) exceeded. Dropping link`);\n            return this;\n        }\n        \n        this.links.push(link);\n        return this;\n    }\n}","export const SamplingDecision = {\n    NOT_RECORD: 0, \n    RECORD: 1,\n    RECORD_AND_SAMPLED: 2,\n};\n  ","import { SamplingDecision } from \"./sampler\";\n\nclass AlwaysOnSampler {\n    shouldSample(_options) {\n        return SamplingDecision.RECORD_AND_SAMPLED;\n    }\n\n    toString() {\n        return this.constructor.name;\n    }\n}\n\nexport default AlwaysOnSampler;","import { contextManager, SPAN_CONTEXT_KEY } from './context';\nimport { NonRecordingSpan } from './span';\n\n/**\n * A no-op implementation of the Tracer interface. This tracer returns\n * non-recording spans and does not interact with a SpanProcessor.\n */\nclass NoopTracer {\n  /**\n   * Starts a new `NonRecordingSpan`.\n   */\n  startSpan(_name, _options = {}, context = contextManager.active()) {\n    const parentSpan = context.getValue(SPAN_CONTEXT_KEY);\n\n    // If the parent context is a valid recording span, we still want to\n    // propagate its context, even if we aren't recording a new span.\n    if (parentSpan && parentSpan.isRecording()) {\n      return parentSpan;\n    }\n\n    return new NonRecordingSpan();\n  }\n\n  /**\n   * Starts a new active span and runs the given function.\n   */\n  startActiveSpan(name, options, fn , context) {\n    if (!fn) {\n      throw new Error('No function provided to startActiveSpan');\n    }\n    const span = this.startSpan(name, options, context);\n    const newContext = contextManager.active().setValue(SPAN_CONTEXT_KEY, span);\n    return contextManager.with(newContext, fn, null, span);\n  }\n\n  withSpan(span, fn) {\n    if (!fn) {\n      throw new Error('No function provided to withSpan');\n    }\n    return fn(span);\n  }\n\n  getActiveSpan() {\n    return null;\n  }\n}\n\nexport const noopTracer = new NoopTracer();\n","import { contextManager, traceApi } from './context/';\nimport { NonRecordingSpan, RecordingSpan } from './span/';\nimport { SamplingDecision } from './sampler';\nimport { noopTracer } from './NoopTracer';\nimport { isTracingEnabled } from './utils/isTracingEnabled';\nimport { CONFIG_CHANGED } from '../constants';\nimport { eventEmitter } from '../EventEmitter';\n\nclass TracerImpl {\n    constructor(spanProcessor, sampler, instrumentationScope) {\n        this._spanProcessor = spanProcessor;\n        this._sampler = sampler;\n        this._instrumentationScope = instrumentationScope;\n    }\n\n    startSpan(name, options = {}, context = contextManager.active()) {\n        const samplingDecision = this._sampler.shouldSample({ name, options, context });\n        if (samplingDecision === SamplingDecision.NOT_RECORD) {\n            return new NonRecordingSpan();\n        }\n        return new RecordingSpan(name, options, context, this._spanProcessor, this._instrumentationScope);\n    }\n\n    startActiveSpan(name, options = {}, fn, parentContext = contextManager.active()) {\n        if (!fn) {\n            throw new Error('No function provided to startActiveSpan');\n        }\n        const activeSpan = this.startSpan(name, options, parentContext);\n\n        if (activeSpan instanceof NonRecordingSpan) {\n            try {\n                return fn(activeSpan);\n            } finally {\n                activeSpan.end();\n            }\n        }\n\n        const contextWithCurrentSpan = traceApi.setSpan(parentContext, activeSpan);\n\n        try {\n            return contextManager.with(contextWithCurrentSpan, fn, undefined, activeSpan);\n        } finally {\n            if (!activeSpan._ended) {\n                activeSpan.end();\n            }\n        }\n    }\n\n    withSpan(span, fn) {\n        if (span instanceof NonRecordingSpan) {\n            return fn(span);\n        }\n        return contextManager.with(traceApi.setSpan(contextManager.active(), span), fn, undefined, span);\n    }\n\n    getActiveSpan() {\n        return traceApi.getSpan(contextManager.active());\n    }\n}\n\n/**\n * The Tracer is responsible for creating spans. It acts as a proxy, delegating\n * to a real or no-op implementation based on whether tracing is enabled or not.\n */\nexport class Tracer {\n    constructor(spanProcessor, sampler, instrumentationScope) {\n        this._noOpTracer = noopTracer;\n        this._realTracer = new TracerImpl(spanProcessor, sampler, instrumentationScope);\n        this._enabled = isTracingEnabled();\n        this._setCurrentTracer(this._enabled ? this._realTracer : this._noOpTracer);\n        eventEmitter.on(CONFIG_CHANGED, ({ key, value }) => {\n            if (key === 'enableTrace') {\n                this._enabled = value;\n                this._setCurrentTracer(this._enabled ? this._realTracer : this._noOpTracer);\n            }\n        });\n    }\n\n    _setCurrentTracer(currentImpl) {\n        this._impl = currentImpl;\n    }\n\n    startSpan(name, options, context) {\n        return this._impl.startSpan(name, options, context);\n    }\n\n    startActiveSpan(name, options, fn, context) {\n        return this._impl.startActiveSpan(name, options, fn, context);\n    }\n\n    withSpan(span, fn) {\n        return this._impl.withSpan(span, fn);\n    }\n\n    getActiveSpan() {\n        return this._impl.getActiveSpan();\n    }\n}","import { BatchSpanProcessor } from './processor';\nimport { Tracer } from './Tracer';\nimport { AlwaysOnSampler } from './sampler';\n\n/**\n * A TracerProvider is the entry point of the API.\n * It provides Tracers that are responsible for creating spans.\n */\nexport default class TracerProvider {\n    _spanProcessor;\n    _sampler;\n\n    /**\n     * @param {object} config The configuration object for the TracerProvider.\n     */\n    constructor(config = {}) {\n        const { spanProcessor, sampler } = config;\n        this._spanProcessor = spanProcessor || new BatchSpanProcessor(config.exporter);\n        this._sampler = sampler || new AlwaysOnSampler();\n    }\n\n    /**\n     * Gets a Tracer instance.\n     * @param {string} name The name of the instrumentation library (e.g., 'ui-framework')\n     * @param {string} [version] The version of the instrumentation library.\n     * @returns {Tracer}\n     */\n    getTracer(name, version = '1.0.0') {\n        return new Tracer(this._spanProcessor, this._sampler, { name, version });\n    }\n}","import { set as setConfigValue } from './config';\nimport createTracker from './createTracker';\nimport createMetrics from './createMetrics';\nimport { set as setPage } from './page';\nimport initInteractionsTracker from './initInteractionsTracker';\nimport exporter from './exporter';\nimport {contextManager} from './trace/context';\nimport TracerProvider from './trace/TracerProvider';\nimport { createEventTracer } from './trace/utils/';\nimport {AlwaysOnSampler} from './trace/sampler';\nimport {BatchSpanProcessor} from './trace/processor';\nimport { APP_NAME } from './constants';\n\nexport { setPage as page };\n\nexport default function createAnalyticsApi(apiConfig) {\n\tfor (const k in apiConfig) setConfigValue(k, apiConfig[k]);\n\n\tsetPage();\n\n\tinitInteractionsTracker(exporter);\n\t// trace & trace context bootstrap\n\tconst tracerProvider = new TracerProvider({\n\t\tspanProcessor: new BatchSpanProcessor(exporter),\n\t\tsampler: new AlwaysOnSampler(),\n\t});\n\tconst tracer = tracerProvider.getTracer(APP_NAME);\n\tconst eventTracer = createEventTracer(tracer, contextManager);\n\teventTracer.init();\n\t\n\treturn {\n\t\ttrace: tracer.startSpan.bind(tracer),\n\t\ttracer,\n\t\tcontext: {\n\t\t\tactive: contextManager.active.bind(contextManager),\n\t\t\tbind: contextManager.bind.bind(contextManager),\n\t\t\twith: contextManager.with.bind(contextManager)\n\t\t},\n\t\ttrack: createTracker(exporter),\n\t\tmetrics: createMetrics(exporter),\n\t};\n}\n","import observers from './observers';\n\nexport default function addObserver(observer) {\n\tobservers.add(observer);\n\treturn () => observers.delete(observer);\n}\n","import { get, set } from './queuedEvents';\n\nexport default function getQueuedEvents() {\n\tconst queuedEvents = [...get('events')];\n\n\tset('flushed', true);\n\tset('events', []);\n\n\treturn queuedEvents;\n}\n","import {\n\tcreateAnalyticsApi,\n\tsetUser,\n\tgetUser,\n\tsetPage,\n\tgetPage,\n\tsetConfigValue,\n\tgetConfigValue,\n\tonEvent,\n\tcreateTraceParent,\n\tcreateTraceId,\n\tcreateTraceParentHeader,\n\tgetQueuedEvents,\n\tsetApplication,\n\tgetApplication,\n\tisSpanContextValid,\n\tisValidSpanId,\n\tisValidTraceId,\n} from '@servicenow/ui-analytics-core';\nconst {trace, tracer, context, track, metrics: {createCounter, createGauge, createHistogram}} = createAnalyticsApi();\nexport {tracer};\nexport {trace};\nexport {context};\nexport {track};\nexport {createCounter};\nexport {createGauge};\nexport {createHistogram};\nexport {setUser};\nexport {getUser};\nexport {setPage};\nexport {getPage};\nexport {setConfigValue};\nexport {getConfigValue};\nexport {onEvent};\nexport {createTraceParent};\nexport {createTraceId};\nexport {createTraceParentHeader};\nexport {getQueuedEvents};\nexport {setApplication};\nexport {getApplication};\nexport {isSpanContextValid};\nexport {isValidSpanId};\nexport {isValidTraceId};\n","export const CONTROL_VARIANT = 'control';\n","import { CONTROL_VARIANT } from '../consts';\n\nclass ExperimentationAPIClient {\n\tconstructor() {\n\t\tthis.baseUrl = 'api/sn_experiment_core/experiments/';\n\t}\n\n\tasync getContext(contextParams, configurationContext = null) {\n\t\ttry {\n\t\t\t// Public API now uses experimentKey and fallbackVariantValue directly\n\t\t\tconst requestBody = {\n\t\t\t\texperimentKey: contextParams.experimentKey,\n\t\t\t\tfallbackVariantValue:\n\t\t\t\t\tcontextParams.fallbackVariantValue || CONTROL_VARIANT,\n\t\t\t\tattributes: contextParams.attributes || {},\n\t\t\t};\n\n\t\t\tconst url = `${this.baseUrl}context`;\n\n\t\t\tconst response = await fetch(url, {\n\t\t\t\tmethod: 'POST',\n\t\t\t\tbody: JSON.stringify(requestBody),\n\t\t\t\tcredentials: 'include',\n\t\t\t\theaders: {\n\t\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t\tAccept: 'application/json',\n\t\t\t\t\t'X-UserToken':\n\t\t\t\t\t\ttypeof window !== 'undefined' && window.g_ck\n\t\t\t\t\t\t\t? window.g_ck\n\t\t\t\t\t\t\t: '',\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tif (!response.ok) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`API request failed: ${response.status} ${response.statusText}`\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst data = await response.json();\n\t\t\tconst processedData = this._processContextResponse(\n\t\t\t\tdata.result || data\n\t\t\t);\n\n\t\t\t// Check for error message in response (200 OK but with error)\n\t\t\tif (processedData.errorMessage) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t'ExperimentationAPIClient: Experiment not found or invalid:',\n\t\t\t\t\tprocessedData.errorMessage\n\t\t\t\t);\n\t\t\t\tthrow new Error(processedData.errorMessage);\n\t\t\t}\n\n\t\t\treturn processedData;\n\t\t} catch (error) {\n\t\t\tconsole.error(\n\t\t\t\t'ExperimentationAPIClient: Failed to fetch context',\n\t\t\t\terror\n\t\t\t);\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\t_buildQueryParams(params) {\n\t\tconst searchParams = new URLSearchParams();\n\t\tObject.entries(params || {}).forEach(([key, value]) => {\n\t\t\tif (value === null || value === undefined) return;\n\t\t\tconst isObject = typeof value === 'object';\n\t\t\tsearchParams.set(\n\t\t\t\tkey,\n\t\t\t\tisObject ? JSON.stringify(value) : String(value)\n\t\t\t);\n\t\t});\n\t\treturn searchParams.toString();\n\t}\n\n\t_processContextResponse(data) {\n\t\treturn {\n\t\t\texperimentId: data.experimentId,\n\t\t\tvariant: data.variant,\n\t\t\tvalue: data.value,\n\t\t\ttype: data.type,\n\t\t\tmetrics: data.events ? data.events.split(',') : [],\n\t\t\terrorMessage: data.errorMessage || '',\n\t\t\tattributes: data.attributes || {},\n\t\t};\n\t}\n\n\t_enrichWithConfiguration(configurationContext) {\n\t\tif (\n\t\t\t!configurationContext ||\n\t\t\tconfigurationContext.source === 'fallback'\n\t\t) {\n\t\t\treturn {};\n\t\t}\n\n\t\treturn {\n\t\t\tconfigurationContext: {\n\t\t\t\tclientId: configurationContext.clientId,\n\t\t\t\tinstanceName: configurationContext.instanceName,\n\t\t\t\tglideCookie: configurationContext.glideCookie,\n\t\t\t\tsessionValid: configurationContext.sessionValid,\n\t\t\t\tanalyticsChannel: configurationContext.analyticsChannel,\n\t\t\t\tsessionTiming: configurationContext.sessionTiming,\n\t\t\t\tsource: configurationContext.source,\n\t\t\t},\n\t\t};\n\t}\n}\n\nexport { ExperimentationAPIClient };\n","class CacheManager {\n\tconstructor() {\n\t\tthis.memoryCache = new Map();\n\t\tthis.storageKey = 'sn_exp_cache';\n\t\tthis.defaultTTL = 86400000;\n\t}\n\n\tget(key) {\n\t\tconst memoryCached = this.memoryCache.get(key);\n\t\tif (memoryCached && this._isValid(memoryCached)) {\n\t\t\treturn memoryCached.data;\n\t\t}\n\n\t\ttry {\n\t\t\tif (typeof localStorage === 'undefined') return null;\n\n\t\t\tconst storage = localStorage.getItem(this.storageKey);\n\t\t\tif (storage) {\n\t\t\t\tconst cache = JSON.parse(storage);\n\t\t\t\tconst cached = cache[key];\n\t\t\t\tif (cached && this._isValid(cached)) {\n\t\t\t\t\tthis.memoryCache.set(key, cached);\n\t\t\t\t\treturn cached.data;\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.warn(\n\t\t\t\t'CacheManager: Error reading from localStorage',\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tset(key, data, ttl = this.defaultTTL) {\n\t\tconst cacheEntry = {\n\t\t\tdata: this._cloneData(data),\n\t\t\ttimestamp: Date.now(),\n\t\t\tttl,\n\t\t};\n\n\t\tthis.memoryCache.set(key, cacheEntry);\n\n\t\ttry {\n\t\t\tif (typeof localStorage === 'undefined') return;\n\n\t\t\tconst storage = localStorage.getItem(this.storageKey);\n\t\t\tconst cache = storage ? JSON.parse(storage) : {};\n\t\t\tcache[key] = cacheEntry;\n\n\t\t\tthis._cleanupExpiredEntries(cache);\n\n\t\t\tlocalStorage.setItem(this.storageKey, JSON.stringify(cache));\n\t\t} catch (error) {\n\t\t\tconsole.warn('CacheManager: Error writing to localStorage', error);\n\t\t}\n\t}\n\n\tgenerateKey(contextParams) {\n\t\tconst experimentKey = contextParams.experimentKey;\n\n\t\tconst keyData = {\n\t\t\texperimentKey: experimentKey,\n\t\t\tattributes: contextParams.attributes || {},\n\t\t};\n\n\t\tconst str = JSON.stringify(keyData);\n\t\tlet hash = 0;\n\t\tfor (let i = 0; i < str.length; i++) {\n\t\t\tconst char = str.charCodeAt(i);\n\t\t\thash = (hash << 5) - hash + char;\n\t\t\thash = hash & hash;\n\t\t}\n\n\t\treturn `${experimentKey}_${Math.abs(hash)}`;\n\t}\n\n\tgetAllCachedExperiments() {\n\t\tconst experiments = [];\n\n\t\ttry {\n\t\t\tif (typeof localStorage === 'undefined') {\n\t\t\t\treturn experiments;\n\t\t\t}\n\n\t\t\tconst storage = localStorage.getItem(this.storageKey);\n\t\t\tif (!storage) {\n\t\t\t\treturn experiments;\n\t\t\t}\n\n\t\t\tconst cache = JSON.parse(storage);\n\t\t\tfor (const key in cache) {\n\t\t\t\tconst entry = cache[key];\n\t\t\t\tconst isValid = entry && this._isValid(entry);\n\t\t\t\tif (isValid) {\n\t\t\t\t\texperiments.push(entry.data);\n\t\t\t\t\t// Also sync to memory cache\n\t\t\t\t\tthis.memoryCache.set(key, entry);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.warn(\n\t\t\t\t'CacheManager: Error reading all cached experiments',\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\n\t\treturn experiments;\n\t}\n\n\tclear() {\n\t\tthis.memoryCache.clear();\n\t\ttry {\n\t\t\tif (typeof localStorage !== 'undefined') {\n\t\t\t\tlocalStorage.removeItem(this.storageKey);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.warn('CacheManager: Error clearing localStorage', error);\n\t\t}\n\t}\n\n\tclearExpired() {\n\t\tfor (const [key, entry] of this.memoryCache.entries()) {\n\t\t\tif (!this._isValid(entry)) {\n\t\t\t\tthis.memoryCache.delete(key);\n\t\t\t}\n\t\t}\n\n\t\ttry {\n\t\t\tif (typeof localStorage === 'undefined') return;\n\n\t\t\tconst storage = localStorage.getItem(this.storageKey);\n\t\t\tif (storage) {\n\t\t\t\tconst cache = JSON.parse(storage);\n\t\t\t\tthis._cleanupExpiredEntries(cache);\n\t\t\t\tlocalStorage.setItem(this.storageKey, JSON.stringify(cache));\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.warn('CacheManager: Error clearing expired entries', error);\n\t\t}\n\t}\n\n\t_isValid(entry) {\n\t\treturn Date.now() - entry.timestamp < entry.ttl;\n\t}\n\n\t_cleanupExpiredEntries(cache) {\n\t\tfor (const key in cache) {\n\t\t\tif (!this._isValid(cache[key])) {\n\t\t\t\tdelete cache[key];\n\t\t\t}\n\t\t}\n\t}\n\n\t_cloneData(data) {\n\t\tif (data === null || typeof data !== 'object') {\n\t\t\treturn data;\n\t\t}\n\n\t\tconst clone = { ...data };\n\t\tif (Array.isArray(clone.experiments)) {\n\t\t\tclone.experiments = clone.experiments.map((exp) =>\n\t\t\t\texp && typeof exp === 'object' ? { ...exp } : exp\n\t\t\t);\n\t\t}\n\t\tif (clone.attributes && typeof clone.attributes === 'object') {\n\t\t\tclone.attributes = { ...clone.attributes };\n\t\t}\n\t\tif (clone.metadata && typeof clone.metadata === 'object') {\n\t\t\tclone.metadata = { ...clone.metadata };\n\t\t}\n\t\treturn clone;\n\t}\n\n\tgetStats() {\n\t\tlet localStorageEntries = 0;\n\t\ttry {\n\t\t\tif (typeof localStorage !== 'undefined') {\n\t\t\t\tconst storage = localStorage.getItem(this.storageKey);\n\t\t\t\tif (storage) {\n\t\t\t\t\tconst cache = JSON.parse(storage);\n\t\t\t\t\tlocalStorageEntries = Object.keys(cache).length;\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {}\n\n\t\treturn {\n\t\t\tmemoryEntries: this.memoryCache.size,\n\t\t\tlocalStorageEntries,\n\t\t\tdefaultTTL: this.defaultTTL,\n\t\t\tdefaultTTLHours: this.defaultTTL / 3600000,\n\t\t};\n\t}\n}\n\nexport { CacheManager };\n","import { CONTROL_VARIANT } from '../consts';\n\nconst EVENT_PREFIX = 'sn_exp';\n\nclass ExperimentsStore {\n\tconstructor() {\n\t\tthis._experiments = new Map();\n\t}\n\n\tupsertFromContext(context) {\n\t\tif (!context) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst experiments = Array.isArray(context.experiments)\n\t\t\t? context.experiments\n\t\t\t: [context];\n\n\t\texperiments.forEach((experiment) => {\n\t\t\tconst normalized = this._normalizeExperiment(experiment, context);\n\t\t\tif (!normalized) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis._experiments.set(normalized.key, normalized);\n\t\t});\n\t}\n\n\tclear() {\n\t\tthis._experiments.clear();\n\t}\n\n\tgetAll() {\n\t\tconst result = {};\n\t\tfor (const [key, value] of this._experiments.entries()) {\n\t\t\tresult[key] = this._publicShape(value);\n\t\t}\n\t\treturn result;\n\t}\n\n\tgetList() {\n\t\treturn Array.from(this._experiments.values(), (value) =>\n\t\t\tthis._publicShape(value)\n\t\t);\n\t}\n\n\tgetEventMap() {\n\t\tconst eventMap = {};\n\t\tfor (const experiment of this._experiments.values()) {\n\t\t\tconst identifier = experiment.experimentId;\n\t\t\tif (identifier) {\n\t\t\t\teventMap[identifier] = this._deriveEventNames(experiment);\n\t\t\t}\n\t\t}\n\t\treturn eventMap;\n\t}\n\n\t_normalizeExperiment(experiment, fallbackContext = {}) {\n\t\tif (!experiment || typeof experiment !== 'object') {\n\t\t\treturn null;\n\t\t}\n\n\t\t// Merge experiment and fallback context\n\t\tconst merged = { ...fallbackContext, ...experiment };\n\n\t\tconst experimentId = merged.experimentId ?? null;\n\n\t\t// Accept experimentKey from input\n\t\tconst experimentKey = merged.experimentKey ?? null;\n\n\t\t// Primary field is now value, variant is for backward compatibility\n\t\tconst value = merged.value ?? merged.variant ?? CONTROL_VARIANT;\n\n\t\tconst key = this._buildKey({\n\t\t\texperimentId: experimentId,\n\t\t\tvalue: value,\n\t\t});\n\t\tif (!key) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// Flat structure - same keys as cache/API\n\t\treturn {\n\t\t\tkey,\n\t\t\texperimentId: experimentId,\n\t\t\texperimentKey,\n\t\t\tvalue: value,\n\t\t\tvariant: value, // Backward compatibility alias\n\t\t\ttype: merged.type ?? null,\n\t\t\tmetrics: merged.metrics ?? [],\n\t\t\terrorMessage: merged.errorMessage ?? '',\n\t\t\tattributes: merged.attributes ?? {},\n\t\t};\n\t}\n\n\t_buildKey({ experimentId, value }) {\n\t\tconst identifier = experimentId;\n\t\tif (!identifier) {\n\t\t\treturn null;\n\t\t}\n\t\treturn `${identifier}::${value}`;\n\t}\n\n\t_deriveEventNames(experiment) {\n\t\tconst names = new Set();\n\n\t\tconst metrics = experiment.metrics;\n\t\tif (Array.isArray(metrics)) {\n\t\t\tmetrics\n\t\t\t\t.map((metric) => String(metric).trim())\n\t\t\t\t.filter(Boolean)\n\t\t\t\t.forEach((metric) => names.add(metric));\n\t\t}\n\n\t\tif (experiment.eventName) {\n\t\t\tnames.add(experiment.eventName);\n\t\t}\n\n\t\t// Add event names for both experimentKey and experimentId\n\t\tif (experiment.experimentKey) {\n\t\t\tnames.add(`${EVENT_PREFIX}_${experiment.experimentKey}`);\n\t\t}\n\t\tif (experiment.experimentId) {\n\t\t\tnames.add(`${EVENT_PREFIX}_${experiment.experimentId}`);\n\t\t}\n\n\t\treturn Array.from(names);\n\t}\n\n\t_publicShape(experiment) {\n\t\t// Already flat, return as-is\n\t\treturn experiment;\n\t}\n}\n\nconst experimentsStore = new ExperimentsStore();\n\nexport { ExperimentsStore, experimentsStore };\n","import { CONTROL_VARIANT } from '../consts.js';\nimport { ExperimentationAPIClient } from './api-client.js';\nimport { CacheManager } from './cache-manager.js';\nimport { experimentsStore as defaultExperimentsStore } from './experiments-store.js';\n\nclass ContextManager {\n\tconstructor(config = {}) {\n\t\tconst {\n\t\t\tapiClient = new ExperimentationAPIClient(),\n\t\t\tcacheManager = new CacheManager(),\n\t\t\texperimentsStore = defaultExperimentsStore,\n\t\t\tdefaultOptions = {},\n\t\t} = config;\n\n\t\tthis.apiClient = apiClient;\n\t\tthis.cacheManager = cacheManager;\n\t\tthis.experimentsStore = experimentsStore;\n\t\tthis.options = {\n\t\t\tenableCaching: true,\n\t\t\tcacheTTL: this.cacheManager.defaultTTL,\n\t\t\tretryAttempts: 1,\n\t\t\tretryDelay: 750,\n\t\t\t...defaultOptions,\n\t\t};\n\n\t\t// Hydrate experimentsStore from cache on initialization\n\t\tthis._hydrateFromCache();\n\t}\n\n\t_hydrateFromCache() {\n\t\ttry {\n\t\t\tconst allCachedExperiments =\n\t\t\t\tthis.cacheManager.getAllCachedExperiments();\n\t\t\tallCachedExperiments.forEach((experiment) => {\n\t\t\t\tthis.experimentsStore.upsertFromContext(experiment);\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tconsole.warn(\n\t\t\t\t'[ContextManager] Failed to hydrate from cache',\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\tsetOptions(options = {}) {\n\t\tthis.options = { ...this.options, ...options };\n\t}\n\n\tasync getContext(params, options = {}) {\n\t\tconst contextParams = this._normalizeParams(params);\n\t\tthis._validateParams(contextParams);\n\n\t\tconst requestOptions = { ...this.options, ...options };\n\t\tconst cacheKey = this.cacheManager.generateKey(contextParams);\n\n\t\tif (requestOptions.enableCaching) {\n\t\t\tconst cached = this.cacheManager.get(cacheKey);\n\t\t\tif (cached) {\n\t\t\t\tthis.experimentsStore.upsertFromContext(cached);\n\t\t\t\treturn cached;\n\t\t\t}\n\t\t}\n\n\t\tconst context = await this._fetchWithRetry(\n\t\t\tcontextParams,\n\t\t\trequestOptions\n\t\t);\n\t\tconst enriched = this._enrichContext(context, contextParams);\n\n\t\tthis.experimentsStore.upsertFromContext(enriched);\n\n\t\tif (requestOptions.enableCaching) {\n\t\t\t// Use configured TTL - timestamp/ttl are cache metadata, not experiment data\n\t\t\tthis.cacheManager.set(cacheKey, enriched, requestOptions.cacheTTL);\n\t\t}\n\n\t\treturn enriched;\n\t}\n\n\tclearCache() {\n\t\tthis.cacheManager.clear();\n\t}\n\n\tclearExperiments() {\n\t\tthis.experimentsStore.clear();\n\t}\n\n\tgetExperiments() {\n\t\treturn this.experimentsStore.getAll();\n\t}\n\n\tgetExperimentList() {\n\t\treturn this.experimentsStore.getList();\n\t}\n\n\tgetExperimentEventMap() {\n\t\treturn this.experimentsStore.getEventMap();\n\t}\n\n\tgetOptions() {\n\t\treturn { ...this.options };\n\t}\n\n\tgetStats() {\n\t\tconst experiments = this.experimentsStore.getList();\n\t\treturn {\n\t\t\texperiments: {\n\t\t\t\tcount: experiments.length,\n\t\t\t\teventMap: this.experimentsStore.getEventMap(),\n\t\t\t},\n\t\t\tcache: this.cacheManager.getStats(),\n\t\t};\n\t}\n\n\t_normalizeParams(params) {\n\t\tif (typeof params === 'string') {\n\t\t\treturn {\n\t\t\t\texperimentKey: params,\n\t\t\t\tfallbackVariantValue: CONTROL_VARIANT,\n\t\t\t\tattributes: {},\n\t\t\t};\n\t\t}\n\n\t\tconst experimentKey = params.experimentKey ?? null;\n\n\t\treturn {\n\t\t\texperimentKey,\n\t\t\tfallbackVariantValue:\n\t\t\t\tparams.fallbackVariantValue ?? CONTROL_VARIANT,\n\t\t\tattributes: { ...(params.attributes || {}) },\n\t\t};\n\t}\n\n\t_validateParams(params) {\n\t\tif (!params.experimentKey || typeof params.experimentKey !== 'string') {\n\t\t\tthrow new Error('experimentKey is required');\n\t\t}\n\t}\n\n\t_enrichContext(context, params) {\n\t\treturn {\n\t\t\t...context,\n\t\t\texperimentKey: params.experimentKey,\n\t\t\tattributes: {\n\t\t\t\t...(context.attributes || {}),\n\t\t\t\t...(params.attributes || {}),\n\t\t\t},\n\t\t};\n\t}\n\n\tasync _fetchWithRetry(params, options) {\n\t\tlet lastError;\n\n\t\tfor (let attempt = 0; attempt <= options.retryAttempts; attempt++) {\n\t\t\ttry {\n\t\t\t\treturn await this.apiClient.getContext(params);\n\t\t\t} catch (error) {\n\t\t\t\tlastError = error;\n\n\t\t\t\tif (attempt < options.retryAttempts) {\n\t\t\t\t\tawait new Promise((resolve) =>\n\t\t\t\t\t\tsetTimeout(resolve, options.retryDelay * (attempt + 1))\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthrow lastError;\n\t}\n}\n\nexport { ContextManager };\n","import { ContextManager } from './modules/context-manager.js';\nimport { experimentsStore as defaultExperimentsStore } from './modules/experiments-store.js';\n\nclass ExperimentationSDK {\n\tconstructor({\n\t\tcontextManager = new ContextManager(),\n\t\texperimentsStore = defaultExperimentsStore,\n\t} = {}) {\n\t\tthis.contextManager = contextManager;\n\t\tthis.experimentsStore = experimentsStore;\n\t\tthis.version = '1.0.0';\n\t\tthis.initialized = false;\n\t\tthis.initPromise = null;\n\t\tthis.config = {};\n\n\t\tthis.initialize = this.initialize.bind(this);\n\t\tthis.getContext = this.getContext.bind(this);\n\t\tthis.clearCache = this.clearCache.bind(this);\n\t\tthis.clearExperiments = this.clearExperiments.bind(this);\n\t\tthis.getExperiments = this.getExperiments.bind(this);\n\t\tthis.getExperimentList = this.getExperimentList.bind(this);\n\t\tthis.getExperimentEventMap = this.getExperimentEventMap.bind(this);\n\t\tthis.getStats = this.getStats.bind(this);\n\t}\n\n\tasync initialize(config = {}) {\n\t\tif (this.initialized) {\n\t\t\treturn this;\n\t\t}\n\n\t\tif (this.initPromise) {\n\t\t\treturn this.initPromise;\n\t\t}\n\n\t\tthis.initPromise = this._performInitialization(config);\n\t\treturn this.initPromise;\n\t}\n\n\tasync getContext(params, options = {}) {\n\t\tawait this._ensureInitialized();\n\t\treturn this.contextManager.getContext(params, options);\n\t}\n\n\tclearCache() {\n\t\tthis.contextManager.clearCache();\n\t}\n\n\tclearExperiments() {\n\t\tthis.contextManager.clearExperiments();\n\t}\n\n\tgetExperiments() {\n\t\treturn this.experimentsStore.getAll();\n\t}\n\n\tgetExperimentList() {\n\t\treturn this.experimentsStore.getList();\n\t}\n\n\tgetExperimentEventMap() {\n\t\treturn this.experimentsStore.getEventMap();\n\t}\n\n\tgetStats() {\n\t\tconst { cache } = this.contextManager.getStats();\n\t\tconst experimentList = this.experimentsStore.getList();\n\t\tconst eventMap = this.experimentsStore.getEventMap();\n\n\t\t// Extract unique event names from all experiments\n\t\tconst eventNamesSet = new Set();\n\t\tObject.values(eventMap).forEach((events) => {\n\t\t\tevents.forEach((event) => eventNamesSet.add(event));\n\t\t});\n\t\tconst eventNames = Array.from(eventNamesSet);\n\n\t\treturn {\n\t\t\tversion: this.version,\n\t\t\tinitialized: this.initialized,\n\t\t\toptions: this.contextManager.getOptions(),\n\t\t\texperiments: {\n\t\t\t\tcount: experimentList.length,\n\t\t\t\teventMap,\n\t\t\t\teventNames,\n\t\t\t\tlist: experimentList,\n\t\t\t},\n\t\t\tcache,\n\t\t};\n\t}\n\n\tasync _performInitialization(config = {}) {\n\t\ttry {\n\t\t\tconst mergedOptions = this._extractContextOptions(config);\n\t\t\tif (Object.keys(mergedOptions).length > 0) {\n\t\t\t\tthis.contextManager.setOptions(mergedOptions);\n\t\t\t}\n\n\t\t\tthis.config = config;\n\t\t\tthis.initialized = true;\n\t\t\treturn this;\n\t\t} catch (error) {\n\t\t\tconsole.error('ExperimentationSDK: Initialization failed', error);\n\t\t\tthis.initialized = false;\n\t\t\tthis.initPromise = null;\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tasync _ensureInitialized() {\n\t\tif (!this.initialized) {\n\t\t\tawait this.initialize();\n\t\t}\n\t}\n\n\t_extractContextOptions(config) {\n\t\tif (!config || typeof config !== 'object') {\n\t\t\treturn {};\n\t\t}\n\n\t\tconst { contextOptions = {}, ...legacyOptions } = config;\n\t\treturn {\n\t\t\t...legacyOptions,\n\t\t\t...(typeof contextOptions === 'object' ? contextOptions : {}),\n\t\t};\n\t}\n}\n\nconst sdkInstance = new ExperimentationSDK();\n\nsdkInstance.initialize().catch((error) => {\n\tconsole.error('ExperimentationSDK: Auto-initialization failed', error);\n});\n\nexport { ExperimentationSDK, sdkInstance };\n","import { ExperimentationSDK, sdkInstance } from './experimentation-sdk.js';\nimport { experimentsStore } from './modules/experiments-store.js';\n\n/**\n * Initialize the Experimentation SDK with optional configuration\n * @param {Object} config - Configuration options\n * @returns {Promise<ExperimentationSDK>} Initialized SDK instance\n */\nexport async function init(config = {}) {\n\tif (typeof window !== 'undefined' && !window.sn_exp) {\n\t\t// window.sn_exp will be defined by exposeNamespace()\n\t\tconsole.warn('ExperimentationSDK: window.sn_exp not yet initialized');\n\t}\n\n\tconst sdk = await sdkInstance.initialize(config);\n\treturn sdk;\n}\n\n/**\n * Get experiment context for a feature flag\n * @param {Object|string} params - Feature flag name or params object with exp_param_name\n * @param {Object} options - Optional request options\n * @returns {Promise<Object>} Experiment context with variant and metrics\n */\nexport async function getContext(params, options = {}) {\n\treturn sdkInstance.getContext(params, options);\n}\n\n/**\n * Get all active experiments\n * @returns {Array<Object>} List of active experiments\n */\nexport function getExperimentList() {\n\treturn sdkInstance.getExperimentList();\n}\n\n/**\n * Get SDK statistics and status\n * @returns {Object} SDK stats including cache, experiments, and config\n */\nexport function getStats() {\n\treturn sdkInstance.getStats();\n}\n\n/**\n * Clear experiment cache\n */\nexport function clearCache() {\n\tsdkInstance.clearCache();\n}\n\nfunction exposeNamespace() {\n\tif (typeof window === 'undefined') {\n\t\treturn;\n\t}\n\n\t// Check if window.sn_exp is already defined\n\tif (window.sn_exp) {\n\t\tconsole.warn(\n\t\t\t'ExperimentationSDK: window.sn_exp is already defined and cannot be overwritten'\n\t\t);\n\t\treturn;\n\t}\n\n\t// Create SDK namespace object\n\tconst namespace = Object.create(sdkInstance);\n\tnamespace.init = init;\n\tnamespace.getContext = sdkInstance.getContext;\n\tnamespace.clearCache = sdkInstance.clearCache;\n\tnamespace.clearExperiments = sdkInstance.clearExperiments;\n\tnamespace.getExperiments = sdkInstance.getExperiments;\n\tnamespace.getExperimentList = sdkInstance.getExperimentList;\n\tnamespace.getExperimentEventMap = sdkInstance.getExperimentEventMap;\n\tnamespace.getStats = sdkInstance.getStats;\n\n\t// Define window.sn_exp as non-writable and non-configurable\n\tObject.defineProperty(window, 'sn_exp', {\n\t\tvalue: namespace,\n\t\twritable: false,\n\t\tconfigurable: false,\n\t\tenumerable: true,\n\t});\n}\n\nexposeNamespace();\n\nsdkInstance.initialize().catch((error) => {\n\tconsole.error('ExperimentationSDK: Auto-initialization failed', error);\n});\n\nexport {\n\tExperimentationSDK,\n\tsdkInstance as experimentationSDK,\n\texperimentsStore,\n};\n\nexport { ContextManager } from './modules/context-manager.js';\nexport { ExperimentationAPIClient } from './modules/api-client.js';\nexport { CacheManager } from './modules/cache-manager.js';\n","// Shared cache utility for selector operations with LRU management\n\nclass SelectorCache {\n\tconstructor(sizeLimit = 500) {\n\t\tthis.cache = new Map();\n\t\tthis.accessOrder = new Map(); // Tracks last access time for LRU eviction\n\t\tthis.sizeLimit = sizeLimit;\n\t\tthis.uniqueMatchCache = new Map(); // For caching matches between two selectors\n\t\tthis.uniqueAccessOrder = new Map(); // Tracks access times for unique match cache\n\t}\n\n\t// Get elements for a selector from cache\n\tgetElements(selectorKey) {\n\t\tconst result = this.cache.get(selectorKey);\n\t\tif (result !== undefined) {\n\t\t\t// Update access time for LRU tracking\n\t\t\tthis.accessOrder.set(selectorKey, Date.now());\n\t\t}\n\t\treturn result;\n\t}\n\n\t// Check if selector is in the elements cache\n\thasElements(selectorKey) {\n\t\treturn this.cache.has(selectorKey);\n\t}\n\n\t// Store elements for a selector\n\tsetElements(selectorKey, elements) {\n\t\tthis.cache.set(selectorKey, elements);\n\t\tthis.accessOrder.set(selectorKey, Date.now());\n\t\tthis.trimLRU();\n\t}\n\n\t// Check if a selector uniquely identifies one element\n\tisUnique(selectorKey) {\n\t\tif (!this.hasElements(selectorKey)) {\n\t\t\treturn undefined;\n\t\t}\n\t\tconst elements = this.getElements(selectorKey);\n\t\treturn elements !== null && elements.length === 1;\n\t}\n\n\t// Cache a match between two selectors\n\tsetUniqueMatch(cacheKey, isMatch) {\n\t\tthis.uniqueMatchCache.set(cacheKey, isMatch);\n\t\tthis.uniqueAccessOrder.set(cacheKey, Date.now());\n\t\tthis.trimUniqueLRU();\n\t}\n\n\t// Get cached match between two selectors\n\tgetUniqueMatch(cacheKey) {\n\t\tconst result = this.uniqueMatchCache.get(cacheKey);\n\t\tif (result !== undefined) {\n\t\t\t// Update access time for LRU tracking\n\t\t\tthis.uniqueAccessOrder.set(cacheKey, Date.now());\n\t\t}\n\t\treturn result;\n\t}\n\n\t// Check if cached match exists between selectors\n\thasUniqueMatch(cacheKey) {\n\t\treturn this.uniqueMatchCache.has(cacheKey);\n\t}\n\n\t// Trim the main cache using LRU policy\n\ttrimLRU() {\n\t\tif (this.cache.size > this.sizeLimit) {\n\t\t\t// Sort keys by access time (oldest first)\n\t\t\tconst sortedEntries = Array.from(this.accessOrder.entries())\n\t\t\t\t.sort((a, b) => a[1] - b[1]) // Sort by timestamp (ascending)\n\t\t\t\t.map((entry) => entry[0]); // Extract keys\n\n\t\t\t// Remove approximately 20% of least recently used entries\n\t\t\tconst deleteCount = Math.floor(this.sizeLimit * 0.2);\n\t\t\tconst keysToDelete = sortedEntries.slice(0, deleteCount);\n\n\t\t\t// Delete from both cache and access tracker\n\t\t\tkeysToDelete.forEach((key) => {\n\t\t\t\tthis.cache.delete(key);\n\t\t\t\tthis.accessOrder.delete(key);\n\t\t\t});\n\t\t}\n\t}\n\n\t// Trim the unique match cache using LRU policy\n\ttrimUniqueLRU() {\n\t\tif (this.uniqueMatchCache.size > this.sizeLimit) {\n\t\t\t// Sort keys by access time (oldest first)\n\t\t\tconst sortedEntries = Array.from(this.uniqueAccessOrder.entries())\n\t\t\t\t.sort((a, b) => a[1] - b[1]) // Sort by timestamp (ascending)\n\t\t\t\t.map((entry) => entry[0]); // Extract keys\n\n\t\t\t// Remove approximately 20% of least recently used entries\n\t\t\tconst deleteCount = Math.floor(this.sizeLimit * 0.2);\n\t\t\tconst keysToDelete = sortedEntries.slice(0, deleteCount);\n\n\t\t\t// Delete from both cache and access tracker\n\t\t\tkeysToDelete.forEach((key) => {\n\t\t\t\tthis.uniqueMatchCache.delete(key);\n\t\t\t\tthis.uniqueAccessOrder.delete(key);\n\t\t\t});\n\t\t}\n\t}\n}\n\n// Create a single shared instance for all selector operations\nexport const selectorCache = new SelectorCache(500);\n","import { normalizeSelector } from './normalize';\n\n/**\n* Finds first matching elements on the page that may be in a shadow root using a complex selector of n-depth\n*\n* Don't have to specify all shadow roots to button, tree is travered to find the correct element\n*\n* Example querySelectorAllDeep('downloads-item:nth-child(4) #remove');\n*\n* Example should work on chrome://downloads outputting the remove button inside of a download card component\n*\n* Example find first active download link element querySelectorDeep('#downloads-list .is-active a[href^=\"https://\"]');\n*\n* Another example querySelectorAllDeep('#downloads-list div#title-area + a');\ne.g.\n*/\nexport function querySelectorAllDeep(selector, root = document, allElements = null) {\n    return _querySelectorDeep(selector, true, root, allElements);\n}\n\nexport function querySelectorDeep(selector, root = document, allElements = null) {\n    return _querySelectorDeep(selector, false, root, allElements);\n}\n\nfunction _querySelectorDeep(selector, findMany, root, allElements = null) {\n    selector = normalizeSelector(selector);\n    let lightElement = root.querySelector(selector);\n\n    if (document.head.createShadowRoot || document.head.attachShadow) {\n        // no need to do any special if selector matches something specific in light-dom\n        if (!findMany && lightElement) {\n            return lightElement;\n        }\n\n        // split on commas because those are a logical divide in the operation\n        const selectionsToMake = splitByCharacterUnlessQuoted(selector, ',');\n\n        return selectionsToMake.reduce((acc, minimalSelector) => {\n            // if not finding many just reduce the first match\n            if (!findMany && acc) {\n                return acc;\n            }\n            // do best to support complex selectors and split the query\n            const splitSelector = splitByCharacterUnlessQuoted(minimalSelector\n                    //remove white space at start of selector\n                    .replace(/^\\s+/g, '')\n                    .replace(/\\s*([>+~]+)\\s*/g, '$1'), ' ')\n                    // filter out entry white selectors\n                    .filter((entry) => !!entry)\n                    // convert \"a > b\" to [\"a\", \"b\"]\n                    .map((entry) => splitByCharacterUnlessQuoted(entry, '>'));\n\n            const possibleElementsIndex = splitSelector.length - 1;\n            const lastSplitPart = splitSelector[possibleElementsIndex][splitSelector[possibleElementsIndex].length - 1];\n            const possibleElements = collectAllElementsDeep(lastSplitPart, root, allElements);\n            const findElements = findMatchingElement(splitSelector, possibleElementsIndex, root);\n            if (findMany) {\n                acc = acc.concat(possibleElements.filter(findElements));\n                return acc;\n            } else {\n                acc = possibleElements.find(findElements);\n                return acc || null;\n            }\n        }, findMany ? [] : null);\n\n\n    } else {\n        if (!findMany) {\n            return lightElement;\n        } else {\n            return root.querySelectorAll(selector);\n        }\n    }\n\n}\n\nfunction findMatchingElement(splitSelector, possibleElementsIndex, root) {\n    return (element) => {\n        let position = possibleElementsIndex;\n        let parent = element;\n        let foundElement = false;\n        while (parent && !isDocumentNode(parent)) {\n            let foundMatch = true;\n            if (splitSelector[position].length === 1) {\n                foundMatch = parent.matches(splitSelector[position]);\n            } else {\n                // selector is in the format \"a > b\"\n                // make sure a few parents match in order\n                const reversedParts = ([]).concat(splitSelector[position]).reverse();\n                let newParent = parent;\n                for (const part of reversedParts) {\n                    if (!newParent || !newParent.matches(part)) {\n                        foundMatch = false;\n                        break;\n                    }\n                    newParent = findParentOrHost(newParent, root);\n                }\n            }\n\n            if (foundMatch && position === 0) {\n                foundElement = true;\n                break;\n            }\n            if (foundMatch) {\n                position--;\n            }\n            parent = findParentOrHost(parent, root);\n        }\n        return foundElement;\n    };\n\n}\n\nfunction splitByCharacterUnlessQuoted(selector, character) {\n    return selector.match(/\\\\?.|^$/g).reduce((p, c) => {\n        if (c === '\"' && !p.sQuote) {\n            p.quote ^= 1;\n            p.a[p.a.length - 1] += c;\n        } else if (c === '\\'' && !p.quote) {\n            p.sQuote ^= 1;\n            p.a[p.a.length - 1] += c;\n\n        } else if (!p.quote && !p.sQuote && c === character) {\n            p.a.push('');\n        } else {\n            p.a[p.a.length - 1] += c;\n        }\n        return p;\n    }, { a: [''] }).a;\n}\n\n/**\n * Checks if the node is a document node or not.\n * @param {Node} node\n * @returns {node is Document | DocumentFragment}\n */\nfunction isDocumentNode(node) {\n    return node.nodeType === Node.DOCUMENT_FRAGMENT_NODE || node.nodeType === Node.DOCUMENT_NODE;\n}\n\nfunction findParentOrHost(element, root) {\n    const parentNode = element.parentNode;\n    return (parentNode && parentNode.host && parentNode.nodeType === 11) ? parentNode.host : parentNode === root ? null : parentNode;\n}\n\n/**\n * Finds all elements on the page, inclusive of those within shadow roots.\n * @param {string=} selector Simple selector to filter the elements by. e.g. 'a', 'div.main'\n * @return {!Array<string>} List of anchor hrefs.\n * @author ebidel@ (Eric Bidelman)\n * License Apache-2.0\n */\nexport function collectAllElementsDeep(selector = null, root, cachedElements = null) {\n    let allElements = [];\n\n    if (cachedElements) {\n        allElements = cachedElements;\n    } else {\n        const findAllElements = function(nodes) {\n            for (let i = 0; i < nodes.length; i++) {\n                const el = nodes[i];\n                allElements.push(el);\n                // If the element has a shadow root, dig deeper.\n                if (el.shadowRoot) {\n                    findAllElements(el.shadowRoot.querySelectorAll('*'));\n                }\n            }\n        };\n        if(root.shadowRoot) {\n            findAllElements(root.shadowRoot.querySelectorAll('*'));\n        }\n        findAllElements(root.querySelectorAll('*'));\n    }\n\n    return selector ? allElements.filter(el => el.matches(selector)) : allElements;\t}\n\n","/* istanbul ignore file */\n\n\n// normalize-selector-rev-02.js\n/*\n  author: kyle simpson (@getify)\n  original source: https://gist.github.com/getify/9679380\n\n  modified for tests by david kaye (@dfkaye)\n  21 march 2014\n\n  rev-02 incorporate kyle's changes 3/2/42014\n*/\n\nexport function normalizeSelector(sel) {\n  // save unmatched text, if any\n  function saveUnmatched() {\n    if (unmatched) {\n      // whitespace needed after combinator?\n      if (tokens.length > 0 && /^[~+>]$/.test(tokens[tokens.length - 1])) {\n        tokens.push(\" \");\n      }\n\n      // save unmatched text\n      tokens.push(unmatched);\n    }\n  }\n\n  var tokens = [],\n    match,\n    unmatched,\n    regex,\n    state = [0],\n    next_match_idx = 0,\n    prev_match_idx,\n    not_escaped_pattern = /(?:[^\\\\]|(?:^|[^\\\\])(?:\\\\\\\\)+)$/,\n    whitespace_pattern = /^\\s+$/,\n    state_patterns = [\n      /\\s+|\\/\\*|[\"'>~+[(]/g, // general\n      /\\s+|\\/\\*|[\"'[\\]()]/g, // [..] set\n      /\\s+|\\/\\*|[\"'[\\]()]/g, // (..) set\n      null, // string literal (placeholder)\n      /\\*\\//g, // comment\n    ];\n  sel = sel.trim();\n\n  // eslint-disable-next-line no-constant-condition\n  while (true) {\n    unmatched = \"\";\n\n    regex = state_patterns[state[state.length - 1]];\n\n    regex.lastIndex = next_match_idx;\n    match = regex.exec(sel);\n\n    // matched text to process?\n    if (match) {\n      prev_match_idx = next_match_idx;\n      next_match_idx = regex.lastIndex;\n\n      // collect the previous string chunk not matched before this token\n      if (prev_match_idx < next_match_idx - match[0].length) {\n        unmatched = sel.substring(\n          prev_match_idx,\n          next_match_idx - match[0].length\n        );\n      }\n\n      // general, [ ] pair, ( ) pair?\n      if (state[state.length - 1] < 3) {\n        saveUnmatched();\n\n        // starting a [ ] pair?\n        if (match[0] === \"[\") {\n          state.push(1);\n        }\n        // starting a ( ) pair?\n        else if (match[0] === \"(\") {\n          state.push(2);\n        }\n        // starting a string literal?\n        else if (/^[\"']$/.test(match[0])) {\n          state.push(3);\n          state_patterns[3] = new RegExp(match[0], \"g\");\n        }\n        // starting a comment?\n        else if (match[0] === \"/*\") {\n          state.push(4);\n        }\n        // ending a [ ] or ( ) pair?\n        else if (/^[\\])]$/.test(match[0]) && state.length > 0) {\n          state.pop();\n        }\n        // handling whitespace or a combinator?\n        else if (/^(?:\\s+|[~+>])$/.test(match[0])) {\n          // need to insert whitespace before?\n          if (\n            tokens.length > 0 &&\n            !whitespace_pattern.test(tokens[tokens.length - 1]) &&\n            state[state.length - 1] === 0\n          ) {\n            // add normalized whitespace\n            tokens.push(\" \");\n          }\n\n          // case-insensitive attribute selector CSS L4\n          if (\n            state[state.length - 1] === 1 &&\n            tokens.length === 5 &&\n            tokens[2].charAt(tokens[2].length - 1) === \"=\"\n          ) {\n            tokens[4] = \" \" + tokens[4];\n          }\n\n          // whitespace token we can skip?\n          if (whitespace_pattern.test(match[0])) {\n            continue;\n          }\n        }\n\n        // save matched text\n        tokens.push(match[0]);\n      }\n      // otherwise, string literal or comment\n      else {\n        // save unmatched text\n        tokens[tokens.length - 1] += unmatched;\n\n        // unescaped terminator to string literal or comment?\n        if (not_escaped_pattern.test(tokens[tokens.length - 1])) {\n          // comment terminator?\n          if (state[state.length - 1] === 4) {\n            // ok to drop comment?\n            if (\n              tokens.length < 2 ||\n              whitespace_pattern.test(tokens[tokens.length - 2])\n            ) {\n              tokens.pop();\n            }\n            // otherwise, turn comment into whitespace\n            else {\n              tokens[tokens.length - 1] = \" \";\n            }\n\n            // handled already\n            match[0] = \"\";\n          }\n\n          state.pop();\n        }\n\n        // append matched text to existing token\n        tokens[tokens.length - 1] += match[0];\n      }\n    }\n    // otherwise, end of processing (no more matches)\n    else {\n      unmatched = sel.substr(next_match_idx);\n      saveUnmatched();\n\n      break;\n    }\n  }\n\n  return tokens.join(\"\").trim();\n}\n","import { selectorCache } from './cache-utility.js';\nimport { querySelectorAllDeep } from 'query-selector-shadow-dom';\n\n// Constants\nconst REQUIRED_ATTRIBUTES = ['id', 'data-id', 'data-itemid', 'data-testid'];\nconst UXF_ATTRIBUTES = [\n\t'macroponent-id',\n\t'instance-id',\n\t'component-id',\n\t'component-name',\n];\n\n// Space is the shadow DOM combinator for query-selector-shadow-dom\nconst SHADOW_DOM_COMBINATOR = ' ';\n\n/**\n * Extract meaningful parts from a component ID\n * @param {string} componentId - The component ID to parse\n * @return {Object} Object containing extracted parts or null\n */\nfunction parseComponentId(componentId) {\n\tif (!componentId) return null;\n\n\t// Handle repeater patterns\n\tconst repeaterMatch = componentId.match(\n\t\t/-repeater_\\d+(?:_\\d+)?_[a-zA-Z_]+_\\d+/\n\t);\n\tif (repeaterMatch) {\n\t\treturn {\n\t\t\ttype: 'repeater',\n\t\t\tvalue: repeaterMatch[0].substring(1), // Remove leading hyphen\n\t\t};\n\t}\n\n\t// Handle root suffixes\n\tif (componentId.endsWith('-root')) {\n\t\treturn {\n\t\t\ttype: 'root',\n\t\t\tvalue: componentId,\n\t\t};\n\t}\n\n\t// Handle component name after prefix\n\t// Pattern: matches meaningful suffix after prefix, ignoring numeric parts\n\t// e.g., \"5cn33ccisrgp-828-filter-pill\" -> \"filter-pill\"\n\t//       \"2902fb0533374259ba357faea-custom-component\" -> \"custom-component\"\n\t//       \"yjobpfd7ow0m-1270\" -> null (no meaningful suffix)\n\tconst suffixMatch = componentId.match(\n\t\t/(?:[a-zA-Z0-9]+-)(?:\\d+-)?([a-zA-Z-]+(?:-[a-zA-Z-]+)*)$/\n\t);\n\tif (suffixMatch) {\n\t\treturn {\n\t\t\ttype: 'suffix',\n\t\t\tvalue: suffixMatch[1],\n\t\t};\n\t}\n\n\treturn {\n\t\ttype: 'full',\n\t\tvalue: componentId,\n\t};\n}\n\n/**\n * Get stable component ID from element\n */\nfunction getStableComponentId(node) {\n\tif (!node) return null;\n\n\tconst componentId = node.getAttribute('component-id');\n\tif (!componentId) return null;\n\n\tconst parsed = parseComponentId(componentId);\n\treturn parsed ? parsed.value : null;\n}\n\n/**\n * Extract meaningful suffix from dynamic component ID\n */\nfunction extractMeaningfulSuffixFromComponentId(componentId) {\n\tconst parsed = parseComponentId(componentId);\n\tif (!parsed || parsed.type === 'full') return null;\n\n\t// For repeater types, include the hyphen prefix\n\tif (parsed.type === 'repeater') {\n\t\treturn `-${parsed.value}`;\n\t}\n\n\treturn parsed.value;\n}\n\n/**\n * Check if component ID is from a repeater component hierarchy\n */\nfunction isRepeaterComponent(componentId) {\n\treturn (\n\t\tcomponentId &&\n\t\t(componentId.includes('-repeater_') ||\n\t\t\t(componentId.includes('container-') &&\n\t\t\t\tcomponentId.includes('__column')))\n\t);\n}\n\n/**\n * Generate a selector path step for a single element\n * @param {Element} node - The element to generate a step for\n * @return {Object} Path step with path string and optimization flag\n */\nfunction generatePathStep(node) {\n\tif (!node || node.nodeType !== Node.ELEMENT_NODE) {\n\t\treturn { path: '', isOptimized: false };\n\t}\n\tconst selector = node.tagName.toLowerCase();\n\tconst attributes = getRequiredAttributes(node);\n\n\t// 1. Prefer id (if not a root id)\n\tconst elementId = attributes['id'];\n\tif (elementId && !elementId.includes('root')) {\n\t\treturn {\n\t\t\tpath: `${selector}[id='${elementId}']`,\n\t\t\tisOptimized: true,\n\t\t};\n\t}\n\n\t// 2. Prefer data-testid\n\tconst dataTestId = attributes['data-testid'];\n\tif (dataTestId) {\n\t\treturn {\n\t\t\tpath: `${selector}[data-testid='${dataTestId}']`,\n\t\t\tisOptimized: true,\n\t\t};\n\t}\n\n\t// 3. Prefer data-id or data-itemid\n\tconst dataId = attributes['data-id'];\n\tif (dataId) {\n\t\treturn {\n\t\t\tpath: `${selector}[data-id='${dataId}']`,\n\t\t\tisOptimized: true,\n\t\t};\n\t}\n\tconst dataItemId = attributes['data-itemid'];\n\tif (dataItemId) {\n\t\treturn {\n\t\t\tpath: `${selector}[data-itemid='${dataItemId}']`,\n\t\t\tisOptimized: true,\n\t\t};\n\t}\n\n\t// 4. Prefer component-id (with $= for dynamic IDs)\n\tconst componentId = node.getAttribute('component-id');\n\tif (componentId) {\n\t\tconst stableId = getStableComponentId(node);\n\t\tif (stableId && componentId !== stableId) {\n\t\t\treturn {\n\t\t\t\tpath: `${selector}[component-id$='${stableId}']`,\n\t\t\t\tisOptimized: true,\n\t\t\t};\n\t\t}\n\t\treturn {\n\t\t\tpath: `${selector}[component-id='${componentId}']`,\n\t\t\tisOptimized: true,\n\t\t};\n\t}\n\n\t// 5. For native children, use :nth-child if needed\n\tif (node.parentNode) {\n\t\tconst siblings = Array.from(node.parentNode.children).filter(\n\t\t\t(child) => child.tagName === node.tagName\n\t\t);\n\t\tif (siblings.length > 1) {\n\t\t\tconst index = siblings.indexOf(node) + 1;\n\t\t\treturn {\n\t\t\t\tpath: `${selector}:nth-child(${index})`,\n\t\t\t\tisOptimized: false,\n\t\t\t};\n\t\t}\n\t}\n\tconst componentName = attributes['component-name'];\n\tif (componentName) {\n\t\treturn {\n\t\t\tpath: `${selector}[component-name='${componentName}']`,\n\t\t\tisOptimized: true,\n\t\t};\n\t}\n\n\t// 6. Prefer macroponent-id\n\tconst macroponentId = node.getAttribute('macroponent-id');\n\tif (macroponentId) {\n\t\treturn {\n\t\t\tpath: `${selector}[macroponent-id='${macroponentId}']`,\n\t\t\tisOptimized: true,\n\t\t};\n\t}\n\n\t// 7. Prefer instance-id\n\tconst instanceId = node.getAttribute('instance-id');\n\tif (instanceId) {\n\t\treturn {\n\t\t\tpath: `${selector}[instance-id='${instanceId}']`,\n\t\t\tisOptimized: true,\n\t\t};\n\t}\n\n\t// 8. Fallback to tag + classes\n\tconst classes = Array.from(node.classList || []);\n\tconst filteredClasses = classes.filter(\n\t\t(className) =>\n\t\t\t!className.includes('element-hover-highlight') &&\n\t\t\t!className.includes('element-selected-highlight') &&\n\t\t\t!className.includes('hover') &&\n\t\t\t!className.includes('selected') &&\n\t\t\t!className.includes('active') &&\n\t\t\t!className.includes('focus')\n\t);\n\n\tif (filteredClasses.length > 0) {\n\t\tconst classSelector = filteredClasses.map((c) => `.${c}`).join('');\n\t\treturn {\n\t\t\tpath: `${selector}${classSelector}`,\n\t\t\tisOptimized: false,\n\t\t};\n\t}\n\n\t// 9. Last resort: just use the tag name\n\treturn {\n\t\tpath: selector,\n\t\tisOptimized: false,\n\t};\n}\n\n/**\n * Get required attributes from an element\n * @param {Element} element - The element to get attributes from\n * @return {Object} Object with attribute names as keys and values as values\n */\nfunction getRequiredAttributes(element) {\n\tconst attributeList = {};\n\n\tif (element && element.getAttributeNames) {\n\t\telement\n\t\t\t.getAttributeNames()\n\t\t\t.filter(\n\t\t\t\t(attr) =>\n\t\t\t\t\tREQUIRED_ATTRIBUTES.includes(attr) ||\n\t\t\t\t\tUXF_ATTRIBUTES.includes(attr)\n\t\t\t)\n\t\t\t.forEach((attr) => {\n\t\t\t\tattributeList[attr] = element.getAttribute(attr);\n\t\t\t});\n\t}\n\n\treturn attributeList;\n}\n\n/**\n * Check if a selector uniquely identifies an element in the document\n * @param {string} selector - The selector to check\n * @param {Document|ShadowRoot} root - The root to query within\n * @return {boolean} Whether the selector is unique\n */\nfunction isSelectorUnique(selector, root = document) {\n\tif (!selector) return false;\n\n\t// Create cache key using selector and root identifier\n\tconst rootId =\n\t\troot === document ? 'document' : root.host?.tagName || 'unknown-root';\n\tconst cacheKey = `${selector}:${rootId}`;\n\n\t// Check cache first\n\t// Check if we already have this selector in our cache\n\tif (selectorCache.hasElements(selector)) {\n\t\t// If we have the elements, we can determine uniqueness without DOM query\n\t\tconst isUnique = selectorCache.isUnique(selector);\n\t\tif (isUnique !== undefined) {\n\t\t\t// Cache the result\n\t\t\tselectorCache.setUniqueMatch(cacheKey, isUnique);\n\t\t\treturn isUnique;\n\t\t}\n\t}\n\n\t// Check if we already know the uniqueness from previous checks\n\tif (selectorCache.hasUniqueMatch(cacheKey)) {\n\t\treturn selectorCache.getUniqueMatch(cacheKey);\n\t}\n\n\ttry {\n\t\t// Perform the query\n\t\tconst elements = querySelectorAllDeep(selector, root);\n\t\tconst isUnique = elements.length === 1;\n\n\t\t// Cache the result to avoid repeated DOM operations\n\t\tselectorCache.setUniqueMatch(cacheKey, isUnique);\n\n\t\t// Also cache the elements for future use\n\t\tselectorCache.setElements(selector, elements);\n\n\t\treturn isUnique;\n\t} catch (e) {\n\t\t// Handle invalid selectors gracefully\n\t\tif (process.env.NODE_ENV !== 'production') {\n\t\t\tconsole.warn('Invalid selector:', selector, e);\n\t\t}\n\t}\n}\n\n/**\n * Get parent element, supporting shadow DOM traversal\n * @param {Element} node - The current element\n * @returns {Element|null} - The parent element, crossing shadow DOM boundaries if needed\n */\nfunction getElementParent(node) {\n\tif (!node) return null;\n\n\t// First try regular DOM parent\n\tif (node.parentElement) {\n\t\treturn node.parentElement;\n\t}\n\n\t// If no regular parent, try to cross shadow DOM boundary\n\tconst rootNode = node.getRootNode();\n\tif (rootNode instanceof ShadowRoot) {\n\t\treturn rootNode.host;\n\t}\n\n\treturn null;\n}\n\n/**\n * Generate a path for an element within its immediate DOM context\n * @param {Element} node - The element to generate a path for\n * @param {boolean} optimized - Whether to optimize the selector\n * @param {Object} options - Optional parameters\n * @param {number} options.maxDepth - Maximum depth to traverse up the DOM tree (default: 5)\n * @return {string} The generated path\n */\nfunction generateElementPath(node, options = {}) {\n\tif (node.nodeType !== Node.ELEMENT_NODE) {\n\t\treturn '';\n\t}\n\n\t// Extract options with defaults\n\tconst { maxDepth = 10 } = options;\n\n\t// First check if the target element has a unique ID\n\tconst elementId = node.getAttribute('id');\n\tif (elementId && !elementId.includes('root')) {\n\t\tconst idSelector = `#${elementId}`;\n\t\tif (\n\t\t\tisSelectorUnique(idSelector, node.ownerDocument || window.document)\n\t\t) {\n\t\t\treturn { querySelector: idSelector };\n\t\t}\n\t}\n\n\tlet querySelector = '';\n\tlet currentNode = node;\n\tconst document = node.ownerDocument || window.document;\n\tlet pathParts = [];\n\n\t// Track traversal depth to prevent excessive DOM traversal\n\tlet depth = 0;\n\n\t// Build selector from element up to a unique parent or UXF boundary\n\twhile (\n\t\tcurrentNode &&\n\t\tcurrentNode.nodeType === Node.ELEMENT_NODE &&\n\t\tdepth < maxDepth\n\t) {\n\t\t// Increment depth counter\n\t\tdepth++;\n\n\t\tconst currentSelector = generatePathStep(currentNode).path;\n\t\tconst hasDataTestId = currentNode.hasAttribute('data-testid');\n\t\tconst hasComponentId = currentNode.hasAttribute('component-id');\n\t\tconst componentId = hasComponentId\n\t\t\t? currentNode.getAttribute('component-id')\n\t\t\t: null;\n\t\tconst hasUniqueId =\n\t\t\tcurrentNode.hasAttribute('id') &&\n\t\t\t!currentNode.getAttribute('id').includes('root');\n\n\t\t// Include if element has stable identifiers or is part of repeater hierarchy\n\t\tif (\n\t\t\t!querySelector ||\n\t\t\thasDataTestId ||\n\t\t\thasUniqueId ||\n\t\t\t(componentId &&\n\t\t\t\t(isRepeaterComponent(componentId) ||\n\t\t\t\t\textractMeaningfulSuffixFromComponentId(componentId)))\n\t\t) {\n\t\t\tpathParts.unshift(currentSelector);\n\t\t}\n\n\t\t// Build the current path\n\t\tquerySelector = pathParts.join(' ');\n\n\t\t// Early exit if we have at least 2 path parts and this element has a good identifier\n\t\tconst hasSomeUniqueIdentifier =\n\t\t\thasDataTestId ||\n\t\t\thasUniqueId ||\n\t\t\t(hasComponentId &&\n\t\t\t\t(isRepeaterComponent(componentId) ||\n\t\t\t\t\textractMeaningfulSuffixFromComponentId(componentId)));\n\n\t\t// If we've built a selector with at least one good identifier, check if it's unique\n\t\tif (\n\t\t\thasSomeUniqueIdentifier ||\n\t\t\tisSelectorUnique(querySelector, document)\n\t\t) {\n\t\t\treturn { querySelector };\n\t\t}\n\n\t\t// Get parent element, supporting shadow DOM traversal\n\t\tcurrentNode = getElementParent(currentNode);\n\t}\n\n\t// If we have reached here that means there is no selector path found\n\treturn { querySelector: null };\n}\n\n/**\n * Generate a selector path for an element\n * Uses space combinator to cross shadow boundaries for query-selector-shadow-dom compatibility\n *\n * @param {Element} node - The element to generate a path for\n * @return {string} The generated selector path\n */\nexport function generateSelectorPath(node, options = {}) {\n\tconst { performance = false, maxDepth = 5 } = options;\n\tconst startTime = performance ? Date.now() : 0;\n\n\tif (!node || node.nodeType !== Node.ELEMENT_NODE) {\n\t\treturn '';\n\t}\n\n\t// First check if the element itself has a stable identifier\n\tconst { querySelector } = generateElementPath(node, { maxDepth });\n\n\t// Always return a valid selector, never null\n\t// This maintains backward compatibility with existing tests\n\tif (performance && startTime) {\n\t\tconst endTime = Date.now();\n\t\tconsole.log(\n\t\t\t`Time taken to generate selector path: ${endTime - startTime}ms`\n\t\t);\n\t}\n\treturn querySelector;\n}\n\n/**\n * Find an element using a selector path\n * @param {string} path - The selector path to use\n * @param {Document} doc - The document to search in\n * @return {Element|null} The found element or null\n */\nexport function findElementBySelectorPath(path, doc = document) {\n\tif (!path) return null;\n\n\t// Split by shadow DOM boundary marker, trim spaces to avoid issues\n\tconst segments = path\n\t\t.split(SHADOW_DOM_COMBINATOR)\n\t\t.map((segment) => segment.trim());\n\tlet currentElement = null;\n\tlet currentRoot = doc;\n\n\tfor (let i = 0; i < segments.length; i++) {\n\t\ttry {\n\t\t\t// Skip empty segments\n\t\t\tif (!segments[i]) continue;\n\n\t\t\tcurrentElement = currentRoot.querySelector(segments[i]);\n\n\t\t\tif (!currentElement) return null;\n\n\t\t\t// Prepare for next iteration by moving into shadow DOM\n\t\t\tif (i < segments.length - 1) {\n\t\t\t\tif (!currentElement.shadowRoot) return null;\n\t\t\t\tcurrentRoot = currentElement.shadowRoot;\n\t\t\t}\n\t\t} catch (e) {\n\t\t\t// Handle errors gracefully in production\n\t\t\tif (process.env.NODE_ENV !== 'production') {\n\t\t\t\tconsole.warn('Selector error:', segments[i], e.message);\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\t}\n\n\treturn currentElement;\n}\n","// Utility functions for DOM element fingerprinting\n\nexport function getChildrenSignature(el) {\n\treturn el?.children?.length\n\t\t? Array.from(el.children)\n\t\t\t\t.map((c) => c.tagName.toLowerCase())\n\t\t\t\t.join('|')\n\t\t: '';\n}\n\nexport function getSiblingIndex(el) {\n\tif (!el.parentNode) return 0;\n\treturn Array.from(el.parentNode.children)\n\t\t.filter((c) => c.tagName === el.tagName)\n\t\t.indexOf(el);\n}\n\nexport function getKeyAttributes(el) {\n\tconst keys = [\n\t\t'type',\n\t\t'name',\n\t\t'placeholder',\n\t\t'for',\n\t\t'href',\n\t\t'src',\n\t\t'title',\n\t\t'alt',\n\t\t'value',\n\t];\n\treturn keys.reduce((acc, k) => {\n\t\tconst val = el.getAttribute(k);\n\t\tif (val) acc[k] = val;\n\t\treturn acc;\n\t}, {});\n}\n\nexport function generateCssSelector(el) {\n\tif (!el) return '';\n\n\tlet selector = el.tagName.toLowerCase();\n\tif (el.id) return `${selector}#${el.id}`;\n\n\tif (el.classList.length) {\n\t\tselector += '.' + Array.from(el.classList).join('.');\n\t}\n\n\t['type', 'name'].forEach((attr) => {\n\t\tconst val = el.getAttribute(attr);\n\t\tif (val) selector += `[${attr}=\"${val}\"]`;\n\t});\n\n\tconst siblings = Array.from(el.parentNode?.children || []).filter(\n\t\t(c) => c.tagName === el.tagName\n\t);\n\tif (siblings.length > 1)\n\t\tselector += `:nth-of-type(${siblings.indexOf(el) + 1})`;\n\n\treturn selector;\n}\n\nexport function getShadowInfo(el) {\n\tconst root = el.getRootNode();\n\tif (!(root instanceof ShadowRoot)) return null;\n\n\treturn {\n\t\tmode: root.mode,\n\t\thostId: root.host.id,\n\t\thostTagName: root.host.tagName.toLowerCase(),\n\t\thostClasses: Array.from(root.host.classList),\n\t\tslotName: el.getAttribute('slot'),\n\t};\n}\n\nexport function isElementUnderComponent(el, componentTag) {\n\tif (!el) return false;\n\n\t// Check if the element itself is the component\n\tif (el.tagName && el.tagName.toLowerCase() === componentTag.toLowerCase()) {\n\t\treturn true;\n\t}\n\n\t// Check parent elements\n\tlet parent = el.parentElement;\n\twhile (parent) {\n\t\tif (\n\t\t\tparent.tagName &&\n\t\t\tparent.tagName.toLowerCase() === componentTag.toLowerCase()\n\t\t) {\n\t\t\treturn true;\n\t\t}\n\t\tparent = parent.parentElement;\n\t}\n\n\t// Check shadow DOM\n\tlet root = el.getRootNode();\n\tif (root instanceof ShadowRoot) {\n\t\treturn isElementUnderComponent(root.host, componentTag);\n\t}\n\n\treturn false;\n}\n\nexport function findClosestElementByTagName(el, prefix = 'macroponent-') {\n\tif (!el) return null;\n\n\tif (el.tagName && el.tagName.toLowerCase().includes(prefix)) {\n\t\treturn el;\n\t}\n\n\t// Cross shadow DOM boundary\n\tif (el.getRootNode && el.getRootNode() instanceof ShadowRoot) {\n\t\treturn findClosestElementByTagName(el.getRootNode().host, prefix);\n\t}\n\n\treturn null;\n}\n\nexport function getElementIdFromComponent(el, useId = false) {\n\tconst componentId = useId ? el.id : el.getAttribute('component-id');\n\tif (!componentId) return '';\n\n\tconst componentIdParts = componentId.split('-');\n\tif (componentIdParts.length < 2) return '';\n\n\tlet elementId = '';\n\tif (componentId.includes('repeater_')) {\n\t\telementId = componentId.substr(componentId.indexOf('repeater_'));\n\t}\n\n\tif (!elementId) elementId = componentIdParts[componentIdParts.length - 1];\n\n\treturn elementId;\n}\n\nexport function getDynamicId(el) {\n\tconst closestMacroponent = findClosestElementByTagName(el);\n\tconst componentId = closestMacroponent?.getAttribute('component-id') || '';\n\tconst subComponentIds = componentId ? componentId.split('-') : [];\n\n\tif (subComponentIds && subComponentIds.length <= 2) {\n\t\treturn subComponentIds[0];\n\t}\n\n\treturn '';\n}\n\nexport function getFrameworkIdentifiers(el) {\n\t// Get the dynamic ID for UXF components\n\tconst dynamicId = getDynamicId(el);\n\n\t// Extract element IDs from component IDs\n\tconst componentIdSuffix = getElementIdFromComponent(el, false);\n\tconst idSuffix = getElementIdFromComponent(el, true);\n\n\t// Check if element is under specific UXF components\n\tconst isUnderCanvasScreen = isElementUnderComponent(el, 'sn-canvas-screen');\n\tconst isUnderExpShell = isElementUnderComponent(\n\t\tel,\n\t\t'sn-canvas-experience-shell'\n\t);\n\n\t// Find closest macroponent\n\tconst closestMacroponent = findClosestElementByTagName(el);\n\tconst macroponentTag = closestMacroponent?.tagName?.toLowerCase() || null;\n\n\treturn {\n\t\t// Angular 1.x specific\n\t\tngClick: el.getAttribute('ng-click'),\n\t\tngSubmit: el.getAttribute('ng-submit'),\n\t\tngHref: el.getAttribute('ng-href'),\n\n\t\t// UXF framework specific\n\t\tuxfId: el.getAttribute('component-id'),\n\t\tuxfType: el.getAttribute('now-id'),\n\t\tdataGtdEid: el.getAttribute('data-gtd-eid'),\n\t\tdataId: el.getAttribute('data-id'),\n\t\tdataView: el.getAttribute('data-view'),\n\t\tdataItemId: el.getAttribute('data-itemid'),\n\t\t// Seismic specific\n\t\tmacroponentId: macroponentTag?.includes('macroponent-')\n\t\t\t? macroponentTag.replace('macroponent-', '')\n\t\t\t: null,\n\t\tisMacroponent: macroponentTag?.includes('macroponent-') || false,\n\t\tisCanvasScreen: el.tagName?.toLowerCase() === 'sn-canvas-screen',\n\t\tisCanvasExperienceShell:\n\t\t\tel.tagName?.toLowerCase() === 'sn-canvas-experience-shell',\n\t\tisUnderCanvasScreen,\n\t\tisUnderExpShell,\n\n\t\t// UXF component identification\n\t\tcomponentIdSuffix,\n\t\tidSuffix,\n\t\tdynamicId,\n\t};\n}\n\nexport function getLanguageIndependentFeatures(el) {\n\tif (!el.textContent) return { textLength: 0, hasText: false };\n\n\tconst text = el.textContent.trim();\n\n\t// Instead of trying to match text content directly,\n\t// focus on structural characteristics that are language-independent\n\treturn {\n\t\t// Basic text properties\n\t\ttextLength: text.length,\n\t\thasText: text.length > 0,\n\n\t\t// Numeric content is usually preserved across languages\n\t\tnumberCount: (text.match(/\\d+/g) || []).length,\n\n\t\t// Special characters often remain consistent\n\t\thasSpecialChars: /[!@#$%^&*()_+\\-=\\[\\]{};':\"\\\\|,.<>\\/?]+/.test(text),\n\n\t\t// Text structure patterns\n\t\twordCount: text.split(/\\s+/).filter(Boolean).length,\n\n\t\t// Is this element visually prominent?\n\t\tisProminent: isVisuallyProminent(el),\n\n\t\t// Position in parent relative to siblings (often consistent across languages)\n\t\tpositionSignature: getPositionSignature(el),\n\t};\n}\n\nexport function isVisuallyProminent(el) {\n\tconst style = window.getComputedStyle(el);\n\tconst isBold = style.fontWeight >= 600;\n\tconst isLarge = parseInt(style.fontSize) >= 16;\n\treturn isBold || isLarge;\n}\n\nexport function getPositionSignature(el) {\n\tif (!el.parentElement) return '';\n\n\tconst siblings = Array.from(el.parentElement.children);\n\tconst index = siblings.indexOf(el);\n\n\tconst position = index + 1;\n\tconst total = siblings.length;\n\tlet relativePosition = 'middle';\n\n\tif (position === 1) relativePosition = 'first';\n\tif (position === total) relativePosition = 'last';\n\n\treturn `${position}-of-${total}-${relativePosition}`;\n}\n","import { generateSelectorPath } from './selector-path';\nimport {\n\tgetChildrenSignature,\n\tgetKeyAttributes,\n\tgenerateCssSelector,\n\tgetShadowInfo,\n\tgetFrameworkIdentifiers,\n\tgetLanguageIndependentFeatures,\n\tgetSiblingIndex,\n} from './utils';\n\nconst ariaAttributes = [\n\t'aria-describedby',\n\t'aria-description',\n\t'aria-details',\n\t'aria-label',\n\t'aria-labelledby',\n\t'aria-roledescription',\n\t'aria-expanded',\n\t'aria-hidden',\n\t'aria-disabled',\n\t'aria-checked',\n\t'aria-selected',\n\t'aria-current',\n\t'aria-pressed',\n];\n\n// Get enhanced position information for an element\nfunction getEnhancedPosition(el) {\n\tif (!el.getBoundingClientRect) {\n\t\treturn { top: null, left: null, width: null, height: null };\n\t}\n\n\tconst rect = el.getBoundingClientRect();\n\tconst style = window.getComputedStyle(el);\n\n\treturn {\n\t\ttop: rect.top + window.scrollY,\n\t\tleft: rect.left + window.scrollX,\n\t\twidth: rect.width,\n\t\theight: rect.height,\n\t\tzIndex: style.zIndex,\n\t\tisVisible:\n\t\t\tstyle.display !== 'none' &&\n\t\t\tstyle.visibility !== 'hidden' &&\n\t\t\tstyle.opacity !== '0' &&\n\t\t\tel.getAttribute('aria-hidden') !== 'true',\n\t\trelativePosition: getRelativePosition(el),\n\t\tboundingBoxRatio: {\n\t\t\ttopRatio: rect.top / window.innerHeight,\n\t\t\tleftRatio: rect.left / window.innerWidth,\n\t\t\twidthRatio: rect.width / window.innerWidth,\n\t\t\theightRatio: rect.height / window.innerHeight,\n\t\t},\n\t};\n}\n\n// Gets the relative position of an element within its parent\nfunction getRelativePosition(el) {\n\tif (!el.parentElement) return {};\n\n\tconst siblings = Array.from(el.parentElement.children);\n\tconst index = siblings.indexOf(el);\n\n\treturn {\n\t\tindex,\n\t\tisFirst: index === 0,\n\t\tisLast: index === siblings.length - 1,\n\t\ttotalSiblings: siblings.length,\n\t};\n}\n\nfunction getTagPath(el) {\n\tconst path = [];\n\tlet current = el;\n\twhile (current) {\n\t\tpath.unshift(current.tagName ? current.tagName.toLowerCase() : '');\n\t\tif (current.getRootNode() instanceof ShadowRoot) {\n\t\t\tcurrent = current.getRootNode().host;\n\t\t} else {\n\t\t\tcurrent = current.parentElement;\n\t\t}\n\t}\n\treturn path;\n}\n\nfunction getIdentifiers(el) {\n\tif (!el || !el.attributes) return {};\n\n\tconst data = {};\n\tconst aria = {};\n\tconst other = {};\n\n\t// Get data attributes\n\tfor (const k in el.dataset) data[k] = el.dataset[k];\n\n\t// Get ARIA and other attributes\n\tfor (const attr of el.attributes) {\n\t\tif (ariaAttributes.includes(attr.name)) {\n\t\t\taria[attr.name] = attr.value;\n\t\t} else {\n\t\t\tother[attr.name] = attr.value;\n\t\t}\n\t}\n\n\t// Basic identifiers\n\tconst basicIdentifiers = {\n\t\tdata,\n\t\taria,\n\t\tother,\n\t\tid: el.id,\n\t\ttagName: el.tagName.toLowerCase(),\n\t\tclassNames: Array.from(el.classList).filter(\n\t\t\t(className) =>\n\t\t\t\t!className.includes('element-hover-highlight') &&\n\t\t\t\t!className.includes('element-selected-highlight')\n\t\t),\n\t\ttagPath: getTagPath(el),\n\t};\n\n\t// Enhanced identifiers for better fingerprinting\n\tconst enhancedIdentifiers = {\n\t\tchildrenStructure: getChildrenSignature(el),\n\t\tsiblingIndex: getSiblingIndex(el),\n\t\tattributes: getKeyAttributes(el),\n\t\tcssSelector: generateCssSelector(el),\n\t\tshadowInfo: getShadowInfo(el),\n\t\tframework: getFrameworkIdentifiers(el),\n\t\ttextFeatures: getLanguageIndependentFeatures(el),\n\t\tposition: getEnhancedPosition(el),\n\t};\n\n\treturn {\n\t\t...basicIdentifiers,\n\t\t...enhancedIdentifiers,\n\t};\n}\n\n// Generate a fingerprint for a DOM element\nexport default function fingerprint(el, options = {}) {\n\tconst {\n\t\tincludeText = false,\n\t\tstructureOnly = false,\n\t\tperformance = false,\n\t} = options;\n\n\tlet startTime;\n\tstartTime = performance ? Date.now() : null;\n\n\tconst identifiers = getIdentifiers(el);\n\n\tconst result = {\n\t\t...identifiers,\n\t\tselectorPath: generateSelectorPath(el, { performance }),\n\t};\n\n\tif (includeText && el.textContent) {\n\t\tresult.textContent = el.textContent.trim();\n\t}\n\n\tif (structureOnly) {\n\t\treturn {\n\t\t\ttagName: identifiers.tagName,\n\t\t\tchildrenStructure: identifiers.childrenStructure,\n\t\t\tsiblingIndex: identifiers.siblingIndex,\n\t\t\tcssSelector: identifiers.cssSelector,\n\t\t\tclassNames: identifiers.classNames,\n\t\t\tid: identifiers.id,\n\t\t\ttagPath: identifiers.tagPath,\n\t\t\tselectorPath: result.selectorPath,\n\t\t\tposition: {\n\t\t\t\trelativePosition: identifiers.position.relativePosition,\n\t\t\t},\n\t\t};\n\t}\n\n\tresult.meta = {\n\t\ttimestamp: Date.now(),\n\t\turl: window.location.pathname,\n\t\tviewport: {\n\t\t\twidth: window.innerWidth,\n\t\t\theight: window.innerHeight,\n\t\t},\n\t};\n\n\tif (performance && startTime) {\n\t\tconst endTime = Date.now();\n\t\tconsole.log(`Fingerprint creation took ${endTime - startTime}ms`);\n\t\tconsole.log('Generated fingerprint:', result);\n\t}\n\n\treturn result;\n}\n","// Use shared cache for selector operations to avoid repeated DOM queries\nimport { selectorCache } from './cache-utility.js';\nimport { querySelectorAllDeep } from 'query-selector-shadow-dom';\n\nfunction compareClassNames(a, b) {\n\t// Filter out instrumentation classes\n\tconst filterClasses = (classes) =>\n\t\t(classes || []).filter(\n\t\t\t(className) =>\n\t\t\t\t!className.includes('element-hover-highlight') &&\n\t\t\t\t!className.includes('element-selected-highlight')\n\t\t);\n\n\tconst setA = new Set(filterClasses(a));\n\tconst setB = new Set(filterClasses(b));\n\n\t// If both are empty, consider it a perfect match\n\tif (setA.size === 0 && setB.size === 0) return 1.0;\n\n\tconst intersection = [...setA].filter((x) => setB.has(x));\n\tconst union = new Set([...setA, ...setB]);\n\treturn union.size === 0 ? 1.0 : intersection.length / union.size;\n}\n\nfunction compareTagPath(a, b) {\n\tconst len = Math.min(a.length, b.length);\n\tlet matchCount = 0;\n\tfor (let i = 0; i < len; i++) {\n\t\tif (a[i] === b[i]) matchCount++;\n\t\telse break;\n\t}\n\treturn Math.max(a.length, b.length) === 0\n\t\t? 0\n\t\t: matchCount / Math.max(a.length, b.length);\n}\n\nfunction compareBox(a, b) {\n\tif (!a || !b) return 0;\n\tlet score = 0;\n\tlet count = 0;\n\n\t// Compare ratios with tolerance\n\tfor (const key of Object.keys(a)) {\n\t\tif (b[key] !== undefined) {\n\t\t\t// Use relative difference with 10% tolerance\n\t\t\tconst diff = Math.abs(a[key] - b[key]);\n\t\t\tconst avg = (a[key] + b[key]) / 2;\n\n\t\t\t// Handle division by zero when both values are 0\n\t\t\tif (avg === 0) {\n\t\t\t\t// If both values are 0, they are identical (perfect match)\n\t\t\t\tscore += 1;\n\t\t\t} else {\n\t\t\t\tconst relDiff = diff / avg;\n\t\t\t\tscore += relDiff <= 0.1 ? 1 : 1 - Math.min(1, relDiff);\n\t\t\t}\n\t\t\tcount++;\n\t\t}\n\t}\n\treturn count === 0 ? 0 : score / count;\n}\n\nfunction compareAttribute(a, b) {\n\tif (a === b) return 1;\n\tif (a === undefined || b === undefined) return 0.5;\n\treturn 0;\n}\n\nfunction compareObjects(a, b) {\n\tif (!a || !b) return 0;\n\tlet matches = 0;\n\tlet total = 0;\n\tfor (const key of new Set([...Object.keys(a), ...Object.keys(b)])) {\n\t\ttotal++;\n\t\tif (a[key] && b[key] && a[key] === b[key]) matches++;\n\t}\n\treturn total === 0 ? 0 : matches / total;\n}\n\nfunction isParentChild(fingerprintA, fingerprintB) {\n\tconst tagPathA = fingerprintA.tagPath;\n\tconst tagPathB = fingerprintB.tagPath;\n\n\tif (!Array.isArray(tagPathA) || !Array.isArray(tagPathB)) {\n\t\treturn false;\n\t}\n\n\t// If paths are identical, return true\n\tif (tagPathA.length === tagPathB.length) {\n\t\treturn tagPathA.every((tag, i) => tag === tagPathB[i]);\n\t}\n\n\t// Check parent-child relationship\n\tconst shorterPath = tagPathA.length < tagPathB.length ? tagPathA : tagPathB;\n\tconst longerPath = tagPathA.length < tagPathB.length ? tagPathB : tagPathA;\n\n\treturn shorterPath.every((tag, i) => tag === longerPath[i]);\n}\n\n/**\n * Get the gsft_main iframe's content document if it exists\n * @param {Document} doc - Document to search in\n * @returns {Document|null} The iframe's content document or null\n */\nfunction getGsftMainIframeDocument(doc = document) {\n\tconst iframes = querySelectorAllDeep('iframe#gsft_main');\n\tif (iframes.length > 0 && iframes[0].contentDocument) {\n\t\treturn iframes[0].contentDocument;\n\t}\n\treturn null;\n}\n\n/**\n * Get elements for a selector with caching support\n * @param {string} selector - CSS selector to query\n * @param {Document} doc - Document to query in\n * @returns {NodeList|null} Elements matching the selector, or null if invalid\n */\nfunction getCachedElements(selector, doc = document) {\n\tif (selectorCache.hasElements(selector)) {\n\t\treturn selectorCache.getElements(selector);\n\t}\n\n\ttry {\n\t\tlet elements = querySelectorAllDeep(selector, doc);\n\n\t\t// If no elements found, check iframe with id=gsft_main\n\t\tif (elements && elements.length === 0) {\n\t\t\tconst iframeDoc = getGsftMainIframeDocument(doc);\n\t\t\tif (iframeDoc) {\n\t\t\t\ttry {\n\t\t\t\t\telements = querySelectorAllDeep(selector, iframeDoc);\n\t\t\t\t} catch (iframeError) {\n\t\t\t\t\tconsole.warn('Error querying iframe:', iframeError);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tselectorCache.setElements(selector, elements);\n\t\treturn elements;\n\t} catch (e) {\n\t\tconsole.warn(e);\n\t\t// If selector is invalid, cache null to avoid repeated failures\n\t\tselectorCache.setElements(selector, null);\n\t\treturn null;\n\t}\n}\n\n/**\n * Check if two selectors uniquely identify the same element\n * @param {string} selectorA - First selector\n * @param {string} selectorB - Second selector\n * @param {Document} doc - Document to query in\n * @returns {boolean} True if both selectors uniquely identify the same element\n */\nfunction isUniqueMatch(selectorA, selectorB, doc = document) {\n\tif (!selectorA || !selectorB) return false;\n\n\t// // Trivial case - identical selectors\n\t// if (selectorA === selectorB) return true;\n\n\t// Check cache for this specific comparison\n\tconst cacheKey = [selectorA, selectorB].sort().join(':');\n\n\t// Check unique match cache first\n\tif (selectorCache.hasUniqueMatch(cacheKey)) {\n\t\treturn selectorCache.getUniqueMatch(cacheKey);\n\t}\n\n\ttry {\n\t\t// Get elements for selectorA (from cache if possible)\n\t\tconst elementsA = getCachedElements(selectorA, doc);\n\n\t\t// Get elements for selectorB (from cache if possible)\n\t\tconst elementsB = getCachedElements(selectorB, doc);\n\n\t\t// If either selector failed or doesn't have exactly one element, they can't be a unique match\n\t\tif (\n\t\t\t!elementsA ||\n\t\t\t!elementsB ||\n\t\t\telementsA.length !== 1 ||\n\t\t\telementsB.length !== 1\n\t\t) {\n\t\t\tselectorCache.setUniqueMatch(cacheKey, false);\n\t\t\treturn false;\n\t\t}\n\n\t\t// Check if they're the same element\n\t\tconst elementA = elementsA[0];\n\t\tconst elementB = elementsB[0];\n\t\tconst result = elementA === elementB;\n\n\t\tselectorCache.setUniqueMatch(cacheKey, result);\n\t\treturn result;\n\t} catch (e) {\n\t\tconsole.warn(e);\n\t\t// If anything fails, cache the failure\n\t\tselectorCache.setUniqueMatch(cacheKey, false);\n\t\treturn false;\n\t}\n}\n\nfunction scoreComponentWeights(fpA, fpB) {\n\treturn {\n\t\ttagPath: compareTagPath(fpA.tagPath || [], fpB.tagPath || []),\n\t\tariaAttributes: compareObjects(fpA.aria, fpB.aria),\n\t\tparentChildRelationship: isParentChild(fpA, fpB) || fpA === fpB ? 1 : 0,\n\t\tattributesMatch: compareObjects(\n\t\t\tfpA.attributes || {},\n\t\t\tfpB.attributes || {}\n\t\t),\n\t\tdataAttrMatch: compareObjects(fpA.data || {}, fpB.data || {}),\n\t\tchildrenStructure: compareAttribute(\n\t\t\tfpA.childrenStructure,\n\t\t\tfpB.childrenStructure\n\t\t),\n\t\tclassNames: compareClassNames(\n\t\t\tfpA.classNames || [],\n\t\t\tfpB.classNames || []\n\t\t),\n\t\tsiblingIndex: compareAttribute(fpA.siblingIndex, fpB.siblingIndex),\n\t\tposition:\n\t\t\tcompareAttribute(fpA.position?.x, fpB.position?.x) *\n\t\t\tcompareAttribute(fpA.position?.y, fpB.position?.y),\n\t\ttextFeatures: compareAttribute(\n\t\t\tfpA.textFeatures?.text,\n\t\t\tfpB.textFeatures?.text\n\t\t),\n\t\tboundingBoxSimilarity: compareBox(\n\t\t\tfpA.position?.boundingBoxRatio,\n\t\t\tfpB.position?.boundingBoxRatio\n\t\t),\n\t\ttagName: compareAttribute(fpA.tagName, fpB.tagName),\n\t\tvisibility:\n\t\t\tfpA.position?.isVisible === undefined ||\n\t\t\tfpB.position?.isVisible === undefined\n\t\t\t\t? 0.5\n\t\t\t\t: fpA.position.isVisible === fpB.position.isVisible\n\t\t\t\t\t? 1\n\t\t\t\t\t: 0,\n\t};\n}\n\nconst defaultWeights = {\n\t// Strong identifiers (27%)\n\ttagPath: 14, // Most important for structure\n\tariaAttributes: 13, // Important as many times names are present here\n\n\t// Medium strength identifiers (35%)\n\tattributesMatch: 12, // Important for uniqueness with other attributes\n\tdataAttrMatch: 12, // Important for custom data\n\tchildrenStructure: 11, // Important for layout\n\n\t// Supporting identifiers (29%)\n\ttextFeatures: 10, // Content matching\n\tclassNames: 6, // Style indicators\n\tposition: 5, // Layout position\n\tsiblingIndex: 4, // Position in hierarchy\n\tboundingBoxSimilarity: 4, // Visual indicators\n\n\t// Basic identifiers (9%)\n\tparentChildRelationship: 3, // Important for hierarchy\n\ttagName: 3, // Element type\n\tvisibility: 3, // Element state\n};\n\n// Create a cache to store fingerprint comparison results\nconst scoreCache = new Map();\nconst SCORE_CACHE_SIZE_LIMIT = 1000; // Limit cache size to prevent memory issues\n\nfunction trimScoreCache() {\n\tif (scoreCache.size > SCORE_CACHE_SIZE_LIMIT) {\n\t\t// Delete the oldest 20% of entries\n\t\tconst keysToDelete = Array.from(scoreCache.keys()).slice(\n\t\t\t0,\n\t\t\tMath.floor(SCORE_CACHE_SIZE_LIMIT * 0.2)\n\t\t);\n\t\tkeysToDelete.forEach((key) => scoreCache.delete(key));\n\t}\n}\n\nexport function simpleDeterministicHash(input) {\n\tconst str = typeof input === 'string' ? input : JSON.stringify(input);\n\tlet hash = 5381;\n\n\tfor (let i = 0; i < str.length; i++) {\n\t\thash = (hash << 5) + hash + str.charCodeAt(i); // hash * 33 + c\n\t}\n\n\treturn (hash >>> 0).toString(36); // base36 for short alphanumeric hash\n}\n\nfunction calculateComponentScore(key, fpA, fpB, options = {}) {\n\tswitch (key) {\n\t\tcase 'tagPath':\n\t\t\treturn compareTagPath(\n\t\t\t\tfpA.tagPath || [],\n\t\t\t\tfpB.tagPath || [],\n\t\t\t\toptions\n\t\t\t);\n\t\tcase 'ariaAttributes':\n\t\t\treturn compareObjects(fpA.aria, fpB.aria, options);\n\t\tcase 'parentChildRelationship':\n\t\t\treturn isParentChild(fpA, fpB, options) || fpA === fpB ? 1 : 0;\n\t\tcase 'attributesMatch':\n\t\t\treturn compareObjects(\n\t\t\t\tfpA.attributes || {},\n\t\t\t\tfpB.attributes || {},\n\t\t\t\toptions\n\t\t\t);\n\t\tcase 'dataAttrMatch':\n\t\t\treturn compareObjects(fpA.data || {}, fpB.data || {}, options);\n\t\tcase 'childrenStructure':\n\t\t\treturn compareAttribute(\n\t\t\t\tfpA.childrenStructure,\n\t\t\t\tfpB.childrenStructure,\n\t\t\t\toptions\n\t\t\t);\n\t\tcase 'classNames':\n\t\t\treturn compareClassNames(\n\t\t\t\tfpA.classNames || [],\n\t\t\t\tfpB.classNames || [],\n\t\t\t\toptions\n\t\t\t);\n\t\tcase 'siblingIndex':\n\t\t\treturn compareAttribute(\n\t\t\t\tfpA.siblingIndex,\n\t\t\t\tfpB.siblingIndex,\n\t\t\t\toptions\n\t\t\t);\n\t\tcase 'position':\n\t\t\treturn (\n\t\t\t\tcompareAttribute(fpA.position?.x, fpB.position?.x, options) *\n\t\t\t\tcompareAttribute(fpA.position?.y, fpB.position?.y, options)\n\t\t\t);\n\t\tcase 'textFeatures':\n\t\t\treturn compareAttribute(\n\t\t\t\tfpA.textFeatures?.text,\n\t\t\t\tfpB.textFeatures?.text,\n\t\t\t\toptions\n\t\t\t);\n\t\tcase 'boundingBoxSimilarity':\n\t\t\treturn compareBox(\n\t\t\t\tfpA.position?.boundingBoxRatio,\n\t\t\t\tfpB.position?.boundingBoxRatio,\n\t\t\t\toptions\n\t\t\t);\n\t\tcase 'tagName':\n\t\t\treturn compareAttribute(fpA.tagName, fpB.tagName, options);\n\t\tcase 'visibility':\n\t\t\treturn fpA.position?.isVisible === undefined ||\n\t\t\t\tfpB.position?.isVisible === undefined\n\t\t\t\t? 0.5\n\t\t\t\t: fpA.position.isVisible === fpB.position.isVisible\n\t\t\t\t\t? 1\n\t\t\t\t\t: 0;\n\t\tdefault:\n\t\t\treturn 0;\n\t}\n}\n\n/**\n * Score two fingerprints against each other with memoization\n *\n * @param {Object} fingerprintA - First fingerprint to compare\n * @param {Object} fingerprintB - Second fingerprint to compare\n * @param {Object} options - Options for scoring\n * @param {Object} options - Options for scoring\n * @param {Document} targetDocument - Document to query in\n * @return {number} A score between 0 and 1\n */\nexport function score(\n\tfingerprintA,\n\tfingerprintB,\n\toptions = {},\n\ttargetDocument = document\n) {\n\tconst { performance = false, scorePerformance = false } = options;\n\tconst tracePerformance = performance || scorePerformance;\n\tconst startTime = tracePerformance ? Date.now() : 0;\n\tlet hashTime = 0,\n\t\texactMatchTime = 0,\n\t\tcomponentTime = 0,\n\t\tweightTime = 0;\n\tlet componentTimes = {};\n\n\t// Check if fingerprints have hash identifiers for better cache keys\n\tconst hashStart = performance ? Date.now() : 0;\n\tconst fingerprintAId =\n\t\tfingerprintA.fingerPrintHash ||\n\t\tsimpleDeterministicHash(JSON.stringify(fingerprintA));\n\tconst fingerprintBId =\n\t\tfingerprintB.fingerPrintHash ||\n\t\tsimpleDeterministicHash(JSON.stringify(fingerprintB));\n\n\t// Generate a deterministic cache key regardless of order\n\tconst cacheKey = [fingerprintAId, fingerprintBId].sort().join(':');\n\tif (performance) {\n\t\thashTime = Date.now() - hashStart;\n\t}\n\n\t// Check if we have a cached result\n\tif (scoreCache.has(cacheKey)) {\n\t\tif (performance) {\n\t\t\tconsole.log('Score cache hit!');\n\t\t}\n\t\treturn scoreCache.get(cacheKey);\n\t}\n\t// First check exact matches by id or selector path\n\tif (\n\t\tfingerprintA.id &&\n\t\tfingerprintB.id &&\n\t\tfingerprintA.id === fingerprintB.id\n\t) {\n\t\tif (performance) {\n\t\t\tconsole.log(\n\t\t\t\t`Score function - ID exact match - total: ${Date.now() - startTime}ms`\n\t\t\t);\n\t\t}\n\t\tscoreCache.set(cacheKey, 1);\n\t\treturn 1;\n\t}\n\n\tif (\n\t\tfingerprintA.selectorPath &&\n\t\tfingerprintB.selectorPath &&\n\t\tisUniqueMatch(fingerprintA.selectorPath, fingerprintB.selectorPath, targetDocument)\n\t) {\n\t\tif (performance) {\n\t\t\tconsole.log(\n\t\t\t\t`Score function - Selector path exact match - total: ${Date.now() - startTime}ms`\n\t\t\t);\n\t\t}\n\t\tscoreCache.set(cacheKey, 1);\n\t\treturn 1;\n\t}\n\n\t// If no exact matches, calculate weighted score from other signals\n\tconst weights = { ...defaultWeights, ...options.weights };\n\n\t// Calculate each component score with timing\n\tconst componentStart = performance ? Date.now() : 0;\n\tconst c = {};\n\n\tif (performance) {\n\t\t// Detailed timing for each component\n\t\tfor (const key of Object.keys(weights)) {\n\t\t\tconst compStart = Date.now();\n\t\t\tc[key] = calculateComponentScore(\n\t\t\t\tkey,\n\t\t\t\tfingerprintA,\n\t\t\t\tfingerprintB,\n\t\t\t\toptions\n\t\t\t);\n\t\t\tcomponentTimes[key] = Date.now() - compStart;\n\t\t}\n\t} else {\n\t\t// Regular calculation without timing\n\t\tObject.assign(c, scoreComponentWeights(fingerprintA, fingerprintB));\n\t}\n\n\tif (performance) {\n\t\tcomponentTime = Date.now() - componentStart;\n\t}\n\n\t// Calculate weighted score\n\tconst weightStart = performance ? Date.now() : 0;\n\tconst totalWeight = Object.keys(c).reduce(\n\t\t(sum, key) => sum + (weights[key] ?? 0),\n\t\t0\n\t);\n\tconst weightedScore = Object.keys(c).reduce(\n\t\t(sum, key) => sum + (weights[key] ?? 0) * (c[key] ?? 0),\n\t\t0\n\t);\n\tif (performance) {\n\t\tweightTime = Date.now() - weightStart;\n\t}\n\n\t// Ensure score cannot exceed 0.9 without id/selectorPath match\n\tconst scoreResult = Math.min(\n\t\t0.9,\n\t\ttotalWeight > 0 ? weightedScore / totalWeight : 0\n\t);\n\tscoreCache.set(cacheKey, scoreResult);\n\ttrimScoreCache();\n\n\tif (performance) {\n\t\tconst endTime = Date.now();\n\t\tconst totalTime = endTime - startTime;\n\t\tconsole.log(`Score function timing breakdown:`);\n\t\tconsole.log(`- Total time: ${totalTime}ms`);\n\t\tconsole.log(\n\t\t\t`- Hash generation: ${hashTime}ms (${Math.round((hashTime / totalTime) * 100)}%)`\n\t\t);\n\t\tconsole.log(\n\t\t\t`- Exact match checks: ${exactMatchTime}ms (${Math.round((exactMatchTime / totalTime) * 100)}%)`\n\t\t);\n\t\tconsole.log(\n\t\t\t`- Component scoring: ${componentTime}ms (${Math.round((componentTime / totalTime) * 100)}%)`\n\t\t);\n\t\tconsole.log(\n\t\t\t`- Weight calculation: ${weightTime}ms (${Math.round((weightTime / totalTime) * 100)}%)`\n\t\t);\n\t}\n\n\treturn scoreResult;\n}\n\nexport function rankMatches(fps, target, options = {}) {\n\treturn fps\n\t\t.map((fp) => ({ fingerprint: fp, score: score(fp, target, options) }))\n\t\t.sort((a, b) => b.score - a.score);\n}\n\nexport function getBestMatch(fps, target, options = {}) {\n\tconst threshold = options.threshold ?? 0.6;\n\tconst ranked = rankMatches(fps, target, options);\n\treturn ranked[0]?.score >= threshold ? ranked[0] : null;\n}\n\n// Make score function available globally for Web Workers\nif (typeof self !== 'undefined') {\n\tself.score = score;\n\tself.rankMatches = rankMatches;\n\tself.getBestMatch = getBestMatch;\n}\n\nexport default score;\n","import fingerprint from './fingerprint';\nimport { score } from './score';\nimport { querySelectorAllDeep } from 'query-selector-shadow-dom';\n\nfunction isPartialMatch(match) {\n\treturn (\n\t\tmatch.id === true &&\n\t\tmatch.tagName === true &&\n\t\tmatch.classNames?.matches &&\n\t\tObject.values(match.classNames.matches).some(Boolean)\n\t);\n}\n\nexport function match(el, fp, options = {}) {\n\tconst { isMultilingual = false, ignorePosition = false } = options;\n\tconst currentFp = fingerprint(el, {\n\t\tstructureOnly: isMultilingual,\n\t\t...options,\n\t});\n\n\tconst result = {\n\t\tel,\n\t\ttagName: el.tagName.toLowerCase() === fp.tagName,\n\t\tid: fp.id && el.id === fp.id,\n\t\taria: Object.keys(fp.aria || {}).reduce((acc, key) => {\n\t\t\tacc[key] = el.getAttribute(key) === fp.aria[key];\n\t\t\treturn acc;\n\t\t}, {}),\n\t\tdata: Object.keys(fp.data || {}).reduce((acc, key) => {\n\t\t\tacc[key] = el.dataset[key] === fp.data[key];\n\t\t\treturn acc;\n\t\t}, {}),\n\t\tclassNames: diffClassNames(\n\t\t\tfp.classNames || [],\n\t\t\tArray.from(el.classList)\n\t\t),\n\t\tchildrenStructure: fp.childrenStructure === currentFp.childrenStructure,\n\t\tcssSelector: fp.cssSelector === currentFp.cssSelector,\n\t\tsiblingIndex: fp.siblingIndex === currentFp.siblingIndex,\n\t\tframework: currentFp.framework,\n\t\tshadowInfo: currentFp.shadowInfo,\n\t\ttagPath: {\n\t\t\ttarget: fp.tagPath,\n\t\t\tcandidate: currentFp.tagPath,\n\t\t},\n\t};\n\n\tif (!ignorePosition && fp.position?.relativePosition) {\n\t\tresult.position = {\n\t\t\trelativePosition:\n\t\t\t\tcurrentFp.position?.relativePosition?.index ===\n\t\t\t\tfp.position.relativePosition.index,\n\t\t};\n\t}\n\n\treturn isPartialMatch(result) ? result : null;\n}\n\nfunction diffClassNames(base = [], test = []) {\n\treturn {\n\t\tmatches: base.reduce((acc, name) => {\n\t\t\tacc[name] = test.includes(name);\n\t\t\treturn acc;\n\t\t}, {}),\n\t\textraneous: test.filter((name) => !base.includes(name)),\n\t};\n}\n\nexport function findElementByFingerprint(root, fingerprint) {\n\tconst { selectorPath } = fingerprint;\n\tconst results = querySelectorAllDeep(selectorPath.root);\n\tif (results && results.length > 0) {\n\t\treturn results[0];\n\t}\n\treturn null;\n}\n\n/**\n * Find the best matching parent element for a given element by traversing up the DOM tree\n * @param {Element} element - The element to find a parent match for\n * @param {Array} fingerprints - Array of fingerprints to match against\n * @param {Object} options - Options for matching\n * @param {number} maxDepth - Maximum depth to traverse up (default: 10)\n * @returns {Object|null} - Best matching parent with score, or null if no match found\n */\nexport function findBestMatchingParent(\n\telement,\n\tfingerprints = [],\n\toptions = {},\n\tmaxDepth = 10\n) {\n\tconst {\n\t\tthreshold = 0.6,\n\t\tincludeSelf = false,\n\t\ttraverseShadowDom = true,\n\t} = options;\n\n\tif (!element || !fingerprints.length) return null;\n\n\tlet bestMatch = null;\n\tlet bestScore = 0;\n\tlet currentElement = element;\n\tlet depth = 0;\n\n\t// Traverse up the DOM tree\n\twhile (currentElement && depth < maxDepth) {\n\t\t// Skip the first element (the element itself) if it's the starting point\n\t\tif (depth > 0 || includeSelf) {\n\t\t\t// Debug logging removed\n\n\t\t\t// Instead of using match function, directly compare with score\n\t\t\tfor (const fp of fingerprints) {\n\t\t\t\tconst currentFp = fingerprint(currentElement, options);\n\n\t\t\t\t// Check if this is literally the same DOM element\n\n\t\t\t\t// If it's the exact same element, score should be 1.0\n\t\t\t\tconst scoreResult = score(currentFp, fp, options);\n\n\t\t\t\t// Debug logging removed\n\n\t\t\t\tif (scoreResult > bestScore) {\n\t\t\t\t\tbestScore = scoreResult;\n\t\t\t\t\tbestMatch = {\n\t\t\t\t\t\telement: currentElement,\n\t\t\t\t\t\tfingerprint: fp,\n\t\t\t\t\t\tscore: scoreResult,\n\t\t\t\t\t\tdepth: depth,\n\t\t\t\t\t\tisExactMatch: scoreResult === 1,\n\t\t\t\t\t};\n\n\t\t\t\t\t// If we have an exact match, we can exit early\n\t\t\t\t\tif (scoreResult === 1) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Move up to the parent, checking for Shadow DOM boundaries\n\t\tcurrentElement = getNextParentElement(\n\t\t\tcurrentElement,\n\t\t\ttraverseShadowDom\n\t\t);\n\n\t\tdepth++;\n\t}\n\n\t// Also check shadow DOM parent if available\n\tconst rootNode = element.getRootNode();\n\tif (rootNode instanceof ShadowRoot && rootNode.host && depth < maxDepth) {\n\t\tfor (const fp of fingerprints) {\n\t\t\tconst hostFp = fingerprint(rootNode.host, options);\n\t\t\tconst scoreResult = score(hostFp, fp, options);\n\n\t\t\tif (scoreResult > bestScore) {\n\t\t\t\tbestScore = scoreResult;\n\t\t\t\tbestMatch = {\n\t\t\t\t\telement: rootNode.host,\n\t\t\t\t\tfingerprint: fp,\n\t\t\t\t\tscore: scoreResult,\n\t\t\t\t\tdepth: depth,\n\t\t\t\t\tisExactMatch: scoreResult === 1,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t}\n\n\t// Return the best match if it meets the threshold\n\treturn bestScore >= threshold ? bestMatch : null;\n}\n\n/**\n * Helper to get the next parent element, handling both shadow DOM and regular DOM\n * @param {Element} element Current element\n * @param {boolean} traverseShadowDom Whether to traverse shadow DOM boundaries\n * @returns {Element|null} Next parent element or null if none found\n */\nfunction getNextParentElement(element, traverseShadowDom) {\n\t// First try immediate parent in current context\n\tif (element.parentElement) {\n\t\treturn element.parentElement;\n\t}\n\n\t// If no direct parent, check if we're in a shadow root\n\tconst rootNode = element.getRootNode();\n\tif (!(rootNode instanceof ShadowRoot) || !traverseShadowDom) {\n\t\treturn null;\n\t}\n\n\t// We're in a shadow root, check if the element is slotted\n\tconst slot = element.assignedSlot;\n\tif (slot) {\n\t\t// If element is slotted, return the slot's parent\n\t\treturn slot.parentElement;\n\t}\n\n\t// Get the shadow host\n\tconst host = rootNode.host;\n\tif (!host) return null;\n\n\t// Try to find the actual parent element in the host's shadow root\n\tconst hostRoot = host.getRootNode();\n\tif (hostRoot instanceof ShadowRoot) {\n\t\t// The host itself is in a shadow root, look for the parent there\n\t\tconst parentCandidates = Array.from(hostRoot.querySelectorAll('*'));\n\t\tfor (const candidate of parentCandidates) {\n\t\t\t// Check if the candidate contains our element\n\t\t\t// For web components, check their shadow root\n\t\t\tif (\n\t\t\t\tcandidate.shadowRoot &&\n\t\t\t\tcandidate.shadowRoot.contains(element)\n\t\t\t) {\n\t\t\t\treturn candidate;\n\t\t\t}\n\t\t\t// For regular elements, check their children\n\t\t\tif (Array.from(candidate.children).includes(element)) {\n\t\t\t\treturn candidate;\n\t\t\t}\n\t\t}\n\t}\n\n\t// If no parent found in shadow root, return the host\n\treturn host;\n}\n\n/**\n * Helper to yield control back to browser after time slice\n */\nasync function yieldToMain() {\n\treturn new Promise((resolve) => requestAnimationFrame(resolve));\n}\n\n/**\n * Main matching function for elements\n * Find the best matching element by traversing both up and down the DOM tree\n * This handles cases where the event target might be a parent or child of the instrumented element\n *\n * @param {Element} element - The element to find a match for\n * @param {Array} fingerprints - Array of fingerprints to match against\n * @param {Object} options - Options for matching\n * @returns {Promise<Object|null>} - Best matching element with score, or null if no match found\n */\nexport async function findBestMatchingElement(\n\telement,\n\tfingerprints = [],\n\toptions = {}\n) {\n\tconst {\n\t\tthreshold = 0.58,\n\t\tmaxDepthUp = 5, // Maximum depth to traverse up\n\t\tmaxDepthDown = 3, // Maximum depth to traverse down\n\t\ttraverseShadowDom = true, // Whether to traverse shadow DOM\n\t\tperformance = false, // Whether to log performance metrics\n\t\tscorePerformance = false, // Whether to trace score function performance\n\t\ttimeSlice = 8, // Time slice in ms before yielding to browser (half frame at 60fps)\n\t\tenableTimeSlicing = true, // Whether to enable time slicing for better main thread performance\n\t} = options;\n\n\tconst startTime = performance ? Date.now() : 0;\n\tlet parentTraversalTime = 0;\n\tlet childTraversalTime = 0;\n\tlet selfMatchTime = 0;\n\tlet totalElements = 0;\n\tlet parentElements = 0;\n\tlet childElements = 0;\n\n\tif (!element || !fingerprints.length) return null;\n\n\t// Web worker implementation removed\n\n\t// First, check the element itself\n\tconst selfStartTime = performance ? Date.now() : 0;\n\tconst bestSelfMatch = await findBestMatchAsync(element, fingerprints, {\n\t\t...options,\n\t\tperformance: scorePerformance,\n\t\tenableTimeSlicing,\n\t\ttimeSlice,\n\t});\n\tif (performance) {\n\t\tselfMatchTime = Date.now() - selfStartTime;\n\t\ttotalElements++;\n\t}\n\n\t// If the element itself is an exact match, return it\n\tif (bestSelfMatch && bestSelfMatch.score === 1) {\n\t\tif (performance) {\n\t\t\tconst endTime = Date.now();\n\t\t\tconsole.log(`Bidirectional traversal stats:`);\n\t\t\tconsole.log(`- Total time: ${endTime - startTime}ms`);\n\t\t\tconsole.log(\n\t\t\t\t`- Elements checked: ${totalElements} (self only - exact match)`\n\t\t\t);\n\t\t\tconsole.log(`- Self-match time: ${selfMatchTime}ms`);\n\t\t}\n\t\treturn bestSelfMatch;\n\t}\n\n\t// Continue searching even if self match is above threshold - we want to find the best overall match\n\n\t// Find parent matches\n\tconst parentStartTime = performance ? Date.now() : 0;\n\tconst parentMatches = await findBestMatchingParentsWithShadowAsync(\n\t\telement,\n\t\tfingerprints,\n\t\t{\n\t\t\t...options,\n\t\t\tmaxDepth: maxDepthUp,\n\t\t\ttraverseShadowDom,\n\t\t\tperformance,\n\t\t\tscorePerformance,\n\t\t\tenableTimeSlicing,\n\t\t\ttimeSlice,\n\t\t}\n\t);\n\tif (performance) {\n\t\tparentTraversalTime = Date.now() - parentStartTime;\n\t\tparentElements = parentMatches.length;\n\t\ttotalElements += parentElements;\n\t}\n\n\t// Find child matches\n\tconst childStartTime = performance ? Date.now() : 0;\n\tconst childMatches = await findBestMatchingChildrenAsync(\n\t\telement,\n\t\tfingerprints,\n\t\t{\n\t\t\t...options,\n\t\t\ttraverseShadowDom,\n\t\t\trespectShadowBoundaries: false,\n\t\t\t// Pass performance flag to child traversal\n\t\t\tperformance,\n\t\t\tscorePerformance,\n\t\t\tenableTimeSlicing,\n\t\t\ttimeSlice,\n\t\t},\n\t\tmaxDepthDown\n\t); // Pass maxDepthDown as 4th positional parameter\n\n\tif (performance) {\n\t\tchildTraversalTime = Date.now() - childStartTime;\n\t\tchildElements = childMatches.length;\n\t\ttotalElements += childElements;\n\t}\n\n\t// Combine all matches\n\tconst allMatches = [\n\t\t...(bestSelfMatch ? [bestSelfMatch] : []),\n\t\t...parentMatches,\n\t\t...childMatches,\n\t];\n\n\tif (allMatches.length === 0) {\n\t\tif (performance) {\n\t\t\tconst endTime = Date.now();\n\t\t\tconsole.log(`Bidirectional traversal stats:`);\n\t\t\tconsole.log(`- Total time: ${endTime - startTime}ms`);\n\t\t\tconsole.log(\n\t\t\t\t`- Elements checked: ${totalElements} (no matches found)`\n\t\t\t);\n\t\t\tconsole.log(\n\t\t\t\t`- Parent traversal: ${parentTraversalTime}ms (${parentElements} elements)`\n\t\t\t);\n\t\t\tconsole.log(\n\t\t\t\t`- Child traversal: ${childTraversalTime}ms (${childElements} elements)`\n\t\t\t);\n\t\t\tconsole.log(`- Self-match time: ${selfMatchTime}ms`);\n\t\t}\n\t\treturn null;\n\t}\n\n\t// Sort matches by score and proximity, with higher priority to score\n\tallMatches.sort((a, b) => {\n\t\t// If scores are significantly different, prioritize score\n\t\tconst scoreDiff = b.score - a.score;\n\t\tif (Math.abs(scoreDiff) > 0.2) return scoreDiff;\n\n\t\t// Otherwise consider proximity as well (closer elements preferred)\n\t\treturn b.proximity - a.proximity;\n\t});\n\n\tconst result = allMatches[0];\n\n\tif (performance) {\n\t\tconst endTime = Date.now();\n\t\tconsole.log(`Bidirectional traversal stats:`);\n\t\tconsole.log(`- Total time: ${endTime - startTime}ms`);\n\t\tconsole.log(`- Elements checked: ${totalElements}`);\n\t\tconsole.log(\n\t\t\t`- Parent traversal: ${parentTraversalTime}ms (${parentElements} elements)`\n\t\t);\n\t\tconsole.log(\n\t\t\t`- Child traversal: ${childTraversalTime}ms (${childElements} elements)`\n\t\t);\n\t\tconsole.log(`- Self-match time: ${selfMatchTime}ms`);\n\t\tconsole.log(\n\t\t\t`- Best match score: ${result.score} (at depth ${result.depth})`\n\t\t);\n\t\tconsole.log(\n\t\t\t`- UXF component match: ${result.fingerprint.tagName?.toLowerCase().startsWith('now-') ? 'Yes' : 'No'}`\n\t\t);\n\t}\n\n\treturn result;\n}\n\n/**\n * Async version of findBestMatchingParentsWithShadow with time-slicing support\n * @param {Element} element - The element to find parent matches for\n * @param {Array} fingerprints - Array of fingerprints to match against\n * @param {Object} options - Options for matching\n * @returns {Promise<Array>} - Array of matching parents with scores and proximity info\n */\nasync function findBestMatchingParentsWithShadowAsync(\n\telement,\n\tfingerprints,\n\toptions = {}\n) {\n\tconst {\n\t\tmaxDepth = 5,\n\t\ttraverseShadowDom = true,\n\t\tthreshold = 0.6,\n\t\tperformance = false,\n\t\tenableTimeSlicing = true,\n\t\ttimeSlice = 8,\n\t} = options;\n\n\tif (!element || !fingerprints.length) return [];\n\n\tconst startTime = performance ? Date.now() : 0;\n\tlet fingerprintGenerationTime = 0;\n\tlet scoreComparisonTime = 0;\n\tlet elementsProcessed = 0;\n\tlet fullComparisonsCount = 0;\n\tlet yieldCount = 0;\n\n\tlet currentElement = element;\n\tlet depth = 0;\n\tconst matches = [];\n\tlet sliceStart = window.performance.now();\n\n\twhile (currentElement && depth <= maxDepth) {\n\t\t// Skip the first element (we process this separately in findBestMatchingElement)\n\t\tif (depth > 0) {\n\t\t\telementsProcessed++;\n\n\t\t\t// Generate fingerprint only once for this element\n\t\t\tconst fpStartTime = performance ? Date.now() : 0;\n\t\t\tconst currentFp = fingerprint(currentElement, options);\n\t\t\tif (performance) {\n\t\t\t\tfingerprintGenerationTime += Date.now() - fpStartTime;\n\t\t\t}\n\n\t\t\t// Compare against all fingerprints directly\n\t\t\tfor (let i = 0; i < fingerprints.length; i++) {\n\t\t\t\tconst fp = fingerprints[i];\n\t\t\t\tconst scoreStartTime = performance ? Date.now() : 0;\n\t\t\t\tconst scoreResult = score(currentFp, fp, options);\n\t\t\t\tif (performance) {\n\t\t\t\t\tscoreComparisonTime += Date.now() - scoreStartTime;\n\t\t\t\t}\n\t\t\t\tfullComparisonsCount++;\n\n\t\t\t\tif (scoreResult >= threshold) {\n\t\t\t\t\tmatches.push({\n\t\t\t\t\t\telement: currentElement,\n\t\t\t\t\t\tfingerprint: fp,\n\t\t\t\t\t\tscore: scoreResult,\n\t\t\t\t\t\tdepth,\n\t\t\t\t\t\tproximity: 1 - depth / (maxDepth + 1),\n\t\t\t\t\t\tisExactMatch: scoreResult === 1,\n\t\t\t\t\t});\n\n\t\t\t\t\t// If we have an exact match, we can return immediately\n\t\t\t\t\tif (scoreResult === 1) {\n\t\t\t\t\t\tif (performance) {\n\t\t\t\t\t\t\tconst endTime = Date.now();\n\t\t\t\t\t\t\tconsole.log(`Parent traversal stats:`);\n\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\t`- Total time for parent matching: ${endTime - startTime}ms`\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\t`- Elements processed: ${elementsProcessed}`\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\t`- Full comparisons: ${fullComparisonsCount}`\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\t`- Time spent generating fingerprints: ${fingerprintGenerationTime}ms`\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\t`- Time spent on score comparisons: ${scoreComparisonTime}ms`\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\t`- Average time per element: ${endTime - startTime}ms`\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\t`- Found exact match at depth: ${depth}`\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tconsole.log(`- Yields: ${yieldCount}`);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn matches;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Time-slicing: yield after processing at max 10 fingerprints if we've exceeded time budget\n\t\t\t\tif (\n\t\t\t\t\tenableTimeSlicing &&\n\t\t\t\t\ti > 0 &&\n\t\t\t\t\ti % 10 === 0 &&\n\t\t\t\t\twindow.performance.now() - sliceStart >= timeSlice\n\t\t\t\t) {\n\t\t\t\t\tawait yieldToMain();\n\t\t\t\t\tyieldCount++;\n\t\t\t\t\tsliceStart = window.performance.now();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Time-slicing: yield after processing this element if we've exceeded time budget\n\t\tif (\n\t\t\tenableTimeSlicing &&\n\t\t\twindow.performance.now() - sliceStart >= timeSlice\n\t\t) {\n\t\t\tawait yieldToMain();\n\t\t\tyieldCount++;\n\t\t\tsliceStart = window.performance.now();\n\t\t}\n\n\t\t// First try immediate parent\n\t\tcurrentElement = getNextParentElement(\n\t\t\tcurrentElement,\n\t\t\ttraverseShadowDom\n\t\t);\n\n\t\tdepth++;\n\t}\n\n\tif (performance) {\n\t\tconst endTime = Date.now();\n\t\tconsole.log(`Parent traversal stats:`);\n\t\tconsole.log(\n\t\t\t`- Total time for parent matching: ${endTime - startTime}ms`\n\t\t);\n\t\tconsole.log(`- Elements processed: ${elementsProcessed}`);\n\t\tconsole.log(`- Full comparisons: ${fullComparisonsCount}`);\n\t\tconsole.log(\n\t\t\t`- Time spent generating fingerprints: ${fingerprintGenerationTime}ms`\n\t\t);\n\t\tconsole.log(\n\t\t\t`- Time spent on score comparisons: ${scoreComparisonTime}ms`\n\t\t);\n\t\tconsole.log(`- Average time per element: ${endTime - startTime}ms`);\n\t\tconsole.log(`- Yields: ${yieldCount}`);\n\t}\n\n\treturn matches;\n}\n\n/**\n * Async version of findBestMatchingChildren with time-slicing support\n * @param {Element} element - The element to find children matches for\n * @param {Array} fingerprints - Array of fingerprints to match against\n * @param {Object} options - Options for matching\n * @param {number} maxDepth - Maximum depth to traverse down\n * @returns {Promise<Array>} - Array of matching children with scores and proximity info\n */\nasync function findBestMatchingChildrenAsync(\n\telement,\n\tfingerprints = [],\n\toptions = {},\n\tmaxDepth = 3\n) {\n\tconst {\n\t\ttraverseShadowDom = true,\n\t\tmaxChildElements = 50,\n\t\tpriorityElements = ['button', 'span', 'svg', 'path'],\n\t\tperformance = false,\n\t\trespectShadowBoundaries = true,\n\t\tthreshold = 0.58,\n\t\tenableTimeSlicing = true,\n\t\ttimeSlice = 8,\n\t} = options;\n\n\tif (!element || !fingerprints.length) return [];\n\n\tconst seenElements = new Set();\n\tconst matches = [];\n\n\t// Performance tracking\n\tconst startTime = performance ? Date.now() : 0;\n\tlet fingerptintTime = 0;\n\tlet scoreComparisonTime = 0;\n\tlet elementsProcessed = 0;\n\tlet fullComparisons = 0;\n\tlet yieldCount = 0;\n\n\t// Queue for breadth-first traversal\n\tconst queue = [{ element, depth: 0, crossedShadowBoundary: false }];\n\tlet elementsChecked = 0;\n\tlet sliceStart = window.performance.now();\n\n\twhile (queue.length > 0 && elementsChecked < maxChildElements) {\n\t\tconst {\n\t\t\telement: currentElement,\n\t\t\tdepth,\n\t\t\tcrossedShadowBoundary,\n\t\t} = queue.shift();\n\n\t\t// If we're already at max depth, don't process this element\n\t\tif (depth > maxDepth) continue;\n\n\t\t// Skip elements we've already seen\n\t\tif (seenElements.has(currentElement)) continue;\n\t\tseenElements.add(currentElement);\n\n\t\tconst isShadowHost =\n\t\t\tcurrentElement.shadowRoot !== null &&\n\t\t\tcurrentElement.shadowRoot !== undefined;\n\n\t\tif (\n\t\t\trespectShadowBoundaries &&\n\t\t\tcrossedShadowBoundary &&\n\t\t\t!traverseShadowDom\n\t\t)\n\t\t\tcontinue;\n\n\t\t// Process the current element\n\t\telementsChecked++;\n\t\telementsProcessed++;\n\n\t\t// Generate fingerprint for current element\n\t\tconst fpStartTime = performance ? Date.now() : 0;\n\t\tconst currentFp = fingerprint(currentElement, options);\n\t\tif (performance) {\n\t\t\tfingerptintTime += Date.now() - fpStartTime;\n\t\t}\n\n\t\t// Compare against all fingerprints directly\n\t\tfor (let i = 0; i < fingerprints.length; i++) {\n\t\t\tconst fp = fingerprints[i];\n\t\t\tconst scoreStartTime = performance ? Date.now() : 0;\n\t\t\tconst scoreResult = score(currentFp, fp, options);\n\t\t\tif (performance) {\n\t\t\t\tscoreComparisonTime += Date.now() - scoreStartTime;\n\t\t\t}\n\n\t\t\tfullComparisons++;\n\n\t\t\tif (scoreResult >= threshold) {\n\t\t\t\tmatches.push({\n\t\t\t\t\telement: currentElement,\n\t\t\t\t\tfingerprint: fp,\n\t\t\t\t\tscore: scoreResult,\n\t\t\t\t\tdepth,\n\t\t\t\t\tproximity: 1 - depth / (maxDepth + 1),\n\t\t\t\t\tisExactMatch: scoreResult === 1,\n\t\t\t\t});\n\n\t\t\t\t// If we found an exact match, we can return early\n\t\t\t\tif (scoreResult === 1) {\n\t\t\t\t\tif (performance) {\n\t\t\t\t\t\tconst totalTime = Date.now() - startTime;\n\t\t\t\t\t\tconsole.log('Child traversal stats:');\n\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t`- Total time for child matching: ${totalTime}ms`\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconsole.log(`- Exact match found at depth ${depth}!`);\n\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t`- Elements processed: ${elementsProcessed}`\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconsole.log(`- Full comparisons: ${fullComparisons}`);\n\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t`- Time spent generating fingerprints: ${fingerptintTime}ms`\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t`- Time spent on score comparisons: ${scoreComparisonTime}ms`\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t`- Average time per element: ${totalTime / elementsProcessed}ms`\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t`- Fingerprint vs scoring time ratio: ${fingerptintTime}:${scoreComparisonTime}`\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconsole.log(`- Yields: ${yieldCount}`);\n\t\t\t\t\t}\n\t\t\t\t\treturn matches;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Time-slicing: yield after processing at max 10 fingerprints if we've exceeded time budget\n\t\t\tif (\n\t\t\t\tenableTimeSlicing &&\n\t\t\t\ti > 0 &&\n\t\t\t\ti % 10 === 0 &&\n\t\t\t\twindow.performance.now() - sliceStart >= timeSlice\n\t\t\t) {\n\t\t\t\tawait yieldToMain();\n\t\t\t\tyieldCount++;\n\t\t\t\tsliceStart = window.performance.now();\n\t\t\t}\n\t\t}\n\n\t\t// Time-slicing: yield after processing this element if we've exceeded time budget\n\t\tif (\n\t\t\tenableTimeSlicing &&\n\t\t\twindow.performance.now() - sliceStart >= timeSlice\n\t\t) {\n\t\t\tawait yieldToMain();\n\t\t\tyieldCount++;\n\t\t\tsliceStart = window.performance.now();\n\t\t}\n\n\t\t// Add children to the queue for breadth-first traversal\n\t\tconst childNodes = Array.from(currentElement.children || []);\n\n\t\t// Sort children to prioritize interactive elements\n\t\tchildNodes.sort((a, b) => {\n\t\t\tconst aIsPriority = priorityElements.includes(\n\t\t\t\ta.tagName?.toLowerCase()\n\t\t\t);\n\t\t\tconst bIsPriority = priorityElements.includes(\n\t\t\t\tb.tagName?.toLowerCase()\n\t\t\t);\n\n\t\t\tif (aIsPriority && !bIsPriority) return -1;\n\t\t\tif (!aIsPriority && bIsPriority) return 1;\n\t\t\treturn 0;\n\t\t});\n\n\t\t// Enqueue children\n\t\tfor (const child of childNodes) {\n\t\t\tqueue.push({\n\t\t\t\telement: child,\n\t\t\t\tdepth: depth + 1,\n\t\t\t\tcrossedShadowBoundary: crossedShadowBoundary || isShadowHost,\n\t\t\t});\n\t\t}\n\n\t\t// Also traverse shadow DOM if enabled and this element has a shadow root\n\t\tif (traverseShadowDom && isShadowHost) {\n\t\t\tconst shadowRoot = currentElement.shadowRoot;\n\t\t\tconst shadowChildren = Array.from(shadowRoot.children || []);\n\n\t\t\t// Enqueue shadow children\n\t\t\tfor (const shadowChild of shadowChildren) {\n\t\t\t\tqueue.push({\n\t\t\t\t\telement: shadowChild,\n\t\t\t\t\tdepth: depth + 1,\n\t\t\t\t\tcrossedShadowBoundary: true,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\tif (performance) {\n\t\tconst totalTime = Date.now() - startTime;\n\t\tconsole.log('Child traversal stats:');\n\t\tconsole.log(`- Total time for child matching: ${totalTime}ms`);\n\t\tconsole.log(`- Elements processed: ${elementsProcessed}`);\n\t\tconsole.log(`- Full comparisons: ${fullComparisons}`);\n\t\tconsole.log(\n\t\t\t`- Time spent generating fingerprints: ${fingerptintTime}ms`\n\t\t);\n\t\tconsole.log(\n\t\t\t`- Time spent on score comparisons: ${scoreComparisonTime}ms`\n\t\t);\n\t\tconsole.log(\n\t\t\t`- Average time per element: ${totalTime / elementsProcessed}ms`\n\t\t);\n\t\tconsole.log(\n\t\t\t`- Fingerprint vs scoring time ratio: ${fingerptintTime}:${scoreComparisonTime}`\n\t\t);\n\t\tconsole.log(`- Yields: ${yieldCount}`);\n\t}\n\n\treturn matches;\n}\n\n/**\n * Async version of findBestMatch with time-slicing support\n * @param {Element} element - The element to match\n * @param {Array} fingerprints - Array of fingerprints to match against\n * @param {Object} options - Options for matching\n * @returns {Promise<Object|null>} - Best match or null\n */\nasync function findBestMatchAsync(element, fingerprints = [], options = {}) {\n\tif (!element || !fingerprints.length) return null;\n\n\tconst {\n\t\tthreshold = 0.6,\n\t\tperformance = false,\n\t\tenableTimeSlicing = true,\n\t\ttimeSlice = 8,\n\t} = options;\n\n\tlet bestMatch = null;\n\tlet bestScore = 0;\n\n\t// Generate fingerprint only once for this element\n\tconst startTime = performance ? Date.now() : 0;\n\tconst currentFp = fingerprint(element, options);\n\tconst fpTime = performance ? Date.now() - startTime : 0;\n\n\tlet sliceStart = window.performance.now();\n\tlet yieldCount = 0;\n\n\t// Compare against all fingerprints directly\n\tfor (let i = 0; i < fingerprints.length; i++) {\n\t\tconst fp = fingerprints[i];\n\t\tconst scoreResult = score(currentFp, fp, options);\n\n\t\tif (scoreResult > bestScore) {\n\t\t\tbestScore = scoreResult;\n\t\t\tbestMatch = {\n\t\t\t\telement: element,\n\t\t\t\tfingerprint: fp,\n\t\t\t\tscore: scoreResult,\n\t\t\t\tdepth: 0,\n\t\t\t\tisExactMatch: scoreResult === 1,\n\t\t\t};\n\n\t\t\t// If we have an exact match, we can exit early\n\t\t\tif (scoreResult === 1) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t// Time-slicing: yield periodically when processing many fingerprints\n\t\tif (\n\t\t\tenableTimeSlicing &&\n\t\t\ti > 0 &&\n\t\t\ti % 10 === 0 &&\n\t\t\twindow.performance.now() - sliceStart >= timeSlice\n\t\t) {\n\t\t\tawait yieldToMain();\n\t\t\tyieldCount++;\n\t\t\tsliceStart = window.performance.now();\n\t\t}\n\t}\n\n\tif (performance) {\n\t\tconst totalTime = Date.now() - startTime;\n\t\tconsole.log(`Self match stats:`);\n\t\tconsole.log(`- Total time: ${totalTime}ms`);\n\t\tconsole.log(`- Fingerprint generation: ${fpTime}ms`);\n\t\tconsole.log(`- Score comparisons: ${totalTime - fpTime}ms`);\n\t\tconsole.log(`- Best match score: ${bestScore}`);\n\t\tconsole.log(`- Yields: ${yieldCount}`);\n\t}\n\n\treturn bestScore >= threshold ? bestMatch : null;\n}\n\n/**\n * Does recursive calls to go through entire dom structure and find matching elements for fingerprints\n * @param {*} rootEl\n * @param {*} fingerprints\n * @param {*} options\n */\nexport default function find(rootEl, fingerprints = [], options = {}) {\n\tconst {\n\t\tisMultilingual = false,\n\t\tignorePosition = false,\n\t\tfinds = [],\n\t} = options;\n\n\tconst treeWalker = document.createTreeWalker(\n\t\trootEl,\n\t\tNodeFilter.SHOW_ELEMENT,\n\t\tnull\n\t);\n\n\tlet current = rootEl instanceof Element ? rootEl : treeWalker.nextNode();\n\n\twhile (current) {\n\t\tfor (let i = 0; i < fingerprints.length; i++) {\n\t\t\tconst fp = fingerprints[i];\n\t\t\tconst matched = match(current, fp, {\n\t\t\t\tisMultilingual,\n\t\t\t\tignorePosition,\n\t\t\t\t...options,\n\t\t\t});\n\t\t\tif (matched) {\n\t\t\t\tfinds.push({ match: matched, fingerprint: fp });\n\t\t\t}\n\t\t}\n\n\t\tif (current.shadowRoot) {\n\t\t\tfind(current.shadowRoot, fingerprints, {\n\t\t\t\tisMultilingual,\n\t\t\t\tignorePosition,\n\t\t\t\tfinds,\n\t\t\t});\n\t\t}\n\n\t\tcurrent = treeWalker.nextNode();\n\t}\n\n\treturn fingerprints.map((fp) => ({\n\t\tfingerprint: fp,\n\t\tmatches: finds.filter((f) => f.fingerprint === fp).map((f) => f.match),\n\t}));\n}\n","// Enhanced path generation for DOM elements with support for shadow DOM\nexport default function getPath(el, options = {}) {\n\tconst { maxDepth = 500, includeShadowInfo = true } = options;\n\n\tconst ancestors = [];\n\tlet shadowRoots = [];\n\tlet depth = 0;\n\n\tlet current = el;\n\n\twhile (current && depth < maxDepth) {\n\t\t// Add the current element to the path\n\t\tconst ancestorInfo = {\n\t\t\telement: current,\n\t\t};\n\n\t\t// Add shadow DOM context if enabled\n\t\tif (includeShadowInfo && shadowRoots.length > 0) {\n\t\t\tancestorInfo.shadowContext = [...shadowRoots];\n\t\t}\n\n\t\tancestors.push(ancestorInfo);\n\t\tdepth++;\n\n\t\t// Navigate to parent\n\t\tif (current.parentNode && current.parentNode instanceof Element) {\n\t\t\tcurrent = current.parentNode;\n\t\t} else {\n\t\t\tconst root = current.getRootNode();\n\n\t\t\tif (root instanceof ShadowRoot) {\n\t\t\t\t// Track shadow root information\n\t\t\t\tif (includeShadowInfo) {\n\t\t\t\t\tshadowRoots.push({\n\t\t\t\t\t\tmode: root.mode,\n\t\t\t\t\t\thost: root.host.tagName.toLowerCase(),\n\t\t\t\t\t\thostId: root.host.id,\n\t\t\t\t\t\thostClasses: Array.from(root.host.classList),\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// Cross shadow boundary\n\t\t\t\tcurrent = root.host;\n\t\t\t} else {\n\t\t\t\t// Reached the top of the tree\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn ancestors;\n}\n\n// Gets a unique selector path for an element\nexport function getSelectorPath(el) {\n\tconst path = [];\n\tlet current = el;\n\n\twhile (current && current.nodeType === Node.ELEMENT_NODE) {\n\t\t// Create a selector for this element\n\t\tlet selector = current.tagName.toLowerCase();\n\n\t\t// Add ID if available (most specific)\n\t\tif (current.id) {\n\t\t\tselector += `#${current.id}`;\n\t\t\tpath.unshift(selector);\n\t\t\tbreak; // ID is unique, no need to go further\n\t\t}\n\n\t\t// Add classes\n\t\tif (current.classList.length) {\n\t\t\tselector += '.' + Array.from(current.classList).join('.');\n\t\t}\n\n\t\t// Add position if needed\n\t\tif (current.parentNode) {\n\t\t\tconst siblings = Array.from(current.parentNode.children).filter(\n\t\t\t\t(child) => child.tagName === current.tagName\n\t\t\t);\n\n\t\t\tif (siblings.length > 1) {\n\t\t\t\tconst index = siblings.indexOf(current) + 1;\n\t\t\t\tselector += `:nth-of-type(${index})`;\n\t\t\t}\n\t\t}\n\n\t\tpath.unshift(selector);\n\n\t\t// Check if we're in a shadow DOM\n\t\tconst root = current.getRootNode();\n\t\tif (root instanceof ShadowRoot) {\n\t\t\t// Add shadow host marker\n\t\t\tpath.unshift('::shadow-host');\n\t\t\tcurrent = root.host;\n\t\t} else {\n\t\t\t// Regular DOM traversal\n\t\t\tcurrent =\n\t\t\t\tcurrent.parentNode instanceof Element\n\t\t\t\t\t? current.parentNode\n\t\t\t\t\t: null;\n\t\t}\n\t}\n\n\treturn path.join(' > ');\n}\n\n// Gets a compact representation of the path for storage and comparison\nexport function getCompactPath(el) {\n\treturn getPath(el).map((ancestor) => {\n\t\t// For each ancestor, store minimal identifying information\n\t\treturn {\n\t\t\ttagName: ancestor.element.tagName.toLowerCase(),\n\t\t\tid: ancestor.element.id || null,\n\t\t\tclasses: ancestor.element.classList.length\n\t\t\t\t? Array.from(ancestor.element.classList)\n\t\t\t\t: null,\n\t\t\t// Include nth-child position for more precise matching\n\t\t\tposition: ancestor.element.parentNode\n\t\t\t\t? Array.from(ancestor.element.parentNode.children).indexOf(\n\t\t\t\t\t\tancestor.element\n\t\t\t\t\t)\n\t\t\t\t: null,\n\t\t};\n\t});\n}\n","export var LogLevel;\n(function (LogLevel) {\n\tLogLevel[(LogLevel['debug'] = 0)] = 'debug';\n\tLogLevel[(LogLevel['info'] = 1)] = 'info';\n\tLogLevel[(LogLevel['warn'] = 2)] = 'warn';\n\tLogLevel[(LogLevel['error'] = 3)] = 'error';\n})(LogLevel || (LogLevel = {}));\nexport var TrackingLevel;\n(function (TrackingLevel) {\n\tTrackingLevel['Disabled'] = 'Disabled';\n\tTrackingLevel['Basic'] = 'Basic';\n\tTrackingLevel['Full'] = 'Full';\n\tTrackingLevel['Essential'] = 'Essential';\n})(TrackingLevel || (TrackingLevel = {}));\nexport var UXCollectionMode;\n(function (UXCollectionMode) {\n\tUXCollectionMode['Both'] = 'Both';\n\tUXCollectionMode['Valk'] = 'Valk';\n\tUXCollectionMode['Legacy'] = 'Legacy';\n})(UXCollectionMode || (UXCollectionMode = {}));\n","/**\n * Check if the given argument is `undefined`\n */\nexport const isUndefined = (value) => typeof value === 'undefined';\n/**\n * Check if the given argument is not `undefined`\n */\nexport const isDefined = (value) => !isUndefined(value);\n/**\n * Checks if the given argument is null or undefined\n */\nexport const isNullOrUndefined = (value) =>\n\tisUndefined(value) || value === null;\n/**\n * Checks if the given argument is string\n */\nexport const isString = (value) => typeof value === 'string';\n/**\n * Checks if the given argument is a string and is also not all whitespace\n */\nexport const isNonEmptyString = (value) =>\n\tisString(value) && Boolean(value.trim());\n/**\n * Checks if the given argument is a number. NaN is not considered as a number\n */\nexport const isNumber = (value) =>\n\ttypeof value === 'number' && !Number.isNaN(value);\n/**\n * Checks if the given argument is an integer. Uses `isNumber` and a modulo check to eliminate floats\n */\nexport const isInteger = (value) => isNumber(value) && value % 1 === 0;\n/**\n * Checks if the given argument is a positive integer.\n */\nexport const isPositiveInteger = (value, allowZero = false) =>\n\tisInteger(value) && (value > 0 || (allowZero && value === 0));\n/**\n * Checks if the given argument is a boolean\n */\nexport const isBoolean = (value) => typeof value === 'boolean';\n/**\n * Checks if the given argument is an instance of a date\n */\nexport const isDate = (value) => value instanceof Date;\n/**\n * Checks if the given argument is a plain object. Returns false for function and array\n */\nexport const isObject = function (value) {\n\treturn value !== null && typeof value === 'object' && !Array.isArray(value);\n};\n/**\n * Checks if the given argument is an array\n */\nexport const isArray = (value) => Array.isArray(value);\n/**\n * Checks if the given argument is a function\n */\nexport const isFunction = (value) => typeof value === 'function';\n/**\n * Checks if the given argument is a promise\n */\nexport const isPromise = (value) =>\n\t!!value && isFunction(value.then) && isFunction(value.catch);\n/**\n * Checks if `value` is an actual value of the enum `enumClass`\n */\nexport const isEnum = (enumClass, value) =>\n\tObject.values(enumClass).includes(value);\n","// See: https://github.com/Microsoft/TypeScript-wiki/blob/master/Breaking-Changes.md#extending-built-ins-like-error-array-and-map-may-no-longer-work\n// Important to call this method at the end of each constructor of a class that extends Error\nfunction setSelfPrototype(obj, className) {\n\t// Set the prototype explicitly.\n\tObject.setPrototypeOf(obj, className.prototype);\n\tobj.name = obj.constructor.name;\n}\n/**\n * Base error with `SNAnalytics` name at the beginning of the message\n */\nexport class SNError extends Error {\n\tconstructor(message) {\n\t\tsuper(`[SNAnalytics] ${message}`);\n\t\tsetSelfPrototype(this, SNError);\n\t}\n}\n/**\n * Used for a custom TypeError\n */\nexport class SNTypeError extends SNError {\n\tconstructor(message) {\n\t\tsuper(message);\n\t\tsetSelfPrototype(this, SNTypeError);\n\t}\n}\n/**\n * Used for server calls errors.\n * Holds the http error code on `errorCode` property.\n */\nexport class HttpError extends SNError {\n\tconstructor(errorCode) {\n\t\tsuper(`Server call failed: ${errorCode}`);\n\t\tsetSelfPrototype(this, HttpError);\n\t\tthis.errorCode = errorCode;\n\t}\n}\n","/**\n * Returns a new string without trailing slashes\n */\nimport Consts from '../consts';\n\nexport const removeTrailingSlash = (value) => value.replace(/\\/+$/, '');\n\nconst getRandomHexadecimal = () =>\n\tConsts.inBrowser && window.crypto\n\t\t? window.crypto.getRandomValues(new Uint8Array(1))[0] & 15 // Use crypto whenever possible\n\t\t: (Math.random() * 16) | 0; // Fallback to Math.random\n// https://stackoverflow.com/a/2117523\nconst uuidV4 = () =>\n\t[1e7, 1e3, 4e3, 8e3, 1e11]\n\t\t.join('-')\n\t\t.replace(/[018]/g, (c) =>\n\t\t\t(Number(c) ^ (getRandomHexadecimal() >> (Number(c) / 4))).toString(\n\t\t\t\t16\n\t\t\t)\n\t\t);\n\n/**\n * Get new guid without dashes and ensure lowercase\n */\nexport const getGuid = () => uuidV4().replace(/-/g, '').toLowerCase();\n","import { isNonEmptyString } from './validators';\nimport { LogLevel, TrackingLevel } from './types';\nimport { SNTypeError } from './errors';\nimport { removeTrailingSlash } from './utils/string-utils';\nimport { version } from '../../../../package.json';\n\nexport default class Consts {\n\tstatic set inBrowser(value) {\n\t\tthis.inBrowserWindow = value;\n\t}\n\tstatic get inBrowser() {\n\t\treturn this.inBrowserWindow;\n\t}\n\tstatic set baseUrl(url) {\n\t\tif (!isNonEmptyString(url)) {\n\t\t\tthrow new SNTypeError('Server endpoint cannot be empty');\n\t\t}\n\t\tthis.baseServerUrl = removeTrailingSlash(url);\n\t}\n\tstatic get baseUrl() {\n\t\treturn this.baseServerUrl;\n\t}\n}\n\nConsts.allowedSystemProperties = ['SN_FingerPrintHash', 'SN_SelectorPath', 'SN_event_type'];\n\nConsts.instanceDomainName = '';\n// Read `process.env.*` defined on webpack plugin `EnvironmentPlugin` at `webpack.{common|dev|prod}.ts` files\nConsts.baseServerUrl = 'https://api-appsee.service-now.com';\n// `process.env.NODE_ENV` is defined when using `mode` in webpack config (value is `mode`)\nConsts.IS_PRODUCTION = true;\nConsts.inBrowserWindow =\n\t(typeof window !== 'undefined' && typeof document !== 'undefined') ||\n\t(typeof globalThis !== 'undefined' &&\n\t\ttypeof globalThis.window !== 'undefined');\nConsts.VERSION = version;\nConsts.DEFAULT_CLIENT_ID = '0';\nConsts.DEFAULT_LOG_LEVEL = Consts.IS_PRODUCTION\n\t? LogLevel.error\n\t: LogLevel.debug;\nConsts.DEFAULT_TRACKING_CONSENT = TrackingLevel.Disabled;\nConsts.MAX_METRIC_CALL_ATTEMPTS = 2;\nConsts.SYSTEM_PROPERTY_PREFIX = 'SN_';\nConsts.LOGGER_PREFIX = '[SNAnalytics]';\n","import { isNumber, isString } from '../validators';\n/**\n * Returns true is `obj` has no entries\n */\nexport const isEmptyObject = (obj) => Object.keys(obj).length === 0;\n/**\n * Returns a subset of obj without the entries that have falsy values\n */\nexport const removeFalsyEntries = (obj) =>\n\tObject.fromEntries(\n\t\tObject.entries(obj).filter(([, /* key */ value]) => Boolean(value))\n\t);\n/**\n * Creates an object with the same values as `obj` and keys generated by\n * running each own enumerable string keyed property of object through the callback.\n * @param obj Object to map\n * @param fn The function `fn` is called one time for each element in the object and returns a ney key.\n */\nexport const mapKeys = (obj, fn) =>\n\tObject.fromEntries(\n\t\tObject.entries(obj).map(([key, value]) => [fn(value, key), value])\n\t);\n/**\n * Creates an object with the same keys as `obj` and values generated by\n * running each own enumerable string keyed property of object through the callback.\n * @param obj Object to map\n * @param fn The function `fn` is called one time for each element in the object and returns a new value.\n */\nexport const mapValues = (obj, fn) =>\n\tObject.fromEntries(\n\t\tObject.entries(obj).map(([key, value]) => [key, fn(value, key)])\n\t);\n/**\n * Returns a valid value of `enumObj` if it exists or `undefined` if it's not\n * @param keyOrValue Key or value of `enumObj`\n * @param enumObj Enum class\n */\nexport const tryGetEnumValue = (keyOrValue, enumObj, ignoreCase = false) => {\n\ttry {\n\t\t// Build mappings from key to value and from value to value\n\t\t// Use `Map` and not `object` since Map allow a key to be numeric\n\t\tconst mapKeyToValue = new Map();\n\t\tconst mapValueToValue = new Map();\n\t\tObject.entries(enumObj).forEach(([key, value]) => {\n\t\t\t// Filter out reverse mapped numeric values so we won't get mapping from value to key as well\n\t\t\tif (!isNumber(parseInt(key, 10))) {\n\t\t\t\tmapKeyToValue.set(ignoreCase ? key.toLowerCase() : key, value);\n\t\t\t\tmapValueToValue.set(\n\t\t\t\t\tignoreCase && isString(value) ? value.toLowerCase() : value,\n\t\t\t\t\tvalue\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\t\tconst searchKeyOrValue =\n\t\t\tignoreCase && isString(keyOrValue)\n\t\t\t\t? keyOrValue.toLowerCase()\n\t\t\t\t: keyOrValue;\n\t\treturn (\n\t\t\tmapKeyToValue.get(searchKeyOrValue) ??\n\t\t\tmapValueToValue.get(searchKeyOrValue)\n\t\t);\n\t} catch {\n\t\treturn undefined;\n\t}\n};\n/**\n * Check if value is valid or not. If it's valid returns the value, else returns the default value\n * @param value Value to validate\n * @param defaultValue Valid default value\n * @param validator Validator function that accepts the value and return a boolean indicating if valid\n */\nexport const getValueOrDefault = (value, defaultValue, validator) =>\n\tvalidator(value) ? value : defaultValue;\n/**\n * For each key of `defaultObj` validates the value of `obj`. If the value is not valid replace it with default value\n * @param obj Object to validate\n * @param defaultObj Object with valid default values\n * @param validatorObj Object with validators. Each key has a validator function that returns true if the value is valid\n */\nexport const getValuesOrDefaults = (obj, defaultObj, validatorObj) =>\n\tmapValues(defaultObj, (defaultValue, key) =>\n\t\tgetValueOrDefault(obj[key], defaultValue, validatorObj[key])\n\t);\n","import Consts from './consts';\nimport { LogLevel } from './types';\nimport { isUndefined } from './validators';\nimport { tryGetEnumValue } from './utils/object-utils';\n/**\n * Utility class for logging\n */\nclass Logger {\n\tconstructor() {\n\t\t/**\n\t\t * Mapping between log level and the the methods it enables.\n\t\t * Every log level also supports lower levels' methods (i.e. level 1 supports `debug` and `info`)\n\t\t */\n\n\t\tthis.logMethods = {\n\t\t\t0: ['debug'],\n\t\t\t1: ['info'],\n\t\t\t2: ['warn'],\n\t\t\t3: ['error'],\n\t\t};\n\t\tthis.handleLogLevel(Consts.DEFAULT_LOG_LEVEL);\n\t\ttry {\n\t\t\tif (Consts.inBrowser) {\n\t\t\t\t// Only for supported browsers: change of log level will be implemented on every tab\n\t\t\t\tthis.channel = new BroadcastChannel('SNAnalytics.Logger');\n\t\t\t\tthis.channel.onmessage = this.onBroadcastMessage.bind(this);\n\t\t\t}\n\t\t} catch {\n\t\t\tthis.debug('Broadcast channel is not supported');\n\t\t}\n\t}\n\t// Not using arrow function so `Catch` decorator will have proper context.\n\t// Since it's an not arrow function, handler needs to be be bounded so `this` will be the Logger instance\n\tonBroadcastMessage(ev) {\n\t\tthis.handleLogLevel(ev.data.logLevel);\n\t}\n\tnotify(logLevel) {\n\t\t// Notify potential other tabs that log level was changed\n\t\treturn this.channel?.postMessage({ logLevel });\n\t}\n\t/**\n\t * Overrides the logger methods according to the log level\n\t * @param logLevel Accepts LogLevel numeric values or string keys\n\t * @param notify If true, will try notify other tabs about the log level change\n\t */\n\thandleLogLevel(logLevel, notify = false) {\n\t\t// Validate that logLevel is either key or a value\n\t\tconst validLogLevel = tryGetEnumValue(logLevel, LogLevel, true);\n\t\tif (isUndefined(validLogLevel)) {\n\t\t\tthis.warn('Ignoring invalid log level:', logLevel);\n\t\t\treturn;\n\t\t}\n\t\t// Same log level - do nothing\n\t\tif (this.logLevel === validLogLevel) {\n\t\t\treturn;\n\t\t}\n\t\t// Override stubs\n\t\tfor (const [level, methods] of Object.entries(this.logMethods)) {\n\t\t\tfor (const method of methods) {\n\t\t\t\t// Enable the methods according to log level\n\t\t\t\tthis[method] =\n\t\t\t\t\tparseInt(level, 10) >= validLogLevel\n\t\t\t\t\t\t? console[method].bind(console, Consts.LOGGER_PREFIX) // new bound console method\n\t\t\t\t\t\t: () => {};\n\t\t\t}\n\t\t}\n\t\tif (notify) {\n\t\t\tthis.notify(validLogLevel);\n\t\t}\n\t\t// Save the new log level\n\t\tthis.logLevel = validLogLevel;\n\t}\n\tsetDebugLevel(logLevel) {\n\t\tthis.handleLogLevel(logLevel, true);\n\t}\n\t// Log method stubs, signature is same as console's (even kept their name for good measures).\n\t// These methods will be overridden every log level change\n\t// The comment '/* istanbul ignore next */' is used to remove those lines from coverage report\n\t/* istanbul ignore next */\n\tdebug(message, ...optionalParams) {}\n\t/* istanbul ignore next */\n\tinfo(message, ...optionalParams) {}\n\t/* istanbul ignore next */\n\twarn(message, ...optionalParams) {}\n\t/* istanbul ignore next */\n\terror(message, ...optionalParams) {}\n}\nexport default new Logger();\n","/**\n * Returns the ISO representation of time\n */\nexport const toISOString = (time) => new Date(time).toISOString();\n/**\n * Returns the date as a string on format 'dd/MM/yyyy HH:mm:ss'\n */\nexport const toDateString = (date) =>\n\tdate.toLocaleString('en-GB', { timeZone: 'UTC' }).replace(/,/g, '');\n/**\n * Get now time as a number\n */\nexport const getTime = () => new Date().getTime();\nlet lastTime = getTime();\n/**\n * Get unique now time as a number\n */\nexport const getUniqueTime = () => {\n\tconst now = getTime();\n\tlastTime = lastTime >= now ? lastTime + 1 : now;\n\treturn lastTime;\n};\n","import {\n\tisString,\n\tisInteger,\n\tisBoolean,\n\tisEnum,\n\tisPositiveInteger,\n\tisNullOrUndefined,\n\tisArray,\n} from '../../common/validators';\nimport { LogLevel } from '../../common/types';\nimport Consts from '../../common/consts';\nimport { getValuesOrDefaults } from '../../common/utils/object-utils';\nimport { getTime } from '../../common/utils/date-utils';\nimport { getGuid } from '../../common/utils/string-utils';\n\nconst DEFAULT_CONFIG_RESPONSE = {\n\tClientId: Consts.DEFAULT_CLIENT_ID,\n\tSessionId: '',\n\tLogLevel: undefined,\n\tMaxDataPointsPerHeartbeat: 1000,\n\tHeartbeatInterval: 15 * 1000,\n\tIdleTimeout: 30 * 60 * 1000,\n\tSessionTimeout: 4 * 60 * 60 * 1000,\n\tRecordMetadata: true,\n\tRequestId: '',\n\tAnalyticsChannelType: '',\n\tAnalyticsChannelNumber: -1,\n\tInstanceName: '',\n\tConfigReceivedTime: 0,\n\tConfigReloadTime: 0,\n\tSessionIdCreatedTime: 0,\n\tAppUserId: '',\n\tIgnorePerformanceData: false,\n\tIsGettingConfiguration: false,\n\tuxToken: '',\n\tg_ck: null,\n\tevents: [],\n};\nconst CONFIG_RESPONSE_VALIDATOR = {\n\tClientId: isString,\n\tSessionId: isString,\n\tLogLevel: isEnum.bind(null, LogLevel),\n\tMaxDataPointsPerHeartbeat: isPositiveInteger,\n\tHeartbeatInterval: isPositiveInteger,\n\tIdleTimeout: isPositiveInteger,\n\tSessionTimeout: isPositiveInteger,\n\tAnalyticsChannelType: isString,\n\tAnalyticsChannelNumber: isInteger,\n\tInstanceName: isString,\n\tConfigReloadTime: isPositiveInteger,\n\tRecordMetadata: isBoolean,\n\tRequestId: isString,\n\tConfigReceivedTime: isInteger,\n\tSessionIdCreatedTime: isInteger,\n\tAppUserId: isString,\n\tIgnorePerformanceData: isBoolean,\n\tIsGettingConfiguration: isBoolean,\n\tuxToken: isString,\n\tg_ck: isString,\n\tevents: isArray,\n};\nexport default class ConfigurationProvider {\n\tconstructor(store, apiKey, appUserIdProvider) {\n\t\tthis.store = store;\n\t\tthis.apiKey = apiKey;\n\t\tthis.appUserIdProvider = appUserIdProvider;\n\t\t// Try load configuration that may be on session storage (after refresh, navigation back, etc.)\n\t\tthis.configuration = this.buildConfiguration();\n\t\tthis.resetSessionIfNeeded(false);\n\t\t// Bind the method to the instance of the class\n\t\tthis.observeConfigurationChange =\n\t\t\tthis.observeConfigurationChange.bind(this);\n\t\t// Register the event listener\n\t\tif (Consts.inBrowser)\n\t\t\twindow.addEventListener('storage', this.observeConfigurationChange);\n\t}\n\t/**\n\t * Return a new valid full configuration using defaults config values if needed\n\t */\n\tbuildConfiguration() {\n\t\tconst config = {\n\t\t\t...getValuesOrDefaults(\n\t\t\t\tthis.store.get('config' /* StoreKey.Configuration */) || {},\n\t\t\t\tDEFAULT_CONFIG_RESPONSE,\n\t\t\t\tCONFIG_RESPONSE_VALIDATOR\n\t\t\t),\n\t\t\tLastServerResponseTime: isInteger(\n\t\t\t\tthis.store.get('srt' /* StoreKey.ServerResponseTime */)\n\t\t\t)\n\t\t\t\t? this.store.get('srt' /* StoreKey.ServerResponseTime */)\n\t\t\t\t: getTime(),\n\t\t\tApiKey: this.apiKey,\n\t\t\tLastDatapointQueuedTime: isInteger(\n\t\t\t\tthis.store.get('config' /* StoreKey.Configuration */)\n\t\t\t\t\t?.LastDatapointQueuedTime\n\t\t\t)\n\t\t\t\t? this.store.get('config' /* StoreKey.Configuration */)\n\t\t\t\t\t\t?.LastDatapointQueuedTime\n\t\t\t\t: getTime(),\n\t\t};\n\t\tif (config.SessionId === undefined || config.SessionId.length !== 32) {\n\t\t\tconfig.SessionId = getGuid();\n\t\t\tconfig.SessionIdCreatedTime = getTime();\n\t\t}\n\t\t//g_ck is unique for a glide session, it changes as soon as a glide session is over\n\t\t// Only set g_ck if it's truly missing/empty - don't overwrite valid existing values\n\t\t// The manager.js checkGlideSessionHasChanged() handles the comparison logic\n\t\tif (\n\t\t\tconfig.g_ck === undefined ||\n\t\t\tconfig.g_ck === null ||\n\t\t\tconfig.g_ck === '' ||\n\t\t\t!config.g_ck\n\t\t) {\n\t\t\tconfig.g_ck = window.g_ck;\n\t\t}\n\t\tthis.store.remove('config' /* StoreKey.Configuration */);\n\t\tthis.store.set('config' /* StoreKey.Configuration */, config);\n\t\treturn config;\n\t}\n\tisIdleSessionTimedOut() {\n\t\treturn (\n\t\t\tgetTime() - this.configuration.LastDatapointQueuedTime >\n\t\t\tthis.configuration.IdleTimeout\n\t\t);\n\t}\n\tisSessionTimedOut() {\n\t\treturn (\n\t\t\tgetTime() - this.configuration.SessionIdCreatedTime >=\n\t\t\tthis.configuration.SessionTimeout\n\t\t);\n\t}\n\tisInvalidSession() {\n\t\treturn (\n\t\t\tthis.configuration.SessionId === undefined ||\n\t\t\tthis.configuration.SessionId.length !== 32 ||\n\t\t\tthis.configuration.g_ck === null ||\n\t\t\tthis.isIdleSessionTimedOut() ||\n\t\t\tthis.isSessionTimedOut()\n\t\t);\n\t}\n\tresetSessionIfNeeded(shouldForceReset) {\n\t\t// If there is session id, we have a valid session running that could get a Timeout\n\t\tif (this.isInvalidSession() || shouldForceReset) {\n\t\t\tthis.resetSession();\n\t\t}\n\t}\n\tisInvalidConfiguration() {\n\t\treturn (\n\t\t\tgetTime() - this.configuration.ConfigReceivedTime >\n\t\t\tthis.configuration.ConfigReloadTime\n\t\t);\n\t}\n\treloadConfigurationIfNeeded() {\n\t\treturn this.isInvalidConfiguration();\n\t}\n\t/**\n\t * Return the value of a configuration key\n\t * @param key Configuration key\n\t */\n\tget(key) {\n\t\treturn this.configuration[key];\n\t}\n\t/**\n\t * Reset the session id and last server response time.\n\t */\n\tresetSession() {\n\t\tconst config = this.store.get('config' /* StoreKey.Configuration */)\n\t\t\t? this.store.get('config' /* StoreKey.Configuration */)\n\t\t\t: this.configuration;\n\t\tconfig.LastServerResponseTime = getTime();\n\t\tconfig.SessionId = getGuid();\n\t\tconfig.g_ck = window.g_ck;\n\t\tconfig.SessionIdCreatedTime = getTime();\n\t\tthis.store.remove('config' /* StoreKey.Configuration */);\n\t\tthis.store.set('config' /* StoreKey.Configuration */, config);\n\t\tthis.configuration = config;\n\t}\n\t/**\n\t * Handle start of a new session in configuration data\n\t * @param requestId Create a new config for the request id sent\n\t */\n\tstartNewConfiguration(requestId) {\n\t\t// Set these fields to be applied when config is received\n\t\tif (this.configuration) {\n\t\t\tthis.configuration.IsGettingConfiguration = true;\n\t\t\tthis.configuration.RequestId = requestId;\n\t\t\tthis.configuration.AppUserId = this.appUserIdProvider.get();\n\t\t\tconst instanceConfigCompleted = {\n\t\t\t\tIsGettingConfiguration:\n\t\t\t\t\tthis.configuration.IsGettingConfiguration,\n\t\t\t\tRequestId: this.configuration.RequestId,\n\t\t\t\tAppUserId: this.configuration.AppUserId,\n\t\t\t};\n\t\t\tif (this.store.get('config' /* StoreKey.Configuration */)) {\n\t\t\t\tconst updatedConfig = Object.assign(\n\t\t\t\t\tthis.store.get('config' /* StoreKey.Configuration */),\n\t\t\t\t\tinstanceConfigCompleted\n\t\t\t\t);\n\t\t\t\tthis.store.set(\n\t\t\t\t\t'config' /* StoreKey.Configuration */,\n\t\t\t\t\tupdatedConfig\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\t/**\n\t * Validate the config response received from the server\n\t * @returns true if valid config\n\t */\n\tisValidConfigResponse(config) {\n\t\tconst mandatoryKeys = [\n\t\t\t'HeartbeatInterval',\n\t\t\t'SessionTimeout',\n\t\t\t'MaxDataPointsPerHeartbeat',\n\t\t];\n\t\t// Make sure all mandatory fields exist\n\t\tfor (const key of mandatoryKeys) {\n\t\t\tif (!(key in config)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\t/**\n\t * Saves a new config response and construct a new configuration from it\n\t * @param config New config response\n\t */\n\tfillWithJson(config) {\n\t\tconst newConfig = {\n\t\t\t...config,\n\t\t\tRequestId: this.configuration.RequestId,\n\t\t\tAppUserId: this.configuration.AppUserId,\n\t\t\tConfigReceivedTime: getTime(),\n\t\t};\n\t\tthis.store.set('config' /* StoreKey.Configuration */, newConfig);\n\t\tthis.configuration = this.store.get(\n\t\t\t'config' /* StoreKey.Configuration */\n\t\t);\n\t}\n\t/**\n\t * Saves current time as the last successful interaction with server\n\t */\n\tupdateServerResponseTime() {\n\t\tconst time = getTime();\n\t\tthis.configuration.LastServerResponseTime = time;\n\t\tthis.store.set('srt' /* StoreKey.ServerResponseTime */, time);\n\t}\n\t/**\n\t * Delete all relevant data exist on configuration\n\t */\n\tdeleteData() {\n\t\tthis.store.remove('srt' /* StoreKey.ServerResponseTime */);\n\t\tthis.store.remove('config' /* StoreKey.Configuration */);\n\t\tthis.configuration = this.buildConfiguration();\n\t}\n\t/**\n\t * Delete session data if exist on configuration\n\t */\n\tdeleteSessionData(sessionId) {\n\t\tif (sessionId === this.configuration.SessionId) {\n\t\t\tthis.deleteData();\n\t\t}\n\t}\n\t/**\n\t * Update Last DataPoint Queued Time in configuration object in memory.\n\t * Debounce logic is WIP and commented out because of issues.\n\t */\n\tupdateLastDatapointQueuedTime() {\n\t\tif (this.configuration) {\n\t\t\tthis.configuration.LastDatapointQueuedTime = getTime();\n\t\t\tconst updatedQueuedTime = {\n\t\t\t\tLastDatapointQueuedTime:\n\t\t\t\t\tthis.configuration.LastDatapointQueuedTime,\n\t\t\t};\n\t\t\tif (this.store.get('config' /* StoreKey.Configuration */)) {\n\t\t\t\tconst updatedConfig = Object.assign(\n\t\t\t\t\tthis.store.get('config' /* StoreKey.Configuration */),\n\t\t\t\t\tupdatedQueuedTime\n\t\t\t\t);\n\t\t\t\tthis.store.set(\n\t\t\t\t\t'config' /* StoreKey.Configuration */,\n\t\t\t\t\tupdatedConfig\n\t\t\t\t);\n\t\t\t}\n\t\t\t// this.updateConfigurationInLocalStorage();\n\t\t\t// this.configuration.LastDatapointQueuedTime = getTime();\n\t\t\t// // Debounce the localStorage update\n\t\t\t// if (this.debounceTimeout !== null) {\n\t\t\t//     clearTimeout(this.debounceTimeout);\n\t\t\t// }\n\t\t\t// this.debounceTimeout = setTimeout(() => {\n\t\t\t//     // Update configuration in localStorage\n\t\t\t//     this.updateConfigurationInLocalStorage();\n\t\t\t// }, this.DEBOUNCE_DELAY) as any; // Cast to any due to type incompatibility\n\t\t}\n\t}\n\t/**\n\t * Update InstanceConfigCallCompleted status in configuration object in memory.\n\t * Debounce logic is WIP and commented out because of issues.\n\t */\n\tupdateInstanceConfigCallInProgress(isInProgress) {\n\t\tif (this.configuration) {\n\t\t\tthis.configuration.IsGettingConfiguration = isInProgress;\n\t\t\tconst instanceConfigCompleted = {\n\t\t\t\tIsGettingConfiguration:\n\t\t\t\t\tthis.configuration.IsGettingConfiguration,\n\t\t\t};\n\t\t\tif (this.store.get('config' /* StoreKey.Configuration */)) {\n\t\t\t\tconst updatedConfig = Object.assign(\n\t\t\t\t\tthis.store.get('config' /* StoreKey.Configuration */),\n\t\t\t\t\tinstanceConfigCompleted\n\t\t\t\t);\n\t\t\t\tthis.store.set(\n\t\t\t\t\t'config' /* StoreKey.Configuration */,\n\t\t\t\t\tupdatedConfig\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\tgetMergedConfigurationWithConfigResponse(configResponse) {\n\t\tconst mergedConfiguration = Object.assign(\n\t\t\tthis.configuration,\n\t\t\tconfigResponse\n\t\t);\n\t\tmergedConfiguration.ConfigReloadTime = Number(\n\t\t\tthis.getValidConfigReloadTime(\n\t\t\t\tNumber(mergedConfiguration.ConfigReloadTime)\n\t\t\t)\n\t\t);\n\t\tmergedConfiguration.HeartbeatInterval = Number(\n\t\t\tmergedConfiguration.HeartbeatInterval\n\t\t);\n\t\tmergedConfiguration.IgnorePerformanceData =\n\t\t\tString(mergedConfiguration.IgnorePerformanceData).toLowerCase() ===\n\t\t\t'true';\n\t\tmergedConfiguration.RecordMetadata =\n\t\t\tString(mergedConfiguration.RecordMetadata).toLowerCase() === 'true';\n\t\tmergedConfiguration.IdleTimeout = Number(\n\t\t\tmergedConfiguration.IdleTimeout\n\t\t);\n\t\tmergedConfiguration.SessionTimeout = Number(\n\t\t\tmergedConfiguration.SessionTimeout\n\t\t);\n\t\tmergedConfiguration.MaxDataPointsPerHeartbeat = Number(\n\t\t\tmergedConfiguration.MaxDataPointsPerHeartbeat\n\t\t);\n\t\tmergedConfiguration.AnalyticsChannelType = String(\n\t\t\tmergedConfiguration.AnalyticsChannelType\n\t\t);\n\t\tmergedConfiguration.AnalyticsChannelNumber = Number(\n\t\t\tmergedConfiguration.AnalyticsChannelNumber\n\t\t);\n\t\tmergedConfiguration.InstanceName = String(\n\t\t\tmergedConfiguration.InstanceName\n\t\t);\n\t\treturn mergedConfiguration;\n\t}\n\tgetValidConfigReloadTime(milliseconds) {\n\t\tconst oneDayInMilliseconds = 24 * 60 * 60 * 1000; // 1 day in milliseconds\n\t\tconst oneHourInMilliseconds = 60 * 1000; // 1 hour in milliseconds\n\t\tif (\n\t\t\tisNullOrUndefined(milliseconds) ||\n\t\t\t!isInteger(milliseconds) ||\n\t\t\tmilliseconds >= oneDayInMilliseconds\n\t\t) {\n\t\t\treturn oneDayInMilliseconds; // Is null or undefined or Not a valid integer or negative value or greater than 1 day\n\t\t}\n\t\tif (milliseconds <= oneHourInMilliseconds) {\n\t\t\treturn oneHourInMilliseconds; // Duration within 1 hour\n\t\t}\n\t\treturn milliseconds; // Valid duration\n\t}\n\tobserveConfigurationChange(event) {\n\t\tif (\n\t\t\tevent.key ===\n\t\t\t\tthis.store.getStoreKey('config' /* StoreKey.Configuration */) &&\n\t\t\tevent.newValue !== null\n\t\t) {\n\t\t\ttry {\n\t\t\t\tthis.configuration = JSON.parse(event.newValue);\n\t\t\t} catch (error) {\n\t\t\t\tconsole.warn('[Analytics] Failed to parse configuration change event:', error);\n\t\t\t\t// Keep existing configuration if parsing fails\n\t\t\t}\n\t\t}\n\t}\n}\n","/**\n * Hold mapping between full name and short name of `DataPoint`\n */\nexport var DataPointField;\n(function (DataPointField) {\n\tDataPointField['type'] = 't';\n\tDataPointField['timestamp'] = 'd';\n\tDataPointField['name'] = 'n';\n\tDataPointField['properties'] = 'p';\n})(DataPointField || (DataPointField = {}));\n","export function last(array) {\n\treturn array[array.length - 1];\n}\n","import {\n\tisArray,\n\tisNumber,\n\tisDate,\n\tisString,\n\tisBoolean,\n\tisNonEmptyString,\n} from '../validators';\nimport logger from '../logger';\nimport { toDateString } from './date-utils';\nimport Consts from '../consts';\n\nexport const addSystemPropertyPrefix = (key) =>\n\tConsts.SYSTEM_PROPERTY_PREFIX + key;\nexport const isSystemPropertyKey = (key) =>\n\tkey.startsWith(Consts.SYSTEM_PROPERTY_PREFIX);\nconst isValidProperty = (value, allowLists) => {\n\tif (value === null) {\n\t\treturn true;\n\t}\n\tif (isArray(value)) {\n\t\treturn allowLists;\n\t}\n\t// For numbers: Avoiding NAN, Infinity and -Infinity\n\tif (isNumber(value)) {\n\t\treturn value !== Infinity && value !== -Infinity;\n\t}\n\treturn isString(value) || isDate(value) || isBoolean(value);\n};\nconst transformToPropertyValue = (value) => {\n\tif (isDate(value)) {\n\t\treturn toDateString(value);\n\t}\n\t// Boolean is converted to string to comply with iOS\n\tif (isBoolean(value)) {\n\t\treturn value.toString();\n\t}\n\treturn value;\n};\n/**\n * Extract only the valid properties. log the invalid ones as errors\n */\nexport const getValidProperties = (properties, allowLists, allowNulls) => {\n\tconst validProperties = {};\n\tfor (let [key, value] of Object.entries(properties)) {\n\t\tif (key == 'SN_experiments') {\n\t\t\tvalidProperties[key] = value;\n\t\t\tcontinue;\n\t\t}\n\t\t// Ignore property that its key is only spaces\n\t\tif (!isNonEmptyString(key)) {\n\t\t\tlogger.warn('Invalid property name:', key);\n\t\t\tcontinue;\n\t\t}\n\t\t// Ignore property that starts with our reserved system prefix\n\t\tif (isSystemPropertyKey(key)) {\n\t\t\tlogger.warn('Invalid property prefix for name:', key);\n\t\t\tcontinue;\n\t\t}\n\t\t// Replace undefined with null or empty string, depends on what is allowed\n\t\tvalue = value ?? (allowNulls ? null : '');\n\t\tif (!isValidProperty(value, allowLists)) {\n\t\t\tlogger.warn('Invalid value', value, 'for property', key);\n\t\t\tcontinue;\n\t\t}\n\t\tif (isArray(value)) {\n\t\t\tconst validArray = [];\n\t\t\tfor (const item of value) {\n\t\t\t\tif (!isString(item)) {\n\t\t\t\t\tlogger.warn('Invalid value', item, 'for list', key);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tvalidArray.push(item);\n\t\t\t}\n\t\t\tvalidProperties[key] = validArray;\n\t\t} else {\n\t\t\tvalidProperties[key] = transformToPropertyValue(value);\n\t\t}\n\t}\n\treturn validProperties;\n};\n\nexport const extractSystemPropertyValues = (properties) => {\n\tconst systemProperties = {};\n\tfor (let [key, value] of Object.entries(properties)) {\n\t\tif (Consts.allowedSystemProperties.includes(key)) {\n\t\t\tsystemProperties[key.replace(Consts.SYSTEM_PROPERTY_PREFIX, '')] = value;\n\t\t}\n\t}\n\treturn systemProperties;\n};\n","import { DataPointField } from '../entities/data-point';\nimport { getUniqueTime } from '../../common/utils/date-utils';\nimport { last } from '../../common/utils/array-utils';\nimport { isDefined } from '../../common/validators';\nimport { mapKeys, isEmptyObject } from '../../common/utils/object-utils';\nimport { addSystemPropertyPrefix } from '../../common/utils/property-utils';\nimport dataContext from '../../data-context';\n/**\n * DataPoints\n */\nexport default class DataPointsProvider {\n\tconstructor(store, configurationProvider, appContextProvider) {\n\t\tthis.store = store;\n\t\tthis.configurationProvider = configurationProvider;\n\t\tthis.appContextProvider = appContextProvider;\n\t}\n\tremove() {\n\t\tthis.store.remove('data' /* StoreKey.DataPoints */);\n\t}\n\tget() {\n\t\treturn this.store.get('data' /* StoreKey.DataPoints */) || [];\n\t}\n\tset(queue) {\n\t\tif (queue.length) {\n\t\t\tthis.store.set('data' /* StoreKey.DataPoints */, queue);\n\t\t} else {\n\t\t\tthis.remove();\n\t\t}\n\t}\n\t/**\n\t * Create and add a new DataPoint the the queue\n\t * @param type Type of DataPoint to create\n\t * @param name Name identifier of the data point\n\t * @param optionalFields Optional fields to enrich the data point\n\t */\n\tadd(type, name, { properties, systemProperties, timestamp } = {}) {\n\t\t// All DataPoints have this basic mandatory fields\n\t\tconst dataPoint = {\n\t\t\t[DataPointField.type]: type,\n\t\t\t[DataPointField.timestamp]: timestamp ?? getUniqueTime(),\n\t\t\t[DataPointField.name]: name,\n\t\t};\n\t\t// Add system property prefix for each key\n\t\tif (isDefined(systemProperties)) {\n\t\t\tsystemProperties = {\n\t\t\t\t...mapKeys(systemProperties, (_value, key) =>\n\t\t\t\t\taddSystemPropertyPrefix(key)\n\t\t\t\t),\n\t\t\t};\n\t\t}\n\t\t// Merge system props with user props and put system first\n\t\tconst allProperties = { ...systemProperties, ...properties };\n\t\t// Add properties to data point only if there are entries\n\t\tif (!isEmptyObject(allProperties)) {\n\t\t\tdataPoint[DataPointField.properties] = allProperties;\n\t\t}\n\t\t// Push to the last of the queue\n\t\tconst queue = this.get();\n\t\tthis.prepareQueueToInsert(queue);\n\t\tlast(last(queue).ctx).data.push(dataPoint);\n\t\tthis.set(queue);\n\t\tthis.configurationProvider.updateLastDatapointQueuedTime();\n\t}\n\tprepareQueueToInsert(queue) {\n\t\tconst requestId = this.configurationProvider.get('RequestId');\n\t\tconst sessionId = this.configurationProvider.get('SessionId');\n\t\tconst sessionIdCreatedTime = this.configurationProvider.get(\n\t\t\t'SessionIdCreatedTime'\n\t\t);\n\t\tconst appUserId = dataContext.appUserId.get() || '';\n\t\tconst trackingLevel = dataContext.trackingConsent.get();\n\t\tconst configReceivedTime =\n\t\t\tthis.configurationProvider.get('ConfigReceivedTime');\n\t\tconst appContext = this.appContextProvider.get();\n\t\t// Make sure last entry on queue is current session\n\t\t// Check against requestId to handle pre session items as well that don't have sessionId\n\t\tif (!queue.length || last(queue).sid !== sessionId) {\n\t\t\tqueue.push({\n\t\t\t\trid: requestId,\n\t\t\t\tsid: sessionId,\n\t\t\t\tsidt: sessionIdCreatedTime,\n\t\t\t\tauid: appUserId,\n\t\t\t\ttrackinglevel: trackingLevel,\n\t\t\t\ttime: configReceivedTime,\n\t\t\t\tctx: [],\n\t\t\t});\n\t\t}\n\t\tconst lastSessionQueue = last(queue);\n\t\tconst lastAppContextQueue = last(lastSessionQueue.ctx);\n\t\t// Make sure last entry on app context is current app context\n\t\tif (\n\t\t\t!lastSessionQueue.ctx.length ||\n\t\t\tlastAppContextQueue.id !== appContext.id ||\n\t\t\tlastAppContextQueue.name !== appContext.name\n\t\t) {\n\t\t\tlastSessionQueue.ctx.push({\n\t\t\t\tid: appContext.id,\n\t\t\t\tname: appContext.name,\n\t\t\t\tdata: [],\n\t\t\t});\n\t\t}\n\t}\n\t/**\n\t * Delete the first n elements from the DataPoints queue\n\t * @param count Number of elements to delete\n\t */\n\tdeleteByCount(count) {\n\t\tconst queue = this.get();\n\t\t// Remove elements from the first queue item\n\t\tqueue[0]?.ctx[0]?.data?.splice(0, count);\n\t\t// If no data points left, delete the app context\n\t\tif (!queue[0]?.ctx[0]?.data?.length) {\n\t\t\tqueue[0]?.ctx?.shift();\n\t\t}\n\t\t// If no app contexts left, delete the session\n\t\tif (!queue[0]?.ctx?.length) {\n\t\t\tqueue?.shift();\n\t\t}\n\t\tthis.set(queue);\n\t}\n\t/**\n\t * Assign pending pre session items of requestId to provided sessionId\n\t */\n\tassignPreSessionItems(\n\t\trequestId,\n\t\tsessionId,\n\t\tconfigReceivedTime,\n\t\tsessionIdCreatedTime\n\t) {\n\t\tthis.set(\n\t\t\tthis.get().map((row) => {\n\t\t\t\tif (!row.sid && row.rid === requestId) {\n\t\t\t\t\trow.sid = sessionId;\n\t\t\t\t\trow.time = configReceivedTime;\n\t\t\t\t}\n\t\t\t\treturn row;\n\t\t\t})\n\t\t);\n\t}\n\t/**\n\t * Delete pre session items from the queue\n\t * @param requestId If sent, deletes only pre session items for that request id\n\t */\n\tdeletePreSessionItems(requestId) {\n\t\tthis.set(\n\t\t\tthis.get().filter((row) =>\n\t\t\t\trequestId ? row.rid !== requestId : row.sid\n\t\t\t)\n\t\t);\n\t}\n\tdeleteOtherSessions(sessionId) {\n\t\tconst filteredData = this.get().filter((row) => row.sid === sessionId);\n\t\tthis.set(filteredData);\n\t}\n\t/**\n\t * Delete all items related to the session\n\t */\n\tdeleteBySessionId(sessionId) {\n\t\tthis.set(this.get().filter((row) => row.sid !== sessionId));\n\t}\n\t/**\n\t * Return the first n elements from the DataPoints queue\n\t * @param limit Maximum number of elements to return\n\t */\n\tselect(limit, channelType, channelNumber) {\n\t\t// Data points are sent by order, so if the first item in the queue is pending to config\n\t\t// no data points will be selected until it arrives or get deleted\n\t\tconst firstQueueItem = this.get()[0];\n\t\treturn firstQueueItem?.sid\n\t\t\t? {\n\t\t\t\t\tsessionId: firstQueueItem.sid,\n\t\t\t\t\tsessionIdCreatedTime: firstQueueItem.sidt,\n\t\t\t\t\tappUserId: firstQueueItem.auid,\n\t\t\t\t\ttrackingLevel: firstQueueItem.trackinglevel,\n\t\t\t\t\tchannelType,\n\t\t\t\t\tchannelNumber,\n\t\t\t\t\tconfigReceivedTime: firstQueueItem.time,\n\t\t\t\t\tappContextId: firstQueueItem.ctx[0]?.id,\n\t\t\t\t\tappContextName: firstQueueItem.ctx[0]?.name,\n\t\t\t\t\tdataPoints:\n\t\t\t\t\t\tfirstQueueItem.ctx[0]?.data.slice(0, limit) || [],\n\t\t\t\t}\n\t\t\t: undefined;\n\t}\n}\n","export default class NodeStorage {\n\tconstructor() {\n\t\tthis.storage = {};\n\t}\n\tget length() {\n\t\treturn Object.keys(this.storage).length;\n\t}\n\tclear() {\n\t\tthis.storage = {};\n\t}\n\tgetItem(key) {\n\t\treturn key in this.storage ? this.storage[key] : null;\n\t}\n\tkey(index) {\n\t\tconst keys = Object.keys(this.storage);\n\t\treturn keys[index] || null;\n\t}\n\tremoveItem(key) {\n\t\tdelete this.storage[key];\n\t}\n\tsetItem(key, value) {\n\t\tthis.storage[key] = value || '';\n\t}\n}\n","import { SNError } from './errors';\nimport logger from './logger';\nimport { getTime } from './utils/date-utils';\nimport NodeStorage from './node-storage';\nimport Consts from './consts';\n// In order for the lock mechanism to make sense it should be at least 100ms.\n// The reason is that if there is a contention we wait at least 50ms (depends on event looper) and check\n// again the outer lock. In that case, locks beneath 100ms will probably both fail instead of one of them to succeed\nconst MIN_EXPIRY_TIME = 100;\n/**\n * Really fast utility to create random id for obtaining a lock\n */\nconst randomId = () => {\n\tconst randomNumber = Math.random();\n\t// Math random can also return 0, in that case try again\n\treturn randomNumber ? randomNumber.toString(36).slice(2) : randomId();\n};\n/**\n * Delay execution by at least the requested ms using `setTimeout`\n */\nconst delay = (ms = 0) => new Promise((resolve) => setTimeout(resolve, ms));\n/**\n * Enables to obtain a lock across all browser tabs.\n * Implemented with double locking and localStorage.\n */\nexport default class Lock {\n\t// Every lock instance holds a configuration for a specific key\n\tconstructor(key, expiry = 3 * 1000 /* 3 seconds */) {\n\t\tthis.key = key;\n\t\tthis.expiry = expiry;\n\t\tthis.id = randomId();\n\t\tthis.localStorage = Consts.inBrowser\n\t\t\t? window.localStorage\n\t\t\t: new NodeStorage();\n\t\tif (this.expiry < MIN_EXPIRY_TIME) {\n\t\t\tthrow new Error(\n\t\t\t\t`Lock should have a minimum expiry of ${MIN_EXPIRY_TIME}ms`\n\t\t\t);\n\t\t}\n\t}\n\tlockName(suffix) {\n\t\t// return `sn:${this.key}${suffix}`;\n\t\treturn `sn:${this.key}${suffix}`;\n\t}\n\tget outerLock() {\n\t\treturn this.lockName(':X');\n\t}\n\tget innerLock() {\n\t\treturn this.lockName(':Y');\n\t}\n\tasync tryGetLock() {\n\t\tthis.setLockHolder(this.outerLock);\n\t\t// If inner exists, someone has the lock\n\t\tif (this.getLockHolderIdAndRemoveExpired(this.innerLock)) {\n\t\t\treturn false;\n\t\t}\n\t\t// Inner lock was not found, obtain it\n\t\tthis.setLockHolder(this.innerLock);\n\t\t// Without calling setTimeout between setItem and getItem, localStorage is not\n\t\t// updated if another window changes that value in the meantime.\n\t\t// So we must delay here which will cause the localStorage to be updated\n\t\tawait delay();\n\t\t// We have the inner lock, now check again for the outer lock\n\t\tif (this.getLockHolderIdAndRemoveExpired(this.outerLock) === this.id) {\n\t\t\t// We have both outer and inner locks - lock is acquired\n\t\t\treturn true;\n\t\t}\n\t\t// If outer was changed, someone is competing for the inner lock.\n\t\t// Give enough time for critical section, which ensure setItem has happened and check again\n\t\tawait delay(50);\n\t\t// Return if lock is acquired\n\t\treturn this.getLockHolderIdAndRemoveExpired(this.innerLock) === this.id;\n\t}\n\t/**\n\t * Try to acquire a lock.\n\t * Can throw an exception if lock could not be acquired within the expiration time\n\t */\n\tasync acquire() {\n\t\tconst acquireStartTime = getTime();\n\t\t// Try to acquire lock as long as time is not expired\n\t\twhile (getTime() - acquireStartTime < this.expiry) {\n\t\t\tif (await this.tryGetLock()) {\n\t\t\t\tlogger.debug(`Lock '${this.key}' acquired`);\n\t\t\t\treturn {\n\t\t\t\t\trelease: this.release.bind(this),\n\t\t\t\t};\n\t\t\t}\n\t\t\t// Wait for at least 0~25ms and try again\n\t\t\tawait delay(Math.random() * 25);\n\t\t}\n\t\tthrow new SNError(`Lock could not be acquired within ${this.expiry}ms`);\n\t}\n\t/**\n\t * Releases the lock. This function is provided when obtaining the lock.\n\t */\n\trelease() {\n\t\tthis.localStorage.removeItem(this.outerLock);\n\t\tthis.localStorage.removeItem(this.innerLock);\n\t\tlogger.debug(`Lock '${this.key}' released`);\n\t}\n\t/**\n\t * Set this instance as the lock holder\n\t * @param key Lock to set\n\t */\n\tsetLockHolder(key) {\n\t\tconst lock = {\n\t\t\tid: this.id,\n\t\t\texpiresAt: getTime() + this.expiry,\n\t\t};\n\t\tthis.localStorage.setItem(key, JSON.stringify(lock));\n\t}\n\t/**\n\t * Return the holder id of the lock holder.\n\t * If the lock is expired, delete it and return undefined\n\t * @param key Lock to get\n\t */\n\tgetLockHolderIdAndRemoveExpired(key) {\n\t\tconst lock = this.localStorage.getItem(key);\n\t\tif (!lock) return undefined;\n\t\ttry {\n\t\t\tconst lockParsed = JSON.parse(lock);\n\t\t\t// Clear lock if it's expired\n\t\t\tif (getTime() > lockParsed.expiresAt) {\n\t\t\t\tthis.localStorage.removeItem(key);\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\treturn lockParsed.id;\n\t\t} catch (error) {\n\t\t\t// If lock data is corrupted, remove it and return undefined\n\t\t\tlogger.warn('Failed to parse lock data, removing corrupted lock:', error);\n\t\t\tthis.localStorage.removeItem(key);\n\t\t\treturn undefined;\n\t\t}\n\t}\n}\n","import Lock from '../../common/lock';\nimport { getGuid } from '../../common/utils/string-utils';\nimport Consts from '../../common/consts';\n\nconst CREATE_BROWSER_ID_LOCK = new Lock('create-browser-id');\nexport default class BrowserIdProvider {\n\tconstructor(store, legacyStore) {\n\t\tthis.store = store;\n\t\tthis.legacyStore = legacyStore;\n\t}\n\t/**\n\t * Get the browser id if it exists. Does not create one if empty.\n\t */\n\tget() {\n\t\treturn this.store.get('browser' /* StoreKey.BrowserId */);\n\t}\n\t/**\n\t * Get the browser id from legacyStore if it exists. Does not create one if empty.\n\t */\n\tgetLegacyBrowserId() {\n\t\treturn this.legacyStore.get('browser' /* StoreKey.BrowserId */);\n\t}\n\t/**\n\t * Returns a promise that resolve to a valid browser id.\n\t * The call is synchronized between all browser tabs to create a new browser id if one does not already exists.\n\t * May throw an error if could not obtain lock.\n\t */\n\tasync getOrCreate() {\n\t\tlet browserId = this.get();\n\t\tif (!Consts.inBrowser) return '0';\n\t\tif (!browserId) {\n\t\t\t// Creation of browser id is synchronized between tabs\n\t\t\tconst lock = await CREATE_BROWSER_ID_LOCK.acquire();\n\t\t\t// Check within the lock that browser id was not created by another tab while obtaining the lock\n\t\t\tbrowserId = this.get();\n\t\t\tif (!browserId) {\n\t\t\t\tconst legacyBrowserId = this.getLegacyBrowserId();\n\t\t\t\tbrowserId = legacyBrowserId || getGuid();\n\t\t\t\tthis.store.set('browser' /* StoreKey.BrowserId */, browserId);\n\t\t\t}\n\t\t\tlock.release();\n\t\t}\n\t\treturn browserId;\n\t}\n}\n","import { getGuid } from '../../common/utils/string-utils';\n\nexport default class TabIdProvider {\n\tconstructor(store) {\n\t\tthis.store = store;\n\t}\n\t/**\n\t * Returns a valid tabId. If not exists creates new one and save it\n\t */\n\tgetOrCreate() {\n\t\tlet tabId = this.store.get('tab' /* StoreKey.TabId */);\n\t\tif (!tabId) {\n\t\t\ttabId = getGuid();\n\t\t\tthis.store.set('tab' /* StoreKey.TabId */, tabId);\n\t\t}\n\t\treturn tabId;\n\t}\n}\n","import { SNError } from '../common/errors';\nimport { isNonEmptyString, isNullOrUndefined } from '../common/validators';\n\nconst STORE_PREFIX = 'sn';\n/**\n * Base class that handles store api for either localStorage or sessionStorage\n */\nexport default class Store {\n\tconstructor(apiKey, storage, disableSerialization = false) {\n\t\tthis.apiKey = apiKey;\n\t\tthis.storage = storage;\n\t\tthis.disableSerialization = disableSerialization;\n\t\tif (!isNonEmptyString(this.apiKey)) {\n\t\t\tthrow new SNError(\n\t\t\t\t'Must supply an API key to initialize a store instance'\n\t\t\t);\n\t\t}\n\t\t// Check for native web storage support\n\t\ttry {\n\t\t\tconst testKey = this.getStoreKey('test');\n\t\t\tthis.storage.setItem(testKey, 'ok');\n\t\t\tthis.storage.removeItem(testKey);\n\t\t} catch {\n\t\t\tthrow new SNError('Web storage is not supported');\n\t\t}\n\t}\n\tgetStoreKey(key) {\n\t\t// return `${STORE_PREFIX}:${this.apiKey}:${key}`;\n\t\treturn `sn:${this.apiKey}:${key}`;\n\t}\n\tserializeItem(value) {\n\t\t// If serialization is disabled then value is not necessary a string\n\t\treturn this.disableSerialization ? value : JSON.stringify(value);\n\t}\n\tdeserializeItem(value) {\n\t\tif (this.disableSerialization) {\n\t\t\treturn value;\n\t\t}\n\t\ttry {\n\t\t\treturn JSON.parse(value);\n\t\t} catch (error) {\n\t\t\t// If data is corrupted, return undefined to trigger default values\n\t\t\tconsole.warn('[Analytics] Failed to deserialize stored data:', error);\n\t\t\treturn undefined;\n\t\t}\n\t}\n\t/**\n\t * Sets the value of the pair identified by key to value,\n\t * creating a new key/value pair if none existed for key previously.\n\t * In case of undefined or null, the value will be removed to avoid deserializing errors\n\t * @param key Store key\n\t * @param value Value to save\n\t */\n\tset(key, value) {\n\t\treturn isNullOrUndefined(value)\n\t\t\t? this.remove(key)\n\t\t\t: this.storage.setItem(\n\t\t\t\t\tthis.getStoreKey(key),\n\t\t\t\t\tthis.serializeItem(value)\n\t\t\t\t);\n\t}\n\t/**\n\t * Returns the current value associated with the given key,\n\t * or undefined if the given key does not exist in the list associated with the object.\n\t * @param key Store key\n\t */\n\tget(key) {\n\t\t// `getItem` returns null if key does not exist. wa want to return undefined and not handle nulls\n\t\t// since `undefined` trigger parameter default value and null overrides it\n\t\tconst result = this.storage.getItem(this.getStoreKey(key));\n\t\treturn result === null ? undefined : this.deserializeItem(result);\n\t}\n\t/**\n\t * Removes the key/value pair with the given key from the list associated with the object,\n\t * if a key/value pair with the given key exists.\n\t * @param key Store key\n\t */\n\tremove(key) {\n\t\tthis.storage.removeItem(this.getStoreKey(key));\n\t}\n}\n","import Store from './store';\nimport Consts from '../common/consts';\nimport NodeStorage from '../common/node-storage';\n/**\n * Store that is available for all window tabs that are from the same origin (using localStorage)\n */\nexport default class LocalStore extends Store {\n\tconstructor(apiKey) {\n\t\tsuper(\n\t\t\tapiKey,\n\t\t\tConsts.inBrowser ? window.localStorage : new NodeStorage()\n\t\t);\n\t}\n}\n","import Store from './store';\nimport Consts from '../common/consts';\nimport NodeStorage from '../common/node-storage';\n/**\n * Store that available only for a window tab (using sessionStorage)\n */\nexport default class SessionStore extends Store {\n\tconstructor(apiKey) {\n\t\t// super(apiKey, window.sessionStorage);\n\t\tsuper(\n\t\t\tapiKey,\n\t\t\tConsts.inBrowser ? window.sessionStorage : new NodeStorage()\n\t\t);\n\t}\n}\n","import logger from '../common/logger';\nimport Store from './store';\nimport Consts from '../common/consts';\n\nclass MemoryStorage {\n\tconstructor() {\n\t\tthis.store = new Map();\n\t}\n\tget length() {\n\t\treturn this.store.size;\n\t}\n\tkey(index) {\n\t\treturn Array.from(this.store.keys())[index] ?? null;\n\t}\n\tclear() {\n\t\tthis.store.clear();\n\t}\n\tgetItem(key) {\n\t\treturn this.store.get(key) ?? null;\n\t}\n\tremoveItem(key) {\n\t\tthis.store.delete(key);\n\t}\n\tsetItem(key, value) {\n\t\tthis.store.set(key, value);\n\t}\n\tgetAllEntries() {\n\t\treturn Array.from(this.store.entries());\n\t}\n\tloadEntries(backup) {\n\t\tif (!backup) return;\n\t\tlogger.info('Loading backup data to store');\n\t\tfor (const entry of backup) {\n\t\t\tthis.store.set(entry[0], entry[1]);\n\t\t}\n\t}\n}\n// Similar to other storages create single instance to be used\nconst memoryStorage = new MemoryStorage();\n/**\n * Store that available only using DOM memory\n */\nexport default class MemoryStore extends Store {\n\tconstructor(apiKey, backupStore) {\n\t\tsuper(apiKey, memoryStorage, true);\n\t\tthis.backupStore = backupStore;\n\t\tif (backupStore) {\n\t\t\tthis.loadBackup();\n\t\t\tthis.registerBackupBeforeUnload();\n\t\t}\n\t}\n\tloadBackup() {\n\t\ttry {\n\t\t\t// Load backup from backup store and remove it once it is loaded\n\t\t\tmemoryStorage.loadEntries(\n\t\t\t\tthis.backupStore.get('all' /* StoreKey.MemoryBackup */)\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tlogger.warn('Unable to load backup from session storage', error);\n\t\t}\n\t\tthis.backupStore.remove('all' /* StoreKey.MemoryBackup */);\n\t}\n\tregisterBackupBeforeUnload() {\n\t\tconst handler = () => {\n\t\t\ttry {\n\t\t\t\t// Just before window is unloading, save the current snapshot of memory storage on session storage\n\t\t\t\tthis.backupStore.set(\n\t\t\t\t\t'all' /* StoreKey.MemoryBackup */,\n\t\t\t\t\tmemoryStorage.getAllEntries()\n\t\t\t\t);\n\t\t\t} catch (error) {\n\t\t\t\tlogger.warn('Unable to save backup on unload', error);\n\t\t\t}\n\t\t};\n\t\t// Adding the event listener for saving data on the window's capture phase\n\t\t// Using both beforeunload and unload in case one of them gets removed\n\t\t['beforeunload', 'unload'].forEach((e) => {\n\t\t\tif (Consts.inBrowser) window.addEventListener(e, handler, true);\n\t\t});\n\t}\n}\n\n/**\n * Isolated memory store with separate storage instance - does not share data with other memory stores\n * Use this when you need completely separate memory space that doesn't interfere with the main memoryStorage singleton\n */\nexport class IsolatedMemoryStore extends Store {\n\tconstructor(apiKey, backupStore) {\n\t\t// Create a separate MemoryStorage instance for complete isolation\n\t\tconst isolatedStorage = new MemoryStorage();\n\t\tsuper(apiKey, isolatedStorage, true);\n\t\tthis.backupStore = backupStore;\n\t\tif (backupStore) {\n\t\t\tthis.loadBackup();\n\t\t\tthis.registerBackupBeforeUnload();\n\t\t}\n\t}\n\n\tloadBackup() {\n\t\ttry {\n\t\t\tif (!this.backupStore) return;\n\t\t\tconst backup = this.backupStore.getAllEntries();\n\t\t\tthis.storage.loadEntries(backup);\n\t\t} catch (error) {\n\t\t\tlogger.warn(\n\t\t\t\t'Error loading backup for isolated memory store',\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\tregisterBackupBeforeUnload() {\n\t\tif (!Consts.inBrowser || !this.backupStore) return;\n\t\twindow.addEventListener('beforeunload', () => {\n\t\t\tthis.backup();\n\t\t});\n\t}\n\n\tbackup() {\n\t\ttry {\n\t\t\tif (!this.backupStore) return;\n\t\t\tconst backup = this.storage.getAllEntries();\n\t\t\tlogger.info(\n\t\t\t\t'Backing up isolated memory data to:',\n\t\t\t\tthis.backupStore.constructor.name\n\t\t\t);\n\t\t\tfor (const entry of backup) {\n\t\t\t\tthis.backupStore.set(entry[0], entry[1]);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tlogger.warn('Error backing up isolated memory store', error);\n\t\t}\n\t}\n}\n","export const createBasicProvider = (store, key, defaultValue) => ({\n\tset: (value) => store.set(key, value),\n\tget: () => store.get(key) ?? defaultValue,\n\tremove: () => store.remove(key),\n});\n","import ConfigurationProvider from './model/providers/configuration-provider';\nimport DataPointsProvider from './model/providers/data-points-provider';\nimport BrowserIdProvider from './model/providers/browser-id-provider';\nimport TabIdProvider from './model/providers/tab-id-provider';\nimport LocalStore from './database/local-store';\nimport SessionStore from './database/session-store';\nimport MemoryStore, { IsolatedMemoryStore } from './database/memory-store';\nimport Consts from './common/consts';\nimport { createBasicProvider } from './model/providers/basic-provider';\n\n/**\n * Singleton class that encapsulates storage usages and all the different providers.\n * Must call `setKeys` once before any other usage.\n */\nclass DataContext {\n\tvalidate(provider) {\n\t\tif (!provider) {\n\t\t\tconsole.warn('Need to call setKeys with a valid apiKey');\n\t\t}\n\t\treturn provider;\n\t}\n\tsetKeys(apiKey, legacyApiKey) {\n\t\t// Local stores and providers - Data persists until explicitly deleted.\n\t\t// Changes made are saved and available for all current and future visits to the site\n\t\tconst localStore = new LocalStore(apiKey);\n\t\tconst legacyLocalStore = new LocalStore(legacyApiKey);\n\t\tthis.appUserIdProvider = createBasicProvider(\n\t\t\tlocalStore,\n\t\t\t'user' /* StoreKey.AppUserId */\n\t\t);\n\t\tthis.browserIdProvider = new BrowserIdProvider(\n\t\t\tlocalStore,\n\t\t\tlegacyLocalStore\n\t\t);\n\t\tthis.clientIdProvider = createBasicProvider(\n\t\t\tlocalStore,\n\t\t\t'client' /* StoreKey.ClientId */,\n\t\t\tConsts.DEFAULT_CLIENT_ID\n\t\t);\n\t\tthis.trackingConsentProvider = createBasicProvider(\n\t\t\tlocalStore,\n\t\t\t'consent' /* StoreKey.TrackingConsent */,\n\t\t\tConsts.DEFAULT_TRACKING_CONSENT\n\t\t);\n\t\tthis.configurationProvider = new ConfigurationProvider(\n\t\t\tlocalStore,\n\t\t\tapiKey,\n\t\t\tthis.appUserIdProvider\n\t\t);\n\t\t// Session store and providers - Changes made are saved and available for the current page\n\t\t// in that tab until it is closed. Once it is closed, the stored data is deleted.\n\t\t// Persist over page refresh, navigation in and out from the page, close and reopen of tab.\n\t\tconst sessionStore = new SessionStore(apiKey);\n\t\t// Memory store and providers - Changes made are saved and available for the window until it is unloaded\n\t\tconst memoryStore = new MemoryStore(apiKey, sessionStore);\n\n\t\tthis.tabIdProvider = new TabIdProvider(memoryStore);\n\t\tthis.currentPageProvider = createBasicProvider(\n\t\t\tmemoryStore,\n\t\t\t'page' /* StoreKey.CurrentPage */,\n\t\t\t''\n\t\t);\n\t\tthis.domainProvider = createBasicProvider(\n\t\t\tmemoryStore,\n\t\t\t'domain' /* StoreKey.Domain */,\n\t\t\t{}\n\t\t);\n\t\tthis.appContextProvider = createBasicProvider(\n\t\t\tmemoryStore,\n\t\t\t'app' /* StoreKey.AppContext */,\n\t\t\t{}\n\t\t);\n\t\tthis.dataPointsProvider = new DataPointsProvider(\n\t\t\tmemoryStore,\n\t\t\tthis.configurationProvider,\n\t\t\tthis.appContextProvider\n\t\t);\n\t}\n\tget appContext() {\n\t\treturn this.validate(this.appContextProvider);\n\t}\n\tget appUserId() {\n\t\treturn this.validate(this.appUserIdProvider);\n\t}\n\tget browserId() {\n\t\treturn this.validate(this.browserIdProvider);\n\t}\n\tget clientId() {\n\t\treturn this.validate(this.clientIdProvider);\n\t}\n\tget configuration() {\n\t\treturn this.validate(this.configurationProvider);\n\t}\n\tget currentPage() {\n\t\treturn this.validate(this.currentPageProvider);\n\t}\n\tget dataPoints() {\n\t\treturn this.validate(this.dataPointsProvider);\n\t}\n\tget domain() {\n\t\treturn this.validate(this.domainProvider);\n\t}\n\tget tabId() {\n\t\treturn this.validate(this.tabIdProvider);\n\t}\n\tget trackingConsent() {\n\t\treturn this.validate(this.trackingConsentProvider);\n\t}\n\t/**\n\t * Reset session id and lastresponsetime\n\t */\n\tresetSession() {\n\t\tthis.configuration.resetSession();\n\t}\n}\nexport default new DataContext();\n","import {\n\tisObject,\n\tisDefined,\n\tisNonEmptyString,\n\tisString,\n} from '../common/validators';\nimport { SNTypeError } from '../common/errors';\nimport dataContext from '../data-context';\nimport { getValidProperties, extractSystemPropertyValues } from '../common/utils/property-utils';\nimport logger from '../common/logger';\n/**\n * Responsible for recording events and their properties\n */\nexport default class EventRecorder {\n\tadd(name, properties, type) {\n\t\tif (!isNonEmptyString(name)) {\n\t\t\tthrow new SNTypeError(\"Invalid event name: ''\");\n\t\t}\n\n\t\tconst extractedSystemProperties = extractSystemPropertyValues(properties);\n\n\t\tif (isDefined(properties)) {\n\t\t\tif (isObject(properties)) {\n\t\t\t\tproperties = getValidProperties(properties, false, false);\n\t\t\t} else {\n\t\t\t\tproperties = undefined;\n\t\t\t\tlogger.warn('Invalid event properties for event', name);\n\t\t\t}\n\t\t}\n\t\tconst systemProperties = {\n\t\t\tPage: dataContext.currentPage.get(),\n\t\t\t...extractedSystemProperties,\n\t\t};\n\t\tif (isDefined(type)) {\n\t\t\tif (isString(type)) {\n\t\t\t\tsystemProperties.Type = type;\n\t\t\t} else {\n\t\t\t\tlogger.warn('Invalid type', type, 'for event', name);\n\t\t\t}\n\t\t}\n\t\tdataContext.dataPoints.add(1 /* DataPointType.Event */, name, {\n\t\t\tproperties,\n\t\t\tsystemProperties,\n\t\t});\n\t}\n\taddChat(name, properties) {\n\t\tif (!isNonEmptyString(name)) {\n\t\t\tthrow new SNTypeError(\"Invalid event name: ''\");\n\t\t}\n\n\t\tconst conversationId = isObject(properties)\n\t\t\t? properties['Conversation id']\n\t\t\t: undefined;\n\n\t\tif (isDefined(properties)) {\n\t\t\tif (isObject(properties)) {\n\t\t\t\tproperties = getValidProperties(properties, false, false);\n\t\t\t} else {\n\t\t\t\tproperties = undefined;\n\t\t\t\tlogger.warn('Invalid event properties for event', name);\n\t\t\t}\n\t\t}\n\t\tconst systemProperties = {\n\t\t\tPage: dataContext.currentPage.get(),\n\t\t};\n\t\tif (isNonEmptyString(conversationId)) {\n\t\t\tsystemProperties.ConversationId = conversationId;\n\t\t\tdelete properties['Conversation id'];\n\t\t}\n\t\tdataContext.dataPoints.add(4 /* DataPointType.Chat */, name, {\n\t\t\tproperties,\n\t\t\tsystemProperties,\n\t\t});\n\t}\n\taddConsentChange(newConsent, oldConsent) {\n\t\tthis.add('SNAnalyticsTrackingTriggered', {\n\t\t\tValue: newConsent,\n\t\t\tPreviousValue: oldConsent,\n\t\t});\n\t}\n}\n","import { isString, isDefined, isNonEmptyString } from '../common/validators';\nimport { SNTypeError } from '../common/errors';\nimport logger from '../common/logger';\nimport dataContext from '../data-context';\n\nconst MAX_DESCRIPTION_LENGTH = 100;\n/**\n * Responsible for recording page names\n */\nexport default class PageRecorder {\n\tstart(name, description) {\n\t\t// Don't mess with undefined or null name\n\t\tname = name ?? '';\n\t\tif (!isString(name)) {\n\t\t\tthrow new SNTypeError('Page name must be a string');\n\t\t}\n\t\tconst systemProperties = {};\n\t\tif (isDefined(description)) {\n\t\t\tif (!isNonEmptyString(description)) {\n\t\t\t\tlogger.warn('Ignoring empty page description');\n\t\t\t} else if (description.length > MAX_DESCRIPTION_LENGTH) {\n\t\t\t\tlogger.warn(\n\t\t\t\t\t`Ignoring description too long (greater than ${MAX_DESCRIPTION_LENGTH})`\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tsystemProperties.Description = description;\n\t\t\t}\n\t\t}\n\t\tdataContext?.currentPage?.set(name);\n\t\tdataContext?.dataPoints?.add(0 /* DataPointType.Page */, name, {\n\t\t\tsystemProperties,\n\t\t});\n\t}\n}\n","import {\n\tisString,\n\tisNonEmptyString,\n\tisNumber,\n\tisObject,\n} from '../common/validators';\nimport { SNTypeError } from '../common/errors';\nimport logger from '../common/logger';\nimport dataContext from '../data-context';\nimport {\n\tgetValidProperties,\n\tisSystemPropertyKey,\n} from '../common/utils/property-utils';\n/**\n * Responsible for recording users and their properties\n */\nexport default class UserRecorder {\n\tgetAppUserIdOrNull() {\n\t\treturn dataContext.appUserId.get() || null;\n\t}\n\tsetAppUserId(appUserId) {\n\t\t// Replace undefined appUserId with null since User dataPoint name cannot be undefined\n\t\tdataContext.dataPoints.add(\n\t\t\t2 /* DataPointType.User */,\n\t\t\tappUserId || null\n\t\t);\n\t}\n\tremoveProperty(name) {\n\t\tthis.setProperty(name, null);\n\t}\n\tsetProperty(name, value) {\n\t\tthis.setProperties({ [name]: value });\n\t}\n\tsetProperties(properties) {\n\t\tif (!isObject(properties)) {\n\t\t\tlogger.warn('Invalid user properties');\n\t\t\treturn;\n\t\t}\n\t\tproperties = getValidProperties(properties, true, true);\n\t\tdataContext.dataPoints.add(\n\t\t\t2 /* DataPointType.User */,\n\t\t\tthis.getAppUserIdOrNull(),\n\t\t\t{ properties }\n\t\t);\n\t}\n\tincProperty(name, value) {\n\t\tif (!isNumber(value)) {\n\t\t\tthrow new SNTypeError('Property value must be a number');\n\t\t}\n\t\tif (!value) {\n\t\t\tlogger.debug('Ignoring inc user property by zero');\n\t\t\treturn;\n\t\t}\n\t\tthis.operationToProperty(name, value, '$inc' /* Operator.Inc */);\n\t}\n\tappendToProperty(name, value) {\n\t\tif (!isString(value)) {\n\t\t\tthrow new SNTypeError('Property value must be a string');\n\t\t}\n\t\tthis.operationToProperty(\n\t\t\tname,\n\t\t\t[value],\n\t\t\t'$appendToList' /* Operator.AppendToList */\n\t\t);\n\t}\n\toperationToProperty(name, value, operation) {\n\t\tif (!isNonEmptyString(name)) {\n\t\t\tthrow new SNTypeError('Property name must be a string');\n\t\t}\n\t\tif (isSystemPropertyKey(name)) {\n\t\t\tthrow new SNTypeError('Property name has invalid prefix');\n\t\t}\n\t\tdataContext.dataPoints.add(\n\t\t\t2 /* DataPointType.User */,\n\t\t\tthis.getAppUserIdOrNull(),\n\t\t\t{\n\t\t\t\tproperties: {\n\t\t\t\t\t[name]: {\n\t\t\t\t\t\t['op' /* Property.Op */]: operation,\n\t\t\t\t\t\t['val' /* Property.Val */]: value,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t}\n\t\t);\n\t}\n}\n","import logger from '../common/logger';\nimport {\n\tisNonEmptyString,\n\tisNullOrUndefined,\n\tisNumber,\n\tisPositiveInteger,\n\tisString,\n} from '../common/validators';\nimport dataContext from '../data-context';\n\nconst MAX_DURATION = 4 * 60 * 60 * 1000;\nconst MAX_KEY_LENGTH = 255;\nconst MAX_TRACE_TYPE_LENGTH = 100;\nconst MAX_PROP_KEY_LENGTH = 255;\nconst MAX_PROP_VALUE_LENGTH = 255;\nconst MAX_PROPS_COUNT = 20;\nconst NO_DURATION = -1;\nfunction fixDuration(duration) {\n\tif (MAX_DURATION < duration) {\n\t\tlogger.warn(\n\t\t\t'Duration exceeded maximum limit, it has been trimmed to ',\n\t\t\tMAX_DURATION,\n\t\t\t'milliseconds'\n\t\t);\n\t\treturn MAX_DURATION;\n\t}\n\tconst roundedDuration = Math.round(duration);\n\tif (roundedDuration !== duration) {\n\t\tlogger.warn(\n\t\t\t'Performance duration',\n\t\t\tduration,\n\t\t\t'was given in decimal and it was rounded to',\n\t\t\troundedDuration\n\t\t);\n\t\treturn roundedDuration;\n\t}\n\treturn duration;\n}\nfunction fixLength(value, max) {\n\tif (value.length > max) {\n\t\tconst trimmed = value.substring(0, max);\n\t\tlogger.warn(\n\t\t\t'Maximum string length is',\n\t\t\tmax,\n\t\t\t'but length is',\n\t\t\tvalue.length,\n\t\t\t'. The string',\n\t\t\tvalue,\n\t\t\t'will be trimmed to',\n\t\t\ttrimmed\n\t\t);\n\t\treturn trimmed;\n\t}\n\treturn value;\n}\nclass PerformanceTraceImpl {\n\tconstructor(key, type, startTime, duration = NO_DURATION, properties = {}) {\n\t\tthis.key = key;\n\t\tthis.type = type;\n\t\tthis.startTime = startTime;\n\t\tthis.duration = duration;\n\t\tthis.properties = properties;\n\t\tthis.key = fixLength(key, MAX_KEY_LENGTH);\n\t\tthis.type = fixLength(type, MAX_TRACE_TYPE_LENGTH);\n\t}\n\tget traceEnded() {\n\t\treturn this.duration !== NO_DURATION;\n\t}\n\tsend() {\n\t\tif (dataContext.configuration.get('IgnorePerformanceData')) {\n\t\t\tlogger.info('Ignoring performance traces according to config');\n\t\t\treturn;\n\t\t}\n\t\tconst systemProperties = {\n\t\t\tDuration: this.duration,\n\t\t\tTraceType: this.type,\n\t\t};\n\t\tdataContext.dataPoints.add(\n\t\t\t3 /* DataPointType.PerformanceTrace */,\n\t\t\tthis.key,\n\t\t\t{\n\t\t\t\tproperties: this.properties,\n\t\t\t\tsystemProperties,\n\t\t\t\ttimestamp: this.startTime,\n\t\t\t}\n\t\t);\n\t}\n\tend() {\n\t\tif (this.traceEnded) {\n\t\t\tlogger.warn('Trace already ended');\n\t\t\treturn;\n\t\t}\n\t\tlogger.info(\n\t\t\t'End Performance Trace:',\n\t\t\tthis.key,\n\t\t\t'-',\n\t\t\tthis.type,\n\t\t\t'-',\n\t\t\tthis.duration,\n\t\t\t'-',\n\t\t\tthis.properties\n\t\t);\n\t\tthis.duration = fixDuration(Date.now() - this.startTime);\n\t\tthis.send();\n\t}\n\tsetProperty(key, value) {\n\t\tif (this.traceEnded) {\n\t\t\tlogger.warn('Ignoring set property since trace already ended');\n\t\t\treturn;\n\t\t}\n\t\tif (!isNonEmptyString(key)) {\n\t\t\tlogger.warn('Invalid performance key', key);\n\t\t\treturn;\n\t\t}\n\t\tif (isNullOrUndefined(value)) {\n\t\t\tthis.removeProperty(key);\n\t\t\treturn;\n\t\t}\n\t\tif (!isString(value)) {\n\t\t\tlogger.warn(\n\t\t\t\t'Invalid performance value',\n\t\t\t\tvalue,\n\t\t\t\t'for property with key',\n\t\t\t\tkey\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\t\tkey = fixLength(key, MAX_PROP_KEY_LENGTH);\n\t\tvalue = fixLength(value, MAX_PROP_VALUE_LENGTH);\n\t\tif (\n\t\t\tObject.keys(this.properties).length >= MAX_PROPS_COUNT &&\n\t\t\t!(key in this.properties)\n\t\t) {\n\t\t\tlogger.warn(\n\t\t\t\t'Ignoring property',\n\t\t\t\tkey,\n\t\t\t\t'since each trace is limited to',\n\t\t\t\tMAX_PROPS_COUNT,\n\t\t\t\t'properties'\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\t\tlogger.info('Setting performance property:', key, 'with value:', value);\n\t\tthis.properties[key] = value;\n\t}\n\tsetProperties(properties) {\n\t\tif (this.traceEnded) {\n\t\t\tlogger.warn('Ignoring set properties since trace already ended');\n\t\t\treturn;\n\t\t}\n\t\tfor (const [key] of Object.entries(properties)) {\n\t\t\tthis.setProperty(key, properties[key]);\n\t\t}\n\t}\n\tremoveProperty(key) {\n\t\tif (this.traceEnded) {\n\t\t\tlogger.warn('Ignoring remove property since trace already ended');\n\t\t\treturn;\n\t\t}\n\t\tkey = fixLength(key, MAX_PROP_KEY_LENGTH);\n\t\tdelete this.properties[key];\n\t}\n}\n/**\n * Responsible for recording performance traces\n */\nexport default class PerformanceTraceRecorder {\n\tstart(key, type) {\n\t\tif (!this.validateTrace(key, type)) {\n\t\t\treturn undefined;\n\t\t}\n\t\treturn new PerformanceTraceImpl(key, type, Date.now());\n\t}\n\tadd(key, type, durationMS, properties, startTime) {\n\t\tif (!this.validateTrace(key, type)) {\n\t\t\treturn;\n\t\t}\n\t\tif (!isNumber(durationMS) || durationMS < 0) {\n\t\t\tlogger.warn('Invalid durationMS for performance trace');\n\t\t\treturn;\n\t\t}\n\t\tdurationMS = fixDuration(durationMS);\n\t\tstartTime =\n\t\t\tstartTime instanceof Date\n\t\t\t\t? startTime.getTime()\n\t\t\t\t: (startTime ?? Date.now() - durationMS);\n\t\tif (!isPositiveInteger(startTime, true)) {\n\t\t\tlogger.warn('Invalid startTime for performance trace');\n\t\t\treturn;\n\t\t}\n\t\tconst trace = new PerformanceTraceImpl(\n\t\t\tkey,\n\t\t\ttype,\n\t\t\tstartTime,\n\t\t\tdurationMS,\n\t\t\tproperties\n\t\t);\n\t\ttrace.send();\n\t}\n\tvalidateTrace(key, type) {\n\t\tif (!isNonEmptyString(key)) {\n\t\t\tlogger.warn('Invalid key for performance trace');\n\t\t\treturn false;\n\t\t}\n\t\tif (!isNonEmptyString(type)) {\n\t\t\tlogger.warn('Invalid type for performance trace');\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t}\n}\n","import EventRecorder from './event-recorder';\nimport PageRecorder from './page-recorder';\nimport UserRecorder from './user-recorder';\nimport PerformanceTraceRecorder from './performance-recorder';\n/**\n * Top level recorder that is used to aggregate all the dedicated recorders\n */\nexport default class MetadataRecorder {\n\tconstructor() {\n\t\tthis.eventRecorder = new EventRecorder();\n\t\tthis.pageRecorder = new PageRecorder();\n\t\tthis.userRecorder = new UserRecorder();\n\t\tthis.performanceRecorder = new PerformanceTraceRecorder();\n\t}\n\tget event() {\n\t\treturn this.eventRecorder;\n\t}\n\tget page() {\n\t\treturn this.pageRecorder;\n\t}\n\tget user() {\n\t\treturn this.userRecorder;\n\t}\n\tget performance() {\n\t\treturn this.performanceRecorder;\n\t}\n}\n","import Consts from './consts';\n/**\n * Utility class for environment variables\n */\nexport default class Environment {\n\tstatic getScreenDimension() {\n\t\tconst { height, width } = Consts.inBrowser\n\t\t\t? window.screen\n\t\t\t: { height: 0, width: 0 };\n\t\treturn { height: height || 0, width: width || 0 };\n\t}\n\tstatic getSystemLocale() {\n\t\tif (Consts.inBrowser) {\n\t\t\treturn window.navigator.language.toLowerCase();\n\t\t}\n\t\treturn process.env.LANG;\n\t}\n\tstatic getClientTimezone() {\n\t\treturn Intl.DateTimeFormat().resolvedOptions().timeZone;\n\t}\n\tstatic getTimezoneOffset() {\n\t\t// For Israel which is GMT + 2 with DST on currently:\n\t\tconst offset = new Date().getTimezoneOffset();\n\t\treturn offset; // -180\n\t}\n}\n","import Consts from '../common/consts';\nimport logger from '../common/logger';\nimport { HttpError } from '../common/errors';\n\nconst omit = (obj, keys) => {\n\tconst retVal = {};\n\n\tfor (const k in obj) {\n\t\tif (!keys.includes(k)) retVal[k] = obj[k];\n\t}\n\treturn retVal;\n};\nexport default async function universalFetch(url, options, timeout) {\n\tlet response;\n\tlet requestTimeoutId = 0;\n\tif (Consts.inBrowser) {\n\t\t// Use `AbortController` to stop the request upon timeout\n\t\tconst controller = new AbortController();\n\t\tconst { signal } = controller;\n\t\tconst fetchPromise = fetch(url, { ...options });\n\t\trequestTimeoutId = window.setTimeout(\n\t\t\t() => controller.abort(),\n\t\t\toptions.timeout\n\t\t);\n\t\tresponse = await fetchPromise;\n\t} else {\n\t\tconst axios = (await import('axios')).default;\n\t\ttry {\n\t\t\tresponse = await axios(url, {\n\t\t\t\t// ...omit(options, ['mode', 'cache', 'referrer']),\n\t\t\t\tdata: options.body,\n\t\t\t\theaders: options.headers,\n\t\t\t\tmethod: options.method,\n\t\t\t\twithCredentials: true,\n\t\t\t\ttimeout: timeout, // Remove unwanted options\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tlogger.warn(error);\n\t\t\treturn Promise.reject({ error: new HttpError() });\n\t\t}\n\t}\n\ttry {\n\t\tconst responseBody = Consts.inBrowser\n\t\t\t? await response.json()\n\t\t\t: response.data.result;\n\t\tconst isResponseOk = Consts.inBrowser\n\t\t\t? response.ok\n\t\t\t: response.statusText === 'OK';\n\t\tconst responseStatusCode = response.status;\n\t\treturn Promise.resolve({\n\t\t\theaders: response.headers,\n\t\t\tdata: responseBody,\n\t\t\tok: isResponseOk,\n\t\t\tstatus: responseStatusCode,\n\t\t\terror: null,\n\t\t});\n\t} catch (error) {\n\t\t// Problem with parsing the response into JSON\n\t\tlogger.warn(\n\t\t\t`Server call to '${url}' failed. Response is`,\n\t\t\tConsts.inBrowser ? response.status : response.statusCode,\n\t\t\terror\n\t\t);\n\t\t// noinspection ES6MissingAwait\n\t\treturn Promise.reject({ error: new HttpError() });\n\t} finally {\n\t\tclearTimeout(requestTimeoutId);\n\t}\n}\n","import logger from '../common/logger';\nimport dataContext from '../data-context';\nimport Consts from '../common/consts';\nimport { HttpError } from '../common/errors';\nimport { removeFalsyEntries } from '../common/utils/object-utils';\nimport { getTime } from '../common/utils/date-utils';\nimport universalFetch from './fetch';\nimport Environment from '../common/environment';\n\nconst rejectWithError = (status) => {\n\tif (status === 401) {\n\t\t// noinspection ES6MissingAwait\n\t\treturn Promise.reject(\n\t\t\tnew HttpError(2 /* ErrorCode.MetricAuthTokenInvalidOrExpired */)\n\t\t);\n\t}\n\tif (status >= 400 && status < 500) {\n\t\t// noinspection ES6MissingAwait\n\t\treturn Promise.reject(\n\t\t\tnew HttpError(3 /* ErrorCode.MetricBadRequest */)\n\t\t);\n\t}\n\tif (status >= 500) {\n\t\t// noinspection ES6MissingAwait\n\t\treturn Promise.reject(\n\t\t\tnew HttpError(4 /* ErrorCode.MetricServerError */)\n\t\t);\n\t}\n\treturn Promise.reject(new HttpError());\n};\nconst getHttpHeaders = async () =>\n\t// If for some reason data is empty, remove it so \"undefined\" string won't be passed.\n\t// It could happen, for example, if right before this statement localStorage is cleared by the user.\n\t// The server will fail requests with missing headers\n\tremoveFalsyEntries({\n\t\t'X-Transaction-Source': Consts.inBrowser\n\t\t\t? window.transaction_source\n\t\t\t: false,\n\t\t'X-UserToken': Consts.inBrowser ? window.g_ck : false,\n\t});\nconst getMetricAPIHttpHeaders = async () => {\n\t// If for some reason data is empty, remove it so \"undefined\" string won't be passed.\n\t// It could happen, for example, if right before this statement localStorage is cleared by the user.\n\t// The server will fail requests with missing headers\n\tconst snOriginHeader =\n\t\tConsts.instanceDomainName && Consts.instanceDomainName !== ''\n\t\t\t? { 'X-SN-Origin': 'https://' + Consts.instanceDomainName }\n\t\t\t: {};\n\treturn removeFalsyEntries({\n\t\tVersion: Consts.VERSION,\n\t\tAPIKey: dataContext.configuration.get('ApiKey'),\n\t\tBrowserId: await dataContext.browserId.getOrCreate(),\n\t\t// X-AppSysId is only for anonymous or un-authenticated users.\n\t\tAppsysid:\n\t\t\tdataContext.configuration.get('ApiKey')?.split(':')[1] &&\n\t\t\t!dataContext.appUserId.get()\n\t\t\t\t? dataContext.configuration.get('ApiKey')?.split(':')[1]\n\t\t\t\t: '',\n\t\tInstancename: dataContext.configuration.get('InstanceName')\n\t\t\t? dataContext.configuration.get('InstanceName')\n\t\t\t: '',\n\t\tUserid: dataContext.configuration.get('AppUserId')\n\t\t\t? dataContext.configuration.get('AppUserId')\n\t\t\t: '',\n\t\t...snOriginHeader,\n\t});\n};\n/**\n * Make a server request using POST. Headers are automatically filled.\n * @param endpoint Request endpoint\n * @param body JSON representing the request body\n * @param timeout Timeout for the request in milliseconds\n */\nexport const postData = async (endpoint, body, headers, timeout) => {\n\ttry {\n\t\tconst time = getTime();\n\t\tconst { data, ok, status, error } = await universalFetch(\n\t\t\tendpoint,\n\t\t\t{\n\t\t\t\tbody: JSON.stringify(body),\n\t\t\t\tmethod: 'POST',\n\t\t\t\tmode:\n\t\t\t\t\tConsts.instanceDomainName &&\n\t\t\t\t\tConsts.instanceDomainName !== ''\n\t\t\t\t\t\t? 'cors'\n\t\t\t\t\t\t: 'same-origin',\n\t\t\t\tcache: 'no-cache',\n\t\t\t\treferrer: 'no-referrer',\n\t\t\t\tcredentials: 'include',\n\t\t\t\theaders: {\n\t\t\t\t\t...headers,\n\t\t\t\t\t...(await getMetricAPIHttpHeaders()),\n\t\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t},\n\t\t\t},\n\t\t\ttimeout\n\t\t);\n\t\tlogger.debug(\n\t\t\t`Profiler: '${endpoint}' request took`,\n\t\t\tgetTime() - time,\n\t\t\t'ms'\n\t\t);\n\t\tif (error) {\n\t\t\treturn Promise.reject(error);\n\t\t}\n\t\tif (ok) {\n\t\t\treturn Promise.resolve(data);\n\t\t}\n\t\treturn rejectWithError(status);\n\t} catch (error) {\n\t\treturn Promise.reject(new HttpError());\n\t}\n};\nexport const getData = async (endpoint, timeout) => {\n\ttry {\n\t\tconst time = getTime();\n\t\tlet parsedStoredData = {};\n\t\ttry {\n\t\t\tconst storedData = Consts.inBrowser\n\t\t\t\t? sessionStorage.getItem('AppRegistrationMetadata')\n\t\t\t\t: '{}';\n\t\t\tparsedStoredData = storedData ? JSON.parse(storedData) : {};\n\t\t} catch (error) {\n\t\t\tlogger.warn('Failed to retrieve or parse app registration metadata from sessionStorage:', error);\n\t\t\t// Use empty object as fallback if sessionStorage is unavailable or cleared\n\t\t}\n\t\tconst domain = dataContext.domain.get();\n\t\tconst Appsysid =\n\t\t\tdataContext.configuration.get('ApiKey')?.split(':').slice(-1)[0] ||\n\t\t\t'' ||\n\t\t\t'';\n\t\tconst appRegistrationMetadata =\n\t\t\tparsedStoredData && parsedStoredData[Appsysid]\n\t\t\t\t? parsedStoredData[Appsysid]\n\t\t\t\t: {};\n\t\tconst snOriginHeader =\n\t\t\tConsts.instanceDomainName && Consts.instanceDomainName !== ''\n\t\t\t\t? { 'X-SN-Origin': Consts.instanceDomainName }\n\t\t\t\t: {};\n\t\tconst { headers, data, ok, status, error } = await universalFetch(\n\t\t\tendpoint,\n\t\t\t{\n\t\t\t\tmethod: 'GET',\n\t\t\t\tcredentials: 'include',\n\t\t\t\theaders: {\n\t\t\t\t\t...(await getHttpHeaders()),\n\t\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t\tAppsysid,\n\t\t\t\t\tBrowserid: await dataContext.browserId.getOrCreate(),\n\t\t\t\t\tAppUserId: dataContext.appUserId.get(),\n\t\t\t\t\tSessionId: dataContext.configuration.get('SessionId'),\n\t\t\t\t\tScreenHeight: Environment.getScreenDimension().height,\n\t\t\t\t\tScreenWidth: Environment.getScreenDimension().width,\n\t\t\t\t\tDomainId: domain?.id,\n\t\t\t\t\tSystemLocale: Environment.getSystemLocale(),\n\t\t\t\t\tClientTimezone: Environment.getClientTimezone(),\n\t\t\t\t\tClientTimezoneOffset: Environment.getTimezoneOffset(),\n\t\t\t\t\tTabId: dataContext.tabId.getOrCreate(),\n\t\t\t\t\tTrackingLevel: dataContext.trackingConsent.get(),\n\t\t\t\t\tName: encodeURIComponent(appRegistrationMetadata?.name || ''),\n\t\t\t\t\tChanneltype: appRegistrationMetadata?.channelType || '',\n\t\t\t\t\tTablename: appRegistrationMetadata?.tableName || '',\n\t\t\t\t\t...snOriginHeader,\n\t\t\t\t},\n\t\t\t},\n\t\t\ttimeout\n\t\t);\n\t\tlogger.debug(\n\t\t\t`Profiler: '${endpoint}' request took`,\n\t\t\tgetTime() - time,\n\t\t\t'ms'\n\t\t);\n\t\tif (error) {\n\t\t\treturn Promise.reject(error);\n\t\t}\n\t\tif (ok) {\n\t\t\treturn Promise.resolve({ data: data?.result || data, headers });\n\t\t}\n\t\treturn rejectWithError(status);\n\t} catch (error) {\n\t\treturn Promise.reject(new HttpError());\n\t}\n};\n","export function decorateMethod(target, methodName, ...decorators) {\n\tconst descriptor = Object.getOwnPropertyDescriptor(\n\t\ttarget.prototype,\n\t\tmethodName\n\t);\n\tif (!descriptor) return;\n\tlet newDescriptor = descriptor;\n\tfor (const decorator of decorators.reverse()) {\n\t\tnewDescriptor =\n\t\t\tdecorator(target.prototype, methodName, newDescriptor) ||\n\t\t\tnewDescriptor;\n\t}\n\tObject.defineProperty(target.prototype, methodName, newDescriptor);\n}\n","import logger from '../common/logger';\n\nexport function CatchAll(target, name, descriptor) {\n\tconst originalMethod = descriptor.value;\n\tdescriptor.value = function (...args) {\n\t\ttry {\n\t\t\treturn originalMethod.apply(this, args);\n\t\t} catch (error) {\n\t\t\tlogger.warn(`Error in ${name}:`, error);\n\t\t}\n\t};\n\treturn descriptor;\n}\n\nexport function CatchAllAndReturn(defaultValue) {\n\treturn function (target, name, descriptor) {\n\t\tconst originalMethod = descriptor.value;\n\t\tdescriptor.value = function (...args) {\n\t\t\ttry {\n\t\t\t\treturn originalMethod.apply(this, args);\n\t\t\t} catch (error) {\n\t\t\t\tlogger.warn(`Error in ${name}:`, error);\n\t\t\t\treturn defaultValue;\n\t\t\t}\n\t\t};\n\t\treturn descriptor;\n\t};\n}\n","import dataContext from '../data-context';\nimport Environment from '../common/environment';\nimport { postData, getData } from './server-proxy';\nimport { getTime, toISOString } from '../common/utils/date-utils';\nimport logger from '../common/logger';\nimport Consts from '../common/consts';\nimport { decorateMethod } from '../decorator/utils';\nimport { CatchAllAndReturn } from '../decorator/common';\n\nconst goodResponse = (data) => ({ ok: true, data });\nconst badResponse = (errorCode, data) => ({\n\tok: false,\n\terrorCode,\n\tdata,\n});\nconst getUrl = (path) => {\n\tlet url = '';\n\tif (Consts.instanceDomainName) {\n\t\turl = 'https://' + Consts.instanceDomainName + path;\n\t} else url = path;\n\treturn url;\n};\nconst getToken = (cookies) => {\n\tconst [key, token] = (\n\t\tcookies.find((cookie) => cookie.trim().startsWith('UX-Token=')) || ''\n\t).split('=');\n\treturn token;\n};\nconst SERVER_REQUEST_TIMEOUT = 60 * 1000; // 1 minute\n/**\n * Class with static members that handles the SDK network activities\n */\nclass Networker {\n\t/**\n\t * Get configuration from server and saves it\n\t */\n\tstatic async getConfiguration(requestId) {\n\t\tconst { height, width } = Environment.getScreenDimension();\n\t\tconst domain = dataContext.domain.get();\n\t\t// Get Analytics Configuration from Instance\n\t\tconst { data: configData, headers } = await getData(\n\t\t\tgetUrl('/api/now/analytics/config'),\n\t\t\tSERVER_REQUEST_TIMEOUT\n\t\t);\n\t\tconst response = {\n\t\t\t...JSON.parse(configData),\n\t\t\tRequestId: requestId,\n\t\t\tuxToken: !Consts.inBrowser ? getToken(headers['set-cookie']) : null,\n\t\t};\n\t\tif (!dataContext.configuration.isValidConfigResponse(response)) {\n\t\t\tlogger.warn(\n\t\t\t\t'Configuration response for request id',\n\t\t\t\trequestId,\n\t\t\t\t'is not valid:',\n\t\t\t\tresponse\n\t\t\t);\n\t\t\treturn badResponse();\n\t\t}\n\t\tconst mergedConfiguration =\n\t\t\tdataContext.configuration.getMergedConfigurationWithConfigResponse(\n\t\t\t\tresponse\n\t\t\t);\n\t\t// Check that while configuration request was going on, no new config got called\n\t\tif (requestId !== dataContext.configuration.get('RequestId')) {\n\t\t\tlogger.warn(\n\t\t\t\t'Ignoring old configuration with request id',\n\t\t\t\trequestId,\n\t\t\t\t'and session id',\n\t\t\t\tmergedConfiguration.SessionId\n\t\t\t);\n\t\t\treturn badResponse(\n\t\t\t\t1 /* ErrorCode.ConfigurationNotFound */,\n\t\t\t\tmergedConfiguration.SessionId\n\t\t\t);\n\t\t}\n\t\tdataContext.configuration.fillWithJson(mergedConfiguration);\n\t\tdataContext.configuration.updateServerResponseTime();\n\t\tlogger.debug(\n\t\t\t'Networker got valid configuration response',\n\t\t\tmergedConfiguration\n\t\t);\n\t\treturn goodResponse();\n\t}\n\t/**\n\t * Send heartbeat data to the server\n\t */\n\tstatic async sendMetric(dataPointsResult) {\n\t\ttry {\n\t\t\tconst { height, width } = Environment.getScreenDimension();\n\t\t\tconst domain = dataContext.domain.get();\n\t\t\tconst serverData = Consts.inBrowser\n\t\t\t\t? {}\n\t\t\t\t: {\n\t\t\t\t\t\tCookie: `UX-Token=${dataContext.configuration.get('uxToken')}`,\n\t\t\t\t\t\tOrigin: getUrl(''),\n\t\t\t\t\t};\n\t\t\tawait postData(\n\t\t\t\tgetUrl('/uxa/now/web/metric'),\n\t\t\t\t{\n\t\t\t\t\tSessionId: dataPointsResult.sessionId,\n\t\t\t\t\tSessionIdCreatedTime: dataPointsResult.sessionIdCreatedTime,\n\t\t\t\t\tDataPoints: dataPointsResult.dataPoints,\n\t\t\t\t\tChannelType:\n\t\t\t\t\t\tdataPointsResult.channelNumber &&\n\t\t\t\t\t\tdataPointsResult.channelNumber !== -1\n\t\t\t\t\t\t\t? dataPointsResult.channelNumber\n\t\t\t\t\t\t\t: dataPointsResult.channelType,\n\t\t\t\t\tScreenHeight: height,\n\t\t\t\t\tScreenWidth: width,\n\t\t\t\t\tSystemLocale: Environment.getSystemLocale(),\n\t\t\t\t\tClientTimezone: Environment.getClientTimezone(),\n\t\t\t\t\tClientTimezoneOffset: Environment.getTimezoneOffset(),\n\t\t\t\t\tAppUserId: dataPointsResult.appUserId,\n\t\t\t\t\tTabId: dataContext.tabId.getOrCreate(),\n\t\t\t\t\tClientTime: toISOString(getTime()),\n\t\t\t\t\tDomainId: domain?.id,\n\t\t\t\t\tDomainName: domain?.name,\n\t\t\t\t\tTrackingLevel: dataPointsResult.trackingLevel,\n\t\t\t\t\tAppContextId: dataPointsResult.appContextId,\n\t\t\t\t\tAppContextName: dataPointsResult.appContextName,\n\t\t\t\t\tAppSysId: dataContext.configuration\n\t\t\t\t\t\t.get('ApiKey')\n\t\t\t\t\t\t?.split(':')\n\t\t\t\t\t\t.slice(-1)[0],\n\t\t\t\t},\n\t\t\t\t{ ...serverData },\n\t\t\t\tSERVER_REQUEST_TIMEOUT\n\t\t\t);\n\t\t\t// Update time if metric was successful\n\t\t\tdataContext.configuration.updateServerResponseTime();\n\t\t\tlogger.debug('Networker sent metric');\n\t\t\treturn goodResponse();\n\t\t} catch (error) {\n\t\t\treturn error.errorCode\n\t\t\t\t? badResponse(error.errorCode)\n\t\t\t\t: badResponse();\n\t\t}\n\t}\n\t/**\n\t * Get AnalyticsGatewayAuthToken from Instance and Update in Configuration\n\t */\n\tstatic async getToken(endpoint) {\n\t\t// Get Analytics Configuration from Instance\n\t\tconst { data: analyticsGatewayAuthToken } = await getData(\n\t\t\tgetUrl(endpoint),\n\t\t\tSERVER_REQUEST_TIMEOUT\n\t\t);\n\t\tlogger.debug('Updated Analytics AnalyticsGatewayAuthToken');\n\t\treturn analyticsGatewayAuthToken;\n\t}\n\t/**\n\t * Send a request to the server to delete user data\n\t */\n\tstatic async deleteUserData(appUserId) {\n\t\tawait postData(\n\t\t\tgetUrl('delete-data'),\n\t\t\t{ AppUserId: appUserId },\n\t\t\t{},\n\t\t\tSERVER_REQUEST_TIMEOUT\n\t\t);\n\t\tlogger.debug('Networker deleted user');\n\t\treturn goodResponse();\n\t}\n}\n\n// Decorate methods with Catch logic\ndecorateMethod(Networker, 'getConfiguration', CatchAllAndReturn({ ok: false }));\ndecorateMethod(Networker, 'sendMetric', CatchAllAndReturn({ ok: false }));\ndecorateMethod(Networker, 'getTaggedEvents', CatchAllAndReturn({ ok: false }));\ndecorateMethod(Networker, 'getToken', CatchAllAndReturn(''));\ndecorateMethod(Networker, 'deleteUserData', CatchAllAndReturn({ ok: false }));\n\nexport default Networker;\n","import logger from './common/logger';\nimport dataContext from './data-context';\nimport Networker from './network/networker';\nimport Consts from './common/consts';\n/**\n * Handles sending data points to the server using metrics\n */\nexport default class MetricManager {\n\tconstructor(configurationLifecycleManager) {\n\t\tthis.configurationLifecycleManager = configurationLifecycleManager;\n\t\tthis.metricTimeoutId = 0;\n\t\tthis.metricErrorCounter = 0;\n\t}\n\t/**\n\t * Start the metric calls\n\t * The function is idempotent so it can be called also to ensure metrics are started\n\t */\n\tstartMetrics() {\n\t\tif (this.metricTimeoutId) {\n\t\t\treturn;\n\t\t}\n\t\tlogger.info('Starting metrics');\n\t\t// Calls metric, wait for it to finish, and start a new metric call\n\t\t// Metrics are sent one at the time in order to successfully handle the DataPoints queue\n\t\tconst metric = async () => {\n\t\t\ttry {\n\t\t\t\tif (\n\t\t\t\t\tdataContext.configuration.get('IsGettingConfiguration') ===\n\t\t\t\t\t\tfalse &&\n\t\t\t\t\tdataContext.configuration.get('AnalyticsChannelNumber') !==\n\t\t\t\t\t\t-1 &&\n\t\t\t\t\tdocument.readyState === 'complete'\n\t\t\t\t) {\n\t\t\t\t\tawait this.sendMetric();\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\t// Catch failed metric so a new one could start\n\t\t\t\tlogger.warn('Metric failed', error);\n\t\t\t}\n\t\t\t// Start a new timer for metric\n\t\t\tthis.metricTimeoutId = Number(\n\t\t\t\tsetTimeout(\n\t\t\t\t\tmetric,\n\t\t\t\t\tdataContext.configuration.get('HeartbeatInterval')\n\t\t\t\t)\n\t\t\t);\n\t\t};\n\t\t// Make the first metric call without waiting an interval.\n\t\t// We want to make sure we send everything we got immediately upon refresh or after getting configuration\n\t\tthis.metricTimeoutId = Number(setTimeout(metric));\n\t}\n\t/**\n\t * Stop the metric calls\n\t * The function is idempotent so it can be called also to ensure metrics are stopped\n\t */\n\tstopMetrics() {\n\t\tlogger.info('Stop metrics');\n\t\tclearTimeout(this.metricTimeoutId);\n\t\tthis.metricTimeoutId = 0;\n\t}\n\t// noinspection JSMethodCanBeStatic\n\t/**\n\t * Prepare the metric, sends it, and delete data that was successfully sent to the server\n\t */\n\tasync sendMetric() {\n\t\t// Save the first n records from the dataPoints queue.\n\t\t// Queue only adds elements to the end of the queue and never prepend so when\n\t\t// we have response from server we can safely delete this first n elements.\n\t\tconst dataPointsResult = dataContext.dataPoints.select(\n\t\t\tdataContext.configuration.get('MaxDataPointsPerHeartbeat'),\n\t\t\tdataContext.configuration.get('AnalyticsChannelType'),\n\t\t\tdataContext.configuration.get('AnalyticsChannelNumber')\n\t\t);\n\t\tif (!dataPointsResult?.dataPoints.length) {\n\t\t\tlogger.debug('Metric skipped: No data points to send');\n\t\t\treturn;\n\t\t}\n\t\t// Send metric data\n\t\tlogger.info('Send metric:', dataPointsResult);\n\t\tconst response = await Networker.sendMetric(dataPointsResult);\n\t\t// Delete the data points that were received by the server\n\t\tif (response.ok) {\n\t\t\tlogger.info('Metric sent successfully');\n\t\t\tdataContext.dataPoints.deleteByCount(\n\t\t\t\tdataPointsResult.dataPoints.length\n\t\t\t);\n\t\t\tthis.metricErrorCounter = 0;\n\t\t\t// If metric was failed because the session ended (not found), delete its data points\n\t\t\t// Check we have more attempts for sending\n\t\t} else if (this.metricErrorCounter < Consts.MAX_METRIC_CALL_ATTEMPTS) {\n\t\t\tthis.metricErrorCounter++;\n\t\t\tlogger.info(\n\t\t\t\t`Metric failed for a session ${dataPointsResult.sessionId},`,\n\t\t\t\t`trying again: (attempt ${this.metricErrorCounter}/${Consts.MAX_METRIC_CALL_ATTEMPTS})`\n\t\t\t);\n\t\t\tif (response?.errorCode === 3 /* ErrorCode.MetricBadRequest */) {\n\t\t\t\t// No action on bad request error, add event should correct the configuration if required.\n\t\t\t\tlogger.info(\n\t\t\t\t\t`MetricBadRequest: Metric API failed for the session, SDK should not fall in this state: ${dataPointsResult.sessionId},`,\n\t\t\t\t\t`total datapoints deleted: (${dataPointsResult.dataPoints.length})`\n\t\t\t\t);\n\t\t\t\tdataContext.dataPoints.deleteByCount(\n\t\t\t\t\tdataPointsResult.dataPoints.length\n\t\t\t\t);\n\t\t\t\tthis.metricErrorCounter = 0;\n\t\t\t}\n\t\t\tif (response?.errorCode === 4 /* ErrorCode.MetricServerError */) {\n\t\t\t\t// No action on server error, set the retry counter to max.\n\t\t\t\tlogger.info(\n\t\t\t\t\t`MetricServerError: Metric API failed for the session, Gateway returned Server Error: ${dataPointsResult.sessionId},`,\n\t\t\t\t\t`total datapoints deleted: (${dataPointsResult.dataPoints.length})`\n\t\t\t\t);\n\t\t\t\tdataContext.dataPoints.deleteByCount(\n\t\t\t\t\tdataPointsResult.dataPoints.length\n\t\t\t\t);\n\t\t\t\tthis.metricErrorCounter = 0;\n\t\t\t}\n\t\t\tif (\n\t\t\t\tresponse?.errorCode ===\n\t\t\t\t2 /* ErrorCode.MetricAuthTokenInvalidOrExpired */\n\t\t\t) {\n\t\t\t\t// Send metric data\n\t\t\t\tlogger.info(\n\t\t\t\t\t'MetricAuthTokenInvalidOrExpired: Configuration refresh started - ',\n\t\t\t\t\tdataPointsResult.sessionId\n\t\t\t\t);\n\t\t\t\tawait this.configurationLifecycleManager.startNewConfiguration();\n\t\t\t\tlogger.info(\n\t\t\t\t\t'MetricAuthTokenInvalidOrExpired: Configuration refresh completed - ',\n\t\t\t\t\tdataPointsResult.sessionId\n\t\t\t\t);\n\t\t\t}\n\t\t} else {\n\t\t\tlogger.info(\n\t\t\t\t`Metric failed for a session ${dataPointsResult.sessionId},`,\n\t\t\t\t`total datapoints deleted: (${dataPointsResult.dataPoints.length})`\n\t\t\t);\n\t\t\tdataContext.dataPoints.deleteByCount(\n\t\t\t\tdataPointsResult.dataPoints.length\n\t\t\t);\n\t\t\tthis.metricErrorCounter = 0;\n\t\t}\n\t}\n}\n","import dataContext from './data-context';\nimport logger from './common/logger';\nimport { getGuid } from './common/utils/string-utils';\nimport MetadataRecorder from './recorders/metadata-recorder';\nimport Consts from './common/consts';\nimport { isDefined } from './common/validators';\nimport Networker from './network/networker';\n\nexport var ConfigurationState;\n(function (ConfigurationState) {\n\t/**\n\t * Created and haven't get config response yet\n\t */\n\tConfigurationState[(ConfigurationState['Created'] = 0)] = 'Created';\n\t/**\n\t * Got config and alive\n\t */\n\tConfigurationState[(ConfigurationState['Started'] = 1)] = 'Started';\n\t/**\n\t * Config was ended\n\t */\n\tConfigurationState[(ConfigurationState['Ended'] = 2)] = 'Ended';\n})(ConfigurationState || (ConfigurationState = {}));\n/**\n * Determines what is the state of the current session been tracked\n */\nexport default class ConfigurationLifecycleManager {\n\tconstructor() {\n\t\tthis.isGettingCurrSessionConfig = false;\n\t\tthis.metadataRecorder = new MetadataRecorder();\n\t}\n\tgetIsGettingCurrSessionConfig() {\n\t\treturn this.isGettingCurrSessionConfig;\n\t}\n\tsetIsGettingConfiguration(requestId, isGettingConfiguration) {\n\t\t// Check that request id is latest to avoid changing state of\n\t\t// curr session because received old config before new one arrived\n\t\tif (requestId === dataContext.configuration.get('RequestId')) {\n\t\t\tthis.isGettingCurrSessionConfig = isGettingConfiguration;\n\t\t}\n\t}\n\t// Missing User Id from the below two variables means it is an anonymous user\n\t// and the config refresh decision will be taken further by configReloadTime variable\n\t// and not by this function.\n\t// In all other scenarios this function will return the comparison value between these two variables.\n\tisUserChanged() {\n\t\tif (\n\t\t\t(dataContext.configuration.get('AppUserId') === undefined ||\n\t\t\t\tdataContext.configuration.get('AppUserId') === '') &&\n\t\t\t(dataContext.appUserId.get() === undefined ||\n\t\t\t\tdataContext.appUserId.get() === '')\n\t\t) {\n\t\t\treturn false;\n\t\t}\n\t\treturn (\n\t\t\tdataContext.configuration.get('AppUserId') !==\n\t\t\tdataContext.appUserId.get()\n\t\t);\n\t}\n\treloadConfigurationIfNeeded() {\n\t\treturn dataContext.configuration.reloadConfigurationIfNeeded();\n\t}\n\tgetCurrentState() {\n\t\t// If user is changed from some authenticated user to anonymous user, session is immediately considered terminated\n\t\tif (!this.isGettingCurrSessionConfig && this.isUserChanged()) {\n\t\t\tlogger.debug(\n\t\t\t\t`Configuration Lifecycle: User switched from ${dataContext.configuration.get('AppUserId')} to ${dataContext.appUserId.get()} , Configuration needs reload.`\n\t\t\t);\n\t\t\treturn ConfigurationState.Ended;\n\t\t}\n\t\tif (\n\t\t\t!this.isGettingCurrSessionConfig &&\n\t\t\tthis.reloadConfigurationIfNeeded()\n\t\t) {\n\t\t\tlogger.debug('Configuration Lifecycle: Configuration needs reload');\n\t\t\treturn ConfigurationState.Ended;\n\t\t}\n\t\treturn ConfigurationState.Started;\n\t}\n\tasync startNewConfiguration() {\n\t\tconst requestId = getGuid();\n\t\tlogger.info('Starting new configuration with request id', requestId);\n\t\tdataContext.configuration.startNewConfiguration(requestId);\n\t\tthis.setIsGettingConfiguration(requestId, true);\n\t\tconst response = await Networker.getConfiguration(requestId);\n\t\tthis.setIsGettingConfiguration(requestId, false);\n\t\tdataContext.configuration.updateInstanceConfigCallInProgress(false);\n\t\tif (response.ok) {\n\t\t\tthis.gotConfiguration(requestId);\n\t\t} else {\n\t\t\tlogger.warn('Got bad config response for request id', requestId);\n\t\t\tdataContext.dataPoints.deletePreSessionItems(requestId);\n\t\t}\n\t}\n\tgotConfiguration(requestId) {\n\t\tlogger.info(\n\t\t\t'Got session id:',\n\t\t\tdataContext.configuration.get('SessionId')\n\t\t);\n\t\t// Need to assign all pre session items so they could be sent on heartbeats\n\t\tdataContext.dataPoints.assignPreSessionItems(\n\t\t\trequestId,\n\t\t\tdataContext.configuration.get('SessionId'),\n\t\t\tdataContext.configuration.get('ConfigReceivedTime'),\n\t\t\tdataContext.configuration.get('SessionIdCreatedTime')\n\t\t);\n\t\tconst logLevel = dataContext.configuration.get('LogLevel');\n\t\tif (isDefined(logLevel)) {\n\t\t\t// Log level on development mode should be stronger than what we get from server response\n\t\t\tif (Consts.IS_PRODUCTION) {\n\t\t\t\tlogger.setDebugLevel(logLevel);\n\t\t\t} else {\n\t\t\t\tlogger.warn(\n\t\t\t\t\t'Log level can be changed from config response only in production'\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\t// Make sure client id is updated\n\t\tdataContext.clientId.set(dataContext.configuration.get('ClientId'));\n\t\tif (dataContext.configuration.get('RecordMetadata')) {\n\t\t\t// Send the user id on the first heartbeat\n\t\t\tthis.metadataRecorder.user.setAppUserId(\n\t\t\t\tdataContext.configuration.get('AppUserId')\n\t\t\t);\n\t\t} else {\n\t\t\t// Don't stop the session and let it run in order to make sure a new session will start only after timeout\n\t\t\tlogger.info(\n\t\t\t\t'Record metadata is false so no data points will be collected'\n\t\t\t);\n\t\t}\n\t}\n}\n","import dataContext from './data-context';\n/**\n * Determines what is the state of the current session been tracked\n */\nexport default class SessionLifecycleManager {\n\tconstructor() {\n\t\tthis.isGettingCurrSessionConfig = false;\n\t}\n\tresetSessionIfNeeded(shouldForceReset) {\n\t\t// If there is session id, we have a valid session running that could get a Timeout\n\t\tdataContext.configuration.resetSessionIfNeeded(shouldForceReset);\n\t}\n\tstopSession(deleteDataPoints = false) {\n\t\t// If needed, delete data points before config so we can extract session id\n\t\tif (deleteDataPoints) {\n\t\t\tdataContext.dataPoints.deleteBySessionId(\n\t\t\t\tdataContext.configuration.get('SessionId')\n\t\t\t);\n\t\t}\n\t}\n}\n","import { SNTypeError } from '../errors';\nimport { isNullOrUndefined, isString } from '../validators';\n\nexport function normalizeAppUserId(appUserId) {\n\t// Ensure the value sent is null, undefined or string\n\tif (!isNullOrUndefined(appUserId) && !isString(appUserId)) {\n\t\tthrow new SNTypeError('User id must be a non empty string');\n\t}\n\t// Making sure empty string counts as anonymous\n\treturn appUserId || undefined;\n}\n","import { SNError } from '../common/errors';\nimport logger from '../common/logger';\n\nexport function StartSession(target, name, descriptor) {\n\tconst originalMethod = descriptor.value;\n\tdescriptor.value = function startSessionDescriptor(...args) {\n\t\ttry {\n\t\t\tthis.startNewSessionIfNeeded();\n\t\t} catch (error) {\n\t\t\tlogger.warn(`startNewSessionIfNeeded failed in ${name}:`, error);\n\t\t}\n\t\t// Always call the original method\n\t\treturn originalMethod.apply(this, args);\n\t};\n\treturn descriptor;\n}\n\nexport function EnsureWired(target, name, descriptor) {\n\tconst originalMethod = descriptor.value;\n\tdescriptor.value = function ensureWiredDescriptor(...args) {\n\t\tif (this.isWired) {\n\t\t\treturn originalMethod.apply(this, args);\n\t\t}\n\t\tthrow new SNError('Must call SNAnalytics.start beforehand');\n\t};\n\treturn descriptor;\n}\n","import { TrackingLevel } from './common/types';\nimport logger from './common/logger';\nimport dataContext from './data-context';\nimport MetadataRecorder from './recorders/metadata-recorder';\nimport MetricManager from './metric-manager';\nimport ConfigurationLifecycleManager, {\n\tConfigurationState,\n} from './configuration-lifecycle-manager';\nimport SessionLifecycleManager from './session-lifecycle-manager';\nimport Consts from './common/consts';\nimport {\n\tisBoolean,\n\tisDefined,\n\tisNonEmptyString,\n\tisObject,\n\tisString,\n\tisUndefined,\n} from './common/validators';\nimport { SNTypeError, SNError } from './common/errors';\nimport Networker from './network/networker';\nimport { tryGetEnumValue } from './common/utils/object-utils';\nimport { normalizeAppUserId } from './common/utils/user-utils';\nimport { CatchAll, CatchAllAndReturn } from './decorator/common';\nimport { StartSession, EnsureWired } from './decorator/session';\nimport { decorateMethod } from './decorator/utils';\n\n/**\n * A singleton class that handles high level SDK behavior and session lifetime\n */\nclass Manager {\n\tconstructor() {\n\t\tthis.isWired = false;\n\t\tthis.configurationLifecycleManager =\n\t\t\tnew ConfigurationLifecycleManager();\n\t\tthis.sessionLifecycleManager = new SessionLifecycleManager();\n\t\tthis.metricManager = new MetricManager(\n\t\t\tthis.configurationLifecycleManager\n\t\t);\n\t\tthis.metadataRecorder = new MetadataRecorder();\n\t\tthis.isConfigCallInProgress = false;\n\t\tthis.currentAppId = null;\n\t\t// #endregion\n\t}\n\t// #region Public\n\t// Don't catch errors here\n\tstart(apiKey, options) {\n\t\tconst legacyApiKey = apiKey;\n\t\tif (!isNonEmptyString(apiKey)) {\n\t\t\tthrow new SNTypeError(\n\t\t\t\t'\"apiKey\" must be a string and cannot be empty'\n\t\t\t);\n\t\t}\n\t\tif (!options?.saveAppContext && options?.appContextId) {\n\t\t\tconst parts = apiKey.split(':');\n\t\t\t// Case where there is exactly one part (no colons)\n\t\t\tif (parts.length === 1) {\n\t\t\t\t// Replace the entire key with appContextId if provided\n\t\t\t\tapiKey = options.appContextId;\n\t\t\t}\n\t\t\t// Case where there are exactly 2 or 3 parts (one or two colons)\n\t\t\t// We don't expect 3 parts but adding just to handle any such scenario.\n\t\t\tif (parts.length === 2 || parts.length === 3) {\n\t\t\t\t// Replace the last part with appContextId if provided\n\t\t\t\tparts[parts.length - 1] = options.appContextId;\n\t\t\t\tapiKey = parts.join(':'); // Return the modified key\n\t\t\t}\n\t\t} else if (options?.saveAppContext) {\n\t\t\t// For ui-builder app context id, web analytics sends saveAppContext true because sdk\n\t\t\t// is already started with actual uuid app sys id and string ui-builder is also already\n\t\t\t// started in legacy sdk.\n\t\t\t// The flow should just returne from here without doing anything.\n\t\t\treturn;\n\t\t} else {\n\t\t\t// No modifications in ApiKey for service portal\n\t\t}\n\t\tlogger.info('Start session - API Key:', apiKey, ', Options:', options);\n\t\t// Starting from Yokohama to support UX Metrics:\n\t\t// Wiring is allowed only once if the apiKey received is same. If different then it will start a new wiring.\n\t\tif (\n\t\t\tthis.isWired &&\n\t\t\tapiKey === dataContext.configuration.get('ApiKey')\n\t\t) {\n\t\t\t// Set settings if sent\n\t\t\tif (isObject(options)) {\n\t\t\t\tif (isDefined(options?.instanceDomainName)) {\n\t\t\t\t\tConsts.instanceDomainName = options?.instanceDomainName;\n\t\t\t\t}\n\t\t\t\t// Set user id before config\n\t\t\t\tif (\n\t\t\t\t\tisDefined(dataContext.appUserId.get()) ||\n\t\t\t\t\tisDefined(options.userId)\n\t\t\t\t) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tlogger.info('Set user id before config');\n\t\t\t\t\t\t// Normalize will throw an error if not valid\n\t\t\t\t\t\tconst appUserId = normalizeAppUserId(options.userId);\n\t\t\t\t\t\tif (dataContext.appUserId.get() !== appUserId) {\n\t\t\t\t\t\t\tthis.sessionLifecycleManager.resetSessionIfNeeded(\n\t\t\t\t\t\t\t\ttrue\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tthis.startNewSessionIfNeeded();\n\t\t\t\t\t\t\tdataContext.dataPoints.deleteOtherSessions(\n\t\t\t\t\t\t\t\tdataContext.configuration.get('SessionId')\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tdataContext.appUserId.set(appUserId);\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t// Not throw an error but still log it as one\n\t\t\t\t\t\tlogger.warn(\n\t\t\t\t\t\t\terror instanceof Error ? error.message : error\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// added because for anonymous user we don't want the user id to be sent again.\n\t\t\t\t\t// and we want to remove from local storage.\n\t\t\t\t\tdataContext.appUserId.remove();\n\t\t\t\t}\n\t\t\t\tthis.saveDomain(options);\n\t\t\t\tthis.saveAppContext(options);\n\t\t\t\t// Important!\n\t\t\t\t// Tracking consent setting should be the last settings to be set since it\n\t\t\t\t// may start the session in case the consent is changed to Basic or Full\n\t\t\t\tif (isDefined(options.trackingConsent)) {\n\t\t\t\t\tthis.setTrackingConsent(options.trackingConsent);\n\t\t\t\t}\n\t\t\t}\n\t\t\tlogger.info('SDK is already wired and running');\n\n\t\t\t// check if new config call needs to go\n\t\t\tthis.startNewSessionIfNeeded();\n\t\t\treturn;\n\t\t}\n\t\tif (isDefined(options)) {\n\t\t\tif (!isObject(options)) {\n\t\t\t\tthrow new SNTypeError('\"options\" must be an object');\n\t\t\t}\n\t\t\tif (isDefined(options?.instanceDomainName)) {\n\t\t\t\tConsts.instanceDomainName = options.instanceDomainName;\n\t\t\t}\n\t\t}\n\t\ttry {\n\t\t\tthis.wire(apiKey, legacyApiKey);\n\t\t} catch (error) {\n\t\t\tlogger.warn('SDK wiring failed', error);\n\t\t\tthis.unwire();\n\t\t\treturn;\n\t\t}\n\t\t// Set settings if sent\n\t\tif (isObject(options)) {\n\t\t\t// Set user id before config\n\t\t\tif (\n\t\t\t\tisDefined(dataContext.appUserId.get()) ||\n\t\t\t\tisDefined(options.userId)\n\t\t\t) {\n\t\t\t\ttry {\n\t\t\t\t\tlogger.info('Set user id before config');\n\t\t\t\t\t// Normalize will throw an error if not valid\n\t\t\t\t\tconst appUserId = normalizeAppUserId(options.userId);\n\t\t\t\t\tif (dataContext.appUserId.get() !== appUserId) {\n\t\t\t\t\t\tthis.sessionLifecycleManager.resetSessionIfNeeded(true);\n\t\t\t\t\t\t// need to start new config call as reset session changes session id and backend needs to\n\t\t\t\t\t\tthis.startNewSessionIfNeeded();\n\t\t\t\t\t\tdataContext.dataPoints.deleteOtherSessions(\n\t\t\t\t\t\t\tdataContext.configuration.get('SessionId')\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tdataContext.appUserId.set(appUserId);\n\t\t\t\t} catch (error) {\n\t\t\t\t\t// Not throw an error but still log it as one\n\t\t\t\t\tlogger.warn(error instanceof Error ? error.message : error);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// added because for anonymous user we don't want the user id to be sent again.\n\t\t\t\t// and we want to remove from local storage.\n\t\t\t\tdataContext.appUserId.remove();\n\t\t\t}\n\t\t\tthis.saveDomain(options);\n\t\t\tthis.saveAppContext(options);\n\t\t\t// Important!\n\t\t\t// Tracking consent setting should be the last settings to be set since it\n\t\t\t// may start the session in case the consent is changed to Basic or Full\n\t\t\tif (isDefined(options.trackingConsent)) {\n\t\t\t\tthis.setTrackingConsent(options.trackingConsent);\n\t\t\t}\n\t\t}\n\t\tthis.startNewSessionIfNeeded();\n\t}\n\n\tstartPage(name, description) {\n\t\tlogger.info('Start page - Name:', name, ', Description:', description);\n\n\t\t// Always call the original page start logic\n\t\tthis.metadataRecorder.page.start(name, description);\n\t}\n\taddEvent(name, properties, type) {\n\t\tlogger.info(\n\t\t\t'Add event - Name:',\n\t\t\tname,\n\t\t\t', Properties:',\n\t\t\tproperties,\n\t\t\t', Type:',\n\t\t\ttype\n\t\t);\n\t\tthis.metadataRecorder.event.add(name, properties, type);\n\t}\n\taddChatEvent(name, properties) {\n\t\tthis.metadataRecorder.event.addChat(name, properties);\n\t}\n\tsetUserId(id) {\n\t\tif (!this.validateSdkReady()) return;\n\t\tlogger.info('Set user id:', id);\n\t\tconst appUserId = normalizeAppUserId(id);\n\t\tdataContext.appUserId.set(appUserId);\n\t\t// Changing user id should triggers new session\n\t\tthis.startNewSessionIfNeeded();\n\t}\n\tsetUserProperty(name, value) {\n\t\tlogger.info('Set user property:', name, '-', value);\n\t\tthis.metadataRecorder.user.setProperty(name, value);\n\t}\n\tsetUserProperties(properties) {\n\t\tlogger.info('Set user properties:', properties);\n\t\tthis.metadataRecorder.user.setProperties(properties);\n\t}\n\tremoveUserProperty(name) {\n\t\tlogger.info('Remove user property:', name);\n\t\tthis.metadataRecorder.user.removeProperty(name);\n\t}\n\tincUserProperty(name, value) {\n\t\tlogger.info('Increment user property:', name, '-', value);\n\t\tthis.metadataRecorder.user.incProperty(name, value);\n\t}\n\tappendToUserProperty(name, value) {\n\t\tlogger.info('Append to user property:', name, '-', value);\n\t\tthis.metadataRecorder.user.appendToProperty(name, value);\n\t}\n\tstartPerformanceTrace(key, type) {\n\t\tlogger.info('Started Performance Trace:', key, '-', type);\n\t\treturn this.metadataRecorder.performance.start(key, type);\n\t}\n\taddPerformanceTrace(key, type, duration, properties, startTime) {\n\t\tlogger.info('Added Performance Trace:', key, '-', type);\n\t\tthis.metadataRecorder.performance.add(\n\t\t\tkey,\n\t\t\ttype,\n\t\t\tduration,\n\t\t\tproperties,\n\t\t\tstartTime\n\t\t);\n\t}\n\tsetTrackingConsent(trackingLevel) {\n\t\tlogger.info('Set tracking consent level to:', trackingLevel);\n\t\tlet newConsent = tryGetEnumValue(trackingLevel, TrackingLevel, true);\n\t\tif (!isDefined(newConsent)) {\n\t\t\tif (isBoolean(trackingLevel)) {\n\t\t\t\t// Support old versions when tracking was boolean\n\t\t\t\tnewConsent = trackingLevel\n\t\t\t\t\t? TrackingLevel.Full\n\t\t\t\t\t: TrackingLevel.Disabled;\n\t\t\t\tlogger.warn('Boolean tracking consent level is deprecated');\n\t\t\t} else {\n\t\t\t\tthrow new SNError(\n\t\t\t\t\t`Tracking consent Level must be one of: ${Object.keys(TrackingLevel).join(' | ')}`\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tconst oldConsent = dataContext.trackingConsent.get();\n\t\t// Same consent - do nothing\n\t\tif (newConsent === oldConsent) {\n\t\t\tlogger.info('Tracking consent level is the same:', newConsent);\n\t\t\treturn;\n\t\t}\n\t\tdataContext.trackingConsent.set(newConsent);\n\t\tlogger.info('Tracking consent level is now:', newConsent);\n\t\tconst configCurrentState =\n\t\t\tthis.configurationLifecycleManager.getCurrentState();\n\t\tif (\n\t\t\tnewConsent === TrackingLevel.Basic ||\n\t\t\tnewConsent === TrackingLevel.Full ||\n\t\t\tnewConsent === TrackingLevel.Essential\n\t\t) {\n\t\t\t// Enable: Start a new session if needed and add event\n\t\t\tif (this.startNewSessionIfNeeded()) {\n\t\t\t\tthis.sessionLifecycleManager.resetSessionIfNeeded(true);\n\t\t\t\tthis.metadataRecorder.event.addConsentChange(\n\t\t\t\t\tnewConsent,\n\t\t\t\t\toldConsent\n\t\t\t\t);\n\t\t\t}\n\t\t} else if (\n\t\t\tconfigCurrentState === ConfigurationState.Created ||\n\t\t\tconfigCurrentState === ConfigurationState.Started\n\t\t) {\n\t\t\t// Disabled: Add an event with tracking disabled as the last data point of the session\n\t\t\tthis.metadataRecorder.event.addConsentChange(\n\t\t\t\tnewConsent,\n\t\t\t\toldConsent\n\t\t\t);\n\t\t\t// this.stopSession();\n\t\t} else {\n\t\t\t// If consent is Disabled and session is not alive, we have nothing to do\n\t\t}\n\t}\n\tgetTrackingConsent() {\n\t\tlogger.info('Get tracking consent');\n\t\treturn dataContext.trackingConsent.get();\n\t}\n\tasync deleteCurrentUserData() {\n\t\tlogger.info('Deleting current user data');\n\t\tthis.setTrackingConsent(TrackingLevel.Disabled);\n\t\tconst clientId = dataContext.clientId.get();\n\t\tif (!clientId || clientId === Consts.DEFAULT_CLIENT_ID) {\n\t\t\t// ClientId was not found - return true. The caller should not be notified about\n\t\t\t// this as it cannot do anything (retrying would yield the same result).\n\t\t\tlogger.warn('SNAnalytics was never started on the device');\n\t\t\treturn true;\n\t\t}\n\t\tconst appUserId = dataContext.appUserId.get();\n\t\tconst response = await Networker.deleteUserData(appUserId);\n\t\tif (!response.ok) {\n\t\t\tthrow new SNError(`Server could not delete user ${appUserId}`);\n\t\t}\n\t\tdataContext.appUserId.remove();\n\t\tthis.stopSession(true);\n\t\treturn true;\n\t}\n\tsetDebugLevel(logLevel) {\n\t\tlogger.info('Set debug level:', logLevel);\n\t\tlogger.setDebugLevel(logLevel);\n\t}\n\t// #endregion\n\t// #region Decorators\n\t/**\n\t * Decorator for Manager endpoints that should make sure that there is a session started\n\t */\n\tStartSession(target, name, descriptor) {\n\t\tconst originalMethod = descriptor.value; // references the method being decorated\n\t\t// Not using arrow function so this will be bound to the caller, which is the Manager instance\n\t\t// since callers can only be within this class\n\t\tdescriptor.value = function startSessionDescriptor(...args) {\n\t\t\t// If should record, call original method. Otherwise do nothing.\n\t\t\treturn this.startNewSessionIfNeeded()\n\t\t\t\t? originalMethod.apply(this, args)\n\t\t\t\t: undefined;\n\t\t};\n\t\treturn descriptor;\n\t}\n\t/**\n\t * Static getter to `StartSession` function in order to use the decorator\n\t * with `` instead of `@Manager.prototype.StartSession`\n\t */\n\tstatic get StartSession() {\n\t\treturn Manager.prototype.StartSession;\n\t}\n\t/**\n\t * Decorator for Manager endpoints that should make sure that we are wired\n\t */\n\tEnsureWired(target, name, descriptor) {\n\t\tconst originalMethod = descriptor.value; // references the method being decorated\n\t\t// Not using arrow function so this will be bound to the caller, which is the Manager instance\n\t\t// since callers can only be within this class\n\t\tdescriptor.value = function ensureWiredDescriptor(...args) {\n\t\t\tif (this.isWired) {\n\t\t\t\treturn originalMethod.apply(this, args);\n\t\t\t}\n\t\t\tthrow new SNError('Must call SNAnalytics.start beforehand');\n\t\t};\n\t\treturn descriptor;\n\t}\n\t/**\n\t * Static getter to `EnsureWired` function in order to use the decorator\n\t * with `` instead of `@Manager.prototype.EnsureWired`\n\t */\n\tstatic get EnsureWired() {\n\t\treturn Manager.prototype.EnsureWired;\n\t}\n\t// #endregion\n\t// #region Private\n\tvalidateSdkReady() {\n\t\t// Make sure SDK is wired\n\t\tif (!this.isWired) {\n\t\t\tlogger.warn('Must call SNAnalytics.start beforehand');\n\t\t\treturn false;\n\t\t}\n\t\tconst consent = dataContext.trackingConsent.get();\n\t\tif (consent === TrackingLevel.Disabled) {\n\t\t\tlogger.warn('No tracking consent given');\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t}\n\t/**\n\t * Start a new session if needed. Returns a boolean that indicates if should record.\n\t * This method is the entry point for all API methods that create DataPoints\n\t */\n\tstartNewSessionIfNeeded() {\n\t\ttry {\n\t\t\tif (!this.validateSdkReady()) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tconst sessionState =\n\t\t\t\tthis.configurationLifecycleManager.getCurrentState();\n\t\t\tconst changedGlideSession = this.checkGlideSessionHasChanged();\n\t\t\tif (changedGlideSession) {\n\t\t\t\tthis.sessionLifecycleManager.resetSessionIfNeeded(true);\n\t\t\t}\n\t\t\t// Session is not alive and there is no an ongoing request => create new session.\n\t\t\telse this.sessionLifecycleManager.resetSessionIfNeeded(false);\n\t\t\tif (\n\t\t\t\tsessionState === ConfigurationState.Ended ||\n\t\t\t\tchangedGlideSession\n\t\t\t) {\n\t\t\t\t// Return without waiting for config response so pre-config items will be gathered according to default configuration\n\t\t\t\t// startNewConfiguration is wrapped in setTimeout\n\t\t\t\t// and if already a config call is in progress, the flow should return from here.\n\t\t\t\tif (this.isConfigCallInProgress) {\n\t\t\t\t\treturn dataContext.configuration.get('RecordMetadata');\n\t\t\t\t}\n\t\t\t\tthis.isConfigCallInProgress = true;\n\t\t\t\tdataContext.configuration.updateInstanceConfigCallInProgress(\n\t\t\t\t\ttrue\n\t\t\t\t);\n\t\t\t\t// Don't await this to allow data points to be gathered while waiting for server response\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tif (\n\t\t\t\t\t\t!this.configurationLifecycleManager.getIsGettingCurrSessionConfig()\n\t\t\t\t\t)\n\t\t\t\t\t\tthis.startNewConfiguration();\n\t\t\t\t\tdataContext.configuration.updateInstanceConfigCallInProgress(\n\t\t\t\t\t\tfalse\n\t\t\t\t\t);\n\t\t\t\t\tthis.isConfigCallInProgress = false;\n\t\t\t\t}, 5000);\n\t\t\t}\n\t\t\t// Return without waiting for config response so pre-session items will be gathered according to default configuration\n\t\t\treturn dataContext.configuration.get('RecordMetadata');\n\t\t} catch (error) {\n\t\t\tlogger.warn('Could not start a session:', error);\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tcheckGlideSessionHasChanged() {\n\t\tconst currentGCK = window.g_ck;\n\t\tconst sessionGCK = dataContext.configuration.get('g_ck');\n\t\treturn sessionGCK !== currentGCK;\n\t}\n\n\t/**\n\t * Initialize stores, register to event listeners, etc.\n\t */\n\twire(apiKey, legacyApiKey) {\n\t\tlogger.info('Wiring SDK...');\n\t\t// Set keys must be the very first thing that wire does! without it dataContext is not available\n\t\tdataContext.setKeys(apiKey, legacyApiKey);\n\t\t// Delete all pre session items since no config will ever arrive for them\n\t\tdataContext.dataPoints.deletePreSessionItems();\n\t\t// Metrics works as long as the SDK is wired\n\t\tthis.metricManager.startMetrics();\n\t\tthis.isWired = true;\n\t\tlogger.info('SDK is Wired');\n\t}\n\n\tunwire() {\n\t\tthis.isWired = false;\n\t\tthis.metricManager.stopMetrics();\n\t}\n\tstopSession(deleteDataPoints = false) {\n\t\t// If needed, delete data points before config so we can extract session id\n\t\tif (deleteDataPoints) {\n\t\t\tdataContext.dataPoints.deleteBySessionId(\n\t\t\t\tdataContext.configuration.get('SessionId')\n\t\t\t);\n\t\t}\n\n\t\t// Clear tagged events cache when session stops\n\t\tlogger.debug('Clearing tagged events cache on session stop');\n\t\tdataContext.taggedEvents.clearAll();\n\n\t\tdataContext.configuration.deleteData();\n\t}\n\tasync startNewConfiguration() {\n\t\tthis.configurationLifecycleManager.startNewConfiguration();\n\t}\n\tsaveDomain(options) {\n\t\tif (isUndefined(options.domainId) && isUndefined(options.domainName)) {\n\t\t\tdataContext.domain.remove();\n\t\t\treturn;\n\t\t}\n\t\tif (isDefined(options.domainId) && !isString(options.domainId)) {\n\t\t\tthrow new SNTypeError('\"domainId\" must be string');\n\t\t}\n\t\tif (isDefined(options.domainName) && !isString(options.domainName)) {\n\t\t\tthrow new SNTypeError('\"domainName\" must be string');\n\t\t}\n\t\tdataContext.domain.set({\n\t\t\tid: options.domainId,\n\t\t\tname: options.domainName,\n\t\t});\n\t}\n\tsaveAppContext(options) {\n\t\tif (\n\t\t\tisUndefined(options.appContextId) &&\n\t\t\tisUndefined(options.appContextName)\n\t\t) {\n\t\t\tdataContext.appContext.remove();\n\t\t\treturn;\n\t\t}\n\t\tif (\n\t\t\tisDefined(options.appContextId) &&\n\t\t\t!isString(options.appContextId)\n\t\t) {\n\t\t\tthrow new SNTypeError('\"appContextId\" must be string');\n\t\t}\n\t\tif (\n\t\t\tisDefined(options.appContextName) &&\n\t\t\t!isString(options.appContextName)\n\t\t) {\n\t\t\tthrow new SNTypeError('\"appContextName\" must be string');\n\t\t}\n\t\tdataContext.appContext.set({\n\t\t\tid: options.appContextId,\n\t\t\tname: options.appContextName,\n\t\t});\n\t}\n}\n\ndecorateMethod(Manager, 'startPage', CatchAll, StartSession);\ndecorateMethod(Manager, 'addEvent', CatchAll, StartSession);\ndecorateMethod(Manager, 'addChatEvent', CatchAll, StartSession);\ndecorateMethod(Manager, 'setUserId', CatchAll);\ndecorateMethod(Manager, 'setUserProperty', CatchAll, StartSession);\ndecorateMethod(Manager, 'setUserProperties', CatchAll, StartSession);\ndecorateMethod(Manager, 'removeUserProperty', CatchAll, StartSession);\ndecorateMethod(Manager, 'incUserProperty', CatchAll, StartSession);\ndecorateMethod(Manager, 'appendToUserProperty', CatchAll, StartSession);\ndecorateMethod(Manager, 'startPerformanceTrace', CatchAll, StartSession);\ndecorateMethod(Manager, 'addPerformanceTrace', CatchAll, StartSession);\n\ndecorateMethod(Manager, 'setTrackingConsent', CatchAll, EnsureWired);\ndecorateMethod(\n\tManager,\n\t'getTrackingConsent',\n\tCatchAllAndReturn(TrackingLevel.Disabled),\n\tEnsureWired\n);\ndecorateMethod(\n\tManager,\n\t'deleteCurrentUserData',\n\tCatchAllAndReturn(false),\n\tEnsureWired\n);\n\ndecorateMethod(Manager, 'setDebugLevel', CatchAll);\ndecorateMethod(Manager, 'unwire', CatchAll);\ndecorateMethod(Manager, 'startNewConfiguration', CatchAll);\n\nexport default new Manager();\n","import manager from './manager';\n/**\n * SNAnalytics SDK\n */\nexport default class SNAnalytics {\n\t/**\n\t * Starts the SNAnalytics agent for tracking the current session's data.\n\t * @param apiKey The API key of the current app\n\t * @param apiAuth The API Auth of the account's instance\n\t * @param options Optional settings object for initialization\n\t */\n\tstatic start(apiKey, apiAuth, options) {\n\t\tmanager.start(apiKey, options);\n\t}\n\t/**\n\t * Mark the appearance starting time of a new page.\n\t * @param name The name of the page (e.g. \"welcome_page\").\n\t * @param description Optional description for the page (e.g. \"Welcome Page\").\n\t */\n\tstatic startPage(name, description) {\n\t\tmanager.startPage(name, description);\n\t}\n\t/**\n\t * Add a timed application event (such as: user reached a specific level or page).\n\t * @param name The name of the event (e.g. \"InAppPurchase\").\n\t * @param properties Optional key-value pairs with custom properties for the event.\n\t *                   Properties can only be Number, String, Boolean, or Date.\n\t *                   Property key cannot start with 'SN_' which is saved for the system.\n\t * @param type Optional The type of the event (e.g. \"transaction\")\n\t */\n\tstatic addEvent(name, properties, type) {\n\t\tmanager.addEvent(name, properties, type);\n\t}\n\t/**\n\t * Add a chat event. Sends a T=4 (Chat) data point.\n\t * @param name The name of the chat event (e.g. \"Chat initiated\").\n\t * @param properties Optional key-value pairs with custom properties for the event.\n\t *                   Properties can only be Number, String, Boolean, or Date.\n\t *                   Property key cannot start with 'SN_' which is saved for the system.\n\t */\n\tstatic addChatEvent(name, properties) {\n\t\tmanager.addChatEvent(name, properties);\n\t}\n\t/**\n\t * Sets the application specific user identifier. New user Id triggers new session\n\t * @param id The application-specific user identifier\n\t */\n\tstatic setUserId(id) {\n\t\tmanager.setUserId(id);\n\t}\n\t/**\n\t * Sets a single property for the current user, please call `setUserId(String)` to set the current user.\n\t * @param name The name of the property to set. Cannot start with 'SN_'.\n\t * @param value The value of the property to set\n\t */\n\tstatic setUserProperty(name, value) {\n\t\tmanager.setUserProperty(name, value);\n\t}\n\t/**\n\t * Sets properties for the current user, please call `setUserId(String)` to set the current user.\n\t * @param properties The properties of the user.\n\t *                   Property key cannot start with 'SN_' which is saved for the system.\n\t */\n\tstatic setUserProperties(properties) {\n\t\tmanager.setUserProperties(properties);\n\t}\n\t/**\n\t * Unsets a single property value\n\t * @param name The name of the property to unset. Cannot start with 'SN_'.\n\t */\n\tstatic removeUserProperty(name) {\n\t\tmanager.removeUserProperty(name);\n\t}\n\t/**\n\t * Increments a user property value\n\t * @param name The name of the user property. Cannot start with 'SN_'.\n\t * @param value The value to increment / decrement by\n\t */\n\tstatic incUserProperty(name, value) {\n\t\tmanager.incUserProperty(name, value);\n\t}\n\t/**\n\t * Adds an item to the user property list\n\t * @param name The name of the user property. Cannot start with 'SN_'.\n\t * @param value The item to add to the list\n\t */\n\tstatic appendToUserProperty(name, value) {\n\t\tmanager.appendToUserProperty(name, value);\n\t}\n\t/**\n\t * Returns a started performance trace with current time (millis) as starting point.\n\t * use `Trace.end()` to end the performance trace.\n\t * @param key Trace's key\n\t * @param type Trace's type\n\t */\n\tstatic startPerformanceTrace(key, type) {\n\t\treturn manager.startPerformanceTrace(key, type);\n\t}\n\t/**\n\t * Add a manual performance trace\n\t * @param key Trace's key\n\t * @param type Trace's type\n\t * @param durationMS Duration in milliseconds\n\t * @param properties Optional key-value pairs with custom properties for the event.\n\t *                   Properties can only be Strings.\n\t *                   Property key cannot start with 'SN_' which is saved for the system.\n\t * @param startTime Optional date or time from epoch to mention when the trace was started. Default is now.\n\t */\n\tstatic addPerformanceTrace(key, type, durationMS, properties, startTime) {\n\t\tmanager.addPerformanceTrace(\n\t\t\tkey,\n\t\t\ttype,\n\t\t\tdurationMS,\n\t\t\tproperties,\n\t\t\tstartTime\n\t\t);\n\t}\n\t/**\n\t * Set whether to allow analytics tracking in the current browser (default is 'Disabled').\n\t * Possible values are:\n\t * - Full - Full analytics tracking\n\t * - Basic - Basic metrics without identifying information on the user\n\t * - Disabled - Tracking is turned off\n\t * @param trackingLevel Analytics tracking consent level\n\t */\n\tstatic setTrackingConsent(trackingLevel) {\n\t\tmanager.setTrackingConsent(trackingLevel);\n\t}\n\t/**\n\t * @return The analytics tracking consent status.\n\t */\n\tstatic getTrackingConsent() {\n\t\treturn manager.getTrackingConsent();\n\t}\n\t/**\n\t * Delete all local and remote data for the current user. This method also unsets the current active user,\n\t * and opts out this browser from future tracking.\n\t *\n\t * @return A promise resolves to boolean value stating whether deletion was successful.\n\t * Failure may occur in case the SNAnalytics servers cannot be\n\t * reached (in case there is no connectivity) - and the method should be retried.\n\t */\n\tstatic async deleteCurrentUserData() {\n\t\treturn manager.deleteCurrentUserData();\n\t}\n\t/**\n\t * Set debug level of the SDK to the console.\n\t * @param logLevel The debug level desired. Possible values are 'debug', 'info', 'warn', or 'error'.\n\t */\n\tstatic setDebugLevel(logLevel) {\n\t\tmanager.setDebugLevel(logLevel);\n\t}\n}\n","import { setConfigValue, getConfigValue } from '@servicenow/ui-analytics-api';\n\nconst config = {\n\tenableExporter: false,\n\texporterInterval: 5000,\n\tsumCounter: true,\n\tlastValueOnlyGauage: true,\n\taugmentPage: (page) => page,\n\tcollecterUrl: '/api/now/trace',\n\tenableCollection: false,\n\tlegacyConfig: {},\n\tlegacy: false,\n};\n\nexport const set = (key, value) => {\n\tif (config[key] !== undefined) config[key] = value;\n\telse setConfigValue(key, value);\n};\n\nexport const get = (key) =>\n\tconfig[key] !== undefined ? config[key] : getConfigValue(key);\n","export const UXF_DIRECT_LOAD_COMPLETE = 'UXF_DIRECT_LOAD_COMPLETE';\nexport const UXF_USER_NAV_LOAD_COMPLETE = 'UXF_USER_NAV_LOAD_COMPLETE';\nexport const SELECT_MENU_ITEM = 'Select Menu Item';\nexport const EXPERIENCE_START = 'EXPERIENCE_START';\nexport const USER_NAVIGATE = 'USER_NAVIGATE';\nexport const $PERF_DATA = '$PERF-DATA';\n\n// removing this breaks processMark even though it\n// isn't referenced anywhere in the code ¯\\_(ツ)_/¯\nexport const COMP_SN_POLARIS_NAME = 'SN-POLARIS-MENU';\n\nexport const EVENT_MAPPING = {\n\t[EXPERIENCE_START]: 'Page Navigate',\n\t[USER_NAVIGATE]: 'Page Navigate',\n};\n","import {\n\t$PERF_DATA,\n\tUXF_DIRECT_LOAD_COMPLETE,\n\tUXF_USER_NAV_LOAD_COMPLETE,\n} from './legacy/events';\n\nexport const SUB = 'sub';\nexport const RECORD = 'record';\nexport const CLASSIC = 'classic';\nexport const URLMASKSTRING = '***';\nexport const PARAMS_SEPARATOR = '/params/';\nexport const SUB_SEPARATOR = '/sub/';\nexport const CLASSIC_URL_PARAMS = [\n\t'sysparm_query',\n\t'sysparm_view',\n\t'sysparm_userpref_module',\n\t'sys_id',\n\t'sysparm_record_target',\n\t'sysparm_dashboard',\n];\nexport const NAME = 'appsee';\nexport const UNIFIED_NAVIGATION_APP = 'Unified Navigation App';\nexport const NEXT_EXPERIENCE_CHANNEL_ID = 'a84adaf4c700201072b211d4d8c260b7';\nexport const TRACKING_CONSENT = Object.freeze({\n\tfull: 'Full',\n\tbasic: 'Basic',\n\tdisabled: 'Disabled',\n\tmissing: 'Needed',\n\tessential: 'Essential',\n});\n\nexport const ALLOWED_PERF_EVENTS = [\n\t$PERF_DATA,\n\tUXF_DIRECT_LOAD_COMPLETE,\n\tUXF_USER_NAV_LOAD_COMPLETE,\n];\n\nexport const UXF_METADATA_EVENTS = ['EXPERIENCE_START', 'USER_NAVIGATE'];\nexport const ANALYTICS_SET_APPLICATION_OPTIONS =\n\t'analyticsSetApplicationOptions';\n","/**\n * Experimentation SDK Integration for Usage SDK\n * Handles matching and flattening experiments for event tracking\n */\n\nimport { experimentsStore } from '@servicenow/ui-analytics-experimentation-sdk';\n\n/**\n * Match experiments that have the event name in their metrics\n * @param {string} eventName - The event name to match\n * @param {Array} experiments - List of active experiments\n * @returns {Array} Matched experiments\n */\nfunction matchExperimentsForEvent(eventName, experiments) {\n\tif (!Array.isArray(experiments) || experiments.length === 0) {\n\t\treturn [];\n\t}\n\n\ttry {\n\t\treturn experiments.filter((exp) => {\n\t\t\tif (!exp || typeof exp !== 'object') {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tconst metrics = exp.metrics || [];\n\t\t\treturn Array.isArray(metrics) && metrics.includes(eventName);\n\t\t});\n\t} catch (error) {\n\t\tconsole.warn('Usage SDK: Failed to match experiments for event', error);\n\t\treturn [];\n\t}\n}\n\n/**\n * Flatten experiments into key-value pairs for event payload\n * @param {Array} experiments - List of experiments to flatten\n * @returns {Object} Flattened experiment data\n */\nfunction flattenExperiments(experiments) {\n\tif (!Array.isArray(experiments) || experiments.length === 0) {\n\t\treturn {};\n\t}\n\n\ttry {\n\t\tconst flattened = {};\n\t\texperiments.forEach((exp, index) => {\n\t\t\tif (!exp || typeof exp !== 'object') {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst baseKey = `experiment_${exp.experimentId}`;\n\t\t\t// Add variant\n\t\t\tflattened[baseKey] = exp.value || exp.variant;\n\t\t\t// Add value if present\n\t\t\tif (exp.value !== null && exp.value !== undefined) {\n\t\t\t\tflattened[`${baseKey}_value`] = exp.value;\n\t\t\t}\n\t\t\t// Add type if present\n\t\t\tif (exp.type !== null && exp.type !== undefined) {\n\t\t\t\tflattened[`${baseKey}_type`] = exp.type;\n\t\t\t}\n\t\t});\n\t\treturn flattened;\n\t} catch (error) {\n\t\tconsole.warn('Usage SDK: Failed to flatten experiments', error);\n\t\treturn {};\n\t}\n}\n\n/**\n * Get experiment data for an event\n * Safely retrieves and processes experiments without failing the event\n * @param {string} eventName - The event name\n * @returns {Object} Experiment data to merge into event payload\n */\nexport function getExperimentDataForEvent(eventName) {\n\t// Return empty object if no event name\n\tif (!eventName || typeof eventName !== 'string') {\n\t\treturn {};\n\t}\n\n\ttry {\n\t\t// Check if experimentsStore is available\n\t\tif (\n\t\t\t!experimentsStore ||\n\t\t\ttypeof experimentsStore.getList !== 'function'\n\t\t) {\n\t\t\treturn {};\n\t\t}\n\n\t\t// Get all active experiments\n\t\tconst allExperiments = experimentsStore.getList();\n\n\t\t// If no experiments, return empty object\n\t\tif (\n\t\t\t!allExperiments ||\n\t\t\t!Array.isArray(allExperiments) ||\n\t\t\tallExperiments.length === 0\n\t\t) {\n\t\t\treturn {};\n\t\t}\n\n\t\t// Match experiments for this event\n\t\tconst matchedExperiments = matchExperimentsForEvent(\n\t\t\teventName,\n\t\t\tallExperiments\n\t\t);\n\n\t\t// Flatten and return\n\t\treturn flattenExperiments(matchedExperiments);\n\t} catch (error) {\n\t\t// Never fail the event - just log and return empty object\n\t\tconsole.warn(\n\t\t\t'Usage SDK: Experiment integration failed, continuing without experiment data',\n\t\t\terror\n\t\t);\n\t\treturn {};\n\t}\n}\n","import { ALLOWED_PERF_EVENTS, UXF_METADATA_EVENTS } from '../constants';\nimport { getExperimentDataForEvent } from './experimentIntegration.js';\n\nexport default function addEvent(markReceived, sdk) {\n\tconst {\n\t\tattributes: { options = {}, event },\n\t} = markReceived;\n\n\tif (markReceived.attributes?.__type__ === 'addPerformanceTrace') {\n\t\tdelete markReceived.attributes.__type__;\n\t\t// Convert arguments to real array (may be object with numeric keys after serialization)\n\t\tconst argsRaw = markReceived.attributes.arguments || [];\n\t\tconst args = Array.isArray(argsRaw) ? argsRaw : Object.values(argsRaw);\n\t\tsdk.addPerformanceTrace(...args);\n\t\treturn;\n\t}\n\n\tif (markReceived.attributes?.__type__ === 'addChatEvent') {\n\t\tdelete markReceived.attributes.__type__;\n\t\tconst argsRaw = markReceived.attributes.arguments || [];\n\t\tconst args = Array.isArray(argsRaw) ? argsRaw : Object.values(argsRaw);\n\t\tsdk.addChatEvent(...args);\n\t\treturn;\n\t}\n\n\tif (markReceived.attributes?.__type__ === 'addEvent') {\n\t\tdelete markReceived.attributes.__type__;\n\n\t\t// Service Portal path - inject experiment data\n\t\t// Convert arguments to real array (may be object with numeric keys after serialization)\n\t\tconst argsRaw = markReceived.attributes.arguments || [];\n\t\tconst args = Array.isArray(argsRaw) ? argsRaw : Object.values(argsRaw);\n\t\tconst eventName = args[0];\n\t\tconst eventPayloadRaw = args[1];\n\n\t\t// Only inject experiment data if payload is an object\n\t\tconst isObjectPayload =\n\t\t\ttypeof eventPayloadRaw === 'object' && eventPayloadRaw !== null;\n\n\t\tif (isObjectPayload) {\n\t\t\t// Get experiment data safely\n\t\t\tlet experimentData = {};\n\t\t\ttry {\n\t\t\t\texperimentData = getExperimentDataForEvent(eventName) || {};\n\t\t\t} catch (error) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t'Usage SDK: Failed to get experiment data for Service Portal event, continuing without it',\n\t\t\t\t\terror\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Merge experiment data into payload\n\t\t\tconst enhancedPayload = {\n\t\t\t\t...eventPayloadRaw,\n\t\t\t\t...experimentData,\n\t\t\t};\n\n\t\t\t// Call with enhanced payload\n\t\t\tsdk.addEvent(eventName, enhancedPayload, ...args.slice(2));\n\t\t} else {\n\t\t\t// Preserve original non-object payload (string, number, etc.)\n\t\t\tsdk.addEvent(...args);\n\t\t}\n\t\treturn;\n\t}\n\n\tif (\n\t\tALLOWED_PERF_EVENTS.includes(event) ||\n\t\tUXF_METADATA_EVENTS.includes(event)\n\t) {\n\t\treturn;\n\t}\n\n\t// Get experiment data safely - never let this fail the event\n\tlet experimentData = {};\n\ttry {\n\t\texperimentData = getExperimentDataForEvent(event) || {};\n\t} catch (error) {\n\t\tconsole.warn(\n\t\t\t'Usage SDK: Failed to get experiment data, continuing without it',\n\t\t\terror\n\t\t);\n\t}\n\n\tconst payload = {\n\t\t...options,\n\t\t...experimentData,\n\t};\n\n\t// Always call addEvent, with or without experiment data\n\tsdk.addEvent(event, payload);\n}\n","export function isMobileBridgeAvailable() {\n\treturn (\n\t\ttypeof window !== 'undefined' &&\n\t\twindow.SNMobileAnalytics &&\n\t\ttypeof window.SNMobileAnalytics === 'object'\n\t);\n}\n\nexport function isMobileBridgeEnabled() {\n\tif (!isMobileBridgeAvailable()) {\n\t\treturn false;\n\t}\n\n\tconst _config = window.SNMobileAnalytics.getNativeConfig();\n\tconst config = typeof _config === 'string' ? JSON.parse(_config) : _config;\n\t//channel number as per current currently decided contract, might change in the future\n\treturn config && config.channel == '6';\n}\n\nexport function getMobileBridgeConfig() {\n\tif (!isMobileBridgeAvailable()) {\n\t\treturn null;\n\t}\n\treturn window.SNMobileAnalytics.getNativeConfig();\n}\n\nexport const MobileBridgeAdapter = {\n\taddEvent(eventName, properties, type) {\n\t\tif (!isMobileBridgeAvailable()) {\n\t\t\tconsole.warn('Mobile bridge is not available');\n\t\t}\n\t\twindow.SNMobileAnalytics.addEvent(\n\t\t\teventName,\n\t\t\tJSON.stringify(properties || {}),\n\t\t\ttype || null\n\t\t);\n\t},\n\n\tsetUserId(userId) {\n\t\tif (!isMobileBridgeAvailable()) {\n\t\t\tconsole.warn('Mobile bridge is not available');\n\t\t}\n\t\twindow.SNMobileAnalytics.setUserId(userId);\n\t},\n\n\tstartScreen(screenName) {\n\t\tif (!isMobileBridgeAvailable()) {\n\t\t\tconsole.warn('Mobile bridge is not available');\n\t\t}\n\t\twindow.SNMobileAnalytics.startScreen(screenName);\n\t},\n\n\taddPerformanceTrace() {\n\t\t// no-op\n\t},\n\n\tgetConfig() {\n\t\treturn getMobileBridgeConfig();\n\t},\n\n\tisAvailable() {\n\t\treturn isMobileBridgeAvailable();\n\t},\n\n\tisEnabled() {\n\t\treturn isMobileBridgeEnabled();\n\t},\n};\n","import { onEvent } from '@servicenow/ui-analytics-api';\nimport SNAnalytics from './sdk';\nimport { get as getConfigValue, set as setConfigValue } from '../config';\nimport addEvent from './addEvent';\n\nimport {\n\tisMobileBridgeEnabled,\n\tMobileBridgeAdapter,\n} from './mobileBridgeAdapter';\n\nimport {\n\tTRACKING_CONSENT,\n\tANALYTICS_SET_APPLICATION_OPTIONS,\n\tNEXT_EXPERIENCE_CHANNEL_ID,\n\tUNIFIED_NAVIGATION_APP,\n} from '../constants';\n\nlet unsubscribe = () => null;\nlet isRolesUpdated = false;\n\nexport default function higherOrderSDKWrapper(fn, type) {\n\tswitch (type) {\n\t\tcase 'application': {\n\t\t\treturn async (name, version = 0, attributes = {}) => {\n\t\t\t\tif (isMobileBridgeEnabled()) {\n\t\t\t\t\tsetConfigValue('mobileBridgeMode', true);\n\t\t\t\t\tsetConfigValue('legacy', true);\n\t\t\t\t\tsetConfigValue('enableTrack', true);\n\t\t\t\t\tsetConfigValue('enableCollection', true);\n\n\t\t\t\t\tunsubscribe();\n\t\t\t\t\tunsubscribe = onEvent((event) => {\n\t\t\t\t\t\tif (event.type === 'usage') {\n\t\t\t\t\t\t\taddEvent(event, MobileBridgeAdapter);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\treturn fn(name, version, attributes);\n\t\t\t\t}\n\t\t\t\tif (\n\t\t\t\t\tattributes?.channelType === 'NextExperience' &&\n\t\t\t\t\t(attributes?.experienceId === '' ||\n\t\t\t\t\t\tattributes?.experienceName === '')\n\t\t\t\t) {\n\t\t\t\t\tattributes.experienceId = NEXT_EXPERIENCE_CHANNEL_ID;\n\t\t\t\t\tattributes.experienceName = UNIFIED_NAVIGATION_APP;\n\t\t\t\t}\n\t\t\t\tif (attributes.__isLegacy__) {\n\t\t\t\t\t// Service Portal\n\t\t\t\t\tsetConfigValue('legacy', true);\n\t\t\t\t\tsetConfigValue('enableTrack', true);\n\t\t\t\t\tsetConfigValue('enableCollection', true);\n\n\t\t\t\t\t// No need of collection mode, code omitted, its always going to be new flow\n\n\t\t\t\t\t// Just start ingestion\n\t\t\t\t\tSNAnalytics.start(...attributes.arguments);\n\n\t\t\t\t\tif (!isMobileBridgeEnabled()) {\n\t\t\t\t\t\tSNAnalytics.start(...attributes.arguments);\n\t\t\t\t\t}\n\t\t\t\t\tunsubscribe();\n\t\t\t\t\tconst eventTarget = isMobileBridgeEnabled()\n\t\t\t\t\t\t? MobileBridgeAdapter\n\t\t\t\t\t\t: SNAnalytics;\n\t\t\t\t\tunsubscribe = onEvent((event) => {\n\t\t\t\t\t\tif (event.type === 'usage') {\n\t\t\t\t\t\t\taddEvent(event, eventTarget);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tif (attributes.experienceId) {\n\t\t\t\t\t\tif (attributes.experienceId === 'ui-builder')\n\t\t\t\t\t\t\treturn fn(name, version, attributes);\n\t\t\t\t\t\t// Next Experience, UX Metrics, CoreUI, Studio\n\t\t\t\t\t\t// Check if the experience ID has been registered\n\t\t\t\t\t\t//const registeredName = appRegistrationCache[attributes.experienceId];\n\t\t\t\t\t\tconst appRegistrationMetadataStorage =\n\t\t\t\t\t\t\tgetAppRegistrationMetadataFromSessionStorage();\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tappRegistrationMetadataStorage[\n\t\t\t\t\t\t\t\tattributes.experienceId\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t// Check if the received name is different from the registered name\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\tappRegistrationMetadataStorage[\n\t\t\t\t\t\t\t\t\tattributes.experienceId\n\t\t\t\t\t\t\t\t].name !== attributes.experienceName\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t//registerApplication(attributes);\n\t\t\t\t\t\t\t\tappRegistrationMetadataStorage[\n\t\t\t\t\t\t\t\t\tattributes.experienceId\n\t\t\t\t\t\t\t\t] = {\n\t\t\t\t\t\t\t\t\tname: attributes.experienceName,\n\t\t\t\t\t\t\t\t\tchannelType: attributes.channelType,\n\t\t\t\t\t\t\t\t\ttableName: attributes.tableName,\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\tstoreAppRegistrationMetadataInSessionStorage(\n\t\t\t\t\t\t\t\t\tappRegistrationMetadataStorage\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Experience ID is not registered, proceed to register\n\t\t\t\t\t\t\t// appRegistrationCache[attributes.experienceId] = attributes.experienceName;\n\t\t\t\t\t\t\t// registerApplication(attributes);\n\t\t\t\t\t\t\tappRegistrationMetadataStorage[\n\t\t\t\t\t\t\t\tattributes.experienceId\n\t\t\t\t\t\t\t] = {\n\t\t\t\t\t\t\t\tname: attributes.experienceName,\n\t\t\t\t\t\t\t\tchannelType: attributes.channelType,\n\t\t\t\t\t\t\t\ttableName: attributes.tableName,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tstoreAppRegistrationMetadataInSessionStorage(\n\t\t\t\t\t\t\t\tappRegistrationMetadataStorage\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\tsetConfigValue('legacy', true);\n\t\t\t\t\tsetConfigValue('enableTrack', true);\n\t\t\t\t\tsetConfigValue('enableCollection', true);\n\n\t\t\t\t\tlet legacyConfig = prepareAndGetLegacyConfig(attributes);\n\n\t\t\t\t\tif (legacyConfig && Object.keys(legacyConfig).length > 0) {\n\t\t\t\t\t\t// If the user has been presented with consent dialogue, we should hold the events\n\t\t\t\t\t\t// until the user provides the consent.\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tlegacyConfig.sessionConfig?.trackingConsent !=\n\t\t\t\t\t\t\t\tTRACKING_CONSENT.missing &&\n\t\t\t\t\t\t\t(attributes?.experienceId ||\n\t\t\t\t\t\t\t\tisWebChannelApplication(legacyConfig))\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tconst instanceDomainName =\n\t\t\t\t\t\t\t\tattributes?.instanceDomainName\n\t\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\t\tinstanceDomainName:\n\t\t\t\t\t\t\t\t\t\t\t\tattributes.instanceDomainName,\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t: {};\n\t\t\t\t\t\t\tif (!isMobileBridgeEnabled()) {\n\t\t\t\t\t\t\t\tSNAnalytics.start(\n\t\t\t\t\t\t\t\t\tlegacyConfig.apiKey,\n\t\t\t\t\t\t\t\t\tlegacyConfig.apiAuth,\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t...legacyConfig.sessionConfig,\n\t\t\t\t\t\t\t\t\t\t...instanceDomainName,\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (!isRolesUpdated) {\n\t\t\t\t\t\t\t\tconst rolesList =\n\t\t\t\t\t\t\t\t\tlegacyConfig.sessionConfig.roles?.split(\n\t\t\t\t\t\t\t\t\t\t','\n\t\t\t\t\t\t\t\t\t) || [];\n\t\t\t\t\t\t\t\tisRolesUpdated = true;\n\t\t\t\t\t\t\t\tSNAnalytics.setUserProperty('roles', rolesList);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tlet options = {\n\t\t\t\t\t\t\t\tchannelType: attributes.channelType,\n\t\t\t\t\t\t\t\ttableName: attributes.tableName,\n\t\t\t\t\t\t\t\texperienceName: attributes.experienceName,\n\t\t\t\t\t\t\t\texperienceId: attributes.experienceId,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tsessionStorage.setItem(\n\t\t\t\t\t\t\t\tANALYTICS_SET_APPLICATION_OPTIONS,\n\t\t\t\t\t\t\t\tJSON.stringify(options)\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tunsubscribe();\n\t\t\t\t\t\tconst eventTarget = isMobileBridgeEnabled()\n\t\t\t\t\t\t\t? MobileBridgeAdapter\n\t\t\t\t\t\t\t: SNAnalytics;\n\t\t\t\t\t\tunsubscribe = onEvent((event) => {\n\t\t\t\t\t\t\tif (event.type === 'usage') {\n\t\t\t\t\t\t\t\taddEvent(event, eventTarget);\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\treturn fn(name, version, attributes);\n\t\t\t};\n\t\t}\n\t\tcase 'page':\n\t\t\treturn async (id, attributes = {}) => {\n\t\t\t\tconst isLegacy = getConfigValue('legacy');\n\n\t\t\t\tif (isLegacy) {\n\t\t\t\t\t// setPage(id, {description});\n\t\t\t\t\tif (isMobileBridgeEnabled()) {\n\t\t\t\t\t\tconst screenName = attributes.arguments\n\t\t\t\t\t\t\t? attributes.arguments[0]\n\t\t\t\t\t\t\t: attributes.name;\n\t\t\t\t\t\tMobileBridgeAdapter.startScreen(screenName);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (attributes.arguments) {\n\t\t\t\t\t\t\tSNAnalytics.startPage(...attributes.arguments);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tSNAnalytics.startPage(\n\t\t\t\t\t\t\t\tattributes.name,\n\t\t\t\t\t\t\t\tattributes.title || attributes.name\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} else {\n\t\t\t\t\tif (isMobileBridgeEnabled()) {\n\t\t\t\t\t\tconst screenName = attributes.arguments\n\t\t\t\t\t\t\t? attributes.arguments[0]\n\t\t\t\t\t\t\t: attributes.name;\n\t\t\t\t\t\tMobileBridgeAdapter.startScreen(screenName);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn fn(id, attributes);\n\t\t\t};\n\t\tcase 'user':\n\t\t\treturn async (id, attributes = {}) => {\n\t\t\t\tconst isLegacy = getConfigValue('legacy');\n\n\t\t\t\tif (isLegacy) {\n\t\t\t\t\tconst operation = attributes.__operation__;\n\t\t\t\t\tdelete attributes.__operation__;\n\n\t\t\t\t\tif (isMobileBridgeEnabled()) {\n\t\t\t\t\t\tif (operation === 'setUserId') {\n\t\t\t\t\t\t\tMobileBridgeAdapter.setUserId(\n\t\t\t\t\t\t\t\t...attributes.arguments\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tswitch (operation) {\n\t\t\t\t\t\t\tcase 'setUserId':\n\t\t\t\t\t\t\t\t// setUser(id, {__operation__: 'setUserId'});\n\t\t\t\t\t\t\t\tSNAnalytics.setUserId(...attributes.arguments);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 'setUserProperty':\n\t\t\t\t\t\t\t\t// setUser(id, {__operation__: 'setUserProperty', someKey: someValue});\n\t\t\t\t\t\t\t\tSNAnalytics.setUserProperty(\n\t\t\t\t\t\t\t\t\t...attributes.arguments\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 'removeUserProperty':\n\t\t\t\t\t\t\t\t// setUser(id, {__operation__: 'removeUserProperty', someKey: undefined});\n\t\t\t\t\t\t\t\tSNAnalytics.removeUserProperty(\n\t\t\t\t\t\t\t\t\t...attributes.arguments\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 'setUserProperties':\n\t\t\t\t\t\t\t\t// setUser(id, {__operation__: 'removeUserProperty', someKey: someValue, anotherKey: anotherValue});\n\t\t\t\t\t\t\t\tSNAnalytics.setUserProperties(\n\t\t\t\t\t\t\t\t\t...attributes.arguments\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 'appendToUserProperty':\n\t\t\t\t\t\t\t\t// setUser(id, {__operation__: 'appendToUserProperty', someKey: someValue});\n\t\t\t\t\t\t\t\tSNAnalytics.appendToUserProperty(\n\t\t\t\t\t\t\t\t\t...attributes.arguments\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 'incUserProperty':\n\t\t\t\t\t\t\t\t// setUser(id, {__operation__: 'incUserProperty', args: arguments});\n\t\t\t\t\t\t\t\tSNAnalytics.incUserProperty(\n\t\t\t\t\t\t\t\t\t...attributes.arguments\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 'setTrackingConsent':\n\t\t\t\t\t\t\t\t// setUser(id, {__operation__: 'setTrackingConsent', args: arguments});\n\t\t\t\t\t\t\t\tSNAnalytics.setTrackingConsent(\n\t\t\t\t\t\t\t\t\t...attributes.arguments\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn fn(id, attributes);\n\t\t\t};\n\t\tcase 'utility':\n\t\t\treturn async (id, attributes = {}) => {\n\t\t\t\tswitch (id) {\n\t\t\t\t\tcase 'setDebugLevel':\n\t\t\t\t\t\t// __TECTONIC__$servicenow_ui_analytics_integrator.setConfigValue('setDebugLevel', 'info');\n\t\t\t\t\t\tSNAnalytics.setDebugLevel(attributes);\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'deleteCurrentUserData':\n\t\t\t\t\t\t// __TECTONIC__$servicenow_ui_analytics_integrator.setConfigValue('deleteCurrentUserData', '');\n\t\t\t\t\t\tSNAnalytics.deleteCurrentUserData();\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'legacyConfig':\n\t\t\t\t\t\t// __TECTONIC__$servicenow_ui_analytics_integrator.setConfigValue('legacyConfig', {}});\n\t\t\t\t\t\tsetConfigValue(id, attributes);\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\t// Handle other cases if needed (for debugging/logging purposes)\n\t\t\t\t\t\tconsole.log('Unknown setConfigValue id: ' + id);\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\treturn fn(id, attributes);\n\t\t\t};\n\t}\n}\n\n// Function to retrieve the Applications object from sessionStorage\nfunction getAppRegistrationMetadataFromSessionStorage() {\n\ttry {\n\t\tconst storedData = sessionStorage.getItem('AppRegistrationMetadata');\n\t\treturn storedData ? JSON.parse(storedData) : {}; // Return parsed object or an empty object if not found\n\t} catch (error) {\n\t\tconsole.warn(\n\t\t\t'[Analytics] Failed to retrieve app registration metadata from sessionStorage:',\n\t\t\terror\n\t\t);\n\t\treturn {}; // Return empty object if sessionStorage is unavailable or cleared\n\t}\n}\n\n// Function to store the Applications object in sessionStorage\nfunction storeAppRegistrationMetadataInSessionStorage(applications) {\n\tsessionStorage.setItem(\n\t\t'AppRegistrationMetadata',\n\t\tJSON.stringify(applications)\n\t);\n}\n\nfunction prepareAndGetLegacyConfig(attributes) {\n\ttry {\n\t\tconst legacyConfigData = sessionStorage.getItem('legacyConfig');\n\t\tif (!legacyConfigData) {\n\t\t\treturn {};\n\t\t}\n\n\t\tlet uxMetricsConfig = JSON.parse(legacyConfigData);\n\t\tif (uxMetricsConfig && Object.keys(uxMetricsConfig).length !== 0) {\n\t\t\tlet legacyConfig = {\n\t\t\t\tapiAuth: uxMetricsConfig.apiAuth,\n\t\t\t\tapiKey: uxMetricsConfig.apiKey,\n\t\t\t\tuxCollectionMode: uxMetricsConfig.uxCollectionMode\n\t\t\t\t\t? uxMetricsConfig.uxCollectionMode\n\t\t\t\t\t: 'Both',\n\t\t\t\tchannelType: uxMetricsConfig.channelType,\n\t\t\t\tsessionConfig: {\n\t\t\t\t\tserverEndpoint: uxMetricsConfig.endpointURL,\n\t\t\t\t\ttrackingConsent: uxMetricsConfig.trackingConsent,\n\t\t\t\t\tuserId: uxMetricsConfig.user?.hashId,\n\t\t\t\t\tdomainId: uxMetricsConfig.user?.domainId,\n\t\t\t\t\tdomainName: uxMetricsConfig.user?.domainName,\n\t\t\t\t\troles: uxMetricsConfig.user?.roles,\n\t\t\t\t},\n\t\t\t};\n\n\t\t\tlegacyConfig.sessionConfig.appContextId = attributes.experienceId;\n\t\t\tlegacyConfig.sessionConfig.appContextName =\n\t\t\t\tattributes.experienceName;\n\t\t\treturn legacyConfig;\n\t\t} else {\n\t\t\treturn {};\n\t\t}\n\t} catch (error) {\n\t\tconsole.warn(\n\t\t\t'[Analytics] Failed to retrieve or parse legacy config from sessionStorage:',\n\t\t\terror\n\t\t);\n\t\treturn {}; // Return empty config if sessionStorage is unavailable or data is corrupted\n\t}\n}\nfunction isWebChannelApplication(legacyConfig) {\n\treturn (\n\t\tlegacyConfig?.channelType === 'web' ||\n\t\tlegacyConfig?.channelType == 'CoreUI'\n\t);\n}\n","import { get as getConfigValue } from '../config';\n\nexport default async function send(events) {\n\tif (!getConfigValue('enableCollection')) return;\n\n\tconst url = getConfigValue('collecterUrl') || 'api/now/trace';\n\n\ttry {\n\t\tawait fetch(url, {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t},\n\t\t\tbody: JSON.stringify(events),\n\t\t});\n\t} catch (e) {\n\t\tconsole.log(e);\n\t}\n}\n","import { get as getConfigValue } from './config';\nimport {\n\tonEvent,\n\tgetQueuedEvents,\n\tgetApplication,\n\tgetUser,\n} from '@servicenow/ui-analytics-api';\nimport send from './legacy/send';\n\nconst events = [];\nconst exporterInterval = getConfigValue('exporterInterval');\nconst applyMetadata = (events) => {\n\tconst user = getUser();\n\tconst application = getApplication();\n\tconst augmentPage = getConfigValue('augmentPage');\n\n\tfor (let i = 0; i < events.length; i++) {\n\t\tconst event = events[i];\n\t\tevent.user = user;\n\t\tevent.application = application;\n\t\tevent.page = augmentPage(event.page);\n\t}\n\n\treturn events;\n};\n\nexport default function startExporter() {\n\tsend(applyMetadata(getQueuedEvents()));\n\n\tonEvent((event) => events.push(event));\n\n\tsetInterval(async () => {\n\t\tif (events.length) {\n\t\t\tsend([...events]);\n\t\t\tevents.length = 0;\n\t\t}\n\t}, exporterInterval);\n}\n","import { track } from '@servicenow/ui-analytics-api';\n\nexport const SPECIAL_EVENTS = [\n\t'$PERF-DATA',\n\t'UXF_DIRECT_LOAD_COMPLETE',\n\t'UXF_USER_NAV_LOAD_COMPLETE',\n\t'EXPERIENCE_START',\n\t'USER_NAVIGATE',\n];\n\nconst markTypes = {\n\tall: 'all',\n\tusage: 'usage',\n\tperformance: 'performance',\n};\n\nexport const registerCoreHandler = () => {\n\tif (!window.__webAnalytics__GLIDE_UX_METRICS) {\n\t\twindow.addEventListener('GLIDE_UX_METRICS', (event) => {\n\t\t\tvar payload = event.detail;\n\t\t\tif (\n\t\t\t\t!(\n\t\t\t\t\tpayload?.config?.type == markTypes.performance ||\n\t\t\t\t\tpayload?.config?.type == markTypes.all ||\n\t\t\t\t\tSPECIAL_EVENTS.includes(payload.eventName)\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\ttrackWithArguments(payload.eventName, payload.data);\n\t\t\t}\n\t\t});\n\t\t// this is added to avoid multiple event listeners being added in the core ui umd/esm module\n\t\twindow.__webAnalytics__GLIDE_UX_METRICS = true;\n\t}\n};\n\nfunction trackWithArguments(eventName, eventProps) {\n\tlet trackOptions = {\n\t\tname: eventName,\n\t\tattributes: {\n\t\t\t__type__: 'addEvent',\n\t\t\targuments: arguments,\n\t\t},\n\t};\n\ttrack(trackOptions.name, trackOptions);\n}\n","import {\n\tcontext,\n\ttracer,\n\ttrace,\n\ttrack,\n\tcreateCounter,\n\tcreateGauge,\n\tcreateHistogram,\n\tsetUser as setUserNext,\n\tgetUser,\n\tsetPage as setPageNext,\n\tgetPage,\n\tsetConfigValue as setApiConfigValueNext,\n\tonEvent,\n\tcreateTraceParent,\n\tcreateTraceId,\n\tcreateTraceParentHeader,\n\tsetApplication as setApplicationNext,\n\tgetApplication,\n} from '@servicenow/ui-analytics-api';\n\nimport higherOrderSDKWrapper from './higherOrderSDKWrapper';\nimport { get as getConfigValue } from '../config';\nimport startExporter from '../startExporter';\nimport { registerCoreHandler } from './coreUIEventHandler';\n\nconst setUser = higherOrderSDKWrapper(setUserNext, 'user');\nconst setPage = higherOrderSDKWrapper(setPageNext, 'page');\nconst setApplication = higherOrderSDKWrapper(setApplicationNext, 'application');\nconst setApiConfigValue = higherOrderSDKWrapper(\n\tsetApiConfigValueNext,\n\t'utility'\n);\n\nregisterCoreHandler();\n\nexport {\n\tcontext,\n\ttracer,\n\ttrace,\n\ttrack,\n\tcreateCounter,\n\tcreateGauge,\n\tcreateHistogram,\n\tsetUser,\n\tgetUser,\n\tsetPage,\n\tgetPage,\n\tsetApiConfigValue as setConfigValue,\n\tgetConfigValue,\n\tonEvent,\n\tcreateTraceParent,\n\tcreateTraceId,\n\tstartExporter,\n\tcreateTraceParentHeader,\n\tsetApplication,\n\tgetApplication,\n};\n","import { URLMASKSTRING, PARAMS_SEPARATOR, SUB_SEPARATOR } from '../constants';\n\nfunction mask(url, value) {\n\treturn url.replace(value, URLMASKSTRING);\n}\n\n/*\n * Returning masked url and other params.\n * There are corner cases such as duplicates, decoded uri params values.\n * Finding out each params values at correct position in url and masking it is the tricky part.\n */\n\nfunction handleParams(url, params, parentPrefix) {\n\tconst paramsPrefix = parentPrefix ? `${parentPrefix}param_` : 'param_';\n\tconst urlParams = {};\n\tlet maskedUrl = url;\n\tfor (const k in params) {\n\t\turlParams[paramsPrefix + k] = params[k];\n\t\tconst paramValue = params[k]?.toString();\n\t\t//checking empty and decoded values present in params object, added test case also.\n\t\tconst encodeUrlPart =\n\t\t\tparamValue &&\n\t\t\t(url.includes(paramValue)\n\t\t\t\t? paramValue\n\t\t\t\t: encodeURIComponent(paramValue));\n\t\tif (encodeUrlPart) maskedUrl = mask(maskedUrl, encodeUrlPart);\n\t}\n\treturn {\n\t\turl: maskedUrl,\n\t\tparams: urlParams,\n\t};\n}\n\n/*\n * Returning masked url and other fields present in both parent and child.\n * Masking sys id with *** if present in the url.\n */\n\nfunction handleFields(url, fields, parentPrefix) {\n\tconst checkSysId = /^[a-z0-9]+$/i;\n\tconst urlFields = {};\n\tlet maskedUrl = url;\n\tfor (const k in fields) {\n\t\turlFields[parentPrefix + k] = fields[k];\n\t\tif (fields[k].length === 32 && checkSysId.test(fields[k]))\n\t\t\tmaskedUrl = mask(maskedUrl, fields[k]);\n\t}\n\treturn {\n\t\turl: maskedUrl,\n\t\tfields: urlFields,\n\t};\n}\n\nfunction getProcessedSelectedContentData(url, obj, prefix) {\n\tlet allParams = {};\n\tlet maskedUrl = '';\n\tif (obj) {\n\t\t//spliting url by using `/params/` as separator\n\t\tconst urlParts = url?.split(PARAMS_SEPARATOR);\n\t\t//This might be the context path or fields url.\n\t\tconst fieldsObject = handleFields(urlParts?.[0], obj.fields, prefix);\n\t\tmaskedUrl = fieldsObject.url;\n\t\tallParams = { ...fieldsObject.fields };\n\t\tif (obj.params && urlParts.length > 1) {\n\t\t\tconst paramsObject = handleParams(urlParts[1], obj.params, prefix);\n\t\t\tmaskedUrl = `${maskedUrl}${PARAMS_SEPARATOR}${paramsObject.url}`;\n\t\t\tallParams = { ...allParams, ...paramsObject.params };\n\t\t}\n\t\tif (obj._timestamp) maskedUrl = mask(maskedUrl, obj._timestamp);\n\t} else maskedUrl = url;\n\treturn {\n\t\tmaskedUrl,\n\t\tallUrlParams: allParams,\n\t};\n}\n\nexport function getReconstructedUrlAndParams(metaUrl, selectedContent) {\n\tlet finalUrl = '';\n\tlet allParams = '';\n\t//spliting url by using `/sub/` as separator\n\tconst subParts = metaUrl?.split(SUB_SEPARATOR);\n\tif (subParts?.length > 1) {\n\t\tconst parentData = getProcessedSelectedContentData(\n\t\t\tsubParts[0],\n\t\t\tselectedContent.parent,\n\t\t\t'parent_'\n\t\t);\n\t\tconst childData = getProcessedSelectedContentData(\n\t\t\tsubParts[1],\n\t\t\tselectedContent,\n\t\t\t''\n\t\t);\n\t\tfinalUrl = `${parentData.maskedUrl}${SUB_SEPARATOR}${childData.maskedUrl}`;\n\t\tfor (let i = 2; i <= subParts.length - 1; i++)\n\t\t\tfinalUrl = `${finalUrl}${SUB_SEPARATOR}${subParts[i]}`;\n\t\tallParams = { ...parentData.allUrlParams, ...childData.allUrlParams };\n\t} else {\n\t\tconst childData = getProcessedSelectedContentData(\n\t\t\tsubParts?.[0],\n\t\t\tselectedContent,\n\t\t\t''\n\t\t);\n\t\tfinalUrl = childData.maskedUrl;\n\t\tallParams = { ...childData.allUrlParams };\n\t}\n\treturn {\n\t\turl: finalUrl,\n\t\tworkspaceParams: allParams,\n\t};\n}\n","const RECORD = 'record';\nconst SUB = 'sub';\nconst CLASSIC = 'classic';\n\nexport function isClassicUrl(selectedContent) {\n\treturn (\n\t\tselectedContent.route === CLASSIC ||\n\t\tselectedContent.isSeismicApp === false\n\t);\n}\n\nexport function getWorkspacePageName(url, selectedContent) {\n\tconst { route, fields, parent } = selectedContent ?? {};\n\tconst table = fields?.table;\n\tconst parentRoute = parent?.route;\n\tlet pageName;\n\tif (route || parentRoute) {\n\t\tif (route === RECORD) {\n\t\t\tif (!url) pageName = null;\n\t\t\telse if (url.includes('/sub/record/'))\n\t\t\t\tpageName = `${SUB}-${RECORD}-${table}`;\n\t\t\telse pageName = `${RECORD}-${table}`;\n\t\t} else\n\t\t\tpageName = `${parentRoute ? `${SUB}-` : ''}${route}${table ? `-${table}` : ''}`;\n\t}\n\treturn pageName;\n}\n\nfunction getClassicPageName(url) {\n\tconst decodedUrl = url ? decodeURIComponent(url) : null;\n\tconst patternMatch = decodedUrl && decodedUrl.match(/[$\\w\\-]+(?=.do[?]*)/g);\n\treturn (\n\t\tpatternMatch &&\n\t\t(patternMatch[0] === 'nav_to' ? patternMatch[1] : patternMatch[0])\n\t);\n}\n\nexport function getPageName({ url = '', selectedContent = {}, pageTitle }) {\n\tconst pageName = isClassicUrl(selectedContent)\n\t\t? getClassicPageName(url)\n\t\t: getWorkspacePageName(url, selectedContent);\n\treturn pageName || pageTitle;\n}\n","import { CLASSIC_URL_PARAMS } from '../constants';\nimport { getReconstructedUrlAndParams } from './selectContentParser';\nimport { isClassicUrl, getPageName, getWorkspacePageName } from './getPageName';\n\nfunction getClassicParamsAndUrl(url) {\n\tif (!url) return;\n\tconst decodedUrl = decodeURIComponent(url);\n\tconst urlParams = {};\n\tconst queryParams = decodedUrl.split('?');\n\tconst truncateUrl = url.startsWith('/nav_to.do')\n\t\t? url.split('%3F')\n\t\t: queryParams;\n\turlParams.url = truncateUrl[0];\n\tif (queryParams.length > 1) {\n\t\tconst parameters = new URLSearchParams(queryParams[1]);\n\t\tCLASSIC_URL_PARAMS.forEach((prop) => {\n\t\t\tconst value = parameters.get(prop);\n\t\t\tif (value) urlParams[prop] = value;\n\t\t});\n\t}\n\treturn urlParams;\n}\n\nfunction getWorkspaceParamsAndUrl(metaUrl, selectedContent) {\n\tconst { url, workspaceParams } = getReconstructedUrlAndParams(\n\t\tmetaUrl,\n\t\tselectedContent,\n\t\tfalse\n\t);\n\treturn { url, ...workspaceParams };\n}\n\nexport function getPageParamsAndUrl(meta = {}) {\n\tconst { url, selectedContent = {} } = meta;\n\tconst params = isClassicUrl(selectedContent)\n\t\t? getClassicParamsAndUrl(url)\n\t\t: getWorkspaceParamsAndUrl(url, selectedContent);\n\treturn params || [];\n}\n\nexport const getPageNameFromMeta = getPageName;\nexport default getWorkspacePageName;\n","import { TRACKING_CONSENT } from '../constants';\n\nlet configuration = JSON.parse(sessionStorage.getItem('legacyConfig'));\n\nfunction getConfig() {\n\treturn JSON.parse(sessionStorage.getItem('legacyConfig'));\n}\n\nfunction setConfig(config) {\n\tconfiguration = config;\n\t/* Convert comma separated string of allowedPropsInPageNavigate into array */\n\tconst { allowedPropsInPageNavigate = '' } = configuration;\n\tconfiguration.allowedPropsInPageNavigate =\n\t\tallowedPropsInPageNavigate.split(',');\n}\n\nfunction setConfigProperty(property, value) {\n\tgetConfig()[property] = value;\n}\n\nfunction getConfigProperty(property) {\n\treturn getConfig()[property];\n}\n\nfunction canStartSession() {\n\tconst channel = (getConfig()?.channelType || '').trim();\n\treturn (\n\t\tchannel !== 'NowExperience' &&\n\t\tchannel !== 'CoreUI' &&\n\t\tchannel !== 'NextExperience'\n\t);\n}\n\nfunction isConsentMissing() {\n\treturn getConfig()?.trackingConsent === TRACKING_CONSENT.missing;\n}\n\nfunction getAllowedPropsInPageNavigate() {\n\treturn getConfig() ? getConfig().allowedPropsInPageNavigate : '';\n}\n\nexport {\n\tgetConfig,\n\tsetConfig,\n\tsetConfigProperty,\n\tgetConfigProperty,\n\tcanStartSession,\n\tisConsentMissing,\n\tgetAllowedPropsInPageNavigate,\n};\n","import reduce from 'lodash/reduce';\nimport { EVENT_MAPPING, EXPERIENCE_START, USER_NAVIGATE } from './events';\nimport { getPageParamsAndUrl } from './utils';\nimport { getConfig, getAllowedPropsInPageNavigate } from './ux-config';\n\nfunction filterEventProps(eventProps, allowList) {\n\tif (Object.entries(getConfig()) > 0) {\n\t\treturn reduce(\n\t\t\tallowList,\n\t\t\t(acc, propName) => {\n\t\t\t\tacc[propName] = eventProps[propName];\n\t\t\t\treturn acc;\n\t\t\t},\n\t\t\t{}\n\t\t);\n\t} else {\n\t\teventProps;\n\t}\n}\n\nfunction isPrimitiveDataType(propVal) {\n\treturn (\n\t\ttypeof propVal === 'string' ||\n\t\ttypeof propVal === 'boolean' ||\n\t\t(typeof propVal === 'number' && !Number.isNaN(propVal))\n\t);\n}\n\n// appsee accepts string, number, boolean or Date\nfunction isValidType(propVal) {\n\t// is primitive or Date\n\treturn isPrimitiveDataType(propVal) || propVal instanceof Date;\n}\n\nfunction transformEventProps(eventProps) {\n\tObject.keys(eventProps).forEach((key) => {\n\t\t// stringify event prop value if not type supported by appsee\n\t\tif (eventProps[key] && !isValidType(eventProps[key]))\n\t\t\teventProps[key] = JSON.stringify(eventProps[key]);\n\t});\n}\n\nfunction isEntryPage(event, { switched } = {}) {\n\treturn event === EXPERIENCE_START && switched === false;\n}\n\n/*\n * excluding the meta(options), markTime, type properties from the props list\n * including the url, pageTitle from meta when the event is EXPERIENCE_START  or USER_NAVIGATE\n * which are sent to the appsee\n */\nexport function transform(mark) {\n\t/* eslint-disable no-unused-vars */\n\tconst {\n\t\tevent,\n\t\toptions: { meta, ...remainingOptions } = {},\n\t\tmarkTime,\n\t\tinteractionId,\n\t\tcomponentId,\n\t\tparentComponentId,\n\t\ttype,\n\t\tcomponentName,\n\t\t...otherProps\n\t} = mark;\n\tlet eventProps = { ...remainingOptions, ...otherProps };\n\tif (event === EXPERIENCE_START || event === USER_NAVIGATE) {\n\t\teventProps = {\n\t\t\t...eventProps,\n\t\t\t...getPageParamsAndUrl(meta),\n\t\t};\n\t\teventProps['Entry Page'] = isEntryPage(event, meta);\n\t\teventProps['Page Title'] = meta?.pageTitle;\n\t\tif (getConfig() && Object.entries(getConfig()) > 0) {\n\t\t\teventProps = filterEventProps(\n\t\t\t\teventProps,\n\t\t\t\tgetAllowedPropsInPageNavigate()\n\t\t\t);\n\t\t}\n\t}\n\ttransformEventProps(eventProps);\n\treturn {\n\t\teventName: EVENT_MAPPING[event] || event,\n\t\teventProps,\n\t};\n}\n","/* eslint-disable no-unused-vars */\nimport { transform } from './transformMarks';\nimport {\n\tEXPERIENCE_START,\n\tUSER_NAVIGATE,\n\tUXF_USER_NAV_LOAD_COMPLETE,\n} from './events';\nimport getWorkspacePageName, { getPageNameFromMeta } from './utils';\nimport { TRACKING_CONSENT, ALLOWED_PERF_EVENTS } from '../constants';\nimport { isEmpty } from 'lodash';\n\nlet pageUrl;\n\nexport default function addLegacyEvent(markReceived, legacySdk) {\n\t// these should be metrics or traces in the future\n\tif (markReceived.attributes?.__type__ === 'addPerformanceTrace') {\n\t\t// service portal addPerformanceTrace\n\t\tdelete markReceived.attributes.__type__;\n\t\tlegacySdk.addPerformanceTrace(...markReceived.attributes.arguments);\n\t} else if (markReceived.attributes?.__type__ === 'addEvent') {\n\t\t// service portal addEvent\n\t\tdelete markReceived.attributes.__type__;\n\t\tlegacySdk.addEvent(...markReceived.attributes.arguments);\n\t} else {\n\t\tconst allMarks = processMarks(markReceived);\n\t\tallMarks.forEach((mark = { options: {} }) => {\n\t\t\tif (mark.attributes.event === EXPERIENCE_START) {\n\t\t\t\tconst {\n\t\t\t\t\tmeta: {\n\t\t\t\t\t\tapplicationContextId,\n\t\t\t\t\t\tapplicationContextName,\n\t\t\t\t\t\tswitched,\n\t\t\t\t\t} = {},\n\t\t\t\t} = mark.attributes.options;\n\t\t\t\tstartSession(\n\t\t\t\t\tlegacySdk,\n\t\t\t\t\tapplicationContextId,\n\t\t\t\t\tapplicationContextName\n\t\t\t\t);\n\t\t\t\tif (switched) return;\n\t\t\t}\n\t\t\tif (ALLOWED_PERF_EVENTS.includes(mark.attributes.event)) {\n\t\t\t\t// ux metrics performance events\n\t\t\t\t// Process performance marks\n\t\t\t\tconst {\n\t\t\t\t\toptions: {\n\t\t\t\t\t\tmetrics,\n\t\t\t\t\t\tkey,\n\t\t\t\t\t\ttotalUiTime,\n\t\t\t\t\t\tscreenRoute: route,\n\t\t\t\t\t\tscreenFields: fields,\n\t\t\t\t\t\turl = '',\n\t\t\t\t\t\tscreenParent,\n\t\t\t\t\t} = {},\n\t\t\t\t\targuments: { name, value, properties, key: argumentKey },\n\t\t\t\t} = mark.attributes;\n\t\t\t\tif (totalUiTime) {\n\t\t\t\t\t// uxf; page loads only; will need to be modified to handle other metrics in the future\n\t\t\t\t\tconst navigationType =\n\t\t\t\t\t\tmark.attributes.event === UXF_USER_NAV_LOAD_COMPLETE\n\t\t\t\t\t\t\t? 'navigation'\n\t\t\t\t\t\t\t: 'page load';\n\t\t\t\t\tlegacySdk.addPerformanceTrace(\n\t\t\t\t\t\tgetWorkspacePageName(url, {\n\t\t\t\t\t\t\troute,\n\t\t\t\t\t\t\tfields,\n\t\t\t\t\t\t\tparent: screenParent,\n\t\t\t\t\t\t}),\n\t\t\t\t\t\t'Page Load Time',\n\t\t\t\t\t\tMath.round(totalUiTime),\n\t\t\t\t\t\t{ navigationType }\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (Array.isArray(metrics)) {\n\t\t\t\t\t// core ui\n\t\t\t\t\tmark.attributes.options.metrics.forEach((metric) => {\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tmetric.name === 'Page Load Time' &&\n\t\t\t\t\t\t\t!metric.properties?.navigationType\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tif (!metric.properties) metric.properties = {};\n\t\t\t\t\t\t\tmetric.properties.navigationType = 'page load';\n\t\t\t\t\t\t}\n\t\t\t\t\t\tlegacySdk.addPerformanceTrace(\n\t\t\t\t\t\t\tkey,\n\t\t\t\t\t\t\tmetric.name,\n\t\t\t\t\t\t\tMath.round(metric.value),\n\t\t\t\t\t\t\tmetric.properties\n\t\t\t\t\t\t);\n\t\t\t\t\t});\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// ux metrics usage events\n\t\t\t\tconst { options = {}, event } = mark.attributes;\n\n\t\t\t\tif (isEmpty(event)) return;\n\n\t\t\t\tif (event === EXPERIENCE_START || event === USER_NAVIGATE) {\n\t\t\t\t\t// remove host from url\n\t\t\t\t\tif (options.meta?.url) {\n\t\t\t\t\t\toptions.meta.url = options.meta.url.replace(\n\t\t\t\t\t\t\twindow.location.origin,\n\t\t\t\t\t\t\t''\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (options.meta.url === pageUrl) return;\n\t\t\t\t\t}\n\t\t\t\t\tpageUrl = options.meta?.url;\n\t\t\t\t}\n\t\t\t\t// removed start page call from here.\n\t\t\t\tstartPage(event, options, legacySdk);\n\t\t\t\tconst { eventName, eventProps } = transform(mark.attributes);\n\t\t\t\tlegacySdk.addEvent(eventName, eventProps);\n\t\t\t}\n\t\t});\n\t}\n}\n\nfunction startSession(legacySdk, applicationContextId, applicationContextName) {\n\tlet uxMetricsConfig = JSON.parse(sessionStorage.getItem('legacyConfig'));\n\tif (uxMetricsConfig) {\n\t\tlet legacyConfig = {\n\t\t\tapiAuth: uxMetricsConfig.apiAuth,\n\t\t\tapiKey: uxMetricsConfig.apiKey,\n\t\t\tuxCollectionMode: uxMetricsConfig.uxCollectionMode\n\t\t\t\t? uxMetricsConfig.uxCollectionMode\n\t\t\t\t: 'Both',\n\t\t\tsessionConfig: {\n\t\t\t\tserverEndpoint: uxMetricsConfig.endpointURL,\n\t\t\t\ttrackingConsent: uxMetricsConfig.trackingConsent,\n\t\t\t\tuserId: uxMetricsConfig.user.hashId,\n\t\t\t\tdomainId: uxMetricsConfig.user.domainId,\n\t\t\t\tdomainName: uxMetricsConfig.user.domainName,\n\t\t\t\troles: uxMetricsConfig.user.roles,\n\t\t\t\tsaveAppContext: true,\n\t\t\t},\n\t\t};\n\n\t\tlegacyConfig.sessionConfig.appContextId = applicationContextId;\n\t\tlegacyConfig.sessionConfig.appContextName = applicationContextName;\n\t\tlegacySdk.start(\n\t\t\tlegacyConfig.uxCollectionMode,\n\t\t\tlegacyConfig.apiKey,\n\t\t\tlegacyConfig.apiAuth,\n\t\t\tlegacyConfig.sessionConfig\n\t\t);\n\t}\n}\n\nfunction startPage(event, options, legacySdk) {\n\tconst pageName = getPageName(event, options);\n\tpageName && legacySdk.startPage(pageName);\n}\n\nfunction getPageName(event, options) {\n\tconst { meta = {} } = options;\n\treturn USER_NAVIGATE === event || EXPERIENCE_START === event\n\t\t? getPageNameFromMeta(meta) || options.pageTitle\n\t\t: null;\n}\n\nfunction processMarks(marks) {\n\t// Convert marks to an array if it's not already an array\n\tif (!Array.isArray(marks)) {\n\t\tmarks = marks !== undefined && marks !== null ? [marks] : []; // Wrap in an array if not null/undefined\n\t}\n\treturn marks;\n}\n","import { get as getConfigValue, set as setConfigValue } from '../config';\nimport { onEvent } from '@servicenow/ui-analytics-api';\nimport addLegacyEvent from './addLegacyEvent';\n\nimport {\n\tTRACKING_CONSENT,\n\tANALYTICS_SET_APPLICATION_OPTIONS,\n} from '../constants';\n\nlet unsubscribe = () => null;\nlet isRolesUpdated = false;\nlet legacySdk = null;\n\nconst resolveLegacySdk = async () => {\n\tif (legacySdk) return;\n\tlegacySdk = (await import('@devsnc/library-appsee-web-sdk')).default;\n};\n\nexport default function higherOrderSDKWrapper(fn, type) {\n\tswitch (type) {\n\t\tcase 'application':\n\t\t\treturn async (name, version = 0, attributes = {}) => {\n\t\t\t\tawait resolveLegacySdk();\n\t\t\t\tif (attributes.__isLegacy__) {\n\t\t\t\t\t// Service Portal\n\t\t\t\t\tsetConfigValue('legacy', true);\n\t\t\t\t\tsetConfigValue('enableTrack', true);\n\t\t\t\t\tsetConfigValue('enableCollection', true);\n\n\t\t\t\t\tlet uxCollectionMode = '';\n\t\t\t\t\tif (attributes.uxCollectionMode)\n\t\t\t\t\t\tuxCollectionMode = attributes.uxCollectionMode;\n\t\t\t\t\telse {\n\t\t\t\t\t\tlet enableNewWebSdk = attributes.enableNewWebSdk;\n\t\t\t\t\t\tif (enableNewWebSdk && enableNewWebSdk == true) {\n\t\t\t\t\t\t\tuxCollectionMode = 'Both';\n\t\t\t\t\t\t} else if (\n\t\t\t\t\t\t\tenableNewWebSdk &&\n\t\t\t\t\t\t\tenableNewWebSdk == false\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tuxCollectionMode = 'Legacy';\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tuxCollectionMode = 'Both';\n\t\t\t\t\t\t}\n\t\t\t\t\t\tattributes.uxCollectionMode = uxCollectionMode;\n\t\t\t\t\t}\n\n\t\t\t\t\t// conditional logic for service portal only.\n\t\t\t\t\tlegacySdk.start(\n\t\t\t\t\t\tattributes.uxCollectionMode,\n\t\t\t\t\t\t...attributes.arguments\n\t\t\t\t\t);\n\n\t\t\t\t\tunsubscribe();\n\t\t\t\t\tunsubscribe = onEvent((event) => {\n\t\t\t\t\t\tif (event.type === 'usage') {\n\t\t\t\t\t\t\taddLegacyEvent(event, legacySdk);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tif (attributes.experienceId) {\n\t\t\t\t\t\t// Next Experience, UX Metrics, CoreUI, Studio\n\n\t\t\t\t\t\t// Check if the experience ID has been registered\n\t\t\t\t\t\t//const registeredName = appRegistrationCache[attributes.experienceId];\n\t\t\t\t\t\tconst appRegistrationMetadataStorage =\n\t\t\t\t\t\t\tgetAppRegistrationMetadataFromSessionStorage();\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tappRegistrationMetadataStorage[\n\t\t\t\t\t\t\t\tattributes.experienceId\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t// Check if the received name is different from the registered name\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\tappRegistrationMetadataStorage[\n\t\t\t\t\t\t\t\t\tattributes.experienceId\n\t\t\t\t\t\t\t\t].name !== attributes.experienceName\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t//registerApplication(attributes);\n\t\t\t\t\t\t\t\tappRegistrationMetadataStorage[\n\t\t\t\t\t\t\t\t\tattributes.experienceId\n\t\t\t\t\t\t\t\t] = {\n\t\t\t\t\t\t\t\t\tname: attributes.experienceName,\n\t\t\t\t\t\t\t\t\tchannelType: attributes.channelType,\n\t\t\t\t\t\t\t\t\ttableName: attributes.tableName,\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\tstoreAppRegistrationMetadataInSessionStorage(\n\t\t\t\t\t\t\t\t\tappRegistrationMetadataStorage\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Experience ID is not registered, proceed to register\n\t\t\t\t\t\t\t// appRegistrationCache[attributes.experienceId] = attributes.experienceName;\n\t\t\t\t\t\t\t// registerApplication(attributes);\n\t\t\t\t\t\t\tappRegistrationMetadataStorage[\n\t\t\t\t\t\t\t\tattributes.experienceId\n\t\t\t\t\t\t\t] = {\n\t\t\t\t\t\t\t\tname: attributes.experienceName,\n\t\t\t\t\t\t\t\tchannelType: attributes.channelType,\n\t\t\t\t\t\t\t\ttableName: attributes.tableName,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tstoreAppRegistrationMetadataInSessionStorage(\n\t\t\t\t\t\t\t\tappRegistrationMetadataStorage\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tsetConfigValue('legacy', true);\n\t\t\t\t\tsetConfigValue('enableTrack', true);\n\t\t\t\t\tsetConfigValue('enableCollection', true);\n\n\t\t\t\t\tlet legacyConfig = prepareAndGetLegacyConfig(attributes);\n\n\t\t\t\t\tif (legacyConfig && legacyConfig.uxCollectionMode) {\n\t\t\t\t\t\t// If the user has been presented with consent dialogue, we should hold the events\n\t\t\t\t\t\t// until the user provides the consent.\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tlegacyConfig.sessionConfig.trackingConsent !=\n\t\t\t\t\t\t\t\tTRACKING_CONSENT.missing &&\n\t\t\t\t\t\t\t(attributes.experienceId ||\n\t\t\t\t\t\t\t\tisWebChannelApplication(legacyConfig))\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tconst instanceDomainName =\n\t\t\t\t\t\t\t\tattributes?.instanceDomainName\n\t\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\t\tinstanceDomainName:\n\t\t\t\t\t\t\t\t\t\t\t\tattributes.instanceDomainName,\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t: {};\n\n\t\t\t\t\t\t\tlegacySdk.start(\n\t\t\t\t\t\t\t\tlegacyConfig.uxCollectionMode,\n\t\t\t\t\t\t\t\tlegacyConfig.apiKey,\n\t\t\t\t\t\t\t\tlegacyConfig.apiAuth,\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t...legacyConfig.sessionConfig,\n\t\t\t\t\t\t\t\t\t...instanceDomainName,\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tif (!isRolesUpdated) {\n\t\t\t\t\t\t\t\tconst rolesList =\n\t\t\t\t\t\t\t\t\tlegacyConfig.sessionConfig.roles?.split(\n\t\t\t\t\t\t\t\t\t\t','\n\t\t\t\t\t\t\t\t\t) || [];\n\t\t\t\t\t\t\t\tisRolesUpdated = true;\n\t\t\t\t\t\t\t\tlegacySdk.setUserProperty('roles', rolesList);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tlet options = {\n\t\t\t\t\t\t\t\tchannelType: attributes.channelType,\n\t\t\t\t\t\t\t\ttableName: attributes.tableName,\n\t\t\t\t\t\t\t\texperienceName: attributes.experienceName,\n\t\t\t\t\t\t\t\texperienceId: attributes.experienceId,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tsessionStorage.setItem(\n\t\t\t\t\t\t\t\tANALYTICS_SET_APPLICATION_OPTIONS,\n\t\t\t\t\t\t\t\tJSON.stringify(options)\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tunsubscribe();\n\t\t\t\t\t\tunsubscribe = onEvent((event) => {\n\t\t\t\t\t\t\tif (event.type === 'usage') {\n\t\t\t\t\t\t\t\taddLegacyEvent(event, legacySdk);\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\treturn fn(name, version, attributes);\n\t\t\t};\n\t\tcase 'page':\n\t\t\treturn async (id, attributes = {}) => {\n\t\t\t\tawait resolveLegacySdk();\n\n\t\t\t\tconst isLegacy = getConfigValue('legacy');\n\n\t\t\t\tif (isLegacy) {\n\t\t\t\t\t// setPage(id, {description});\n\t\t\t\t\tif (attributes.arguments)\n\t\t\t\t\t\tlegacySdk.startPage(...attributes.arguments); // service portal\n\t\t\t\t\telse {\n\t\t\t\t\t\t// Already handled in addLegacyEvent for ux metrics,\n\t\t\t\t\t\t// Since the arguments were not as per the expected structure\n\t\t\t\t\t\t// Therefore UX metrics logic and mark object is used for setting the page.\n\t\t\t\t\t\tlegacySdk.startPage(attributes.name); // ux metrics\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn fn(id, attributes);\n\t\t\t};\n\t\tcase 'user':\n\t\t\treturn async (id, attributes = {}) => {\n\t\t\t\tawait resolveLegacySdk();\n\n\t\t\t\tconst isLegacy = getConfigValue('legacy');\n\n\t\t\t\tif (isLegacy) {\n\t\t\t\t\tconst operation = attributes.__operation__;\n\t\t\t\t\tdelete attributes.__operation__;\n\n\t\t\t\t\tswitch (operation) {\n\t\t\t\t\t\tcase 'setUserId':\n\t\t\t\t\t\t\t// setUser(id, {__operation__: 'setUserId'});\n\t\t\t\t\t\t\tlegacySdk.setUserId(...attributes.arguments);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'setUserProperty':\n\t\t\t\t\t\t\t// setUser(id, {__operation__: 'setUserProperty', someKey: someValue});\n\t\t\t\t\t\t\tlegacySdk.setUserProperty(...attributes.arguments);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'removeUserProperty':\n\t\t\t\t\t\t\t// setUser(id, {__operation__: 'removeUserProperty', someKey: undefined});\n\t\t\t\t\t\t\tlegacySdk.removeUserProperty(\n\t\t\t\t\t\t\t\t...attributes.arguments\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'setUserProperties':\n\t\t\t\t\t\t\t// setUser(id, {__operation__: 'removeUserProperty', someKey: someValue, anotherKey: anotherValue});\n\t\t\t\t\t\t\tlegacySdk.setUserProperties(\n\t\t\t\t\t\t\t\t...attributes.arguments\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'appendToUserProperty':\n\t\t\t\t\t\t\t// setUser(id, {__operation__: 'appendToUserProperty', someKey: someValue});\n\t\t\t\t\t\t\tlegacySdk.appendToUserProperty(\n\t\t\t\t\t\t\t\t...attributes.arguments\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'incUserProperty':\n\t\t\t\t\t\t\t// setUser(id, {__operation__: 'incUserProperty', args: arguments});\n\t\t\t\t\t\t\tlegacySdk.incUserProperty(...attributes.arguments);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'setTrackingConsent':\n\t\t\t\t\t\t\t// setUser(id, {__operation__: 'setTrackingConsent', args: arguments});\n\t\t\t\t\t\t\tlegacySdk.setTrackingConsent(\n\t\t\t\t\t\t\t\t...attributes.arguments\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn fn(id, attributes);\n\t\t\t};\n\n\t\tcase 'utility':\n\t\t\treturn async (id, attributes = {}) => {\n\t\t\t\tawait resolveLegacySdk();\n\t\t\t\tswitch (id) {\n\t\t\t\t\tcase 'setDebugLevel':\n\t\t\t\t\t\t// __TECTONIC__$servicenow_ui_analytics_integrator.setConfigValue('setDebugLevel', 'info');\n\t\t\t\t\t\tlegacySdk.setDebugLevel(attributes);\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'deleteCurrentUserData':\n\t\t\t\t\t\t// __TECTONIC__$servicenow_ui_analytics_integrator.setConfigValue('deleteCurrentUserData', '');\n\t\t\t\t\t\tlegacySdk.deleteCurrentUserData();\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'legacyConfig':\n\t\t\t\t\t\t// __TECTONIC__$servicenow_ui_analytics_integrator.setConfigValue('legacyConfig', {}});\n\t\t\t\t\t\tsetConfigValue(id, attributes);\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\t// Handle other cases if needed (for debugging/logging purposes)\n\t\t\t\t\t\tconsole.log('Unknown setConfigValue id: ' + id);\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\treturn fn(id, attributes);\n\t\t\t};\n\t}\n\n\t// Function to retrieve the Applications object from sessionStorage\n\tfunction getAppRegistrationMetadataFromSessionStorage() {\n\t\tconst storedData = sessionStorage.getItem('AppRegistrationMetadata');\n\t\treturn storedData ? JSON.parse(storedData) : {}; // Return parsed object or an empty object if not found\n\t}\n\n\t// Function to store the Applications object in sessionStorage\n\tfunction storeAppRegistrationMetadataInSessionStorage(applications) {\n\t\tsessionStorage.setItem(\n\t\t\t'AppRegistrationMetadata',\n\t\t\tJSON.stringify(applications)\n\t\t);\n\t}\n\n\tfunction prepareAndGetLegacyConfig(attributes) {\n\t\tlet uxMetricsConfig = JSON.parse(\n\t\t\tsessionStorage.getItem('legacyConfig')\n\t\t);\n\t\tif (uxMetricsConfig && Object.keys(uxMetricsConfig).length !== 0) {\n\t\t\tlet legacyConfig = {\n\t\t\t\tapiAuth: uxMetricsConfig.apiAuth,\n\t\t\t\tapiKey: uxMetricsConfig.apiKey,\n\t\t\t\tuxCollectionMode: uxMetricsConfig.uxCollectionMode\n\t\t\t\t\t? uxMetricsConfig.uxCollectionMode\n\t\t\t\t\t: 'Both',\n\t\t\t\tchannelType: uxMetricsConfig.channelType,\n\t\t\t\tsessionConfig: {\n\t\t\t\t\tserverEndpoint: uxMetricsConfig.endpointURL,\n\t\t\t\t\ttrackingConsent: uxMetricsConfig.trackingConsent,\n\t\t\t\t\tuserId: uxMetricsConfig.user.hashId,\n\t\t\t\t\tdomainId: uxMetricsConfig.user.domainId,\n\t\t\t\t\tdomainName: uxMetricsConfig.user.domainName,\n\t\t\t\t\troles: uxMetricsConfig.user.roles,\n\t\t\t\t},\n\t\t\t};\n\n\t\t\tlegacyConfig.sessionConfig.appContextId = attributes.experienceId;\n\t\t\tlegacyConfig.sessionConfig.appContextName =\n\t\t\t\tattributes.experienceName;\n\t\t\treturn legacyConfig;\n\t\t} else {\n\t\t\treturn {};\n\t\t}\n\t}\n\tfunction isWebChannelApplication(legacyConfig) {\n\t\treturn legacyConfig?.channelType === 'web';\n\t}\n}\n","import {\n\ttrace,\n\ttrack,\n\tcreateCounter,\n\tcreateGauge,\n\tcreateHistogram,\n\tsetUser as setUserNext,\n\tgetUser,\n\tsetPage as setPageNext,\n\tgetPage,\n\tsetConfigValue as setApiConfigValueNext,\n\tonEvent,\n\tcreateTraceParent,\n\tcreateTraceId,\n\tcreateTraceParentHeader,\n\tsetApplication as setApplicationNext,\n\tgetApplication,\n} from '@servicenow/ui-analytics-api';\n\nimport higherOrderSDKWrapper from './higherOrderSDKWrapper';\nimport { get as getConfigValue } from '../config';\nimport startExporter from '../startExporter';\n\nconst setUser = higherOrderSDKWrapper(setUserNext, 'user');\nconst setPage = higherOrderSDKWrapper(setPageNext, 'page');\nconst setApplication = higherOrderSDKWrapper(setApplicationNext, 'application');\nconst setApiConfigValue = higherOrderSDKWrapper(\n\tsetApiConfigValueNext,\n\t'utility'\n);\n\nexport {\n\ttrace,\n\ttrack,\n\tcreateCounter,\n\tcreateGauge,\n\tcreateHistogram,\n\tsetUser,\n\tgetUser,\n\tsetPage,\n\tgetPage,\n\tsetApiConfigValue as setConfigValue,\n\tgetConfigValue,\n\tonEvent,\n\tcreateTraceParent,\n\tcreateTraceId,\n\tstartExporter,\n\tcreateTraceParentHeader,\n\tsetApplication,\n\tgetApplication,\n};\n","import * as UsageProvider from './usage/usageProvider.js';\nimport * as LegacyAppseeProvider from './legacy/legacyAppseeProvider.js';\n\nexport function getProvider(type) {\n\tswitch (type.toLowerCase()) {\n\t\tcase 'usage':\n\t\t\treturn UsageProvider;\n\t\tcase 'legacy':\n\t\t\treturn LegacyAppseeProvider;\n\t\tdefault:\n\t\t\tthrow new Error(`Unknown provider type: ${type}`);\n\t}\n}\n\nexport default getProvider;\n","import { track } from '@servicenow/ui-analytics-api';\nimport { findBestMatchingElement } from '@servicenow/ui-analytics-fingerprint';\nimport { querySelectorAllDeep } from 'query-selector-shadow-dom';\n\nimport dataContext from './data-context';\n\n// this will later be configurable\nconst threshold = 0.8;\nconst MAX_EVENTS_PER_PAGE = 50;\n\nexport function startAutoCapture() {\n\tattachGlobalClickListeners(document);\n\tlet listenerAttached = false;\n\twindow.addEventListener('POLARIS_IFRAME_LOAD_COMPLETE', (event) => {\n\t\tif (querySelectorAllDeep && !listenerAttached) {\n\t\t\tconst iframe = querySelectorAllDeep('iframe#gsft_main');\n\t\t\tconst iframeDoc = iframe?.[0]?.contentDocument;\n\t\t\tif (iframeDoc) {\n\t\t\t\tattachGlobalClickListeners(iframeDoc, true);\n\t\t\t\tlistenerAttached = true;\n\t\t\t}\n\t\t}\n\t});\n}\n\nfunction getEventsForPage(currentPageId, allEvents) {\n\tif (!currentPageId || !allEvents || !Array.isArray(allEvents)) {\n\t\treturn [];\n\t}\n\n\t// Always filter from allEvents to avoid cross-application contamination\n\t// since the same page ID can exist across different applications\n\t// Limit to MAX_EVENTS_PER_PAGE elements for performance reasons\n\treturn allEvents.filter((item) => item.PageId === currentPageId).slice(0, MAX_EVENTS_PER_PAGE);\n}\n\nfunction attachGlobalClickListeners(root, useCapture = false) {\n\t// Use bubbling phase (false) instead of capturing phase (true)\n\t// Add passive option to indicate the handler won't prevent default behavior\n\troot.addEventListener('click', handleGlobalClick, {\n\t\tcapture: useCapture,\n\t\tpassive: true,\n\t});\n}\n\nfunction handleGlobalClick(event) {\n\t// Store event properties we need before they potentially change\n\tconst clientX = event.clientX;\n\tconst clientY = event.clientY;\n\tconst currentTarget = event.currentTarget;\n\n\trequestAnimationFrame(() => {\n\t\tconst path = getPath(clientX, clientY, currentTarget);\n\t\tif (path && path.length > 0) {\n\t\t\tconst el = path[path.length - 1];\n\t\t\tif (el) {\n\t\t\t\tsetTimeout(() => runMatching(el), 0);\n\t\t\t}\n\t\t}\n\t});\n}\n\nfunction getPath(x, y, doc) {\n\tif (!x || !y) return [];\n\tlet el = doc.elementFromPoint(x, y);\n\tconst path = [el];\n\tlet count = 0;\n\twhile (el.shadowRoot && count < 100) {\n\t\tel = el.shadowRoot.elementFromPoint(x, y);\n\t\tpath.push(el);\n\t\tcount++;\n\t}\n\n\treturn path;\n}\n\n/**\n * Handle click events and find the best matching instrumented element\n * Gets fresh event data from dataContext to ensure correct app/page context\n * @param {Element} element - The clicked DOM element\n */\nasync function runMatching(element) {\n\tconst el = element;\n\n\t// Get current page and fresh event data\n\tconst currentPageId = dataContext?.currentPage?.get();\n\tif (!currentPageId) {\n\t\tconsole.warn('No current page in dataContext, skipping click handling');\n\t\treturn;\n\t}\n\n\t// Get current app ID to ensure we have the right context\n\tconst currentAppId =\n\t\tdataContext.configuration.get('ApiKey')?.split(':').slice(-1)[0] ||\n\t\tnull;\n\tif (!currentAppId) {\n\t\tconsole.warn(\n\t\t\t'No current app ID in dataContext, skipping click handling'\n\t\t);\n\t\treturn;\n\t}\n\n\t// Get tagged events directly from dataContext and process them\n\tconst taggedEventsForApplication =\n\t\tdataContext.configuration.get('events') || [];\n\n\tconst taggedEvents = getEventsForPage(\n\t\tcurrentPageId,\n\t\ttaggedEventsForApplication\n\t);\n\n\t// Process tagged events into fingerprint format\n\tconst processedTaggedEvents = taggedEvents.map((item) => {\n\t\treturn {\n\t\t\t...item.Fingerprint,\n\t\t\tname: item.EventId,\n\t\t\tdisplayName: item.DisplayName,\n\t\t\tfingerPrintHash: item.FingerprintId,\n\t\t\tproperties: item.TaggedEventProperties,\n\t\t\tevent_type: item.Type,\n\t\t};\n\t});\n\tconst bestMatch = await findBestMatchingElement(el, processedTaggedEvents, {\n\t\tthreshold,\n\t\tmaxDepthUp: 3,\n\t\tmaxDepthDown: 3,\n\t\tmaxChildElements: 30, // Limit child element traversal\n\t\tenableTimeSlicing: true, // Enable time-slicing for non-blocking matching\n\t\ttimeSlice: 8, // Yield after ~8ms (half frame at 60fps)\n\t});\n\tif (bestMatch) {\n\t\t//element is to be queried again, with best matches selectorPath\n\t\tconst elem =\n\t\t\tbestMatch?.fingerprint?.selectorPath\n\t\t\t\t? querySelectorAllDeep(bestMatch.fingerprint.selectorPath)?.[0]\n\t\t\t\t: el;\n\t\tconst props = extractPropertyValues(bestMatch.fingerprint, elem);\n\t\tingestEvent(\n\t\t\tbestMatch.fingerprint.name,\n\t\t\tbestMatch.fingerprint,\n\t\t\tel,\n\t\t\tprops\n\t\t);\n\t\treturn;\n\t}\n}\n\nfunction extractPropertyValues(fingerprint, elem) {\n\tconst { properties } = fingerprint;\n\tlet props = {};\n\tif (properties) {\n\t\tconst propNames = properties?.split(',') || [];\n\t\tpropNames.forEach((item) => {\n\t\t\tconst value = elem.getAttribute(item);\n\t\t\tprops[item] = value;\n\t\t});\n\t}\n\treturn props;\n}\n\nfunction ingestEvent(name, fingerprint, el, props) {\n\tconst payload = {\n\t\tpage_url: window.location.pathname,\n\t\tSN_event_type: fingerprint.event_type,\n\t\tSN_SelectorPath: fingerprint.selectorPath,\n\t\tSN_FingerPrintHash: fingerprint.fingerPrintHash,\n\t\tevent_type: fingerprint.event_type,\n\t\t...props,\n\t};\n\n\ttrackWithArguments(name, payload);\n}\nfunction trackWithArguments(eventName, eventProps) {\n\tlet trackOptions = {\n\t\tname: eventName,\n\t\tattributes: {\n\t\t\t__type__: 'addEvent',\n\t\t\targuments: arguments,\n\t\t},\n\t};\n\ttrack(trackOptions.name, trackOptions);\n}\n","import { getProvider } from './providerFactory';\nimport SNAnalytics from './usage/sdk';\nimport { startAutoCapture } from './usage/sdk/auto-capture';\n\nexport { getProvider, SNAnalytics, startAutoCapture };\n\nexport default getProvider;\n","import { getProvider } from '@servicenow/ui-analytics-providers';\nimport {\n\tfingerprint,\n} from '@servicenow/ui-analytics-fingerprint';\nimport { startAutoCapture } from '@servicenow/ui-analytics-providers';\n\nimport { init as initExperimentation } from '@servicenow/ui-analytics-experimentation-sdk';\n\nlet integrator = {}; // Default empty object before initialization\n\nexport function init(type) {\n\tintegrator = getProvider(type);\n\twindow.nowAnalytics = { ...integrator, getProvider }; // Update global reference\n}\n\n//moving initialization to here, as we are only going to support usage as a provider\ninit('usage');\n\ninitExperimentation();\n// Start auto-capture once during initialization - will capture clicks on all elements via document event bubbling\nstartAutoCapture();\n\n// No-op function (empty function that does nothing)\nconst noop = () => {};\n\n// Export function references with default no-op implementation\nexport const tracer = (...args) => (integrator.tracer || noop)(...args);\nexport const trace = (...args) => (integrator.trace || noop)(...args);\nexport const track = (...args) => (integrator.track || noop)(...args);\nexport const createCounter = (...args) =>\n\t(integrator.createCounter || noop)(...args);\nexport const createGauge = (...args) =>\n\t(integrator.createGauge || noop)(...args);\nexport const createHistogram = (...args) =>\n\t(integrator.createHistogram || noop)(...args);\nexport const setUser = (...args) => (integrator.setUser || noop)(...args);\nexport const getUser = (...args) => (integrator.getUser || noop)(...args);\nexport const setPage = (...args) => (integrator.setPage || noop)(...args);\nexport const getPage = (...args) => (integrator.getPage || noop)(...args);\nexport const setConfigValue = (...args) =>\n\t(integrator.setConfigValue || noop)(...args);\nexport const getConfigValue = (...args) =>\n\t(integrator.getConfigValue || noop)(...args);\nexport const onEvent = (...args) => (integrator.onEvent || noop)(...args);\nexport const createTraceParent = (...args) =>\n\t(integrator.createTraceParent || noop)(...args);\nexport const createTraceId = (...args) =>\n\t(integrator.createTraceId || noop)(...args);\nexport const createTraceParentHeader = (...args) =>\n\t(integrator.createTraceParentHeader || noop)(...args);\nexport const startExporter = (...args) =>\n\t(integrator.startExporter || noop)(...args);\nexport const setApplication = (...args) =>\n\t(integrator.setApplication || noop)(...args);\nexport const getApplication = (...args) =>\n\t(integrator.getApplication || noop)(...args);\n\nexport { fingerprint };\n","export const USER_TOKEN = 'X-UserToken';\nexport const UCM_URL = '/api/ucm';\nexport const CONSENT_OPTIONS = {\n\tYES: 'full',\n\tNO: 'basic',\n};\n","import { USER_TOKEN, UCM_URL } from './constants';\n\nexport default async function get(url = UCM_URL) {\n\ttry {\n\t\tconst response = await fetch(url, {\n\t\t\tmethod: 'GET',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t[USER_TOKEN]: window.g_ck,\n\t\t\t},\n\t\t});\n\t\treturn await response.tojson();\n\t} catch (e) {\n\t\treturn e;\n\t}\n}\n","import { USER_TOKEN, UCM_URL } from './constants';\n\nexport default async function set(consent, url = UCM_URL) {\n\ttry {\n\t\tconst response = await fetch(url, {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t[USER_TOKEN]: window.g_ck,\n\t\t\t},\n\t\t\tbody: JSON.stringify({ consent }),\n\t\t});\n\t\treturn await response.tojson();\n\t} catch (e) {\n\t\treturn e;\n\t}\n}\n","import * as servicenowUiAnalyticsApi from '@servicenow/ui-analytics-api';\nif (!window.__TECTONIC__$servicenow_ui_analytics_api) window.__TECTONIC__$servicenow_ui_analytics_api = servicenowUiAnalyticsApi;\nexport {servicenowUiAnalyticsApi};\nimport * as servicenowUiAnalyticsConsumer from '@servicenow/ui-analytics-consumer';\nif (!window.__TECTONIC__$servicenow_ui_analytics_consumer) window.__TECTONIC__$servicenow_ui_analytics_consumer = servicenowUiAnalyticsConsumer;\nexport {servicenowUiAnalyticsConsumer};\nimport * as servicenowUiAnalyticsCore from '@servicenow/ui-analytics-core';\nif (!window.__TECTONIC__$servicenow_ui_analytics_core) window.__TECTONIC__$servicenow_ui_analytics_core = servicenowUiAnalyticsCore;\nexport {servicenowUiAnalyticsCore};\nimport * as servicenowUiAnalyticsExperimentationSdk from '@servicenow/ui-analytics-experimentation-sdk';\nif (!window.__TECTONIC__$servicenow_ui_analytics_experimentation_sdk) window.__TECTONIC__$servicenow_ui_analytics_experimentation_sdk = servicenowUiAnalyticsExperimentationSdk;\nexport {servicenowUiAnalyticsExperimentationSdk};\nimport * as servicenowUiAnalyticsFingerprint from '@servicenow/ui-analytics-fingerprint';\nif (!window.__TECTONIC__$servicenow_ui_analytics_fingerprint) window.__TECTONIC__$servicenow_ui_analytics_fingerprint = servicenowUiAnalyticsFingerprint;\nexport {servicenowUiAnalyticsFingerprint};\nimport * as servicenowUiAnalyticsIntegrator from '@servicenow/ui-analytics-integrator';\nif (!window.__TECTONIC__$servicenow_ui_analytics_integrator) window.__TECTONIC__$servicenow_ui_analytics_integrator = servicenowUiAnalyticsIntegrator;\nexport {servicenowUiAnalyticsIntegrator};\nimport * as servicenowUiAnalyticsProviders from '@servicenow/ui-analytics-providers';\nif (!window.__TECTONIC__$servicenow_ui_analytics_providers) window.__TECTONIC__$servicenow_ui_analytics_providers = servicenowUiAnalyticsProviders;\nexport {servicenowUiAnalyticsProviders};\nimport * as servicenowUiAnalyticsUcm from '@servicenow/ui-analytics-ucm';\nif (!window.__TECTONIC__$servicenow_ui_analytics_ucm) window.__TECTONIC__$servicenow_ui_analytics_ucm = servicenowUiAnalyticsUcm;\nexport {servicenowUiAnalyticsUcm};"],"version":3}},{"offset":{"line":39,"column":0},"map":{"mappings":"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","file":"externals/@devsnc/sn-ui-logger/index.min.js","names":["toPropertyKey","require","module","exports","obj","key","value","Object","defineProperty","enumerable","configurable","writable","__esModule","_extends","assign","bind","target","i","arguments","length","source","prototype","hasOwnProperty","call","apply","this","_typeof","t","r","e","Symbol","toPrimitive","TypeError","String","Number","o","iterator","constructor","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","__webpack_modules__","n","getter","d","a","definition","get","prop","ConsoleLogExporter","extractInfo","log","_log$context","_log$context2","time","Date","timestamp","attributes","traceId","context","spanId","meta","fromExporter","export","logs","forEach","_log$meta","fromInterceptor","console","level","loggerName","message","fastDeepCopy","map","getCurrentTime","performance","timeOrigin","now","LogQueue","options","_defineProperty","Set","logLevel","cleanUpTimeInterval","collectTimeInterval","exporter","_logLevel","_cleanUpTimeInterval","_collectTimeInterval","_exporter","_queue","startLogInterval","startCleanupInterval","_collectIntervalId","window","setInterval","notifySubscribers","catch","error","_cleanupIntervalId","clear","stopLogInterval","clearInterval","stopCleanupInterval","lock","_queueLocked","unlock","concat","_backedLogs","push","info","forceFlush","getLogs","subscribe","callback","subscribers","add","delete","logsToEmit","notify","Logger","name","loggerProvider","_emit","emit","_options$level","debug","warn","logContext","LoggerProvider","Map","_context","_logQueue","_createLogInterceptor","_isLoggingEnabled","getLogger","logger","loggers","set","enableLogging","disableLogging","isLoggingEnabled","logQueue","_createConsoleLogInterceptors","defaultLogger","originalConsole","keys","_originalConsole$key","_args$","_args$$meta","_len","rest","Array","_key","args","from","join","_createErrorEventListener","addEventListener","event","stack","errorMessage","NoOpLoggerProvider","printErrorMessage","_","LoggerSubscriber","_window$nowUiFramewor","_window$nowUiFramewor2","nowUiFramework","snUiLoggerProvider"],"sources":["webpack:///@babel/runtime/7.24.0/helpers/defineProperty.js","webpack:///@babel/runtime/7.24.0/helpers/extends.js","webpack:///@babel/runtime/7.24.0/helpers/toPrimitive.js","webpack:///@babel/runtime/7.24.0/helpers/toPropertyKey.js","webpack:///@babel/runtime/7.24.0/helpers/typeof.js","webpack:///webpack/bootstrap","webpack:///webpack/runtime/compat get default export","webpack:///webpack/runtime/define property getters","webpack:///webpack/runtime/hasOwnProperty shorthand","webpack:///@devsnc/sn-ui-logger/0.0.7/dist/exporter/consoleLogExporter.js","webpack:///@devsnc/sn-ui-logger/0.0.7/dist/utils/index.js","webpack:///@devsnc/sn-ui-logger/0.0.7/dist/logQueue.js","webpack:///@devsnc/sn-ui-logger/0.0.7/dist/logger.js","webpack:///@devsnc/sn-ui-logger/0.0.7/dist/loggerProvider/loggerProvider.js","webpack:///@devsnc/sn-ui-logger/0.0.7/dist/loggerProvider/noOpLoggerProvider.js","webpack:///@devsnc/sn-ui-logger/0.0.7/dist/subscriber.js"],"sourcesContent":["var toPropertyKey = require(\"./toPropertyKey.js\");\nfunction _defineProperty(obj, key, value) {\n  key = toPropertyKey(key);\n  if (key in obj) {\n    Object.defineProperty(obj, key, {\n      value: value,\n      enumerable: true,\n      configurable: true,\n      writable: true\n    });\n  } else {\n    obj[key] = value;\n  }\n  return obj;\n}\nmodule.exports = _defineProperty, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","function _extends() {\n  module.exports = _extends = Object.assign ? Object.assign.bind() : function (target) {\n    for (var i = 1; i < arguments.length; i++) {\n      var source = arguments[i];\n      for (var key in source) {\n        if (Object.prototype.hasOwnProperty.call(source, key)) {\n          target[key] = source[key];\n        }\n      }\n    }\n    return target;\n  }, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;\n  return _extends.apply(this, arguments);\n}\nmodule.exports = _extends, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var _typeof = require(\"./typeof.js\")[\"default\"];\nfunction toPrimitive(t, r) {\n  if (\"object\" != _typeof(t) || !t) return t;\n  var e = t[Symbol.toPrimitive];\n  if (void 0 !== e) {\n    var i = e.call(t, r || \"default\");\n    if (\"object\" != _typeof(i)) return i;\n    throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n  }\n  return (\"string\" === r ? String : Number)(t);\n}\nmodule.exports = toPrimitive, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var _typeof = require(\"./typeof.js\")[\"default\"];\nvar toPrimitive = require(\"./toPrimitive.js\");\nfunction toPropertyKey(t) {\n  var i = toPrimitive(t, \"string\");\n  return \"symbol\" == _typeof(i) ? i : String(i);\n}\nmodule.exports = toPropertyKey, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","function _typeof(o) {\n  \"@babel/helpers - typeof\";\n\n  return (module.exports = _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) {\n    return typeof o;\n  } : function (o) {\n    return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o;\n  }, module.exports.__esModule = true, module.exports[\"default\"] = module.exports), _typeof(o);\n}\nmodule.exports = _typeof, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","export default class ConsoleLogExporter {\n    constructor() { }\n    extractInfo(log) {\n        return {\n            time: new Date(log.timestamp),\n            timestamp: log.timestamp,\n            attributes: log.attributes,\n            traceId: log.context?.traceId,\n            spanId: log.context?.spanId,\n            meta: {\n                fromExporter: true,\n            },\n        };\n    }\n    export(logs) {\n        logs.forEach((log) => {\n            // Prevent double logging\n            if (log.meta?.fromInterceptor)\n                return;\n            console[log.level](`[${log.loggerName}]: ${log.message}`, this.extractInfo(log));\n        });\n    }\n}\n","/**\n * Logs has a specific schema. All of the values in a Log object are primitive,\n * except context and attributes, which are objects, where keys map to primitive types.\n * This will ensure no reference is carried over.\n * @param logs array of Log's\n * @returns deep copied array of Log's\n */\nexport const fastDeepCopy = (logs) => logs.map(log => ({\n    ...log,\n    attributes: log.attributes && { ...log.attributes },\n    context: log.context && { ...log.context },\n}));\nexport const getCurrentTime = () => performance.timeOrigin + performance.now();\n","import ConsoleLogExporter from \"./exporter/consoleLogExporter\";\nimport { fastDeepCopy } from './utils';\nexport default class LogQueue {\n    _queue;\n    _backedLogs = [];\n    _logLevel;\n    _cleanUpTimeInterval;\n    _collectTimeInterval;\n    _queueLocked = false;\n    _collectIntervalId;\n    _cleanupIntervalId;\n    _exporter;\n    subscribers = new Set();\n    constructor(options = {}) {\n        const { logLevel = 'debug', cleanUpTimeInterval = 60000, collectTimeInterval = 1000, exporter = new ConsoleLogExporter(), } = options;\n        this._logLevel = logLevel;\n        this._cleanUpTimeInterval = cleanUpTimeInterval;\n        this._collectTimeInterval = collectTimeInterval;\n        this._exporter = exporter;\n        this._queue = [];\n        this.startLogInterval();\n        this.startCleanupInterval();\n    }\n    /**\n     * Start the log collection interval.\n     * This will notify subscribers with the current log queue.\n     */\n    startLogInterval() {\n        try {\n            this._collectIntervalId = window.setInterval(() => {\n                this.notifySubscribers().catch(e => console.error('Something went wrong while notifying subscribers: ', e));\n            }, this._collectTimeInterval);\n        }\n        catch (e) {\n            console.error('Something went wrong while setting up log interval: ', e);\n        }\n    }\n    /**\n     * Start the log cleanup interval.\n     * This will clear the log queue if logs were not emitted within the time interval.\n     */\n    startCleanupInterval() {\n        try {\n            this._cleanupIntervalId = window.setInterval(() => this.clear(), this._cleanUpTimeInterval);\n        }\n        catch (e) {\n            console.error('Something went wrong while setting up log cleanup interval: ', e);\n        }\n    }\n    /**\n     * No more logs will be send to the subscribers.\n     */\n    stopLogInterval() {\n        window.clearInterval(this._collectIntervalId);\n    }\n    /**\n     * Stop clearing the log queue.\n     */\n    stopCleanupInterval() {\n        window.clearInterval(this._cleanupIntervalId);\n    }\n    lock() {\n        this._queueLocked = true;\n    }\n    unlock() {\n        this._queueLocked = false;\n        this._queue = this._queue.concat(fastDeepCopy(this._backedLogs));\n        this._backedLogs = [];\n    }\n    // TODO: should only push the log if it's level is higher than the current log level\n    /**\n     * Push to the log queue. If queue is locked, push to backed logs queue.\n     * @param log\n     * @returns void\n     */\n    push(log) {\n        if (this._queueLocked) {\n            this._backedLogs.push(log);\n            return;\n        }\n        this._queue.push(log);\n    }\n    /**\n     * Clear the log queue. If queue is locked, clears backed up logs queue.\n     * @returns true if queue was cleared, false if queue was locked and cleared backed logs\n     */\n    clear() {\n        if (this._queueLocked) {\n            console.info('Log queue is currently locked. Queueing cleanup.');\n            this._backedLogs = []; // TODO: is this worth it?\n            return false;\n        }\n        this._queue = [];\n        return true;\n    }\n    forceFlush() {\n        this._queue = [];\n    }\n    /**\n     * @returns deep copied array of Log's\n     */\n    getLogs() {\n        return fastDeepCopy(this._queue);\n    }\n    set logLevel(level) {\n        this._logLevel = level;\n    }\n    get logLevel() {\n        return this._logLevel;\n    }\n    /**\n     * Subscribe to log collection.\n     * @param callback function to call when logs are emitted\n     * @returns function that can be called to unsubscribe from log collection\n     */\n    subscribe(callback) {\n        this.subscribers.add(callback);\n        return () => this.subscribers.delete(callback);\n    }\n    async notifySubscribers() {\n        // don't allow any more logs to be pushed to main queue while we're emitting\n        this.lock();\n        const logsToEmit = fastDeepCopy(this._queue);\n        this.forceFlush();\n        this.unlock();\n        this.subscribers.forEach(notify => notify(logsToEmit));\n    }\n}\n","import { getCurrentTime } from \"./utils\";\nexport default class Logger {\n    name;\n    loggerProvider;\n    context = { traceId: '', spanId: '' };\n    constructor(name = 'SnUiLogger', loggerProvider) {\n        this.name = name;\n        this.loggerProvider = loggerProvider;\n    }\n    _emit(log) {\n        this.loggerProvider.push(log);\n    }\n    /**\n     * Emits a log message with custom level.\n     * @param message log message to print\n     * @param options options should contain `level` and `attributes` to\n     * \tshow with the log. `level` defaults to `info`\n     */\n    emit(message, options = { level: 'info' }) {\n        this._emit({\n            loggerName: this.name,\n            message,\n            timestamp: getCurrentTime(),\n            attributes: options.attributes,\n            level: options.level ?? 'info',\n            meta: options.meta,\n        });\n    }\n    /**\n     * Emits a log message with level `info`.\n     * @param message log message to print\n     * @param attributes attributes to show with the log\n     */\n    info(message, attributes = {}) {\n        this._emit({\n            loggerName: this.name,\n            message,\n            timestamp: getCurrentTime(),\n            attributes,\n            level: 'info',\n        });\n    }\n    /**\n     * Emits a log message with level `debug`.\n     * @param message log message to print\n     * @param attributes attributes to show with the log\n     */\n    debug(message, attributes = {}) {\n        this._emit({\n            loggerName: this.name,\n            message,\n            timestamp: getCurrentTime(),\n            attributes,\n            level: 'debug',\n        });\n    }\n    /**\n     * Emits a log message with level `warn`.\n     * @param message log message to print\n     * @param attributes attributes to show with the log\n     */\n    warn(message, attributes = {}) {\n        this._emit({\n            loggerName: this.name,\n            message,\n            timestamp: getCurrentTime(),\n            attributes,\n            level: 'warn',\n        });\n    }\n    /**\n     * Emits a log message with level `error`.\n     * @param message log message to print\n     * @param attributes attributes to show with the log\n     */\n    error(message, attributes = {}) {\n        this._emit({\n            loggerName: this.name,\n            message,\n            timestamp: getCurrentTime(),\n            attributes,\n            level: 'error',\n        });\n    }\n    set logContext(context) {\n        this.context = context;\n        this.loggerProvider.context = context;\n    }\n    get logContext() {\n        return this.context;\n    }\n}\n","/* eslint-disable no-fallthrough */\nimport ConsoleLogExporter from '../exporter/consoleLogExporter';\nimport LogQueue from '../logQueue';\nimport Logger from '../logger';\nexport default class LoggerProvider {\n    _logLevel;\n    _logQueue;\n    _context;\n    _exporter;\n    loggers = new Map();\n    _isLoggingEnabled = true;\n    constructor(options = {}) {\n        const { logLevel = 'warn', cleanUpTimeInterval = 60000, collectTimeInterval = 1000, context = { traceId: '', spanId: '' }, exporter = new ConsoleLogExporter(), } = options;\n        this._logLevel = logLevel === true ? 'debug' : logLevel;\n        this._context = context;\n        this._logQueue = new LogQueue({\n            cleanUpTimeInterval,\n            collectTimeInterval,\n            exporter,\n        });\n        this._exporter = exporter;\n        if (this._logLevel)\n            this._createLogInterceptor();\n    }\n    push(log) {\n        if (!this._isLoggingEnabled)\n            return;\n        log.context = this._context;\n        this._logQueue.push(log);\n        this._exporter.export([log]);\n    }\n    clear() {\n        this._logQueue.clear();\n    }\n    set logLevel(level) {\n        this._logLevel = level === true ? 'debug' : level;\n        if (level)\n            this._createLogInterceptor();\n    }\n    get logLevel() {\n        return this._logLevel;\n    }\n    getLogger(name = 'SnUiLogger') {\n        let logger = this.loggers.get(name);\n        if (!logger) {\n            logger = new Logger(name, this);\n            this.loggers.set(name, logger);\n        }\n        return logger;\n    }\n    set context(context) {\n        this._context = context;\n    }\n    get context() {\n        return this._context;\n    }\n    enableLogging() {\n        this._isLoggingEnabled = true;\n        this._logQueue.startLogInterval();\n        this._logQueue.startCleanupInterval();\n    }\n    disableLogging() {\n        this._isLoggingEnabled = false;\n        this._logQueue.stopLogInterval();\n        this._logQueue.stopCleanupInterval();\n    }\n    get isLoggingEnabled() {\n        return this._isLoggingEnabled;\n    }\n    get logQueue() {\n        return this._logQueue;\n    }\n    subscribe(callback) {\n        return this._logQueue.subscribe(callback);\n    }\n    _createConsoleLogInterceptors() {\n        const defaultLogger = this.getLogger();\n        const originalConsole = {};\n        switch (this._logLevel) {\n            case 'debug':\n                originalConsole.debug = console.debug;\n            case 'info':\n                originalConsole.info = console.info;\n            case 'warn':\n                originalConsole.warn = console.warn;\n            case 'error':\n                originalConsole.error = console.error;\n        }\n        const consoleKeys = Object.keys(originalConsole);\n        consoleKeys.forEach((key) => {\n            console[key] = function (...rest) {\n                const args = Array.from(rest);\n                originalConsole[key]?.apply(console, args);\n                if (args[1]?.meta?.fromExporter)\n                    return;\n                if (defaultLogger) {\n                    defaultLogger.emit(args.join(' '), {\n                        level: key,\n                        meta: {\n                            fromInterceptor: true,\n                        },\n                    });\n                }\n            };\n        });\n    }\n    _createErrorEventListener() {\n        const defaultLogger = this.getLogger();\n        window.addEventListener('error', (event) => {\n            if (defaultLogger) {\n                const { error } = event;\n                defaultLogger.error(`${error.stack}\\n`, {\n                    errorMessage: error.message,\n                });\n            }\n        });\n    }\n    _createLogInterceptor() {\n        this._createConsoleLogInterceptors();\n        this._createErrorEventListener();\n    }\n}\n","export default class NoOpLoggerProvider {\n    constructor() { }\n    printErrorMessage() {\n        console.error('LoggerProvider has not been initialized yet. Please ensure you are on a seismic compatible page, and you have logging enabled');\n    }\n    push() {\n        this.printErrorMessage();\n    }\n    clear() {\n        this.printErrorMessage();\n    }\n    set logLevel(_) {\n        this.printErrorMessage();\n    }\n    get logLevel() {\n        this.printErrorMessage();\n        return '';\n    }\n    getLogger() {\n        this.printErrorMessage();\n    }\n    set context(_) {\n        this.printErrorMessage();\n    }\n    get context() {\n        this.printErrorMessage();\n        return {};\n    }\n    enableLogging() {\n        this.printErrorMessage();\n    }\n    disableLogging() {\n        this.printErrorMessage();\n    }\n    subscribe() {\n        this.printErrorMessage();\n        return () => { };\n    }\n}\n","import { NoOpLoggerProvider } from './loggerProvider';\n/**\n * LoggerSubscriber is a class that enables subscribing to logs from the LoggerProvider.\n * This subscriber is used in Web environments only.\n *\n * @example\n * const subscriber = new LoggerSubscriber();\n * subscriber.subscribe((logs) => {\n * \tconsole.log(logs);\n * });\n */\nexport default class LoggerSubscriber {\n    loggerProvider;\n    constructor() {\n        this.loggerProvider = window.nowUiFramework?.snUiLoggerProvider ?? new NoOpLoggerProvider();\n    }\n    /**\n     * Receive logs from the LoggerProvider.\n     * @param callback A function that will be called when logs are emitted.\n     * @return A function that can be called to unsubscribe from the LoggerProvider.\n     */\n    subscribe(callback) {\n        return this.loggerProvider.subscribe(callback);\n    }\n}\n"],"version":3}}]}