{"version":3,"sources":["public/js/kalamar-0.43.1-en.js"],"names":["requirejs","require","define","undef","main","req","makeMap","handlers","defined","waiting","config","defining","hasOwn","Object","prototype","hasOwnProperty","aps","slice","jsSuffixRegExp","hasProp","obj","prop","call","normalize","name","baseName","nameParts","nameSegment","mapValue","foundMap","lastIndex","foundI","foundStarMap","starI","i","j","part","baseParts","split","map","starMap","length","nodeIdCompat","test","replace","charAt","concat","splice","join","makeRequire","relName","forceSync","args","arguments","push","apply","makeLoad","depName","value","callDep","Error","splitPrefix","prefix","index","indexOf","substring","makeRelParts","makeConfig","relParts","plugin","parts","relResourceName","f","n","pr","p","exports","e","module","id","uri","deps","callback","cjsModule","ret","usingExports","callbackType","load","undefined","alt","setTimeout","cfg","_defined","amd","jQuery","window","KorAP","Event","halt","this","stopPropagation","preventDefault","_quoteRE","RegExp","String","quote","_escapeRE","escapeRegex","_slug1RE","_slug2RE","_removeChildren","node","firstChild","removeChild","_codeFromEvent","keyCode","charCode","_dec2hex","dec","toString","substr","slugify","toLowerCase","upgradeTo","props","HTMLElement","toggleClass","c1","c2","cl","classList","contains","add","remove","addE","tag","appendChild","document","createElement","addT","text","createTextNode","API","Locale","loc","OR","AND","newStyleSheet","_sheet","sElem","head","sheet","log","type","msg","src","console","annotationHelper","-","ah","getDesc","foundryLayer","anno","includes","v","l1","l2","create","params","_init","content","_content","action","_action","lcField","_lcField","active","bool","element","noMore","_el","li","onclick","bind","highlight","_prefix","lowlight","children","childNodes","_highlight","marks","getElementsByTagName","parentNode","replaceChild","nodeValue","elem","prefixString","nodeType","textlc","prefixes","trim","testPos","pos","len","forEach","insertBefore","hl","third","thirdE","t","_onclick","textContent","m","menu","hide","_menu","_string","_update","innerHTML","isSet","string","clear","chop","param","reset","_length","limit","_limit","_active","movetoRel","relativePos","relativeOffset","_rulerHeight","_sliderHeight","off","offset","parseInt","_screens","_event","initOffset","screen","movetoAbs","absPos","absOffset","_offset","_slider","style","top","_step","reInit","s","display","_height","height","el","setAttribute","_ruler","addEventListener","_mouseclick","_mousedown","_initClientHeight","clientHeight","_mousemove","clientY","init","_mouseup","removeEventListener","mov","up","focus","ev","getClientRects","defaultItemClass","defaultPrefixClass","defaultLengthFieldClass","sliderClass","list","_notItemElements","_itemClass","_lengthField","outline","_keydown","_keypress","_mousewheel","_touch","_items","Array","readItems","dontHide","_list","removeItems","liveLength","_firstActive","position","append","item","data","_initList","_boundary","prefixList","maxPoints","it","points","destroy","delta","deltaY","next","prev","slider","_lastTouch","touches","to","viewDown","viewUp","pageUp","pageDown","liveItem","show","fromCharCode","nr","_showItems","itemClass","_unmark","newOffset","onHide","pref","lengthField","liElements","ignoredCount","shownItem","newItem","_append","lastChild","_prepend","shown","menuClass","_left","_below","_outside","openAt","left","below","outside","panel","panelVar","_panel","button","btn","_button","_repos","_onscroll","title","cb","that","b","_bind","blur","bounding","getBoundingClientRect","pageXOffset","right","bottom","width","clientWidth","treeMenuClass","classes","adopt","_omBelow","_omOutside","_omLeft","anchor","_anchor","_insert","span","addList","addToggle","state","check","setState","associate","roll","buttonGroupClass","_bool","_add","parent","ldType","operation","newAfter","wrapOnRoot","wrap","DEL","_and","_or","_delete","delOperand","update","clean","and","or","del","op","cls","_del","_parent","operatorsClass","__changed","_ldType","_ops","refTo","_operands","group","root","operators","toJson","@type","rewrites","incomplete","toQuery","jsonldClass","_validRewriteOpRE","json","fromJson","_src","_op","scope","attr","_scope","str","toUpperCase","rewriteClass","comments","rewriteText","rewrite","REGEX","REGEX_DESC","a","regexOp","regex","_regexOp","_regex","__regexOp","toggleRegex","val","_value","_input","store","r","re","_inField","rewriteListClass","stringValClass","EMPTY","refTitle","refE","_refE","ref","_changeRef","_rewrites","vc","dispatchEvent","CustomEvent","detail","_ref","_changed","strElem","replaceOperand","docGroupRefClass","errstr802","_obj","keyE","_keyE","_changeKey","key","k","matchopE","_matchopE","matchop","_changeMatchop","valueE","_valueE","_changeValue","replaceWith","_vcKeyMenu","typeOf","_validUnspecMatchRE","_validStringMatchRE","_validTextMatchRE","_validDateRE","_validDateMatchRE","errstr804","_key","released","doc","match","_type","_matchop","_vcMatchopMenu","mo","dp","_vcDatePicker","fromString","selected","input","docClass","newDoc","keyType","ellipsis","unspecClass","_validGroupOpRE","docGroupClass","operand","_duplicate","find","dupl","docGroup","operands","docGroupRef","getOperand","oldOp","newOp","reverse","opArray","brackets","filter","_name","release","prefixClass","_cb","found","statistic","_statistic","statDL","statSp","statDT","statDD","keys","Number","toLocaleString","WDAY","MONTH","d","_selected","select","year","month","day","_showYear","_showMonth","_showDay","set","_store","_click","dir","today","Date","getYear","getMonth","_monthHelper","_yearHelper","_dayHelper","_stringHelper","_updateYear","_updateMonth","_updateDay","getDate","incrYear","decrYear","incrMonth","decrMonth","_yElement","_selectYear","_mElement","_selectMonth","table","tr","_dBElement","_dayBody","showDate","date","click","setDate","getDay","tb","td","getFullYear","newBody","views","_classes","c","_actions","prepend","actions","_viewE","aElem","_viewElement","view","afterEmbed","delView","CLOSE","_shown","close","minimize","onClose","viewClass","statClass","buttonGroup","REFRESH","getvc","getStatistic","getCorpStat","statResponse","notif","_show","statTable","checkStatActive","newString","oldString","oldvcQuery","startsWith","disableStat","statt","getElementsByClassName","btg","reloadCorpStat","panelClass","corpStatVClass","SHOW_STAT","VERB_SHOWSTAT","addCorpStat","statView","unspecDocClass","dpClass","buttonGrClass","vcPanelClass","_validTextOnlyMatchRE","_overrideStyles","VC_allCorpora","VC_oneCollection","MINIMIZE","keyList","insertRule","l","unshift","_root","wasRewritten","builder","_builder","addVcInfPanel","isOpen","open","onOpen","onMinimize","getName","addRequired","vcClass","TOUR_Qexample","TOUR_vcQuery","TOUR_Relations","foundry","_foundry","layer","_layer","addTree","NEW_QUERY","esc","_getKeyValue","keyValue","_getAnnotation","target","orGroup","sort","innerText","matchTable","Node","_query","_matchTable","clickOnAnno","_queryFragment","toQueryBar","_ql","getElementById","_q","event","currentTarget","sib","annotation","tagName","previousSibling","toggleInToken","parentCell","nextSibling","from","keyvaluepair","_addToToken","term","token","arr","lastIndexOf","_removeFromToken","distance","ql","options","scrollTo","matchQueryCreator","_TermRE","snippet","html","_pos","_token","_mark","_markE","_cutted","_info","_parse","_matchCreator","toMark","scrollIntoView","inline","block","getToken","getValue","mark","newMark","hasAttribute","exec","getAttribute","$2","$1","$3","hasChildNodes","addCell","surface","tbody","cell","_AvailableRE","matchTableClass","infoLayerClass","_match","matchtable","getData","tokens","getTokens","getMatchInfo","spans","matchResponse","_table","_doc","NEW_CONSTRAINT","isEmpty","_frag","documents","vcFragmentClass","meta","_vc","_meta","Conf","clickOnMeta","_fragment","toVcBuilder","previousElementSibling","uriRE","mapRE","url","decodeURIComponent","payload","start","base64","isLink","contentType","atob","cbmClass","attClass","METADATA","fields","_fields","metaDL","posInMetaArray","metaL","dt","metaDescr","metaDD","att","field","md","_corpusByMatch","matchMetaClass","metaTable","getTextInfo","textResponse","global","self","dagre","o","u","code","1","graphlib","layout","debug","util","time","notime","version","./lib/debug","./lib/graphlib","./lib/layout","./lib/util","./lib/version","2","_","greedyFAS","run","g","fas","graph","acyclicer","edge","weight","weightFn","stack","visited","dfs","has","each","outEdges","w","nodes","dfsFAS","label","removeEdge","forwardName","reversed","setEdge","uniqueId","undo","edges","./greedy-fas","./lodash","3","addBorderNode","sg","sgNode","rank","curr","addDummyNode","setParent","borderLeft","borderRight","minRank","maxRank","./util","4","swapWidthHeight","swapWidthHeightOne","attrs","reverseYOne","y","swapXYOne","x","adjust","rankDir","rankdir","reverseY","swapXY","5","List","sentinel","_next","_prev","_sentinel","unlink","entry","filterOutLinks","dequeue","enqueue","strs","JSON","stringify","6","Graph","debugOrdering","layerMatrix","buildLayerMatrix","h","compound","multigraph","setGraph","setNode","layerV","reduce","./graphlib","7","8","nodeCount","fasGraph","maxIn","maxOut","in","out","prevWeight","edgeWeight","Math","max","buckets","range","zeroIdx","assignBucket","buildState","DEFAULT_WEIGHT_FN","results","sources","sinks","removeNode","doGreedyFAS","flatten","constant","collectPredecessors","inEdges","uEntry","wEntry","./data/list","9","acyclic","normalizeRanks","parentDummyChains","removeEmptyRanks","nestingGraph","addBorderSegments","coordinateSystem","order","opts","debugTiming","layoutGraph","inputGraph","canonicalize","merge","graphDefaults","selectNumberAttrs","graphNumAttrs","pick","graphAttrs","defaults","nodeNumAttrs","nodeDefaults","edgeDefaults","edgeNumAttrs","edgeAttrs","buildLayoutGraph","ranksep","minlen","labelpos","labeloffset","makeSpaceForEdgeLabels","selfEdges","removeSelfEdges","asNonCompoundGraph","injectEdgeLabelProxies","cleanup","borderTop","borderBottom","assignRankMinMax","dummy","labelRank","removeEdgeLabelProxies","layers","orderShift","selfEdge","insertSelfEdges","selfNode","dx","dy","positionSelfEdges","last","abs","removeBorderNodes","fixupEdgeLabelCoords","minX","POSITIVE_INFINITY","maxX","minY","maxY","graphLabel","marginX","marginx","marginY","marginy","getExtremes","min","translateGraph","p1","p2","nodeV","nodeW","intersectRect","assignNodeIntersects","reversePointsForReversedEdges","runLayout","inputLabel","layoutLabel","updateInputGraph","edgesep","nodesep","mapValues","newAttrs","./acyclic","./add-border-segments","./coordinate-system","./nesting-graph","./normalize","./order","./parent-dummy-chains","./position","./rank","10","lodash","11","depths","depth","child","treeDepths","nodeSep","nestingRoot","acc","sumWeights","childNode","childTop","childBottom","thisWeight","nestingEdge","nodeRankFactor","12","dummyChains","vRank","wRank","edgeLabel","edgeObj","normalizeEdge","origLabel","successors","13","cg","vs","rootPrev","prevChild","../lodash","14","movable","inV","result","nodeU","sum","barycenter","15","relationship","hasNode","createRootNode","setDefaultNodeLabel","isUndefined","../graphlib","16","twoLayerCrossCount","northLayer","southLayer","southPos","zipObject","southEntries","chain","sortBy","firstIndex","treeSize","tree","cc","weightSum","layering","17","initOrder","crossCount","sortSubgraph","buildLayerGraph","addSubgraphConstraints","buildLayerGraphs","ranks","sweepLayerGraphs","layerGraphs","biasRight","lg","sorted","assignOrder","downLayerGraphs","upLayerGraphs","best","bestCC","lastBest","cloneDeep","../util","./add-subgraph-constraints","./build-layer-graph","./cross-count","./init-order","./sort-subgraph","18","simpleNodes","orderedVs","19","entries","mappedEntries","tmp","indegree","entryV","entryW","sourceSet","handleIn","vEntry","merged","source","mergeEntries","handleOut","pop","doResolveConflicts","20","resolveConflicts","bl","br","subgraphs","barycenters","subgraphResult","other","expandSubgraphs","predecessors","blPred","brPred","./barycenter","./resolve-conflicts","./sort","21","consumeUnsortable","unsortable","partition","sortable","lhs","rhs","vsIndex","bias","22","postorderNums","lim","low","postorder","pathData","lca","vPath","wPath","path","findPath","pathIdx","pathV","ascending","23","findType1Conflicts","conflicts","prevLayer","k0","scanPos","prevLayerLength","lastNode","findOtherInnerSegmentNode","k1","scanNode","uLabel","uPos","addConflict","findType2Conflicts","scan","south","southEnd","prevNorthBorder","nextNorthBorder","uNode","north","nextNorthPos","prevNorthPos","southLookahead","conflictsV","hasConflict","verticalAlignment","neighborFn","align","prevIdx","ws","mp","floor","il","ceil","horizontalCompaction","reverseSep","xs","blockG","blockGraph","sepFn","edgeSep","vLabel","wLabel","sep","vRoot","uRoot","prevMax","buildBlockGraph","pass1","pass2","findSmallestWidthAlignment","xss","alignCoordinates","alignTo","alignToMin","alignToMax","vert","horiz","alignment","balance","ul","ignore","pluck","positionX","adjustedLayering","values","inner","smallestWidth","24","rankSep","prevY","maxHeight","positionY","./bk","25","slack","tightTree","nodeEdges","edgeV","findMinSlackEdge","shiftRanks","directed","size","26","longestPath","feasibleTree","networkSimplex","ranker","networkSimplexRanker","tightTreeRanker","longestPathRanker","./feasible-tree","./network-simplex","27","initRank","preorder","alg","simplify","initLowLimValues","initCutValues","leaveEdge","exchangeEdges","enterEdge","cutvalue","calcCutValue","assignCutValue","childIsTail","graphEdge","cutValue","isOutEdge","pointsToHead","otherWeight","hasEdge","otherCutValue","dfsAssignLowLim","nextLim","neighbors","tailLabel","flip","candidates","isDescendant","flipped","updateRanks","rootLabel","28","29","simplified","simpleLabel","isMultigraph","successorWeights","weightMap","sucs","predecessorWeights","preds","rect","point","sx","sy","collection","fn","now","30","31","lib","./lib","./lib/alg","./lib/json","32","cmpt","cmpts","33","isArray","doDfs","34","dijkstra","weightFunc","edgeFunc","transform","./dijkstra","35","PriorityQueue","edgeFn","pq","updateNeighbors","predecessor","decrease","removeMin","runDijkstra","DEFAULT_WEIGHT_FUNC","../data/priority-queue","36","tarjan","./tarjan","37","rowK","rowI","ik","kj","ij","altDistance","runFloydWarshall","38","components","dijkstraAll","findCycles","floydWarshall","isAcyclic","prim","topsort","./components","./dijkstra-all","./find-cycles","./floyd-warshall","./is-acyclic","./postorder","./preorder","./prim","./topsort","39","CycleException","40","./dfs","41","42","parents","pri","priority","../graph","43","onStack","lowlink","44","visit","45","_arr","_keyIndices","keyIndices","_decrease","_swap","_heapify","largest","origArrI","origArrJ","46","_isDirected","_isMultigraph","_isCompound","_label","_defaultNodeLabelFn","_defaultEdgeLabelFn","_nodes","_children","_in","_preds","_out","_sucs","_edgeObjs","_edgeLabels","incrementOrInitEntry","decrementOrRemoveEntry","edgeArgsToId","isDirected","edgeArgsToObj","edgeObjToId","_nodeCount","_edgeCount","isCompound","newDefault","isFunction","setNodes","_removeFromParentsChildList","ancestor","predsV","sucsV","union","setDefaultEdgeLabel","edgeCount","setPath","valueSpecified","isPlainObject","freeze","outV","47","./graph","./version","48","writeNodes","writeEdges","edgeValue","write","clone","read","49","/Users/cpettitt/projects/dagre/lib/lodash.js","50","51","arrayPool","objectPool","idCounter","keyPrefix","reEmptyStringLeading","reEmptyStringMiddle","reEmptyStringTrailing","reEsTemplate","reFlags","reFuncName","reInterpolate","reLeadingSpacesAndZeros","reNoMatch","reThis","reUnescapedString","contextProps","templateCounter","argsClass","arrayClass","boolClass","dateClass","objectClass","stringClass","cloneableClasses","[object Function]","debounceOptions","leading","maxWait","trailing","descriptor","configurable","enumerable","writable","objectTypes","boolean","function","object","number","stringEscapes","\\","'","\n","\r","\t"," "," ","freeExports","freeModule","moduleExports","freeGlobal","baseIndexOf","array","fromIndex","cacheIndexOf","cache","cachePush","typeCache","charAtCallback","charCodeAt","compareAscending","ac","criteria","bc","createCache","first","mid","getObject","escapeStringChar","getArray","false","null","true","releaseArray","releaseObject","end","runInContext","context","Boolean","Function","TypeError","arrayRef","objectProto","oldDash","reNative","clearTimeout","fnToString","getPrototypeOf","isNative","defineProperty","func","nativeCreate","nativeIsArray","nativeIsFinite","isFinite","nativeIsNaN","isNaN","nativeKeys","nativeMax","nativeMin","nativeParseInt","nativeRandom","random","ctorByClass","lodashWrapper","chainAll","__chain__","__wrapped__","support","baseBind","bindData","partialArgs","thisArg","bound","thisBinding","baseCreate","isObject","setBindData","baseClone","isDeep","stackA","stackB","className","ctor","isArr","initedStack","assign","forOwn","objValue","properties","baseCreateCallback","argCount","identity","__bindData__","funcNames","funcDecomp","accumulator","baseCreateWrapper","bitmask","partialRightArgs","arity","isBind","isBindKey","isCurry","isCurryBound","baseDifference","getIndexOf","isLarge","baseFlatten","isShallow","isStrict","isArguments","valIndex","valLength","resIndex","baseIsEqual","isWhere","otherClass","aWrapped","bWrapped","ctorA","constructor","ctorB","forIn","baseMerge","stackLength","baseRandom","baseUniq","isSorted","seen","computed","createAggregator","setter","createCallback","createWrapper","isPartial","isPartialRight","escapeHtmlChar","htmlEscapes","WinRTError","templateSettings","escape","evaluate","interpolate","variable","imports","noop","shimIsPlainObject","unescapeHtmlChar","htmlUnescapes","iterable","&","<",">","\"","invert","reEscapedHtml","reUnescapedHtml","guard","argsIndex","argsLength","ownIndex","ownProps","forOwnRight","functions","isNumber","valueOf","objProto","isString","countBy","every","forEachRight","groupBy","indexBy","Infinity","current","noaccum","reduceRight","shuffle","rand","some","where","sortedIndex","rest","high","uniq","zip","debounce","wait","maxTimeoutId","stamp","timeoutId","trailingCall","lastCalled","delayed","remaining","isCalled","maxDelayed","leadingCall","mixin","methodNames","isFunc","methodName","getTime","whitespace","radix","property","wrapperValueOf","after","at","bindAll","funcs","bindKey","compact","compose","curry","defer","delay","difference","forInRight","pairs","initial","intersection","caches","trustIndexOf","outer","invoke","memoize","resolver","memoized","omit","once","ran","partial","partialRight","pull","step","reject","tap","interceptor","throttle","times","toArray","proto","without","wrapper","xor","collect","drop","eachRight","extend","methods","tail","unique","unzip","findIndex","findKey","findLast","findLastIndex","findLastKey","isBoolean","isDate","isElement","isEqual","parseFloat","isNull","isRegExp","noConflict","floating","noMin","noMax","template","settings","isEvaluating","importsKeys","importsValues","reDelimiters","escapeValue","interpolateValue","esTemplateValue","evaluateValue","hasVariable","sourceURL","unescape","all","any","detect","findWhere","foldl","foldr","include","inject","sample","take","callbackable","VERSION","_graph","_addNode","class","_c","createElementNS","_addEdge","_clean","center","treeDiv","cWidth","getComputedStyle","treeWidth","scrollLeft","toBase64","svgWrapper","outerHTML","svg","btoa","encodeURIComponent","canvas","setAttributeNS","x1","y1","x2","y2","_line","tspan","LINEHEIGHT","downloadLink","_tokens","_arcs","_tokenElements","_y","_currentInFocus","maxArc","overlapDiff","arcDiff","anchorDiff","anchorStart","tokenSep","xPadding","yPadding","temp","targetMap","targetID","relation","srcStart","srcEnd","direction","addRel","xmlid","newtarget","addToken","_rect","navigator","userAgent","createRange","selectNode","detach","_tokenPoint","box","_drawAnchor","firstBox","lastBox","overlaps","_arcsElement","pathStr","offsetLeft","_drawArc","arc","startPos","endPos","startY","endY","startAnchor","endAnchor","middle","cHeight","controlY","arcE","middleY","_labelsElement","arcRef","inFocus","labelE","textNode","labelBox","getBBox","textWidth","textHeight","labelR","boxWidth","marker","arrow","rel","cif","_sortArcs","anchors","sortedArcs","anchorSig","_sortedArcs","lengthSort","_sortedAnchors","scrollValue","textAnchor","node_i","arcs","labels","inclusive","matchTreeHierarchyClass","matchTreeArcClass","DOWNLOAD","matchtree","h6","_tree","treeObj","body","treeItemClass","tableView","metaView","relationsView","buttonGroupMenuClass","SHOWANNO","SHOW_META","ADDTREE","addMeta","addTable","TreeMenu","tm","_treeMenuList","Plugin","matchButtons","_metaView","_tableView","_menuList","treeLayers","getSpans","getRels","menuList","matchPanelClass","_matchTerms","_initialized","textSigle","matchID","available","_avail","rels","refLine","querySelector","toggle","_container","_mirror","reposition","mirror","container","mirrorValue","_split","_rightPos","insert","splittedText","selectionStart","selectionEnd","moveto","charpos","inputClientRect","inputStyle","bodyClientRect","mirrorStyle","getPropertyValue","paddingLeft","marginLeft","borderLeftWidth","borderLeftStyle","fontSize","fontFamily","newText","defaultTextValue","isSelectable","letter","further","defaultContainerItemClass","listOfContainerItems","_containerItemClass","_cItemPrefix","items","addItem","_prefixPosition","cItem","addMenu","addPrefix","prefItem","removeItem","removeItemByIndex","exit","makeActive","enter","ll","defaultMenuClass","defaultContainerClass","containerList","cLLength","_desc","hint","inputField","desc","lengthFieldClass","containerMenuClass","_context","_hint","_inputField","_alert","_unshowAlert","inputClass","analyzerClass","alertClass","_menuCollection","qfield","inputFieldElement","_analyzer","alert","charPos","contextMenu","ifContext","noC","_unshow","getContext","unshow","_hash","get","cookie","pair","parse","sessionClass","session","_session","removeAttribute","div","_iframe","_cutoff","useQuery","q","qc","_cuttoff","checked","QLmenu","selectValue","setPage","initQueries","qs","querySelectorAll","initDocLinks","getPage","page","frames","location","pathname","search","nodeName","isTop","testDiv","scrollIntervalId","isBrowser","isPageLoaded","readyCalls","callReady","callbacks","runCallbacks","pageLoaded","clearInterval","attachEvent","frameElement","doScroll","external","setInterval","readyState","domReady","onLoad","isBuild","Alertify","$","btnCancel","btnOK","btnReset","btnResetBack","btnFocus","elCallee","elCover","elDialog","elLog","getTransitionEvent","_alertify","dialogs","isopen","queue","buttons","holder","submit","ok","cancel","message","supported","transitions","WebkitTransition","MozTransition","OTransition","transition","cssClass","dialog","confirm","buttonReverse","buttonFocus","addListeners","common","hasOK","hasCancel","hasInput","unbind","setFocus","handleErrors","onerror","line","error","appendButtons","secondary","primary","build","css","hideElement","transitionDone","timer","placeholder","activeElement","scrollTop","setup","notify","fromQueue","detachEvent","prompt","success","alertify","_index","showTitle","selectMenuItemClass","opt","_select","_title","showSelected","selectedIndex","vParam","qlf","hljs","attributes","cI","compiled","bK","lR","bR","eW","eR","tE","iR","starts","endsParent","E","classPrefix","L","sL","M","B","subLanguageMode","language","cN","rB","eB","rE","eE","N","R","C","I","S","languages","second_best","tabReplace","useBR","called","highlightAuto","fixMarkup","highlightBlock","configure","initHighlighting","initHighlightingOnLoad","registerLanguage","aliases","listLanguages","getLanguage","inherit","IR","UIR","NR","CNR","BNR","RSR","BE","ASM","QSM","PWM","CLCM","CBCM","HCM","NM","CNM","BNM","CSSNM","RM","TM","UTM","literal","kq","kqInner","koralQuery","kqViewClass","TOGGLE_ALIGN","SHOW_KQ","aRoll","opened","_opened","clearButtonGroup","addKqAction","kqButton","_kq","addAlignAction","olCl","nn","ds","dataset","total","count","pageInfoClass","RANDOM_PAGE","pagEl","bg","lastElementChild","_bg","addRandomPage","pi","sp","URLSearchParams","factory","globalThis","introJs","_typeof","Symbol","iterator","forEachFnc","completeFnc","DOMEvent","events_key","_id","listener","on","useCapture","handler","commonjsGlobal","createCommonjsModule","version$1","global_1","fails","descriptors","$propertyIsEnumerable","propertyIsEnumerable","getOwnPropertyDescriptor$1","getOwnPropertyDescriptor","objectPropertyIsEnumerable","V","createPropertyDescriptor","bitmap","classofRaw","indexedObject","requireObjectCoercible","toIndexedObject","aFunction$1","getBuiltIn","namespace","method","engineUserAgent","process","Deno","versions","v8","engineV8Version","nativeSymbol","getOwnPropertySymbols","symbol","sham","useSymbolAsUid","isSymbol","$Symbol","setGlobal","sharedStore","shared","mode","copyright","toObject","argument","has$1","postfix","uid","WellKnownSymbolsStore","Symbol$1","createWellKnownSymbol","withoutSetter","wellKnownSymbol","TO_PRIMITIVE","toPrimitive","exoticToPrim","ordinaryToPrimitive","toPropertyKey","document$1","EXISTS","documentCreateElement","ie8DomDefine","$getOwnPropertyDescriptor","objectGetOwnPropertyDescriptor","O","P","anObject","$defineProperty","objectDefineProperty","Attributes","createNonEnumerableProperty","functionToString","inspectSource","WeakMap$1","WeakMap","nativeWeakMap","sharedKey","hiddenKeys$1","wmget","wmhas","wmset","metadata","facade","STATE","activeXDocument","internalState","enforce","getterFor","TYPE","redefine","getInternalState","enforceInternalState","TEMPLATE","unsafe","simple","noTargetGet","floor$2","toInteger","min$4","toLength","max$3","min$3","toAbsoluteIndex","integer","createMethod$2","IS_INCLUDES","$this","arrayIncludes","objectKeysInternal","names","enumBugKeys","hiddenKeys","objectGetOwnPropertyNames","getOwnPropertyNames","objectGetOwnPropertySymbols","ownKeys","copyConstructorProperties","replacement","isForced","feature","detection","POLYFILL","NATIVE","isForced_1","_export","targetProperty","sourceProperty","TARGET","GLOBAL","STATIC","stat","forced","toString_1","regexpFlags","ignoreCase","multiline","dotAll","unicode","sticky","RE","regexpStickyHelpers","UNSUPPORTED_Y","BROKEN_CARET","objectKeys","objectDefineProperties","defineProperties","Properties","IE_PROTO","EmptyConstructor","scriptTag","LT","NullProtoObjectViaActiveX","parentWindow","NullProtoObject","ActiveXObject","domain","iframeDocument","iframe","contentWindow","F","NullProtoObjectViaIFrame","re1","re2","objectCreate","regexpUnsupportedDotAll","flags","regexpUnsupportedNcg","groups","nativeExec","nativeReplace","patchedExec","UPDATES_LAST_INDEX_WRONG","UNSUPPORTED_Y$1","NPCG_INCLUDED","reCopy","raw","charsAdded","strCopy","regexpExec","SPECIES$4","RegExpPrototype$1","fixRegexpWellKnownSymbolLogic","KEY","FORCED","SHAM","SYMBOL","DELEGATES_TO_SYMBOL","DELEGATES_TO_EXEC","execCalled","nativeRegExpMethod","nativeMethod","regexp","arg2","forceStringMethod","$exec","done","createMethod$1","CONVERT_TO_STRING","second","codeAt","advanceStringIndex","regexpExecAbstract","MATCH","nativeMatch","maybeCallNative","matcher","rx","res","fullUnicode","A","matchStr","arg","createProperty","propertyKey","SPECIES$3","arraySpeciesCreate","originalArray","SPECIES$2","arrayMethodHasSpeciesSupport","METHOD_NAME","foo","IS_CONCAT_SPREADABLE","IS_CONCAT_SPREADABLE_SUPPORT","SPECIES_SUPPORT","isConcatSpreadable","spreadable","test$1","toStringTagSupport","TO_STRING_TAG","CORRECT_ARGUMENTS","classof","tryGet","callee","objectToString","RegExpPrototype","nativeToString","NOT_GENERIC","INCORRECT_NAME","rf","MATCH$1","isRegexp","aFunction","SPECIES$1","arrayPush","min$2","addClass","SVGElement","pre","getPropValue","propName","propValue","currentStyle","defaultView","scrollParentToElement","targetElement","_options","scrollToElement","excludeStaticParent","overflowRegex","parentElement","overflow","overflowY","overflowX","getScrollParent","offsetTop","getWinSize","innerWidth","innerHeight","D","documentElement","tooltipLayer","elementInViewport","winHeight","scrollBy","scrollPadding","setAnchorAsButton","tabIndex","SPLIT","nativeSplit","internalSplit","separator","lastLength","output","lastLastIndex","separatorCopy","splitter","defaultConstructor","speciesConstructor","unicodeMatching","z","originalExec","$assign","objectAssign","chr","T","argumentsLength","isFixed","getOffset","relativeEl","docEl","pageYOffset","xr","relativeElPosition","floor$1","SUBSTITUTION_SYMBOLS","SUBSTITUTION_SYMBOLS_NO_NAMED","getSubstitution","matched","captures","namedCaptures","tailPos","symbols","ch","capture","REPLACE","max$2","min$1","REPLACE_KEEPS_$0","REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE","removeClass","classNameRegex","setStyle","cssText","rule","setHelperLayerPosition","helperLayer","_introItems","_currentStep","currentElement","elementPosition","_targetElement","widthHeightPadding","helperElementPadding","UNSAFE_SUBSTITUTE","searchValue","replaceValue","replacer","functionalReplace","accumulatedResult","nextSourcePosition","replacerArgs","UNSCOPABLES","ArrayPrototype","$includes","HAS_SPECIES_SUPPORT$2","SPECIES","nativeSlice","max$1","Constructor","fin","notARegexp","error1","error2","correctIsRegexpLogic","searchString","arrayMethodIsStrict","nativeJoin","ES3_STRINGS","STRICT_METHOD$1","createMethod","IS_MAP","IS_FILTER","IS_SOME","IS_EVERY","IS_FIND_INDEX","IS_FILTER_REJECT","NO_HOLES","callbackfn","specificCreate","boundFunction","functionBindContext","$filter","filterReject","checkRight","targetOffset","tooltipLayerStyleLeft","tooltipOffset","windowSize","checkLeft","tooltipLayerStyleRight","HAS_SPECIES_SUPPORT","removeEntry","stringArray","stringToRemove","_determineAutoPosition","desiredTooltipPosition","possiblePositions","positionPrecedence","tooltipHeight","tooltipWidth","targetElementRect","calculatedPosition","hyphenIndex","desiredAlignment","halfTooltipWidth","winWidth","possibleAlignments","_determineAutoAlignment","placeTooltip","arrowLayer","hintMode","currentStepObj","currentTooltipPosition","tooltipCssClass","marginTop","tooltipClass","autoPosition","tooltipLayerStyleLeftRight","showStepNumbers","removeShowElement","elm","_createElement","tagname","setAttRegex","animate","existingOpacity","opacity","_getProgress","_disableInteraction","disableInteractionLayer","_createBullets","bulletsLayer","showBullets","ulContainer","anchorClick","goToStep","innerLi","anchorLink","_recreateBullets","oldReferenceLayer","existing","_updateBullets","_createProgressBar","progressLayer","showProgress","progressBar","progressBarAdditionalClass","_updateProgressBar","_showElement","_this","_introChangeCallback","nextTooltipButton","prevTooltipButton","skipTooltipButton","oldHelperLayer","highlightClass","oldHelperNumberLayer","oldtooltipLayer","oldTooltipTitleLayer","oldArrowLayer","oldtooltipContainer","_lastShowElementTimer","intro","referenceLayer","tooltipTextLayer","tooltipHeaderLayer","tooltipTitleLayer","buttonsLayer","box-shadow","overlayOpacity","showButtons","helperNumberLayer","nextStep","_introCompleteCallback","exitIntro","nextLabel","previousStep","prevLabel","skipLabel","_introSkipCallback","disableInteraction","buttonClass","hidePrev","hideNext","nextToDone","doneLabel","currentElementPosition","setShowElement","_introAfterChangeCallback","goToStepNumber","_currentStepNumber","_direction","continueStep","_introBeforeChangeCallback","currentStep","onKeyDown","which","exitOnEsc","srcElement","returnValue","cloneObject","hintQuerySelectorAll","selector","hintsWrapper","hideHint","stepId","removeHintTooltip","_hintCloseCallback","hideHints","showHints","_this2","hints","showHint","populateHints","removeHints","_this3","removeHint","addHints","_this4","evt","cancelBubble","showHintDialog","getHintClick","hintAnimation","hintDot","hintPulse","alignHintPosition","hintPosition","_hintsAddedCallback","hintElement","_hintClickCallback","removedStep","tooltipWrapper","closeButton","hintButtonLabel","tooltip","targetElm","_this5","currentItem","tooltipPosition","reAlignHints","_this6","_ref2","deleteCount","insertCount","actualDeleteCount","actualStart","mergeSort","comparefn","insertionSort","llength","rlength","lindex","rindex","arraySort","firefox","engineFfVersion","engineIsIeOrEdge","webkit","engineWebkitVersion","nativeSort","FAILS_ON_UNDEFINED","FAILS_ON_NULL","STRICT_METHOD","STABLE_SORT","fetchIntroSteps","allIntroSteps","introItems","steps","floatingElementQuery","tempIntroItems","refresh","refreshSteps","onResize","force","continueExit","_introBeforeExitCallback","overlayLayers","overlayLayer","_introExitCallback","addOverlayLayer","exitOnOverlayClick","cursor","introForElement","keyboardNavigation","itemsLength","arrayLength","getSortCompare","IntroJs","instance","instances","setOption","option","setOptions","obj1","obj2","attrname","obj3","mergeOptions","addStep","addSteps","onbeforechange","providedCallback","onchange","onafterchange","oncomplete","onhintsadded","onhintclick","onhintclose","onexit","onskip","onbeforeexit","introClass","hintClass","TOUR_lprev","TOUR_lnext","TOUR_ldone","TOUR_ldoneSearch","TOUR_welcti","TOUR_welc","TOUR_sear1","TOUR_searAnnot","TOUR_annotAss","TOUR_vccho1","TOUR_vccho2","TOUR_vcStat1","TOUR_vcStat2","TOUR_qlfield","TOUR_help","TOUR_glimpse","TOUR_seargo","TOUR_kwic","TOUR_snippet","TOUR_snippetb","TOUR_metadatab","TOUR_metadata","TOUR_tokenb","TOUR_token","TOUR_treeb","TOUR_tree","TOUR_tourdone","labelOpts","usabilityOpts","doe","gTstartSearch","elparam","Steps","TOUR_sear1ti","TOUR_searAnnotti","TOUR_annotAssti","TOUR_vccho1ti","TOUR_vccho2ti","TOUR_vcStat1ti","TOUR_vcStat2ti","TOUR_qlfieldti","TOUR_glimpseti","TOUR_helpti","TOUR_seargoti","testPrerequ","targetedElement","vchoo","vcv","Hint","gTshowResults","tourR","StepsSR","tour","StepsT","gtour","stepCount","testIntros","allowed","scripts","presentation","forms","downloads-without-user-activation","downloads","_perm","Set","perm","_closeIframe","_load","protocol","sendMsg","postMessage","serviceClass","isWidget","resize","_mgr","_closeService","_assoc","setIfNotYet","associates","widgetClass","stateClass","Panel","services","plugins","buttonsSingle","query","limits","register","about","widgets","embed","onClick","icon","addService","permissions","service","onload","sendToggle","addWidget","_interpolateURI","_getServiceID","_listener","_receiveMsg","_timer","_randomID","widget","Pipe","job","URL","_removeListener","Uint8Array","crypto","getRandomValues","randomID","notNullRe","_notNull","_pipe","legacySigle","_actionJSON","requestType","jsObj","returnValueCB","errorCB","XMLHttpRequest","reqE","bubbles","setRequestHeader","responseText","onreadystatechange","retJSObj","status","statusText","errors","send","legacy","docFragment","getJSON","getCollections","cq","getPluginList","putJSON","postJSON","deleteJSON","getQueryList","getQuery","qn","putQuery","postQuery","deleteQuery","PArok","href","pow","matchClass","tutClass","vcArray","alertifyClass","selectMenuClass","resultPanelClass","queryPanelClass","paginationPanelClass","tourClass","pluginClass","pipeClass","kqe","gt","tourshowR","vcname","vcchoose","matchElements","aside","asideClicked","resultInfo","resultPanel","sb","vcclick","tutorial","form","qf","queryPanel","sform","vcView","paginationPanel","pe","back","setSelectionRange","execCommand","initCopyToClipboard","pwd","initTogglePwdVisibility"],"mappings":"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","sourcesContent":["(function () {\n/**\r\n * @license almond 0.3.3 Copyright jQuery Foundation and other contributors.\r\n * Released under MIT license, http://github.com/requirejs/almond/LICENSE\r\n */\r\n//Going sloppy to avoid 'use strict' string cost, but strict practices should\r\n//be followed.\r\n/*global setTimeout: false */\r\n\r\nvar requirejs, require, define;\r\n(function (undef) {\r\n    var main, req, makeMap, handlers,\r\n        defined = {},\r\n        waiting = {},\r\n        config = {},\r\n        defining = {},\r\n        hasOwn = Object.prototype.hasOwnProperty,\r\n        aps = [].slice,\r\n        jsSuffixRegExp = /\\.js$/;\r\n\r\n    function hasProp(obj, prop) {\r\n        return hasOwn.call(obj, prop);\r\n    }\r\n\r\n    /**\r\n     * Given a relative module name, like ./something, normalize it to\r\n     * a real name that can be mapped to a path.\r\n     * @param {String} name the relative name\r\n     * @param {String} baseName a real name that the name arg is relative\r\n     * to.\r\n     * @returns {String} normalized name\r\n     */\r\n    function normalize(name, baseName) {\r\n        var nameParts, nameSegment, mapValue, foundMap, lastIndex,\r\n            foundI, foundStarMap, starI, i, j, part, normalizedBaseParts,\r\n            baseParts = baseName && baseName.split(\"/\"),\r\n            map = config.map,\r\n            starMap = (map && map['*']) || {};\r\n\r\n        //Adjust any relative paths.\r\n        if (name) {\r\n            name = name.split('/');\r\n            lastIndex = name.length - 1;\r\n\r\n            // If wanting node ID compatibility, strip .js from end\r\n            // of IDs. Have to do this here, and not in nameToUrl\r\n            // because node allows either .js or non .js to map\r\n            // to same file.\r\n            if (config.nodeIdCompat && jsSuffixRegExp.test(name[lastIndex])) {\r\n                name[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, '');\r\n            }\r\n\r\n            // Starts with a '.' so need the baseName\r\n            if (name[0].charAt(0) === '.' && baseParts) {\r\n                //Convert baseName to array, and lop off the last part,\r\n                //so that . matches that 'directory' and not name of the baseName's\r\n                //module. For instance, baseName of 'one/two/three', maps to\r\n                //'one/two/three.js', but we want the directory, 'one/two' for\r\n                //this normalization.\r\n                normalizedBaseParts = baseParts.slice(0, baseParts.length - 1);\r\n                name = normalizedBaseParts.concat(name);\r\n            }\r\n\r\n            //start trimDots\r\n            for (i = 0; i < name.length; i++) {\r\n                part = name[i];\r\n                if (part === '.') {\r\n                    name.splice(i, 1);\r\n                    i -= 1;\r\n                } else if (part === '..') {\r\n                    // If at the start, or previous value is still ..,\r\n                    // keep them so that when converted to a path it may\r\n                    // still work when converted to a path, even though\r\n                    // as an ID it is less than ideal. In larger point\r\n                    // releases, may be better to just kick out an error.\r\n                    if (i === 0 || (i === 1 && name[2] === '..') || name[i - 1] === '..') {\r\n                        continue;\r\n                    } else if (i > 0) {\r\n                        name.splice(i - 1, 2);\r\n                        i -= 2;\r\n                    }\r\n                }\r\n            }\r\n            //end trimDots\r\n\r\n            name = name.join('/');\r\n        }\r\n\r\n        //Apply map config if available.\r\n        if ((baseParts || starMap) && map) {\r\n            nameParts = name.split('/');\r\n\r\n            for (i = nameParts.length; i > 0; i -= 1) {\r\n                nameSegment = nameParts.slice(0, i).join(\"/\");\r\n\r\n                if (baseParts) {\r\n                    //Find the longest baseName segment match in the config.\r\n                    //So, do joins on the biggest to smallest lengths of baseParts.\r\n                    for (j = baseParts.length; j > 0; j -= 1) {\r\n                        mapValue = map[baseParts.slice(0, j).join('/')];\r\n\r\n                        //baseName segment has  config, find if it has one for\r\n                        //this name.\r\n                        if (mapValue) {\r\n                            mapValue = mapValue[nameSegment];\r\n                            if (mapValue) {\r\n                                //Match, update name to the new value.\r\n                                foundMap = mapValue;\r\n                                foundI = i;\r\n                                break;\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n\r\n                if (foundMap) {\r\n                    break;\r\n                }\r\n\r\n                //Check for a star map match, but just hold on to it,\r\n                //if there is a shorter segment match later in a matching\r\n                //config, then favor over this star map.\r\n                if (!foundStarMap && starMap && starMap[nameSegment]) {\r\n                    foundStarMap = starMap[nameSegment];\r\n                    starI = i;\r\n                }\r\n            }\r\n\r\n            if (!foundMap && foundStarMap) {\r\n                foundMap = foundStarMap;\r\n                foundI = starI;\r\n            }\r\n\r\n            if (foundMap) {\r\n                nameParts.splice(0, foundI, foundMap);\r\n                name = nameParts.join('/');\r\n            }\r\n        }\r\n\r\n        return name;\r\n    }\r\n\r\n    function makeRequire(relName, forceSync) {\r\n        return function () {\r\n            //A version of a require function that passes a moduleName\r\n            //value for items that may need to\r\n            //look up paths relative to the moduleName\r\n            var args = aps.call(arguments, 0);\r\n\r\n            //If first arg is not require('string'), and there is only\r\n            //one arg, it is the array form without a callback. Insert\r\n            //a null so that the following concat is correct.\r\n            if (typeof args[0] !== 'string' && args.length === 1) {\r\n                args.push(null);\r\n            }\r\n            return req.apply(undef, args.concat([relName, forceSync]));\r\n        };\r\n    }\r\n\r\n    function makeNormalize(relName) {\r\n        return function (name) {\r\n            return normalize(name, relName);\r\n        };\r\n    }\r\n\r\n    function makeLoad(depName) {\r\n        return function (value) {\r\n            defined[depName] = value;\r\n        };\r\n    }\r\n\r\n    function callDep(name) {\r\n        if (hasProp(waiting, name)) {\r\n            var args = waiting[name];\r\n            delete waiting[name];\r\n            defining[name] = true;\r\n            main.apply(undef, args);\r\n        }\r\n\r\n        if (!hasProp(defined, name) && !hasProp(defining, name)) {\r\n            throw new Error('No ' + name);\r\n        }\r\n        return defined[name];\r\n    }\r\n\r\n    //Turns a plugin!resource to [plugin, resource]\r\n    //with the plugin being undefined if the name\r\n    //did not have a plugin prefix.\r\n    function splitPrefix(name) {\r\n        var prefix,\r\n            index = name ? name.indexOf('!') : -1;\r\n        if (index > -1) {\r\n            prefix = name.substring(0, index);\r\n            name = name.substring(index + 1, name.length);\r\n        }\r\n        return [prefix, name];\r\n    }\r\n\r\n    //Creates a parts array for a relName where first part is plugin ID,\r\n    //second part is resource ID. Assumes relName has already been normalized.\r\n    function makeRelParts(relName) {\r\n        return relName ? splitPrefix(relName) : [];\r\n    }\r\n\r\n    /**\r\n     * Makes a name map, normalizing the name, and using a plugin\r\n     * for normalization if necessary. Grabs a ref to plugin\r\n     * too, as an optimization.\r\n     */\r\n    makeMap = function (name, relParts) {\r\n        var plugin,\r\n            parts = splitPrefix(name),\r\n            prefix = parts[0],\r\n            relResourceName = relParts[1];\r\n\r\n        name = parts[1];\r\n\r\n        if (prefix) {\r\n            prefix = normalize(prefix, relResourceName);\r\n            plugin = callDep(prefix);\r\n        }\r\n\r\n        //Normalize according\r\n        if (prefix) {\r\n            if (plugin && plugin.normalize) {\r\n                name = plugin.normalize(name, makeNormalize(relResourceName));\r\n            } else {\r\n                name = normalize(name, relResourceName);\r\n            }\r\n        } else {\r\n            name = normalize(name, relResourceName);\r\n            parts = splitPrefix(name);\r\n            prefix = parts[0];\r\n            name = parts[1];\r\n            if (prefix) {\r\n                plugin = callDep(prefix);\r\n            }\r\n        }\r\n\r\n        //Using ridiculous property names for space reasons\r\n        return {\r\n            f: prefix ? prefix + '!' + name : name, //fullName\r\n            n: name,\r\n            pr: prefix,\r\n            p: plugin\r\n        };\r\n    };\r\n\r\n    function makeConfig(name) {\r\n        return function () {\r\n            return (config && config.config && config.config[name]) || {};\r\n        };\r\n    }\r\n\r\n    handlers = {\r\n        require: function (name) {\r\n            return makeRequire(name);\r\n        },\r\n        exports: function (name) {\r\n            var e = defined[name];\r\n            if (typeof e !== 'undefined') {\r\n                return e;\r\n            } else {\r\n                return (defined[name] = {});\r\n            }\r\n        },\r\n        module: function (name) {\r\n            return {\r\n                id: name,\r\n                uri: '',\r\n                exports: defined[name],\r\n                config: makeConfig(name)\r\n            };\r\n        }\r\n    };\r\n\r\n    main = function (name, deps, callback, relName) {\r\n        var cjsModule, depName, ret, map, i, relParts,\r\n            args = [],\r\n            callbackType = typeof callback,\r\n            usingExports;\r\n\r\n        //Use name if no relName\r\n        relName = relName || name;\r\n        relParts = makeRelParts(relName);\r\n\r\n        //Call the callback to define the module, if necessary.\r\n        if (callbackType === 'undefined' || callbackType === 'function') {\r\n            //Pull out the defined dependencies and pass the ordered\r\n            //values to the callback.\r\n            //Default to [require, exports, module] if no deps\r\n            deps = !deps.length && callback.length ? ['require', 'exports', 'module'] : deps;\r\n            for (i = 0; i < deps.length; i += 1) {\r\n                map = makeMap(deps[i], relParts);\r\n                depName = map.f;\r\n\r\n                //Fast path CommonJS standard dependencies.\r\n                if (depName === \"require\") {\r\n                    args[i] = handlers.require(name);\r\n                } else if (depName === \"exports\") {\r\n                    //CommonJS module spec 1.1\r\n                    args[i] = handlers.exports(name);\r\n                    usingExports = true;\r\n                } else if (depName === \"module\") {\r\n                    //CommonJS module spec 1.1\r\n                    cjsModule = args[i] = handlers.module(name);\r\n                } else if (hasProp(defined, depName) ||\r\n                           hasProp(waiting, depName) ||\r\n                           hasProp(defining, depName)) {\r\n                    args[i] = callDep(depName);\r\n                } else if (map.p) {\r\n                    map.p.load(map.n, makeRequire(relName, true), makeLoad(depName), {});\r\n                    args[i] = defined[depName];\r\n                } else {\r\n                    throw new Error(name + ' missing ' + depName);\r\n                }\r\n            }\r\n\r\n            ret = callback ? callback.apply(defined[name], args) : undefined;\r\n\r\n            if (name) {\r\n                //If setting exports via \"module\" is in play,\r\n                //favor that over return value and exports. After that,\r\n                //favor a non-undefined return value over exports use.\r\n                if (cjsModule && cjsModule.exports !== undef &&\r\n                        cjsModule.exports !== defined[name]) {\r\n                    defined[name] = cjsModule.exports;\r\n                } else if (ret !== undef || !usingExports) {\r\n                    //Use the return value from the function.\r\n                    defined[name] = ret;\r\n                }\r\n            }\r\n        } else if (name) {\r\n            //May just be an object definition for the module. Only\r\n            //worry about defining if have a module name.\r\n            defined[name] = callback;\r\n        }\r\n    };\r\n\r\n    requirejs = require = req = function (deps, callback, relName, forceSync, alt) {\r\n        if (typeof deps === \"string\") {\r\n            if (handlers[deps]) {\r\n                //callback in this case is really relName\r\n                return handlers[deps](callback);\r\n            }\r\n            //Just return the module wanted. In this scenario, the\r\n            //deps arg is the module name, and second arg (if passed)\r\n            //is just the relName.\r\n            //Normalize module name, if it contains . or ..\r\n            return callDep(makeMap(deps, makeRelParts(callback)).f);\r\n        } else if (!deps.splice) {\r\n            //deps is a config object, not an array.\r\n            config = deps;\r\n            if (config.deps) {\r\n                req(config.deps, config.callback);\r\n            }\r\n            if (!callback) {\r\n                return;\r\n            }\r\n\r\n            if (callback.splice) {\r\n                //callback is an array, which means it is a dependency list.\r\n                //Adjust args if there are dependencies\r\n                deps = callback;\r\n                callback = relName;\r\n                relName = null;\r\n            } else {\r\n                deps = undef;\r\n            }\r\n        }\r\n\r\n        //Support require(['a'])\r\n        callback = callback || function () {};\r\n\r\n        //If relName is a function, it is an errback handler,\r\n        //so remove it.\r\n        if (typeof relName === 'function') {\r\n            relName = forceSync;\r\n            forceSync = alt;\r\n        }\r\n\r\n        //Simulate async callback;\r\n        if (forceSync) {\r\n            main(undef, deps, callback, relName);\r\n        } else {\r\n            //Using a non-zero value because of concern for what old browsers\r\n            //do, and latest browsers \"upgrade\" to 4 if lower value is used:\r\n            //http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#dom-windowtimers-settimeout:\r\n            //If want a value immediately, use require('id') instead -- something\r\n            //that works in almond on the global level, but not guaranteed and\r\n            //unlikely to work in other AMD implementations.\r\n            setTimeout(function () {\r\n                main(undef, deps, callback, relName);\r\n            }, 4);\r\n        }\r\n\r\n        return req;\r\n    };\r\n\r\n    /**\r\n     * Just drops the config on the floor, but returns req in case\r\n     * the config return value is used.\r\n     */\r\n    req.config = function (cfg) {\r\n        return req(cfg);\r\n    };\r\n\r\n    /**\r\n     * Expose module registry for debugging and tooling\r\n     */\r\n    requirejs._defined = defined;\r\n\r\n    define = function (name, deps, callback) {\r\n        if (typeof name !== 'string') {\r\n            throw new Error('See almond README: incorrect module build, no module name');\r\n        }\r\n\r\n        //This module may not have dependencies\r\n        if (!deps.splice) {\r\n            //deps is not an array, so probably means\r\n            //an object literal or factory function for\r\n            //the value. Adjust args.\r\n            callback = deps;\r\n            deps = [];\r\n        }\r\n\r\n        if (!hasProp(defined, name) && !hasProp(waiting, name)) {\r\n            waiting[name] = [name, deps, callback];\r\n        }\r\n    };\r\n\r\n    define.amd = {\r\n        jQuery: true\r\n    };\r\n}());\r\n\ndefine(\"lib/almond\", function(){});\n\n\r\n\r\nwindow.KorAP = window.KorAP || {};\r\n\r\n// Don't let events bubble up\r\nif (Event.halt === undefined) {\r\n  // Don't let events bubble up\r\n  Event.prototype.halt = function () {\r\n    this.stopPropagation();\r\n    this.preventDefault();\r\n  };\r\n};\r\n\r\nconst _quoteRE = new RegExp(\"([\\\"\\\\\\\\])\", 'g');\r\nString.prototype.quote = function () {\r\n  return '\"' + this.replace(_quoteRE, '\\\\$1') + '\"';\r\n};\r\n\r\nconst _escapeRE = new RegExp(\"([\\/\\\\\\\\])\", 'g');\r\nString.prototype.escapeRegex = function () {\r\n  return this.replace(_escapeRE, '\\\\$1');\r\n};\r\n\r\nconst _slug1RE = new RegExp(\"[^-a-zA-Z0-9_\\\\s]+\", 'g');\r\nconst _slug2RE = new RegExp(\"[-\\\\s]+\", 'g');\r\nString.prototype.slugify = function () {\r\n  return this.toLowerCase().replace(_slug1RE, '').replace(_slug2RE, '-');\r\n};\r\n\r\n/**\r\n * Upgrade this object to another object,\r\n * while private data stays intact.\r\n *\r\n * @param {Object} An object with properties.\r\n */\r\nObject.prototype.upgradeTo  = function (props) {\r\n  for (let prop in props) {\r\n    this[prop] = props[prop];\r\n  };\r\n  return this;\r\n};\r\n\r\n\r\n// Add toggleClass method similar to jquery\r\nHTMLElement.prototype.toggleClass = function (c1, c2) {\r\n  const cl = this.classList;\r\n  if (cl.contains(c1)) {\r\n    cl.add(c2);\r\n    cl.remove(c1);\r\n  }\r\n  else {\r\n    cl.remove(c2);\r\n    cl.add(c1);\r\n  };\r\n};\r\n\r\n// Append element by tag name\r\nHTMLElement.prototype.addE = function (tag) {\r\n  return this.appendChild(document.createElement(tag));\r\n};\r\n\r\n// Append text node\r\nHTMLElement.prototype.addT = function (text) {\r\n  return this.appendChild(document.createTextNode(text));\r\n};\r\n\r\n\r\n// Utility for removing all children of a node\r\nfunction _removeChildren (node) {\r\n  // Remove everything underneath\r\n  while (node.firstChild)\r\n    node.removeChild(node.firstChild);\r\n};\r\n\r\n\r\n// Utility to get either the charCode\r\n// or the keyCode of an event\r\nfunction _codeFromEvent (e) {\r\n  if ((e.charCode) && (e.keyCode==0))\r\n    return e.charCode\r\n  return e.keyCode;\r\n};\r\n\r\nfunction _dec2hex (dec) {\r\n  return ('0' + dec.toString(16)).substr(-2)\r\n};\r\n\r\n\r\n/**\r\n * Create random identifiers\r\n */\r\n/*\r\n * code based on\r\n * https://stackoverflow.com/questions/1349404/generate-random-string-characters-in-javascript#8084248\r\n */\r\nfunction randomID (len) {\r\n  const arr = new Uint8Array((len || 40) / 2)\r\n  window.crypto.getRandomValues(arr)\r\n  return Array.from(arr, _dec2hex).join('')\r\n};\r\n\r\n\r\n/**\r\n * Add option to show passwords.\r\n */\r\nfunction initTogglePwdVisibility (element) {\r\n    const el = element.querySelectorAll(\"input[type=password].show-pwd\");\r\n    for (let x = 0; x < el.length; x++) {     \r\n        const pwd = el[x];\r\n\r\n        const a = document.createElement('a');\r\n        a.classList.add('show-pwd');         \r\n        a.addEventListener('click', function () {\r\n            if (pwd.getAttribute(\"type\") === \"password\") {\r\n                pwd.setAttribute(\"type\", \"text\");\r\n                a.classList.add('hide');\r\n                return;\r\n            };\r\n            pwd.setAttribute(\"type\", \"password\");\r\n            a.classList.remove('hide');\r\n        });\r\n        pwd.parentNode.insertBefore(a, pwd.nextSibling);\r\n    };\r\n};\r\n\r\n\r\n/**\r\n * Add option to copy to clipboard.\r\n */\r\nfunction initCopyToClipboard (element) {\r\n    const el = element.querySelectorAll(\"input.copy-to-clipboard\");\r\n    for (let x = 0; x < el.length; x++) {     \r\n        const text = el[x];\r\n        const a = document.createElement('a');\r\n        a.classList.add('copy-to-clipboard');         \r\n        a.addEventListener('click', function () {\r\n            let back = false;\r\n            if (text.getAttribute(\"type\") === 'password') {\r\n                text.setAttribute(\"type\", \"text\");\r\n                back = true;\r\n            };\r\n            text.select();\r\n            text.setSelectionRange(0, 99999);\r\n            document.execCommand(\"copy\");\r\n            if (back) {\r\n                text.setAttribute(\"type\", \"password\");\r\n            };\r\n        });\r\n        text.parentNode.insertBefore(a, text.nextSibling);\r\n    };\r\n};\r\n\r\n\r\ndefine('util',[],function () {\r\n  // Todo: That's double now!\r\n  KorAP.API = KorAP.API || {};\r\n  KorAP.Locale = KorAP.Locale || {};\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.OR  = loc.OR  || 'or';\r\n  loc.AND = loc.AND || 'and';\r\n\r\n  // Add new stylesheet object lazily to document\r\n  KorAP.newStyleSheet = function () {\r\n    if (KorAP._sheet === undefined) {\r\n      const sElem = document.createElement('style');\r\n      document.head.appendChild(sElem);\r\n      KorAP._sheet = sElem.sheet;\r\n    };\r\n    return KorAP._sheet;\r\n  };\r\n\r\n\r\n  // Default log message\r\n  KorAP.log = KorAP.log || function (type, msg, src) {\r\n    if (src)\r\n      msg += ' from ' + src;\r\n    console.log(type + \": \" + msg);\r\n  };\r\n\r\n  return KorAP;\r\n});\r\n\r\n/**\r\n * A Method for generating an array of nodes, that are direct descendants of the passed\r\n * element node, using a tag tagName as a parameter. Supposed to be used by the specification only.\r\n * @param {HTMLNode} element The HTMLNode / element object whose children we are fetching\r\n * @param {String} tagName The tag the children are looked for by\r\n * @returns An array of children nodes with tag tagName\r\n */\r\nfunction directElementChildrenByTagName (element, tagName) {\r\n  const tagElementsCollection=element.getElementsByTagName(tagName);\r\n  //var tagElements = Array.from(tagElementsCollection);\r\n  //var tagElements = [...tagElementsCollection];\r\n  //This one has the best compatability:\r\n  var tagElements = Array.prototype.slice.call(tagElementsCollection);\r\n  //filter by actually being direct child node\r\n  tagElements = tagElements.filter(subElement => subElement.parentNode === element);\r\n  return tagElements;\r\n};\r\n\r\n/**\r\n * A Method for generating an array of nodes, that are direct descendants of the passed\r\n * element node, using a class className as a parameter. Supposed to be used by the specification only.\r\n * @param {HTMLNode} element The HTMLNode / element object whose children we are fetching\r\n * @param {String} className The class the children are looked for by\r\n * @returns An array of children nodes with class className\r\n */\r\n function directElementChildrenByClassName (element, className) {\r\n  const classElementsCollection=element.getElementsByTagName(className);\r\n  //var classElements = Array.from(classElementsCollection);\r\n  //var classElements = [...classElementsCollection];\r\n  //This one has the best compatability:\r\n  var classElements = Array.prototype.slice.call(classElementsCollection);\r\n  //filter by actually being direct child node\r\n  classElements = classElements.filter(subElement => subElement.parentNode === element);\r\n  return classElements;\r\n};\r\n\nwindow.KorAP = window.KorAP || {};\r\n\r\nKorAP.annotationHelper = KorAP.annotationHelper || { '-' : [] };\r\n\r\n\r\n\r\ndefine('hint/foundries',[\"util\"], function () {\r\n\r\n  const ah = KorAP.annotationHelper;\r\n\r\n  ah.getDesc = function (foundryLayer, value) {\r\n\r\n    if (!foundryLayer)\r\n      return;\r\n\r\n    let anno = this[foundryLayer];\r\n\r\n    if (!anno)\r\n      return;\r\n\r\n    if (!value.includes(':')) {\r\n      value += ' ';\r\n\r\n      // Iterate over all annotations and add the descriptions\r\n      // This is a classic hash-lookup-case, but we have\r\n      // to deal with lists ...\r\n      for (var i = 0; i < anno.length; i++) {\r\n        if (anno[i] &&\r\n            anno[i][1] == value) {\r\n          if (anno[i][2])\r\n            return anno[i][2];\r\n          else\r\n            return;\r\n        };\r\n      };\r\n\r\n      return;\r\n    }\r\n\r\n    else {\r\n      const v = value.split(\":\");\r\n      let l1 = v[0] + ':';\r\n      let l2 = v[1] + ' ';\r\n      let text = '';\r\n\r\n      // Add key description\r\n      for (let i = 0; i < anno.length; i++) {\r\n        if (anno[i] &&\r\n            anno[i][1] == l1) {\r\n          if (anno[i][2])\r\n            text += anno[i][2];\r\n          else\r\n            text += anno[i][0];\r\n          break;\r\n        };\r\n      };\r\n\r\n      // Nothing found\r\n      if (text.length === 0)\r\n        return;\r\n\r\n      // Check next level\r\n      anno = this[foundryLayer + l1];\r\n\r\n      if (!anno)\r\n        return;\r\n\r\n      // Add value description\r\n      for (let i = 0; i < anno.length; i++) {\r\n        if (anno[i] &&\r\n            anno[i][1] == l2) {\r\n          if (anno[i][2])\r\n            text += ': ' + anno[i][2];\r\n\r\n          return text;\r\n        };\r\n      };      \r\n    };\r\n\r\n    return '';\r\n  };\r\n\r\n  return ah;\r\n});\r\n\ndefine('hint/foundries/base',[\"hint/foundries\"], function (ah) {\r\n  ah[\"-\"].push(\r\n    [\"Base Annotation\", \"base/s=\", \"Structure\"]\r\n  );\r\n\r\n  ah[\"base/s=\"] = [\r\n    [\"s\", \"s\", \"Sentence\"],\r\n    [\"p\", \"p\", \"Paragraph\"],\r\n    [\"t\", \"t\", \"Text\"]\r\n  ];\r\n});\r\n\ndefine('hint/foundries/dereko',[\"hint/foundries\"], function (ah) {\r\n  ah[\"-\"].push(\r\n    [\"DeReKo\", \"dereko/s=\", \"Structure\"]\r\n  );\r\n});\r\n\nrequire([\r\n  \"hint/foundries/base\",\r\n  \"hint/foundries/dereko\"\r\n]);\r\n\ndefine(\"default\", function(){});\n\n/*\r\n * MenuItems may define:\r\n *\r\n * onclick: action happen on click and enter.\r\n * further: action happen on right arrow\r\n */\r\n\r\n\r\n\r\n/**\r\n * Item in the Dropdown menu\r\n */\r\ndefine('menu/item',{\r\n  /**\r\n   * Create a new MenuItem object.\r\n   *\r\n   * @constructor\r\n   * @this {MenuItem}\r\n   * @param {Array.<string>} An array object of name, action and\r\n   *   optionally a description\r\n   */\r\n  create : function (params) {\r\n    return Object.create(this)._init(params);\r\n  },\r\n\r\n\r\n  /**\r\n   * Get or set the content of the meun item.\r\n   */\r\n  content : function (content) {\r\n    if (arguments.length === 1)\r\n      this._content = document.createTextNode(content);\r\n    return this._content;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get or set the information for action of this item. \r\n   */\r\n  action : function (action) {\r\n    if (arguments.length === 1)\r\n      this._action = action;\r\n    return this._action;\r\n  },\r\n  \r\n\r\n  /**\r\n   * Get the lower cased field of the item\r\n   * (used for analyses).\r\n   */\r\n  lcField : function () {\r\n    return this._lcField;\r\n  },\r\n\r\n\r\n  /**\r\n   * Check or set if the item is active\r\n   *\r\n   * @param {boolean|null} State of activity\r\n   */\r\n  active : function (bool) {\r\n    const cl = this.element().classList;\r\n    if (bool === undefined)\r\n      return cl.contains(\"active\");\r\n    else if (bool)\r\n      cl.add(\"active\");\r\n    else\r\n      cl.remove(\"active\");\r\n  },\r\n\r\n\r\n  /**\r\n   * Check or set if the item is\r\n   * at the boundary of the menu\r\n   * list\r\n   *\r\n   * @param {boolean|null} State of activity\r\n   */\r\n  noMore : function (bool) {\r\n    const cl = this.element().classList;\r\n    if (bool === undefined)\r\n      return cl.contains(\"no-more\");\r\n    else if (bool)\r\n      cl.add(\"no-more\");\r\n    else\r\n      cl.remove(\"no-more\");\r\n  },\r\n  \r\n  /**\r\n   * Get the document element of the menu item\r\n   */\r\n  element : function () {\r\n    // already defined\r\n    if (this._el !== undefined)\r\n      return this._el;\r\n    \r\n    // Create list item\r\n    const li = document.createElement(\"li\");\r\n\r\n    // Connect action\r\n    if (this[\"onclick\"] !== undefined) {\r\n      li[\"onclick\"] = this.onclick.bind(this);\r\n    };\r\n\r\n    // Append template\r\n    li.appendChild(this.content());\r\n    \r\n    return this._el = li;\r\n  },\r\n\r\n  /**\r\n   * Highlight parts of the item\r\n   *\r\n   * @param {string} Prefix string for highlights\r\n   */\r\n  highlight : function (prefix) {\r\n\r\n    // The prefix already matches\r\n    if (this._prefix === prefix)\r\n      return;\r\n\r\n    // There is a prefix but it doesn't match\r\n    if (this._prefix !== null) {\r\n      this.lowlight();\r\n    }\r\n\r\n    const children = this.element().childNodes;\r\n    for (let i = children.length -1; i >= 0; i--) {\r\n      this._highlight(children[i], prefix);\r\n    };\r\n\r\n    this._prefix = prefix;\r\n  },\r\n\r\n\r\n  /**\r\n   * Remove highlight of the menu item\r\n   */\r\n  lowlight : function () {\r\n    if (this._prefix === null)\r\n      return;\r\n\r\n    const e = this.element();\r\n    \r\n    const marks = e.getElementsByTagName(\"mark\");\r\n\r\n    for (let i = marks.length - 1; i >= 0; i--) {\r\n\r\n      // Replace with content\r\n      marks[i].parentNode.replaceChild(\r\n        // Create text node clone\r\n\t      document.createTextNode(\r\n\t        marks[i].firstChild.nodeValue\r\n        ),\r\n\t      marks[i]\r\n      );\r\n    };\r\n\r\n    // Remove consecutive textnodes\r\n    e.normalize();\r\n    this._prefix = null;\r\n  },\r\n\r\n\r\n  // Highlight a certain substring of the menu item\r\n  _highlight : function (elem, prefixString) {    \r\n    if (elem.nodeType === 3) {\r\n      \r\n      const text   = elem.nodeValue;\r\n      const textlc = text.toLowerCase();\r\n\r\n      // Split prefixes\r\n      if (prefixString) {\r\n\r\n        // ND:\r\n        //   Doing this in a single line can trigger\r\n        //   a deep-recursion in Firefox 57.01, though I don't know why.\r\n        prefixString = prefixString.trim();\r\n\r\n        const prefixes = prefixString.split(\" \");\r\n\r\n        let testPos,\r\n            pos = -1,\r\n            len = 0;\r\n\r\n        // Iterate over all prefixes and get the best one\r\n        // for (var i = 0; i < prefixes.length; i++) {\r\n        prefixes.forEach(function(i) {\r\n\r\n          // Get first pos of a matching prefix\r\n          testPos = textlc.indexOf(i);\r\n          if (testPos < 0)\r\n            return;\r\n\r\n          if (pos === -1 || testPos < pos) {\r\n            pos = testPos;\r\n            len = i.length;\r\n          }\r\n          else if (testPos === pos && i.length > len) {\r\n            len = i.length;\r\n          };\r\n        });\r\n\r\n        // Matches!\r\n        if (pos >= 0) {\r\n\t\r\n\t        // First element\r\n\t        if (pos > 0) {\r\n\t          elem.parentNode.insertBefore(\r\n\t            document.createTextNode(text.substr(0, pos)),\r\n\t            elem\r\n\t          );\r\n\t        };\r\n\t\r\n\t        // Second element\r\n\t        const hl = document.createElement(\"mark\");\r\n\t        hl.appendChild(\r\n\t          document.createTextNode(text.substr(pos, len))\r\n\t        );\r\n\t        elem.parentNode.insertBefore(hl, elem);\r\n\t\r\n\t        // Third element\r\n\t        const third = text.substr(pos + len);\r\n\r\n\t        if (third.length > 0) {\r\n\t          const thirdE = document.createTextNode(third);\r\n\t          elem.parentNode.insertBefore(\r\n\t            thirdE,\r\n\t            elem\r\n\t          );\r\n\t          this._highlight(thirdE, prefixString);\r\n\t        };\r\n\t\r\n          elem.parentNode.removeChild(elem);\r\n        };\r\n      };\r\n    }\r\n\r\n    else {\r\n      const children = elem.childNodes;\r\n      for (let i = children.length -1; i >= 0; i--) {\r\n\t      this._highlight(children[i], prefixString);\r\n      };\r\n    };\r\n  },\r\n\r\n  // Initialize menu item\r\n  _init : function (params) {\r\n    \r\n    if (params[0] === undefined) {\r\n      throw new Error(\"Missing parameters\");\r\n    };\r\n\r\n    const t = this;\r\n\r\n    t.content(params[0]);\r\n    \r\n    if (params.length > 1) {\r\n      t._action = params[1];\r\n\r\n      if (params.length > 2)\r\n        t._onclick = params[2];\r\n    };\r\n    \r\n    t._lcField = ' ' + t.content().textContent.toLowerCase();\r\n    t._prefix = null;\r\n\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * The click action of the menu item.\r\n   */\r\n  onclick : function (e) {\r\n    const m = this.menu();\r\n\r\n    // Reset prefix\r\n    m.prefix(\"\");\r\n\r\n    if (this._onclick)\r\n      this._onclick.apply(this, e);\r\n\r\n    m.hide();\r\n  },\r\n\r\n  \r\n  /**\r\n   * Return menu list.\r\n   */\r\n  menu : function () {\r\n    return this._menu;\r\n  }\r\n});\r\n\n\r\n\r\ndefine('menu/prefix',{\r\n\r\n  /**\r\n   * Create new prefix object.\r\n   */\r\n  create : function () {\r\n    return Object.create(this)._init();\r\n  },\r\n\r\n\r\n  // Initialize prefix object\r\n  _init : function () {\r\n    const t = this;\r\n\r\n    t._string = '';\r\n\r\n    // Add prefix span\r\n    t._el = document.createElement('span');\r\n    t._el.classList.add('non-item');\r\n    t._el.classList.add('pref');\r\n    // Connect action\r\n\r\n    if (t[\"onclick\"] !== undefined) {\r\n      t._el[\"onclick\"] = t.onclick.bind(t);\r\n    }\r\n    return t;\r\n  },\r\n\r\n\r\n  _update : function () {\r\n    return this._el.innerHTML\r\n      = this._string;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get or set the activity status of the prefix.\r\n   */\r\n  active : function (bool) {\r\n    const cl = this.element().classList;\r\n    if (bool === undefined)\r\n      return cl.contains(\"active\");\r\n    else if (bool)\r\n      cl.add(\"active\");\r\n    else\r\n      cl.remove(\"active\");\r\n  },\r\n\r\n\r\n  /**\r\n   * Check, if a prefix is given or not.\r\n   */\r\n  isSet : function () {\r\n    return this._string.length > 0 ?\r\n      true : false;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get or set the prefix string.\r\n   */\r\n  value : function (string) {\r\n    if (arguments.length === 1) {\r\n      this._string = string;\r\n      return this._update();\r\n    };\r\n    return this._string;\r\n  },\r\n\r\n\r\n  /**\r\n   * Add string to prefix.\r\n   */\r\n  add : function (string) {\r\n    this._string += string;\r\n    return this._update();\r\n  },\r\n  \r\n\r\n  /**\r\n   * Clear prefix\r\n   */\r\n  clear : function () {\r\n    this._string = '';\r\n    return this._update();\r\n  },\r\n\r\n\r\n  /**\r\n   * Action method.\r\n   * Expected to be overridden.\r\n   */\r\n  onclick : function () {},\r\n\r\n  \r\n  /**\r\n   * Remove the last character of the string\r\n   */\r\n  chop : function () {\r\n    const t = this;\r\n\r\n    // Prefix is long enough for backspace\r\n    if (t._string.length > 1) {\r\n      t._string = t._string.substring(\r\n\t      0, t._string.length - 1\r\n      );\r\n    }\r\n    else {\r\n      t._string = '';\r\n    };\r\n    \r\n    return t._update();\r\n  },\r\n\r\n\r\n  /**\r\n   * Get the associated dom element.\r\n   */\r\n  element : function () {\r\n    return this._el;\r\n  },\r\n\r\n\r\n  /**\r\n   * Return menu list.\r\n   */\r\n  menu : function () {\r\n    return this._menu;\r\n  }\r\n});\r\n\n\r\n\r\ndefine('menu/lengthField',{\r\n\r\n  /**\r\n   * Create new lengthField object.\r\n   */\r\n  create : function () {\r\n    return Object.create(this)._init();\r\n  },\r\n\r\n\r\n  // Initialize lengthField object\r\n  _init : function () {\r\n    this._el = document.createElement('div');\r\n    this._el.classList.add('lengthField');\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get the associated dom element.\r\n   */\r\n  element : function () {\r\n    return this._el;\r\n  },\r\n\r\n\r\n  /**\r\n   * Add string to lengthField.\r\n   */\r\n  add : function (param) {\r\n    this._el.appendChild(document.createElement('span'))\r\n      .appendChild(document.createTextNode(param[0] + '--'));\r\n  },\r\n\r\n\r\n  /**\r\n   * Remove all initialized values\r\n   */\r\n  reset : function () {\r\n    while (this._el.firstChild) {\r\n      this._el.firstChild.remove();\r\n    };\r\n  }\r\n});\r\n\n\r\n\r\n/**\r\n * Create slider for menus.\r\n * The slider will only be used by mouse - touch support\r\n * shouldn't be necessary, as the menu can be scrolled using touch.\r\n *\r\n * @author Nils Diewald\r\n */\r\ndefine('menu/slider',{\r\n\r\n  /**\r\n   * Create new slider for Menu.\r\n   * @this {Slider}\r\n   * @constructor\r\n   * @param {Menu} menu object\r\n   */\r\n  create : function (menu) {\r\n    return Object.create(this)._init(menu);\r\n  },\r\n\r\n\r\n  /**\r\n   * Length attribute of the slider\r\n   * (as number of items).\r\n   *\r\n   * @param {number} Number of items (optional)\r\n   */\r\n  length : function (i) {\r\n    if (arguments.length === 0)\r\n      return this._length;\r\n    if (i == this._length)\r\n      return this;\r\n    this._length = i;\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Limit of items per screen.\r\n   *\r\n   * @param {number} Number of items per screen (optional)\r\n   */\r\n  limit : function (i) {\r\n    if (arguments.length === 0)\r\n      return this._limit;\r\n    if (i == this._limit)\r\n      return this;\r\n    this._limit = i;\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Is the slider active or not.\r\n   *\r\n   * @param {bool} true or false (optional)\r\n   */\r\n  active : function (bool) {\r\n    if (arguments.length === 1) {\r\n      if (bool) {\r\n\t      if (!this._active) {\r\n\t        this._el.classList.add('active');\r\n\t        this._active = true;\r\n\t      };\r\n      }\r\n      else if (this._active) {\r\n\t      this._el.classList.remove('active');\r\n\t      this._active = false;\r\n      }\r\n    };\r\n    return this._active;\r\n  },\r\n\r\n\r\n  /**\r\n   * Move the slider to a relative position\r\n   *\r\n   * @param {number} relative position\r\n   */\r\n  movetoRel : function (relativePos) {\r\n\r\n    // This is important to find the correct percentage!\r\n    const diffHeight = (this._rulerHeight - this._sliderHeight);\r\n    const relativeOffset = (relativePos / diffHeight);\r\n\r\n    // Offset is a value 0 to this._screens\r\n    const off = this.offset(\r\n      parseInt(relativeOffset * this._screens) + this._event.initOffset\r\n    );\r\n\r\n    if (off !== undefined) {\r\n      this._menu.screen(off);\r\n    };\r\n  },\r\n\r\n\r\n  /**\r\n   * Move the slider to an absolute position\r\n   *\r\n   * @param {number} absolute position\r\n   */\r\n  movetoAbs : function (absPos) {\r\n    const absOffset = (absPos / this._rulerHeight);\r\n    const off = this.offset(parseInt(absOffset * (this._screens + 1)));\r\n\r\n    if (off !== undefined) {\r\n      this._menu.screen(off);\r\n    };\r\n  },\r\n\r\n\r\n  /**\r\n   * Screen offset of the slider\r\n   *\r\n   * @param {number} Offset position of the slider (optional)\r\n   */\r\n  offset : function (off) {\r\n    if (arguments.length === 0)\r\n      return this._offset;\r\n\r\n    // Normalize offset\r\n    if (off > this._screens)\r\n      off = this._screens;\r\n    else if (off < 0)\r\n      off = 0;\r\n\r\n    // Identical with old value\r\n    if (off === this._offset)\r\n      return undefined;\r\n\r\n    // Set offset and move\r\n    this._offset = off;\r\n    this._slider.style.top = (this._step * off) + '%';\r\n    return off;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get the associated dom element.\r\n   */\r\n  element : function () {\r\n    return this._el;\r\n  },\r\n\r\n\r\n  /**\r\n   * Reinitialize the size of the slider.\r\n   * Necessary to call after each adjustment of the list.\r\n   */\r\n  reInit : function () {\r\n\r\n    const t = this;\r\n    const s = t._el.style;\r\n\r\n    // Do not show the slider, in case there is nothing to scroll\r\n    if (t._length <= t._limit) {\r\n      s.display = 'none';\r\n      return;\r\n    }\r\n    else {\r\n      s.display = 'block';\r\n    };\r\n\r\n    t._height  = ((t._limit / t._length) * 100);\r\n    t._screens = t._length - t._limit;\r\n    t._step    = (100 - t._height) / t._screens;\r\n    t._slider.style.height = t._height + '%';\r\n  },\r\n\r\n\r\n  // Initialize prefix object\r\n  _init : function (menu) {\r\n    const t = this;\r\n\r\n    t._menu = menu;\r\n\r\n    t._offset = 0;\r\n    t._event = {};\r\n    t._active = false;\r\n\r\n    const el = t._el = document.createElement('div');\r\n    el.setAttribute('class', 'ruler');\r\n\r\n    t._slider = el.appendChild(\r\n      document.createElement('span')\r\n    );\r\n\r\n    t._ruler = el.appendChild(document.createElement('div'));\r\n\r\n    // Do not mark the menu on mousedown\r\n    t._ruler.addEventListener('mousedown', function (e) {\r\n      e.halt()\r\n    }, false);\r\n\r\n    // Move the slider to the click position\r\n    t._ruler.addEventListener('click', t._mouseclick.bind(t), false);\r\n\r\n    t._slider.addEventListener('mousedown', t._mousedown.bind(t), false);\r\n\r\n    return t;\r\n  },\r\n\r\n\r\n  // Reinit height based on dom position\r\n  _initClientHeight : function () {\r\n    this._rulerHeight  = this._el.clientHeight;\r\n    this._sliderHeight = this._slider.clientHeight;\r\n  },\r\n\r\n\r\n  // Release mousemove event\r\n  _mousemove : function (e) {\r\n    this.movetoRel(e.clientY - this._event.init);\r\n    e.halt();\r\n  },\r\n\r\n\r\n  // Release mouseup event\r\n  _mouseup : function (e) {\r\n    this.active(false);\r\n    window.removeEventListener('mousemove', this._event.mov);\r\n    window.removeEventListener('mouseup', this._event.up);\r\n    this._menu.focus();\r\n  },\r\n\r\n\r\n  // Release mousedown event\r\n  _mousedown : function (e) {\r\n    // Bind drag handler\r\n    const ev = this._event;\r\n\r\n    // _step * _offset is the distance of the ruler to the top\r\n    ev.init = e.clientY;\r\n    ev.initOffset = this._offset;\r\n    // By substracting that, it is like initializing to the first point\r\n\r\n    ev.mov  = this._mousemove.bind(this);\r\n    ev.up   = this._mouseup.bind(this);\r\n\r\n    // TODO: This may not be necessary all the time\r\n    this._initClientHeight();\r\n\r\n    this.active(true);\r\n\r\n    window.addEventListener('mousemove', ev.mov);\r\n    window.addEventListener('mouseup', ev.up);\r\n\r\n    e.halt();\r\n  },\r\n\r\n\r\n  // Release event to reposition slider on ruler\r\n  _mouseclick : function (e) {\r\n    this._initClientHeight();\r\n\r\n    this.movetoAbs(\r\n      e.clientY - this._ruler.getClientRects()[0].top\r\n    );\r\n    e.halt();\r\n  }\r\n});\r\n\n/**\r\n * Scrollable drop-down menus with view filter.\r\n *\r\n * @author Nils Diewald\r\n */\r\n/*\r\n * TODO: Show the slider briefly on move (whenever screen is called).\r\n * TODO: Ignore alt+ and strg+ key strokes.\r\n * TODO: Should scroll to a chosen value after prefixing, if the chosen value is live\r\n * TODO: Add a \"title\" to a menu that is not scrollable.\r\n * TODO: Make the menu responsive by showing less items on smaller screens\r\n *       or anytime items would be outside the screen.\r\n * TODO: Add a .match() method to items for scrolling and probably for prefixing.\r\n * TODO: Add static header (for title, sortation fields, but also for menu points like \"fragments\" and \"history\".\r\n * TODO: Support space separated list of prefixes so \"co no\" will highlight \"common noun\"\r\n */\r\n\r\n\r\ndefine('menu',[\r\n  'menu/item',\r\n  'menu/prefix',\r\n  'menu/lengthField',\r\n  'menu/slider',\r\n  'util'\r\n], function (defaultItemClass,\r\n             defaultPrefixClass,\r\n             defaultLengthFieldClass,\r\n             sliderClass) {\r\n\r\n  // Default maximum number of menu items\r\n  const menuLimit = 8;\r\n\r\n  /**\r\n   * List of items for drop down menu (complete).\r\n   * Only a sublist of the menu is filtered (live).\r\n   * Only a sublist of the filtered menu is visible (shown).\r\n   */\r\n  return {\r\n    /**\r\n     * Create new Menu based on the action prefix\r\n     * and a list of menu items.\r\n     *\r\n     *\r\n     * Accepts an associative array containg the elements\r\n     * itemClass, prefixClass, lengthFieldClass\r\n     *\r\n     * @this {Menu}\r\n     * @constructor\r\n     * @param {string} Context prefix\r\n     * @param {Array.<Array.<string>>} List of menu items\r\n     */\r\n    create : function (list, params) {\r\n      return Object.create(this)._init(list, params);\r\n    },\r\n\r\n    // Initialize list\r\n    _init : function (list, params) {\r\n      if (params === undefined)\r\n        params = {};\r\n\r\n      const t = this;\r\n      t._notItemElements=3;\r\n\r\n      t._itemClass = params[\"itemClass\"] || defaultItemClass;\r\n\r\n      // Add prefix object\r\n      if (params[\"prefixClass\"] !== undefined) {\r\n        t._prefix = params[\"prefixClass\"].create();\r\n      }\r\n      else {\r\n        t._prefix = defaultPrefixClass.create();\r\n      };\r\n      t._prefix._menu = t;\r\n\r\n      // Add lengthField object\r\n      if (params[\"lengthFieldClass\"] !== undefined) {\r\n        t._lengthField = params[\"lengthFieldClass\"].create();\r\n      }\r\n      else {\r\n        t._lengthField = defaultLengthFieldClass.create();\r\n      };\r\n      t._lengthField._menu = t;\r\n\r\n      // Initialize slider\r\n      t._slider = sliderClass.create(t);\r\n\r\n      // Create the element\r\n      var el = document.createElement(\"ul\");\r\n      el.style.outline = 0;\r\n      el.setAttribute('tabindex', 0);\r\n      el.classList.add('menu', 'roll');\r\n      el.appendChild(t._prefix.element());\r\n      el.appendChild(t._lengthField.element());\r\n      el.appendChild(t._slider.element());\r\n\r\n      // This has to be cleaned up later on\r\n      el[\"menu\"] = t;\r\n\r\n      // Arrow keys\r\n      el.addEventListener(\r\n        'keydown',\r\n        t._keydown.bind(t),\r\n        false\r\n      );\r\n\r\n      // Strings\r\n      el.addEventListener(\r\n        'keypress',\r\n        t._keypress.bind(t),\r\n        false\r\n      );\r\n\r\n      // Mousewheel\r\n      el.addEventListener(\r\n        'wheel',\r\n        t._mousewheel.bind(t),\r\n        false\r\n      );\r\n\r\n      // Touch events\r\n      ['touchstart', 'touchend', 'touchmove'].forEach(\r\n        e => el.addEventListener(e, t._touch.bind(t), false)\r\n      );\r\n\r\n      \r\n      t._el = el;\r\n\r\n      t._limit = menuLimit;\r\n      \r\n      t._items = new Array(); //all childNodes, i.e. ItemClass, prefixClass\r\n\r\n      t.readItems(list);\r\n\r\n      t.dontHide = false;\r\n        \r\n      return t;\r\n    },\r\n\r\n    // Read items to add to list\r\n    readItems : function (list) {\r\n      const t = this;\r\n\r\n      t._list = undefined; //filtered List containing all itemClass items\r\n\r\n      // Remove circular reference to \"this\" in items\r\n      for (let i = 0; i < t._items.length; i++) {\r\n        delete t._items[i][\"_menu\"];\r\n        delete t._items[i];\r\n      };\r\n\r\n      t._items = new Array();\r\n      t.removeItems();\r\n\r\n\r\n      // Initialize items\r\n      t._lengthField.reset();\r\n\r\n      // Initialize item list based on parameters\r\n      list.forEach(function(i){\r\n        const obj = this._itemClass.create(i);\r\n\r\n        // This may become circular\r\n        obj[\"_menu\"] = this;\r\n        this._lengthField.add(i);\r\n        this._items.push(obj);\r\n      }, t);\r\n\r\n      t._slider.length(t.liveLength())\r\n        .limit(t._limit)\r\n        .reInit();\r\n      \r\n      t._firstActive = false;\r\n      // Show the first item active always?\r\n      t.offset = 0;\r\n      t.position = 0;\r\n    },\r\n\r\n    // Append item to list\r\n    append : function (item) {\r\n      const t = this;\r\n      // This is cyclic!\r\n      item[\"_menu\"] = t;\r\n      t._list = undefined;\r\n      t.removeItems();\r\n      t._items.push(item);\r\n      t._lengthField.add([item.content().data]);\r\n      t._slider.length(t.liveLength()).reInit();\r\n      t._firstActive = false;\r\n      t.offset = 0;\r\n      t.position = 0;\r\n    },\r\n    \r\n    // Initialize the item list\r\n    _initList : function () {\r\n      // Upon change also update alwaysmenu.js please\r\n      const t = this;\r\n\r\n      // Create a new list\r\n      if (t._list === undefined) {\r\n        t._list = [];\r\n      }\r\n      else if (t._list.length !== 0) {\r\n        t._boundary(false);\r\n        t._list.length = 0;\r\n      };\r\n\r\n      // Offset is initially zero\r\n      t.offset = 0;\r\n\r\n      // There is no prefix set\r\n      if (t.prefix().length <= 0) {\r\n\r\n        // add all items to the list and lowlight\r\n        let i = 0;\r\n        for (; i < t._items.length; i++) {\r\n          t._list.push(i);\r\n          t._items[i].lowlight();\r\n        };\r\n\r\n        t._slider.length(i).reInit();\r\n\r\n        return true;\r\n      };\r\n\r\n      /*\r\n       * There is a prefix set, so filter the list!\r\n       */\r\n      let pos;\r\n      const prefixList = t.prefix().toLowerCase().split(\" \");\r\n\r\n      const items = [];\r\n      let maxPoints = 1; // minimum 1\r\n\r\n      // Iterate over all items and choose preferred matching items\r\n      // i.e. the matching happens at the word start\r\n      t._items.forEach(function(it, pos){\r\n\r\n        let points = 0;\r\n\r\n        prefixList.forEach(function(p) {\r\n\r\n          // Check if it matches at the beginning\r\n          if ((it.lcField().includes(\" \" + p))) {\r\n            points += 5;\r\n          }\r\n\r\n          // Check if it matches anywhere\r\n          else if (it.lcField().includes(p)) {\r\n            points += 1;\r\n          };\r\n        });\r\n\r\n        if (points > maxPoints) {\r\n          this._list = [pos];\r\n          maxPoints = points;\r\n        }\r\n        else if (points == maxPoints) {\r\n          this._list.push(pos);\r\n        }\r\n      }, t);\r\n\r\n      t._slider.length(t._list.length).reInit();\r\n\r\n      // Filter was successful - yeah!\r\n      return t._list.length > 0 ? true : false;\r\n    },\r\n\r\n\r\n    /**\r\n     * Destroy this menu\r\n     * (in case you don't trust the\r\n     * mark and sweep GC)!\r\n     */\r\n    destroy : function () {\r\n      // Upon change also update alwaysmenu.js please\r\n      const t = this;\r\n\r\n      // Remove circular reference to \"this\" in menu\r\n      if (t._el != undefined)\r\n        delete t._el[\"menu\"]; \r\n\r\n      // Remove circular reference to \"this\" in items\r\n      t._items.forEach(function(i) {\r\n        delete i[\"_menu\"];\r\n      });\r\n\r\n      // Remove circular reference to \"this\" in prefix\r\n      delete t._prefix['_menu'];\r\n      delete t._lengthField['_menu'];\r\n      delete t._slider['_menu'];\r\n    },\r\n\r\n\r\n    /**\r\n     * Focus on this menu.\r\n     */\r\n    focus : function () {\r\n      this._el.focus();\r\n    },\r\n\r\n\r\n    // mouse wheel treatment\r\n    _mousewheel : function (e) {\r\n      const delta = e.deltaY / 120;\r\n      if (delta > 0)\r\n        this.next();\r\n      else if (delta < 0)\r\n        this.prev();\r\n      e.halt();\r\n    },\r\n\r\n\r\n    // touchmove treatment\r\n    _touch : function (e) {\r\n      const s = this.slider();\r\n\r\n      if (e.type === \"touchstart\") {\r\n        this._lastTouch = e.touches[0].clientY;\r\n      }\r\n      else if (e.type === \"touchend\") {\r\n        this._lastTouch = undefined;\r\n      }\r\n      else if (e.type === \"touchmove\") {\r\n        const to = e.touches[0];\r\n\r\n        // TODO:\r\n        // Instead of using 26px, choose the item height\r\n        // or use the menu height // shownItems\r\n        \r\n        // s.movetoRel(t.clientY - this._initTouch);\r\n        if ((this._lastTouch + 26) < to.clientY) {\r\n          this.viewDown();\r\n          this._lastTouch = to.clientY;\r\n        }\r\n        else if ((this._lastTouch - 26) > to.clientY) {\r\n          this.viewUp();\r\n          this._lastTouch = to.clientY;\r\n        }\r\n        e.halt();\r\n      };\r\n    },\r\n\r\n    // Arrow key and prefix treatment\r\n    _keydown : function (e) {\r\n      //Upon change also update alwaysmenu.js please\r\n      const t = this;\r\n\r\n      switch (_codeFromEvent(e)) {\r\n\r\n      case 27: // 'Esc'\r\n        e.halt();\r\n        t.hide();\r\n        break;\r\n\r\n      case 38: // 'Up'\r\n        e.halt();\r\n        t.prev();\r\n        break;\r\n\r\n      case 33: // 'Page up'\r\n        e.halt();\r\n        t.pageUp();\r\n        break;\r\n\r\n      case 40: // 'Down'\r\n        e.halt();\r\n        t.next();\r\n        break;\r\n\r\n      case 34: // 'Page down'\r\n        e.halt();\r\n        t.pageDown();\r\n        break;\r\n\r\n      case 39: // 'Right'\r\n        if (t._prefix.active())\r\n          break;\r\n\r\n        const item = t.liveItem(t.position);\r\n        \r\n        if (item[\"further\"] !== undefined) {\r\n          item[\"further\"].bind(item).apply();\r\n        };\r\n        \r\n        e.halt();\r\n        break;\r\n\r\n      case 13: // 'Enter'\r\n        // Click on prefix\r\n        if (t._prefix.active())\r\n          t._prefix.onclick(e);\r\n\r\n        // Click on item\r\n        else\r\n          t.liveItem(t.position).onclick(e);\r\n        e.halt();\r\n        break;\r\n\r\n      case 8: // 'Backspace'\r\n        t._prefix.chop();\r\n        t.show();\r\n        e.halt();\r\n        break;\r\n      };\r\n    },\r\n\r\n\r\n    // Add characters to prefix\r\n    _keypress : function (e) {\r\n      if (e.charCode !== 0) {\r\n        e.halt();\r\n        \r\n        // Add prefix\r\n        this._prefix.add(\r\n          String.fromCharCode(_codeFromEvent(e))\r\n        );\r\n\r\n        this.show();\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Show a screen with a given offset\r\n     * in the viewport.\r\n     */\r\n    screen : function (nr) {\r\n      const t = this;\r\n\r\n      // Normalize negative values\r\n      if (nr < 0) {\r\n        nr = 0\r\n      }\r\n\r\n      // The shown list already shows everything\r\n      else if (t.liveLength() < t.limit()) {\r\n        return false;\r\n      }\r\n\r\n      // Move relatively to the next screen\r\n      else if (nr > (t.liveLength() - t.limit())) {\r\n        nr = (t.liveLength() - t.limit());\r\n      };\r\n\r\n      // no change\r\n      if (t.offset === nr)\r\n        return false;\r\n\r\n      t._showItems(nr);\r\n\r\n      return true;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated dom element.\r\n     */\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the creator class for items\r\n     */\r\n    itemClass : function () {\r\n      return this._itemClass;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get and set the numerical value\r\n     * for the maximum number of items visible.\r\n     */\r\n    limit : function (limit) {\r\n      if (arguments.length === 1) {\r\n        if (this._limit !== limit) {\r\n          this._limit = limit;\r\n          this._slider.limit(limit).reInit();\r\n        };\r\n        return this;\r\n      };\r\n      return this._limit;\r\n    },\r\n\r\n\r\n    /**\r\n     * Filter the list and make it visible.\r\n     * This is always called once the prefix changes.\r\n     *\r\n     * @param {string} Prefix for filtering the list\r\n     */\r\n    show : function (active) {\r\n      //Upon change please also update alwaysmenu.js and containermenu.js (only two lines new there)\r\n      const t = this;\r\n\r\n      // show menu based on initial offset\r\n      t._unmark();     // Unmark everything that was marked before\r\n      t.removeItems();\r\n\r\n      // Initialize the list\r\n      if (!t._initList()) {\r\n\r\n        // The prefix is not active\r\n        t._prefix.active(true);\r\n\r\n        // finally show the element\r\n        t._el.classList.add('visible');\r\n        \r\n        return true;\r\n      };\r\n\r\n      let offset = 0;\r\n\r\n      // Set a chosen value to active and move the viewport\r\n      if (arguments.length === 1) {\r\n\r\n        // Normalize active value\r\n        if (active < 0) {\r\n          active = 0;\r\n        }\r\n        else if (active >= t.liveLength()) {\r\n          active = t.liveLength() - 1;\r\n        };\r\n\r\n        // Item is outside the first viewport\r\n        if (active >= t._limit) {\r\n          offset = active;\r\n          const newOffset = t.liveLength() - t._limit;\r\n          if (offset > newOffset) {\r\n            offset = newOffset;\r\n          };\r\n        };\r\n        \r\n        t.position = active;\r\n      }\r\n\r\n      // Choose the first item\r\n      else if (t._firstActive) {\r\n        t.position = 0;\r\n      }\r\n\r\n      // Choose no item\r\n      else {\r\n        t.position = -1;\r\n      };\r\n\r\n      t.offset = offset;\r\n      t._showItems(offset); // Show new item list\r\n\r\n      // Make chosen value active\r\n      if (t.position !== -1) {\r\n        t.liveItem(t.position).active(true);\r\n      };\r\n\r\n      // The prefix is not active\r\n      t._prefix.active(false);\r\n\r\n      // finally show the element\r\n      t._el.classList.add('visible');\r\n\r\n      // Add classes for rolling menus\r\n      t._boundary(true);\r\n\r\n      return true;\r\n    },\r\n\r\n\r\n    /**\r\n     * Hide the menu and call the onHide callback.\r\n     */\r\n    hide : function () {\r\n      if (!this.dontHide) {\r\n        this.removeItems();\r\n        this._prefix.clear();\r\n        this.onHide();\r\n        this._el.classList.remove('visible');\r\n      }\r\n      // this._el.blur();\r\n    },\r\n\r\n\r\n    /**\r\n     * Function released when the menu hides.\r\n     * This method is expected to be overridden.\r\n     */\r\n    onHide : function () {},\r\n\r\n\r\n    /**\r\n     * Get the prefix for filtering,\r\n     * e.g. &quot;ve&quot; for &quot;verb&quot;\r\n     */\r\n    prefix : function (pref) {\r\n      if (arguments.length === 1) {\r\n        this._prefix.value(pref);\r\n        return this;\r\n      };\r\n      return this._prefix.value();\r\n    },\r\n\r\n    \r\n    /**\r\n     * Get the lengthField object.\r\n     */\r\n    lengthField : function () {\r\n      return this._lengthField;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated slider object.\r\n     */\r\n    slider : function () {\r\n      return this._slider;\r\n    },\r\n\r\n\r\n    /**\r\n     * Delete all visible items from the menu element\r\n     */\r\n    \r\n    removeItems : function () {\r\n      const liElements=this._el.getElementsByTagName(\"LI\");\r\n      var ignoredCount = 0; //counts how many LI tag elements are not actually direct children\r\n      while (liElements.length>ignoredCount){\r\n        if (liElements[ignoredCount].parentNode === this._el){\r\n          this._el.removeChild(liElements[ignoredCount]);\r\n        } else {\r\n          ignoredCount++;\r\n        }\r\n      };\r\n     },\r\n      \r\n\r\n\r\n    /**\r\n     * Get a specific item from the complete list\r\n     *\r\n     * @param {number} index of the list item\r\n     */\r\n    item : function (index) {\r\n      return this._items[index]\r\n    },\r\n\r\n\r\n    /**\r\n     * Get a specific item from the filtered list\r\n     *\r\n     * @param {number} index of the list item\r\n     *        in the filtered list\r\n     */\r\n    liveItem : function (index) {\r\n      if (this._list === undefined)\r\n        if (!this._initList())\r\n          return;\r\n\r\n      return this._items[this._list[index]];\r\n    },\r\n\r\n\r\n    /**\r\n     * Get a specific item from the viewport list\r\n     *\r\n     * @param {number} index of the list item\r\n     *        in the visible list\r\n     */\r\n    shownItem : function (index) {\r\n      if (index >= this.limit())\r\n        return;\r\n\r\n      return this.liveItem(this.offset + index);\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the length of the full item list\r\n     */\r\n    length : function () {\r\n      return this._items.length;\r\n    },\r\n\r\n\r\n    /**\r\n     * Length of the filtered item list.\r\n     */\r\n    liveLength : function () {\r\n      if (this._list === undefined)\r\n        this._initList();\r\n      return this._list.length;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Make the next item in the filtered menu active\r\n     */\r\n    next : function () {\r\n      //Upon change please update alwaysmenu.js next\r\n      const t = this;\r\n\r\n      // No list\r\n      if (t.liveLength() === 0)\r\n        return;\r\n\r\n      // Deactivate old item\r\n      if (t.position !== -1 && !t._prefix.active()) {\r\n        t.liveItem(t.position).active(false);\r\n      };\r\n\r\n      // Get new active item\r\n      t.position++;\r\n      let newItem = t.liveItem(t.position);\r\n\r\n      // The next element is undefined - roll to top or to prefix\r\n      if (newItem === undefined) {\r\n\r\n        // Activate prefix\r\n        const prefix = this._prefix;\r\n\r\n        // Prefix is set and not active - choose!\r\n        if (prefix.isSet() && !prefix.active()) {\r\n          t.position--;\r\n          prefix.active(true);\r\n          return;\r\n        }\r\n\r\n        // Choose first item\r\n        else {\r\n          newItem = t.liveItem(0);\r\n          // choose first item\r\n          t.position = 0;\r\n          t._showItems(0);\r\n        };\r\n      }\r\n\r\n      // The next element is after the viewport - roll down\r\n      else if (t.position >= (t.limit() + t.offset)) {\r\n        t.screen(t.position - t.limit() + 1);\r\n      }\r\n\r\n      // The next element is before the viewport - roll up\r\n      else if (t.position <= t.offset) {\r\n        t.screen(t.position);\r\n      };\r\n\r\n      t._prefix.active(false);\r\n      newItem.active(true);\r\n    },\r\n\r\n\r\n    /*\r\n     * Make the previous item in the menu active\r\n     */\r\n    prev : function () {\r\n      //Upon Change please update alwaysmenu.js prev\r\n      const t = this;\r\n\r\n      // No list\r\n      if (t.liveLength() === 0)\r\n        return;\r\n\r\n      // Deactivate old item\r\n      if (!t._prefix.active()) {\r\n\r\n        // No active element set\r\n        if (t.position === -1) {\r\n          t.position = t.liveLength();\r\n        }\r\n\r\n        // No active element set\r\n        else {\r\n          t.liveItem(t.position--).active(false);\r\n        };\r\n      };\r\n\r\n      // Get new active item\r\n      let newItem = t.liveItem(t.position);\r\n\r\n      // The previous element is undefined - roll to bottom\r\n      if (newItem === undefined) {\r\n\r\n        // Activate prefix\r\n        const prefix = t._prefix;\r\n        let offset =  t.liveLength() - t.limit();\r\n        \r\n        // Normalize offset\r\n        offset = offset < 0 ? 0 : offset;\r\n\r\n        // Choose the last item\r\n        t.position = t.liveLength() - 1;\r\n        \r\n        // Prefix is set and not active - choose!\r\n        if (prefix.isSet() && !prefix.active()) {\r\n          t.position++;\r\n          prefix.active(true);\r\n          t.offset = offset;\r\n          return;\r\n        }\r\n\r\n        // Choose last item\r\n        else {\r\n          newItem = t.liveItem(t.position);\r\n          t._showItems(offset);\r\n        };\r\n      }\r\n\r\n      // The previous element is before the view - roll up\r\n      else if (t.position < t.offset) {\r\n        t.screen(t.position);\r\n      }\r\n\r\n      // The previous element is after the view - roll down\r\n      else if (t.position >= (t.limit() + t.offset)) {\r\n        t.screen(t.position - t.limit() + 2);\r\n      };\r\n\r\n      t._prefix.active(false);\r\n      newItem.active(true);\r\n    },\r\n\r\n\r\n    /**\r\n     * Move the page up by limit!\r\n     */\r\n    pageUp : function () {\r\n      this.screen(this.offset - this.limit());\r\n    },\r\n\r\n\r\n    /**\r\n     * Move the page down by limit!\r\n     */\r\n    pageDown : function () {\r\n      this.screen(this.offset + this.limit());\r\n    },\r\n\r\n\r\n    /**\r\n     * Move the view one item up\r\n     */\r\n    viewUp : function () {\r\n      this.screen(this.offset - 1);\r\n    },\r\n\r\n\r\n    /**\r\n     * Move the view one item down\r\n     */\r\n    viewDown : function () {\r\n      this.screen(this.offset + 1);\r\n    },\r\n\r\n\r\n    // Unmark all items\r\n    _unmark : function () {\r\n      this._list.forEach(function(it){\r\n        const item = this._items[it];\r\n        item.lowlight();\r\n        item.active(false);\r\n      }, this);\r\n    },\r\n\r\n\r\n    // Set boundary for viewport\r\n    _boundary : function (bool) {\r\n      if (this._list.length === 0)\r\n        return;\r\n\r\n      this.item(this._list[0]).noMore(bool);\r\n      this.item(this._list[this._list.length - 1]).noMore(bool);\r\n    },\r\n\r\n\r\n    // Append Items that should be shown\r\n    _showItems : function (off) {\r\n      const t = this;\r\n\r\n      // optimization: scroll down one step\r\n      if (t.offset === (off - 1)) {\r\n        t.offset = off;\r\n\r\n        // Remove the HTML node from the first item\r\n        // leave lengthField/prefix/slider\r\n        //console.log(\"_showItems, at _notItemElements is: \",t._el.children[this._notItemElements]);\r\n        t._el.removeChild(t._el.children[this._notItemElements]);\r\n\r\n        t._append(\r\n          t._list[t.offset + t.limit() - 1]\r\n        );\r\n      }\r\n\r\n      // optimization: scroll up one step\r\n      else if (t.offset === (off + 1)) {\r\n        t.offset = off;\r\n\r\n        // Remove the HTML node from the last item\r\n        //console.log(\"_showItems, at lastChild is: \",t._el.lastChild);\r\n        t._el.removeChild(t._el.lastChild);\r\n\r\n        t._prepend(t._list[t.offset]);\r\n      }\r\n\r\n      else {\r\n        t.offset = off;\r\n\r\n        // Remove all items\r\n        t.removeItems();\r\n\r\n        // Use list\r\n        let shown = 0;\r\n\r\n        for (let i = 0; i < t._list.length; i++) {\r\n\r\n          // Don't show - it's before offset\r\n          shown++;\r\n          if (shown <= off)\r\n            continue;\r\n\r\n          t._append(t._list[i]);\r\n          \r\n          if (shown >= (t.limit() + off))\r\n            break;\r\n        };\r\n      };\r\n\r\n      // set the slider to the new offset\r\n      t._slider.offset(t.offset);\r\n    },\r\n\r\n\r\n    // Append item to the shown list based on index\r\n    _append : function (i) {\r\n      const item = this.item(i);\r\n\r\n      // Highlight based on prefix\r\n      if (this.prefix().length > 0) {\r\n        item.highlight(this.prefix().toLowerCase());\r\n      };\r\n\r\n      // Append element\r\n      this.element().appendChild(item.element());\r\n    },\r\n\r\n\r\n    // Prepend item to the shown list based on index\r\n    _prepend : function (i) {\r\n      const item = this.item(i);\r\n\r\n      // Highlight based on prefix\r\n      if (this.prefix().length > 0) {\r\n        item.highlight(this.prefix().toLowerCase());\r\n      };\r\n\r\n      const e = this.element();\r\n\r\n      // Append element after lengthField/prefix/slider\r\n      e.insertBefore(\r\n        item.element(),\r\n        e.children[this._notItemElements]\r\n      );\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Menu to choose from in a button group.\r\n */\r\n\r\n\r\n// TODO:\r\n//   Add addToggle() method\r\n\r\ndefine('buttongroup/menu',['menu'], function (menuClass) {\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new menu object.\r\n     * Pass the list of items and the itemClass.\r\n     */\r\n    create : function (list, itemClass) {\r\n      const obj = Object.create(menuClass)\r\n\t          .upgradeTo(this)\r\n\t          ._init(list, {itemClass : itemClass});\r\n      obj.limit(6);\r\n\r\n      const e = obj.element();\r\n\r\n      // This is only domspecific\r\n      e.addEventListener('blur', function (e) {\r\n\tthis.menu.hide();\r\n      });\r\n\r\n      e.classList.add('button-group-list');\r\n\r\n      // Add menu to body\r\n      document.getElementsByTagName('body')[0].appendChild(e);\r\n\r\n      this._left = false;\r\n      this._below = false;\r\n      this._outside = false;\r\n\r\n      return obj;\r\n    },\r\n\r\n    /**\r\n     * Open the menu at a certain position\r\n     * relative to the button.\r\n     */\r\n    openAt : function (left, below, outside) {\r\n      this._left = left ? true : false;\r\n      this._below = below ? true : false;\r\n      this._outside = outside ? true : false;\r\n    },\r\n\r\n    /**\r\n     * The panel object of the menu,\r\n     * in case the menu was spawned by a panel.\r\n     */\r\n    panel : function (panelVar) {\r\n      if (panelVar !== undefined)\r\n        this._panel = panelVar;\r\n\r\n      return this._panel;\r\n    },\r\n\r\n\r\n    // Attach menu to button\r\n    button : function (btn) {\r\n\r\n      this._button = btn;\r\n\r\n      this._repos(this._button);\r\n      this.slider().reInit();\r\n\r\n      /*\r\n       * This is a suboptimal scrolling solution, see\r\n       * see https://developer.mozilla.org/docs/Mozilla/Performance/ScrollLinkedEffects\r\n       */\r\n      if (this._onscroll !== undefined) {\r\n        window.removeEventListener('scroll', this._onscroll);\r\n      };\r\n\r\n      this._onscroll = function () {\r\n        this._repos(this._button);\r\n      }.bind(this);\r\n      \r\n      window.addEventListener('scroll', this._onscroll);\r\n    },\r\n\r\n\r\n    /**\r\n     * Add button in order\r\n     * \r\n     * Returns the button element\r\n     */\r\n    add : function (title, data, cb) {\r\n\r\n      let that = this;\r\n\r\n      const cbWrap = function (e) {\r\n\r\n        // Call callback\r\n        let obj = that._bind || this;\r\n        obj.button = b;\r\n        cb.apply(obj)\r\n      };\r\n\r\n      // TODO:\r\n      //   support classes, data-icon and state in itemClass!\r\n      const b = this.itemClass().create([title, title, cbWrap]);\r\n      this.append(b);\r\n      return b;\r\n    },\r\n    \r\n    // Overwrite onHide method\r\n    onHide : function () {\r\n\r\n      // Remove listener\r\n      if (this._onscroll !== undefined) {\r\n        window.removeEventListener('scroll', this._onscroll);\r\n      };\r\n      this.element().blur();\r\n    },\r\n\r\n    _repos : function (e) {\r\n      const bounding = e.getBoundingClientRect();\r\n      const s = this._el.style;\r\n\r\n      let left = window.pageXOffset;\r\n      let top = 0;\r\n\r\n      s.right = 'auto';\r\n      s.bottom = 'auto';\r\n\r\n      left += bounding.left;\r\n      \r\n      if (this._left) {\r\n        left += bounding.width - this._el.clientWidth\r\n      };\r\n\r\n      if (this._below) {\r\n        top += bounding.bottom;\r\n        \r\n        if (!this._outside) {\r\n          top -= bounding.height;\r\n        };\r\n\r\n      } else {\r\n        top -= this._el.clientHeight;\r\n        if (this._outside) {\r\n          top += bounding.top;\r\n        } else {\r\n          top += bounding.bottom;\r\n        };\r\n      };\r\n\r\n      s.left = left + \"px\";\r\n      s.top = top + \"px\";\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('buttongroup',['buttongroup/menu','menu/item','util'], function (treeMenuClass, defaultItemClass) {\r\n  \r\n  return {\r\n    /**\r\n     * Create button group\r\n     */\r\n    create : function (classes) {\r\n      return Object.create(this)._init(classes);\r\n    },\r\n\r\n    /**\r\n     * Adopt existing button group element\r\n     */\r\n    adopt : function (element) {\r\n      const obj = Object.create(this);\r\n      obj._el = element;\r\n      return obj;\r\n    },\r\n\r\n    // Initialize button group\r\n    _init : function (classes) {\r\n      const e = document.createElement('div');\r\n      const cl = e.classList;\r\n      if (classes) {\r\n        cl.add.apply(cl,classes);\r\n        classes.forEach(i => {\r\n          switch (i) {\r\n          case \"open-menu-below\" : {\r\n            this._omBelow = true;\r\n            break;\r\n          }\r\n          case \"open-menu-outside\" : {\r\n            this._omOutside = true;\r\n            break;\r\n          }\r\n          case \"open-menu-left\" : {\r\n            this._omLeft = true;\r\n          }\r\n          }\r\n        })\r\n      };\r\n      cl.add('button-group');\r\n      this._el = e;\r\n      return this;\r\n    },\r\n    \r\n    /**\r\n     * Return main element\r\n     */\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n    /**\r\n     * Define element following newly added buttons.\r\n     */\r\n    anchor : function (anchor) {\r\n      if (anchor !== null && anchor.parentNode == this._el) {\r\n        this._anchor = anchor;\r\n        return true;\r\n      };\r\n      return false;\r\n    },\r\n    \r\n\r\n    _insert : function (tag = 'span') {\r\n      const span = document.createElement(tag);\r\n      if (this._anchor) {\r\n        this._el.insertBefore(span, this._anchor);\r\n        return span;\r\n      }\r\n      return this._el.appendChild(span);\r\n    },\r\n    \r\n    /**\r\n     * Add button in order\r\n     * \r\n     * Returns the button element\r\n     */\r\n    add : function (title, data, cb) {\r\n      const b = this._insert('span');\r\n      b.setAttribute('title',title);\r\n\r\n      if (data !== undefined) {\r\n        if (data['cls'] !== undefined) {\r\n          b.classList.add.apply(b.classList, data['cls']);\r\n        };\r\n     \r\n        if (data['icon'] !== undefined) { \r\n          b.setAttribute('data-icon', data['icon']);\r\n        };\r\n\r\n        if (data['state'] !== undefined) {\r\n          b['state'] = data['state'];\r\n        }\r\n      };\r\n     \r\n      b.addE('span').addT(title);\r\n\r\n      let that = this;\r\n      b.addEventListener('click', function (e) {\r\n\r\n        // Do not bubble\r\n        e.halt();\r\n        \r\n        // Call callback\r\n        let obj = that._bind || this;\r\n        obj.button = b;\r\n        cb.apply(obj, e)\r\n      });\r\n\r\n      return b;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Add button that spawns a list in order.\r\n     * \r\n     * Returns the list object.\r\n     */\r\n    addList : function (title, data, itemClass = defaultItemClass) {\r\n      const list = treeMenuClass.create([], itemClass);\r\n\r\n      list.openAt(\r\n        this._omLeft ? true : false,\r\n        this._omBelow ? true : false,\r\n        this._omOutside ? true : false,\r\n      );\r\n      \r\n      let b = this.add(title, data, function (e) {\r\n        list.show();\r\n        list.button(this.button);\r\n        list.focus();\r\n      });\r\n      b.list = list;\r\n      return b;\r\n    },\r\n\r\n    /**\r\n     * Add button that can toggle a state.\r\n     * The state has to be a state object.\r\n     */\r\n    /*\r\n     * addToggle() should be removed in favor of add(toggleObj)\r\n     * or similar, so the API of buttongroups and lists is similar\r\n     * for use as action plugins.\r\n     */\r\n    addToggle : function (title, data, state) {\r\n      const b = this._insert('span');\r\n      b.setAttribute('title',title);\r\n\r\n      if (data != undefined) {\r\n        if (data['cls'] !== undefined) {\r\n          b.classList.add.apply(\r\n            b.classList,\r\n            data['cls']\r\n          );\r\n        };\r\n      };\r\n\r\n      // Set check marker\r\n      const check = b.addE('span');\r\n      check.classList.add(\"check\", \"button-icon\");\r\n      check.addE('span');\r\n\r\n      // Associate this object to state\r\n      // Add setState method to object\r\n      check.setState = function (value) {\r\n        if (value) {\r\n          this.classList.add(\"checked\");\r\n        } else {\r\n          this.classList.remove(\"checked\");\r\n        }\r\n      };\r\n      state.associate(check);\r\n\r\n      b.addE('span').addT(title);\r\n      \r\n      let that = this;\r\n      b.addEventListener('click', function (e) {\r\n\r\n        // Do not bubble\r\n        e.halt();\r\n        \r\n        // Toggle state\r\n        state.roll();\r\n      });\r\n\r\n      return b;\r\n    },\r\n\r\n    /**\r\n     * Bind an object to all callbacks of the button group. \r\n     * To get the button element inside the callback, \r\n     * use this.button\r\n     */\r\n    bind : function (obj) {\r\n      if (obj !== undefined) {\r\n        this._bind = obj;\r\n        return this;\r\n      };\r\n      return this._bind || this;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Remove all defined buttons\r\n     */\r\n    clear : function () {\r\n      _removeChildren(this._el);\r\n      return this;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Operators for criteria\r\n */\r\n\r\n\r\ndefine('vc/operators',['buttongroup'], function (buttonGroupClass) {\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.DEL   = loc.DEL   || '×';\r\n\r\n  // Utility for analysing boolean values\r\n  function _bool (bool) {\r\n    return (\r\n      bool === undefined ||\r\n        bool === null ||\r\n        bool === false) ? false : true;\r\n  };\r\n\r\n\r\n  // Add new unspecified document\r\n  function _add (obj, type) {\r\n    const parent = obj.parent();\r\n\r\n    if (obj.ldType() === 'docGroup') {\r\n\r\n      // Check that the action differs from the type\r\n      if (obj.operation() === type)\r\n\t      return;\r\n\r\n      if (parent.ldType() !== null) {\r\n\t      return parent.newAfter(obj);\r\n      }\r\n\r\n      else {\r\n\t      // The group is on root - wrap\r\n\t      return obj.wrapOnRoot();\r\n      };\r\n    }\r\n\r\n    else if (obj.ldType() === 'doc' ||\r\n             obj.ldType() === 'docGroupRef') {\r\n\r\n      if (parent.ldType() === null) {\r\n\t      return obj.wrapOnRoot(type);\r\n      }\r\n\r\n      else if (parent.operation() === type) {\r\n\t      return parent.newAfter(obj);\r\n      }\r\n\r\n      else {\r\n\t      return obj.wrap(type);\r\n      };\r\n    };\r\n  };\r\n\r\n\r\n  // Add doc with 'and' relation\r\n  KorAP._and = function () {\r\n    return _add(this, 'and');\r\n  };\r\n\r\n\r\n  // Add doc with 'or' relation\r\n  KorAP._or = function () {\r\n    return _add(this, 'or');\r\n  };\r\n\r\n\r\n  // Remove doc or docGroup\r\n  KorAP._delete = function () {\r\n    if (this.parent().ldType() !== null) {\r\n      return this.parent().delOperand(this).update();\r\n    }\r\n    else {\r\n      this.parent().clean();\r\n    };\r\n  };\r\n\r\n\r\n  return {\r\n    create : function (and, or, del) {\r\n      \r\n      // Inherit from buttonGroupClass\r\n      var op = Object(buttonGroupClass).create(['operators']).upgradeTo(this);\r\n      op.and(and);\r\n      op.or(or);\r\n      op.del(del);\r\n      op.update();\r\n\r\n      return op;\r\n    },\r\n\r\n\r\n    /*\r\n     * Update the element\r\n     */\r\n    update : function () {\r\n      const t = this;\r\n\r\n      // Clear button group\r\n      t.clear();\r\n\r\n      if (t._and === true) {\r\n        t.add(loc.AND, {'cls':['and']}, KorAP._and);\r\n      };\r\n\r\n      // Add or button\r\n      if (t._or === true) {\r\n        t.add(loc.OR, {'cls':['or']}, KorAP._or);\r\n      };\r\n\r\n      // Add delete button\r\n      if (t._del === true) {\r\n        t.add(loc.DEL, {'cls':['delete']}, KorAP._delete);\r\n      };\r\n\r\n      return t.element();\r\n    },\r\n\r\n\r\n    // Be aware! This may be cyclic\r\n    // This is somehow redundant with bind, but relevant for ldTypes\r\n    parent : function (obj) {\r\n      if (arguments.length === 1) {\r\n\t      this._parent = obj;\r\n\r\n        // This is somehow duplicate - but it's not that relevant\r\n        this.bind(obj);\r\n      };\r\n\r\n      return this._parent;\r\n    },\r\n\r\n\r\n    and : function (bool) {\r\n      if (arguments.length === 1)\r\n\t      this._and = _bool(bool);\r\n      return this._and;\r\n    },\r\n\r\n\r\n    or : function (bool) {\r\n      if (arguments.length === 1)\r\n\t      this._or = _bool(bool);\r\n      return this._or;\r\n    },\r\n\r\n\r\n    del : function (bool) {\r\n      if (arguments.length === 1)\r\n\t      this._del = _bool(bool);\r\n      return this._del;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Abstract JsonLD criterion object\r\n */\r\n\r\n\r\ndefine('vc/jsonld',['vc/operators'], function (operatorsClass) {\r\n\r\n  return {\r\n\r\n    __changed : false,\r\n    \r\n    create : function () {\r\n      return Object.create(this);\r\n    },\r\n\r\n\r\n    ldType : function (type) {\r\n      if (arguments.length === 1)\r\n\t      this._ldType = type;\r\n      return this._ldType;\r\n    },\r\n    \r\n\r\n    parent : function (obj) {\r\n      if (arguments.length === 1) {\r\n\t      this._parent = obj;\r\n\t      this.__changed = true;\r\n      };\r\n      return this._parent;\r\n    },\r\n\r\n\r\n    // Destroy object - especially for\r\n    // acyclic structures!\r\n    // I'm paranoid!\r\n    destroy : function () {\r\n      const t = this;\r\n      if (t._ops != undefined) {\r\n\t      t._ops._parent = undefined;\r\n\t      if (t._ops._el !== undefined) {\r\n\t        t._ops._el.refTo = undefined;\r\n        };\r\n\t      t._ops = undefined;\r\n      };\r\n\r\n      if (t._el !== undefined)\r\n\t      t._el = undefined;\r\n      \r\n      // In case of a group, destroy all operands\r\n      if (t._operands !== undefined) {\r\n        t._operands.forEach(i => i.destroy());\r\n\t      t._operands = [];\r\n      };\r\n    },\r\n    \r\n    // Wrap a new operation around the root group element \r\n    wrapOnRoot : function (op) {\r\n      const parent = this.parent();\r\n      const group = require('vc/docgroup').create(parent);\r\n\r\n      if (arguments.length === 1)\r\n\t      group.operation(op);\r\n      else\r\n\t      group.operation(\r\n\t        this.operation() === 'and' ? 'or' : 'and'\r\n\t      );\r\n      group.append(this);\r\n      this.parent(group);\r\n      group.append();\r\n      group.element(); // Init (seems to be necessary)\r\n      parent.root(group);\r\n      return this.parent();\r\n    },\r\n\r\n\r\n    // Be aware! This may be cyclic\r\n    operators : function (and, or, del) {\r\n      if (arguments === 0)\r\n\t      return this._ops;\r\n\r\n      this._ops = operatorsClass.create(\r\n\t      and, or, del\r\n      );\r\n\r\n      this._ops.parent(this);\r\n      return this._ops;\r\n    },\r\n\r\n\r\n    toJson : function () {\r\n      return {\r\n\t      // Unspecified object\r\n\t      \"@type\" : \"koral:\" + this.ldType()\r\n      };\r\n    },\r\n\r\n\r\n    rewrites : function () {\r\n      return null;\r\n    },\r\n\r\n\r\n    incomplete : function () {\r\n      return false;\r\n    },\r\n\r\n\r\n    toQuery : function () {\r\n      return '';\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Implementation of rewrite objects.\r\n */\r\n\r\n\r\ndefine('vc/rewrite',['vc/jsonld', 'util'], function (jsonldClass) {\r\n\r\n  // injection, modification, and deletion should probably be enough\r\n  const _validRewriteOpRE =\r\n        new RegExp(\"^(operation:)?(?:injec|inser|modifica|dele)tion|override$\");\r\n\r\n  return {\r\n\r\n    // Construction method\r\n    create : function (json) {\r\n      return Object(jsonldClass).\r\n\t      create().\r\n\t      upgradeTo(this).\r\n\t      fromJson(json);\r\n    },\r\n\r\n\r\n    // Get or set source\r\n    src : function (string) {\r\n      if (arguments.length === 1)\r\n\t      this._src = string;\r\n      return this._src;\r\n    },\r\n    \r\n\r\n    // Get or set operation\r\n    operation : function (op) {\r\n      if (arguments.length === 1) {\r\n\t      if (_validRewriteOpRE.test(op)) {\r\n\t        this._op = op;\r\n\t      }\r\n\t      else {\r\n\t        KorAP.log(814, \"Unknown rewrite operation\");\r\n\t        return;\r\n\t      };\r\n      };\r\n      return this._op || 'injection';\r\n    },\r\n\r\n\r\n    // Get or set scope\r\n    scope : function (attr) {\r\n      if (arguments.length === 1)\r\n\t      this._scope = attr;\r\n      return this._scope;\r\n    },\r\n\r\n\r\n    // Serialize from Json\r\n    fromJson : function (json) {\r\n      if (json === undefined)\r\n\t      return this;\r\n      \r\n      // Missing @type\r\n      if (json[\"@type\"] === undefined) {\r\n\t      KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n\t      return;\r\n      };\r\n      \r\n      // Missing source\r\n      if (json[\"src\"] === undefined ||\r\n\t        typeof json[\"src\"] !== 'string') {\r\n\t      KorAP.log(815, \"Rewrite expects source\");\r\n\t      return;\r\n      };\r\n\r\n      // Set source\r\n      this.src(json[\"src\"]);\r\n\r\n      // Set operation\r\n      if (json[\"operation\"] !== undefined) {\r\n\t      this.operation(json[\"operation\"].replace(/^operation:/,''));\r\n      };\r\n\r\n      // Set scope\r\n      if (json[\"scope\"] !== undefined &&\r\n\t        typeof json[\"scope\"] === 'string')\r\n\t      this.scope(json[\"scope\"]);\r\n\r\n      return this;\r\n    },\r\n    \r\n\r\n    toString : function () {\r\n      let str = '';\r\n      const op = this.operation();\r\n      str += op.charAt(0).toUpperCase() + op.slice(1);\r\n      str += ' of ' + (\r\n\t      this._scope === null ?\r\n\t        'object' :\r\n\t        this.scope().quote()\r\n      );\r\n      str += ' by ' + this.src().quote();\r\n      return str;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('vc/rewritelist',['vc/jsonld', 'vc/rewrite','util'], function (jsonldClass, rewriteClass) {\r\n  return {\r\n\r\n    // Construction method\r\n    create : function (json) {\r\n      return Object(jsonldClass).\r\n\t      create().\r\n\t      upgradeTo(this).\r\n\t      fromJson(json);\r\n    },\r\n\r\n\r\n    /**\r\n     * Deserialize from KoralQuery\r\n     */\r\n    fromJson : function (json) {\r\n      this._list = new Array();\r\n      json.forEach(\r\n        i => \r\n\t        this._list.push(\r\n\t          rewriteClass.create(i)\r\n\t        )\r\n      );\r\n      return this;\r\n    },\r\n\r\n\r\n    length : function () {\r\n      return this._list.length;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get element.\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n\t      return this._el;\r\n\r\n      const e = this._el = document.createElement('div');\r\n      e.setAttribute('class', 'rewrite');\r\n\r\n      const comments = [];\r\n      let span, rewriteText;\r\n      this._list.forEach(function (rewrite) {\r\n\t    \r\n        // This is a blind element\r\n\t      span = document.createElement('span');\r\n\r\n\t      // Set class attribute\r\n\t      span.setAttribute('class', rewrite.operation());\r\n\r\n\t      // Append source information\r\n\t      rewriteText = rewrite.src();\r\n\r\n\t      // Append scope information\r\n\t      if (rewrite.scope() !== undefined) {\r\n\t        rewriteText += ': ' + rewrite.scope();\r\n\t      };\r\n\r\n\t      // Append source information\r\n\t      span.addT(rewriteText);\r\n\r\n        comments.push(rewriteText + ' (' + rewrite.operation() + ')');\r\n        \r\n\t      this._el.appendChild(span);\r\n      }, this);\r\n\r\n      e.setAttribute(\"title\", comments.join(\"\\n\"))\r\n\r\n      return e;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Add string values to the virtual corpus\r\n */\r\n\r\n\r\ndefine('vc/stringval',['util'], function () {\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.REGEX      = loc.REGEX      || 'RegEx';\r\n  loc.REGEX_DESC = loc.REGEX_DESC || 'Use a regular expression';\r\n\r\n  return {\r\n    /**\r\n     * Create new string value helper.\r\n     */\r\n    create : function () {\r\n      const a = arguments;\r\n      let regexOp = true,\r\n          regex = false,\r\n          value = '';\r\n\r\n      // Set value\r\n      if (a.length >= 1) {\r\n        if (a[0] !== undefined)\r\n          value = a[0];\r\n      };\r\n\r\n      // Set regex\r\n      if (a.length >= 2) {\r\n        if (a[1] !== undefined)\r\n          regex = a[1];\r\n      };\r\n\r\n      // Set regexOp\r\n      if (a.length >= 3) {\r\n        regexOp = a[2];\r\n        if (regexOp === false) {\r\n          regex = false;\r\n        }\r\n      };\r\n      return Object.create(this)._init(value, regex, regexOp);\r\n    },\r\n    \r\n\r\n    // Initialize the string value\r\n    _init : function (value, regex, regexOp) {\r\n      this.value(value);\r\n      this.regex(regex);\r\n      this._regexOp(regexOp);\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the regex boolean value.\r\n     *\r\n     * @param bool Either true or false\r\n     */\r\n    regex : function (bool) {\r\n      if (arguments.length === 1) {\r\n\t      this._regex = bool ? true : false;\r\n        this._update();\r\n      };\r\n      return this._regex;\r\n    },\r\n\r\n\r\n    _regexOp : function (regexOp) {\r\n      if (arguments.length === 1) {\r\n        this.__regexOp = regexOp ? true : false;\r\n        this._update();\r\n      };\r\n      return this.__regexOp;\r\n    },\r\n\r\n\r\n    /**\r\n     * Toggle the regex, make it either true,\r\n     * if it is false, or make it false, if it is true.\r\n     */\r\n    toggleRegex : function () {\r\n      this.regex(this._regex === false ? true : false);\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get or set the string value.\r\n     */\r\n    value : function (val) {\r\n      if (arguments.length === 1) {\r\n        this._value = val;\r\n        // this._input.value = val;\r\n        this._update();\r\n      };\r\n      return this._value;\r\n    },\r\n\r\n\r\n    // Update dom element\r\n    _update : function () {\r\n      if (this._el === undefined)\r\n        return;\r\n      \r\n      this._value = this._input.value;\r\n\r\n      const cl = this._el.classList;\r\n\r\n      if (this._regexOp() && this._regex) {\r\n        cl.add('regex');\r\n      }\r\n      else {\r\n        cl.remove('regex');\r\n      };\r\n    },\r\n    \r\n\r\n    /**\r\n     * Store the string value.\r\n     * This method should be overwritten.\r\n     * The method receives the value and the regex.\r\n     */\r\n    store : function (v,r) {},\r\n\r\n\r\n    /**\r\n     * Put focus on element\r\n     */\r\n    focus : function () {\r\n      this._el.children[0].focus();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated dom element.\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      // Create element\r\n      const e = this._el = document.createElement('div');\r\n      e.setAttribute('tabindex', 0);\r\n      e.style.outline = 0;\r\n\r\n      const cl = e.classList;\r\n      cl.add('value');\r\n      if (this.regex() === true)\r\n        cl.add('regex');\r\n      \r\n      // Add input field\r\n      this._input = e.addE('input');\r\n\r\n      if (this.value() !== undefined) {\r\n        this._input.value = this.value();\r\n      };\r\n\r\n      // Add regex button\r\n      if (this._regexOp()) {\r\n        const re = e.addE('div');\r\n        re.addEventListener(\r\n          'click',\r\n          function () {\r\n\t          this.toggleRegex();\r\n            // ev.halt();\r\n          }.bind(this),\r\n          true\r\n        );\r\n        re.setAttribute(\"title\", \"Use as regular expression\");\r\n        re.addT('RegEx');\r\n      };\r\n\r\n      // If the focus is not on the text field anymore,\r\n      // delegate focus to\r\n      this._input.addEventListener(\r\n        'blur',\r\n        function (ev) {\r\n          const t = this;\r\n          if (!t._inField) {\r\n\t          t.value(t._input.value);\r\n            t.store(t.value(), t.regex());\r\n          };\r\n          ev.halt();\r\n        }.bind(this)\r\n      );\r\n\r\n      // Workaround to check the click is in the field\r\n      e.addEventListener(\r\n        'mousedown',\r\n        function () {\r\n          this._inField = true;\r\n        }.bind(this)\r\n      );\r\n\r\n      e.addEventListener(\r\n        'mouseup',\r\n        function () {\r\n          this._inField = false;\r\n          this._input.focus();\r\n        }.bind(this)\r\n      );\r\n\r\n      this._input.addEventListener(\r\n        'keypress',\r\n        function (ev) {\r\n          const t = this;\r\n\t        if (ev.keyCode == 13) {\r\n\t          t.value(t._input.value);\r\n\t          t.store(t.value(), t.regex());\r\n            return false;\r\n\t        };\r\n        }.bind(this)\r\n      );\r\n\r\n      // Add store button\r\n      /*\r\n        e.appendChild(\r\n        document.createElement('div')\r\n        ).addEventListener('click', function () {\r\n        this.store(this.value(), this.regex());\r\n        }.bind(this));\r\n      */\r\n      return e;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * A reference to another VC.\r\n * Inherits everything from jsonld\r\n */\r\n\r\n\r\ndefine('vc/docgroupref',[\r\n  'vc/jsonld',\r\n  'vc/rewritelist',\r\n  'vc/stringval',\r\n  'util'\r\n], function (jsonldClass, rewriteListClass, stringValClass) {\r\n\r\n  // TODO:\r\n  //   Does not support rewrites currently\r\n  \r\n  const loc = KorAP.Locale;\r\n  loc.EMPTY = loc.EMPTY || '⋯';\r\n\r\n  return {\r\n\r\n    // The ld-type\r\n    _ldType : \"docGroupRef\",\r\n\r\n    /**\r\n     * Create new unspecified criterion\r\n     * with a link to the parent object\r\n     */\r\n    create : function (parent, json) {\r\n      const obj = Object(jsonldClass).\r\n            create().\r\n\t          upgradeTo(this).\r\n            fromJson(json);\r\n      \r\n      if (obj === undefined)\r\n        console.log(json);\r\n\r\n      if (parent !== undefined)\r\n\t      obj._parent = parent;\r\n      \r\n      obj.__changed = true;\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the element\r\n     */\r\n    update : function () {\r\n      const t = this;\r\n\r\n      if (t._el === undefined)\r\n        return t.element();\r\n\r\n      const e = t._el;\r\n\r\n      // Check if there is a change in the underlying data\r\n      if (!t.__changed)\r\n        return e;\r\n\r\n      // Set ref - TODO: Cleanup!\r\n      e.refTo = t;\r\n     \r\n      // Was rewritten\r\n      if (t.rewrites() !== undefined) {\r\n        e.classList.add(\"rewritten\");\r\n      };\r\n     \r\n      const refTitle = document.createElement('span');\r\n      refTitle.classList.add('key','fixed', 'ref');\r\n      refTitle.addT('referTo');\r\n\r\n      // Added value operator\r\n      const refE = t._refE = document.createElement('span');\r\n      refE.setAttribute('data-type', \"string\");\r\n      refE.setAttribute('class', 'value');\r\n\r\n      if (this.ref()) {\r\n        refE.addT(t.ref());\r\n      }\r\n      else {\r\n        refE.addT(loc.EMPTY);\r\n        refE.classList.add('unspecified');\r\n      };\r\n\r\n      // Change value\r\n      refE.addEventListener(\r\n        'click',\r\n        t._changeRef.bind(t)\r\n      );\r\n\r\n      // Remove all element children\r\n      _removeChildren(e);\r\n\r\n      // Add spans\r\n      e.appendChild(refTitle);\r\n      e.appendChild(refE);\r\n\r\n      t.__changed = false;\r\n\r\n      if (t._rewrites !== undefined) {\r\n        e.appendChild(t._rewrites.element());\r\n      };\r\n     \r\n      if (t._parent !== undefined) {\r\n\r\n        // Set operators\r\n        // Append new operators\r\n        e.appendChild(t.operators(\r\n          true,\r\n          true,\r\n          true\r\n        ).element());\r\n      };  \r\n\r\n      if (KorAP.vc !== undefined) {\r\n        KorAP.vc.element().dispatchEvent(\r\n          new CustomEvent('vcChange', { 'detail' : t })\r\n        );\r\n      };\r\n      \r\n      return t.element();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated element\r\n     */\r\n    element : function () {\r\n\r\n      if (this._el !== undefined)\r\n\t      return this._el;\r\n\r\n      const e = this._el = document.createElement('div');\r\n      e.setAttribute('class', 'doc groupref');\r\n      this.update();\r\n      return e;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the value\r\n     */\r\n    ref : function (ref) {\r\n      if (arguments.length === 1) {\r\n        this._ref = ref;\r\n        this._changed();\r\n        return this;\r\n      };\r\n      return this._ref;\r\n    },\r\n\r\n\r\n    // Click on the reference operator, show me the option\r\n    _changeRef : function (e) {\r\n      const that = this;\r\n      const str = stringValClass.create(this.ref(), false, false);\r\n      const strElem = str.element();\r\n\r\n      str.store = function (ref, regex) {\r\n        that.ref(ref);\r\n          \r\n        that._el.removeChild(\r\n          this._el\r\n        );\r\n        that.update();\r\n      };\r\n\r\n      // Insert element\r\n      this._el.insertBefore(\r\n        strElem,\r\n        this._refE\r\n      );\r\n\r\n      str.focus();\r\n    },\r\n    \r\n\r\n    /**\r\n     * Wrap a new operation around the doc element.\r\n     * This is copypasta from doc.js\r\n     */\r\n    wrap : function (op) {\r\n      const parent = this.parent();\r\n      const group = require('vc/docgroup').create(parent);\r\n      group.operation(op);\r\n      group.append(this);\r\n      group.append();\r\n      return parent.replaceOperand(this, group).update();\r\n    },\r\n\r\n\r\n    /**\r\n     * Deserialize from json\r\n     */\r\n    fromJson : function (json) {\r\n      if (json === undefined)\r\n        return this;\r\n\r\n      if (json[\"@type\"] === undefined) {\r\n        KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n        return;\r\n      };\r\n\r\n      if (json[\"ref\"] === undefined ||\r\n          typeof json[\"ref\"] != 'string') {\r\n        KorAP.log(821, \"Reference is missing\");\r\n        return;\r\n      };\r\n\r\n      this.ref(json[\"ref\"]);\r\n\r\n      // Rewrite coming from the server\r\n      if (json[\"rewrites\"] !== undefined) {\r\n        this.rewrite(json[\"rewrites\"]);\r\n      };\r\n\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Click on the unspecified object\r\n     */\r\n    onclick : function () {\r\n      console.log(\"Do not support click on this\");\r\n    },\r\n\r\n\r\n    // TODO: This is identical to doc.js\r\n    rewrites : function () {\r\n      return this._rewrites;\r\n    },\r\n\r\n\r\n    // TODO: This is identical to doc.js\r\n    rewrite : function (value) {\r\n      if (typeof value === 'string') {\r\n        value = [{\r\n          \"@type\" : \"koral:rewrite\",\r\n          \"operation\" : \"operation:\" + value,\r\n          \"src\" : \"Kalamar\"\r\n        }];\r\n      };\r\n      this._rewrites = rewriteListClass.create(value);\r\n    },\r\n\r\n\r\n    // Mark the underlying data as being changed.\r\n    // This is important for rerendering the dom.\r\n    // This will also remove rewrite markers, when the data\r\n    // change happened by the user\r\n    _changed : function () {\r\n      this.__changed = true;\r\n\r\n      if (this._rewrites === undefined)\r\n        return;\r\n\r\n      delete this[\"_rewrites\"];\r\n\r\n      if (this._el === undefined)\r\n        return;\r\n\r\n      this._el.classList.remove(\"rewritten\");\r\n    },\r\n\r\n\r\n    toJson : function () {\r\n      if (!this.ref)\r\n        return {};\r\n      \r\n      return {\r\n        \"@type\" : \"koral:\" + this.ldType(),\r\n        \"ref\"   : this.ref()\r\n      };\r\n    },\r\n\r\n\r\n    incomplete : function () {\r\n      return this.ref() ? false : true\r\n    },\r\n    \r\n\r\n    toQuery : function () {\r\n      if (this.incomplete())\r\n        return \"\";\r\n\r\n      // Build doc string based on key\r\n      return 'referTo ' + this.ref().quote();\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * A new document criterion\r\n */\r\n\r\n\r\ndefine('vc/doc',[\r\n  'vc/jsonld',\r\n  'vc/rewritelist',\r\n  'vc/stringval',\r\n  'vc/docgroupref',\r\n  'util'\r\n], function (jsonldClass, rewriteListClass, stringValClass, docGroupRefClass) {\r\n\r\n  /*\r\n   * TODO:\r\n   *   Improve error handling by using window.onerror() to\r\n   *   capture thrown errors and log them.\r\n   */\r\n\r\n  const errstr802 = \"Match type is not supported by value type\";\r\n  const errstr804 = \"Unknown value type\";\r\n  const loc = KorAP.Locale;\r\n  loc.EMPTY = loc.EMPTY || '⋯';\r\n\r\n  return {\r\n\r\n    // The JSON-LD type\r\n    _ldType : \"doc\",\r\n\r\n    // The object ... maybe not important\r\n    _obj : function () { return '???'; /*KorAP.Doc*/ },\r\n    \r\n\r\n    /**\r\n     * Create a new document criterion\r\n     * by passing the parent object and a json construct.\r\n     */\r\n    create : function (parent, json) {\r\n\r\n      // Create the object, inheriting from Json-LD class\r\n      const obj = Object(jsonldClass).\r\n            create().\r\n            upgradeTo(this).\r\n            fromJson(json);\r\n\r\n      if (obj === undefined) {\r\n        console.log(json);\r\n        return;\r\n      };\r\n\r\n      // Bind the parent\r\n      if (parent !== undefined)\r\n        obj._parent = parent;\r\n      \r\n      obj.__changed = true;\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the elements content.\r\n     */\r\n    update : function () {\r\n      const t = this;\r\n\r\n      if (t._el === undefined)\r\n        return t.element();\r\n      \r\n      // Get element\r\n      const e = t._el;\r\n\r\n      // Check if there is a change in the underlying data\r\n      if (!t.__changed)\r\n        return e;\r\n\r\n      // Set ref - TODO: Cleanup!\r\n      e.refTo = t;\r\n\r\n\r\n      // Was rewritten\r\n      if (t.rewrites() !== undefined) {\r\n        e.classList.add(\"rewritten\");\r\n      };\r\n\r\n      // Added key\r\n      const keyE = t._keyE = document.createElement('span');\r\n      keyE.setAttribute('class', 'key');\r\n\r\n      // Change key\r\n      keyE.addEventListener('click', t._changeKey.bind(t));\r\n\r\n      if (t.key()) {\r\n        const k = t.key();\r\n        if (loc['VC_' + k] !== undefined)\r\n          k = loc['VC_' + k];\r\n        keyE.addT(k);\r\n      };\r\n\r\n      // Added match operator\r\n      const matchopE = t._matchopE = document.createElement('span');\r\n      matchopE.setAttribute('data-type', t.type());\r\n      matchopE.setAttribute('class', 'match');\r\n      matchopE.addT(t.matchop());\r\n\r\n      // Change matchop\r\n      t._matchopE.addEventListener(\r\n        'click',\r\n        t._changeMatchop.bind(t)\r\n      );\r\n\r\n      // Added value operator\r\n      const valueE = t._valueE = document.createElement('span');\r\n      valueE.setAttribute('data-type', t.type());\r\n      valueE.setAttribute('class', 'value');\r\n\r\n      if (t.value()) {\r\n        valueE.addT(t.value());\r\n      }\r\n      else {\r\n        valueE.addT(loc.EMPTY);\r\n        valueE.classList.add('unspecified');\r\n      };\r\n\r\n      // Change value\r\n      valueE.addEventListener(\r\n        'click',\r\n        t._changeValue.bind(t)\r\n      );\r\n\r\n      // Remove all element children\r\n      _removeChildren(e);\r\n\r\n      // Add spans\r\n      e.appendChild(keyE);\r\n      e.appendChild(matchopE);\r\n      e.appendChild(valueE);\r\n\r\n      t.__changed = false;\r\n\r\n      if (t._rewrites !== undefined) {\r\n        e.appendChild(t._rewrites.element());\r\n      };\r\n\r\n      if (t._parent !== undefined) {\r\n        \r\n        // Set operators\r\n        // Append new operators\r\n        e.appendChild(t.operators(\r\n          true,\r\n          true,\r\n          true\r\n        ).element());\r\n      };\r\n      \r\n      if (KorAP.vc){\r\n        KorAP.vc.element().dispatchEvent(\r\n          new CustomEvent('vcChange', {'detail' : t})\r\n        );\r\n      }\r\n      \r\n      return e;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated element\r\n     */\r\n    element : function () {\r\n      const t = this;\r\n      if (t._el !== undefined)\r\n        return t._el;\r\n\r\n      t._el = document.createElement('div');\r\n      t._el.setAttribute('class', 'doc');\r\n      t.update();\r\n      return t._el;\r\n    },\r\n\r\n\r\n    /**\r\n     * Wrap a new operation around the doc element\r\n     */\r\n    wrap : function (op) {\r\n      const parent = this.parent();\r\n      const group = require('vc/docgroup').create(parent);\r\n      group.operation(op);\r\n      group.append(this);\r\n      group.append();\r\n      return parent.replaceOperand(this, group).update();\r\n    },\r\n\r\n\r\n    replaceWith : function (op) {\r\n      const p = this.parent();\r\n\r\n      if (p.ldType() === 'docGroup') {\r\n        p.replaceOperand(this, op);\r\n      }\r\n      else if (p.ldType() == null) {\r\n        p.root(op);\r\n      };\r\n\r\n      p.update();\r\n\r\n      this.destroy();\r\n    },\r\n    \r\n\r\n    /**\r\n     * Deserialize from json\r\n     */\r\n    fromJson : function (json) {\r\n      const t = this;\r\n      if (json === undefined)\r\n        return t;\r\n\r\n      if (json[\"@type\"] === undefined) {\r\n        KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n        return;\r\n      };\r\n\r\n      if (json[\"value\"] === undefined ||\r\n          typeof json[\"value\"] != 'string') {\r\n        KorAP.log(805, \"Value is invalid\");\r\n        return;\r\n      };\r\n\r\n      let rewrite;\r\n\r\n      // There is a defined key\r\n      if (json[\"key\"] !== undefined &&\r\n          typeof json[\"key\"] === 'string') {\r\n\r\n        // Set key\r\n        t.key(json[\"key\"]);\r\n\r\n        // Set match operation\r\n        if (json[\"match\"] !== undefined) {\r\n          if (typeof json[\"match\"] === 'string') {\r\n            t.matchop(json[\"match\"]);\r\n          }\r\n          else {\r\n            KorAP.log(802, errstr802);\r\n            return;\r\n          };\r\n        };\r\n        \r\n        // Type is unspecified - but may be known by the menu\r\n        if (json[\"type\"] === undefined && KorAP._vcKeyMenu) {\r\n\r\n          // Check the VC list if the field is known\r\n          const type = KorAP._vcKeyMenu.typeOf(t.key());\r\n          if (type != undefined) {\r\n            json[\"type\"] = \"type:\" + type;\r\n          };\r\n        };\r\n\r\n        // Type is still undefined\r\n        if (json[\"type\"] === undefined) {\r\n        \r\n          // Check match type\r\n          if (!KorAP._validUnspecMatchRE.test(t.matchop())) {\r\n            KorAP.log(802, errstr802);\r\n\r\n            // Rewrite method\r\n            t.matchop('eq');\r\n            rewrite = 'modification';\r\n          };\r\n\r\n          // Set string value\r\n          t.value(json[\"value\"]);\r\n        }\r\n\r\n        // Field is string type\r\n        else if (json[\"type\"] == \"type:string\") {\r\n          t.type(\"string\");\r\n\r\n          // Check match type\r\n          if (!KorAP._validStringMatchRE.test(t.matchop())) {\r\n            KorAP.log(802, errstr802);\r\n\r\n            // Rewrite method\r\n            t.matchop('eq');\r\n            rewrite = 'modification';\r\n          };\r\n          \r\n          // Set string value\r\n          t.value(json[\"value\"]);\r\n        }\r\n\r\n        // Field is specified\r\n        else if (json[\"type\"] == \"type:text\") {\r\n          t.type(\"text\");\r\n\r\n          // Check match type\r\n          if (!KorAP._validTextMatchRE.test(t.matchop())) {\r\n            KorAP.log(802, errstr802);\r\n\r\n            // Rewrite method\r\n            t.matchop('eq');\r\n            rewrite = 'modification';\r\n          };\r\n\r\n          // Set string value\r\n          t.value(json[\"value\"]);\r\n        }\r\n\r\n        // Key is a date\r\n        else if (json[\"type\"] === \"type:date\") {\r\n          t.type(\"date\");\r\n\r\n          if (json[\"value\"] !== undefined &&\r\n              KorAP._validDateRE.test(json[\"value\"])) {\r\n\r\n            if (!KorAP._validDateMatchRE.test(t.matchop())) {\r\n              KorAP.log(802, errstr802);\r\n\r\n              // Rewrite method\r\n              t.matchop('eq');\r\n              rewrite = 'modification';\r\n            };\r\n\r\n            // Set value\r\n            t.value(json[\"value\"]);\r\n          }\r\n          else {\r\n            KorAP.log(806, \"Value is not a valid date string\");\r\n            return;\r\n          };\r\n        }\r\n\r\n        // Key is a regular expression\r\n        else if (json[\"type\"] === \"type:regex\") {\r\n          t.type(\"regex\");\r\n\r\n          try {\r\n\r\n            // Try to create a regular expression\r\n            let check = new RegExp(json[\"value\"]);\r\n\r\n            if (!KorAP._validStringMatchRE.test(t.matchop())) {\r\n              KorAP.log(802, errstr802);\r\n\r\n              // Rewrite method\r\n              t.matchop('eq');\r\n              rewrite = 'modification';\r\n            };\r\n\r\n            t.value(json[\"value\"]);\r\n          }\r\n\r\n          catch (e) {\r\n            KorAP.log(807, \"Value is not a valid regular expression\");\r\n            return;\r\n          };\r\n          t.type(\"regex\");\r\n        }\r\n\r\n        else {\r\n          KorAP.log(804, errstr804 + \": \" + t.type());\r\n          throw new Error(errstr804 + \": \" + t.type());\r\n        };\r\n      };\r\n\r\n      // Rewrite coming from the server\r\n      if (json[\"rewrites\"] !== undefined) {\r\n        t.rewrite(json[\"rewrites\"]);\r\n      }\r\n\r\n      // Rewrite coming from Kalamar\r\n      else if (rewrite !== undefined) {\r\n        t.rewrite(rewrite);\r\n      };\r\n\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the key\r\n     */\r\n    key : function (value) {\r\n      if (arguments.length === 1) {\r\n        this._key = value;\r\n        this._changed();\r\n        return this;\r\n      };\r\n      return this._key;\r\n    },\r\n\r\n\r\n    // Click on the key, show me the menu\r\n    _changeKey : function (e) {\r\n      const menu = KorAP._vcKeyMenu;\r\n\r\n      // Insert menu\r\n      this._el.insertBefore(\r\n        menu.element(),\r\n        this._keyE\r\n      );\r\n\r\n      // Release event\r\n      const that = this;\r\n      menu.released(function (key, type) {\r\n\r\n        if (type === 'ref') {\r\n          // KorAP._delete.bind(that);\r\n          that.replaceWith(\r\n            docGroupRefClass.create(that.parent())\r\n          );\r\n        }\r\n\r\n        else {\r\n          const doc = that.key(key).type(type);\r\n\r\n          // This may not be compatible - then switch to default\r\n          doc.matchop(doc.matchop());\r\n          doc.value(doc.value());\r\n\r\n          // Update the doc\r\n          doc.update();\r\n        };\r\n\r\n        // hide!\r\n        this.hide();\r\n      });\r\n\r\n      // TODO: Highlight the old value!\r\n      menu.show();\r\n      menu.focus();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the match operator\r\n     */\r\n    matchop : function (match) {\r\n      const t = this;\r\n\r\n      if (arguments.length === 1) {\r\n        const m = match.replace(/^match:/, '');\r\n\r\n        if (\r\n          (t._type == undefined) // && KorAP._validUnspecMatchRE.test(m))\r\n            ||\r\n            (\r\n              (t._type === 'string' || t._type === 'regex') &&\r\n                KorAP._validStringMatchRE.test(m)\r\n            )\r\n            ||\r\n            (t._type === 'text' && KorAP._validTextMatchRE.test(m))\r\n            ||\r\n            (t._type === 'date' && KorAP._validDateMatchRE.test(m))\r\n        ) {\r\n          t._matchop = m;\r\n        }\r\n        else {\r\n          t._matchop = \"eq\";\r\n        };\r\n\r\n        t._changed();\r\n        return t;\r\n      };\r\n\r\n      return t._matchop || \"eq\";\r\n    },\r\n\r\n\r\n    // Click on the match operator, show me the menu\r\n    _changeMatchop : function (e) {\r\n      const menu = KorAP._vcMatchopMenu[this.type()];\r\n\r\n      if (menu === undefined) {\r\n        KorAP.log(0, \"Unable to init menu for \" + this.type());\r\n        return;\r\n      };\r\n\r\n      // Insert menu\r\n      this._el.insertBefore(\r\n        menu.element(),\r\n        this._matchopE\r\n      );\r\n\r\n      // Release event\r\n      const that = this;\r\n      menu.released(function (mo) {\r\n        that.matchop(mo).update();\r\n        this.hide();\r\n      });\r\n\r\n      menu.show();\r\n      menu.focus();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the type\r\n     */\r\n    type : function (type) {\r\n      if (arguments.length === 1) {\r\n        this._type = type;\r\n        this._changed();\r\n        return this;\r\n      };\r\n      return this._type || \"string\";\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the value\r\n     */\r\n    value : function (value) {\r\n      const t = this;\r\n      if (arguments.length === 1) {\r\n        if (t._type === 'date' && !KorAP._validDateRE.test(value)) {\r\n          delete t._value;\r\n        }\r\n        else {\r\n          t._value = value;\r\n        };\r\n        t._changed();\r\n        return t;\r\n      };\r\n      return t._value;\r\n    },\r\n\r\n\r\n    // Click on the match operator, show me the menu\r\n    _changeValue : function (e) {\r\n      const that = this;\r\n     \r\n      // Show datepicker\r\n      if (this.type() === 'date') {\r\n        const dp = KorAP._vcDatePicker;\r\n        dp.fromString(this.value());\r\n\r\n        // Todo: change this\r\n        dp.onclick(function (selected) {\r\n\r\n          // There are values selected\r\n          if (selected['year']) {\r\n            that.value(this.toString());\r\n            that.update();\r\n            return;\r\n          };\r\n\r\n          // Remove datepicker\r\n          that._el.removeChild(\r\n            dp.element()\r\n          );\r\n        });\r\n\r\n        this._el.insertBefore(\r\n          dp.show(), // Get element of the date picker\r\n          this._valueE\r\n        );\r\n\r\n        dp.input().focus();\r\n      }\r\n\r\n      else {\r\n        const regex = this.type() === 'regex' ? true : false;\r\n        const str = stringValClass.create(this.value(), regex);\r\n        const strElem = str.element();\r\n\r\n        str.store = function (value, regex) {\r\n          that.value(value);\r\n          if (regex === true)\r\n            that.type('regex');\r\n          else\r\n            that.type('string');\r\n          \r\n          that._el.removeChild(\r\n            this._el\r\n          );\r\n          that.update();\r\n        };\r\n\r\n        // Insert element\r\n        this._el.insertBefore(\r\n          strElem,\r\n          this._valueE\r\n        );\r\n\r\n        str.focus();\r\n      };\r\n    },\r\n\r\n\r\n    rewrites : function () {\r\n      return this._rewrites;\r\n    },\r\n\r\n\r\n    rewrite : function (value) {\r\n      if (typeof value === 'string') {\r\n        value = [{\r\n          \"@type\" : \"koral:rewrite\",\r\n          \"operation\" : \"operation:\" + value,\r\n          \"src\" : \"Kalamar\"\r\n        }];\r\n      };\r\n      this._rewrites = rewriteListClass.create(value);\r\n    },\r\n\r\n\r\n    // Mark the underlying data as being changed.\r\n    // This is important for rerendering the dom.\r\n    // This will also remove rewrite markers, when the data\r\n    // change happened by the user\r\n    _changed : function () {\r\n      this.__changed = true;\r\n\r\n      if (this._rewrites === undefined)\r\n        return;\r\n\r\n      delete this[\"_rewrites\"];\r\n      \r\n      if (this._el === undefined)\r\n        return;\r\n\r\n      this._el.classList.remove(\"rewritten\");\r\n    },\r\n\r\n\r\n    toJson : function () {\r\n      const t = this;\r\n\r\n      if (!t.matchop() || !t.key())\r\n        return {};\r\n      \r\n      return {\r\n        \"@type\" : \"koral:\" + t.ldType(),\r\n        \"key\"   : t.key(),\r\n        \"match\" : \"match:\" + t.matchop(),\r\n        \"value\" : t.value() || '',\r\n        \"type\"  : \"type:\" + t.type()\r\n      };\r\n    },\r\n\r\n\r\n    incomplete : function () {\r\n      return !(this.matchop() && this.key() && this.value());\r\n    },\r\n\r\n\r\n    toQuery : function () {\r\n      if (this.incomplete())\r\n        return \"\";\r\n\r\n      // Build doc string based on key\r\n      let string = this.key() + ' ';\r\n\r\n      // Add match operator\r\n      switch (this.matchop()) {\r\n      case \"ne\":\r\n        string += '!=';\r\n        break;\r\n      case \"contains\":\r\n        string += '~';\r\n        break;\r\n      case \"excludes\":\r\n        string += '!~';\r\n        break;\r\n      case \"containsnot\":\r\n        string += '!~';\r\n        break;\r\n      case \"geq\":\r\n        string += 'since';\r\n        break;\r\n      case \"leq\":\r\n        string += 'until';\r\n        break;\r\n      default:\r\n        string += (this.type() == 'date') ? 'in' : '=';\r\n        break;\r\n      };\r\n\r\n      string += ' ';\r\n\r\n      // Add value\r\n      switch (this.type()) {\r\n      case \"date\":\r\n        return string + this.value();\r\n      case \"regex\":\r\n        return string + '/' + this.value().escapeRegex() + '/';\r\n      case \"string\":\r\n      case \"text\":\r\n        return string + this.value().quote();\r\n      };\r\n\r\n      return \"\";\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * An unspecified criterion in a virtual corpus.\r\n * Inherits everything from jsonld\r\n */\r\n\r\n\r\ndefine('vc/unspecified',[\r\n  'vc/jsonld',\r\n  'vc/doc',\r\n  'vc/docgroupref',\r\n  'util'\r\n], function (jsonldClass, docClass, docGroupRefClass) {\r\n\r\n  // Localize empty string\r\n  const loc = KorAP.Locale;\r\n  loc.EMPTY = loc.EMPTY || '⋯';\r\n\r\n  return {\r\n\r\n    // The ld-type\r\n    _ldType : \"non\",\r\n\r\n    /**\r\n     * Create new unspecified criterion\r\n     * with a link to the parent object\r\n     */\r\n    create : function (parent) {\r\n      const obj = Object.create(jsonldClass).\r\n\t        upgradeTo(this);\r\n\r\n      if (parent !== undefined)\r\n\t      obj._parent = parent;\r\n\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Set the key; this will spawn a new doc\r\n     */\r\n    key : function (v) {\r\n\r\n      // Not replaceable\r\n      if (this._parent === undefined)\r\n\t      return null;\r\n\r\n      let newDoc;\r\n      const keyType = KorAP._vcKeyMenu.typeOf(v);\r\n\r\n      // Set JSON-LD type\r\n      if (keyType && keyType === 'ref') {\r\n        newDoc = docGroupRefClass.create(this._parent);\r\n      }\r\n      else {\r\n        newDoc = docClass.create(this._parent);\r\n        newDoc.key(v);\r\n        newDoc.type(keyType);\r\n      };\r\n  \r\n      // Unspecified document on root\r\n      if (this._parent.ldType() === null) {\r\n\t      this._parent.root(newDoc);\r\n\t      this.destroy();\r\n      }\r\n\r\n      // Unspecified document in group\r\n      else {\r\n\t      this._parent.replaceOperand(this, newDoc);\r\n      };\r\n      this._parent.update();\r\n      return newDoc;\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the element\r\n     */\r\n    update : function () {\r\n      const t = this;\r\n\r\n      if (t._el === undefined)\r\n\t      return t.element();\r\n\r\n      // Remove element content\r\n      _removeChildren(t._el);\r\n\r\n      const ellipsis = document.createElement('span');\r\n      ellipsis.addT(loc.EMPTY);\r\n\r\n      // Click on empty criterion\r\n      ellipsis.addEventListener('click', t.onclick.bind(t));\r\n\r\n      t._el.appendChild(ellipsis);\r\n\r\n      // Set ref - TODO: Cleanup!\r\n      t._el.refTo = t;\r\n\r\n      // Set operators\r\n      if (t._parent !== undefined &&\r\n          t.parent().ldType() !== null) {\r\n\r\n\t      t._el.appendChild(\r\n\t        t.operators(\r\n\t          false,\r\n\t          false,\r\n\t          true\r\n\t        ).element()\r\n\t      );\r\n      };\r\n\r\n      return t.element();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated element\r\n     */\r\n    element : function () {\r\n      const t = this;\r\n      if (t._el !== undefined)\r\n\t      return t._el;\r\n      t._el = document.createElement('div');\r\n      t._el.setAttribute('class', 'doc unspecified');\r\n      t.update();\r\n      return t._el;\r\n    },\r\n\r\n\r\n    incomplete : function () {\r\n      return true;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Click on the unspecified object\r\n     */\r\n    onclick : function () {\r\n\r\n      // Get the key menu\r\n      const menu = KorAP._vcKeyMenu;\r\n\r\n      // Add key menu element at the correct position\r\n      this._el.insertBefore(\r\n\t      menu.element(),\t\r\n\t      this._el.firstChild\r\n      );\r\n\r\n      const that = this;\r\n\r\n      // Set released method\r\n      menu.released(function (key) {\r\n\t      // Set chosen key and type - will return a doc\r\n\t      that.key(key).update();\r\n\t      this.hide();\r\n      });\r\n\r\n      menu.show();\r\n      menu.focus();\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Document group criterion\r\n */\r\n/*\r\n * TODO: Let the UPDATE event bubble up through parents!\r\n */\r\n\r\n\r\ndefine('vc/docgroup',[\r\n  'vc/jsonld',\r\n  'vc/unspecified',\r\n  'vc/doc',\r\n  'vc/docgroupref',\r\n  'util'\r\n], function (jsonldClass,\r\n\t           unspecClass,\r\n\t           docClass,\r\n             docGroupRefClass) {\r\n\r\n  const _validGroupOpRE = new RegExp(\"^(?:and|or)$\");\r\n\r\n  const docGroupClass = {\r\n\r\n    _ldType : \"docGroup\",\r\n\r\n    create : function (parent, json) {\r\n      const obj = Object.create(jsonldClass).upgradeTo(this);\r\n      obj._operands = [];\r\n      obj.fromJson(json);\r\n      if (parent !== undefined)\r\n\t      obj._parent = parent;\r\n      return obj;\r\n    },\r\n    \r\n\r\n    newAfter : function (obj) {\r\n      this._operands.forEach(function (op, i) {\r\n\t      if (op === obj) {\r\n\t        const operand = unspecClass.create(this);\r\n\t        this._operands.splice(i + 1, 0, operand);\r\n\t        return this.update();\r\n\t      };\r\n      }, this);\r\n    },\r\n\r\n\r\n    // The doc is already set in the group\r\n    _duplicate : function (operand) {\r\n\r\n      // TODO:\r\n      //   Also check for duplicate docGroupRefs!\r\n      if (operand.ldType() !== 'doc')\r\n\t      return null;\r\n\r\n      const f = this._operands.find(\r\n        op => \r\n\t        op.ldType() === 'doc'\r\n\t        && operand.key() === op.key()\r\n\t        && operand.matchop() === op.matchop()\r\n\t        && operand.value() === op.value()\r\n      );\r\n\r\n      if (f)\r\n        return f;\r\n\r\n      return null;\r\n    },\r\n    \r\n\r\n    append : function (operand) {\r\n      \r\n      // Append unspecified object\r\n      if (operand === undefined) {\r\n\r\n\t      // Be aware of cyclic structures!\r\n\t      operand = unspecClass.create(this);\r\n\t      this._operands.push(operand);\r\n\t      return operand;\r\n      };\r\n      \r\n      switch (operand[\"@type\"]) {\r\n\t      \r\n      case undefined:\r\n\t      // No @type defined\r\n\t      if (operand[\"ldType\"] !== undefined) {\r\n\t        if (operand.ldType() !== 'doc' &&\r\n\t            operand.ldType() !== 'docGroup' &&\r\n              operand.ldType() !== 'docGroupRef') {\r\n\t          KorAP.log(812, \"Operand not supported in document group\");\r\n\t          return;\r\n\t        };\r\n\r\n\t        // Be aware of cyclic structures!\r\n\t        operand.parent(this);\r\n\r\n\t        const dupl = this._duplicate(operand);\r\n\t        if (dupl === null) {\r\n\t          this._operands.push(operand);\r\n\t          return operand;\r\n\t        };\r\n\t        return dupl;\r\n\t      };\r\n\r\n\t      KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n\t      return;\r\n\r\n      case \"koral:doc\":\r\n\t      // Be aware of cyclic structures!\r\n\t      const doc = docClass.create(this, operand);\r\n\t      if (doc === undefined)\r\n\t        return;\r\n        \r\n\t      const dupl = this._duplicate(doc);\r\n\t      if (dupl === null) {\r\n\t        this._operands.push(doc);\r\n\t        return doc;\r\n\t      };\r\n\t      return dupl;\r\n\r\n      case \"koral:docGroup\":\r\n\r\n        // Be aware of cyclic structures!\r\n\t      const docGroup = docGroupClass.create(this, operand);\r\n\t      if (docGroup === undefined)\r\n\t        return;\r\n\r\n\t      // Flatten group\r\n\t      if (docGroup.operation() === this.operation()) {\r\n          docGroup.operands().forEach(function(op) {\r\n\t          const dupl = this._duplicate(op);\r\n\t          if (dupl === null) {\r\n\t            this._operands.push(op);\r\n\t            op.parent(this);\r\n\t          };\r\n\t        }, this);\r\n\t        docGroup._operands = [];\r\n\t        docGroup.destroy();\r\n\t        return this;\r\n\t      };\r\n\t      this._operands.push(docGroup);\r\n\t      return docGroup;\r\n\r\n      case \"koral:docGroupRef\":\r\n      \r\n        const docGroupRef = docGroupRefClass.create(this, operand);\r\n      \r\n        if (docGroupRef === undefined)\r\n          return\r\n\r\n        // TODO:\r\n        //   Currently this doesn't do anything meaningful,\r\n        //   as duplicate only checks on docs for the moment\r\n        /*\r\n\t      var dupl = this._duplicate(doc);\r\n\t      if (dupl === null) {\r\n\t        this._operands.push(doc);\r\n\t        return doc;\r\n\t      };\r\n\t      return dupl;\r\n        */\r\n\t      this._operands.push(docGroupRef);\r\n        return docGroupRef;\r\n\r\n      default:\r\n\t      KorAP.log(812, \"Operand not supported in document group\");\r\n\t      return;\r\n      };\r\n    },\r\n\r\n\r\n    update : function () {\r\n      const t = this;\r\n\r\n      // There is only one operand in group\r\n      \r\n      if (t._operands.length === 1) {\r\n\t      \r\n\t      const parent = t.parent();\r\n\t      const op = t.getOperand(0);\r\n\t      \r\n\t      // This will prevent destruction of\r\n\t      // the operand\r\n\t      t._operands = [];\r\n\r\n\t      // Parent is a group\r\n\t      if (parent.ldType() !== null)\r\n\t        return parent.replaceOperand(t, op).update();\r\n\r\n\t      // Parent is vc\r\n\t      else {\r\n\t        t.destroy();\r\n\t        // Cyclic madness\r\n\t        parent.root(op);\r\n\t        op.parent(parent);\r\n\t        return parent.root();\r\n\t      };\r\n      };\r\n\r\n      if (t._el === undefined)\r\n\t      return t;\r\n\r\n      const group = t._el;\r\n      group.setAttribute('data-operation', t.operation());\r\n\r\n      _removeChildren(group);\r\n\r\n      // Append operands\r\n      t._operands.forEach(\r\n        op => group.appendChild(op.element())\r\n      );\r\n\r\n      // Set operators\r\n      var op = t.operators(\r\n\t      t.operation() == 'and' ? false : true,\r\n\t      t.operation() == 'or'  ? false : true,\r\n\t      true\r\n      );\r\n\r\n      group.appendChild(op.element());\r\n\r\n      if (KorAP.vc) {\r\n        KorAP.vc.element().dispatchEvent(\r\n          new CustomEvent('vcChange', {'detail' : t})\r\n        );\r\n      };\r\n      \r\n      return t;\r\n    },\r\n\r\n\r\n    element : function () {\r\n      const t = this;\r\n\r\n      if (t._el !== undefined)\r\n\t      return t._el;\r\n\r\n      const e = t._el = document.createElement('div');\r\n      e.setAttribute('class', 'docGroup');\r\n\r\n      // Update the object - including optimization\r\n      t.update();\r\n\r\n      return e;\r\n    },\r\n\r\n\r\n    operation : function (op) {\r\n      if (arguments.length === 1) {\r\n\t      if (_validGroupOpRE.test(op)) {\r\n\t        this._op = op;\r\n\t      }\r\n\t      else {\r\n\t        KorAP.log(810, \"Unknown operation type\");\r\n\t        return;\r\n\t      };\r\n      };\r\n      return this._op || 'and';\r\n    },\r\n\r\n\r\n    operands : function () {\r\n      return this._operands;\r\n    },\r\n\r\n\r\n    getOperand : function (index) {\r\n      return this._operands[index];\r\n    },\r\n\r\n\r\n    // Replace operand\r\n    replaceOperand : function (oldOp, newOp) {\r\n      \r\n      for (let i = 0; i < this._operands.length; i++) {\r\n\r\n\t      if (this._operands[i] === oldOp) {\r\n\t        \r\n\t        // Just insert a doc or ...\r\n\t        if (newOp.ldType() === \"doc\" ||\r\n\t            newOp.ldType() === \"non\" ||\r\n              newOp.ldType() === 'docGroupRef' ||\r\n\t            // ... insert a group of a different operation\r\n\t            // (i.e. \"and\" in \"or\"/\"or\" in \"and\")\r\n\t            newOp.operation() != this.operation()) {\r\n\t          this._operands[i] = newOp;\r\n\t          newOp.parent(this);\r\n\t        }\r\n\r\n\t        // Flatten group\r\n\t        else {\r\n\r\n            // Remove old group\r\n\t          this._operands.splice(i, 1);\r\n\r\n\t          // Inject new operands\r\n            newOp.operands().reverse().forEach(\r\n              function(op) {\r\n\t              this._operands.splice(i, 0, op);\r\n\t              op.parent(this);\r\n\t            },\r\n              this\r\n            );\r\n\r\n\t          // Prevent destruction of operands\r\n\t          newOp._operands = [];\r\n\t          newOp.destroy();\r\n\t        };\r\n\r\n\t        oldOp.destroy();\r\n\t        return this;\r\n\t      }\r\n      };\r\n      return false;\r\n    },\r\n\r\n\r\n    // Delete operand from group\r\n    delOperand : function (obj) {\r\n\r\n      for (let i = 0; i < this._operands.length; i++) {\r\n\t      if (this._operands[i] === obj) {\r\n\t        \r\n\t        // Delete identified operand\r\n\t        this._operands.splice(i,1);\r\n\r\n\t        // Destroy object for cyclic references\r\n\t        obj.destroy();\r\n\r\n\t        return this;\r\n\t      };\r\n      };\r\n\r\n      // Operand not found\r\n      return undefined;\r\n    },\r\n    \r\n\r\n    // Deserialize from json\r\n    fromJson : function (json) {\r\n\r\n      if (json === undefined)\r\n\t      return this;\r\n\r\n      if (json[\"@type\"] === undefined) {\r\n\t      KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n\t      return;\r\n      };\r\n\r\n      if (json[\"operation\"] === undefined ||\r\n\t        typeof json[\"operation\"] !== 'string') {\r\n\t      KorAP.log(811, \"Document group expects operation\");\r\n\t      return;\r\n      };\r\n\r\n      const operation = json[\"operation\"];\r\n\r\n      this.operation(operation.replace(/^operation:/,''));\r\n\r\n      if (json[\"operands\"] === undefined ||\r\n\t        !(json[\"operands\"] instanceof Array)) {\r\n\t      KorAP.log(704, \"Operation needs operand list\")\r\n\t      return;\r\n      };\r\n\r\n      // Add all documents\r\n      json[\"operands\"].forEach(i => this.append(i));\r\n      \r\n      return this;\r\n    },\r\n\r\n\r\n    toJson : function () {\r\n      const opArray = new Array();\r\n      this._operands.forEach(function(op) {\r\n\t      if (op.ldType() !== 'non')\r\n\t        opArray.push(op.toJson());\r\n      });\r\n\r\n      return {\r\n\t      \"@type\"     : \"koral:\" + this.ldType(),\r\n\t      \"operation\" : \"operation:\" + this.operation(),\r\n\t      \"operands\"  : opArray\r\n      };\r\n    },\r\n\r\n\r\n    toQuery : function (brackets) {\r\n      var list = this._operands\r\n\t        .filter(function (op) {\r\n            return !op.incomplete();\r\n\t        })\r\n\t        .map(function (op) {\r\n\t          return (op.ldType() === 'docGroup') ?\r\n\t            op.toQuery(true) :\r\n\t            op.toQuery();\r\n\t        });\r\n      \r\n      if (list.length === 1)\r\n\t      return list.join('');\r\n      else {\r\n\t      const str = list.join(this.operation() === 'or' ? ' | ' : ' & ');\r\n\t      return brackets ? '(' + str + ')' : str;\r\n      };\r\n    }\r\n  };\r\n  \r\n  return docGroupClass;\r\n});\r\n\n// Field menu item\r\n\r\n\r\ndefine('vc/item',['menu/item', 'util'], function (itemClass) {\r\n\r\n  const loc = KorAP.Locale;\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new menu item.\r\n     * Pass two parameters: value and type.\r\n     * the value may be localized by a name in\r\n     * KorAP.Locale with the prefix 'VC_',\r\n     * e.g. 'VC_subTitle'.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(itemClass)\r\n\t      .upgradeTo(this)\r\n\t      ._init(params);\r\n    },\r\n\r\n\r\n    // Initialize item object\r\n    _init : function (params) {\r\n      const t = this;\r\n\r\n      if (params[0] === undefined)\r\n\t      throw new Error(\"Missing parameters\");\r\n\r\n      t._key = params[0];\r\n      t._type  = params[1];\r\n\r\n      const k = t._key;\r\n      t._name  = loc[\"VC_\" + k] ? loc[\"VC_\" + k] : k;\r\n\r\n      t._lcField = ' ' + t._name.toLowerCase();\r\n\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Override click event by passing all clicks\r\n     * to the menu object.\r\n     */\r\n    onclick : function (e) {\r\n      this.menu().release(\r\n\t      this._key,\r\n\t      this._type\r\n      );\r\n      e.halt();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the name of the item.\r\n     * This is a potential localized version\r\n     * of the value.\r\n     */\r\n    name : function () {\r\n      return this._name;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the type of the item.\r\n     */\r\n    type : function () {\r\n      return this._type;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the key of the item.\r\n     */\r\n    key : function () {\r\n      return this._key;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the HTML element associated with the item. \r\n     */\r\n    element : function () {\r\n      const t = this;\r\n\r\n      // already defined\r\n      if (t._el !== undefined)\r\n\t      return t._el;\r\n\r\n      // Create list item\r\n      var li = document.createElement(\"li\");\r\n      if (t._type)\r\n        li.setAttribute(\"data-type\", t._type);\r\n\r\n      li.setAttribute(\"data-key\",  t._key);\r\n\r\n      // Connect action\r\n      li[\"onclick\"] = t.onclick.bind(t);\r\n\r\n      li.addT(t._name);\r\n      return t._el = li;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('vc/prefix',['menu/prefix'], function (prefixClass) {\r\n  return {\r\n\r\n    /**\r\n     * Create prefix object for the hint helper menu.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(prefixClass).\r\n\t      upgradeTo(this)._init(params);\r\n    },\r\n\r\n\r\n    /**\r\n     * Override the prefix action.\r\n     */\r\n    onclick : function (e) {\r\n      var m = this.menu();\r\n      var value = this.value();\r\n      m.release(value, \"string\");\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Menu showing all key fields.\r\n */\r\n\r\n\r\ndefine('vc/menu',[\r\n  'menu',\r\n  'vc/item',\r\n  'vc/prefix'\r\n], function (\r\n  menuClass,\r\n  itemClass,\r\n  prefixClass) {\r\n\r\n  return {\r\n\r\n    create : function (params) {\r\n      const obj = Object.create(menuClass)\r\n            .upgradeTo(this)\r\n            ._init(params, {\r\n              itemClass : itemClass,\r\n              prefixClass : prefixClass\r\n            });\r\n      obj.limit(6);\r\n\r\n      // This is only domspecific\r\n      obj.element().addEventListener(\r\n        'blur', function (e) {\r\n          this.menu.hide();\r\n        }\r\n      );\r\n \r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Register callback for click event.\r\n     */\r\n    released : function (cb) {\r\n      this._cb = cb;\r\n    },\r\n\r\n\r\n    /**\r\n     * A click event was released\r\n     */\r\n    release : function (key, type) {\r\n      if (this._cb !== undefined)\r\n        this._cb(key, type);\r\n    },\r\n\r\n\r\n    /**\r\n     * Return a key type based on a key.\r\n     * This is a linear search, but should work okay for small\r\n     * VCs and small key lists.\r\n     */\r\n    typeOf : function (key) {\r\n      const found = this._items.find(i => i.key() === key);\r\n\r\n      if (found)\r\n        return found.type();\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * \r\n * Creates and displays corpus statistic\r\n * \r\n * @author Helge Stallkamp\r\n * \r\n */\r\n\r\n\r\n\r\ndefine('vc/statistic',[ 'util' ], function() {\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new statistic object\r\n     */\r\n    create : function (statistic) {\r\n      return Object.create(this)._init(statistic);\r\n    },\r\n\r\n\r\n    /**\r\n     * Initialize statistic object\r\n     */\r\n    _init : function (statistic) {\r\n      if (statistic === undefined) {\r\n        throw new Error(\"Missing parameter\");\r\n      } else {\r\n        this._statistic = statistic;\r\n        return this;\r\n      }\r\n    },\r\n\r\n\r\n    /**\r\n     * Display statistic object as HTML Description List Element\r\n     */\r\n    element : function () {\r\n\r\n      // if this._el already exists return without doing something\r\n      if (this._el !== undefined) {\r\n        return this._el;\r\n      }\r\n\r\n      // create HTML Description List Element\r\n      const statDL = document.createElement('dl');\r\n      statDL.classList.add(\"flex\");\r\n\r\n      const statistic = this._statistic;\r\n      let statSp, statDT, statDD;\r\n\r\n      Object.keys(statistic).forEach(function (k) {\r\n        statSp = statDL.addE('div')\r\n        statDT = statSp.addE('dt');\r\n        statDT.addT(k);\r\n        statDT.setAttribute('title', k);\r\n        statDD = statSp.addE('dd');\r\n        statDD.addT(new Number(statistic[k]).toLocaleString());\r\n      });\r\n\r\n      this._el = statDL;\r\n      return this._el;\r\n    }\r\n  }\r\n\r\n});\r\n\n/**\r\n * Date picker for the\r\n * Virtual Collection builder.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('datepicker',['util'], function () {\r\n\r\n  KorAP._validDateMatchRE = new RegExp(\"^(?:[lg]?eq|ne)$\");\r\n  KorAP._validDateRE      = new RegExp(\"^(?:\\\\d{4})(?:-\\\\d\\\\d(?:-\\\\d\\\\d)?)?$\");\r\n\r\n  /*\r\n   * Localizations\r\n   */\r\n  const loc = KorAP.Locale;\r\n  loc.WDAY = loc.WDAY || [\r\n    'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su'\r\n  ];\r\n  loc.MONTH = loc.MONTH || [\r\n    'January', 'February', 'March', 'April',\r\n    'May', 'June', 'July', 'August',\r\n    'September', 'October', 'November',\r\n    'December'\r\n  ];\r\n\r\n  const d = document;\r\n\r\n  // The datepicker class\r\n  return {\r\n\r\n    /**\r\n     * Create a new datepicker view.\r\n     */\r\n    create : function () {\r\n      return Object.create(this)._init();\r\n    },\r\n\r\n\r\n    // Init datepicker\r\n    _init : function () {\r\n      this._selected = [];\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or select a specific date.\r\n     */\r\n    select : function (year, month, day) {\r\n      const t = this;\r\n      if (arguments.length >= 1) {\r\n        t._selected = {'year' : year};\r\n        t._showYear = year;\r\n        if (arguments.length >= 2) {\r\n          t._selected['month'] = month;\r\n          t._showMonth = month;\r\n          if (arguments.length >= 3) {\r\n            t._selected['day'] = day;\r\n            t._showDay = day;\r\n          };\r\n        };\r\n\r\n        return t;\r\n      };\r\n\r\n      return t._selected;\r\n    },\r\n\r\n\r\n    /**\r\n     * Select a specific date and\r\n     * init the accompanied action.\r\n     */\r\n    set : function (year, month, day) {\r\n      this.select(year, month, day);\r\n      this._store();\r\n    },\r\n\r\n\r\n    // Store the selected value\r\n    _store : function () {\r\n      if (this._click !== undefined)\r\n        this._click(this._selected);\r\n      else \r\n        console.dir(this._selected);\r\n    },\r\n\r\n    \r\n    /**\r\n     * Set the action for clicking as a callback.\r\n     * The callback will retrieve a an object with\r\n     * an optional year attribute,\r\n     * an optional month attribute,\r\n     * and an optional day attribute\r\n     */\r\n    onclick : function (cb) {\r\n      this._click = cb;\r\n    },\r\n\r\n\r\n    /**\r\n     * The associated input field.\r\n     */\r\n    input : function () {\r\n      return this._input;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Show the datepicker.\r\n     * Will either show the selected year/month\r\n     * or the current date.\r\n     * Will return the element for appending to the dom.\r\n     */\r\n    show : function (year, month) {\r\n\r\n      const e = this._el = d.createElement('div');\r\n      e.setAttribute('tabindex', 0);\r\n      e.style.outline = 0;\r\n      e.classList.add('datepicker');\r\n      \r\n      const today = new Date();\r\n      const t = this;\r\n\r\n      // Show year\r\n      t._showYear = (year !== undefined) ? year :\r\n        (t._selected['year'] ? this._selected['year'] :\r\n         today.getYear() + 1900);\r\n\r\n      // Show month\r\n      t._showMonth = month ? month :\r\n        (t._selected['month'] ? t._selected['month'] :\r\n         (today.getMonth() + 1));\r\n\r\n      // Append all helpers\r\n      e.appendChild(t._monthHelper());\r\n      e.appendChild(t._yearHelper());\r\n      e.appendChild(t._dayHelper());\r\n      t._input = e.appendChild(t._stringHelper());\r\n\r\n      // Always focus\r\n      e.addEventListener(\r\n        'mousedown',\r\n        function (ev) {\r\n          this._inField = true\r\n        }.bind(t)\r\n      );\r\n\r\n      e.addEventListener(\r\n        'mouseup',\r\n        function (ev) {\r\n          this._inField = false;\r\n          this._input.focus();\r\n        }.bind(t)\r\n      );\r\n\r\n      t._input.addEventListener(\r\n        'blur',\r\n        function (ev) {\r\n          if (!this._inField) {\r\n            if (this.fromString(this._input.value)) {\r\n              this._store();\r\n            };\r\n          };\r\n          ev.halt();\r\n        }.bind(t)\r\n      );\r\n\r\n      t._input.focus();\r\n\r\n      return t._el;\r\n    },\r\n\r\n    _stringHelper : function () {\r\n\r\n      // Create element\r\n      // Add input field\r\n      const input = d.createElement('input');\r\n      input.value = this.toString();\r\n      input.setAttribute('tabindex', 0);\r\n\r\n      input.addEventListener(\r\n        'keyup',\r\n        function (e) {\r\n          if (this.fromString(input.value)) {\r\n            this._updateYear();\r\n            this._updateMonth();\r\n            this._updateDay();\r\n          };\r\n        }.bind(this)\r\n      );\r\n\r\n      input.addEventListener(\r\n        'keypress',\r\n        function (e) {\r\n          if (e.keyCode == 13) {\r\n            if (this.fromString(input.value))\r\n              this._store();\r\n\r\n            e.halt();\r\n            return false;\r\n          }\r\n        }.bind(this)\r\n      )\r\n\r\n      return input;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the HTML element associated with the datepicker.\r\n     */\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the current date in string format.\r\n     */\r\n    today : function () {\r\n      const today = new Date();\r\n      let str = today.getYear() + 1900;\r\n      const m = today.getMonth() + 1;\r\n      const d = today.getDate();\r\n      str += '-' + (m < 10 ? '0' + m : m);\r\n      str += '-' + (d < 10 ? '0' + d : d);\r\n      return str;\r\n    },\r\n\r\n\r\n    /**\r\n     * Stringification\r\n     */\r\n    toString : function () {\r\n      // There are values selected\r\n      let v = '';\r\n      const s = this._selected;\r\n      if (s['year']) {\r\n        v += s['year'];\r\n        if (s['month']) {\r\n          v += '-';\r\n          v += s['month'] < 10 ? '0' + s['month'] : s['month'];\r\n          if (s['day']) {\r\n            v += '-';\r\n            v += s['day'] < 10 ? '0' + s['day'] : s['day'];\r\n          };\r\n        };\r\n      };\r\n      return v;\r\n    },\r\n\r\n\r\n    /**\r\n     * Increment the year.\r\n     */\r\n    incrYear : function () {\r\n      const t = this;\r\n      if (t._showYear < 9999) {\r\n        t._showYear++;\r\n        t._updateYear();\r\n        t._updateMonth();\r\n        t._updateDay();\r\n        return t;\r\n      };\r\n      return;\r\n    },\r\n\r\n\r\n    /**\r\n     * Decrement the year.\r\n     */\r\n    decrYear : function () {\r\n      const t = this;\r\n      if (t._showYear > 0) {\r\n        t._showYear--;\r\n        t._updateYear();\r\n        t._updateMonth();\r\n        t._updateDay();\r\n        return t;\r\n      };\r\n      return;\r\n    },\r\n\r\n\r\n    /**\r\n     * Increment the month.\r\n     */\r\n    incrMonth : function () {\r\n      const t = this;\r\n      t._showMonth++;\r\n      if (t._showMonth > 12) {\r\n        t._showMonth = 1;\r\n        t.incrYear();\r\n      }\r\n      else {\r\n        t._updateMonth();\r\n        t._updateDay();\r\n      };\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Decrement the month.\r\n     */\r\n    decrMonth : function () {\r\n      const t = this;\r\n      t._showMonth--;\r\n      if (t._showMonth < 1) {\r\n        t._showMonth = 12;\r\n        t.decrYear();\r\n      }\r\n      else {\r\n        t._updateMonth();\r\n        t._updateDay();\r\n      };\r\n\r\n      return t;\r\n    },\r\n\r\n\r\n    // Create the year helper element.\r\n    _yearHelper : function () {\r\n      const t = this;\r\n      const year = d.createElement('div');\r\n      year.classList.add('year');\r\n\r\n      // Decrement year\r\n      year.addE('span')\r\n        .onclick = t.decrYear.bind(t);\r\n\r\n      t._yElement = year.addE('span');\r\n      t._yElement.addT(t._showYear);\r\n\r\n      t._yElement.onclick = function () {\r\n        t.set(t._showYear);\r\n      }.bind(t);\r\n      t._selectYear();\r\n\r\n      // Increment year\r\n      year.addE('span')\r\n        .onclick = t.incrYear.bind(t);\r\n\r\n      return year;\r\n    },\r\n\r\n\r\n    // Update the year helper view.\r\n    _updateYear : function () {\r\n      this._yElement.firstChild.data = this._showYear;\r\n      this._selectYear();\r\n    },\r\n\r\n\r\n    // Check if the viewed year is current\r\n    _selectYear : function () {\r\n      if (this._showYear === this.select()['year'])\r\n        this._yElement.classList.add('selected');\r\n      else\r\n        this._yElement.classList.remove('selected');\r\n    },\r\n\r\n\r\n    // Create the month helper element.\r\n    _monthHelper : function () {\r\n      const t = this;\r\n      const month = d.createElement('div');\r\n      month.classList.add('month');\r\n\r\n      // Decrement month\r\n      month.addE('span')\r\n        .onclick = t.decrMonth.bind(t);\r\n      \r\n      t._mElement = month.addE('span');\r\n      t._mElement.addT(loc.MONTH[t._showMonth-1]);\r\n      t._mElement.onclick = function () {\r\n        this.set(this._showYear, this._showMonth);\r\n      }.bind(t);\r\n\r\n      t._selectMonth();\r\n      \r\n      // Increment month\r\n      month.addE('span')\r\n        .onclick = t.incrMonth.bind(t);\r\n\r\n      return month;\r\n    },\r\n\r\n    // Update the month helper view.\r\n    _updateMonth : function () {\r\n      if (this._showMonth === undefined || this._showMonth > 12)\r\n        this._showMonth = 1;\r\n\r\n      this._mElement.firstChild.data = loc.MONTH[this._showMonth-1];\r\n      this._selectMonth();\r\n    },\r\n\r\n\r\n    // Check if the viewed month is current\r\n    _selectMonth : function () {\r\n      const t = this;\r\n      if (t._showYear === t.select()['year'] &&\r\n          t._showMonth === t.select()['month'])\r\n        t._mElement.classList.add('selected');\r\n      else\r\n        t._mElement.classList.remove('selected');\r\n    },\r\n\r\n\r\n    // Create the day (calendar) helper element.\r\n    _dayHelper : function () {\r\n      const table = d.createElement('table');\r\n\r\n      // Localized day view\r\n      const tr = table.addE('thead').addE('tr');\r\n      for (let i = 0; i < 7; i++) {\r\n        tr.addE('th').addT(loc.WDAY[i]);\r\n      };\r\n\r\n      this._dBElement = this._dayBody();\r\n\r\n      table.appendChild(this._dBElement);\r\n      return table;\r\n    },\r\n\r\n\r\n    // Create day body for calendar table\r\n    _dayBody : function () {\r\n      const showDate = new Date(\r\n        this._showYear,\r\n        this._showMonth - 1,\r\n        1,\r\n        0,\r\n        0,\r\n        0,\r\n        0\r\n      );\r\n      const date = new Date(\r\n        this._showYear,\r\n        this._showMonth - 1,\r\n        1,\r\n        0,\r\n        0,\r\n        0,\r\n        0\r\n      );\r\n      const today = new Date();\r\n      const that = this;\r\n\r\n      // What happens, in case someone clicks\r\n      // on a date\r\n      const click = function () {\r\n        that.set(\r\n          that._showYear,\r\n          that._showMonth,\r\n          parseInt(this.firstChild.data)\r\n        );\r\n      };\r\n\r\n      // Skip back to the previous monday (may be in the last month)\r\n      date.setDate(date.getDate() - ((date.getDay() + 6) % 7));\r\n\r\n      const tb = d.createElement('tbody');\r\n\r\n      const s = this.select();\r\n      \r\n      let tr, i, td;\r\n\r\n      // Iterate over all days of the table\r\n      while (1) {\r\n\r\n        // Loop through the week\r\n        tr = tb.addE('tr');\r\n        for (i = 0; i < 7; i++) {\r\n          td = tr.addE('td');\r\n          \r\n          // Not part of the current month\r\n          if (date.getMonth() !== showDate.getMonth()) {\r\n            td.classList.add('out');\r\n          }\r\n          else {\r\n            td.onclick = click;\r\n          };\r\n    \r\n          // This is the current day\r\n          if (date.getDate()     === today.getDate() &&\r\n              date.getMonth()    === today.getMonth() &&\r\n              date.getFullYear() === today.getFullYear()) {\r\n            td.classList.add('today');\r\n          };\r\n\r\n          // This is the day selected\r\n          if (s && s['day']) {\r\n            if (date.getDate()     === s['day'] &&\r\n                date.getMonth()    === s['month']-1 &&\r\n                date.getFullYear() === s['year']) {\r\n              td.classList.add('selected');\r\n            };\r\n          };\r\n          \r\n          // Add the current day to the table\r\n          td.addT(date.getDate());\r\n    \r\n          // Next day\r\n          date.setDate(date.getDate() + 1);\r\n        };\r\n        \r\n        if (date.getMonth() !== showDate.getMonth())\r\n          break;\r\n      };\r\n      return tb;\r\n    },\r\n\r\n    // Update the calendar view\r\n    _updateDay : function () {\r\n      const newBody = this._dayBody();\r\n      this._dBElement.parentNode.replaceChild(\r\n        newBody,\r\n        this._dBElement\r\n      );\r\n      this._dBElement = newBody;\r\n    },\r\n\r\n\r\n    /**\r\n     * Parse date from string.\r\n     */\r\n    fromString : function (v) {\r\n      if (v === undefined)\r\n        return false;\r\n\r\n      if (!KorAP._validDateRE.test(v))\r\n        return false;\r\n\r\n      const d = v.split('-', 3);\r\n      d[0] = parseInt(d[0]);\r\n      if (d[1]) d[1] = parseInt(d[1]);\r\n      if (d[2]) d[2] = parseInt(d[2]);\r\n\r\n      // Select values\r\n      this.select(d[0], d[1], d[2]);\r\n      return true;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Create a panel for a certain aspect of the system, like\r\n * the result, a match, or the VC.\r\n *\r\n * The buttons are associated with the panel's views,\r\n * though they are integrated independently\r\n */\r\n\r\n\r\ndefine('panel',['buttongroup', 'util'], function (buttonGroupClass) {\r\n\r\n  return {\r\n    create : function (classes) {\r\n      return Object.create(this)._init(classes);\r\n    },\r\n\r\n\r\n    // Override by inheriting object\r\n    _init : function (classes) {\r\n      const t = this;\r\n      t.views = [];\r\n\r\n      /**\r\n       * Main action buttons for the panel,\r\n       * may be at the bottom (for matches)\r\n       * or as tabs (for the result).\r\n       */\r\n\r\n      t._classes = classes;\r\n      const c = ['action', 'button-panel'];\r\n\r\n      if (classes)\r\n        c.push.apply(c,classes);\r\n\r\n      t._actions = buttonGroupClass.create(c).bind(this);\r\n\r\n      //prepend or append views of the panel\r\n      t.prepend = false;\r\n      \r\n      // Warning: This is circular\r\n      t._actions.panel = t;\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * The actions of the panel.\r\n     * Can be represented as a buttongroup,\r\n     * a list, ..., requires an \"add()\" minimum at least.\r\n     */\r\n    actions : function () {\r\n      return this._actions;\r\n    },\r\n    \r\n\r\n    /**\r\n     * The element of the panel\r\n     */\r\n    element : function () {\r\n      if (this._el)\r\n        return this._el;\r\n\r\n      // Create panel element\r\n      const e = document.createElement('div');\r\n      const cl = e.classList;\r\n      cl.add('panel');\r\n   \r\n      if (this._classes)\r\n        cl.add.apply(cl, this._classes);\r\n\r\n      this._viewE = e.addE('div');\r\n\r\n      // Per default the action buttons are below the view\r\n      // and integrated\r\n      const aElem = this.actions().element();\r\n      if (!aElem.parentNode)\r\n        e.appendChild(aElem);\r\n\r\n      return this._el = e;\r\n    },\r\n\r\n\r\n    /*\r\n     * The element of the views\r\n     */\r\n    _viewElement : function () {\r\n      this.element();\r\n      return this._viewE;\r\n    },\r\n\r\n\r\n    /**\r\n     * Add a view to the panel\r\n     */\r\n    add : function (view) {\r\n\r\n      // Add view to views list\r\n      this.views.push(view);\r\n\r\n      // Append or prepend element to panel element\r\n      if (this.prepend){\r\n        this._viewElement().prepend(\r\n          view.element()\r\n        );\r\n      }\r\n      else{\r\n        this._viewElement().appendChild(\r\n          view.element()\r\n        );\r\n      }\r\n      \r\n      if (view.afterEmbed)\r\n        view.afterEmbed();\r\n      \r\n      view.panel = this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Delete a closed view from panel\r\n     */\r\n    delView : function (view) {\r\n      this.views.forEach(function(e, i, a) {\r\n        if (e === view)\r\n          a[i] = undefined;\r\n      });\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Create a view that can be added to a panel,\r\n * like a tree view or the metadata view.\r\n */\r\n\r\n\r\n\r\ndefine('view',['buttongroup', 'util'], function (buttonGroupClass) {\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.CLOSE = loc.CLOSE     || 'Close';  \r\n\r\n  return {\r\n    create : function (classes) {\r\n      return Object.create(this)._init(classes);\r\n    },\r\n\r\n    // Override by inheriting object\r\n    _init : function (classes) {\r\n      this.panel = undefined;\r\n      this._classes = classes;\r\n      this._shown = false;\r\n\r\n      // The buttonclass is bind to the view\r\n      const c = ['action', 'button-view'];\r\n      if (classes)\r\n        c.push.apply(c,classes);\r\n      \r\n      this._actions = buttonGroupClass.create(c).bind(this);\r\n\r\n      this._actions.add(loc.CLOSE, {'cls':['button-icon','close']}, function (e) {\r\n        this.close();\r\n      });\r\n\r\n      // Warning: This is circular\r\n      this._actions.view = this;\r\n\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Element of the view\r\n     */\r\n    element : function () {\r\n      if (this._el) {\r\n        this._el.classList.add('show');\r\n        return this._el;\r\n      };\r\n\r\n      // Create panel element\r\n      const e = document.createElement('div');\r\n      const cl = e.classList;\r\n\r\n      cl.add('view', 'show');\r\n      if (this._classes)\r\n        cl.add.apply(cl, this._classes);\r\n\r\n      // TODO: The show may need to be wrapped in another DIV!\r\n      if (this.show !== undefined) {\r\n        const s = this.show();\r\n        if (s) {\r\n          e.appendChild(s);\r\n        } else {\r\n          return e\r\n        };\r\n      }\r\n\r\n      this._shown = true;\r\n\r\n      e.appendChild(this.actions().element());\r\n\r\n      return this._el = e;\r\n    },\r\n\r\n\r\n    /**\r\n     * The actions of the view.\r\n     * Can be represented as a buttongroup,\r\n     * a list, ..., requires an \"add()\" minimum at least.\r\n     */\r\n    actions : function () {\r\n      return this._actions;\r\n    },\r\n\r\n    /**\r\n     * Is the object shown?\r\n     */\r\n    shown : function () {\r\n      return this._shown;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Hide the widget if shown.\r\n     */\r\n    minimize : function () {\r\n      if (this._el) {\r\n        this._el.classList.remove(\"show\");\r\n      }\r\n    },\r\n\r\n\r\n    // onClose : function () {},\r\n\r\n    \r\n    /**\r\n     * Close the view.\r\n     */\r\n    close : function () {\r\n\r\n      // Close embedded things before\r\n      if (this.onClose)\r\n        this.onClose();\r\n\r\n      const e = this.element();\r\n      if (e.parentNode) {\r\n        e.parentNode.removeChild(e);\r\n      };\r\n      this.panel.delView(this);\r\n      this._shown = false;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * View: corpus statistic view\r\n * \r\n * @author Helge Stallkamp\r\n */\r\n\r\n\r\ndefine('view/vc/corpstatv',['view', 'vc/statistic', 'buttongroup'],\r\n       function (viewClass, statClass, buttonGroup) {\r\n\r\n         // Localization values\r\n  const loc   = KorAP.Locale;\r\n  loc.REFRESH = loc.REFRESH || 'Refresh';\r\n\r\n  return {\r\n    create : function(vc, panel) {\r\n      return Object.create(viewClass).\r\n        _init([ 'vcstatistic' ]).\r\n        upgradeTo(this).\r\n        _init(vc, panel);\r\n    },\r\n\r\n    _init : function(vc, panel) {\r\n      this.vc = vc;\r\n      this.panel = panel;\r\n      return this;\r\n    },\r\n\r\n    /*\r\n     * Returns corpus of the view,\r\n     * vc is used to create the corpus query string \r\n     * which is needed to receive the corpus statistic from the server \r\n     * (see also getStatistic : function(cb) {...))\r\n     */\r\n    getvc : function() {\r\n      return this.vc;\r\n    },\r\n\r\n\r\n    /**\r\n     * Receive Corpus statistic from the server\r\n     */\r\n    getStatistic : function (cb) {\r\n      const vc = this.vc;\r\n\r\n      try {\r\n        KorAP.API.getCorpStat(vc.toQuery(), function(statResponse) {\r\n          if (statResponse === null) {\r\n            cb(null);\r\n            return;\r\n          }\r\n          if (statResponse === undefined) {\r\n            cb(null);\r\n            return;\r\n          }\r\n\r\n          // catches notifications\r\n          if (statResponse[\"notifications\"] !== null\r\n              && statResponse[\"notifications\"] !== undefined) {\r\n            const notif = statResponse[\"notifications\"];\r\n            KorAP.log(0, notif[0][1]);\r\n            cb(null);\r\n            return;\r\n          }\r\n\r\n          cb(statResponse);\r\n        });\r\n      }\r\n\r\n      catch (e) {\r\n        KorAP.log(0, e);\r\n        cb(null);\r\n      }\r\n\r\n    },\r\n\r\n    /** \r\n     * Show corpus statistic view \r\n     */\r\n    show : function() {\r\n      \r\n      if (this._show)\r\n        return this._show; \r\n      \r\n      const statTable = document.createElement('div');\r\n      statTable.classList.add('stattable', 'loading');\r\n  \r\n      /*\r\n       * Get corpus statistic, remove \"loading\"-image and\r\n       * append result to statTable\r\n       */\r\n      this.getStatistic(function(statistic) {\r\n        statTable.classList.remove('loading');\r\n\r\n        if (statistic === null)\r\n          return;\r\n\r\n        statTable.appendChild(\r\n          statClass.create(statistic).element()\r\n        );\r\n      });\r\n\r\n      return this._show = statTable;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Checks if statistic has to be disabled\r\n     */\r\n    checkStatActive : function () {\r\n      let newString = KorAP.vc.toQuery();\r\n      const oldString = this.vc.oldvcQuery;\r\n      /*\r\n       * Do ignore surrounding round brackets\r\n       * Definining an incomplete docGroup in the vc builder: \r\n       * (foo = bar and author = Goethe) and ... \r\n       * leads to \r\n       * vc.toQuery() -> (foo = bar and author=Goethe)\r\n       */\r\n  \r\n      if (newString || newString === '') {\r\n        if (newString.startsWith('(')) {\r\n          newString = newString.slice(1, newString.length-1);\r\n        };\r\n       \r\n        if (newString != oldString) {\r\n          this.disableStat();\r\n        }\r\n      }\r\n    },\r\n   \r\n\r\n    /**\r\n     * Disabling corpus statistic if in vc builder a different vc is choosen.\r\n     * After clicking at the reload-button the up-to-date corpus statistic is displayed.\r\n     */   \r\n    disableStat : function(){\r\n      const statt = this._show;\r\n  \r\n      if (statt.getElementsByClassName('reloadStatB').length == 0) {\r\n        const btg = buttonGroup.create(['reloadStatB', 'button-panel']);\r\n\r\n        btg.add(loc.REFRESH, {'cls':['refresh', 'button-icon']}, function (e) {\r\n          statt.classList.remove('stdisabled');\r\n          this.panel.reloadCorpStat(); \r\n        }.bind(this));\r\n\r\n        statt.appendChild(btg.element());\r\n        statt.classList.add('stdisabled');\r\n      };\r\n    },\r\n\r\n    \r\n    /**\r\n     * Close the view.\r\n     */\r\n    onClose : function() {\r\n      this.vc = undefined;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The vc info panel\r\n * \r\n * The vc info panel displays information about the virtual corpus, \r\n * for example the corpus statistic\r\n * \r\n * @author Helge Stallkamp\r\n */\r\n\r\n\r\n\r\ndefine('panel/vc',[\r\n  'panel',\r\n  'view/vc/corpstatv'\r\n], function (panelClass, corpStatVClass) {\r\n  \r\n  const d = document;\r\n\r\n  // Localization values\r\n  const loc = KorAP.Locale;\r\n  loc.SHOW_STAT= loc.SHOW_STAT || 'Statistics';\r\n  loc.VERB_SHOWSTAT = loc.VERB_SHOWSTAT    || 'Corpus Statistics';\r\n  \r\n  return {\r\n    create : function (vc) {\r\n      return Object.create(panelClass)._init(['vcinfo']).upgradeTo(this)._init(vc);\r\n    }, \r\n    \r\n    _init : function(vc){\r\n     this.vc = vc;\r\n      const actions = this.actions();\r\n      actions.add(loc.SHOW_STAT, {'cls':['statistic']}, function() {\r\n        this.addCorpStat();\r\n      }.bind(this));\r\n      return this;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Add corpus statistic view to panel\r\n     */\r\n    addCorpStat: function(){\r\n      const t = this;\r\n\r\n      //Refreshes corpus statistic\r\n      if (t.statView !== undefined && t.statView.shown()){\r\n        let statt = t.statView.show();\r\n        if (statt.classList.contains('stdisabled')){\r\n          t.reloadCorpStat(); \r\n          statt.classList.remove('stdisabled');\r\n        }\r\n      };\r\n      \r\n      //Add corpus statistic\r\n      if (t.statView === undefined || !t.statView.shown()) {\r\n        t.statView = corpStatVClass.create(t.vc,t);\r\n        t.add(t.statView);\r\n        t.vc.oldvcQuery = KorAP.vc.toQuery();\r\n      };\r\n    },\r\n    \r\n    /**\r\n     * Reload corpus statistic \r\n     *\r\n     */\r\n    reloadCorpStat: function(){\r\n      this.statView.close();\r\n      this.addCorpStat();\r\n    }    \r\n  }\r\n});\r\n\n/**\r\n * Create virtual corpora with a visual user interface. This resembles the\r\n * corpus/collection type objects of a KoralQuery \"collection\"/\"corpus\" object.\r\n * \r\n * KoralQuery v0.3 is expected.\r\n * \r\n * @author Nils Diewald\r\n */\r\n/*\r\n * This replaces a previous version written by Mengfei Zhou\r\n */\r\n\r\n/*\r\n  TODO: Disable \"and\" or \"or\" in case it's followed \r\n        by an unspecified document\r\n  TODO: Add \"and\"-method to root to add further constraints \r\n        based on match-input (like clicking on a pubDate timestamp in a match) \r\n  TODO: Implement \"persistence\"-Option, injecting the current creation \r\n        date stamp \r\n  TODO: Implement vec-Type for document-id vectors like docID in [1,2,3,4 ...]\r\n\r\n  Error codes: \r\n  701: \"JSON-LD group has no @type attribute\" \r\n  704: \"Operation needs operand list\" \r\n  802: \"Match type is not supported by value type\" \r\n  804: \"Unknown value type\" \r\n  805: \"Value is invalid\" \r\n  806: \"Value is not a valid date string\" \r\n  807: \"Value is not a valid regular expression\" \r\n  810: \"Unknown document group operation\" (like 711) \r\n  811: \"Document group expects operation\" (like 703) \r\n  812: \"Operand not supported in document group\" (like 744) \r\n  813: \"Collection type is not supported\" (like 713) \r\n  814: \"Unknown rewrite operation\" \r\n  815: \"Rewrite expects source\"\r\n  \r\n  Localization strings: \r\n  KorAP.Locale = {\r\n    EMPTY : '...', \r\n    AND : 'and', \r\n    OR : 'or',\r\n   DELETE : 'x' }\r\n   \r\n   and various field names with the prefix 'VC_'\r\n */\r\n\r\n\r\ndefine('vc',[\r\n  'vc/unspecified',\r\n  'vc/doc',\r\n  'vc/docgroup',\r\n  'vc/docgroupref',\r\n  'vc/menu',\r\n  'vc/statistic',\r\n  'datepicker',\r\n  'buttongroup',\r\n  'panel/vc',\r\n  'view/vc/corpstatv',\r\n  'buttongroup',\r\n  'util'\r\n], function(\r\n  unspecDocClass,\r\n  docClass,\r\n  docGroupClass,\r\n  docGroupRefClass,\r\n  menuClass,\r\n  statClass,\r\n  dpClass,\r\n  buttonGrClass,\r\n  vcPanelClass,\r\n  corpStatVClass,\r\n  buttonGroupClass) {\r\n\r\n  KorAP._validUnspecMatchRE = new RegExp(\r\n    \"^(?:eq|ne|contains(?:not)?|excludes)$\");\r\n  KorAP._validStringMatchRE = new RegExp(\"^(?:eq|ne)$\");\r\n  KorAP._validTextMatchRE = KorAP._validUnspecMatchRE;\r\n  KorAP._validTextOnlyMatchRE = new RegExp(\r\n    \"^(?:contains(?:not)?|excludes)$\");\r\n  KorAP._overrideStyles = false;\r\n  // KorAP._validDateMatchRE is defined in datepicker.js!\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.SHOW_STAT        = loc.SHOW_STAT        || 'Statistics';\r\n  loc.VERB_SHOWSTAT    = loc.VERB_SHOWSTAT    || 'Corpus Statistics';\r\n  loc.VC_allCorpora    = loc.VC_allCorpora    || 'all corpora';\r\n  loc.VC_oneCollection = loc.VC_oneCollection || 'a virtual corpus';\r\n  loc.MINIMIZE         = loc.MINIMIZE         || 'Minimize';\r\n\r\n  KorAP._vcKeyMenu = undefined;\r\n  KorAP._vcDatePicker = dpClass.create();\r\n\r\n  // Create match menus ....\r\n  KorAP._vcMatchopMenu = {\r\n    'string' : menuClass.create([\r\n      [ 'eq', null ],\r\n      [ 'ne', null ]\r\n    ]),\r\n    'text' : menuClass.create([\r\n      [ 'eq', null ], // Requires exact match\r\n      [ 'ne', null ],\r\n      [ 'contains', null ], // Requires token sequence match\r\n      [ 'containsnot', null ]\r\n    ]),\r\n    'date' : menuClass.create([\r\n      [ 'eq', null ],\r\n      [ 'ne', null ],\r\n      [ 'geq', null ],\r\n      [ 'leq', null ]\r\n    ]),\r\n    'regex' : menuClass.create([\r\n      [ 'eq', null ],\r\n      [ 'ne', null ]\r\n    ])\r\n  };\r\n\r\n\r\n  /**\r\n   * Virtual corpus\r\n   */\r\n  return {\r\n\r\n    /**\r\n     * The JSON-LD type of the virtual corpus\r\n     */\r\n    ldType : function() {\r\n      return null;\r\n    },\r\n\r\n\r\n    // Initialize virtual corpus\r\n    _init : function(keyList) {\r\n\r\n      // Inject localized css styles\r\n      if (!KorAP._overrideStyles) {\r\n\r\n        const sheet = KorAP.newStyleSheet();\r\n\r\n        // Add css rule for OR operations\r\n        sheet.insertRule('.vc .docGroup[data-operation=or] > .doc::before,'\r\n                         + '.vc .docGroup[data-operation=or] > .docGroup::before '\r\n                         + '{ content: \"' + loc.OR + '\" }', 0);\r\n\r\n        // Add css rule for AND operations\r\n        sheet.insertRule(\r\n          '.vc .docGroup[data-operation=and] > .doc::before,'\r\n            + '.vc .docGroup[data-operation=and] > .docGroup::before '\r\n            + '{ content: \"' + loc.AND + '\" }', 1);\r\n\r\n        KorAP._overrideStyles = true;\r\n      };\r\n\r\n      let l;\r\n      if (keyList) {\r\n        l = keyList.slice();\r\n        l.unshift(['referTo', 'ref']);\r\n      }\r\n      else {\r\n        l = [['referTo', 'ref']];\r\n      }\r\n      \r\n      // Create key menu\r\n      KorAP._vcKeyMenu = menuClass.create(l);\r\n      KorAP._vcKeyMenu.limit(6);\r\n\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Create a new virtual corpus\r\n     */\r\n    create : function (keyList) {\r\n      const obj = Object.create(this)._init(keyList);\r\n      obj._root = unspecDocClass.create(obj);\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Create and render a new virtual corpus based on a KoralQuery\r\n     * corpus document\r\n     */\r\n    fromJson : function(json) {\r\n\r\n      let obj;\r\n      \r\n      if (json !== undefined) {\r\n\r\n        // Parse root document\r\n        if (json['@type'] == 'koral:doc') {\r\n          obj = docClass.create(this, json);\r\n        }\r\n\r\n        // parse root group\r\n        else if (json['@type'] == 'koral:docGroup') {\r\n          obj = docGroupClass.create(this, json);\r\n        }\r\n\r\n        // parse root reference\r\n        else if (json['@type'] == 'koral:docGroupRef') {\r\n          obj = docGroupRefClass.create(this, json);\r\n        }\r\n        \r\n        // Unknown collection type\r\n        else {\r\n          KorAP.log(813, \"Collection type is not supported\");\r\n          return;\r\n        };\r\n      }\r\n\r\n      else {\r\n        // Add unspecified object\r\n        obj = unspecDocClass.create(this);\r\n      };\r\n\r\n      // Init element and update\r\n      this.root(obj);   \r\n \r\n      return this;\r\n    },\r\n\r\n\r\n    // Check if the virtual corpus contains a rerite\r\n    wasRewritten : function (obj) {\r\n\r\n      if (arguments.length !== 1) {\r\n        obj = this._root;\r\n      };\r\n\r\n      // Check for rewrite\r\n      if (obj.rewrites() && obj.rewrites().length() > 0) {\r\n        return true;\r\n      }\r\n\r\n      // Check recursively\r\n      else if (obj.ldType() === 'docGroup') {\r\n\r\n        // If there was a rewritten object\r\n        if (obj.operands().find(op => this.wasRewritten(op)) !== undefined) {\r\n          return true;\r\n        };\r\n      };\r\n      \r\n      return false;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Clean the virtual document to unspecified doc.\r\n     */\r\n    clean : function() {\r\n      const t = this;\r\n      if (t._root.ldType() !== \"non\") {\r\n        t._root.destroy();\r\n        t.root(unspecDocClass.create(t));\r\n      };\r\n\r\n      // update for graying corpus statistic by deleting the first line of the vc builder\r\n      t.update();\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the root object of the virtual corpus\r\n     */\r\n    root : function(obj) {\r\n      if (arguments.length === 1) {\r\n        const e = this.builder();\r\n        \r\n        if (e.firstChild !== null) {\r\n\r\n          // Object not yet set\r\n          if (e.firstChild !== obj.element()) {\r\n            e.replaceChild(obj.element(), e.firstChild);\r\n          };\r\n        }\r\n\r\n        // Append root element\r\n        else {\r\n          e.appendChild(obj.element());\r\n        };\r\n\r\n        // Update parent child relations\r\n        this._root = obj;\r\n        obj.parent(this);\r\n\r\n        this.update();\r\n      };\r\n\r\n      return this._root;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the wrapper element associated with the vc\r\n     */\r\n    builder : function () {\r\n      const t = this;\r\n\r\n      // Initialize if necessary\r\n      if (t._builder !== undefined)\r\n        return t._builder;\r\n\r\n      t.element();\r\n      return t._builder;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the element associated with the virtual corpus\r\n     */\r\n    element : function() {\r\n      const t = this;\r\n      let e = t._el;\r\n\r\n      if (e !== undefined)\r\n        return e;\r\n\r\n\r\n      e = t._el = document.createElement('div');\r\n      e.classList.add('vc');\r\n\r\n\r\n      t._builder = e.addE('div');\r\n      t._builder.setAttribute('class', 'builder');\r\n\r\n      const btn = buttonGroupClass.create(\r\n        ['action','button-view']\r\n      );\r\n\r\n      btn.add(loc.MINIMIZE, {'cls':['button-icon','minimize']}, function () {\r\n        this.minimize();\r\n      }.bind(t));\r\n\r\n      e.appendChild(btn.element());\r\n      \r\n      // Initialize root\r\n      t._builder.appendChild(t._root.element());      \r\n      \r\n      // Add panel to display corpus statistic, ...\r\n      t.addVcInfPanel();\r\n      \r\n      //Adds EventListener for corpus changes\r\n      t._el.addEventListener('vcChange', function (e) {\r\n        this.checkStatActive(e.detail);\r\n      }.bind(t), false);\r\n      \r\n      return e;\r\n    },\r\n\r\n\r\n    /**\r\n     * Check, if the VC is open\r\n     */\r\n    isOpen : function () {\r\n      if (!this._el)\r\n        return false;\r\n      return this._el.classList.contains('active');\r\n    },\r\n    \r\n\r\n    /**\r\n     * Open the VC view\r\n     */\r\n    open : function () {\r\n      this.element().classList.add('active');\r\n      if (this.onOpen)\r\n        this.onOpen();\r\n    },\r\n\r\n\r\n    /**\r\n     * Minimize the VC view\r\n     */\r\n    minimize : function () {\r\n      this.element().classList.remove('active');\r\n      if (this.onMinimize)\r\n        this.onMinimize();\r\n    },\r\n\r\n    \r\n    /**\r\n     * Update the whole object based on the underlying data structure\r\n     */    \r\n    update : function() {\r\n      this._root.update();\r\n      if (KorAP.vc) {\r\n        this.element().dispatchEvent(\r\n          new CustomEvent('vcChange', {'detail':this})\r\n        );\r\n      };\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Make the vc persistant by injecting the current timestamp as a\r\n     * creation date limit criterion.\r\n     * THIS IS CURRENTLY NOT USED\r\n     */\r\n    /*\r\n    makePersistant : function() {\r\n      // this.root().wrapOnRoot('and');\r\n      var todayStr = KorAP._vcDatePicker.today();\r\n      var doc = docClass.create();\r\n      var root = this.root();\r\n\r\n      if (root.ldType() === 'docGroup' && root.operation === 'and') {\r\n        root.append(cond);\r\n      } else {\r\n        root.wrapOnRoot('and');\r\n        root.append(doc);\r\n      };\r\n\r\n      doc.key(\"creationDate\");\r\n      doc.type(\"date\");\r\n      doc.matchop(\"leq\");\r\n      doc.value(todayStr);\r\n\r\n      // { \"@type\" : \"koral:doc\", \"key\" : \"creationDate\", \"type\" :\r\n      // \"type:date\", \"match\" : \"match:leq\", \"value\" : todayStr }\r\n      // this.root().append(cond);\r\n      this.update();\r\n    },\r\n    */\r\n\r\n\r\n    // Get the reference name\r\n    getName : function () {\r\n      if (this._root.ldType() === 'non') {\r\n        return loc.VC_allCorpora;\r\n      }\r\n      else if (this._root.ldType() === 'docGroupRef') {\r\n        return this._root.ref();\r\n      }\r\n      else {\r\n        return loc.VC_oneCollection;\r\n      }\r\n    },\r\n\r\n\r\n    // Add \"and\" constraint to VC\r\n    addRequired : function (doc) {\r\n      const root = this.root();\r\n      const ldType = root.ldType();\r\n      const parent = root.parent();\r\n\r\n      if (ldType === 'non') {\r\n        parent.root(doc);\r\n      }\r\n\r\n      // root is doc\r\n      else if (\r\n        ldType === 'doc' ||\r\n          ldType === 'docGroupRef' ||\r\n          (ldType === 'docGroup' &&\r\n           root.operation() === 'or'\r\n          )) {\r\n        const group = require('vc/docgroup').create(\r\n          parent\r\n        );\r\n        group.operation(\"and\");\r\n        group.append(root);\r\n        group.append(doc);\r\n        group.element(); // Init (seems to be necessary)\r\n        parent.root(group);\r\n      }\r\n      \r\n      // root is a docGroup\r\n      // and is already an 'and'-Group\r\n      else if (ldType === 'docGroup') {\r\n        root.append(doc);\r\n      }\r\n\r\n      // Unknown\r\n      else {\r\n        console.log(\"Unknown root object\");\r\n      };\r\n\r\n      // Init element and update\r\n      this.update();\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the generated json string\r\n     */\r\n    toJson : function () {\r\n      return this._root.toJson();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the generated query string\r\n     */\r\n    toQuery : function () {\r\n      return this._root.toQuery();\r\n    },\r\n\r\n    \r\n    /**\r\n     * Add panel to display virtual corpus information\r\n     */\r\n    addVcInfPanel : function () {\r\n      // Create panel  \r\n      this.panel = vcPanelClass.create(this); \r\n      this._el.addE('div').appendChild(this.panel.element());\r\n      \r\n    },\r\n    \r\n    /**\r\n     * Checks if corpus statistic has to be disabled,\r\n     * and to be updated after clicking at the \"reload-button\"\r\n     */\r\n    checkStatActive : function (){\r\n      if (this.panel !== undefined && this.panel.statView !== undefined){\r\n        this.panel.statView.checkStatActive();\r\n      };\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Corpus specific localization, here for DeReKo (http://www1.ids-mannheim.de/kl/projekte/korpora.html)\r\n * \r\n * @author Helge Stallkamp\r\n */\r\n\r\n\r\n\r\ndefine('loc/dereko',['vc', 'vc/doc'], function (vcClass, docClass) {\r\n  const loc = KorAP.Locale;\r\n  \r\n  //Query example for guided tour\r\n  loc.TOUR_Qexample = \"laufen\";\r\n\r\n  /* To define vc for guided tour */\r\n  loc.TOUR_vcQuery = {\r\n      '@type' : 'koral:doc',\r\n      'key' : 'docSigle', \r\n      'match': 'match:eq',\r\n      'value' : 'WPD17/D01',   \r\n    };\r\n  \r\n  loc.TOUR_Relations = \"corenlp/c\";\r\n\r\n});\r\n\n\r\n\r\ndefine('match/treeitem',['menu/item'], function (itemClass) {\r\n\r\n  /**\r\n   * Menu item for tree view choice.\r\n   */\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new menu item\r\n     * for tree views.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(itemClass)\r\n\t      .upgradeTo(this)._init(params);\r\n    },\r\n\r\n    /**\r\n     * Get or set the content of the\r\n     * menu item.\r\n     */\r\n    content : function (content) {\r\n      if (arguments.length === 1) {\r\n\t      this._content = content;\r\n      };\r\n      return this._content;\r\n    },\r\n    \r\n\r\n    /**\r\n     * The foundry attribute of the menu item.\r\n     */\r\n    foundry : function () {\r\n      return this._foundry;\r\n    },\r\n\r\n\r\n    /**\r\n     * The layer attribute of the menu item.\r\n     */\r\n    layer : function () {\r\n      return this._layer;\r\n    },\r\n\r\n\r\n    /**\r\n     * The type attribute of the menu item.\r\n     * Is either \"spans\" or \"rels\".\r\n     */\r\n    type : function () {\r\n      return this._type;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Override click action of the menu item.\r\n     */\r\n    onclick : function (e) {\r\n      const menu = this.menu();\r\n      menu.hide();\r\n      e.halt();\r\n\r\n      if (menu.panel() !== undefined) {\r\n\t      menu.panel().addTree(this._foundry, this._layer, this._type);\r\n      };\r\n    },\r\n\r\n\r\n    // Initialize tree menu item.\r\n    _init : function (params) {\r\n      if (params[0] === undefined)\r\n\t      throw new Error(\"Missing parameters\");\r\n\r\n      const t = this;\r\n\r\n      t._name    = params[0];\r\n      t._foundry = params[1];\r\n      t._layer   = params[2];\r\n      t._type    = params[3];\r\n      t._content = document.createTextNode(t._name);\r\n      t._lcField = ' ' + t.content().textContent.toLowerCase();\r\n      return t;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * QueryCreator for Kalamar.\r\n * This creates a Poliqarp/CQP query by using the\r\n * annotation table.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('match/querycreator',['util'], function () {\r\n\r\n  /*\r\n   * TODO:\r\n   *   Cache foundry and layer information per row.\r\n   * TODO:\r\n   *   Or-Groups are no longer in use.\r\n   * TODO:\r\n   *   Make language and input fields snigletons!\r\n   */\r\n  const loc = KorAP.Locale;\r\n  loc.NEW_QUERY = loc.NEW_QUERY || 'New Query';\r\n\r\n  const esc = RegExp(\"^(?:[^ \\:\\.\\'\\\\\\\\\\|\\&]+:)?[^ \\:\\.\\'\\\\\\\\\\|\\&]+$\");\r\n  \r\n  function _getKeyValue (keyValue) {\r\n    if (keyValue.match(esc) === null) {\r\n      return \"'\" + keyValue.replace(/\\\\/g, \"\\\\\\\\\").replace(/'/g, \"\\\\'\") + \"'\";\r\n    };\r\n    return keyValue;\r\n  };\r\n  \r\n  function _getAnnotation (prefix, target) {\r\n\r\n    // Complex annotation\r\n    if (target.childNodes.length > 1) {\r\n      let orGroup = [];\r\n\r\n      // Iterate over alternative annotations\r\n      target.childNodes.forEach(function (item) {\r\n        if (item.nodeType === 3)\r\n          orGroup.push(prefix + _getKeyValue(item.data));\r\n      });\r\n      return '(' + orGroup.sort().join(' | ') + ')';\r\n    }\r\n\r\n    // Simple annotation\r\n    else {\r\n      if (target.innerText == '')\r\n        return '';\r\n\r\n      return prefix + _getKeyValue(target.innerText);\r\n    };\r\n  };\r\n\r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function (matchTable) {\r\n      return Object.create(this)._init(matchTable);\r\n    },\r\n\r\n    // Initialize query creator\r\n    _init : function (matchTable) {\r\n\r\n      // Parameter checks\r\n      if (matchTable === undefined)\r\n        throw new Error('Missing parameters');\r\n      else if (!(matchTable instanceof Node))\r\n        throw new Error('Requires element');\r\n\r\n      const t = this;\r\n\r\n      // Collect the token sequence in an array\r\n      t._query = []\r\n\r\n      // Get the match table\r\n      t._matchTable = matchTable;\r\n\r\n      // Listen on the match table\r\n      t._matchTable.addEventListener(\r\n        \"click\", t.clickOnAnno.bind(t), false\r\n      );\r\n\r\n      // Initialize element\r\n      const e = t._el = document.createElement('p');\r\n      e.classList.add('query','fragment');\r\n\r\n      // Prepend info text\r\n      e.addE('span').addT(loc.NEW_QUERY + ':');\r\n\r\n      // Append query fragment part\r\n      t._queryFragment = e.addE('span');\r\n\r\n      // Event when the query fragment is clicked\r\n      e.addEventListener('click', t.toQueryBar.bind(t), 1);\r\n\r\n      // Get some basic information - see tutorial.js\r\n      // TODO:\r\n      //   It may be better to consultate a global object\r\n      //   like KorAP.Hint, however ...\r\n      t._ql = document.getElementById(\"ql-field\");\r\n\t    t._q = document.getElementById(\"q-field\")\r\n\r\n      t._shown = false;\r\n      return t;\r\n    },\r\n\r\n\r\n    // Realease a click event on the annotation table\r\n    clickOnAnno : function (event) {\r\n      \r\n      // Listen for clicks on table cells\r\n      if (event.target !== event.currentTarget) {\r\n\r\n        // Get target event\r\n        const target = event.target;\r\n\r\n        let head, foundry, layer, i, sib, annotation;\r\n\r\n        if (target.tagName == 'TD') {\r\n\r\n          if (target.innerText == '')\r\n            return;\r\n\r\n          if (target.classList.contains('matchkeyvalues'))\r\n            return;\r\n\r\n\r\n          // Check foundry and layer\r\n          head    = target.parentNode.getElementsByTagName('th');\r\n          foundry = head[0].innerText;\r\n          layer   = head[1].innerText;\r\n\r\n          // Check index position:\r\n          i = -2;\r\n          sib = target;\r\n          while ((sib = sib.previousSibling) != null) {\r\n            if (sib.nodeType === 1)\r\n              i++;\r\n          };\r\n\r\n          // Get annotation value from cell\r\n          annotation = _getAnnotation(foundry + '/' + layer + '=', target);\r\n\r\n          if (annotation !== '') {\r\n\r\n            // Add term\r\n            this.toggleInToken(target, i, annotation);\r\n          };\r\n        }\r\n\r\n        // The annotation is part of a key-value-pair\r\n        else if (target.tagName == 'SPAN' || target.tagName == 'DIV') {\r\n\r\n          if (target.innerText == '')\r\n            return;\r\n\r\n          if (target.tagName == 'SPAN') {\r\n            target = target.parentNode;\r\n          };\r\n\r\n          // Check foundry and layer\r\n          const parentCell = target.parentNode;\r\n          head    = parentCell.parentNode.getElementsByTagName('th');\r\n          foundry = head[0].innerText;\r\n          layer   = head[1].innerText;\r\n\r\n          // Check index position of parent cell\r\n          i = -2;\r\n          sib = parentCell;\r\n          while((sib = sib.previousSibling) != null) {\r\n            if (sib.nodeType === 1)\r\n              i++;\r\n          };\r\n\r\n          // Get annotation value from cell\r\n          annotation = _getAnnotation(foundry + '/' + layer + '=', target);\r\n\r\n          if (annotation !== '') {\r\n\r\n            // Add term\r\n            this.toggleInToken(target, i, annotation);\r\n          }\r\n        }\r\n\r\n        // Get orth values\r\n        else if (target.tagName == 'TH') {\r\n\r\n          // The head is in the top row\r\n          if (target.parentNode.parentNode.tagName == 'THEAD') {\r\n\r\n            // Ignore cutted field\r\n            if (target.classList.contains(\"cutted\")) {\r\n              return;\r\n            }\r\n\r\n            i = -2;\r\n            sib = target;\r\n            while ((sib = sib.previousSibling) != null) {\r\n              if (sib.nodeType === 1)\r\n                i++;\r\n            };\r\n\r\n            // Target is an orth\r\n            if (i >= 0) {\r\n              this.toggleInToken(target, i, _getAnnotation(\"orth=\",target));\r\n            }            \r\n          }\r\n\r\n          // The head refers to the complete row\r\n          // Mark the complete row!\r\n          else {\r\n\r\n            // Check foundry and layer\r\n            head    = target.parentNode.getElementsByTagName('th');\r\n            foundry = head[0].innerText;\r\n            layer   = head[1].innerText;\r\n            const prefix = foundry + '/' + layer + '=';\r\n\r\n            // Iterate over all siblings\r\n            i = 0;\r\n            sib = target;\r\n            while ((sib = sib.nextSibling) != null) {\r\n              if (sib.nodeType !== 1 || sib.tagName === 'TH')\r\n                continue;\r\n\r\n              // Is a key-value-cell\r\n              if (sib.classList.contains('matchkeyvalues')) {\r\n\r\n                Array.from(\r\n                  sib.getElementsByTagName('div')\r\n                ).forEach(function(keyvaluepair){\r\n\r\n                  // Get annotation value from cell\r\n                  annotation = _getAnnotation(prefix, keyvaluepair);\r\n\r\n                  if (annotation !== '') {\r\n\r\n                    // Add annotation to string\r\n                    this._addToToken(i, annotation);\r\n                    keyvaluepair.classList.add('chosen');\r\n                  };\r\n                }, this);\r\n              }\r\n\r\n              // Normal cell\r\n              else {\r\n\r\n                // Get annotation value from cell\r\n                annotation = _getAnnotation(prefix, sib);\r\n\r\n                if (annotation !== '') {\r\n\r\n                  // Add annotation to string\r\n                  this._addToToken(i, annotation);\r\n                  sib.classList.add('chosen');\r\n                };\r\n              }\r\n\r\n              i++;\r\n            };\r\n          };\r\n        };\r\n      };\r\n\r\n      event.stopPropagation();\r\n    },\r\n\r\n\r\n    // Add term to token\r\n    _addToToken : function (index, term) {\r\n\r\n      let token = this._query[index];\r\n\r\n      // Initialize token\r\n      if (token === undefined) {\r\n        token = this._query[index] = [];\r\n      };\r\n\r\n      // Push to token array\r\n      token.push(term);\r\n\r\n      // Make terms unique\r\n      this._query[index] = token.filter(\r\n        function (e, i, arr) {\r\n          return arr.lastIndexOf(e) === i;\r\n        }\r\n      );\r\n\r\n      this.show();\r\n    },\r\n\r\n\r\n    // Remove term from token\r\n    _removeFromToken : function (index, term) {\r\n      let token = this._query[index];\r\n\r\n      if (token === undefined)\r\n        return;\r\n\r\n      token.splice(token.indexOf(term), 1);\r\n\r\n      this._query[index] = token.length > 0 ? token : undefined;\r\n      \r\n      this.show();\r\n    },\r\n\r\n    \r\n    // Get element representing annotation line\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n\r\n    // Check if the query fragment is shown\r\n    shown : function () {\r\n      return this._shown;\r\n    },\r\n\r\n    \r\n    // Show annotation fragment\r\n    show : function () {\r\n\r\n      const t = this;\r\n      const str = t.toString();\r\n      const m = t._matchTable;\r\n\r\n      // Fragment is empty\r\n      if (str === '') {\r\n\r\n        // Hide element\r\n        if (t._shown === true) {\r\n          m.parentNode.removeChild(t._el);\r\n          t._shown = false;\r\n        }\r\n      }\r\n\r\n      // Fragment is defined\r\n      else {\r\n\r\n        if (t._shown === false) {\r\n\r\n          // Insert after\r\n          m.parentNode.insertBefore(\r\n            t._el, m.nextSibling\r\n          );\r\n          t._shown = true;\r\n        };\r\n\r\n        // set value\r\n        t._queryFragment.innerText = str;\r\n      };\r\n    },\r\n\r\n\r\n    // Add term to token if not yet chosen, otherwise remove\r\n    toggleInToken : function (node, index, term) {\r\n      const cl = node.classList;\r\n      if (cl.contains('chosen')) {\r\n        this._removeFromToken(index, term);\r\n        cl.remove('chosen');\r\n      }\r\n      else {\r\n        this._addToToken(index, term);\r\n        cl.add('chosen');\r\n      };\r\n    },\r\n\r\n\r\n    // Stringify annotation\r\n    toString : function () {\r\n      let str = '';\r\n      let distance = 0;\r\n\r\n      // This needs to take undefined tokens into account, therefore\r\n      // forEach() is not an option\r\n      let token;\r\n      for (let i = 0; i < this._query.length; i++) {\r\n        token = this._query[i];\r\n\r\n        // Token is defined\r\n        if (token !== undefined) {\r\n          if (distance > 0) {\r\n            str += '[]';\r\n            if (distance > 1) {\r\n              str += '{' + distance + '}';\r\n            };\r\n            distance = 0;\r\n          };\r\n          \r\n          str += '[' + token.sort().join(\" & \") + ']';\r\n        }\r\n\r\n        // Token is not defined - but distances count\r\n        else if (str !== '') {\r\n          distance++;\r\n        };\r\n      };\r\n\r\n      return str;\r\n    },\r\n\r\n\r\n    // Add query fragment to query bar\r\n    toQueryBar : function (e) {\r\n      const t = this;\r\n\r\n      if (t._ql === undefined || t._q === undefined || t._ql === null) {\r\n        console.log('No query language object defined');\r\n        return;\r\n      };\r\n\r\n      // Find query language field for Poliqarp\r\n      const ql = Array.from(\r\n        t._ql.options\r\n      ).find(e => e.value == 'poliqarp');\r\n\r\n      if (ql)\r\n        ql.selected = true;\r\n\r\n      // Insert to query bar\r\n      t._q.value = t.toString();\r\n\r\n      // Scroll to top\r\n      window.scrollTo(0, 0);\r\n    }\r\n  };  \r\n});\r\n\n/**\r\n * Table representation of token-based\r\n * annotations of a match.\r\n */\r\n\r\n\r\ndefine('match/table',[\r\n  'match/querycreator',\r\n  \"util\"\r\n], function (matchQueryCreator) {\r\n\r\n  /*\r\n   * TODO:\r\n   *   Create base object for all matchinfo classes!\r\n   * TODO:\r\n   *   Rename to match/annotationtable\r\n   */\r\n  const _TermRE = new RegExp(\"^(?:([^\\/]+?)\\/)?([^:]+?):(.+?)$\");\r\n  const d = document;\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new table view for a match\r\n     * based on a snippet string.\r\n     */\r\n    create : function (snippet) {\r\n      return Object.create(this)._init(snippet);\r\n    },\r\n\r\n    // Initialize table based on snippet\r\n    _init : function (snippet) {\r\n\r\n      // Create html for traversal\r\n      const html = d.createElement(\"div\");\r\n      const t = this;\r\n      html.innerHTML = snippet;\r\n      \r\n      t._pos     = 0;\r\n      t._token   = [];\r\n      t._mark    = [];\r\n      t._markE   = undefined;\r\n      t._cutted  = [];\r\n      t._info    = [];\r\n      t._foundry = {};\r\n      t._layer   = {};\r\n    \r\n      // Parse the snippet\r\n      t._parse(html.childNodes, false);      \r\n\r\n      html.innerHTML = '';\r\n      return t;\r\n    },\r\n\r\n\r\n    // TODO: Destroy match!\r\n    destroy : function () {\r\n      this._matchCreator = undefined;\r\n    },\r\n\r\n\r\n    /**\r\n     * Length of the table (columns),\r\n     * aka the number of tokens\r\n     * in the snippet.\r\n     */\r\n    length : function () {\r\n      return this._pos;\r\n    },\r\n\r\n\r\n    /**\r\n     * Move the viewport to the match\r\n     */\r\n    toMark : function () {\r\n      if (this._markE === undefined)\r\n        return;\r\n      this._markE.scrollIntoView({\r\n        inline: \"start\",\r\n        block: \"nearest\"\r\n      });\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the token in the snippet\r\n     * At a given position.\r\n     *\r\n     * @param pos\r\n     */\r\n    getToken : function (pos) {\r\n      if (pos === undefined)\r\n        return this._token;\r\n      return this._token[pos];\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the annotation of a token\r\n     * in the snippet based on the position,\r\n     * the foundry, and the layer.\r\n     *\r\n     * @param pos\r\n     * @param foundry\r\n     * @param layer\r\n     */\r\n    getValue : function (pos, foundry, layer) {\r\n      return this._info[pos][foundry + '/' + layer]\r\n    },\r\n\r\n\r\n    // Parse the snippet\r\n    _parse : function (children, mark) {\r\n\r\n      // Get all children\r\n      children.forEach(function(c) {\r\n        const t = this;\r\n\r\n        // Create object on position unless it exists\r\n        if (t._info[t._pos] === undefined) {\r\n          t._info[t._pos] = {};\r\n        };\r\n\r\n        // Store at position in foundry/layer as array\r\n        const found = t._info[t._pos];\r\n\r\n        // Element with title\r\n        if (c.nodeType === 1) {\r\n          let newMark = mark;\r\n\r\n          if (c.tagName === 'MARK') {\r\n            newMark = true;\r\n          }\r\n\r\n          else if (c.hasAttribute(\"title\") &&\r\n              _TermRE.exec(c.getAttribute(\"title\"))) {\r\n\r\n            // Fill position with info\r\n            let foundry, layer, value;\r\n            if (RegExp.$2) {\r\n              foundry = RegExp.$1;\r\n              layer   = RegExp.$2;\r\n            }\r\n            else {\r\n              foundry = \"base\";\r\n              layer   = RegExp.$1\r\n            };\r\n\r\n            value = RegExp.$3;\r\n      \r\n            if (found[foundry + \"/\" + layer] === undefined) {\r\n              found[foundry + \"/\" + layer] = [value];\r\n            }\r\n            else {\r\n              // if (found[foundry + \"/\" + layer].indexOf(value) === -1) {\r\n              if (!found[foundry + \"/\" + layer].includes(value)) {\r\n                // Push value to foundry/layer at correct position\r\n                found[foundry + \"/\" + layer].push(value);\r\n              };\r\n            }\r\n\r\n            // Set foundry\r\n            if (t._foundry[foundry] === undefined)\r\n              t._foundry[foundry] = {};\r\n            t._foundry[foundry][layer] = 1;\r\n\r\n            // Set layer\r\n            if (t._layer[layer] === undefined)\r\n              t._layer[layer] = {};\r\n            t._layer[layer][foundry] = 1;\r\n          }\r\n\r\n          // The current position marks a cut\r\n          else if (c.hasAttribute(\"class\") && c.getAttribute(\"class\") == \"cutted\") {\r\n            t._cutted.push(t._pos);\r\n            t._token[t._pos++] = \"\";            \r\n          }\r\n\r\n          // depth search\r\n          if (c.hasChildNodes())\r\n            t._parse(c.childNodes, newMark);\r\n        }\r\n\r\n        // Leaf node\r\n        // store string on position and go to next string\r\n        else if (c.nodeType === 3) {\r\n          if (c.nodeValue.match(/[a-z0-9\\u25ae]/iu)) {\r\n            t._mark[t._pos] = mark ? true : false;\r\n            t._token[t._pos++] = c.nodeValue;\r\n          };\r\n        };\r\n      }, this);\r\n\r\n      delete this._info[this._pos];\r\n    },\r\n\r\n\r\n    /**\r\n     * Get HTML table view of annotations.\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      // First the legend table\r\n      const wrap = d.createElement('div');\r\n\r\n      const table = wrap.addE('table');\r\n\r\n      this._el = wrap;\r\n\r\n      // Single row in head\r\n      let tr = table.addE('thead').addE('tr');\r\n\r\n      const ah = KorAP.annotationHelper || { \"getDesc\" : function () {}};\r\n      \r\n      // Add cell to row\r\n      const addCell = function (type, key, value) {        \r\n        const c = this.addE(type);\r\n\r\n        if (value === undefined)\r\n          return c;\r\n\r\n        if (key && value instanceof Array && value[1] !== undefined) {\r\n\r\n          // There are multiple values to add\r\n          c.classList.add('matchkeyvalues');\r\n\r\n          let e, anno;\r\n          value.forEach(function(v) {\r\n            e = c.addE('div');\r\n            e.addT(v);\r\n\r\n            anno = ah.getDesc(key, v);\r\n\r\n            if (anno)\r\n              e.setAttribute(\"title\", anno);\r\n          });\r\n        }\r\n\r\n        else {\r\n\r\n          if (value instanceof Array)\r\n            value = value[0];\r\n\r\n          c.addT(value);\r\n\r\n          // Add tooltip\r\n          const anno = ah.getDesc(key, value);\r\n          if (anno)\r\n            c.setAttribute(\"title\", anno);\r\n        };\r\n\r\n        return c;\r\n      };\r\n\r\n      tr.addCell = addCell;\r\n\r\n      // Add header information\r\n      tr.addCell('th', undefined, 'Foundry');\r\n      tr.addCell('th', undefined, 'Layer');\r\n\r\n      // Add tokens\r\n      Object.keys(this._token).forEach(function(i) {\r\n        const surface = this.getToken(i);\r\n        const c = tr.addCell('th', undefined, surface);\r\n        if (this._mark[i]) {\r\n          c.classList.add('mark');\r\n          if (this._markE === undefined) {\r\n            this._markE = c;\r\n          };\r\n        }\r\n        else if (this._cutted[0] == i || this._cutted[1] == i) {\r\n          c.classList.add('cutted');\r\n        };\r\n\r\n        // In case the title is very long - add a title attribute\r\n        if (surface.length > 20) {\r\n          c.setAttribute(\"title\", surface)\r\n        }\r\n      }, this);\r\n      \r\n      const tbody = table.addE('tbody');\r\n\r\n      let layerList, key, v, value, cell;\r\n      \r\n      Object.keys(this._foundry).sort().forEach(function(foundry) {\r\n        let layerList =\r\n            Object.keys(this._foundry[foundry]).sort();\r\n\r\n        layerList.forEach(function(layer) {\r\n\r\n          tr = tbody.addE('tr');\r\n          tr.setAttribute('tabindex', 0);\r\n          tr.addCell = addCell;\r\n          tr.addCell('th', undefined, foundry);\r\n          tr.addCell('th', undefined, layer);\r\n\r\n          key = foundry + '/' + layer + '=';\r\n\r\n          for (v = 0; v < this.length(); v++) {\r\n\r\n            // Get the cell value\r\n            value = this.getValue(v, foundry, layer);\r\n\r\n            // Add cell to row\r\n            cell = tr.addCell(\r\n              'td',\r\n              key,\r\n              value \r\n            );\r\n\r\n            if (this._mark[v]) {\r\n              cell.classList.add('mark');\r\n            };\r\n          };\r\n        }, this);\r\n      }, this);\r\n      \r\n      // Add query creator\r\n      this._matchCreator = matchQueryCreator.create(this._el);\r\n      \r\n      return this._el;\r\n    },\r\n  };\r\n});\r\n\n/**\r\n * Object representing information\r\n * about a match's layer annotation.\r\n */\r\n\r\n\r\ndefine('match/infolayer',[],function () {\r\n\r\n  const _AvailableRE =\r\n    new RegExp(\"^([^\\/]+?)\\/([^=]+?)(?:=(spans|rels|tokens))?$\");\r\n\r\n  return {\r\n    /**\r\n     * Create new match information\r\n     * object for one layer.\r\n     *\r\n     * Alternatively pass a string as\r\n     * <tt>base/s=span</tt>\r\n     *\r\n     * @param foundry\r\n     */\r\n    create : function (foundry, layer, type) {\r\n      return Object.create(this)._init(foundry, layer, type);\r\n    },\r\n\r\n\r\n    // Initialize Layer \r\n    _init : function (foundry, layer, type) {\r\n      if (foundry === undefined)\r\n\t      throw new Error(\"Missing parameters\");\r\n\r\n      const t = this;\r\n      \r\n      if (layer === undefined) {\r\n\t      if (_AvailableRE.exec(foundry)) {\r\n\t        t.foundry = RegExp.$1;\r\n\t        t.layer = RegExp.$2;\r\n\t        t.type = RegExp.$3;\r\n\t      }\r\n\t      else {\r\n\t        throw new Error(\"Missing parameters\");\r\n\t      };\r\n      }\r\n      else {\r\n\t      t.foundry = foundry;\r\n\t      t.layer = layer;\r\n\t      t.type = type;\r\n      };\r\n      \r\n      if (t.type === undefined)\r\n\t      t.type = 'tokens';\r\n\r\n      return t;\r\n    }\r\n  };\r\n});\r\n\r\n\n\r\n\r\ndefine('view/match/tokentable',[\r\n  'view',\r\n  'match/table',\r\n  'match/infolayer'\r\n], function (viewClass, matchTableClass, infoLayerClass) {\r\n\r\n  const d = document;\r\n  \r\n  return {\r\n    create : function (match) {\r\n      return Object.create(viewClass)\r\n        ._init(['tokentable'])\r\n        .upgradeTo(this)\r\n        ._init(match);\r\n    },\r\n\r\n\r\n    _init : function (match) {\r\n      this._match = match;\r\n      return this;\r\n    },\r\n    \r\n\r\n    /**\r\n     * TokenTable view element\r\n     */\r\n    show : function () {\r\n      if (this._show)\r\n        return this._show;\r\n\r\n      // Append default table\r\n      const matchtable = d.createElement('div');\r\n      matchtable.classList.add('matchtable', 'loading');\r\n      this._show = matchtable;\r\n      return matchtable;\r\n    },\r\n\r\n\r\n    /**\r\n     * Do after embedding\r\n     */\r\n    afterEmbed : function () {\r\n      // TODO:\r\n      //   Create try-catch-exception-handling\r\n\r\n      // TODO:\r\n      //   Loading should have a timeout on view-level\r\n      //   matchtable.classList.remove('loading');\r\n\r\n      // var that = this;\r\n      const matchtable = this._show;\r\n\r\n      // Create the table asynchronous\r\n      this.getData(undefined, function (table) {\r\n\r\n        if (table !== null) {\r\n          matchtable.appendChild(table.element());\r\n          table.toMark();\r\n\t      };\r\n      });\r\n\r\n      // Load data\r\n      matchtable.classList.remove('loading');      \r\n    },\r\n\r\n\r\n    /**\r\n     * Get match object\r\n     */\r\n    match : function () {\r\n      return this._match;\r\n    },\r\n\r\n\r\n    /**\r\n     * Retrieve and parse snippet for table\r\n     * representation\r\n     */\r\n    getData : function (tokens, cb) {\r\n      let focus = [];\r\n\r\n      // Get all tokens\r\n      if (tokens === undefined) {\r\n        focus = this._match.getTokens();\r\n      }\r\n\r\n      // Get only some tokens\r\n      else {\r\n        \r\n        // Push newly to focus array\r\n        tokens.forEach(function(term) {\r\n          try {\r\n            // Create info layer objects\r\n            const layer = infoLayerClass.create(term);\r\n            layer.type = \"tokens\";\r\n            focus.push(layer);\r\n          }\r\n          catch (e) {\r\n            return;\r\n          };\r\n        });\r\n      };\r\n      \r\n      // No tokens chosen\r\n      if (focus.length == 0)\r\n        cb(null);\r\n\r\n      try {\r\n        // Get info (may be cached)\r\n        KorAP.API.getMatchInfo(\r\n          this._match,\r\n          { 'spans' : false, 'layer' : focus },\r\n        \r\n          // Callback for retrieval\r\n          function (matchResponse) {\r\n\r\n            if (matchResponse === undefined)\r\n              cb(null);\r\n\r\n            // Get snippet from match info\r\n            if (matchResponse[\"snippet\"] !== undefined) {\r\n              cb(\r\n                this._table = matchTableClass.create(matchResponse[\"snippet\"])\r\n              );\r\n            };\r\n          }.bind(this)\r\n        );\r\n      }\r\n      catch (e) {\r\n        KorAP.log(0, e);\r\n        cb(null);\r\n      };\r\n\r\n      /*\r\n      // Todo: Store the table as a hash of the focus\r\n      return null;\r\n      */\r\n    },\r\n\r\n\r\n    // Delete circular references\r\n    onClose : function () {\r\n      this._match = undefined;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Create a virtual corpus fragment,\r\n * that can be shown and merged with the\r\n * main VC.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\n\r\ndefine('vc/fragment',['vc/doc', 'util'], function (docClass) {\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.NEW_CONSTRAINT = loc.NEW_CONSTRAINT || 'New Constraint';\r\n  \r\n  // Create a VC doc\r\n  function _doc (op) {\r\n    const doc = document.createElement('div');\r\n    doc.setAttribute('class','doc');\r\n          \r\n    const key = doc.addE('span');\r\n    key.setAttribute('class','key');\r\n    key.addT(op[0]);\r\n\r\n    const match = doc.addE('span');\r\n    match.setAttribute('class','match');\r\n    match.addT('eq');\r\n\r\n    const value = doc.addE('span');\r\n    value.setAttribute('class', 'value');\r\n    value.addT(op[1]);\r\n\r\n    return doc;\r\n  };\r\n\r\n\r\n  // Return object\r\n  return {\r\n\r\n    /**\r\n     * Construct a new VC fragment.\r\n     */\r\n    create : function () {\r\n      const obj = Object.create(this);\r\n      obj._operands = [];\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Add document constraint to fragment\r\n     */\r\n    add : function (key, value, type) {\r\n      this._operands.forEach(function (op, i, arr) {\r\n        if (op[0] === key && op[1] === value) {\r\n          arr.splice(i,1);\r\n        }\r\n      });\r\n      this._operands.push([key, value, type]);\r\n      this.update();\r\n    },\r\n\r\n    \r\n    /**\r\n     * Remove document constraint from fragment\r\n     */\r\n    remove : function (key, value) {\r\n      for (let i = 0; i < this._operands.length; i++) {\r\n        let op = this._operands[i];\r\n        if (op[0] === key && op[1] === value) {\r\n          this._operands.splice(i, 1);\r\n          this.update();\r\n          return;\r\n        };\r\n      };\r\n      return;\r\n    },\r\n\r\n\r\n    /**\r\n     * Check, if the fragment contains any constraints\r\n     */\r\n    isEmpty : function () {\r\n      return this._operands.length > 0 ? false : true;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the element associated with the virtual corpus\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined) {\r\n        return this._el;\r\n      };\r\n\r\n      // Initialize element\r\n      const e = this._el = document.createElement('div');\r\n      e.classList.add('vc', 'fragment');\r\n\r\n      // Prepend info text\r\n      e.addE('span').addT(loc.NEW_CONSTRAINT + ':');\r\n      this._frag = e.addE('div');\r\n      \r\n      return e;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return operands as document objects\r\n     */\r\n    documents : function () {\r\n      return this._operands.map(\r\n        function (item) {\r\n          const doc = docClass.create();\r\n          doc.key(item[0]);\r\n          doc.matchop(\"eq\");\r\n          doc.value(item[1]);\r\n          doc.type(item[2] === \"date\" ? \"date\" : \"string\");\r\n          return doc;\r\n        }\r\n      );\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the whole object based on the underlying data structure\r\n     */\r\n    update : function() {\r\n\r\n      // <div class=\"docGroup\" data-operation=\"and\">\r\n      //   <div class=\"doc\">\r\n      //     <span class=\"key\">author</span>\r\n      //     <span class=\"match\">eq</span>\r\n      //     <span class=\"value\">Baum</span>\r\n      //   </div>\r\n      // </div>\r\n      let root;\r\n      const l = this._operands.length;\r\n\r\n      if (l > 1) {\r\n        root = document.createElement('div');\r\n        root.setAttribute('class','docGroup');\r\n        root.setAttribute('data-operation', 'and');\r\n        this._operands.forEach(i => root.appendChild(_doc(i)));\r\n      }\r\n\r\n      else if (l == 1) {\r\n        root = _doc(this._operands[0]);\r\n      };\r\n\r\n      // Init element\r\n      this.element();\r\n\r\n      const e = this._frag;\r\n      if (l === 0) {\r\n        _removeChildren(e);\r\n      }\r\n      else if (e.firstChild)\r\n        e.replaceChild(root, e.firstChild);\r\n      else\r\n        e.appendChild(root);\r\n        \r\n      return this;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Stringification\r\n     */\r\n    toQuery : function () {\r\n\r\n      if (this._operands.length === 0)\r\n        return '';\r\n\r\n      return this._operands.map(\r\n        function (item) {\r\n          if (item[2] === \"date\") {\r\n            return item[0] + ' in ' + item[1];\r\n          };\r\n          return item[0] + ' = ' + new String(item[1]).quote();\r\n        }\r\n      ).join(\" & \");\r\n    }\r\n  }\r\n});\r\n\n\r\n\r\ndefine('match/corpusByMatch',['vc/fragment', 'util'], function (vcFragmentClass) {\r\n  \r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function (meta) {\r\n      return Object.create(this)._init(meta);\r\n    },\r\n\r\n\r\n    // Initialize corpusByMatch\r\n    _init : function (meta) {\r\n      const t = this;\r\n\r\n      // Meta is an element <dl />\r\n      if (meta === undefined) {\r\n        throw new Error('Missing parameters');\r\n      }\r\n      else if (!(meta instanceof Node)) {\r\n        throw new Error(\"Requires element\");\r\n      };\r\n\r\n      // Collect the meta constraints\r\n      t._vc = {};\r\n\r\n      // Remember the meta table\r\n      t._meta = meta;\r\n\r\n      // CorpusByMatch can be disabled per configuration.\r\n      // This is necessary, as the feature won't work with\r\n      // indices created before Krill V0.57.\r\n      // This is an undocumented feature and will be\r\n      // removed in future versions.\r\n      // This will also require a change in matchinfo.scss\r\n      if (KorAP.Conf && KorAP.Conf[\"CorpusByMatchDisabled\"]) {\r\n        t._meta.classList.add(\"cbm-disabled\");\r\n        return t;\r\n      };\r\n\r\n      t._meta.addEventListener(\r\n        \"click\", t.clickOnMeta.bind(t), false\r\n      );\r\n\r\n      t._fragment = vcFragmentClass.create();      \r\n\r\n      t._fragment.element().addEventListener(\r\n        \"click\", t.toVcBuilder.bind(t), true\r\n      );\r\n\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Join fragment with VC\r\n     */\r\n    toVcBuilder : function (e) {\r\n      if (e)\r\n        e.stopPropagation();\r\n\r\n      if (this._fragment.isEmpty())\r\n        return;\r\n\r\n      const vc = KorAP.vc;\r\n      if (!vc) {\r\n        console.log(\"Global VC not established\");\r\n        return;\r\n      };\r\n\r\n      for (const doc of this._fragment.documents()) {\r\n        vc.addRequired(doc);\r\n      };\r\n\r\n      if (!vc.isOpen())\r\n        vc.open();\r\n\r\n      // Scroll to top\r\n      window.scrollTo(0, 0);\r\n    },\r\n\r\n\r\n    // Event handler for meta constraint creation\r\n    clickOnMeta : function (e) {\r\n      e.stopPropagation();\r\n      if (e.target === e.currentTarget) {\r\n        return;\r\n      };\r\n\r\n      // Get event target\r\n      const target = e.target;\r\n\r\n      let key, value, type;\r\n\r\n      // Meta information is a single value\r\n      if (target.tagName === 'DD') {\r\n        type = target.getAttribute(\"data-type\");\r\n        key  = target.previousElementSibling.innerText;\r\n        value = target.innerText;\r\n      }\r\n\r\n      // Meta information is in a list\r\n      else if (target.tagName === 'DIV') {\r\n        type = target.parentNode.getAttribute(\"data-type\");\r\n        key = target.parentNode.previousElementSibling.innerText;\r\n        value = target.innerText;\r\n      };\r\n\r\n      // Ignore stored types\r\n      if (type === \"type:store\" || type === \"type:attachement\")\r\n        return;\r\n\r\n      type = type || \"type:string\";\r\n\r\n      // Add or remove the constraint to the fragment\r\n      if (key && value) {\r\n        const t = this;\r\n        if (target.classList.contains(\"chosen\")) {\r\n          target.classList.remove(\"chosen\");\r\n          t.remove(key, value);\r\n        }\r\n        else {\r\n          target.classList.add(\"chosen\");\r\n          t.add(key, value, type);\r\n        };\r\n\r\n        // Check if the fragment is empty\r\n        // If empty - hide!\r\n        if (!t._fragment.isEmpty()) {\r\n          t._meta.parentNode.insertBefore(\r\n            t._fragment.element(),\r\n            t._meta.nextSibling\r\n          );\r\n        }\r\n\r\n        // Otherwise show!\r\n        else {\r\n          t._meta.parentNode.removeChild(\r\n            t._fragment.element()\r\n          );\r\n        };\r\n      }\r\n    },\r\n\r\n    /**\r\n     * Add constraint to fragment\r\n     */\r\n    add : function (key, value, type) {\r\n      type = type.replace(/^type:/, '');\r\n      this._fragment.add(key, value, type);\r\n    },\r\n\r\n\r\n    /**\r\n     * Remove constraint from fragment\r\n     */\r\n    remove : function (key, value) {\r\n      this._fragment.remove(key, value);\r\n    },\r\n    \r\n    /**\r\n     * Stringify fragment\r\n     */\r\n    toQuery : function () {\r\n      return this._fragment.toQuery();\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Parse Data URI scheme for attachement fields\r\n * Afterwards the object has the parameters\r\n * - contentType (defaults to text/plain)\r\n * - base64 (if the data was base64 encoded)\r\n * - isLink (if the contentType is application/x.korap-link)\r\n * - param (as a map of arbitrary parameters)\r\n * - payload (the URI decoded data)\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('match/attachement',[],function () {\r\n\r\n  const uriRE = new RegExp(\"^data: *([^;,]*?(?: *; *[^,;]+?)*) *, *(.+)$\");\r\n  const mapRE = new RegExp(\"^ *([^=]+?) *= *(.+?) *$\");\r\n\r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function (url) {\r\n      return Object.create(this)._init(url);\r\n    },\r\n\r\n    // Parse URI scheme\r\n    _init : function (url) {\r\n      const t = this;\r\n\r\n      // Decode\r\n      url = decodeURIComponent(url);\r\n\r\n      if (!uriRE.exec(url))\r\n        return;\r\n\r\n      t.payload = RegExp.$2;\r\n\r\n      let map = {};\r\n      let start = 0;\r\n      t.base64 = false;\r\n      t.isLink = false;\r\n      t.contentType = \"text/plain\";\r\n\r\n      // Split parameter map\r\n      RegExp.$1.split(/ *; */).map(function (item) {\r\n        const t = this;\r\n\r\n        // Check first parameter\r\n        if (!start++ && item.match(/^[-a-z0-9]+?\\/.+$/)) {\r\n          t.contentType = item;\r\n\r\n          if (item === \"application/x.korap-link\")\r\n            t.isLink = true;\r\n        }\r\n       \r\n        // Decode b64\r\n        else if (item.toLowerCase() == \"base64\") {\r\n          t.base64 = true;\r\n          t.payload = window.atob(t.payload);\r\n        }\r\n\r\n        // Parse arbitrary metadata\r\n        else if (mapRE.exec(item)) {\r\n          map[RegExp.$1] = RegExp.$2;\r\n        };\r\n      }.bind(t));\r\n\r\n      t.param = map;\r\n      return t;\r\n    },\r\n\r\n    /**\r\n     * Inline the attachement\r\n     * This should optimally be plugin-treatable\r\n     */ \r\n    inline : function () {\r\n      if (this.isLink) {\r\n        const title = this.param[\"title\"] || this.payload;\r\n        const a = document.createElement('a');\r\n        a.setAttribute('href', this.payload);\r\n        a.setAttribute('rel', 'noopener noreferrer');\r\n        a.addT(title);\r\n        return a;\r\n      };\r\n\r\n      return document.createTextNode(this.payload);\r\n    }\r\n  }\r\n});\r\n\n\r\n\r\ndefine('match/meta',['match/corpusByMatch','match/attachement','util'], function (cbmClass, attClass) {\r\n\r\n  // Localization values\r\n  const loc   = KorAP.Locale;\r\n  loc.METADATA = loc.METADATA || 'Metadata';\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new match object\r\n     */\r\n    create : function (match, fields) {\r\n      return Object.create(this)._init(match, fields);\r\n    },\r\n\r\n\r\n    /**\r\n     * Initialize object\r\n     */\r\n    _init : function (match, fields) {\r\n      this._match = match;\r\n      this._fields = fields;\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get match object\r\n     */\r\n    match : function () {\r\n      return this._match;\r\n    },\r\n\r\n\r\n    /**\r\n     * Create match reference view.\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      if (this._fields === null)\r\n        return;\r\n\r\n      const metaDL = document.createElement('dl');\r\n      metaDL.classList.add(\"flex\");\r\n\r\n      this._el = metaDL;\r\n\r\n      const fields = this._fields;\r\n\r\n      // Copy original array position to object\r\n      // before sorting by key title\r\n      const posInMetaArray = {};\r\n      fields.forEach((f,i) => posInMetaArray[f[\"key\"]] = i);\r\n\r\n      // TODO: Meta fields should be separated\r\n\r\n      // Sort all meta keys alphabetically\r\n      Object.keys(posInMetaArray).sort().forEach(function(k) {\r\n        let field = fields[posInMetaArray[k]]; // This is the object\r\n\r\n        let metaL, dt, metaDescr, metaDD, att;\r\n\r\n        // Ignore internal IDs\r\n        if (k !== \"UID\" &&\r\n            k !== \"corpusID\" &&\r\n            k !== \"docID\" &&\r\n            k !== \"textID\" &&\r\n            k !== \"layerInfos\") {\r\n\r\n          metaL = document.createElement('div');\r\n          \r\n          dt = metaL.addE('dt');\r\n          dt.addT(k);\r\n          dt.setAttribute(\"title\", k);\r\n          \r\n          metaDescr = field[\"value\"];\r\n          metaDD = metaL.addE('dd');\r\n          metaDD.setAttribute('data-type', field[\"type\"]);\r\n\r\n          if(metaDescr instanceof Array){\r\n        \t  metaDD.classList.add(\"metakeyvalues\");\r\n            metaDescr.forEach(function(md) {\r\n              if (field[\"type\"] === 'type:attachement') {\r\n                att = attClass.create(md);\r\n                if (att)\r\n        \t        metaDD.addE('div').appendChild(att.inline());\r\n              }\r\n              else {\r\n        \t      metaDD.addE('div').addT(md);\r\n              }\r\n        \t  });\r\n          }\r\n          else{\r\n            if (field[\"type\"] === 'type:attachement') {\r\n              att = attClass.create(field[\"value\"]);\r\n              if (att)\r\n                metaDD.appendChild(att.inline());\r\n            }\r\n            else {\r\n              metaDD.addT(field[\"value\"]);\r\n            };\r\n          }\r\n          \r\n          metaDL.appendChild(metaL);\r\n        };\r\n      });\r\n\r\n      // Add corpusByMatch assistant\r\n      this._corpusByMatch = cbmClass.create(this._el);\r\n\r\n      return this._el;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('view/match/meta',[\r\n  'view',\r\n  'match/meta'\r\n], function (viewClass, matchMetaClass) {\r\n\r\n  const d = document;\r\n  \r\n  return {\r\n    create : function (match) {\r\n      return Object.create(viewClass)\r\n        ._init(['metatable'])\r\n        .upgradeTo(this)\r\n        ._init(match);\r\n    },\r\n\r\n\r\n    _init : function (match) {\r\n      this._match = match;\r\n      return this;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Meta view element\r\n     */\r\n    show : function () {\r\n      if (this._show)\r\n        return this._show;\r\n\r\n      const metaTable = document.createElement('div');\r\n      metaTable.classList.add('metatable', 'loading');\r\n\r\n      this.getData(function (meta) {\r\n        if (meta === null)\r\n          return;\r\n\r\n        // Load data\r\n        metaTable.classList.remove('loading');\r\n        metaTable.appendChild(meta.element());\r\n      });\r\n\r\n\r\n      // TODO:\r\n      //   Loading should have a timeout on view-level\r\n      //   matchtable.classList.remove('loading');\r\n\r\n      return this._show = metaTable;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get match object\r\n     */\r\n    match : function () {\r\n      return this._match;\r\n    },\r\n\r\n\r\n    /**\r\n     * Retrieve and parse snippet for table\r\n     * representation\r\n     */\r\n    getData : function (cb) {\r\n\r\n      const match = this._match;\r\n      try {\r\n        KorAP.API.getTextInfo(\r\n          match, {}, function (textResponse) {\r\n            \r\n            if (textResponse === undefined) {\r\n              cb(null);\r\n              return;\r\n            };\r\n\r\n            const doc = textResponse[\"document\"];\r\n            if (doc === undefined) {\r\n              cb(null);\r\n              return;\r\n            };\r\n\r\n            const fields = doc[\"fields\"];\r\n            if (fields === undefined) {\r\n              cb(null);\r\n              return;\r\n            };\r\n\r\n            // Add metainfo to matchview\r\n            cb(matchMetaClass.create(\r\n              match, fields\r\n            ));\r\n          }\r\n        );\r\n      }\r\n      catch (e) {\r\n        KorAP.log(0, e);\r\n        cb(null);\r\n      };\r\n    },\r\n\r\n\r\n    // Delete circular references\r\n    onClose : function () {\r\n      this._match = undefined;\r\n    }\r\n  }\r\n});\r\n\n!function(e){if(\"object\"==typeof exports&&\"undefined\"!=typeof module)module.exports=e();else if(\"function\"==typeof define&&define.amd)define('lib/dagre',[],e);else{var f;\"undefined\"!=typeof window?f=window:\"undefined\"!=typeof global?f=global:\"undefined\"!=typeof self&&(f=self),f.dagre=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){\r\n/*\r\nCopyright (c) 2012-2014 Chris Pettitt\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in\r\nall copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\nTHE SOFTWARE.\r\n*/\r\n\r\nmodule.exports = {\r\n  graphlib: require(\"./lib/graphlib\"),\r\n\r\n  layout: require(\"./lib/layout\"),\r\n  debug: require(\"./lib/debug\"),\r\n  util: {\r\n    time: require(\"./lib/util\").time,\r\n    notime: require(\"./lib/util\").notime\r\n  },\r\n  version: require(\"./lib/version\")\r\n};\r\n\r\n},{\"./lib/debug\":6,\"./lib/graphlib\":7,\"./lib/layout\":9,\"./lib/util\":29,\"./lib/version\":30}],2:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\"),\r\n    greedyFAS = require(\"./greedy-fas\");\r\n\r\nmodule.exports = {\r\n  run: run,\r\n  undo: undo\r\n};\r\n\r\nfunction run(g) {\r\n  var fas = (g.graph().acyclicer === \"greedy\"\r\n                ? greedyFAS(g, weightFn(g))\r\n                : dfsFAS(g));\r\n  _.each(fas, function(e) {\r\n    var label = g.edge(e);\r\n    g.removeEdge(e);\r\n    label.forwardName = e.name;\r\n    label.reversed = true;\r\n    g.setEdge(e.w, e.v, label, _.uniqueId(\"rev\"));\r\n  });\r\n\r\n  function weightFn(g) {\r\n    return function(e) {\r\n      return g.edge(e).weight;\r\n    };\r\n  }\r\n}\r\n\r\nfunction dfsFAS(g) {\r\n  var fas = [],\r\n      stack = {},\r\n      visited = {};\r\n\r\n  function dfs(v) {\r\n    if (_.has(visited, v)) {\r\n      return;\r\n    }\r\n    visited[v] = true;\r\n    stack[v] = true;\r\n    _.each(g.outEdges(v), function(e) {\r\n      if (_.has(stack, e.w)) {\r\n        fas.push(e);\r\n      } else {\r\n        dfs(e.w);\r\n      }\r\n    });\r\n    delete stack[v];\r\n  }\r\n\r\n  _.each(g.nodes(), dfs);\r\n  return fas;\r\n}\r\n\r\nfunction undo(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var label = g.edge(e);\r\n    if (label.reversed) {\r\n      g.removeEdge(e);\r\n\r\n      var forwardName = label.forwardName;\r\n      delete label.reversed;\r\n      delete label.forwardName;\r\n      g.setEdge(e.w, e.v, label, forwardName);\r\n    }\r\n  });\r\n}\r\n\r\n},{\"./greedy-fas\":8,\"./lodash\":10}],3:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    util = require(\"./util\");\r\n\r\nmodule.exports = addBorderSegments;\r\n\r\nfunction addBorderSegments(g) {\r\n  function dfs(v) {\r\n    var children = g.children(v),\r\n        node = g.node(v);\r\n    if (children.length) {\r\n      _.each(children, dfs);\r\n    }\r\n\r\n    if (_.has(node, \"minRank\")) {\r\n      node.borderLeft = [];\r\n      node.borderRight = [];\r\n      for (var rank = node.minRank, maxRank = node.maxRank + 1;\r\n           rank < maxRank;\r\n           ++rank) {\r\n        addBorderNode(g, \"borderLeft\", \"_bl\", v, node, rank);\r\n        addBorderNode(g, \"borderRight\", \"_br\", v, node, rank);\r\n      }\r\n    }\r\n  }\r\n\r\n  _.each(g.children(), dfs);\r\n}\r\n\r\nfunction addBorderNode(g, prop, prefix, sg, sgNode, rank) {\r\n  var label = { width: 0, height: 0, rank: rank },\r\n      prev = sgNode[prop][rank - 1],\r\n      curr = util.addDummyNode(g, \"border\", label, prefix);\r\n  sgNode[prop][rank] = curr;\r\n  g.setParent(curr, sg);\r\n  if (prev) {\r\n    g.setEdge(prev, curr, { weight: 1 });\r\n  }\r\n}\r\n\r\n},{\"./lodash\":10,\"./util\":29}],4:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\");\r\n\r\nmodule.exports = {\r\n  adjust: adjust,\r\n  undo: undo\r\n};\r\n\r\nfunction adjust(g) {\r\n  var rankDir = g.graph().rankdir.toLowerCase();\r\n  if (rankDir === \"lr\" || rankDir === \"rl\") {\r\n    swapWidthHeight(g);\r\n  }\r\n}\r\n\r\nfunction undo(g) {\r\n  var rankDir = g.graph().rankdir.toLowerCase();\r\n  if (rankDir === \"bt\" || rankDir === \"rl\") {\r\n    reverseY(g);\r\n  }\r\n\r\n  if (rankDir === \"lr\" || rankDir === \"rl\") {\r\n    swapXY(g);\r\n    swapWidthHeight(g);\r\n  }\r\n}\r\n\r\nfunction swapWidthHeight(g) {\r\n  _.each(g.nodes(), function(v) { swapWidthHeightOne(g.node(v)); });\r\n  _.each(g.edges(), function(e) { swapWidthHeightOne(g.edge(e)); });\r\n}\r\n\r\nfunction swapWidthHeightOne(attrs) {\r\n  var w = attrs.width;\r\n  attrs.width = attrs.height;\r\n  attrs.height = w;\r\n}\r\n\r\nfunction reverseY(g) {\r\n  _.each(g.nodes(), function(v) { reverseYOne(g.node(v)); });\r\n\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    _.each(edge.points, reverseYOne);\r\n    if (_.has(edge, \"y\")) {\r\n      reverseYOne(edge);\r\n    }\r\n  });\r\n}\r\n\r\nfunction reverseYOne(attrs) {\r\n  attrs.y = -attrs.y;\r\n}\r\n\r\nfunction swapXY(g) {\r\n  _.each(g.nodes(), function(v) { swapXYOne(g.node(v)); });\r\n\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    _.each(edge.points, swapXYOne);\r\n    if (_.has(edge, \"x\")) {\r\n      swapXYOne(edge);\r\n    }\r\n  });\r\n}\r\n\r\nfunction swapXYOne(attrs) {\r\n  var x = attrs.x;\r\n  attrs.x = attrs.y;\r\n  attrs.y = x;\r\n}\r\n\r\n},{\"./lodash\":10}],5:[function(require,module,exports){\r\n/*\r\n * Simple doubly linked list implementation derived from Cormen, et al.,\r\n * \"Introduction to Algorithms\".\r\n */\r\n\r\nmodule.exports = List;\r\n\r\nfunction List() {\r\n  var sentinel = {};\r\n  sentinel._next = sentinel._prev = sentinel;\r\n  this._sentinel = sentinel;\r\n}\r\n\r\nList.prototype.dequeue = function() {\r\n  var sentinel = this._sentinel,\r\n      entry = sentinel._prev;\r\n  if (entry !== sentinel) {\r\n    unlink(entry);\r\n    return entry;\r\n  }\r\n};\r\n\r\nList.prototype.enqueue = function(entry) {\r\n  var sentinel = this._sentinel;\r\n  if (entry._prev && entry._next) {\r\n    unlink(entry);\r\n  }\r\n  entry._next = sentinel._next;\r\n  sentinel._next._prev = entry;\r\n  sentinel._next = entry;\r\n  entry._prev = sentinel;\r\n};\r\n\r\nList.prototype.toString = function() {\r\n  var strs = [],\r\n      sentinel = this._sentinel,\r\n      curr = sentinel._prev;\r\n  while (curr !== sentinel) {\r\n    strs.push(JSON.stringify(curr, filterOutLinks));\r\n    curr = curr._prev;\r\n  }\r\n  return \"[\" + strs.join(\", \") + \"]\";\r\n};\r\n\r\nfunction unlink(entry) {\r\n  entry._prev._next = entry._next;\r\n  entry._next._prev = entry._prev;\r\n  delete entry._next;\r\n  delete entry._prev;\r\n}\r\n\r\nfunction filterOutLinks(k, v) {\r\n  if (k !== \"_next\" && k !== \"_prev\") {\r\n    return v;\r\n  }\r\n}\r\n\r\n},{}],6:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    util = require(\"./util\"),\r\n    Graph = require(\"./graphlib\").Graph;\r\n\r\nmodule.exports = {\r\n  debugOrdering: debugOrdering\r\n};\r\n\r\n/* istanbul ignore next */\r\nfunction debugOrdering(g) {\r\n  var layerMatrix = util.buildLayerMatrix(g);\r\n\r\n  var h = new Graph({ compound: true, multigraph: true }).setGraph({});\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    h.setNode(v, { label: v });\r\n    h.setParent(v, \"layer\" + g.node(v).rank);\r\n  });\r\n\r\n  _.each(g.edges(), function(e) {\r\n    h.setEdge(e.v, e.w, {}, e.name);\r\n  });\r\n\r\n  _.each(layerMatrix, function(layer, i) {\r\n    var layerV = \"layer\" + i;\r\n    h.setNode(layerV, { rank: \"same\" });\r\n    _.reduce(layer, function(u, v) {\r\n      h.setEdge(u, v, { style: \"invis\" });\r\n      return v;\r\n    });\r\n  });\r\n\r\n  return h;\r\n}\r\n\r\n},{\"./graphlib\":7,\"./lodash\":10,\"./util\":29}],7:[function(require,module,exports){\r\n/* global window */\r\n\r\nvar graphlib;\r\n\r\nif (require) {\r\n  try {\r\n    graphlib = require(\"graphlib\");\r\n  } catch (e) {}\r\n}\r\n\r\nif (!graphlib) {\r\n  graphlib = window.graphlib;\r\n}\r\n\r\nmodule.exports = graphlib;\r\n\r\n},{\"graphlib\":31}],8:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    Graph = require(\"./graphlib\").Graph,\r\n    List = require(\"./data/list\");\r\n\r\n/*\r\n * A greedy heuristic for finding a feedback arc set for a graph. A feedback\r\n * arc set is a set of edges that can be removed to make a graph acyclic.\r\n * The algorithm comes from: P. Eades, X. Lin, and W. F. Smyth, \"A fast and\r\n * effective heuristic for the feedback arc set problem.\" This implementation\r\n * adjusts that from the paper to allow for weighted edges.\r\n */\r\nmodule.exports = greedyFAS;\r\n\r\nvar DEFAULT_WEIGHT_FN = _.constant(1);\r\n\r\nfunction greedyFAS(g, weightFn) {\r\n  if (g.nodeCount() <= 1) {\r\n    return [];\r\n  }\r\n  var state = buildState(g, weightFn || DEFAULT_WEIGHT_FN);\r\n  var results = doGreedyFAS(state.graph, state.buckets, state.zeroIdx);\r\n\r\n  // Expand multi-edges\r\n  return _.flatten(_.map(results, function(e) {\r\n    return g.outEdges(e.v, e.w);\r\n  }), true);\r\n}\r\n\r\nfunction doGreedyFAS(g, buckets, zeroIdx) {\r\n  var results = [],\r\n      sources = buckets[buckets.length - 1],\r\n      sinks = buckets[0];\r\n\r\n  var entry;\r\n  while (g.nodeCount()) {\r\n    while ((entry = sinks.dequeue()))   { removeNode(g, buckets, zeroIdx, entry); }\r\n    while ((entry = sources.dequeue())) { removeNode(g, buckets, zeroIdx, entry); }\r\n    if (g.nodeCount()) {\r\n      for (var i = buckets.length - 2; i > 0; --i) {\r\n        entry = buckets[i].dequeue();\r\n        if (entry) {\r\n          results = results.concat(removeNode(g, buckets, zeroIdx, entry, true));\r\n          break;\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  return results;\r\n}\r\n\r\nfunction removeNode(g, buckets, zeroIdx, entry, collectPredecessors) {\r\n  var results = collectPredecessors ? [] : undefined;\r\n\r\n  _.each(g.inEdges(entry.v), function(edge) {\r\n    var weight = g.edge(edge),\r\n        uEntry = g.node(edge.v);\r\n\r\n    if (collectPredecessors) {\r\n      results.push({ v: edge.v, w: edge.w });\r\n    }\r\n\r\n    uEntry.out -= weight;\r\n    assignBucket(buckets, zeroIdx, uEntry);\r\n  });\r\n\r\n  _.each(g.outEdges(entry.v), function(edge) {\r\n    var weight = g.edge(edge),\r\n        w = edge.w,\r\n        wEntry = g.node(w);\r\n    wEntry[\"in\"] -= weight;\r\n    assignBucket(buckets, zeroIdx, wEntry);\r\n  });\r\n\r\n  g.removeNode(entry.v);\r\n\r\n  return results;\r\n}\r\n\r\nfunction buildState(g, weightFn) {\r\n  var fasGraph = new Graph(),\r\n      maxIn = 0,\r\n      maxOut = 0;\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    fasGraph.setNode(v, { v: v, \"in\": 0, out: 0 });\r\n  });\r\n\r\n  // Aggregate weights on nodes, but also sum the weights across multi-edges\r\n  // into a single edge for the fasGraph.\r\n  _.each(g.edges(), function(e) {\r\n    var prevWeight = fasGraph.edge(e.v, e.w) || 0,\r\n        weight = weightFn(e),\r\n        edgeWeight = prevWeight + weight;\r\n    fasGraph.setEdge(e.v, e.w, edgeWeight);\r\n    maxOut = Math.max(maxOut, fasGraph.node(e.v).out += weight);\r\n    maxIn  = Math.max(maxIn,  fasGraph.node(e.w)[\"in\"]  += weight);\r\n  });\r\n\r\n  var buckets = _.range(maxOut + maxIn + 3).map(function() { return new List(); });\r\n  var zeroIdx = maxIn + 1;\r\n\r\n  _.each(fasGraph.nodes(), function(v) {\r\n    assignBucket(buckets, zeroIdx, fasGraph.node(v));\r\n  });\r\n\r\n  return { graph: fasGraph, buckets: buckets, zeroIdx: zeroIdx };\r\n}\r\n\r\nfunction assignBucket(buckets, zeroIdx, entry) {\r\n  if (!entry.out) {\r\n    buckets[0].enqueue(entry);\r\n  } else if (!entry[\"in\"]) {\r\n    buckets[buckets.length - 1].enqueue(entry);\r\n  } else {\r\n    buckets[entry.out - entry[\"in\"] + zeroIdx].enqueue(entry);\r\n  }\r\n}\r\n\r\n},{\"./data/list\":5,\"./graphlib\":7,\"./lodash\":10}],9:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\"),\r\n    acyclic = require(\"./acyclic\"),\r\n    normalize = require(\"./normalize\"),\r\n    rank = require(\"./rank\"),\r\n    normalizeRanks = require(\"./util\").normalizeRanks,\r\n    parentDummyChains = require(\"./parent-dummy-chains\"),\r\n    removeEmptyRanks = require(\"./util\").removeEmptyRanks,\r\n    nestingGraph = require(\"./nesting-graph\"),\r\n    addBorderSegments = require(\"./add-border-segments\"),\r\n    coordinateSystem = require(\"./coordinate-system\"),\r\n    order = require(\"./order\"),\r\n    position = require(\"./position\"),\r\n    util = require(\"./util\"),\r\n    Graph = require(\"./graphlib\").Graph;\r\n\r\nmodule.exports = layout;\r\n\r\nfunction layout(g, opts) {\r\n  var time = opts && opts.debugTiming ? util.time : util.notime;\r\n  time(\"layout\", function() {\r\n    var layoutGraph = time(\"  buildLayoutGraph\",\r\n                               function() { return buildLayoutGraph(g); });\r\n    time(\"  runLayout\",        function() { runLayout(layoutGraph, time); });\r\n    time(\"  updateInputGraph\", function() { updateInputGraph(g, layoutGraph); });\r\n  });\r\n}\r\n\r\nfunction runLayout(g, time) {\r\n  time(\"    makeSpaceForEdgeLabels\", function() { makeSpaceForEdgeLabels(g); });\r\n  time(\"    removeSelfEdges\",        function() { removeSelfEdges(g); });\r\n  time(\"    acyclic\",                function() { acyclic.run(g); });\r\n  time(\"    nestingGraph.run\",       function() { nestingGraph.run(g); });\r\n  time(\"    rank\",                   function() { rank(util.asNonCompoundGraph(g)); });\r\n  time(\"    injectEdgeLabelProxies\", function() { injectEdgeLabelProxies(g); });\r\n  time(\"    removeEmptyRanks\",       function() { removeEmptyRanks(g); });\r\n  time(\"    nestingGraph.cleanup\",   function() { nestingGraph.cleanup(g); });\r\n  time(\"    normalizeRanks\",         function() { normalizeRanks(g); });\r\n  time(\"    assignRankMinMax\",       function() { assignRankMinMax(g); });\r\n  time(\"    removeEdgeLabelProxies\", function() { removeEdgeLabelProxies(g); });\r\n  time(\"    normalize.run\",          function() { normalize.run(g); });\r\n  time(\"    parentDummyChains\",      function() { parentDummyChains(g); });\r\n  time(\"    addBorderSegments\",      function() { addBorderSegments(g); });\r\n  time(\"    order\",                  function() { order(g); });\r\n  time(\"    insertSelfEdges\",        function() { insertSelfEdges(g); });\r\n  time(\"    adjustCoordinateSystem\", function() { coordinateSystem.adjust(g); });\r\n  time(\"    position\",               function() { position(g); });\r\n  time(\"    positionSelfEdges\",      function() { positionSelfEdges(g); });\r\n  time(\"    removeBorderNodes\",      function() { removeBorderNodes(g); });\r\n  time(\"    normalize.undo\",         function() { normalize.undo(g); });\r\n  time(\"    fixupEdgeLabelCoords\",   function() { fixupEdgeLabelCoords(g); });\r\n  time(\"    undoCoordinateSystem\",   function() { coordinateSystem.undo(g); });\r\n  time(\"    translateGraph\",         function() { translateGraph(g); });\r\n  time(\"    assignNodeIntersects\",   function() { assignNodeIntersects(g); });\r\n  time(\"    reversePoints\",          function() { reversePointsForReversedEdges(g); });\r\n  time(\"    acyclic.undo\",           function() { acyclic.undo(g); });\r\n}\r\n\r\n/*\r\n * Copies final layout information from the layout graph back to the input\r\n * graph. This process only copies whitelisted attributes from the layout graph\r\n * to the input graph, so it serves as a good place to determine what\r\n * attributes can influence layout.\r\n */\r\nfunction updateInputGraph(inputGraph, layoutGraph) {\r\n  _.each(inputGraph.nodes(), function(v) {\r\n    var inputLabel = inputGraph.node(v),\r\n        layoutLabel = layoutGraph.node(v);\r\n\r\n    if (inputLabel) {\r\n      inputLabel.x = layoutLabel.x;\r\n      inputLabel.y = layoutLabel.y;\r\n\r\n      if (layoutGraph.children(v).length) {\r\n        inputLabel.width = layoutLabel.width;\r\n        inputLabel.height = layoutLabel.height;\r\n      }\r\n    }\r\n  });\r\n\r\n  _.each(inputGraph.edges(), function(e) {\r\n    var inputLabel = inputGraph.edge(e),\r\n        layoutLabel = layoutGraph.edge(e);\r\n\r\n    inputLabel.points = layoutLabel.points;\r\n    if (_.has(layoutLabel, \"x\")) {\r\n      inputLabel.x = layoutLabel.x;\r\n      inputLabel.y = layoutLabel.y;\r\n    }\r\n  });\r\n\r\n  inputGraph.graph().width = layoutGraph.graph().width;\r\n  inputGraph.graph().height = layoutGraph.graph().height;\r\n}\r\n\r\nvar graphNumAttrs = [\"nodesep\", \"edgesep\", \"ranksep\", \"marginx\", \"marginy\"],\r\n    graphDefaults = { ranksep: 50, edgesep: 20, nodesep: 50, rankdir: \"tb\" },\r\n    graphAttrs = [\"acyclicer\", \"ranker\", \"rankdir\", \"align\"],\r\n    nodeNumAttrs = [\"width\", \"height\"],\r\n    nodeDefaults = { width: 0, height: 0 },\r\n    edgeNumAttrs = [\"minlen\", \"weight\", \"width\", \"height\", \"labeloffset\"],\r\n    edgeDefaults = {\r\n      minlen: 1, weight: 1, width: 0, height: 0,\r\n      labeloffset: 10, labelpos: \"r\"\r\n    },\r\n    edgeAttrs = [\"labelpos\"];\r\n\r\n/*\r\n * Constructs a new graph from the input graph, which can be used for layout.\r\n * This process copies only whitelisted attributes from the input graph to the\r\n * layout graph. Thus this function serves as a good place to determine what\r\n * attributes can influence layout.\r\n */\r\nfunction buildLayoutGraph(inputGraph) {\r\n  var g = new Graph({ multigraph: true, compound: true }),\r\n      graph = canonicalize(inputGraph.graph());\r\n\r\n  g.setGraph(_.merge({},\r\n    graphDefaults,\r\n    selectNumberAttrs(graph, graphNumAttrs),\r\n    _.pick(graph, graphAttrs)));\r\n\r\n  _.each(inputGraph.nodes(), function(v) {\r\n    var node = canonicalize(inputGraph.node(v));\r\n    g.setNode(v, _.defaults(selectNumberAttrs(node, nodeNumAttrs), nodeDefaults));\r\n    g.setParent(v, inputGraph.parent(v));\r\n  });\r\n\r\n  _.each(inputGraph.edges(), function(e) {\r\n    var edge = canonicalize(inputGraph.edge(e));\r\n    g.setEdge(e, _.merge({},\r\n      edgeDefaults,\r\n      selectNumberAttrs(edge, edgeNumAttrs),\r\n      _.pick(edge, edgeAttrs)));\r\n  });\r\n\r\n  return g;\r\n}\r\n\r\n/*\r\n * This idea comes from the Gansner paper: to account for edge labels in our\r\n * layout we split each rank in half by doubling minlen and halving ranksep.\r\n * Then we can place labels at these mid-points between nodes.\r\n *\r\n * We also add some minimal padding to the width to push the label for the edge\r\n * away from the edge itself a bit.\r\n */\r\nfunction makeSpaceForEdgeLabels(g) {\r\n  var graph = g.graph();\r\n  graph.ranksep /= 2;\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    edge.minlen *= 2;\r\n    if (edge.labelpos.toLowerCase() !== \"c\") {\r\n      if (graph.rankdir === \"TB\" || graph.rankdir === \"BT\") {\r\n        edge.width += edge.labeloffset;\r\n      } else {\r\n        edge.height += edge.labeloffset;\r\n      }\r\n    }\r\n  });\r\n}\r\n\r\n/*\r\n * Creates temporary dummy nodes that capture the rank in which each edge's\r\n * label is going to, if it has one of non-zero width and height. We do this\r\n * so that we can safely remove empty ranks while preserving balance for the\r\n * label's position.\r\n */\r\nfunction injectEdgeLabelProxies(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (edge.width && edge.height) {\r\n      var v = g.node(e.v),\r\n          w = g.node(e.w),\r\n          label = { rank: (w.rank - v.rank) / 2 + v.rank, e: e };\r\n      util.addDummyNode(g, \"edge-proxy\", label, \"_ep\");\r\n    }\r\n  });\r\n}\r\n\r\nfunction assignRankMinMax(g) {\r\n  var maxRank = 0;\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    if (node.borderTop) {\r\n      node.minRank = g.node(node.borderTop).rank;\r\n      node.maxRank = g.node(node.borderBottom).rank;\r\n      maxRank = _.max(maxRank, node.maxRank);\r\n    }\r\n  });\r\n  g.graph().maxRank = maxRank;\r\n}\r\n\r\nfunction removeEdgeLabelProxies(g) {\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    if (node.dummy === \"edge-proxy\") {\r\n      g.edge(node.e).labelRank = node.rank;\r\n      g.removeNode(v);\r\n    }\r\n  });\r\n}\r\n\r\nfunction translateGraph(g) {\r\n  var minX = Number.POSITIVE_INFINITY,\r\n      maxX = 0,\r\n      minY = Number.POSITIVE_INFINITY,\r\n      maxY = 0,\r\n      graphLabel = g.graph(),\r\n      marginX = graphLabel.marginx || 0,\r\n      marginY = graphLabel.marginy || 0;\r\n\r\n  function getExtremes(attrs) {\r\n    var x = attrs.x,\r\n        y = attrs.y,\r\n        w = attrs.width,\r\n        h = attrs.height;\r\n    minX = Math.min(minX, x - w / 2);\r\n    maxX = Math.max(maxX, x + w / 2);\r\n    minY = Math.min(minY, y - h / 2);\r\n    maxY = Math.max(maxY, y + h / 2);\r\n  }\r\n\r\n  _.each(g.nodes(), function(v) { getExtremes(g.node(v)); });\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (_.has(edge, \"x\")) {\r\n      getExtremes(edge);\r\n    }\r\n  });\r\n\r\n  minX -= marginX;\r\n  minY -= marginY;\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    node.x -= minX;\r\n    node.y -= minY;\r\n  });\r\n\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    _.each(edge.points, function(p) {\r\n      p.x -= minX;\r\n      p.y -= minY;\r\n    });\r\n    if (_.has(edge, \"x\")) { edge.x -= minX; }\r\n    if (_.has(edge, \"y\")) { edge.y -= minY; }\r\n  });\r\n\r\n  graphLabel.width = maxX - minX + marginX;\r\n  graphLabel.height = maxY - minY + marginY;\r\n}\r\n\r\nfunction assignNodeIntersects(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e),\r\n        nodeV = g.node(e.v),\r\n        nodeW = g.node(e.w),\r\n        p1, p2;\r\n    if (!edge.points) {\r\n      edge.points = [];\r\n      p1 = nodeW;\r\n      p2 = nodeV;\r\n    } else {\r\n      p1 = edge.points[0];\r\n      p2 = edge.points[edge.points.length - 1];\r\n    }\r\n    edge.points.unshift(util.intersectRect(nodeV, p1));\r\n    edge.points.push(util.intersectRect(nodeW, p2));\r\n  });\r\n}\r\n\r\nfunction fixupEdgeLabelCoords(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (_.has(edge, \"x\")) {\r\n      if (edge.labelpos === \"l\" || edge.labelpos === \"r\") {\r\n        edge.width -= edge.labeloffset;\r\n      }\r\n      switch (edge.labelpos) {\r\n        case \"l\": edge.x -= edge.width / 2 + edge.labeloffset; break;\r\n        case \"r\": edge.x += edge.width / 2 + edge.labeloffset; break;\r\n      }\r\n    }\r\n  });\r\n}\r\n\r\nfunction reversePointsForReversedEdges(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (edge.reversed) {\r\n      edge.points.reverse();\r\n    }\r\n  });\r\n}\r\n\r\nfunction removeBorderNodes(g) {\r\n  _.each(g.nodes(), function(v) {\r\n    if (g.children(v).length) {\r\n      var node = g.node(v),\r\n          t = g.node(node.borderTop),\r\n          b = g.node(node.borderBottom),\r\n          l = g.node(_.last(node.borderLeft)),\r\n          r = g.node(_.last(node.borderRight));\r\n\r\n      node.width = Math.abs(r.x - l.x);\r\n      node.height = Math.abs(b.y - t.y);\r\n      node.x = l.x + node.width / 2;\r\n      node.y = t.y + node.height / 2;\r\n    }\r\n  });\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    if (g.node(v).dummy === \"border\") {\r\n      g.removeNode(v);\r\n    }\r\n  });\r\n}\r\n\r\nfunction removeSelfEdges(g) {\r\n  _.each(g.edges(), function(e) {\r\n    if (e.v === e.w) {\r\n      var node = g.node(e.v);\r\n      if (!node.selfEdges) {\r\n        node.selfEdges = [];\r\n      }\r\n      node.selfEdges.push({ e: e, label: g.edge(e) });\r\n      g.removeEdge(e);\r\n    }\r\n  });\r\n}\r\n\r\nfunction insertSelfEdges(g) {\r\n  var layers = util.buildLayerMatrix(g);\r\n  _.each(layers, function(layer) {\r\n    var orderShift = 0;\r\n    _.each(layer, function(v, i) {\r\n      var node = g.node(v);\r\n      node.order = i + orderShift;\r\n      _.each(node.selfEdges, function(selfEdge) {\r\n        util.addDummyNode(g, \"selfedge\", {\r\n          width: selfEdge.label.width,\r\n          height: selfEdge.label.height,\r\n          rank: node.rank,\r\n          order: i + (++orderShift),\r\n          e: selfEdge.e,\r\n          label: selfEdge.label\r\n        }, \"_se\");\r\n      });\r\n      delete node.selfEdges;\r\n    });\r\n  });\r\n}\r\n\r\nfunction positionSelfEdges(g) {\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    if (node.dummy === \"selfedge\") {\r\n      var selfNode = g.node(node.e.v),\r\n          x = selfNode.x + selfNode.width / 2,\r\n          y = selfNode.y,\r\n          dx = node.x - x,\r\n          dy = selfNode.height / 2;\r\n      g.setEdge(node.e, node.label);\r\n      g.removeNode(v);\r\n      node.label.points = [\r\n        { x: x + 2 * dx / 3, y: y - dy },\r\n        { x: x + 5 * dx / 6, y: y - dy },\r\n        { x: x +     dx    , y: y },\r\n        { x: x + 5 * dx / 6, y: y + dy },\r\n        { x: x + 2 * dx / 3, y: y + dy },\r\n      ];\r\n      node.label.x = node.x;\r\n      node.label.y = node.y;\r\n    }\r\n  });\r\n}\r\n\r\nfunction selectNumberAttrs(obj, attrs) {\r\n  return _.mapValues(_.pick(obj, attrs), Number);\r\n}\r\n\r\nfunction canonicalize(attrs) {\r\n  var newAttrs = {};\r\n  _.each(attrs, function(v, k) {\r\n    newAttrs[k.toLowerCase()] = v;\r\n  });\r\n  return newAttrs;\r\n}\r\n\r\n},{\"./acyclic\":2,\"./add-border-segments\":3,\"./coordinate-system\":4,\"./graphlib\":7,\"./lodash\":10,\"./nesting-graph\":11,\"./normalize\":12,\"./order\":17,\"./parent-dummy-chains\":22,\"./position\":24,\"./rank\":26,\"./util\":29}],10:[function(require,module,exports){\r\n/* global window */\r\n\r\nvar lodash;\r\n\r\nif (require) {\r\n  try {\r\n    lodash = require(\"lodash\");\r\n  } catch (e) {}\r\n}\r\n\r\nif (!lodash) {\r\n  lodash = window._;\r\n}\r\n\r\nmodule.exports = lodash;\r\n\r\n},{\"lodash\":51}],11:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    util = require(\"./util\");\r\n\r\nmodule.exports = {\r\n  run: run,\r\n  cleanup: cleanup\r\n};\r\n\r\n/*\r\n * A nesting graph creates dummy nodes for the tops and bottoms of subgraphs,\r\n * adds appropriate edges to ensure that all cluster nodes are placed between\r\n * these boundries, and ensures that the graph is connected.\r\n *\r\n * In addition we ensure, through the use of the minlen property, that nodes\r\n * and subgraph border nodes to not end up on the same rank.\r\n *\r\n * Preconditions:\r\n *\r\n *    1. Input graph is a DAG\r\n *    2. Nodes in the input graph has a minlen attribute\r\n *\r\n * Postconditions:\r\n *\r\n *    1. Input graph is connected.\r\n *    2. Dummy nodes are added for the tops and bottoms of subgraphs.\r\n *    3. The minlen attribute for nodes is adjusted to ensure nodes do not\r\n *       get placed on the same rank as subgraph border nodes.\r\n *\r\n * The nesting graph idea comes from Sander, \"Layout of Compound Directed\r\n * Graphs.\"\r\n */\r\nfunction run(g) {\r\n  var root = util.addDummyNode(g, \"root\", {}, \"_root\"),\r\n      depths = treeDepths(g),\r\n      height = _.max(depths) - 1,\r\n      nodeSep = 2 * height + 1;\r\n\r\n  g.graph().nestingRoot = root;\r\n\r\n  // Multiply minlen by nodeSep to align nodes on non-border ranks.\r\n  _.each(g.edges(), function(e) { g.edge(e).minlen *= nodeSep; });\r\n\r\n  // Calculate a weight that is sufficient to keep subgraphs vertically compact\r\n  var weight = sumWeights(g) + 1;\r\n\r\n  // Create border nodes and link them up\r\n  _.each(g.children(), function(child) {\r\n    dfs(g, root, nodeSep, weight, height, depths, child);\r\n  });\r\n\r\n  // Save the multiplier for node layers for later removal of empty border\r\n  // layers.\r\n  g.graph().nodeRankFactor = nodeSep;\r\n}\r\n\r\nfunction dfs(g, root, nodeSep, weight, height, depths, v) {\r\n  var children = g.children(v);\r\n  if (!children.length) {\r\n    if (v !== root) {\r\n      g.setEdge(root, v, { weight: 0, minlen: nodeSep });\r\n    }\r\n    return;\r\n  }\r\n\r\n  var top = util.addBorderNode(g, \"_bt\"),\r\n      bottom = util.addBorderNode(g, \"_bb\"),\r\n      label = g.node(v);\r\n\r\n  g.setParent(top, v);\r\n  label.borderTop = top;\r\n  g.setParent(bottom, v);\r\n  label.borderBottom = bottom;\r\n\r\n  _.each(children, function(child) {\r\n    dfs(g, root, nodeSep, weight, height, depths, child);\r\n\r\n    var childNode = g.node(child),\r\n        childTop = childNode.borderTop ? childNode.borderTop : child,\r\n        childBottom = childNode.borderBottom ? childNode.borderBottom : child,\r\n        thisWeight = childNode.borderTop ? weight : 2 * weight,\r\n        minlen = childTop !== childBottom ? 1 : height - depths[v] + 1;\r\n\r\n    g.setEdge(top, childTop, {\r\n      weight: thisWeight,\r\n      minlen: minlen,\r\n      nestingEdge: true\r\n    });\r\n\r\n    g.setEdge(childBottom, bottom, {\r\n      weight: thisWeight,\r\n      minlen: minlen,\r\n      nestingEdge: true\r\n    });\r\n  });\r\n\r\n  if (!g.parent(v)) {\r\n    g.setEdge(root, top, { weight: 0, minlen: height + depths[v] });\r\n  }\r\n}\r\n\r\nfunction treeDepths(g) {\r\n  var depths = {};\r\n  function dfs(v, depth) {\r\n    var children = g.children(v);\r\n    if (children && children.length) {\r\n      _.each(children, function(child) {\r\n        dfs(child, depth + 1);\r\n      });\r\n    }\r\n    depths[v] = depth;\r\n  }\r\n  _.each(g.children(), function(v) { dfs(v, 1); });\r\n  return depths;\r\n}\r\n\r\nfunction sumWeights(g) {\r\n  return _.reduce(g.edges(), function(acc, e) {\r\n    return acc + g.edge(e).weight;\r\n  }, 0);\r\n}\r\n\r\nfunction cleanup(g) {\r\n  var graphLabel = g.graph();\r\n  g.removeNode(graphLabel.nestingRoot);\r\n  delete graphLabel.nestingRoot;\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (edge.nestingEdge) {\r\n      g.removeEdge(e);\r\n    }\r\n  });\r\n}\r\n\r\n},{\"./lodash\":10,\"./util\":29}],12:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\"),\r\n    util = require(\"./util\");\r\n\r\nmodule.exports = {\r\n  run: run,\r\n  undo: undo\r\n};\r\n\r\n/*\r\n * Breaks any long edges in the graph into short segments that span 1 layer\r\n * each. This operation is undoable with the denormalize function.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. The input graph is a DAG.\r\n *    2. Each node in the graph has a \"rank\" property.\r\n *\r\n * Post-condition:\r\n *\r\n *    1. All edges in the graph have a length of 1.\r\n *    2. Dummy nodes are added where edges have been split into segments.\r\n *    3. The graph is augmented with a \"dummyChains\" attribute which contains\r\n *       the first dummy in each chain of dummy nodes produced.\r\n */\r\nfunction run(g) {\r\n  g.graph().dummyChains = [];\r\n  _.each(g.edges(), function(edge) { normalizeEdge(g, edge); });\r\n}\r\n\r\nfunction normalizeEdge(g, e) {\r\n  var v = e.v,\r\n      vRank = g.node(v).rank,\r\n      w = e.w,\r\n      wRank = g.node(w).rank,\r\n      name = e.name,\r\n      edgeLabel = g.edge(e),\r\n      labelRank = edgeLabel.labelRank;\r\n\r\n  if (wRank === vRank + 1) return;\r\n\r\n  g.removeEdge(e);\r\n\r\n  var dummy, attrs, i;\r\n  for (i = 0, ++vRank; vRank < wRank; ++i, ++vRank) {\r\n    edgeLabel.points = [];\r\n    attrs = {\r\n      width: 0, height: 0,\r\n      edgeLabel: edgeLabel, edgeObj: e,\r\n      rank: vRank\r\n    };\r\n    dummy = util.addDummyNode(g, \"edge\", attrs, \"_d\");\r\n    if (vRank === labelRank) {\r\n      attrs.width = edgeLabel.width;\r\n      attrs.height = edgeLabel.height;\r\n      attrs.dummy = \"edge-label\";\r\n      attrs.labelpos = edgeLabel.labelpos;\r\n    }\r\n    g.setEdge(v, dummy, { weight: edgeLabel.weight }, name);\r\n    if (i === 0) {\r\n      g.graph().dummyChains.push(dummy);\r\n    }\r\n    v = dummy;\r\n  }\r\n\r\n  g.setEdge(v, w, { weight: edgeLabel.weight }, name);\r\n}\r\n\r\nfunction undo(g) {\r\n  _.each(g.graph().dummyChains, function(v) {\r\n    var node = g.node(v),\r\n        origLabel = node.edgeLabel,\r\n        w;\r\n    g.setEdge(node.edgeObj, origLabel);\r\n    while (node.dummy) {\r\n      w = g.successors(v)[0];\r\n      g.removeNode(v);\r\n      origLabel.points.push({ x: node.x, y: node.y });\r\n      if (node.dummy === \"edge-label\") {\r\n        origLabel.x = node.x;\r\n        origLabel.y = node.y;\r\n        origLabel.width = node.width;\r\n        origLabel.height = node.height;\r\n      }\r\n      v = w;\r\n      node = g.node(v);\r\n    }\r\n  });\r\n}\r\n\r\n},{\"./lodash\":10,\"./util\":29}],13:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = addSubgraphConstraints;\r\n\r\nfunction addSubgraphConstraints(g, cg, vs) {\r\n  var prev = {},\r\n      rootPrev;\r\n\r\n  _.each(vs, function(v) {\r\n    var child = g.parent(v),\r\n        parent,\r\n        prevChild;\r\n    while (child) {\r\n      parent = g.parent(child);\r\n      if (parent) {\r\n        prevChild = prev[parent];\r\n        prev[parent] = child;\r\n      } else {\r\n        prevChild = rootPrev;\r\n        rootPrev = child;\r\n      }\r\n      if (prevChild && prevChild !== child) {\r\n        cg.setEdge(prevChild, child);\r\n        return;\r\n      }\r\n      child = parent;\r\n    }\r\n  });\r\n\r\n  /*\r\n  function dfs(v) {\r\n    var children = v ? g.children(v) : g.children();\r\n    if (children.length) {\r\n      var min = Number.POSITIVE_INFINITY,\r\n          subgraphs = [];\r\n      _.each(children, function(child) {\r\n        var childMin = dfs(child);\r\n        if (g.children(child).length) {\r\n          subgraphs.push({ v: child, order: childMin });\r\n        }\r\n        min = Math.min(min, childMin);\r\n      });\r\n      _.reduce(_.sortBy(subgraphs, \"order\"), function(prev, curr) {\r\n        cg.setEdge(prev.v, curr.v);\r\n        return curr;\r\n      });\r\n      return min;\r\n    }\r\n    return g.node(v).order;\r\n  }\r\n  dfs(undefined);\r\n  */\r\n}\r\n\r\n},{\"../lodash\":10}],14:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = barycenter;\r\n\r\nfunction barycenter(g, movable) {\r\n  return _.map(movable, function(v) {\r\n    var inV = g.inEdges(v);\r\n    if (!inV.length) {\r\n      return { v: v };\r\n    } else {\r\n      var result = _.reduce(inV, function(acc, e) {\r\n        var edge = g.edge(e),\r\n            nodeU = g.node(e.v);\r\n        return {\r\n          sum: acc.sum + (edge.weight * nodeU.order),\r\n          weight: acc.weight + edge.weight\r\n        };\r\n      }, { sum: 0, weight: 0 });\r\n\r\n      return {\r\n        v: v,\r\n        barycenter: result.sum / result.weight,\r\n        weight: result.weight\r\n      };\r\n    }\r\n  });\r\n}\r\n\r\n\r\n},{\"../lodash\":10}],15:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    Graph = require(\"../graphlib\").Graph;\r\n\r\nmodule.exports = buildLayerGraph;\r\n\r\n/*\r\n * Constructs a graph that can be used to sort a layer of nodes. The graph will\r\n * contain all base and subgraph nodes from the request layer in their original\r\n * hierarchy and any edges that are incident on these nodes and are of the type\r\n * requested by the \"relationship\" parameter.\r\n *\r\n * Nodes from the requested rank that do not have parents are assigned a root\r\n * node in the output graph, which is set in the root graph attribute. This\r\n * makes it easy to walk the hierarchy of movable nodes during ordering.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Input graph is a DAG\r\n *    2. Base nodes in the input graph have a rank attribute\r\n *    3. Subgraph nodes in the input graph has minRank and maxRank attributes\r\n *    4. Edges have an assigned weight\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. Output graph has all nodes in the movable rank with preserved\r\n *       hierarchy.\r\n *    2. Root nodes in the movable layer are made children of the node\r\n *       indicated by the root attribute of the graph.\r\n *    3. Non-movable nodes incident on movable nodes, selected by the\r\n *       relationship parameter, are included in the graph (without hierarchy).\r\n *    4. Edges incident on movable nodes, selected by the relationship\r\n *       parameter, are added to the output graph.\r\n *    5. The weights for copied edges are aggregated as need, since the output\r\n *       graph is not a multi-graph.\r\n */\r\nfunction buildLayerGraph(g, rank, relationship) {\r\n  var root = createRootNode(g),\r\n      result = new Graph({ compound: true }).setGraph({ root: root })\r\n                  .setDefaultNodeLabel(function(v) { return g.node(v); });\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v),\r\n        parent = g.parent(v);\r\n\r\n    if (node.rank === rank || node.minRank <= rank && rank <= node.maxRank) {\r\n      result.setNode(v);\r\n      result.setParent(v, parent || root);\r\n\r\n      // This assumes we have only short edges!\r\n      _.each(g[relationship](v), function(e) {\r\n        var u = e.v === v ? e.w : e.v,\r\n            edge = result.edge(u, v),\r\n            weight = !_.isUndefined(edge) ? edge.weight : 0;\r\n        result.setEdge(u, v, { weight: g.edge(e).weight + weight });\r\n      });\r\n\r\n      if (_.has(node, \"minRank\")) {\r\n        result.setNode(v, {\r\n          borderLeft: node.borderLeft[rank],\r\n          borderRight: node.borderRight[rank]\r\n        });\r\n      }\r\n    }\r\n  });\r\n\r\n  return result;\r\n}\r\n\r\nfunction createRootNode(g) {\r\n  var v;\r\n  while (g.hasNode((v = _.uniqueId(\"_root\"))));\r\n  return v;\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10}],16:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = crossCount;\r\n\r\n/*\r\n * A function that takes a layering (an array of layers, each with an array of\r\n * ordererd nodes) and a graph and returns a weighted crossing count.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Input graph must be simple (not a multigraph), directed, and include\r\n *       only simple edges.\r\n *    2. Edges in the input graph must have assigned weights.\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. The graph and layering matrix are left unchanged.\r\n *\r\n * This algorithm is derived from Barth, et al., \"Bilayer Cross Counting.\"\r\n */\r\nfunction crossCount(g, layering) {\r\n  var cc = 0;\r\n  for (var i = 1; i < layering.length; ++i) {\r\n    cc += twoLayerCrossCount(g, layering[i-1], layering[i]);\r\n  }\r\n  return cc;\r\n}\r\n\r\nfunction twoLayerCrossCount(g, northLayer, southLayer) {\r\n  // Sort all of the edges between the north and south layers by their position\r\n  // in the north layer and then the south. Map these edges to the position of\r\n  // their head in the south layer.\r\n  var southPos = _.zipObject(southLayer,\r\n                             _.map(southLayer, function (v, i) { return i; }));\r\n  var southEntries = _.flatten(_.map(northLayer, function(v) {\r\n    return _.chain(g.outEdges(v))\r\n            .map(function(e) {\r\n              return { pos: southPos[e.w], weight: g.edge(e).weight };\r\n            })\r\n            .sortBy(\"pos\")\r\n            .value();\r\n  }), true);\r\n\r\n  // Build the accumulator tree\r\n  var firstIndex = 1;\r\n  while (firstIndex < southLayer.length) firstIndex <<= 1;\r\n  var treeSize = 2 * firstIndex - 1;\r\n  firstIndex -= 1;\r\n  var tree = _.map(new Array(treeSize), function() { return 0; });\r\n\r\n  // Calculate the weighted crossings\r\n  var cc = 0;\r\n  _.each(southEntries.forEach(function(entry) {\r\n    var index = entry.pos + firstIndex;\r\n    tree[index] += entry.weight;\r\n    var weightSum = 0;\r\n    while (index > 0) {\r\n      if (index % 2) {\r\n        weightSum += tree[index + 1];\r\n      }\r\n      index = (index - 1) >> 1;\r\n      tree[index] += entry.weight;\r\n    }\r\n    cc += entry.weight * weightSum;\r\n  }));\r\n\r\n  return cc;\r\n}\r\n\r\n},{\"../lodash\":10}],17:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    initOrder = require(\"./init-order\"),\r\n    crossCount = require(\"./cross-count\"),\r\n    sortSubgraph = require(\"./sort-subgraph\"),\r\n    buildLayerGraph = require(\"./build-layer-graph\"),\r\n    addSubgraphConstraints = require(\"./add-subgraph-constraints\"),\r\n    Graph = require(\"../graphlib\").Graph,\r\n    util = require(\"../util\");\r\n\r\nmodule.exports = order;\r\n\r\n/*\r\n * Applies heuristics to minimize edge crossings in the graph and sets the best\r\n * order solution as an order attribute on each node.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Graph must be DAG\r\n *    2. Graph nodes must be objects with a \"rank\" attribute\r\n *    3. Graph edges must have the \"weight\" attribute\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. Graph nodes will have an \"order\" attribute based on the results of the\r\n *       algorithm.\r\n */\r\nfunction order(g) {\r\n  var maxRank = util.maxRank(g),\r\n      downLayerGraphs = buildLayerGraphs(g, _.range(1, maxRank + 1), \"inEdges\"),\r\n      upLayerGraphs = buildLayerGraphs(g, _.range(maxRank - 1, -1, -1), \"outEdges\");\r\n\r\n  var layering = initOrder(g);\r\n  assignOrder(g, layering);\r\n\r\n  var bestCC = Number.POSITIVE_INFINITY,\r\n      best;\r\n\r\n  for (var i = 0, lastBest = 0; lastBest < 4; ++i, ++lastBest) {\r\n    sweepLayerGraphs(i % 2 ? downLayerGraphs : upLayerGraphs, i % 4 >= 2);\r\n\r\n    layering = util.buildLayerMatrix(g);\r\n    var cc = crossCount(g, layering);\r\n    if (cc < bestCC) {\r\n      lastBest = 0;\r\n      best = _.cloneDeep(layering);\r\n      bestCC = cc;\r\n    }\r\n  }\r\n\r\n  assignOrder(g, best);\r\n}\r\n\r\nfunction buildLayerGraphs(g, ranks, relationship) {\r\n  return _.map(ranks, function(rank) {\r\n    return buildLayerGraph(g, rank, relationship);\r\n  });\r\n}\r\n\r\nfunction sweepLayerGraphs(layerGraphs, biasRight) {\r\n  var cg = new Graph();\r\n  _.each(layerGraphs, function(lg) {\r\n    var root = lg.graph().root;\r\n    var sorted = sortSubgraph(lg, root, cg, biasRight);\r\n    _.each(sorted.vs, function(v, i) {\r\n      lg.node(v).order = i;\r\n    });\r\n    addSubgraphConstraints(lg, cg, sorted.vs);\r\n  });\r\n}\r\n\r\nfunction assignOrder(g, layering) {\r\n  _.each(layering, function(layer) {\r\n    _.each(layer, function(v, i) {\r\n      g.node(v).order = i;\r\n    });\r\n  });\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10,\"../util\":29,\"./add-subgraph-constraints\":13,\"./build-layer-graph\":15,\"./cross-count\":16,\"./init-order\":18,\"./sort-subgraph\":20}],18:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = initOrder;\r\n\r\n/*\r\n * Assigns an initial order value for each node by performing a DFS search\r\n * starting from nodes in the first rank. Nodes are assigned an order in their\r\n * rank as they are first visited.\r\n *\r\n * This approach comes from Gansner, et al., \"A Technique for Drawing Directed\r\n * Graphs.\"\r\n *\r\n * Returns a layering matrix with an array per layer and each layer sorted by\r\n * the order of its nodes.\r\n */\r\nfunction initOrder(g) {\r\n  var visited = {},\r\n      simpleNodes = _.filter(g.nodes(), function(v) {\r\n        return !g.children(v).length;\r\n      }),\r\n      maxRank = _.max(_.map(simpleNodes, function(v) { return g.node(v).rank; })),\r\n      layers = _.map(_.range(maxRank + 1), function() { return []; });\r\n\r\n  function dfs(v) {\r\n    if (_.has(visited, v)) return;\r\n    visited[v] = true;\r\n    var node = g.node(v);\r\n    layers[node.rank].push(v);\r\n    _.each(g.successors(v), dfs);\r\n  }\r\n\r\n  var orderedVs = _.sortBy(simpleNodes, function(v) { return g.node(v).rank; });\r\n  _.each(orderedVs, dfs);\r\n\r\n  return layers;\r\n}\r\n\r\n},{\"../lodash\":10}],19:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = resolveConflicts;\r\n\r\n/*\r\n * Given a list of entries of the form {v, barycenter, weight} and a\r\n * constraint graph this function will resolve any conflicts between the\r\n * constraint graph and the barycenters for the entries. If the barycenters for\r\n * an entry would violate a constraint in the constraint graph then we coalesce\r\n * the nodes in the conflict into a new node that respects the contraint and\r\n * aggregates barycenter and weight information.\r\n *\r\n * This implementation is based on the description in Forster, \"A Fast and\r\n * Simple Hueristic for Constrained Two-Level Crossing Reduction,\" thought it\r\n * differs in some specific details.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Each entry has the form {v, barycenter, weight}, or if the node has\r\n *       no barycenter, then {v}.\r\n *\r\n * Returns:\r\n *\r\n *    A new list of entries of the form {vs, i, barycenter, weight}. The list\r\n *    `vs` may either be a singleton or it may be an aggregation of nodes\r\n *    ordered such that they do not violate constraints from the constraint\r\n *    graph. The property `i` is the lowest original index of any of the\r\n *    elements in `vs`.\r\n */\r\nfunction resolveConflicts(entries, cg) {\r\n  var mappedEntries = {};\r\n  _.each(entries, function(entry, i) {\r\n    var tmp = mappedEntries[entry.v] = {\r\n      indegree: 0,\r\n      \"in\": [],\r\n      out: [],\r\n      vs: [entry.v],\r\n      i: i\r\n    };\r\n    if (!_.isUndefined(entry.barycenter)) {\r\n      tmp.barycenter = entry.barycenter;\r\n      tmp.weight = entry.weight;\r\n    }\r\n  });\r\n\r\n  _.each(cg.edges(), function(e) {\r\n    var entryV = mappedEntries[e.v],\r\n        entryW = mappedEntries[e.w];\r\n    if (!_.isUndefined(entryV) && !_.isUndefined(entryW)) {\r\n      entryW.indegree++;\r\n      entryV.out.push(mappedEntries[e.w]);\r\n    }\r\n  });\r\n\r\n  var sourceSet = _.filter(mappedEntries, function(entry) {\r\n    return !entry.indegree;\r\n  });\r\n\r\n  return doResolveConflicts(sourceSet);\r\n}\r\n\r\nfunction doResolveConflicts(sourceSet) {\r\n  var entries = [];\r\n\r\n  function handleIn(vEntry) {\r\n    return function(uEntry) {\r\n      if (uEntry.merged) {\r\n        return;\r\n      }\r\n      if (_.isUndefined(uEntry.barycenter) ||\r\n          _.isUndefined(vEntry.barycenter) ||\r\n          uEntry.barycenter >= vEntry.barycenter) {\r\n        mergeEntries(vEntry, uEntry);\r\n      }\r\n    };\r\n  }\r\n\r\n  function handleOut(vEntry) {\r\n    return function(wEntry) {\r\n      wEntry[\"in\"].push(vEntry);\r\n      if (--wEntry.indegree === 0) {\r\n        sourceSet.push(wEntry);\r\n      }\r\n    };\r\n  }\r\n\r\n  while (sourceSet.length) {\r\n    var entry = sourceSet.pop();\r\n    entries.push(entry);\r\n    _.each(entry[\"in\"].reverse(), handleIn(entry));\r\n    _.each(entry.out, handleOut(entry));\r\n  }\r\n\r\n  return _.chain(entries)\r\n          .filter(function(entry) { return !entry.merged; })\r\n          .map(function(entry) {\r\n            return _.pick(entry, [\"vs\", \"i\", \"barycenter\", \"weight\"]);\r\n          })\r\n          .value();\r\n}\r\n\r\nfunction mergeEntries(target, source) {\r\n  var sum = 0,\r\n      weight = 0;\r\n\r\n  if (target.weight) {\r\n    sum += target.barycenter * target.weight;\r\n    weight += target.weight;\r\n  }\r\n\r\n  if (source.weight) {\r\n    sum += source.barycenter * source.weight;\r\n    weight += source.weight;\r\n  }\r\n\r\n  target.vs = source.vs.concat(target.vs);\r\n  target.barycenter = sum / weight;\r\n  target.weight = weight;\r\n  target.i = Math.min(source.i, target.i);\r\n  source.merged = true;\r\n}\r\n\r\n},{\"../lodash\":10}],20:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    barycenter = require(\"./barycenter\"),\r\n    resolveConflicts = require(\"./resolve-conflicts\"),\r\n    sort = require(\"./sort\");\r\n\r\nmodule.exports = sortSubgraph;\r\n\r\nfunction sortSubgraph(g, v, cg, biasRight) {\r\n  var movable = g.children(v),\r\n      node = g.node(v),\r\n      bl = node ? node.borderLeft : undefined,\r\n      br = node ? node.borderRight: undefined,\r\n      subgraphs = {};\r\n\r\n  if (bl) {\r\n    movable = _.filter(movable, function(w) {\r\n      return w !== bl && w !== br;\r\n    });\r\n  }\r\n\r\n  var barycenters = barycenter(g, movable);\r\n  _.each(barycenters, function(entry) {\r\n    if (g.children(entry.v).length) {\r\n      var subgraphResult = sortSubgraph(g, entry.v, cg, biasRight);\r\n      subgraphs[entry.v] = subgraphResult;\r\n      if (_.has(subgraphResult, \"barycenter\")) {\r\n        mergeBarycenters(entry, subgraphResult);\r\n      }\r\n    }\r\n  });\r\n\r\n  var entries = resolveConflicts(barycenters, cg);\r\n  expandSubgraphs(entries, subgraphs);\r\n\r\n  var result = sort(entries, biasRight);\r\n\r\n  if (bl) {\r\n    result.vs = _.flatten([bl, result.vs, br], true);\r\n    if (g.predecessors(bl).length) {\r\n      var blPred = g.node(g.predecessors(bl)[0]),\r\n          brPred = g.node(g.predecessors(br)[0]);\r\n      if (!_.has(result, \"barycenter\")) {\r\n        result.barycenter = 0;\r\n        result.weight = 0;\r\n      }\r\n      result.barycenter = (result.barycenter * result.weight +\r\n                           blPred.order + brPred.order) / (result.weight + 2);\r\n      result.weight += 2;\r\n    }\r\n  }\r\n\r\n  return result;\r\n}\r\n\r\nfunction expandSubgraphs(entries, subgraphs) {\r\n  _.each(entries, function(entry) {\r\n    entry.vs = _.flatten(entry.vs.map(function(v) {\r\n      if (subgraphs[v]) {\r\n        return subgraphs[v].vs;\r\n      }\r\n      return v;\r\n    }), true);\r\n  });\r\n}\r\n\r\nfunction mergeBarycenters(target, other) {\r\n  if (!_.isUndefined(target.barycenter)) {\r\n    target.barycenter = (target.barycenter * target.weight +\r\n                         other.barycenter * other.weight) /\r\n                        (target.weight + other.weight);\r\n    target.weight += other.weight;\r\n  } else {\r\n    target.barycenter = other.barycenter;\r\n    target.weight = other.weight;\r\n  }\r\n}\r\n\r\n},{\"../lodash\":10,\"./barycenter\":14,\"./resolve-conflicts\":19,\"./sort\":21}],21:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    util = require(\"../util\");\r\n\r\nmodule.exports = sort;\r\n\r\nfunction sort(entries, biasRight) {\r\n  var parts = util.partition(entries, function(entry) {\r\n    return _.has(entry, \"barycenter\");\r\n  });\r\n  var sortable = parts.lhs,\r\n      unsortable = _.sortBy(parts.rhs, function(entry) { return -entry.i; }),\r\n      vs = [],\r\n      sum = 0,\r\n      weight = 0,\r\n      vsIndex = 0;\r\n\r\n  sortable.sort(compareWithBias(!!biasRight));\r\n\r\n  vsIndex = consumeUnsortable(vs, unsortable, vsIndex);\r\n\r\n  _.each(sortable, function (entry) {\r\n    vsIndex += entry.vs.length;\r\n    vs.push(entry.vs);\r\n    sum += entry.barycenter * entry.weight;\r\n    weight += entry.weight;\r\n    vsIndex = consumeUnsortable(vs, unsortable, vsIndex);\r\n  });\r\n\r\n  var result = { vs: _.flatten(vs, true) };\r\n  if (weight) {\r\n    result.barycenter = sum / weight;\r\n    result.weight = weight;\r\n  }\r\n  return result;\r\n}\r\n\r\nfunction consumeUnsortable(vs, unsortable, index) {\r\n  var last;\r\n  while (unsortable.length && (last = _.last(unsortable)).i <= index) {\r\n    unsortable.pop();\r\n    vs.push(last.vs);\r\n    index++;\r\n  }\r\n  return index;\r\n}\r\n\r\nfunction compareWithBias(bias) {\r\n  return function(entryV, entryW) {\r\n    if (entryV.barycenter < entryW.barycenter) {\r\n      return -1;\r\n    } else if (entryV.barycenter > entryW.barycenter) {\r\n      return 1;\r\n    }\r\n\r\n    return !bias ? entryV.i - entryW.i : entryW.i - entryV.i;\r\n  };\r\n}\r\n\r\n},{\"../lodash\":10,\"../util\":29}],22:[function(require,module,exports){\r\nvar _ = require(\"./lodash\");\r\n\r\nmodule.exports = parentDummyChains;\r\n\r\nfunction parentDummyChains(g) {\r\n  var postorderNums = postorder(g);\r\n\r\n  _.each(g.graph().dummyChains, function(v) {\r\n    var node = g.node(v),\r\n        edgeObj = node.edgeObj,\r\n        pathData = findPath(g, postorderNums, edgeObj.v, edgeObj.w),\r\n        path = pathData.path,\r\n        lca = pathData.lca,\r\n        pathIdx = 0,\r\n        pathV = path[pathIdx],\r\n        ascending = true;\r\n\r\n    while (v !== edgeObj.w) {\r\n      node = g.node(v);\r\n\r\n      if (ascending) {\r\n        while ((pathV = path[pathIdx]) !== lca &&\r\n               g.node(pathV).maxRank < node.rank) {\r\n          pathIdx++;\r\n        }\r\n\r\n        if (pathV === lca) {\r\n          ascending = false;\r\n        }\r\n      }\r\n\r\n      if (!ascending) {\r\n        while (pathIdx < path.length - 1 &&\r\n               g.node(pathV = path[pathIdx + 1]).minRank <= node.rank) {\r\n          pathIdx++;\r\n        }\r\n        pathV = path[pathIdx];\r\n      }\r\n\r\n      g.setParent(v, pathV);\r\n      v = g.successors(v)[0];\r\n    }\r\n  });\r\n}\r\n\r\n// Find a path from v to w through the lowest common ancestor (LCA). Return the\r\n// full path and the LCA.\r\nfunction findPath(g, postorderNums, v, w) {\r\n  var vPath = [],\r\n      wPath = [],\r\n      low = Math.min(postorderNums[v].low, postorderNums[w].low),\r\n      lim = Math.max(postorderNums[v].lim, postorderNums[w].lim),\r\n      parent,\r\n      lca;\r\n\r\n  // Traverse up from v to find the LCA\r\n  parent = v;\r\n  do {\r\n    parent = g.parent(parent);\r\n    vPath.push(parent);\r\n  } while (parent &&\r\n           (postorderNums[parent].low > low || lim > postorderNums[parent].lim));\r\n  lca = parent;\r\n\r\n  // Traverse from w to LCA\r\n  parent = w;\r\n  while ((parent = g.parent(parent)) !== lca) {\r\n    wPath.push(parent);\r\n  }\r\n\r\n  return { path: vPath.concat(wPath.reverse()), lca: lca };\r\n}\r\n\r\nfunction postorder(g) {\r\n  var result = {},\r\n      lim = 0;\r\n\r\n  function dfs(v) {\r\n    var low = lim;\r\n    _.each(g.children(v), dfs);\r\n    result[v] = { low: low, lim: lim++ };\r\n  }\r\n  _.each(g.children(), dfs);\r\n\r\n  return result;\r\n}\r\n\r\n},{\"./lodash\":10}],23:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    Graph = require(\"../graphlib\").Graph,\r\n    util = require(\"../util\");\r\n\r\n/*\r\n * This module provides coordinate assignment based on Brandes and Köpf, \"Fast\r\n * and Simple Horizontal Coordinate Assignment.\"\r\n */\r\n\r\nmodule.exports = {\r\n  positionX: positionX,\r\n  findType1Conflicts: findType1Conflicts,\r\n  findType2Conflicts: findType2Conflicts,\r\n  addConflict: addConflict,\r\n  hasConflict: hasConflict,\r\n  verticalAlignment: verticalAlignment,\r\n  horizontalCompaction: horizontalCompaction,\r\n  alignCoordinates: alignCoordinates,\r\n  findSmallestWidthAlignment: findSmallestWidthAlignment,\r\n  balance: balance\r\n};\r\n\r\n/*\r\n * Marks all edges in the graph with a type-1 conflict with the \"type1Conflict\"\r\n * property. A type-1 conflict is one where a non-inner segment crosses an\r\n * inner segment. An inner segment is an edge with both incident nodes marked\r\n * with the \"dummy\" property.\r\n *\r\n * This algorithm scans layer by layer, starting with the second, for type-1\r\n * conflicts between the current layer and the previous layer. For each layer\r\n * it scans the nodes from left to right until it reaches one that is incident\r\n * on an inner segment. It then scans predecessors to determine if they have\r\n * edges that cross that inner segment. At the end a final scan is done for all\r\n * nodes on the current rank to see if they cross the last visited inner\r\n * segment.\r\n *\r\n * This algorithm (safely) assumes that a dummy node will only be incident on a\r\n * single node in the layers being scanned.\r\n */\r\nfunction findType1Conflicts(g, layering) {\r\n  var conflicts = {};\r\n\r\n  function visitLayer(prevLayer, layer) {\r\n    var\r\n      // last visited node in the previous layer that is incident on an inner\r\n      // segment.\r\n      k0 = 0,\r\n      // Tracks the last node in this layer scanned for crossings with a type-1\r\n      // segment.\r\n      scanPos = 0,\r\n      prevLayerLength = prevLayer.length,\r\n      lastNode = _.last(layer);\r\n\r\n    _.each(layer, function(v, i) {\r\n      var w = findOtherInnerSegmentNode(g, v),\r\n          k1 = w ? g.node(w).order : prevLayerLength;\r\n\r\n      if (w || v === lastNode) {\r\n        _.each(layer.slice(scanPos, i +1), function(scanNode) {\r\n          _.each(g.predecessors(scanNode), function(u) {\r\n            var uLabel = g.node(u),\r\n                uPos = uLabel.order;\r\n            if ((uPos < k0 || k1 < uPos) &&\r\n                !(uLabel.dummy && g.node(scanNode).dummy)) {\r\n              addConflict(conflicts, u, scanNode);\r\n            }\r\n          });\r\n        });\r\n        scanPos = i + 1;\r\n        k0 = k1;\r\n      }\r\n    });\r\n\r\n    return layer;\r\n  }\r\n\r\n  _.reduce(layering, visitLayer);\r\n  return conflicts;\r\n}\r\n\r\nfunction findType2Conflicts(g, layering) {\r\n  var conflicts = {};\r\n\r\n  function scan(south, southPos, southEnd, prevNorthBorder, nextNorthBorder) {\r\n    var v;\r\n    _.each(_.range(southPos, southEnd), function(i) {\r\n      v = south[i];\r\n      if (g.node(v).dummy) {\r\n        _.each(g.predecessors(v), function(u) {\r\n          var uNode = g.node(u);\r\n          if (uNode.dummy &&\r\n              (uNode.order < prevNorthBorder || uNode.order > nextNorthBorder)) {\r\n            addConflict(conflicts, u, v);\r\n          }\r\n        });\r\n      }\r\n    });\r\n  }\r\n\r\n\r\n  function visitLayer(north, south) {\r\n    var prevNorthPos = -1,\r\n        nextNorthPos,\r\n        southPos = 0;\r\n\r\n    _.each(south, function(v, southLookahead) {\r\n      if (g.node(v).dummy === \"border\") {\r\n        var predecessors = g.predecessors(v);\r\n        if (predecessors.length) {\r\n          nextNorthPos = g.node(predecessors[0]).order;\r\n          scan(south, southPos, southLookahead, prevNorthPos, nextNorthPos);\r\n          southPos = southLookahead;\r\n          prevNorthPos = nextNorthPos;\r\n        }\r\n      }\r\n      scan(south, southPos, south.length, nextNorthPos, north.length);\r\n    });\r\n\r\n    return south;\r\n  }\r\n\r\n  _.reduce(layering, visitLayer);\r\n  return conflicts;\r\n}\r\n\r\nfunction findOtherInnerSegmentNode(g, v) {\r\n  if (g.node(v).dummy) {\r\n    return _.find(g.predecessors(v), function(u) {\r\n      return g.node(u).dummy;\r\n    });\r\n  }\r\n}\r\n\r\nfunction addConflict(conflicts, v, w) {\r\n  if (v > w) {\r\n    var tmp = v;\r\n    v = w;\r\n    w = tmp;\r\n  }\r\n\r\n  var conflictsV = conflicts[v];\r\n  if (!conflictsV) {\r\n    conflicts[v] = conflictsV = {};\r\n  }\r\n  conflictsV[w] = true;\r\n}\r\n\r\nfunction hasConflict(conflicts, v, w) {\r\n  if (v > w) {\r\n    var tmp = v;\r\n    v = w;\r\n    w = tmp;\r\n  }\r\n  return _.has(conflicts[v], w);\r\n}\r\n\r\n/*\r\n * Try to align nodes into vertical \"blocks\" where possible. This algorithm\r\n * attempts to align a node with one of its median neighbors. If the edge\r\n * connecting a neighbor is a type-1 conflict then we ignore that possibility.\r\n * If a previous node has already formed a block with a node after the node\r\n * we're trying to form a block with, we also ignore that possibility - our\r\n * blocks would be split in that scenario.\r\n */\r\nfunction verticalAlignment(g, layering, conflicts, neighborFn) {\r\n  var root = {},\r\n      align = {},\r\n      pos = {};\r\n\r\n  // We cache the position here based on the layering because the graph and\r\n  // layering may be out of sync. The layering matrix is manipulated to\r\n  // generate different extreme alignments.\r\n  _.each(layering, function(layer) {\r\n    _.each(layer, function(v, order) {\r\n      root[v] = v;\r\n      align[v] = v;\r\n      pos[v] = order;\r\n    });\r\n  });\r\n\r\n  _.each(layering, function(layer) {\r\n    var prevIdx = -1;\r\n    _.each(layer, function(v) {\r\n      var ws = neighborFn(v);\r\n      if (ws.length) {\r\n        ws = _.sortBy(ws, function(w) { return pos[w]; });\r\n        var mp = (ws.length - 1) / 2;\r\n        for (var i = Math.floor(mp), il = Math.ceil(mp); i <= il; ++i) {\r\n          var w = ws[i];\r\n          if (align[v] === v &&\r\n              prevIdx < pos[w] &&\r\n              !hasConflict(conflicts, v, w)) {\r\n            align[w] = v;\r\n            align[v] = root[v] = root[w];\r\n            prevIdx = pos[w];\r\n          }\r\n        }\r\n      }\r\n    });\r\n  });\r\n\r\n  return { root: root, align: align };\r\n}\r\n\r\nfunction horizontalCompaction(g, layering, root, align, reverseSep) {\r\n  // This portion of the algorithm differs from BK due to a number of problems.\r\n  // Instead of their algorithm we construct a new block graph and do two\r\n  // sweeps. The first sweep places blocks with the smallest possible\r\n  // coordinates. The second sweep removes unused space by moving blocks to the\r\n  // greatest coordinates without violating separation.\r\n  var xs = {},\r\n      blockG = buildBlockGraph(g, layering, root, reverseSep);\r\n\r\n  // First pass, assign smallest coordinates via DFS\r\n  var visited = {};\r\n  function pass1(v) {\r\n    if (!_.has(visited, v)) {\r\n      visited[v] = true;\r\n      xs[v] = _.reduce(blockG.inEdges(v), function(max, e) {\r\n        pass1(e.v);\r\n        return Math.max(max, xs[e.v] + blockG.edge(e));\r\n      }, 0);\r\n    }\r\n  }\r\n  _.each(blockG.nodes(), pass1);\r\n\r\n  function pass2(v) {\r\n    if (visited[v] !== 2) {\r\n      visited[v]++;\r\n      var min = _.reduce(blockG.outEdges(v), function(min, e) {\r\n        pass2(e.w);\r\n        return Math.min(min, xs[e.w] - blockG.edge(e));\r\n      }, Number.POSITIVE_INFINITY);\r\n      if (min !== Number.POSITIVE_INFINITY) {\r\n        xs[v] = Math.max(xs[v], min);\r\n      }\r\n    }\r\n  }\r\n  _.each(blockG.nodes(), pass2);\r\n\r\n\r\n  // Assign x coordinates to all nodes\r\n  _.each(align, function(v) {\r\n    xs[v] = xs[root[v]];\r\n  });\r\n\r\n  return xs;\r\n}\r\n\r\n\r\nfunction buildBlockGraph(g, layering, root, reverseSep) {\r\n  var blockGraph = new Graph(),\r\n      graphLabel = g.graph(),\r\n      sepFn = sep(graphLabel.nodesep, graphLabel.edgesep, reverseSep);\r\n\r\n  _.each(layering, function(layer) {\r\n    var u;\r\n    _.each(layer, function(v) {\r\n      var vRoot = root[v];\r\n      blockGraph.setNode(vRoot);\r\n      if (u) {\r\n        var uRoot = root[u],\r\n            prevMax = blockGraph.edge(uRoot, vRoot);\r\n        blockGraph.setEdge(uRoot, vRoot, Math.max(sepFn(g, v, u), prevMax || 0));\r\n      }\r\n      u = v;\r\n    });\r\n  });\r\n\r\n  return blockGraph;\r\n}\r\n\r\n/*\r\n * Returns the alignment that has the smallest width of the given alignments.\r\n */\r\nfunction findSmallestWidthAlignment(g, xss) {\r\n  return _.min(xss, function(xs) {\r\n    var min = _.min(xs, function(x, v) { return x - width(g, v) / 2; }),\r\n        max = _.max(xs, function(x, v) { return x + width(g, v) / 2; });\r\n    return max - min;\r\n  });\r\n}\r\n\r\n/*\r\n * Align the coordinates of each of the layout alignments such that\r\n * left-biased alignments have their minimum coordinate at the same point as\r\n * the minimum coordinate of the smallest width alignment and right-biased\r\n * alignments have their maximum coordinate at the same point as the maximum\r\n * coordinate of the smallest width alignment.\r\n */\r\nfunction alignCoordinates(xss, alignTo) {\r\n  var alignToMin = _.min(alignTo),\r\n      alignToMax = _.max(alignTo);\r\n\r\n  _.each([\"u\", \"d\"], function(vert) {\r\n    _.each([\"l\", \"r\"], function(horiz) {\r\n      var alignment = vert + horiz,\r\n          xs = xss[alignment],\r\n          delta;\r\n      if (xs === alignTo) return;\r\n\r\n      delta = horiz === \"l\" ? alignToMin - _.min(xs) : alignToMax - _.max(xs);\r\n\r\n      if (delta) {\r\n        xss[alignment] = _.mapValues(xs, function(x) { return x + delta; });\r\n      }\r\n    });\r\n  });\r\n}\r\n\r\nfunction balance(xss, align) {\r\n  return _.mapValues(xss.ul, function(ignore, v) {\r\n    if (align) {\r\n      return xss[align.toLowerCase()][v];\r\n    } else {\r\n      var xs = _.sortBy(_.pluck(xss, v));\r\n      return (xs[1] + xs[2]) / 2;\r\n    }\r\n  });\r\n}\r\n\r\nfunction positionX(g) {\r\n  var layering = util.buildLayerMatrix(g),\r\n      conflicts = _.merge(findType1Conflicts(g, layering),\r\n                          findType2Conflicts(g, layering));\r\n\r\n  var xss = {},\r\n      adjustedLayering;\r\n  _.each([\"u\", \"d\"], function(vert) {\r\n    adjustedLayering = vert === \"u\" ? layering : _.values(layering).reverse();\r\n    _.each([\"l\", \"r\"], function(horiz) {\r\n      if (horiz === \"r\") {\r\n        adjustedLayering = _.map(adjustedLayering, function(inner) {\r\n          return _.values(inner).reverse();\r\n        });\r\n      }\r\n\r\n      var neighborFn = _.bind(vert === \"u\" ? g.predecessors : g.successors, g);\r\n      var align = verticalAlignment(g, adjustedLayering, conflicts, neighborFn);\r\n      var xs = horizontalCompaction(g, adjustedLayering,\r\n                                    align.root, align.align,\r\n                                    horiz === \"r\");\r\n      if (horiz === \"r\") {\r\n        xs = _.mapValues(xs, function(x) { return -x; });\r\n      }\r\n      xss[vert + horiz] = xs;\r\n    });\r\n  });\r\n\r\n  var smallestWidth = findSmallestWidthAlignment(g, xss);\r\n  alignCoordinates(xss, smallestWidth);\r\n  return balance(xss, g.graph().align);\r\n}\r\n\r\nfunction sep(nodeSep, edgeSep, reverseSep) {\r\n  return function(g, v, w) {\r\n    var vLabel = g.node(v),\r\n        wLabel = g.node(w),\r\n        sum = 0,\r\n        delta;\r\n\r\n    sum += vLabel.width / 2;\r\n    if (_.has(vLabel, \"labelpos\")) {\r\n      switch (vLabel.labelpos.toLowerCase()) {\r\n        case \"l\": delta = -vLabel.width / 2; break;\r\n        case \"r\": delta = vLabel.width / 2; break;\r\n      }\r\n    }\r\n    if (delta) {\r\n      sum += reverseSep ? delta : -delta;\r\n    }\r\n    delta = 0;\r\n\r\n    sum += (vLabel.dummy ? edgeSep : nodeSep) / 2;\r\n    sum += (wLabel.dummy ? edgeSep : nodeSep) / 2;\r\n\r\n    sum += wLabel.width / 2;\r\n    if (_.has(wLabel, \"labelpos\")) {\r\n      switch (wLabel.labelpos.toLowerCase()) {\r\n        case \"l\": delta = wLabel.width / 2; break;\r\n        case \"r\": delta = -wLabel.width / 2; break;\r\n      }\r\n    }\r\n    if (delta) {\r\n      sum += reverseSep ? delta : -delta;\r\n    }\r\n    delta = 0;\r\n\r\n    return sum;\r\n  };\r\n}\r\n\r\nfunction width(g, v) {\r\n  return g.node(v).width;\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10,\"../util\":29}],24:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    util = require(\"../util\"),\r\n    positionX = require(\"./bk\").positionX;\r\n\r\nmodule.exports = position;\r\n\r\nfunction position(g) {\r\n  g = util.asNonCompoundGraph(g);\r\n\r\n  positionY(g);\r\n  _.each(positionX(g), function(x, v) {\r\n    g.node(v).x = x;\r\n  });\r\n}\r\n\r\nfunction positionY(g) {\r\n  var layering = util.buildLayerMatrix(g),\r\n      rankSep = g.graph().ranksep,\r\n      prevY = 0;\r\n  _.each(layering, function(layer) {\r\n    var maxHeight = _.max(_.map(layer, function(v) { return g.node(v).height; }));\r\n    _.each(layer, function(v) {\r\n      g.node(v).y = prevY + maxHeight / 2;\r\n    });\r\n    prevY += maxHeight + rankSep;\r\n  });\r\n}\r\n\r\n\r\n},{\"../lodash\":10,\"../util\":29,\"./bk\":23}],25:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    Graph = require(\"../graphlib\").Graph,\r\n    slack = require(\"./util\").slack;\r\n\r\nmodule.exports = feasibleTree;\r\n\r\n/*\r\n * Constructs a spanning tree with tight edges and adjusted the input node's\r\n * ranks to achieve this. A tight edge is one that is has a length that matches\r\n * its \"minlen\" attribute.\r\n *\r\n * The basic structure for this function is derived from Gansner, et al., \"A\r\n * Technique for Drawing Directed Graphs.\"\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Graph must be a DAG.\r\n *    2. Graph must be connected.\r\n *    3. Graph must have at least one node.\r\n *    5. Graph nodes must have been previously assigned a \"rank\" property that\r\n *       respects the \"minlen\" property of incident edges.\r\n *    6. Graph edges must have a \"minlen\" property.\r\n *\r\n * Post-conditions:\r\n *\r\n *    - Graph nodes will have their rank adjusted to ensure that all edges are\r\n *      tight.\r\n *\r\n * Returns a tree (undirected graph) that is constructed using only \"tight\"\r\n * edges.\r\n */\r\nfunction feasibleTree(g) {\r\n  var t = new Graph({ directed: false });\r\n\r\n  // Choose arbitrary node from which to start our tree\r\n  var start = g.nodes()[0],\r\n      size = g.nodeCount();\r\n  t.setNode(start, {});\r\n\r\n  var edge, delta;\r\n  while (tightTree(t, g) < size) {\r\n    edge = findMinSlackEdge(t, g);\r\n    delta = t.hasNode(edge.v) ? slack(g, edge) : -slack(g, edge);\r\n    shiftRanks(t, g, delta);\r\n  }\r\n\r\n  return t;\r\n}\r\n\r\n/*\r\n * Finds a maximal tree of tight edges and returns the number of nodes in the\r\n * tree.\r\n */\r\nfunction tightTree(t, g) {\r\n  function dfs(v) {\r\n    _.each(g.nodeEdges(v), function(e) {\r\n      var edgeV = e.v,\r\n          w = (v === edgeV) ? e.w : edgeV;\r\n      if (!t.hasNode(w) && !slack(g, e)) {\r\n        t.setNode(w, {});\r\n        t.setEdge(v, w, {});\r\n        dfs(w);\r\n      }\r\n    });\r\n  }\r\n\r\n  _.each(t.nodes(), dfs);\r\n  return t.nodeCount();\r\n}\r\n\r\n/*\r\n * Finds the edge with the smallest slack that is incident on tree and returns\r\n * it.\r\n */\r\nfunction findMinSlackEdge(t, g) {\r\n  return _.min(g.edges(), function(e) {\r\n    if (t.hasNode(e.v) !== t.hasNode(e.w)) {\r\n      return slack(g, e);\r\n    }\r\n  });\r\n}\r\n\r\nfunction shiftRanks(t, g, delta) {\r\n  _.each(t.nodes(), function(v) {\r\n    g.node(v).rank += delta;\r\n  });\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10,\"./util\":28}],26:[function(require,module,exports){\r\n\r\n\r\nvar rankUtil = require(\"./util\"),\r\n    longestPath = rankUtil.longestPath,\r\n    feasibleTree = require(\"./feasible-tree\"),\r\n    networkSimplex = require(\"./network-simplex\");\r\n\r\nmodule.exports = rank;\r\n\r\n/*\r\n * Assigns a rank to each node in the input graph that respects the \"minlen\"\r\n * constraint specified on edges between nodes.\r\n *\r\n * This basic structure is derived from Gansner, et al., \"A Technique for\r\n * Drawing Directed Graphs.\"\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Graph must be a connected DAG\r\n *    2. Graph nodes must be objects\r\n *    3. Graph edges must have \"weight\" and \"minlen\" attributes\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. Graph nodes will have a \"rank\" attribute based on the results of the\r\n *       algorithm. Ranks can start at any index (including negative), we'll\r\n *       fix them up later.\r\n */\r\nfunction rank(g) {\r\n  switch(g.graph().ranker) {\r\n    case \"network-simplex\": networkSimplexRanker(g); break;\r\n    case \"tight-tree\": tightTreeRanker(g); break;\r\n    case \"longest-path\": longestPathRanker(g); break;\r\n    default: networkSimplexRanker(g);\r\n  }\r\n}\r\n\r\n// A fast and simple ranker, but results are far from optimal.\r\nvar longestPathRanker = longestPath;\r\n\r\nfunction tightTreeRanker(g) {\r\n  longestPath(g);\r\n  feasibleTree(g);\r\n}\r\n\r\nfunction networkSimplexRanker(g) {\r\n  networkSimplex(g);\r\n}\r\n\r\n},{\"./feasible-tree\":25,\"./network-simplex\":27,\"./util\":28}],27:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    feasibleTree = require(\"./feasible-tree\"),\r\n    slack = require(\"./util\").slack,\r\n    initRank = require(\"./util\").longestPath,\r\n    preorder = require(\"../graphlib\").alg.preorder,\r\n    postorder = require(\"../graphlib\").alg.postorder,\r\n    simplify = require(\"../util\").simplify;\r\n\r\nmodule.exports = networkSimplex;\r\n\r\n// Expose some internals for testing purposes\r\nnetworkSimplex.initLowLimValues = initLowLimValues;\r\nnetworkSimplex.initCutValues = initCutValues;\r\nnetworkSimplex.calcCutValue = calcCutValue;\r\nnetworkSimplex.leaveEdge = leaveEdge;\r\nnetworkSimplex.enterEdge = enterEdge;\r\nnetworkSimplex.exchangeEdges = exchangeEdges;\r\n\r\n/*\r\n * The network simplex algorithm assigns ranks to each node in the input graph\r\n * and iteratively improves the ranking to reduce the length of edges.\r\n *\r\n * Preconditions:\r\n *\r\n *    1. The input graph must be a DAG.\r\n *    2. All nodes in the graph must have an object value.\r\n *    3. All edges in the graph must have \"minlen\" and \"weight\" attributes.\r\n *\r\n * Postconditions:\r\n *\r\n *    1. All nodes in the graph will have an assigned \"rank\" attribute that has\r\n *       been optimized by the network simplex algorithm. Ranks start at 0.\r\n *\r\n *\r\n * A rough sketch of the algorithm is as follows:\r\n *\r\n *    1. Assign initial ranks to each node. We use the longest path algorithm,\r\n *       which assigns ranks to the lowest position possible. In general this\r\n *       leads to very wide bottom ranks and unnecessarily long edges.\r\n *    2. Construct a feasible tight tree. A tight tree is one such that all\r\n *       edges in the tree have no slack (difference between length of edge\r\n *       and minlen for the edge). This by itself greatly improves the assigned\r\n *       rankings by shorting edges.\r\n *    3. Iteratively find edges that have negative cut values. Generally a\r\n *       negative cut value indicates that the edge could be removed and a new\r\n *       tree edge could be added to produce a more compact graph.\r\n *\r\n * Much of the algorithms here are derived from Gansner, et al., \"A Technique\r\n * for Drawing Directed Graphs.\" The structure of the file roughly follows the\r\n * structure of the overall algorithm.\r\n */\r\nfunction networkSimplex(g) {\r\n  g = simplify(g);\r\n  initRank(g);\r\n  var t = feasibleTree(g);\r\n  initLowLimValues(t);\r\n  initCutValues(t, g);\r\n\r\n  var e, f;\r\n  while ((e = leaveEdge(t))) {\r\n    f = enterEdge(t, g, e);\r\n    exchangeEdges(t, g, e, f);\r\n  }\r\n}\r\n\r\n/*\r\n * Initializes cut values for all edges in the tree.\r\n */\r\nfunction initCutValues(t, g) {\r\n  var vs = postorder(t, t.nodes());\r\n  vs = vs.slice(0, vs.length - 1);\r\n  _.each(vs, function(v) {\r\n    assignCutValue(t, g, v);\r\n  });\r\n}\r\n\r\nfunction assignCutValue(t, g, child) {\r\n  var childLab = t.node(child),\r\n      parent = childLab.parent;\r\n  t.edge(child, parent).cutvalue = calcCutValue(t, g, child);\r\n}\r\n\r\n/*\r\n * Given the tight tree, its graph, and a child in the graph calculate and\r\n * return the cut value for the edge between the child and its parent.\r\n */\r\nfunction calcCutValue(t, g, child) {\r\n  var childLab = t.node(child),\r\n      parent = childLab.parent,\r\n      // True if the child is on the tail end of the edge in the directed graph\r\n      childIsTail = true,\r\n      // The graph's view of the tree edge we're inspecting\r\n      graphEdge = g.edge(child, parent),\r\n      // The accumulated cut value for the edge between this node and its parent\r\n      cutValue = 0;\r\n\r\n  if (!graphEdge) {\r\n    childIsTail = false;\r\n    graphEdge = g.edge(parent, child);\r\n  }\r\n\r\n  cutValue = graphEdge.weight;\r\n\r\n  _.each(g.nodeEdges(child), function(e) {\r\n    var isOutEdge = e.v === child,\r\n        other = isOutEdge ? e.w : e.v;\r\n\r\n    if (other !== parent) {\r\n      var pointsToHead = isOutEdge === childIsTail,\r\n          otherWeight = g.edge(e).weight;\r\n\r\n      cutValue += pointsToHead ? otherWeight : -otherWeight;\r\n      if (isTreeEdge(t, child, other)) {\r\n        var otherCutValue = t.edge(child, other).cutvalue;\r\n        cutValue += pointsToHead ? -otherCutValue : otherCutValue;\r\n      }\r\n    }\r\n  });\r\n\r\n  return cutValue;\r\n}\r\n\r\nfunction initLowLimValues(tree, root) {\r\n  if (arguments.length < 2) {\r\n    root = tree.nodes()[0];\r\n  }\r\n  dfsAssignLowLim(tree, {}, 1, root);\r\n}\r\n\r\nfunction dfsAssignLowLim(tree, visited, nextLim, v, parent) {\r\n  var low = nextLim,\r\n      label = tree.node(v);\r\n\r\n  visited[v] = true;\r\n  _.each(tree.neighbors(v), function(w) {\r\n    if (!_.has(visited, w)) {\r\n      nextLim = dfsAssignLowLim(tree, visited, nextLim, w, v);\r\n    }\r\n  });\r\n\r\n  label.low = low;\r\n  label.lim = nextLim++;\r\n  if (parent) {\r\n    label.parent = parent;\r\n  } else {\r\n    // TODO should be able to remove this when we incrementally update low lim\r\n    delete label.parent;\r\n  }\r\n\r\n  return nextLim;\r\n}\r\n\r\nfunction leaveEdge(tree) {\r\n  return _.find(tree.edges(), function(e) {\r\n    return tree.edge(e).cutvalue < 0;\r\n  });\r\n}\r\n\r\nfunction enterEdge(t, g, edge) {\r\n  var v = edge.v,\r\n      w = edge.w;\r\n\r\n  // For the rest of this function we assume that v is the tail and w is the\r\n  // head, so if we don't have this edge in the graph we should flip it to\r\n  // match the correct orientation.\r\n  if (!g.hasEdge(v, w)) {\r\n    v = edge.w;\r\n    w = edge.v;\r\n  }\r\n\r\n  var vLabel = t.node(v),\r\n      wLabel = t.node(w),\r\n      tailLabel = vLabel,\r\n      flip = false;\r\n\r\n  // If the root is in the tail of the edge then we need to flip the logic that\r\n  // checks for the head and tail nodes in the candidates function below.\r\n  if (vLabel.lim > wLabel.lim) {\r\n    tailLabel = wLabel;\r\n    flip = true;\r\n  }\r\n\r\n  var candidates = _.filter(g.edges(), function(edge) {\r\n    return flip === isDescendant(t, t.node(edge.v), tailLabel) &&\r\n           flip !== isDescendant(t, t.node(edge.w), tailLabel);\r\n  });\r\n\r\n  return _.min(candidates, function(edge) { return slack(g, edge); });\r\n}\r\n\r\nfunction exchangeEdges(t, g, e, f) {\r\n  var v = e.v,\r\n      w = e.w;\r\n  t.removeEdge(v, w);\r\n  t.setEdge(f.v, f.w, {});\r\n  initLowLimValues(t);\r\n  initCutValues(t, g);\r\n  updateRanks(t, g);\r\n}\r\n\r\nfunction updateRanks(t, g) {\r\n  var root = _.find(t.nodes(), function(v) { return !g.node(v).parent; }),\r\n      vs = preorder(t, root);\r\n  vs = vs.slice(1);\r\n  _.each(vs, function(v) {\r\n    var parent = t.node(v).parent,\r\n        edge = g.edge(v, parent),\r\n        flipped = false;\r\n\r\n    if (!edge) {\r\n      edge = g.edge(parent, v);\r\n      flipped = true;\r\n    }\r\n\r\n    g.node(v).rank = g.node(parent).rank + (flipped ? edge.minlen : -edge.minlen);\r\n  });\r\n}\r\n\r\n/*\r\n * Returns true if the edge is in the tree.\r\n */\r\nfunction isTreeEdge(tree, u, v) {\r\n  return tree.hasEdge(u, v);\r\n}\r\n\r\n/*\r\n * Returns true if the specified node is descendant of the root node per the\r\n * assigned low and lim attributes in the tree.\r\n */\r\nfunction isDescendant(tree, vLabel, rootLabel) {\r\n  return rootLabel.low <= vLabel.lim && vLabel.lim <= rootLabel.lim;\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10,\"../util\":29,\"./feasible-tree\":25,\"./util\":28}],28:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = {\r\n  longestPath: longestPath,\r\n  slack: slack\r\n};\r\n\r\n/*\r\n * Initializes ranks for the input graph using the longest path algorithm. This\r\n * algorithm scales well and is fast in practice, it yields rather poor\r\n * solutions. Nodes are pushed to the lowest layer possible, leaving the bottom\r\n * ranks wide and leaving edges longer than necessary. However, due to its\r\n * speed, this algorithm is good for getting an initial ranking that can be fed\r\n * into other algorithms.\r\n *\r\n * This algorithm does not normalize layers because it will be used by other\r\n * algorithms in most cases. If using this algorithm directly, be sure to\r\n * run normalize at the end.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Input graph is a DAG.\r\n *    2. Input graph node labels can be assigned properties.\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. Each node will be assign an (unnormalized) \"rank\" property.\r\n */\r\nfunction longestPath(g) {\r\n  var visited = {};\r\n\r\n  function dfs(v) {\r\n    var label = g.node(v);\r\n    if (_.has(visited, v)) {\r\n      return label.rank;\r\n    }\r\n    visited[v] = true;\r\n\r\n    var rank = _.min(_.map(g.outEdges(v), function(e) {\r\n      return dfs(e.w) - g.edge(e).minlen;\r\n    }));\r\n\r\n    if (rank === Number.POSITIVE_INFINITY) {\r\n      rank = 0;\r\n    }\r\n\r\n    return (label.rank = rank);\r\n  }\r\n\r\n  _.each(g.sources(), dfs);\r\n}\r\n\r\n/*\r\n * Returns the amount of slack for the given edge. The slack is defined as the\r\n * difference between the length of the edge and its minimum length.\r\n */\r\nfunction slack(g, e) {\r\n  return g.node(e.w).rank - g.node(e.v).rank - g.edge(e).minlen;\r\n}\r\n\r\n},{\"../lodash\":10}],29:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\"),\r\n    Graph = require(\"./graphlib\").Graph;\r\n\r\nmodule.exports = {\r\n  addDummyNode: addDummyNode,\r\n  simplify: simplify,\r\n  asNonCompoundGraph: asNonCompoundGraph,\r\n  successorWeights: successorWeights,\r\n  predecessorWeights: predecessorWeights,\r\n  intersectRect: intersectRect,\r\n  buildLayerMatrix: buildLayerMatrix,\r\n  normalizeRanks: normalizeRanks,\r\n  removeEmptyRanks: removeEmptyRanks,\r\n  addBorderNode: addBorderNode,\r\n  maxRank: maxRank,\r\n  partition: partition,\r\n  time: time,\r\n  notime: notime\r\n};\r\n\r\n/*\r\n * Adds a dummy node to the graph and return v.\r\n */\r\nfunction addDummyNode(g, type, attrs, name) {\r\n  var v;\r\n  do {\r\n    v = _.uniqueId(name);\r\n  } while (g.hasNode(v));\r\n\r\n  attrs.dummy = type;\r\n  g.setNode(v, attrs);\r\n  return v;\r\n}\r\n\r\n/*\r\n * Returns a new graph with only simple edges. Handles aggregation of data\r\n * associated with multi-edges.\r\n */\r\nfunction simplify(g) {\r\n  var simplified = new Graph().setGraph(g.graph());\r\n  _.each(g.nodes(), function(v) { simplified.setNode(v, g.node(v)); });\r\n  _.each(g.edges(), function(e) {\r\n    var simpleLabel = simplified.edge(e.v, e.w) || { weight: 0, minlen: 1 },\r\n        label = g.edge(e);\r\n    simplified.setEdge(e.v, e.w, {\r\n      weight: simpleLabel.weight + label.weight,\r\n      minlen: Math.max(simpleLabel.minlen, label.minlen)\r\n    });\r\n  });\r\n  return simplified;\r\n}\r\n\r\nfunction asNonCompoundGraph(g) {\r\n  var simplified = new Graph({ multigraph: g.isMultigraph() }).setGraph(g.graph());\r\n  _.each(g.nodes(), function(v) {\r\n    if (!g.children(v).length) {\r\n      simplified.setNode(v, g.node(v));\r\n    }\r\n  });\r\n  _.each(g.edges(), function(e) {\r\n    simplified.setEdge(e, g.edge(e));\r\n  });\r\n  return simplified;\r\n}\r\n\r\nfunction successorWeights(g) {\r\n  var weightMap = _.map(g.nodes(), function(v) {\r\n    var sucs = {};\r\n    _.each(g.outEdges(v), function(e) {\r\n      sucs[e.w] = (sucs[e.w] || 0) + g.edge(e).weight;\r\n    });\r\n    return sucs;\r\n  });\r\n  return _.zipObject(g.nodes(), weightMap);\r\n}\r\n\r\nfunction predecessorWeights(g) {\r\n  var weightMap = _.map(g.nodes(), function(v) {\r\n    var preds = {};\r\n    _.each(g.inEdges(v), function(e) {\r\n      preds[e.v] = (preds[e.v] || 0) + g.edge(e).weight;\r\n    });\r\n    return preds;\r\n  });\r\n  return _.zipObject(g.nodes(), weightMap);\r\n}\r\n\r\n/*\r\n * Finds where a line starting at point ({x, y}) would intersect a rectangle\r\n * ({x, y, width, height}) if it were pointing at the rectangle's center.\r\n */\r\nfunction intersectRect(rect, point) {\r\n  var x = rect.x;\r\n  var y = rect.y;\r\n\r\n  // Rectangle intersection algorithm from:\r\n  // http://math.stackexchange.com/questions/108113/find-edge-between-two-boxes\r\n  var dx = point.x - x;\r\n  var dy = point.y - y;\r\n  var w = rect.width / 2;\r\n  var h = rect.height / 2;\r\n\r\n  if (!dx && !dy) {\r\n    throw new Error(\"Not possible to find intersection inside of the rectangle\");\r\n  }\r\n\r\n  var sx, sy;\r\n  if (Math.abs(dy) * w > Math.abs(dx) * h) {\r\n    // Intersection is top or bottom of rect.\r\n    if (dy < 0) {\r\n      h = -h;\r\n    }\r\n    sx = h * dx / dy;\r\n    sy = h;\r\n  } else {\r\n    // Intersection is left or right of rect.\r\n    if (dx < 0) {\r\n      w = -w;\r\n    }\r\n    sx = w;\r\n    sy = w * dy / dx;\r\n  }\r\n\r\n  return { x: x + sx, y: y + sy };\r\n}\r\n\r\n/*\r\n * Given a DAG with each node assigned \"rank\" and \"order\" properties, this\r\n * function will produce a matrix with the ids of each node.\r\n */\r\nfunction buildLayerMatrix(g) {\r\n  var layering = _.map(_.range(maxRank(g) + 1), function() { return []; });\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v),\r\n        rank = node.rank;\r\n    if (!_.isUndefined(rank)) {\r\n      layering[rank][node.order] = v;\r\n    }\r\n  });\r\n  return layering;\r\n}\r\n\r\n/*\r\n * Adjusts the ranks for all nodes in the graph such that all nodes v have\r\n * rank(v) >= 0 and at least one node w has rank(w) = 0.\r\n */\r\nfunction normalizeRanks(g) {\r\n  var min = _.min(_.map(g.nodes(), function(v) { return g.node(v).rank; }));\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    if (_.has(node, \"rank\")) {\r\n      node.rank -= min;\r\n    }\r\n  });\r\n}\r\n\r\nfunction removeEmptyRanks(g) {\r\n  // Ranks may not start at 0, so we need to offset them\r\n  var offset = _.min(_.map(g.nodes(), function(v) { return g.node(v).rank; }));\r\n\r\n  var layers = [];\r\n  _.each(g.nodes(), function(v) {\r\n    var rank = g.node(v).rank - offset;\r\n    if (!_.has(layers, rank)) {\r\n      layers[rank] = [];\r\n    }\r\n    layers[rank].push(v);\r\n  });\r\n\r\n  var delta = 0,\r\n      nodeRankFactor = g.graph().nodeRankFactor;\r\n  _.each(layers, function(vs, i) {\r\n    if (_.isUndefined(vs) && i % nodeRankFactor !== 0) {\r\n      --delta;\r\n    } else if (delta) {\r\n      _.each(vs, function(v) { g.node(v).rank += delta; });\r\n    }\r\n  });\r\n}\r\n\r\nfunction addBorderNode(g, prefix, rank, order) {\r\n  var node = {\r\n    width: 0,\r\n    height: 0\r\n  };\r\n  if (arguments.length >= 4) {\r\n    node.rank = rank;\r\n    node.order = order;\r\n  }\r\n  return addDummyNode(g, \"border\", node, prefix);\r\n}\r\n\r\nfunction maxRank(g) {\r\n  return _.max(_.map(g.nodes(), function(v) {\r\n    var rank = g.node(v).rank;\r\n    if (!_.isUndefined(rank)) {\r\n      return rank;\r\n    }\r\n  }));\r\n}\r\n\r\n/*\r\n * Partition a collection into two groups: `lhs` and `rhs`. If the supplied\r\n * function returns true for an entry it goes into `lhs`. Otherwise it goes\r\n * into `rhs.\r\n */\r\nfunction partition(collection, fn) {\r\n  var result = { lhs: [], rhs: [] };\r\n  _.each(collection, function(value) {\r\n    if (fn(value)) {\r\n      result.lhs.push(value);\r\n    } else {\r\n      result.rhs.push(value);\r\n    }\r\n  });\r\n  return result;\r\n}\r\n\r\n/*\r\n * Returns a new function that wraps `fn` with a timer. The wrapper logs the\r\n * time it takes to execute the function.\r\n */\r\nfunction time(name, fn) {\r\n  var start = _.now();\r\n  try {\r\n    return fn();\r\n  } finally {\r\n    console.log(name + \" time: \" + (_.now() - start) + \"ms\");\r\n  }\r\n}\r\n\r\nfunction notime(name, fn) {\r\n  return fn();\r\n}\r\n\r\n},{\"./graphlib\":7,\"./lodash\":10}],30:[function(require,module,exports){\r\nmodule.exports = \"0.7.1\";\r\n\r\n},{}],31:[function(require,module,exports){\r\n/**\r\n * Copyright (c) 2014, Chris Pettitt\r\n * All rights reserved.\r\n *\r\n * Redistribution and use in source and binary forms, with or without\r\n * modification, are permitted provided that the following conditions are met:\r\n *\r\n * 1. Redistributions of source code must retain the above copyright notice, this\r\n * list of conditions and the following disclaimer.\r\n *\r\n * 2. Redistributions in binary form must reproduce the above copyright notice,\r\n * this list of conditions and the following disclaimer in the documentation\r\n * and/or other materials provided with the distribution.\r\n *\r\n * 3. Neither the name of the copyright holder nor the names of its contributors\r\n * may be used to endorse or promote products derived from this software without\r\n * specific prior written permission.\r\n *\r\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\r\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\r\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\r\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\r\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\r\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\r\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n */\r\n\r\nvar lib = require(\"./lib\");\r\n\r\nmodule.exports = {\r\n  Graph: lib.Graph,\r\n  json: require(\"./lib/json\"),\r\n  alg: require(\"./lib/alg\"),\r\n  version: lib.version\r\n};\r\n\r\n},{\"./lib\":47,\"./lib/alg\":38,\"./lib/json\":48}],32:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = components;\r\n\r\nfunction components(g) {\r\n  var visited = {},\r\n      cmpts = [],\r\n      cmpt;\r\n\r\n  function dfs(v) {\r\n    if (_.has(visited, v)) return;\r\n    visited[v] = true;\r\n    cmpt.push(v);\r\n    _.each(g.successors(v), dfs);\r\n    _.each(g.predecessors(v), dfs);\r\n  }\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    cmpt = [];\r\n    dfs(v);\r\n    if (cmpt.length) {\r\n      cmpts.push(cmpt);\r\n    }\r\n  });\r\n\r\n  return cmpts;\r\n}\r\n\r\n},{\"../lodash\":49}],33:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = dfs;\r\n\r\n/*\r\n * A helper that preforms a pre- or post-order traversal on the input graph\r\n * and returns the nodes in the order they were visited. This algorithm treats\r\n * the input as undirected.\r\n *\r\n * Order must be one of \"pre\" or \"post\".\r\n */\r\nfunction dfs(g, vs, order) {\r\n  if (!_.isArray(vs)) {\r\n    vs = [vs];\r\n  }\r\n\r\n  var acc = [],\r\n      visited = {};\r\n  _.each(vs, function(v) {\r\n    if (!g.hasNode(v)) {\r\n      throw new Error(\"Graph does not have node: \" + v);\r\n    }\r\n\r\n    doDfs(g, v, order === \"post\", visited, acc);\r\n  });\r\n  return acc;\r\n}\r\n\r\nfunction doDfs(g, v, postorder, visited, acc) {\r\n  if (!_.has(visited, v)) {\r\n    visited[v] = true;\r\n\r\n    if (!postorder) { acc.push(v); }\r\n    _.each(g.neighbors(v), function(w) {\r\n      doDfs(g, w, postorder, visited, acc);\r\n    });\r\n    if (postorder) { acc.push(v); }\r\n  }\r\n}\r\n\r\n},{\"../lodash\":49}],34:[function(require,module,exports){\r\nvar dijkstra = require(\"./dijkstra\"),\r\n    _ = require(\"../lodash\");\r\n\r\nmodule.exports = dijkstraAll;\r\n\r\nfunction dijkstraAll(g, weightFunc, edgeFunc) {\r\n  return _.transform(g.nodes(), function(acc, v) {\r\n    acc[v] = dijkstra(g, v, weightFunc, edgeFunc);\r\n  }, {});\r\n}\r\n\r\n},{\"../lodash\":49,\"./dijkstra\":35}],35:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    PriorityQueue = require(\"../data/priority-queue\");\r\n\r\nmodule.exports = dijkstra;\r\n\r\nvar DEFAULT_WEIGHT_FUNC = _.constant(1);\r\n\r\nfunction dijkstra(g, source, weightFn, edgeFn) {\r\n  return runDijkstra(g, String(source),\r\n                     weightFn || DEFAULT_WEIGHT_FUNC,\r\n                     edgeFn || function(v) { return g.outEdges(v); });\r\n}\r\n\r\nfunction runDijkstra(g, source, weightFn, edgeFn) {\r\n  var results = {},\r\n      pq = new PriorityQueue(),\r\n      v, vEntry;\r\n\r\n  var updateNeighbors = function(edge) {\r\n    var w = edge.v !== v ? edge.v : edge.w,\r\n        wEntry = results[w],\r\n        weight = weightFn(edge),\r\n        distance = vEntry.distance + weight;\r\n\r\n    if (weight < 0) {\r\n      throw new Error(\"dijkstra does not allow negative edge weights. \" +\r\n                      \"Bad edge: \" + edge + \" Weight: \" + weight);\r\n    }\r\n\r\n    if (distance < wEntry.distance) {\r\n      wEntry.distance = distance;\r\n      wEntry.predecessor = v;\r\n      pq.decrease(w, distance);\r\n    }\r\n  };\r\n\r\n  g.nodes().forEach(function(v) {\r\n    var distance = v === source ? 0 : Number.POSITIVE_INFINITY;\r\n    results[v] = { distance: distance };\r\n    pq.add(v, distance);\r\n  });\r\n\r\n  while (pq.size() > 0) {\r\n    v = pq.removeMin();\r\n    vEntry = results[v];\r\n    if (vEntry.distance === Number.POSITIVE_INFINITY) {\r\n      break;\r\n    }\r\n\r\n    edgeFn(v).forEach(updateNeighbors);\r\n  }\r\n\r\n  return results;\r\n}\r\n\r\n},{\"../data/priority-queue\":45,\"../lodash\":49}],36:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    tarjan = require(\"./tarjan\");\r\n\r\nmodule.exports = findCycles;\r\n\r\nfunction findCycles(g) {\r\n  return _.filter(tarjan(g), function(cmpt) { return cmpt.length > 1; });\r\n}\r\n\r\n},{\"../lodash\":49,\"./tarjan\":43}],37:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = floydWarshall;\r\n\r\nvar DEFAULT_WEIGHT_FUNC = _.constant(1);\r\n\r\nfunction floydWarshall(g, weightFn, edgeFn) {\r\n  return runFloydWarshall(g,\r\n                          weightFn || DEFAULT_WEIGHT_FUNC,\r\n                          edgeFn || function(v) { return g.outEdges(v); });\r\n}\r\n\r\nfunction runFloydWarshall(g, weightFn, edgeFn) {\r\n  var results = {},\r\n      nodes = g.nodes();\r\n\r\n  nodes.forEach(function(v) {\r\n    results[v] = {};\r\n    results[v][v] = { distance: 0 };\r\n    nodes.forEach(function(w) {\r\n      if (v !== w) {\r\n        results[v][w] = { distance: Number.POSITIVE_INFINITY };\r\n      }\r\n    });\r\n    edgeFn(v).forEach(function(edge) {\r\n      var w = edge.v === v ? edge.w : edge.v,\r\n          d = weightFn(edge);\r\n      results[v][w] = { distance: d, predecessor: v };\r\n    });\r\n  });\r\n\r\n  nodes.forEach(function(k) {\r\n    var rowK = results[k];\r\n    nodes.forEach(function(i) {\r\n      var rowI = results[i];\r\n      nodes.forEach(function(j) {\r\n        var ik = rowI[k];\r\n        var kj = rowK[j];\r\n        var ij = rowI[j];\r\n        var altDistance = ik.distance + kj.distance;\r\n        if (altDistance < ij.distance) {\r\n          ij.distance = altDistance;\r\n          ij.predecessor = kj.predecessor;\r\n        }\r\n      });\r\n    });\r\n  });\r\n\r\n  return results;\r\n}\r\n\r\n},{\"../lodash\":49}],38:[function(require,module,exports){\r\nmodule.exports = {\r\n  components: require(\"./components\"),\r\n  dijkstra: require(\"./dijkstra\"),\r\n  dijkstraAll: require(\"./dijkstra-all\"),\r\n  findCycles: require(\"./find-cycles\"),\r\n  floydWarshall: require(\"./floyd-warshall\"),\r\n  isAcyclic: require(\"./is-acyclic\"),\r\n  postorder: require(\"./postorder\"),\r\n  preorder: require(\"./preorder\"),\r\n  prim: require(\"./prim\"),\r\n  tarjan: require(\"./tarjan\"),\r\n  topsort: require(\"./topsort\")\r\n};\r\n\r\n},{\"./components\":32,\"./dijkstra\":35,\"./dijkstra-all\":34,\"./find-cycles\":36,\"./floyd-warshall\":37,\"./is-acyclic\":39,\"./postorder\":40,\"./preorder\":41,\"./prim\":42,\"./tarjan\":43,\"./topsort\":44}],39:[function(require,module,exports){\r\nvar topsort = require(\"./topsort\");\r\n\r\nmodule.exports = isAcyclic;\r\n\r\nfunction isAcyclic(g) {\r\n  try {\r\n    topsort(g);\r\n  } catch (e) {\r\n    if (e instanceof topsort.CycleException) {\r\n      return false;\r\n    }\r\n    throw e;\r\n  }\r\n  return true;\r\n}\r\n\r\n},{\"./topsort\":44}],40:[function(require,module,exports){\r\nvar dfs = require(\"./dfs\");\r\n\r\nmodule.exports = postorder;\r\n\r\nfunction postorder(g, vs) {\r\n  return dfs(g, vs, \"post\");\r\n}\r\n\r\n},{\"./dfs\":33}],41:[function(require,module,exports){\r\nvar dfs = require(\"./dfs\");\r\n\r\nmodule.exports = preorder;\r\n\r\nfunction preorder(g, vs) {\r\n  return dfs(g, vs, \"pre\");\r\n}\r\n\r\n},{\"./dfs\":33}],42:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    Graph = require(\"../graph\"),\r\n    PriorityQueue = require(\"../data/priority-queue\");\r\n\r\nmodule.exports = prim;\r\n\r\nfunction prim(g, weightFunc) {\r\n  var result = new Graph(),\r\n      parents = {},\r\n      pq = new PriorityQueue(),\r\n      v;\r\n\r\n  function updateNeighbors(edge) {\r\n    var w = edge.v === v ? edge.w : edge.v,\r\n        pri = pq.priority(w);\r\n    if (pri !== undefined) {\r\n      var edgeWeight = weightFunc(edge);\r\n      if (edgeWeight < pri) {\r\n        parents[w] = v;\r\n        pq.decrease(w, edgeWeight);\r\n      }\r\n    }\r\n  }\r\n\r\n  if (g.nodeCount() === 0) {\r\n    return result;\r\n  }\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    pq.add(v, Number.POSITIVE_INFINITY);\r\n    result.setNode(v);\r\n  });\r\n\r\n  // Start from an arbitrary node\r\n  pq.decrease(g.nodes()[0], 0);\r\n\r\n  var init = false;\r\n  while (pq.size() > 0) {\r\n    v = pq.removeMin();\r\n    if (_.has(parents, v)) {\r\n      result.setEdge(v, parents[v]);\r\n    } else if (init) {\r\n      throw new Error(\"Input graph is not connected: \" + g);\r\n    } else {\r\n      init = true;\r\n    }\r\n\r\n    g.nodeEdges(v).forEach(updateNeighbors);\r\n  }\r\n\r\n  return result;\r\n}\r\n\r\n},{\"../data/priority-queue\":45,\"../graph\":46,\"../lodash\":49}],43:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = tarjan;\r\n\r\nfunction tarjan(g) {\r\n  var index = 0,\r\n      stack = [],\r\n      visited = {}, // node id -> { onStack, lowlink, index }\r\n      results = [];\r\n\r\n  function dfs(v) {\r\n    var entry = visited[v] = {\r\n      onStack: true,\r\n      lowlink: index,\r\n      index: index++\r\n    };\r\n    stack.push(v);\r\n\r\n    g.successors(v).forEach(function(w) {\r\n      if (!_.has(visited, w)) {\r\n        dfs(w);\r\n        entry.lowlink = Math.min(entry.lowlink, visited[w].lowlink);\r\n      } else if (visited[w].onStack) {\r\n        entry.lowlink = Math.min(entry.lowlink, visited[w].index);\r\n      }\r\n    });\r\n\r\n    if (entry.lowlink === entry.index) {\r\n      var cmpt = [],\r\n          w;\r\n      do {\r\n        w = stack.pop();\r\n        visited[w].onStack = false;\r\n        cmpt.push(w);\r\n      } while (v !== w);\r\n      results.push(cmpt);\r\n    }\r\n  }\r\n\r\n  g.nodes().forEach(function(v) {\r\n    if (!_.has(visited, v)) {\r\n      dfs(v);\r\n    }\r\n  });\r\n\r\n  return results;\r\n}\r\n\r\n},{\"../lodash\":49}],44:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = topsort;\r\ntopsort.CycleException = CycleException;\r\n\r\nfunction topsort(g) {\r\n  var visited = {},\r\n      stack = {},\r\n      results = [];\r\n\r\n  function visit(node) {\r\n    if (_.has(stack, node)) {\r\n      throw new CycleException();\r\n    }\r\n\r\n    if (!_.has(visited, node)) {\r\n      stack[node] = true;\r\n      visited[node] = true;\r\n      _.each(g.predecessors(node), visit);\r\n      delete stack[node];\r\n      results.push(node);\r\n    }\r\n  }\r\n\r\n  _.each(g.sinks(), visit);\r\n\r\n  if (_.size(visited) !== g.nodeCount()) {\r\n    throw new CycleException();\r\n  }\r\n\r\n  return results;\r\n}\r\n\r\nfunction CycleException() {}\r\n\r\n},{\"../lodash\":49}],45:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = PriorityQueue;\r\n\r\n/**\r\n * A min-priority queue data structure. This algorithm is derived from Cormen,\r\n * et al., \"Introduction to Algorithms\". The basic idea of a min-priority\r\n * queue is that you can efficiently (in O(1) time) get the smallest key in\r\n * the queue. Adding and removing elements takes O(log n) time. A key can\r\n * have its priority decreased in O(log n) time.\r\n */\r\nfunction PriorityQueue() {\r\n  this._arr = [];\r\n  this._keyIndices = {};\r\n}\r\n\r\n/**\r\n * Returns the number of elements in the queue. Takes `O(1)` time.\r\n */\r\nPriorityQueue.prototype.size = function() {\r\n  return this._arr.length;\r\n};\r\n\r\n/**\r\n * Returns the keys that are in the queue. Takes `O(n)` time.\r\n */\r\nPriorityQueue.prototype.keys = function() {\r\n  return this._arr.map(function(x) { return x.key; });\r\n};\r\n\r\n/**\r\n * Returns `true` if **key** is in the queue and `false` if not.\r\n */\r\nPriorityQueue.prototype.has = function(key) {\r\n  return _.has(this._keyIndices, key);\r\n};\r\n\r\n/**\r\n * Returns the priority for **key**. If **key** is not present in the queue\r\n * then this function returns `undefined`. Takes `O(1)` time.\r\n *\r\n * @param {Object} key\r\n */\r\nPriorityQueue.prototype.priority = function(key) {\r\n  var index = this._keyIndices[key];\r\n  if (index !== undefined) {\r\n    return this._arr[index].priority;\r\n  }\r\n};\r\n\r\n/**\r\n * Returns the key for the minimum element in this queue. If the queue is\r\n * empty this function throws an Error. Takes `O(1)` time.\r\n */\r\nPriorityQueue.prototype.min = function() {\r\n  if (this.size() === 0) {\r\n    throw new Error(\"Queue underflow\");\r\n  }\r\n  return this._arr[0].key;\r\n};\r\n\r\n/**\r\n * Inserts a new key into the priority queue. If the key already exists in\r\n * the queue this function returns `false`; otherwise it will return `true`.\r\n * Takes `O(n)` time.\r\n *\r\n * @param {Object} key the key to add\r\n * @param {Number} priority the initial priority for the key\r\n */\r\nPriorityQueue.prototype.add = function(key, priority) {\r\n  var keyIndices = this._keyIndices;\r\n  key = String(key);\r\n  if (!_.has(keyIndices, key)) {\r\n    var arr = this._arr;\r\n    var index = arr.length;\r\n    keyIndices[key] = index;\r\n    arr.push({key: key, priority: priority});\r\n    this._decrease(index);\r\n    return true;\r\n  }\r\n  return false;\r\n};\r\n\r\n/**\r\n * Removes and returns the smallest key in the queue. Takes `O(log n)` time.\r\n */\r\nPriorityQueue.prototype.removeMin = function() {\r\n  this._swap(0, this._arr.length - 1);\r\n  var min = this._arr.pop();\r\n  delete this._keyIndices[min.key];\r\n  this._heapify(0);\r\n  return min.key;\r\n};\r\n\r\n/**\r\n * Decreases the priority for **key** to **priority**. If the new priority is\r\n * greater than the previous priority, this function will throw an Error.\r\n *\r\n * @param {Object} key the key for which to raise priority\r\n * @param {Number} priority the new priority for the key\r\n */\r\nPriorityQueue.prototype.decrease = function(key, priority) {\r\n  var index = this._keyIndices[key];\r\n  if (priority > this._arr[index].priority) {\r\n    throw new Error(\"New priority is greater than current priority. \" +\r\n        \"Key: \" + key + \" Old: \" + this._arr[index].priority + \" New: \" + priority);\r\n  }\r\n  this._arr[index].priority = priority;\r\n  this._decrease(index);\r\n};\r\n\r\nPriorityQueue.prototype._heapify = function(i) {\r\n  var arr = this._arr;\r\n  var l = 2 * i,\r\n      r = l + 1,\r\n      largest = i;\r\n  if (l < arr.length) {\r\n    largest = arr[l].priority < arr[largest].priority ? l : largest;\r\n    if (r < arr.length) {\r\n      largest = arr[r].priority < arr[largest].priority ? r : largest;\r\n    }\r\n    if (largest !== i) {\r\n      this._swap(i, largest);\r\n      this._heapify(largest);\r\n    }\r\n  }\r\n};\r\n\r\nPriorityQueue.prototype._decrease = function(index) {\r\n  var arr = this._arr;\r\n  var priority = arr[index].priority;\r\n  var parent;\r\n  while (index !== 0) {\r\n    parent = index >> 1;\r\n    if (arr[parent].priority < priority) {\r\n      break;\r\n    }\r\n    this._swap(index, parent);\r\n    index = parent;\r\n  }\r\n};\r\n\r\nPriorityQueue.prototype._swap = function(i, j) {\r\n  var arr = this._arr;\r\n  var keyIndices = this._keyIndices;\r\n  var origArrI = arr[i];\r\n  var origArrJ = arr[j];\r\n  arr[i] = origArrJ;\r\n  arr[j] = origArrI;\r\n  keyIndices[origArrJ.key] = i;\r\n  keyIndices[origArrI.key] = j;\r\n};\r\n\r\n},{\"../lodash\":49}],46:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\");\r\n\r\nmodule.exports = Graph;\r\n\r\nvar DEFAULT_EDGE_NAME = \"\\x00\",\r\n    GRAPH_NODE = \"\\x00\",\r\n    EDGE_KEY_DELIM = \"\\x01\";\r\n\r\n// Implementation notes:\r\n//\r\n//  * Node id query functions should return string ids for the nodes\r\n//  * Edge id query functions should return an \"edgeObj\", edge object, that is\r\n//    composed of enough information to uniquely identify an edge: {v, w, name}.\r\n//  * Internally we use an \"edgeId\", a stringified form of the edgeObj, to\r\n//    reference edges. This is because we need a performant way to look these\r\n//    edges up and, object properties, which have string keys, are the closest\r\n//    we're going to get to a performant hashtable in JavaScript.\r\n\r\nfunction Graph(opts) {\r\n  this._isDirected = _.has(opts, \"directed\") ? opts.directed : true;\r\n  this._isMultigraph = _.has(opts, \"multigraph\") ? opts.multigraph : false;\r\n  this._isCompound = _.has(opts, \"compound\") ? opts.compound : false;\r\n\r\n  // Label for the graph itself\r\n  this._label = undefined;\r\n\r\n  // Defaults to be set when creating a new node\r\n  this._defaultNodeLabelFn = _.constant(undefined);\r\n\r\n  // Defaults to be set when creating a new edge\r\n  this._defaultEdgeLabelFn = _.constant(undefined);\r\n\r\n  // v -> label\r\n  this._nodes = {};\r\n\r\n  if (this._isCompound) {\r\n    // v -> parent\r\n    this._parent = {};\r\n\r\n    // v -> children\r\n    this._children = {};\r\n    this._children[GRAPH_NODE] = {};\r\n  }\r\n\r\n  // v -> edgeObj\r\n  this._in = {};\r\n\r\n  // u -> v -> Number\r\n  this._preds = {};\r\n\r\n  // v -> edgeObj\r\n  this._out = {};\r\n\r\n  // v -> w -> Number\r\n  this._sucs = {};\r\n\r\n  // e -> edgeObj\r\n  this._edgeObjs = {};\r\n\r\n  // e -> label\r\n  this._edgeLabels = {};\r\n}\r\n\r\n/* Number of nodes in the graph. Should only be changed by the implementation. */\r\nGraph.prototype._nodeCount = 0;\r\n\r\n/* Number of edges in the graph. Should only be changed by the implementation. */\r\nGraph.prototype._edgeCount = 0;\r\n\r\n\r\n/* === Graph functions ========= */\r\n\r\nGraph.prototype.isDirected = function() {\r\n  return this._isDirected;\r\n};\r\n\r\nGraph.prototype.isMultigraph = function() {\r\n  return this._isMultigraph;\r\n};\r\n\r\nGraph.prototype.isCompound = function() {\r\n  return this._isCompound;\r\n};\r\n\r\nGraph.prototype.setGraph = function(label) {\r\n  this._label = label;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.graph = function() {\r\n  return this._label;\r\n};\r\n\r\n\r\n/* === Node functions ========== */\r\n\r\nGraph.prototype.setDefaultNodeLabel = function(newDefault) {\r\n  if (!_.isFunction(newDefault)) {\r\n    newDefault = _.constant(newDefault);\r\n  }\r\n  this._defaultNodeLabelFn = newDefault;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.nodeCount = function() {\r\n  return this._nodeCount;\r\n};\r\n\r\nGraph.prototype.nodes = function() {\r\n  return _.keys(this._nodes);\r\n};\r\n\r\nGraph.prototype.sources = function() {\r\n  return _.filter(this.nodes(), function(v) {\r\n    return _.isEmpty(this._in[v]);\r\n  }, this);\r\n};\r\n\r\nGraph.prototype.sinks = function() {\r\n  return _.filter(this.nodes(), function(v) {\r\n    return _.isEmpty(this._out[v]);\r\n  }, this);\r\n};\r\n\r\nGraph.prototype.setNodes = function(vs, value) {\r\n  var args = arguments;\r\n  _.each(vs, function(v) {\r\n    if (args.length > 1) {\r\n      this.setNode(v, value);\r\n    } else {\r\n      this.setNode(v);\r\n    }\r\n  }, this);\r\n  return this;\r\n};\r\n\r\nGraph.prototype.setNode = function(v, value) {\r\n  if (_.has(this._nodes, v)) {\r\n    if (arguments.length > 1) {\r\n      this._nodes[v] = value;\r\n    }\r\n    return this;\r\n  }\r\n\r\n  this._nodes[v] = arguments.length > 1 ? value : this._defaultNodeLabelFn(v);\r\n  if (this._isCompound) {\r\n    this._parent[v] = GRAPH_NODE;\r\n    this._children[v] = {};\r\n    this._children[GRAPH_NODE][v] = true;\r\n  }\r\n  this._in[v] = {};\r\n  this._preds[v] = {};\r\n  this._out[v] = {};\r\n  this._sucs[v] = {};\r\n  ++this._nodeCount;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.node = function(v) {\r\n  return this._nodes[v];\r\n};\r\n\r\nGraph.prototype.hasNode = function(v) {\r\n  return _.has(this._nodes, v);\r\n};\r\n\r\nGraph.prototype.removeNode =  function(v) {\r\n  var self = this;\r\n  if (_.has(this._nodes, v)) {\r\n    var removeEdge = function(e) { self.removeEdge(self._edgeObjs[e]); };\r\n    delete this._nodes[v];\r\n    if (this._isCompound) {\r\n      this._removeFromParentsChildList(v);\r\n      delete this._parent[v];\r\n      _.each(this.children(v), function(child) {\r\n        this.setParent(child);\r\n      }, this);\r\n      delete this._children[v];\r\n    }\r\n    _.each(_.keys(this._in[v]), removeEdge);\r\n    delete this._in[v];\r\n    delete this._preds[v];\r\n    _.each(_.keys(this._out[v]), removeEdge);\r\n    delete this._out[v];\r\n    delete this._sucs[v];\r\n    --this._nodeCount;\r\n  }\r\n  return this;\r\n};\r\n\r\nGraph.prototype.setParent = function(v, parent) {\r\n  if (!this._isCompound) {\r\n    throw new Error(\"Cannot set parent in a non-compound graph\");\r\n  }\r\n\r\n  if (_.isUndefined(parent)) {\r\n    parent = GRAPH_NODE;\r\n  } else {\r\n    for (var ancestor = parent;\r\n         !_.isUndefined(ancestor);\r\n         ancestor = this.parent(ancestor)) {\r\n      if (ancestor === v) {\r\n        throw new Error(\"Setting \" + parent+ \" as parent of \" + v +\r\n                        \" would create create a cycle\");\r\n      }\r\n    }\r\n\r\n    this.setNode(parent);\r\n  }\r\n\r\n  this.setNode(v);\r\n  this._removeFromParentsChildList(v);\r\n  this._parent[v] = parent;\r\n  this._children[parent][v] = true;\r\n  return this;\r\n};\r\n\r\nGraph.prototype._removeFromParentsChildList = function(v) {\r\n  delete this._children[this._parent[v]][v];\r\n};\r\n\r\nGraph.prototype.parent = function(v) {\r\n  if (this._isCompound) {\r\n    var parent = this._parent[v];\r\n    if (parent !== GRAPH_NODE) {\r\n      return parent;\r\n    }\r\n  }\r\n};\r\n\r\nGraph.prototype.children = function(v) {\r\n  if (_.isUndefined(v)) {\r\n    v = GRAPH_NODE;\r\n  }\r\n\r\n  if (this._isCompound) {\r\n    var children = this._children[v];\r\n    if (children) {\r\n      return _.keys(children);\r\n    }\r\n  } else if (v === GRAPH_NODE) {\r\n    return this.nodes();\r\n  } else if (this.hasNode(v)) {\r\n    return [];\r\n  }\r\n};\r\n\r\nGraph.prototype.predecessors = function(v) {\r\n  var predsV = this._preds[v];\r\n  if (predsV) {\r\n    return _.keys(predsV);\r\n  }\r\n};\r\n\r\nGraph.prototype.successors = function(v) {\r\n  var sucsV = this._sucs[v];\r\n  if (sucsV) {\r\n    return _.keys(sucsV);\r\n  }\r\n};\r\n\r\nGraph.prototype.neighbors = function(v) {\r\n  var preds = this.predecessors(v);\r\n  if (preds) {\r\n    return _.union(preds, this.successors(v));\r\n  }\r\n};\r\n\r\n/* === Edge functions ========== */\r\n\r\nGraph.prototype.setDefaultEdgeLabel = function(newDefault) {\r\n  if (!_.isFunction(newDefault)) {\r\n    newDefault = _.constant(newDefault);\r\n  }\r\n  this._defaultEdgeLabelFn = newDefault;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.edgeCount = function() {\r\n  return this._edgeCount;\r\n};\r\n\r\nGraph.prototype.edges = function() {\r\n  return _.values(this._edgeObjs);\r\n};\r\n\r\nGraph.prototype.setPath = function(vs, value) {\r\n  var self = this,\r\n      args = arguments;\r\n  _.reduce(vs, function(v, w) {\r\n    if (args.length > 1) {\r\n      self.setEdge(v, w, value);\r\n    } else {\r\n      self.setEdge(v, w);\r\n    }\r\n    return w;\r\n  });\r\n  return this;\r\n};\r\n\r\n/*\r\n * setEdge(v, w, [value, [name]])\r\n * setEdge({ v, w, [name] }, [value])\r\n */\r\nGraph.prototype.setEdge = function() {\r\n  var v, w, name, value,\r\n      valueSpecified = false;\r\n\r\n  if (_.isPlainObject(arguments[0])) {\r\n    v = arguments[0].v;\r\n    w = arguments[0].w;\r\n    name = arguments[0].name;\r\n    if (arguments.length === 2) {\r\n      value = arguments[1];\r\n      valueSpecified = true;\r\n    }\r\n  } else {\r\n    v = arguments[0];\r\n    w = arguments[1];\r\n    name = arguments[3];\r\n    if (arguments.length > 2) {\r\n      value = arguments[2];\r\n      valueSpecified = true;\r\n    }\r\n  }\r\n\r\n  v = \"\" + v;\r\n  w = \"\" + w;\r\n  if (!_.isUndefined(name)) {\r\n    name = \"\" + name;\r\n  }\r\n\r\n  var e = edgeArgsToId(this._isDirected, v, w, name);\r\n  if (_.has(this._edgeLabels, e)) {\r\n    if (valueSpecified) {\r\n      this._edgeLabels[e] = value;\r\n    }\r\n    return this;\r\n  }\r\n\r\n  if (!_.isUndefined(name) && !this._isMultigraph) {\r\n    throw new Error(\"Cannot set a named edge when isMultigraph = false\");\r\n  }\r\n\r\n  // It didn't exist, so we need to create it.\r\n  // First ensure the nodes exist.\r\n  this.setNode(v);\r\n  this.setNode(w);\r\n\r\n  this._edgeLabels[e] = valueSpecified ? value : this._defaultEdgeLabelFn(v, w, name);\r\n\r\n  var edgeObj = edgeArgsToObj(this._isDirected, v, w, name);\r\n  // Ensure we add undirected edges in a consistent way.\r\n  v = edgeObj.v;\r\n  w = edgeObj.w;\r\n\r\n  Object.freeze(edgeObj);\r\n  this._edgeObjs[e] = edgeObj;\r\n  incrementOrInitEntry(this._preds[w], v);\r\n  incrementOrInitEntry(this._sucs[v], w);\r\n  this._in[w][e] = edgeObj;\r\n  this._out[v][e] = edgeObj;\r\n  this._edgeCount++;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.edge = function(v, w, name) {\r\n  var e = (arguments.length === 1\r\n            ? edgeObjToId(this._isDirected, arguments[0])\r\n            : edgeArgsToId(this._isDirected, v, w, name));\r\n  return this._edgeLabels[e];\r\n};\r\n\r\nGraph.prototype.hasEdge = function(v, w, name) {\r\n  var e = (arguments.length === 1\r\n            ? edgeObjToId(this._isDirected, arguments[0])\r\n            : edgeArgsToId(this._isDirected, v, w, name));\r\n  return _.has(this._edgeLabels, e);\r\n};\r\n\r\nGraph.prototype.removeEdge = function(v, w, name) {\r\n  var e = (arguments.length === 1\r\n            ? edgeObjToId(this._isDirected, arguments[0])\r\n            : edgeArgsToId(this._isDirected, v, w, name)),\r\n      edge = this._edgeObjs[e];\r\n  if (edge) {\r\n    v = edge.v;\r\n    w = edge.w;\r\n    delete this._edgeLabels[e];\r\n    delete this._edgeObjs[e];\r\n    decrementOrRemoveEntry(this._preds[w], v);\r\n    decrementOrRemoveEntry(this._sucs[v], w);\r\n    delete this._in[w][e];\r\n    delete this._out[v][e];\r\n    this._edgeCount--;\r\n  }\r\n  return this;\r\n};\r\n\r\nGraph.prototype.inEdges = function(v, u) {\r\n  var inV = this._in[v];\r\n  if (inV) {\r\n    var edges = _.values(inV);\r\n    if (!u) {\r\n      return edges;\r\n    }\r\n    return _.filter(edges, function(edge) { return edge.v === u; });\r\n  }\r\n};\r\n\r\nGraph.prototype.outEdges = function(v, w) {\r\n  var outV = this._out[v];\r\n  if (outV) {\r\n    var edges = _.values(outV);\r\n    if (!w) {\r\n      return edges;\r\n    }\r\n    return _.filter(edges, function(edge) { return edge.w === w; });\r\n  }\r\n};\r\n\r\nGraph.prototype.nodeEdges = function(v, w) {\r\n  var inEdges = this.inEdges(v, w);\r\n  if (inEdges) {\r\n    return inEdges.concat(this.outEdges(v, w));\r\n  }\r\n};\r\n\r\nfunction incrementOrInitEntry(map, k) {\r\n  if (_.has(map, k)) {\r\n    map[k]++;\r\n  } else {\r\n    map[k] = 1;\r\n  }\r\n}\r\n\r\nfunction decrementOrRemoveEntry(map, k) {\r\n  if (!--map[k]) { delete map[k]; }\r\n}\r\n\r\nfunction edgeArgsToId(isDirected, v, w, name) {\r\n  if (!isDirected && v > w) {\r\n    var tmp = v;\r\n    v = w;\r\n    w = tmp;\r\n  }\r\n  return v + EDGE_KEY_DELIM + w + EDGE_KEY_DELIM +\r\n             (_.isUndefined(name) ? DEFAULT_EDGE_NAME : name);\r\n}\r\n\r\nfunction edgeArgsToObj(isDirected, v, w, name) {\r\n  if (!isDirected && v > w) {\r\n    var tmp = v;\r\n    v = w;\r\n    w = tmp;\r\n  }\r\n  var edgeObj =  { v: v, w: w };\r\n  if (name) {\r\n    edgeObj.name = name;\r\n  }\r\n  return edgeObj;\r\n}\r\n\r\nfunction edgeObjToId(isDirected, edgeObj) {\r\n  return edgeArgsToId(isDirected, edgeObj.v, edgeObj.w, edgeObj.name);\r\n}\r\n\r\n},{\"./lodash\":49}],47:[function(require,module,exports){\r\n// Includes only the \"core\" of graphlib\r\nmodule.exports = {\r\n  Graph: require(\"./graph\"),\r\n  version: require(\"./version\")\r\n};\r\n\r\n},{\"./graph\":46,\"./version\":50}],48:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    Graph = require(\"./graph\");\r\n\r\nmodule.exports = {\r\n  write: write,\r\n  read: read\r\n};\r\n\r\nfunction write(g) {\r\n  var json = {\r\n    options: {\r\n      directed: g.isDirected(),\r\n      multigraph: g.isMultigraph(),\r\n      compound: g.isCompound()\r\n    },\r\n    nodes: writeNodes(g),\r\n    edges: writeEdges(g)\r\n  };\r\n  if (!_.isUndefined(g.graph())) {\r\n    json.value = _.clone(g.graph());\r\n  }\r\n  return json;\r\n}\r\n\r\nfunction writeNodes(g) {\r\n  return _.map(g.nodes(), function(v) {\r\n    var nodeValue = g.node(v),\r\n        parent = g.parent(v),\r\n        node = { v: v };\r\n    if (!_.isUndefined(nodeValue)) {\r\n      node.value = nodeValue;\r\n    }\r\n    if (!_.isUndefined(parent)) {\r\n      node.parent = parent;\r\n    }\r\n    return node;\r\n  });\r\n}\r\n\r\nfunction writeEdges(g) {\r\n  return _.map(g.edges(), function(e) {\r\n    var edgeValue = g.edge(e),\r\n        edge = { v: e.v, w: e.w };\r\n    if (!_.isUndefined(e.name)) {\r\n      edge.name = e.name;\r\n    }\r\n    if (!_.isUndefined(edgeValue)) {\r\n      edge.value = edgeValue;\r\n    }\r\n    return edge;\r\n  });\r\n}\r\n\r\nfunction read(json) {\r\n  var g = new Graph(json.options).setGraph(json.value);\r\n  _.each(json.nodes, function(entry) {\r\n    g.setNode(entry.v, entry.value);\r\n    if (entry.parent) {\r\n      g.setParent(entry.v, entry.parent);\r\n    }\r\n  });\r\n  _.each(json.edges, function(entry) {\r\n    g.setEdge({ v: entry.v, w: entry.w, name: entry.name }, entry.value);\r\n  });\r\n  return g;\r\n}\r\n\r\n},{\"./graph\":46,\"./lodash\":49}],49:[function(require,module,exports){\r\nmodule.exports=require(10)\r\n},{\"/Users/cpettitt/projects/dagre/lib/lodash.js\":10,\"lodash\":51}],50:[function(require,module,exports){\r\nmodule.exports = '1.0.1';\r\n\r\n},{}],51:[function(require,module,exports){\r\n(function (global){\r\n/**\r\n * @license\r\n * Lo-Dash 2.4.1 (Custom Build) <http://lodash.com/>\r\n * Build: `lodash modern -o ./dist/lodash.js`\r\n * Copyright 2012-2013 The Dojo Foundation <http://dojofoundation.org/>\r\n * Based on Underscore.js 1.5.2 <http://underscorejs.org/LICENSE>\r\n * Copyright 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\r\n * Available under MIT license <http://lodash.com/license>\r\n */\r\n;(function() {\r\n\r\n  /** Used as a safe reference for `undefined` in pre ES5 environments */\r\n  var undefined;\r\n\r\n  /** Used to pool arrays and objects used internally */\r\n  var arrayPool = [],\r\n      objectPool = [];\r\n\r\n  /** Used to generate unique IDs */\r\n  var idCounter = 0;\r\n\r\n  /** Used to prefix keys to avoid issues with `__proto__` and properties on `Object.prototype` */\r\n  var keyPrefix = +new Date + '';\r\n\r\n  /** Used as the size when optimizations are enabled for large arrays */\r\n  var largeArraySize = 75;\r\n\r\n  /** Used as the max size of the `arrayPool` and `objectPool` */\r\n  var maxPoolSize = 40;\r\n\r\n  /** Used to detect and test whitespace */\r\n  var whitespace = (\r\n    // whitespace\r\n    ' \\t\\x0B\\f\\xA0\\ufeff' +\r\n\r\n    // line terminators\r\n    '\\n\\r\\u2028\\u2029' +\r\n\r\n    // unicode category \"Zs\" space separators\r\n    '\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000'\r\n  );\r\n\r\n  /** Used to match empty string literals in compiled template source */\r\n  var reEmptyStringLeading = /\\b__p \\+= '';/g,\r\n      reEmptyStringMiddle = /\\b(__p \\+=) '' \\+/g,\r\n      reEmptyStringTrailing = /(__e\\(.*?\\)|\\b__t\\)) \\+\\n'';/g;\r\n\r\n  /**\r\n   * Used to match ES6 template delimiters\r\n   * http://people.mozilla.org/~jorendorff/es6-draft.html#sec-literals-string-literals\r\n   */\r\n  var reEsTemplate = /\\$\\{([^\\\\}]*(?:\\\\.[^\\\\}]*)*)\\}/g;\r\n\r\n  /** Used to match regexp flags from their coerced string values */\r\n  var reFlags = /\\w*$/;\r\n\r\n  /** Used to detected named functions */\r\n  var reFuncName = /^\\s*function[ \\n\\r\\t]+\\w/;\r\n\r\n  /** Used to match \"interpolate\" template delimiters */\r\n  var reInterpolate = /<%=([\\s\\S]+?)%>/g;\r\n\r\n  /** Used to match leading whitespace and zeros to be removed */\r\n  var reLeadingSpacesAndZeros = RegExp('^[' + whitespace + ']*0+(?=.$)');\r\n\r\n  /** Used to ensure capturing order of template delimiters */\r\n  var reNoMatch = /($^)/;\r\n\r\n  /** Used to detect functions containing a `this` reference */\r\n  var reThis = /\\bthis\\b/;\r\n\r\n  /** Used to match unescaped characters in compiled string literals */\r\n  var reUnescapedString = /['\\n\\r\\t\\u2028\\u2029\\\\]/g;\r\n\r\n  /** Used to assign default `context` object properties */\r\n  var contextProps = [\r\n    'Array', 'Boolean', 'Date', 'Function', 'Math', 'Number', 'Object',\r\n    'RegExp', 'String', '_', 'attachEvent', 'clearTimeout', 'isFinite', 'isNaN',\r\n    'parseInt', 'setTimeout'\r\n  ];\r\n\r\n  /** Used to make template sourceURLs easier to identify */\r\n  var templateCounter = 0;\r\n\r\n  /** `Object#toString` result shortcuts */\r\n  var argsClass = '[object Arguments]',\r\n      arrayClass = '[object Array]',\r\n      boolClass = '[object Boolean]',\r\n      dateClass = '[object Date]',\r\n      funcClass = '[object Function]',\r\n      numberClass = '[object Number]',\r\n      objectClass = '[object Object]',\r\n      regexpClass = '[object RegExp]',\r\n      stringClass = '[object String]';\r\n\r\n  /** Used to identify object classifications that `_.clone` supports */\r\n  var cloneableClasses = {};\r\n  cloneableClasses[funcClass] = false;\r\n  cloneableClasses[argsClass] = cloneableClasses[arrayClass] =\r\n  cloneableClasses[boolClass] = cloneableClasses[dateClass] =\r\n  cloneableClasses[numberClass] = cloneableClasses[objectClass] =\r\n  cloneableClasses[regexpClass] = cloneableClasses[stringClass] = true;\r\n\r\n  /** Used as an internal `_.debounce` options object */\r\n  var debounceOptions = {\r\n    'leading': false,\r\n    'maxWait': 0,\r\n    'trailing': false\r\n  };\r\n\r\n  /** Used as the property descriptor for `__bindData__` */\r\n  var descriptor = {\r\n    'configurable': false,\r\n    'enumerable': false,\r\n    'value': null,\r\n    'writable': false\r\n  };\r\n\r\n  /** Used to determine if values are of the language type Object */\r\n  var objectTypes = {\r\n    'boolean': false,\r\n    'function': true,\r\n    'object': true,\r\n    'number': false,\r\n    'string': false,\r\n    'undefined': false\r\n  };\r\n\r\n  /** Used to escape characters for inclusion in compiled string literals */\r\n  var stringEscapes = {\r\n    '\\\\': '\\\\',\r\n    \"'\": \"'\",\r\n    '\\n': 'n',\r\n    '\\r': 'r',\r\n    '\\t': 't',\r\n    '\\u2028': 'u2028',\r\n    '\\u2029': 'u2029'\r\n  };\r\n\r\n  /** Used as a reference to the global object */\r\n  var root = (objectTypes[typeof window] && window) || this;\r\n\r\n  /** Detect free variable `exports` */\r\n  var freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports;\r\n\r\n  /** Detect free variable `module` */\r\n  var freeModule = objectTypes[typeof module] && module && !module.nodeType && module;\r\n\r\n  /** Detect the popular CommonJS extension `module.exports` */\r\n  var moduleExports = freeModule && freeModule.exports === freeExports && freeExports;\r\n\r\n  /** Detect free variable `global` from Node.js or Browserified code and use it as `root` */\r\n  var freeGlobal = objectTypes[typeof global] && global;\r\n  if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal)) {\r\n    root = freeGlobal;\r\n  }\r\n\r\n  /*--------------------------------------------------------------------------*/\r\n\r\n  /**\r\n   * The base implementation of `_.indexOf` without support for binary searches\r\n   * or `fromIndex` constraints.\r\n   *\r\n   * @private\r\n   * @param {Array} array The array to search.\r\n   * @param {*} value The value to search for.\r\n   * @param {number} [fromIndex=0] The index to search from.\r\n   * @returns {number} Returns the index of the matched value or `-1`.\r\n   */\r\n  function baseIndexOf(array, value, fromIndex) {\r\n    var index = (fromIndex || 0) - 1,\r\n        length = array ? array.length : 0;\r\n\r\n    while (++index < length) {\r\n      if (array[index] === value) {\r\n        return index;\r\n      }\r\n    }\r\n    return -1;\r\n  }\r\n\r\n  /**\r\n   * An implementation of `_.contains` for cache objects that mimics the return\r\n   * signature of `_.indexOf` by returning `0` if the value is found, else `-1`.\r\n   *\r\n   * @private\r\n   * @param {Object} cache The cache object to inspect.\r\n   * @param {*} value The value to search for.\r\n   * @returns {number} Returns `0` if `value` is found, else `-1`.\r\n   */\r\n  function cacheIndexOf(cache, value) {\r\n    var type = typeof value;\r\n    cache = cache.cache;\r\n\r\n    if (type == 'boolean' || value == null) {\r\n      return cache[value] ? 0 : -1;\r\n    }\r\n    if (type != 'number' && type != 'string') {\r\n      type = 'object';\r\n    }\r\n    var key = type == 'number' ? value : keyPrefix + value;\r\n    cache = (cache = cache[type]) && cache[key];\r\n\r\n    return type == 'object'\r\n      ? (cache && baseIndexOf(cache, value) > -1 ? 0 : -1)\r\n      : (cache ? 0 : -1);\r\n  }\r\n\r\n  /**\r\n   * Adds a given value to the corresponding cache object.\r\n   *\r\n   * @private\r\n   * @param {*} value The value to add to the cache.\r\n   */\r\n  function cachePush(value) {\r\n    var cache = this.cache,\r\n        type = typeof value;\r\n\r\n    if (type == 'boolean' || value == null) {\r\n      cache[value] = true;\r\n    } else {\r\n      if (type != 'number' && type != 'string') {\r\n        type = 'object';\r\n      }\r\n      var key = type == 'number' ? value : keyPrefix + value,\r\n          typeCache = cache[type] || (cache[type] = {});\r\n\r\n      if (type == 'object') {\r\n        (typeCache[key] || (typeCache[key] = [])).push(value);\r\n      } else {\r\n        typeCache[key] = true;\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Used by `_.max` and `_.min` as the default callback when a given\r\n   * collection is a string value.\r\n   *\r\n   * @private\r\n   * @param {string} value The character to inspect.\r\n   * @returns {number} Returns the code unit of given character.\r\n   */\r\n  function charAtCallback(value) {\r\n    return value.charCodeAt(0);\r\n  }\r\n\r\n  /**\r\n   * Used by `sortBy` to compare transformed `collection` elements, stable sorting\r\n   * them in ascending order.\r\n   *\r\n   * @private\r\n   * @param {Object} a The object to compare to `b`.\r\n   * @param {Object} b The object to compare to `a`.\r\n   * @returns {number} Returns the sort order indicator of `1` or `-1`.\r\n   */\r\n  function compareAscending(a, b) {\r\n    var ac = a.criteria,\r\n        bc = b.criteria,\r\n        index = -1,\r\n        length = ac.length;\r\n\r\n    while (++index < length) {\r\n      var value = ac[index],\r\n          other = bc[index];\r\n\r\n      if (value !== other) {\r\n        if (value > other || typeof value == 'undefined') {\r\n          return 1;\r\n        }\r\n        if (value < other || typeof other == 'undefined') {\r\n          return -1;\r\n        }\r\n      }\r\n    }\r\n    // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications\r\n    // that causes it, under certain circumstances, to return the same value for\r\n    // `a` and `b`. See https://github.com/jashkenas/underscore/pull/1247\r\n    //\r\n    // This also ensures a stable sort in V8 and other engines.\r\n    // See http://code.google.com/p/v8/issues/detail?id=90\r\n    return a.index - b.index;\r\n  }\r\n\r\n  /**\r\n   * Creates a cache object to optimize linear searches of large arrays.\r\n   *\r\n   * @private\r\n   * @param {Array} [array=[]] The array to search.\r\n   * @returns {null|Object} Returns the cache object or `null` if caching should not be used.\r\n   */\r\n  function createCache(array) {\r\n    var index = -1,\r\n        length = array.length,\r\n        first = array[0],\r\n        mid = array[(length / 2) | 0],\r\n        last = array[length - 1];\r\n\r\n    if (first && typeof first == 'object' &&\r\n        mid && typeof mid == 'object' && last && typeof last == 'object') {\r\n      return false;\r\n    }\r\n    var cache = getObject();\r\n    cache['false'] = cache['null'] = cache['true'] = cache['undefined'] = false;\r\n\r\n    var result = getObject();\r\n    result.array = array;\r\n    result.cache = cache;\r\n    result.push = cachePush;\r\n\r\n    while (++index < length) {\r\n      result.push(array[index]);\r\n    }\r\n    return result;\r\n  }\r\n\r\n  /**\r\n   * Used by `template` to escape characters for inclusion in compiled\r\n   * string literals.\r\n   *\r\n   * @private\r\n   * @param {string} match The matched character to escape.\r\n   * @returns {string} Returns the escaped character.\r\n   */\r\n  function escapeStringChar(match) {\r\n    return '\\\\' + stringEscapes[match];\r\n  }\r\n\r\n  /**\r\n   * Gets an array from the array pool or creates a new one if the pool is empty.\r\n   *\r\n   * @private\r\n   * @returns {Array} The array from the pool.\r\n   */\r\n  function getArray() {\r\n    return arrayPool.pop() || [];\r\n  }\r\n\r\n  /**\r\n   * Gets an object from the object pool or creates a new one if the pool is empty.\r\n   *\r\n   * @private\r\n   * @returns {Object} The object from the pool.\r\n   */\r\n  function getObject() {\r\n    return objectPool.pop() || {\r\n      'array': null,\r\n      'cache': null,\r\n      'criteria': null,\r\n      'false': false,\r\n      'index': 0,\r\n      'null': false,\r\n      'number': null,\r\n      'object': null,\r\n      'push': null,\r\n      'string': null,\r\n      'true': false,\r\n      'undefined': false,\r\n      'value': null\r\n    };\r\n  }\r\n\r\n  /**\r\n   * Releases the given array back to the array pool.\r\n   *\r\n   * @private\r\n   * @param {Array} [array] The array to release.\r\n   */\r\n  function releaseArray(array) {\r\n    array.length = 0;\r\n    if (arrayPool.length < maxPoolSize) {\r\n      arrayPool.push(array);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Releases the given object back to the object pool.\r\n   *\r\n   * @private\r\n   * @param {Object} [object] The object to release.\r\n   */\r\n  function releaseObject(object) {\r\n    var cache = object.cache;\r\n    if (cache) {\r\n      releaseObject(cache);\r\n    }\r\n    object.array = object.cache = object.criteria = object.object = object.number = object.string = object.value = null;\r\n    if (objectPool.length < maxPoolSize) {\r\n      objectPool.push(object);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Slices the `collection` from the `start` index up to, but not including,\r\n   * the `end` index.\r\n   *\r\n   * Note: This function is used instead of `Array#slice` to support node lists\r\n   * in IE < 9 and to ensure dense arrays are returned.\r\n   *\r\n   * @private\r\n   * @param {Array|Object|string} collection The collection to slice.\r\n   * @param {number} start The start index.\r\n   * @param {number} end The end index.\r\n   * @returns {Array} Returns the new array.\r\n   */\r\n  function slice(array, start, end) {\r\n    start || (start = 0);\r\n    if (typeof end == 'undefined') {\r\n      end = array ? array.length : 0;\r\n    }\r\n    var index = -1,\r\n        length = end - start || 0,\r\n        result = Array(length < 0 ? 0 : length);\r\n\r\n    while (++index < length) {\r\n      result[index] = array[start + index];\r\n    }\r\n    return result;\r\n  }\r\n\r\n  /*--------------------------------------------------------------------------*/\r\n\r\n  /**\r\n   * Create a new `lodash` function using the given context object.\r\n   *\r\n   * @static\r\n   * @memberOf _\r\n   * @category Utilities\r\n   * @param {Object} [context=root] The context object.\r\n   * @returns {Function} Returns the `lodash` function.\r\n   */\r\n  function runInContext(context) {\r\n    // Avoid issues with some ES3 environments that attempt to use values, named\r\n    // after built-in constructors like `Object`, for the creation of literals.\r\n    // ES5 clears this up by stating that literals must use built-in constructors.\r\n    // See http://es5.github.io/#x11.1.5.\r\n    context = context ? _.defaults(root.Object(), context, _.pick(root, contextProps)) : root;\r\n\r\n    /** Native constructor references */\r\n    var Array = context.Array,\r\n        Boolean = context.Boolean,\r\n        Date = context.Date,\r\n        Function = context.Function,\r\n        Math = context.Math,\r\n        Number = context.Number,\r\n        Object = context.Object,\r\n        RegExp = context.RegExp,\r\n        String = context.String,\r\n        TypeError = context.TypeError;\r\n\r\n    /**\r\n     * Used for `Array` method references.\r\n     *\r\n     * Normally `Array.prototype` would suffice, however, using an array literal\r\n     * avoids issues in Narwhal.\r\n     */\r\n    var arrayRef = [];\r\n\r\n    /** Used for native method references */\r\n    var objectProto = Object.prototype;\r\n\r\n    /** Used to restore the original `_` reference in `noConflict` */\r\n    var oldDash = context._;\r\n\r\n    /** Used to resolve the internal [[Class]] of values */\r\n    var toString = objectProto.toString;\r\n\r\n    /** Used to detect if a method is native */\r\n    var reNative = RegExp('^' +\r\n      String(toString)\r\n        .replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\r\n        .replace(/toString| for [^\\]]+/g, '.*?') + '$'\r\n    );\r\n\r\n    /** Native method shortcuts */\r\n    var ceil = Math.ceil,\r\n        clearTimeout = context.clearTimeout,\r\n        floor = Math.floor,\r\n        fnToString = Function.prototype.toString,\r\n        getPrototypeOf = isNative(getPrototypeOf = Object.getPrototypeOf) && getPrototypeOf,\r\n        hasOwnProperty = objectProto.hasOwnProperty,\r\n        push = arrayRef.push,\r\n        setTimeout = context.setTimeout,\r\n        splice = arrayRef.splice,\r\n        unshift = arrayRef.unshift;\r\n\r\n    /** Used to set meta data on functions */\r\n    var defineProperty = (function() {\r\n      // IE 8 only accepts DOM elements\r\n      try {\r\n        var o = {},\r\n            func = isNative(func = Object.defineProperty) && func,\r\n            result = func(o, o, o) && func;\r\n      } catch(e) { }\r\n      return result;\r\n    }());\r\n\r\n    /* Native method shortcuts for methods with the same name as other `lodash` methods */\r\n    var nativeCreate = isNative(nativeCreate = Object.create) && nativeCreate,\r\n        nativeIsArray = isNative(nativeIsArray = Array.isArray) && nativeIsArray,\r\n        nativeIsFinite = context.isFinite,\r\n        nativeIsNaN = context.isNaN,\r\n        nativeKeys = isNative(nativeKeys = Object.keys) && nativeKeys,\r\n        nativeMax = Math.max,\r\n        nativeMin = Math.min,\r\n        nativeParseInt = context.parseInt,\r\n        nativeRandom = Math.random;\r\n\r\n    /** Used to lookup a built-in constructor by [[Class]] */\r\n    var ctorByClass = {};\r\n    ctorByClass[arrayClass] = Array;\r\n    ctorByClass[boolClass] = Boolean;\r\n    ctorByClass[dateClass] = Date;\r\n    ctorByClass[funcClass] = Function;\r\n    ctorByClass[objectClass] = Object;\r\n    ctorByClass[numberClass] = Number;\r\n    ctorByClass[regexpClass] = RegExp;\r\n    ctorByClass[stringClass] = String;\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates a `lodash` object which wraps the given value to enable intuitive\r\n     * method chaining.\r\n     *\r\n     * In addition to Lo-Dash methods, wrappers also have the following `Array` methods:\r\n     * `concat`, `join`, `pop`, `push`, `reverse`, `shift`, `slice`, `sort`, `splice`,\r\n     * and `unshift`\r\n     *\r\n     * Chaining is supported in custom builds as long as the `value` method is\r\n     * implicitly or explicitly included in the build.\r\n     *\r\n     * The chainable wrapper functions are:\r\n     * `after`, `assign`, `bind`, `bindAll`, `bindKey`, `chain`, `compact`,\r\n     * `compose`, `concat`, `countBy`, `create`, `createCallback`, `curry`,\r\n     * `debounce`, `defaults`, `defer`, `delay`, `difference`, `filter`, `flatten`,\r\n     * `forEach`, `forEachRight`, `forIn`, `forInRight`, `forOwn`, `forOwnRight`,\r\n     * `functions`, `groupBy`, `indexBy`, `initial`, `intersection`, `invert`,\r\n     * `invoke`, `keys`, `map`, `max`, `memoize`, `merge`, `min`, `object`, `omit`,\r\n     * `once`, `pairs`, `partial`, `partialRight`, `pick`, `pluck`, `pull`, `push`,\r\n     * `range`, `reject`, `remove`, `rest`, `reverse`, `shuffle`, `slice`, `sort`,\r\n     * `sortBy`, `splice`, `tap`, `throttle`, `times`, `toArray`, `transform`,\r\n     * `union`, `uniq`, `unshift`, `unzip`, `values`, `where`, `without`, `wrap`,\r\n     * and `zip`\r\n     *\r\n     * The non-chainable wrapper functions are:\r\n     * `clone`, `cloneDeep`, `contains`, `escape`, `every`, `find`, `findIndex`,\r\n     * `findKey`, `findLast`, `findLastIndex`, `findLastKey`, `has`, `identity`,\r\n     * `indexOf`, `isArguments`, `isArray`, `isBoolean`, `isDate`, `isElement`,\r\n     * `isEmpty`, `isEqual`, `isFinite`, `isFunction`, `isNaN`, `isNull`, `isNumber`,\r\n     * `isObject`, `isPlainObject`, `isRegExp`, `isString`, `isUndefined`, `join`,\r\n     * `lastIndexOf`, `mixin`, `noConflict`, `parseInt`, `pop`, `random`, `reduce`,\r\n     * `reduceRight`, `result`, `shift`, `size`, `some`, `sortedIndex`, `runInContext`,\r\n     * `template`, `unescape`, `uniqueId`, and `value`\r\n     *\r\n     * The wrapper functions `first` and `last` return wrapped values when `n` is\r\n     * provided, otherwise they return unwrapped values.\r\n     *\r\n     * Explicit chaining can be enabled by using the `_.chain` method.\r\n     *\r\n     * @name _\r\n     * @constructor\r\n     * @category Chaining\r\n     * @param {*} value The value to wrap in a `lodash` instance.\r\n     * @returns {Object} Returns a `lodash` instance.\r\n     * @example\r\n     *\r\n     * var wrapped = _([1, 2, 3]);\r\n     *\r\n     * // returns an unwrapped value\r\n     * wrapped.reduce(function(sum, num) {\r\n     *   return sum + num;\r\n     * });\r\n     * // => 6\r\n     *\r\n     * // returns a wrapped value\r\n     * var squares = wrapped.map(function(num) {\r\n     *   return num * num;\r\n     * });\r\n     *\r\n     * _.isArray(squares);\r\n     * // => false\r\n     *\r\n     * _.isArray(squares.value());\r\n     * // => true\r\n     */\r\n    function lodash(value) {\r\n      // don't wrap if already wrapped, even if wrapped by a different `lodash` constructor\r\n      return (value && typeof value == 'object' && !isArray(value) && hasOwnProperty.call(value, '__wrapped__'))\r\n       ? value\r\n       : new lodashWrapper(value);\r\n    }\r\n\r\n    /**\r\n     * A fast path for creating `lodash` wrapper objects.\r\n     *\r\n     * @private\r\n     * @param {*} value The value to wrap in a `lodash` instance.\r\n     * @param {boolean} chainAll A flag to enable chaining for all methods\r\n     * @returns {Object} Returns a `lodash` instance.\r\n     */\r\n    function lodashWrapper(value, chainAll) {\r\n      this.__chain__ = !!chainAll;\r\n      this.__wrapped__ = value;\r\n    }\r\n    // ensure `new lodashWrapper` is an instance of `lodash`\r\n    lodashWrapper.prototype = lodash.prototype;\r\n\r\n    /**\r\n     * An object used to flag environments features.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Object\r\n     */\r\n    var support = lodash.support = {};\r\n\r\n    /**\r\n     * Detect if functions can be decompiled by `Function#toString`\r\n     * (all but PS3 and older Opera mobile browsers & avoided in Windows 8 apps).\r\n     *\r\n     * @memberOf _.support\r\n     * @type boolean\r\n     */\r\n    support.funcDecomp = !isNative(context.WinRTError) && reThis.test(runInContext);\r\n\r\n    /**\r\n     * Detect if `Function#name` is supported (all but IE).\r\n     *\r\n     * @memberOf _.support\r\n     * @type boolean\r\n     */\r\n    support.funcNames = typeof Function.name == 'string';\r\n\r\n    /**\r\n     * By default, the template delimiters used by Lo-Dash are similar to those in\r\n     * embedded Ruby (ERB). Change the following template settings to use alternative\r\n     * delimiters.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Object\r\n     */\r\n    lodash.templateSettings = {\r\n\r\n      /**\r\n       * Used to detect `data` property values to be HTML-escaped.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type RegExp\r\n       */\r\n      'escape': /<%-([\\s\\S]+?)%>/g,\r\n\r\n      /**\r\n       * Used to detect code to be evaluated.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type RegExp\r\n       */\r\n      'evaluate': /<%([\\s\\S]+?)%>/g,\r\n\r\n      /**\r\n       * Used to detect `data` property values to inject.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type RegExp\r\n       */\r\n      'interpolate': reInterpolate,\r\n\r\n      /**\r\n       * Used to reference the data object in the template text.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type string\r\n       */\r\n      'variable': '',\r\n\r\n      /**\r\n       * Used to import variables into the compiled template.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type Object\r\n       */\r\n      'imports': {\r\n\r\n        /**\r\n         * A reference to the `lodash` function.\r\n         *\r\n         * @memberOf _.templateSettings.imports\r\n         * @type Function\r\n         */\r\n        '_': lodash\r\n      }\r\n    };\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * The base implementation of `_.bind` that creates the bound function and\r\n     * sets its meta data.\r\n     *\r\n     * @private\r\n     * @param {Array} bindData The bind data array.\r\n     * @returns {Function} Returns the new bound function.\r\n     */\r\n    function baseBind(bindData) {\r\n      var func = bindData[0],\r\n          partialArgs = bindData[2],\r\n          thisArg = bindData[4];\r\n\r\n      function bound() {\r\n        // `Function#bind` spec\r\n        // http://es5.github.io/#x15.3.4.5\r\n        if (partialArgs) {\r\n          // avoid `arguments` object deoptimizations by using `slice` instead\r\n          // of `Array.prototype.slice.call` and not assigning `arguments` to a\r\n          // variable as a ternary expression\r\n          var args = slice(partialArgs);\r\n          push.apply(args, arguments);\r\n        }\r\n        // mimic the constructor's `return` behavior\r\n        // http://es5.github.io/#x13.2.2\r\n        if (this instanceof bound) {\r\n          // ensure `new bound` is an instance of `func`\r\n          var thisBinding = baseCreate(func.prototype),\r\n              result = func.apply(thisBinding, args || arguments);\r\n          return isObject(result) ? result : thisBinding;\r\n        }\r\n        return func.apply(thisArg, args || arguments);\r\n      }\r\n      setBindData(bound, bindData);\r\n      return bound;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.clone` without argument juggling or support\r\n     * for `thisArg` binding.\r\n     *\r\n     * @private\r\n     * @param {*} value The value to clone.\r\n     * @param {boolean} [isDeep=false] Specify a deep clone.\r\n     * @param {Function} [callback] The function to customize cloning values.\r\n     * @param {Array} [stackA=[]] Tracks traversed source objects.\r\n     * @param {Array} [stackB=[]] Associates clones with source counterparts.\r\n     * @returns {*} Returns the cloned value.\r\n     */\r\n    function baseClone(value, isDeep, callback, stackA, stackB) {\r\n      if (callback) {\r\n        var result = callback(value);\r\n        if (typeof result != 'undefined') {\r\n          return result;\r\n        }\r\n      }\r\n      // inspect [[Class]]\r\n      var isObj = isObject(value);\r\n      if (isObj) {\r\n        var className = toString.call(value);\r\n        if (!cloneableClasses[className]) {\r\n          return value;\r\n        }\r\n        var ctor = ctorByClass[className];\r\n        switch (className) {\r\n          case boolClass:\r\n          case dateClass:\r\n            return new ctor(+value);\r\n\r\n          case numberClass:\r\n          case stringClass:\r\n            return new ctor(value);\r\n\r\n          case regexpClass:\r\n            result = ctor(value.source, reFlags.exec(value));\r\n            result.lastIndex = value.lastIndex;\r\n            return result;\r\n        }\r\n      } else {\r\n        return value;\r\n      }\r\n      var isArr = isArray(value);\r\n      if (isDeep) {\r\n        // check for circular references and return corresponding clone\r\n        var initedStack = !stackA;\r\n        stackA || (stackA = getArray());\r\n        stackB || (stackB = getArray());\r\n\r\n        var length = stackA.length;\r\n        while (length--) {\r\n          if (stackA[length] == value) {\r\n            return stackB[length];\r\n          }\r\n        }\r\n        result = isArr ? ctor(value.length) : {};\r\n      }\r\n      else {\r\n        result = isArr ? slice(value) : assign({}, value);\r\n      }\r\n      // add array properties assigned by `RegExp#exec`\r\n      if (isArr) {\r\n        if (hasOwnProperty.call(value, 'index')) {\r\n          result.index = value.index;\r\n        }\r\n        if (hasOwnProperty.call(value, 'input')) {\r\n          result.input = value.input;\r\n        }\r\n      }\r\n      // exit for shallow clone\r\n      if (!isDeep) {\r\n        return result;\r\n      }\r\n      // add the source value to the stack of traversed objects\r\n      // and associate it with its clone\r\n      stackA.push(value);\r\n      stackB.push(result);\r\n\r\n      // recursively populate clone (susceptible to call stack limits)\r\n      (isArr ? forEach : forOwn)(value, function(objValue, key) {\r\n        result[key] = baseClone(objValue, isDeep, callback, stackA, stackB);\r\n      });\r\n\r\n      if (initedStack) {\r\n        releaseArray(stackA);\r\n        releaseArray(stackB);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.create` without support for assigning\r\n     * properties to the created object.\r\n     *\r\n     * @private\r\n     * @param {Object} prototype The object to inherit from.\r\n     * @returns {Object} Returns the new object.\r\n     */\r\n    function baseCreate(prototype, properties) {\r\n      return isObject(prototype) ? nativeCreate(prototype) : {};\r\n    }\r\n    // fallback for browsers without `Object.create`\r\n    if (!nativeCreate) {\r\n      baseCreate = (function() {\r\n        function Object() {}\r\n        return function(prototype) {\r\n          if (isObject(prototype)) {\r\n            Object.prototype = prototype;\r\n            var result = new Object;\r\n            Object.prototype = null;\r\n          }\r\n          return result || context.Object();\r\n        };\r\n      }());\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.createCallback` without support for creating\r\n     * \"_.pluck\" or \"_.where\" style callbacks.\r\n     *\r\n     * @private\r\n     * @param {*} [func=identity] The value to convert to a callback.\r\n     * @param {*} [thisArg] The `this` binding of the created callback.\r\n     * @param {number} [argCount] The number of arguments the callback accepts.\r\n     * @returns {Function} Returns a callback function.\r\n     */\r\n    function baseCreateCallback(func, thisArg, argCount) {\r\n      if (typeof func != 'function') {\r\n        return identity;\r\n      }\r\n      // exit early for no `thisArg` or already bound by `Function#bind`\r\n      if (typeof thisArg == 'undefined' || !('prototype' in func)) {\r\n        return func;\r\n      }\r\n      var bindData = func.__bindData__;\r\n      if (typeof bindData == 'undefined') {\r\n        if (support.funcNames) {\r\n          bindData = !func.name;\r\n        }\r\n        bindData = bindData || !support.funcDecomp;\r\n        if (!bindData) {\r\n          var source = fnToString.call(func);\r\n          if (!support.funcNames) {\r\n            bindData = !reFuncName.test(source);\r\n          }\r\n          if (!bindData) {\r\n            // checks if `func` references the `this` keyword and stores the result\r\n            bindData = reThis.test(source);\r\n            setBindData(func, bindData);\r\n          }\r\n        }\r\n      }\r\n      // exit early if there are no `this` references or `func` is bound\r\n      if (bindData === false || (bindData !== true && bindData[1] & 1)) {\r\n        return func;\r\n      }\r\n      switch (argCount) {\r\n        case 1: return function(value) {\r\n          return func.call(thisArg, value);\r\n        };\r\n        case 2: return function(a, b) {\r\n          return func.call(thisArg, a, b);\r\n        };\r\n        case 3: return function(value, index, collection) {\r\n          return func.call(thisArg, value, index, collection);\r\n        };\r\n        case 4: return function(accumulator, value, index, collection) {\r\n          return func.call(thisArg, accumulator, value, index, collection);\r\n        };\r\n      }\r\n      return bind(func, thisArg);\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `createWrapper` that creates the wrapper and\r\n     * sets its meta data.\r\n     *\r\n     * @private\r\n     * @param {Array} bindData The bind data array.\r\n     * @returns {Function} Returns the new function.\r\n     */\r\n    function baseCreateWrapper(bindData) {\r\n      var func = bindData[0],\r\n          bitmask = bindData[1],\r\n          partialArgs = bindData[2],\r\n          partialRightArgs = bindData[3],\r\n          thisArg = bindData[4],\r\n          arity = bindData[5];\r\n\r\n      var isBind = bitmask & 1,\r\n          isBindKey = bitmask & 2,\r\n          isCurry = bitmask & 4,\r\n          isCurryBound = bitmask & 8,\r\n          key = func;\r\n\r\n      function bound() {\r\n        var thisBinding = isBind ? thisArg : this;\r\n        if (partialArgs) {\r\n          var args = slice(partialArgs);\r\n          push.apply(args, arguments);\r\n        }\r\n        if (partialRightArgs || isCurry) {\r\n          args || (args = slice(arguments));\r\n          if (partialRightArgs) {\r\n            push.apply(args, partialRightArgs);\r\n          }\r\n          if (isCurry && args.length < arity) {\r\n            bitmask |= 16 & ~32;\r\n            return baseCreateWrapper([func, (isCurryBound ? bitmask : bitmask & ~3), args, null, thisArg, arity]);\r\n          }\r\n        }\r\n        args || (args = arguments);\r\n        if (isBindKey) {\r\n          func = thisBinding[key];\r\n        }\r\n        if (this instanceof bound) {\r\n          thisBinding = baseCreate(func.prototype);\r\n          var result = func.apply(thisBinding, args);\r\n          return isObject(result) ? result : thisBinding;\r\n        }\r\n        return func.apply(thisBinding, args);\r\n      }\r\n      setBindData(bound, bindData);\r\n      return bound;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.difference` that accepts a single array\r\n     * of values to exclude.\r\n     *\r\n     * @private\r\n     * @param {Array} array The array to process.\r\n     * @param {Array} [values] The array of values to exclude.\r\n     * @returns {Array} Returns a new array of filtered values.\r\n     */\r\n    function baseDifference(array, values) {\r\n      var index = -1,\r\n          indexOf = getIndexOf(),\r\n          length = array ? array.length : 0,\r\n          isLarge = length >= largeArraySize && indexOf === baseIndexOf,\r\n          result = [];\r\n\r\n      if (isLarge) {\r\n        var cache = createCache(values);\r\n        if (cache) {\r\n          indexOf = cacheIndexOf;\r\n          values = cache;\r\n        } else {\r\n          isLarge = false;\r\n        }\r\n      }\r\n      while (++index < length) {\r\n        var value = array[index];\r\n        if (indexOf(values, value) < 0) {\r\n          result.push(value);\r\n        }\r\n      }\r\n      if (isLarge) {\r\n        releaseObject(values);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.flatten` without support for callback\r\n     * shorthands or `thisArg` binding.\r\n     *\r\n     * @private\r\n     * @param {Array} array The array to flatten.\r\n     * @param {boolean} [isShallow=false] A flag to restrict flattening to a single level.\r\n     * @param {boolean} [isStrict=false] A flag to restrict flattening to arrays and `arguments` objects.\r\n     * @param {number} [fromIndex=0] The index to start from.\r\n     * @returns {Array} Returns a new flattened array.\r\n     */\r\n    function baseFlatten(array, isShallow, isStrict, fromIndex) {\r\n      var index = (fromIndex || 0) - 1,\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      while (++index < length) {\r\n        var value = array[index];\r\n\r\n        if (value && typeof value == 'object' && typeof value.length == 'number'\r\n            && (isArray(value) || isArguments(value))) {\r\n          // recursively flatten arrays (susceptible to call stack limits)\r\n          if (!isShallow) {\r\n            value = baseFlatten(value, isShallow, isStrict);\r\n          }\r\n          var valIndex = -1,\r\n              valLength = value.length,\r\n              resIndex = result.length;\r\n\r\n          result.length += valLength;\r\n          while (++valIndex < valLength) {\r\n            result[resIndex++] = value[valIndex];\r\n          }\r\n        } else if (!isStrict) {\r\n          result.push(value);\r\n        }\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.isEqual`, without support for `thisArg` binding,\r\n     * that allows partial \"_.where\" style comparisons.\r\n     *\r\n     * @private\r\n     * @param {*} a The value to compare.\r\n     * @param {*} b The other value to compare.\r\n     * @param {Function} [callback] The function to customize comparing values.\r\n     * @param {Function} [isWhere=false] A flag to indicate performing partial comparisons.\r\n     * @param {Array} [stackA=[]] Tracks traversed `a` objects.\r\n     * @param {Array} [stackB=[]] Tracks traversed `b` objects.\r\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\r\n     */\r\n    function baseIsEqual(a, b, callback, isWhere, stackA, stackB) {\r\n      // used to indicate that when comparing objects, `a` has at least the properties of `b`\r\n      if (callback) {\r\n        var result = callback(a, b);\r\n        if (typeof result != 'undefined') {\r\n          return !!result;\r\n        }\r\n      }\r\n      // exit early for identical values\r\n      if (a === b) {\r\n        // treat `+0` vs. `-0` as not equal\r\n        return a !== 0 || (1 / a == 1 / b);\r\n      }\r\n      var type = typeof a,\r\n          otherType = typeof b;\r\n\r\n      // exit early for unlike primitive values\r\n      if (a === a &&\r\n          !(a && objectTypes[type]) &&\r\n          !(b && objectTypes[otherType])) {\r\n        return false;\r\n      }\r\n      // exit early for `null` and `undefined` avoiding ES3's Function#call behavior\r\n      // http://es5.github.io/#x15.3.4.4\r\n      if (a == null || b == null) {\r\n        return a === b;\r\n      }\r\n      // compare [[Class]] names\r\n      var className = toString.call(a),\r\n          otherClass = toString.call(b);\r\n\r\n      if (className == argsClass) {\r\n        className = objectClass;\r\n      }\r\n      if (otherClass == argsClass) {\r\n        otherClass = objectClass;\r\n      }\r\n      if (className != otherClass) {\r\n        return false;\r\n      }\r\n      switch (className) {\r\n        case boolClass:\r\n        case dateClass:\r\n          // coerce dates and booleans to numbers, dates to milliseconds and booleans\r\n          // to `1` or `0` treating invalid dates coerced to `NaN` as not equal\r\n          return +a == +b;\r\n\r\n        case numberClass:\r\n          // treat `NaN` vs. `NaN` as equal\r\n          return (a != +a)\r\n            ? b != +b\r\n            // but treat `+0` vs. `-0` as not equal\r\n            : (a == 0 ? (1 / a == 1 / b) : a == +b);\r\n\r\n        case regexpClass:\r\n        case stringClass:\r\n          // coerce regexes to strings (http://es5.github.io/#x15.10.6.4)\r\n          // treat string primitives and their corresponding object instances as equal\r\n          return a == String(b);\r\n      }\r\n      var isArr = className == arrayClass;\r\n      if (!isArr) {\r\n        // unwrap any `lodash` wrapped values\r\n        var aWrapped = hasOwnProperty.call(a, '__wrapped__'),\r\n            bWrapped = hasOwnProperty.call(b, '__wrapped__');\r\n\r\n        if (aWrapped || bWrapped) {\r\n          return baseIsEqual(aWrapped ? a.__wrapped__ : a, bWrapped ? b.__wrapped__ : b, callback, isWhere, stackA, stackB);\r\n        }\r\n        // exit for functions and DOM nodes\r\n        if (className != objectClass) {\r\n          return false;\r\n        }\r\n        // in older versions of Opera, `arguments` objects have `Array` constructors\r\n        var ctorA = a.constructor,\r\n            ctorB = b.constructor;\r\n\r\n        // non `Object` object instances with different constructors are not equal\r\n        if (ctorA != ctorB &&\r\n              !(isFunction(ctorA) && ctorA instanceof ctorA && isFunction(ctorB) && ctorB instanceof ctorB) &&\r\n              ('constructor' in a && 'constructor' in b)\r\n            ) {\r\n          return false;\r\n        }\r\n      }\r\n      // assume cyclic structures are equal\r\n      // the algorithm for detecting cyclic structures is adapted from ES 5.1\r\n      // section 15.12.3, abstract operation `JO` (http://es5.github.io/#x15.12.3)\r\n      var initedStack = !stackA;\r\n      stackA || (stackA = getArray());\r\n      stackB || (stackB = getArray());\r\n\r\n      var length = stackA.length;\r\n      while (length--) {\r\n        if (stackA[length] == a) {\r\n          return stackB[length] == b;\r\n        }\r\n      }\r\n      var size = 0;\r\n      result = true;\r\n\r\n      // add `a` and `b` to the stack of traversed objects\r\n      stackA.push(a);\r\n      stackB.push(b);\r\n\r\n      // recursively compare objects and arrays (susceptible to call stack limits)\r\n      if (isArr) {\r\n        // compare lengths to determine if a deep comparison is necessary\r\n        length = a.length;\r\n        size = b.length;\r\n        result = size == length;\r\n\r\n        if (result || isWhere) {\r\n          // deep compare the contents, ignoring non-numeric properties\r\n          while (size--) {\r\n            var index = length,\r\n                value = b[size];\r\n\r\n            if (isWhere) {\r\n              while (index--) {\r\n                if ((result = baseIsEqual(a[index], value, callback, isWhere, stackA, stackB))) {\r\n                  break;\r\n                }\r\n              }\r\n            } else if (!(result = baseIsEqual(a[size], value, callback, isWhere, stackA, stackB))) {\r\n              break;\r\n            }\r\n          }\r\n        }\r\n      }\r\n      else {\r\n        // deep compare objects using `forIn`, instead of `forOwn`, to avoid `Object.keys`\r\n        // which, in this case, is more costly\r\n        forIn(b, function(value, key, b) {\r\n          if (hasOwnProperty.call(b, key)) {\r\n            // count the number of properties.\r\n            size++;\r\n            // deep compare each property value.\r\n            return (result = hasOwnProperty.call(a, key) && baseIsEqual(a[key], value, callback, isWhere, stackA, stackB));\r\n          }\r\n        });\r\n\r\n        if (result && !isWhere) {\r\n          // ensure both objects have the same number of properties\r\n          forIn(a, function(value, key, a) {\r\n            if (hasOwnProperty.call(a, key)) {\r\n              // `size` will be `-1` if `a` has more properties than `b`\r\n              return (result = --size > -1);\r\n            }\r\n          });\r\n        }\r\n      }\r\n      stackA.pop();\r\n      stackB.pop();\r\n\r\n      if (initedStack) {\r\n        releaseArray(stackA);\r\n        releaseArray(stackB);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.merge` without argument juggling or support\r\n     * for `thisArg` binding.\r\n     *\r\n     * @private\r\n     * @param {Object} object The destination object.\r\n     * @param {Object} source The source object.\r\n     * @param {Function} [callback] The function to customize merging properties.\r\n     * @param {Array} [stackA=[]] Tracks traversed source objects.\r\n     * @param {Array} [stackB=[]] Associates values with source counterparts.\r\n     */\r\n    function baseMerge(object, source, callback, stackA, stackB) {\r\n      (isArray(source) ? forEach : forOwn)(source, function(source, key) {\r\n        var found,\r\n            isArr,\r\n            result = source,\r\n            value = object[key];\r\n\r\n        if (source && ((isArr = isArray(source)) || isPlainObject(source))) {\r\n          // avoid merging previously merged cyclic sources\r\n          var stackLength = stackA.length;\r\n          while (stackLength--) {\r\n            if ((found = stackA[stackLength] == source)) {\r\n              value = stackB[stackLength];\r\n              break;\r\n            }\r\n          }\r\n          if (!found) {\r\n            var isShallow;\r\n            if (callback) {\r\n              result = callback(value, source);\r\n              if ((isShallow = typeof result != 'undefined')) {\r\n                value = result;\r\n              }\r\n            }\r\n            if (!isShallow) {\r\n              value = isArr\r\n                ? (isArray(value) ? value : [])\r\n                : (isPlainObject(value) ? value : {});\r\n            }\r\n            // add `source` and associated `value` to the stack of traversed objects\r\n            stackA.push(source);\r\n            stackB.push(value);\r\n\r\n            // recursively merge objects and arrays (susceptible to call stack limits)\r\n            if (!isShallow) {\r\n              baseMerge(value, source, callback, stackA, stackB);\r\n            }\r\n          }\r\n        }\r\n        else {\r\n          if (callback) {\r\n            result = callback(value, source);\r\n            if (typeof result == 'undefined') {\r\n              result = source;\r\n            }\r\n          }\r\n          if (typeof result != 'undefined') {\r\n            value = result;\r\n          }\r\n        }\r\n        object[key] = value;\r\n      });\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.random` without argument juggling or support\r\n     * for returning floating-point numbers.\r\n     *\r\n     * @private\r\n     * @param {number} min The minimum possible value.\r\n     * @param {number} max The maximum possible value.\r\n     * @returns {number} Returns a random number.\r\n     */\r\n    function baseRandom(min, max) {\r\n      return min + floor(nativeRandom() * (max - min + 1));\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.uniq` without support for callback shorthands\r\n     * or `thisArg` binding.\r\n     *\r\n     * @private\r\n     * @param {Array} array The array to process.\r\n     * @param {boolean} [isSorted=false] A flag to indicate that `array` is sorted.\r\n     * @param {Function} [callback] The function called per iteration.\r\n     * @returns {Array} Returns a duplicate-value-free array.\r\n     */\r\n    function baseUniq(array, isSorted, callback) {\r\n      var index = -1,\r\n          indexOf = getIndexOf(),\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      var isLarge = !isSorted && length >= largeArraySize && indexOf === baseIndexOf,\r\n          seen = (callback || isLarge) ? getArray() : result;\r\n\r\n      if (isLarge) {\r\n        var cache = createCache(seen);\r\n        indexOf = cacheIndexOf;\r\n        seen = cache;\r\n      }\r\n      while (++index < length) {\r\n        var value = array[index],\r\n            computed = callback ? callback(value, index, array) : value;\r\n\r\n        if (isSorted\r\n              ? !index || seen[seen.length - 1] !== computed\r\n              : indexOf(seen, computed) < 0\r\n            ) {\r\n          if (callback || isLarge) {\r\n            seen.push(computed);\r\n          }\r\n          result.push(value);\r\n        }\r\n      }\r\n      if (isLarge) {\r\n        releaseArray(seen.array);\r\n        releaseObject(seen);\r\n      } else if (callback) {\r\n        releaseArray(seen);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates a function that aggregates a collection, creating an object composed\r\n     * of keys generated from the results of running each element of the collection\r\n     * through a callback. The given `setter` function sets the keys and values\r\n     * of the composed object.\r\n     *\r\n     * @private\r\n     * @param {Function} setter The setter function.\r\n     * @returns {Function} Returns the new aggregator function.\r\n     */\r\n    function createAggregator(setter) {\r\n      return function(collection, callback, thisArg) {\r\n        var result = {};\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n        var index = -1,\r\n            length = collection ? collection.length : 0;\r\n\r\n        if (typeof length == 'number') {\r\n          while (++index < length) {\r\n            var value = collection[index];\r\n            setter(result, value, callback(value, index, collection), collection);\r\n          }\r\n        } else {\r\n          forOwn(collection, function(value, key, collection) {\r\n            setter(result, value, callback(value, key, collection), collection);\r\n          });\r\n        }\r\n        return result;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when called, either curries or invokes `func`\r\n     * with an optional `this` binding and partially applied arguments.\r\n     *\r\n     * @private\r\n     * @param {Function|string} func The function or method name to reference.\r\n     * @param {number} bitmask The bitmask of method flags to compose.\r\n     *  The bitmask may be composed of the following flags:\r\n     *  1 - `_.bind`\r\n     *  2 - `_.bindKey`\r\n     *  4 - `_.curry`\r\n     *  8 - `_.curry` (bound)\r\n     *  16 - `_.partial`\r\n     *  32 - `_.partialRight`\r\n     * @param {Array} [partialArgs] An array of arguments to prepend to those\r\n     *  provided to the new function.\r\n     * @param {Array} [partialRightArgs] An array of arguments to append to those\r\n     *  provided to the new function.\r\n     * @param {*} [thisArg] The `this` binding of `func`.\r\n     * @param {number} [arity] The arity of `func`.\r\n     * @returns {Function} Returns the new function.\r\n     */\r\n    function createWrapper(func, bitmask, partialArgs, partialRightArgs, thisArg, arity) {\r\n      var isBind = bitmask & 1,\r\n          isBindKey = bitmask & 2,\r\n          isCurry = bitmask & 4,\r\n          isCurryBound = bitmask & 8,\r\n          isPartial = bitmask & 16,\r\n          isPartialRight = bitmask & 32;\r\n\r\n      if (!isBindKey && !isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      if (isPartial && !partialArgs.length) {\r\n        bitmask &= ~16;\r\n        isPartial = partialArgs = false;\r\n      }\r\n      if (isPartialRight && !partialRightArgs.length) {\r\n        bitmask &= ~32;\r\n        isPartialRight = partialRightArgs = false;\r\n      }\r\n      var bindData = func && func.__bindData__;\r\n      if (bindData && bindData !== true) {\r\n        // clone `bindData`\r\n        bindData = slice(bindData);\r\n        if (bindData[2]) {\r\n          bindData[2] = slice(bindData[2]);\r\n        }\r\n        if (bindData[3]) {\r\n          bindData[3] = slice(bindData[3]);\r\n        }\r\n        // set `thisBinding` is not previously bound\r\n        if (isBind && !(bindData[1] & 1)) {\r\n          bindData[4] = thisArg;\r\n        }\r\n        // set if previously bound but not currently (subsequent curried functions)\r\n        if (!isBind && bindData[1] & 1) {\r\n          bitmask |= 8;\r\n        }\r\n        // set curried arity if not yet set\r\n        if (isCurry && !(bindData[1] & 4)) {\r\n          bindData[5] = arity;\r\n        }\r\n        // append partial left arguments\r\n        if (isPartial) {\r\n          push.apply(bindData[2] || (bindData[2] = []), partialArgs);\r\n        }\r\n        // append partial right arguments\r\n        if (isPartialRight) {\r\n          unshift.apply(bindData[3] || (bindData[3] = []), partialRightArgs);\r\n        }\r\n        // merge flags\r\n        bindData[1] |= bitmask;\r\n        return createWrapper.apply(null, bindData);\r\n      }\r\n      // fast path for `_.bind`\r\n      var creater = (bitmask == 1 || bitmask === 17) ? baseBind : baseCreateWrapper;\r\n      return creater([func, bitmask, partialArgs, partialRightArgs, thisArg, arity]);\r\n    }\r\n\r\n    /**\r\n     * Used by `escape` to convert characters to HTML entities.\r\n     *\r\n     * @private\r\n     * @param {string} match The matched character to escape.\r\n     * @returns {string} Returns the escaped character.\r\n     */\r\n    function escapeHtmlChar(match) {\r\n      return htmlEscapes[match];\r\n    }\r\n\r\n    /**\r\n     * Gets the appropriate \"indexOf\" function. If the `_.indexOf` method is\r\n     * customized, this method returns the custom method, otherwise it returns\r\n     * the `baseIndexOf` function.\r\n     *\r\n     * @private\r\n     * @returns {Function} Returns the \"indexOf\" function.\r\n     */\r\n    function getIndexOf() {\r\n      var result = (result = lodash.indexOf) === indexOf ? baseIndexOf : result;\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a native function.\r\n     *\r\n     * @private\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a native function, else `false`.\r\n     */\r\n    function isNative(value) {\r\n      return typeof value == 'function' && reNative.test(value);\r\n    }\r\n\r\n    /**\r\n     * Sets `this` binding data on a given function.\r\n     *\r\n     * @private\r\n     * @param {Function} func The function to set data on.\r\n     * @param {Array} value The data array to set.\r\n     */\r\n    var setBindData = !defineProperty ? noop : function(func, value) {\r\n      descriptor.value = value;\r\n      defineProperty(func, '__bindData__', descriptor);\r\n    };\r\n\r\n    /**\r\n     * A fallback implementation of `isPlainObject` which checks if a given value\r\n     * is an object created by the `Object` constructor, assuming objects created\r\n     * by the `Object` constructor have no inherited enumerable properties and that\r\n     * there are no `Object.prototype` extensions.\r\n     *\r\n     * @private\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\r\n     */\r\n    function shimIsPlainObject(value) {\r\n      var ctor,\r\n          result;\r\n\r\n      // avoid non Object objects, `arguments` objects, and DOM elements\r\n      if (!(value && toString.call(value) == objectClass) ||\r\n          (ctor = value.constructor, isFunction(ctor) && !(ctor instanceof ctor))) {\r\n        return false;\r\n      }\r\n      // In most environments an object's own properties are iterated before\r\n      // its inherited properties. If the last iterated property is an object's\r\n      // own property then there are no inherited enumerable properties.\r\n      forIn(value, function(value, key) {\r\n        result = key;\r\n      });\r\n      return typeof result == 'undefined' || hasOwnProperty.call(value, result);\r\n    }\r\n\r\n    /**\r\n     * Used by `unescape` to convert HTML entities to characters.\r\n     *\r\n     * @private\r\n     * @param {string} match The matched character to unescape.\r\n     * @returns {string} Returns the unescaped character.\r\n     */\r\n    function unescapeHtmlChar(match) {\r\n      return htmlUnescapes[match];\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Checks if `value` is an `arguments` object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is an `arguments` object, else `false`.\r\n     * @example\r\n     *\r\n     * (function() { return _.isArguments(arguments); })(1, 2, 3);\r\n     * // => true\r\n     *\r\n     * _.isArguments([1, 2, 3]);\r\n     * // => false\r\n     */\r\n    function isArguments(value) {\r\n      return value && typeof value == 'object' && typeof value.length == 'number' &&\r\n        toString.call(value) == argsClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is an array.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is an array, else `false`.\r\n     * @example\r\n     *\r\n     * (function() { return _.isArray(arguments); })();\r\n     * // => false\r\n     *\r\n     * _.isArray([1, 2, 3]);\r\n     * // => true\r\n     */\r\n    var isArray = nativeIsArray || function(value) {\r\n      return value && typeof value == 'object' && typeof value.length == 'number' &&\r\n        toString.call(value) == arrayClass || false;\r\n    };\r\n\r\n    /**\r\n     * A fallback implementation of `Object.keys` which produces an array of the\r\n     * given object's own enumerable property names.\r\n     *\r\n     * @private\r\n     * @type Function\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns an array of property names.\r\n     */\r\n    var shimKeys = function(object) {\r\n      var index, iterable = object, result = [];\r\n      if (!iterable) return result;\r\n      if (!(objectTypes[typeof object])) return result;\r\n        for (index in iterable) {\r\n          if (hasOwnProperty.call(iterable, index)) {\r\n            result.push(index);\r\n          }\r\n        }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * Creates an array composed of the own enumerable property names of an object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns an array of property names.\r\n     * @example\r\n     *\r\n     * _.keys({ 'one': 1, 'two': 2, 'three': 3 });\r\n     * // => ['one', 'two', 'three'] (property order is not guaranteed across environments)\r\n     */\r\n    var keys = !nativeKeys ? shimKeys : function(object) {\r\n      if (!isObject(object)) {\r\n        return [];\r\n      }\r\n      return nativeKeys(object);\r\n    };\r\n\r\n    /**\r\n     * Used to convert characters to HTML entities:\r\n     *\r\n     * Though the `>` character is escaped for symmetry, characters like `>` and `/`\r\n     * don't require escaping in HTML and have no special meaning unless they're part\r\n     * of a tag or an unquoted attribute value.\r\n     * http://mathiasbynens.be/notes/ambiguous-ampersands (under \"semi-related fun fact\")\r\n     */\r\n    var htmlEscapes = {\r\n      '&': '&amp;',\r\n      '<': '&lt;',\r\n      '>': '&gt;',\r\n      '\"': '&quot;',\r\n      \"'\": '&#39;'\r\n    };\r\n\r\n    /** Used to convert HTML entities to characters */\r\n    var htmlUnescapes = invert(htmlEscapes);\r\n\r\n    /** Used to match HTML entities and HTML characters */\r\n    var reEscapedHtml = RegExp('(' + keys(htmlUnescapes).join('|') + ')', 'g'),\r\n        reUnescapedHtml = RegExp('[' + keys(htmlEscapes).join('') + ']', 'g');\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Assigns own enumerable properties of source object(s) to the destination\r\n     * object. Subsequent sources will overwrite property assignments of previous\r\n     * sources. If a callback is provided it will be executed to produce the\r\n     * assigned values. The callback is bound to `thisArg` and invoked with two\r\n     * arguments; (objectValue, sourceValue).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @alias extend\r\n     * @category Objects\r\n     * @param {Object} object The destination object.\r\n     * @param {...Object} [source] The source objects.\r\n     * @param {Function} [callback] The function to customize assigning values.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the destination object.\r\n     * @example\r\n     *\r\n     * _.assign({ 'name': 'fred' }, { 'employer': 'slate' });\r\n     * // => { 'name': 'fred', 'employer': 'slate' }\r\n     *\r\n     * var defaults = _.partialRight(_.assign, function(a, b) {\r\n     *   return typeof a == 'undefined' ? b : a;\r\n     * });\r\n     *\r\n     * var object = { 'name': 'barney' };\r\n     * defaults(object, { 'name': 'fred', 'employer': 'slate' });\r\n     * // => { 'name': 'barney', 'employer': 'slate' }\r\n     */\r\n    var assign = function(object, source, guard) {\r\n      var index, iterable = object, result = iterable;\r\n      if (!iterable) return result;\r\n      var args = arguments,\r\n          argsIndex = 0,\r\n          argsLength = typeof guard == 'number' ? 2 : args.length;\r\n      if (argsLength > 3 && typeof args[argsLength - 2] == 'function') {\r\n        var callback = baseCreateCallback(args[--argsLength - 1], args[argsLength--], 2);\r\n      } else if (argsLength > 2 && typeof args[argsLength - 1] == 'function') {\r\n        callback = args[--argsLength];\r\n      }\r\n      while (++argsIndex < argsLength) {\r\n        iterable = args[argsIndex];\r\n        if (iterable && objectTypes[typeof iterable]) {\r\n        var ownIndex = -1,\r\n            ownProps = objectTypes[typeof iterable] && keys(iterable),\r\n            length = ownProps ? ownProps.length : 0;\r\n\r\n        while (++ownIndex < length) {\r\n          index = ownProps[ownIndex];\r\n          result[index] = callback ? callback(result[index], iterable[index]) : iterable[index];\r\n        }\r\n        }\r\n      }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * Creates a clone of `value`. If `isDeep` is `true` nested objects will also\r\n     * be cloned, otherwise they will be assigned by reference. If a callback\r\n     * is provided it will be executed to produce the cloned values. If the\r\n     * callback returns `undefined` cloning will be handled by the method instead.\r\n     * The callback is bound to `thisArg` and invoked with one argument; (value).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to clone.\r\n     * @param {boolean} [isDeep=false] Specify a deep clone.\r\n     * @param {Function} [callback] The function to customize cloning values.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the cloned value.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * var shallow = _.clone(characters);\r\n     * shallow[0] === characters[0];\r\n     * // => true\r\n     *\r\n     * var deep = _.clone(characters, true);\r\n     * deep[0] === characters[0];\r\n     * // => false\r\n     *\r\n     * _.mixin({\r\n     *   'clone': _.partialRight(_.clone, function(value) {\r\n     *     return _.isElement(value) ? value.cloneNode(false) : undefined;\r\n     *   })\r\n     * });\r\n     *\r\n     * var clone = _.clone(document.body);\r\n     * clone.childNodes.length;\r\n     * // => 0\r\n     */\r\n    function clone(value, isDeep, callback, thisArg) {\r\n      // allows working with \"Collections\" methods without using their `index`\r\n      // and `collection` arguments for `isDeep` and `callback`\r\n      if (typeof isDeep != 'boolean' && isDeep != null) {\r\n        thisArg = callback;\r\n        callback = isDeep;\r\n        isDeep = false;\r\n      }\r\n      return baseClone(value, isDeep, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 1));\r\n    }\r\n\r\n    /**\r\n     * Creates a deep clone of `value`. If a callback is provided it will be\r\n     * executed to produce the cloned values. If the callback returns `undefined`\r\n     * cloning will be handled by the method instead. The callback is bound to\r\n     * `thisArg` and invoked with one argument; (value).\r\n     *\r\n     * Note: This method is loosely based on the structured clone algorithm. Functions\r\n     * and DOM nodes are **not** cloned. The enumerable properties of `arguments` objects and\r\n     * objects created by constructors other than `Object` are cloned to plain `Object` objects.\r\n     * See http://www.w3.org/TR/html5/infrastructure.html#internal-structured-cloning-algorithm.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to deep clone.\r\n     * @param {Function} [callback] The function to customize cloning values.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the deep cloned value.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * var deep = _.cloneDeep(characters);\r\n     * deep[0] === characters[0];\r\n     * // => false\r\n     *\r\n     * var view = {\r\n     *   'label': 'docs',\r\n     *   'node': element\r\n     * };\r\n     *\r\n     * var clone = _.cloneDeep(view, function(value) {\r\n     *   return _.isElement(value) ? value.cloneNode(true) : undefined;\r\n     * });\r\n     *\r\n     * clone.node == view.node;\r\n     * // => false\r\n     */\r\n    function cloneDeep(value, callback, thisArg) {\r\n      return baseClone(value, true, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 1));\r\n    }\r\n\r\n    /**\r\n     * Creates an object that inherits from the given `prototype` object. If a\r\n     * `properties` object is provided its own enumerable properties are assigned\r\n     * to the created object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} prototype The object to inherit from.\r\n     * @param {Object} [properties] The properties to assign to the object.\r\n     * @returns {Object} Returns the new object.\r\n     * @example\r\n     *\r\n     * function Shape() {\r\n     *   this.x = 0;\r\n     *   this.y = 0;\r\n     * }\r\n     *\r\n     * function Circle() {\r\n     *   Shape.call(this);\r\n     * }\r\n     *\r\n     * Circle.prototype = _.create(Shape.prototype, { 'constructor': Circle });\r\n     *\r\n     * var circle = new Circle;\r\n     * circle instanceof Circle;\r\n     * // => true\r\n     *\r\n     * circle instanceof Shape;\r\n     * // => true\r\n     */\r\n    function create(prototype, properties) {\r\n      var result = baseCreate(prototype);\r\n      return properties ? assign(result, properties) : result;\r\n    }\r\n\r\n    /**\r\n     * Assigns own enumerable properties of source object(s) to the destination\r\n     * object for all destination properties that resolve to `undefined`. Once a\r\n     * property is set, additional defaults of the same property will be ignored.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Objects\r\n     * @param {Object} object The destination object.\r\n     * @param {...Object} [source] The source objects.\r\n     * @param- {Object} [guard] Allows working with `_.reduce` without using its\r\n     *  `key` and `object` arguments as sources.\r\n     * @returns {Object} Returns the destination object.\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'barney' };\r\n     * _.defaults(object, { 'name': 'fred', 'employer': 'slate' });\r\n     * // => { 'name': 'barney', 'employer': 'slate' }\r\n     */\r\n    var defaults = function(object, source, guard) {\r\n      var index, iterable = object, result = iterable;\r\n      if (!iterable) return result;\r\n      var args = arguments,\r\n          argsIndex = 0,\r\n          argsLength = typeof guard == 'number' ? 2 : args.length;\r\n      while (++argsIndex < argsLength) {\r\n        iterable = args[argsIndex];\r\n        if (iterable && objectTypes[typeof iterable]) {\r\n        var ownIndex = -1,\r\n            ownProps = objectTypes[typeof iterable] && keys(iterable),\r\n            length = ownProps ? ownProps.length : 0;\r\n\r\n        while (++ownIndex < length) {\r\n          index = ownProps[ownIndex];\r\n          if (typeof result[index] == 'undefined') result[index] = iterable[index];\r\n        }\r\n        }\r\n      }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * This method is like `_.findIndex` except that it returns the key of the\r\n     * first element that passes the callback check, instead of the element itself.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to search.\r\n     * @param {Function|Object|string} [callback=identity] The function called per\r\n     *  iteration. If a property name or object is provided it will be used to\r\n     *  create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {string|undefined} Returns the key of the found element, else `undefined`.\r\n     * @example\r\n     *\r\n     * var characters = {\r\n     *   'barney': {  'age': 36, 'blocked': false },\r\n     *   'fred': {    'age': 40, 'blocked': true },\r\n     *   'pebbles': { 'age': 1,  'blocked': false }\r\n     * };\r\n     *\r\n     * _.findKey(characters, function(chr) {\r\n     *   return chr.age < 40;\r\n     * });\r\n     * // => 'barney' (property order is not guaranteed across environments)\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.findKey(characters, { 'age': 1 });\r\n     * // => 'pebbles'\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.findKey(characters, 'blocked');\r\n     * // => 'fred'\r\n     */\r\n    function findKey(object, callback, thisArg) {\r\n      var result;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      forOwn(object, function(value, key, object) {\r\n        if (callback(value, key, object)) {\r\n          result = key;\r\n          return false;\r\n        }\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.findKey` except that it iterates over elements\r\n     * of a `collection` in the opposite order.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to search.\r\n     * @param {Function|Object|string} [callback=identity] The function called per\r\n     *  iteration. If a property name or object is provided it will be used to\r\n     *  create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {string|undefined} Returns the key of the found element, else `undefined`.\r\n     * @example\r\n     *\r\n     * var characters = {\r\n     *   'barney': {  'age': 36, 'blocked': true },\r\n     *   'fred': {    'age': 40, 'blocked': false },\r\n     *   'pebbles': { 'age': 1,  'blocked': true }\r\n     * };\r\n     *\r\n     * _.findLastKey(characters, function(chr) {\r\n     *   return chr.age < 40;\r\n     * });\r\n     * // => returns `pebbles`, assuming `_.findKey` returns `barney`\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.findLastKey(characters, { 'age': 40 });\r\n     * // => 'fred'\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.findLastKey(characters, 'blocked');\r\n     * // => 'pebbles'\r\n     */\r\n    function findLastKey(object, callback, thisArg) {\r\n      var result;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      forOwnRight(object, function(value, key, object) {\r\n        if (callback(value, key, object)) {\r\n          result = key;\r\n          return false;\r\n        }\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Iterates over own and inherited enumerable properties of an object,\r\n     * executing the callback for each property. The callback is bound to `thisArg`\r\n     * and invoked with three arguments; (value, key, object). Callbacks may exit\r\n     * iteration early by explicitly returning `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * function Shape() {\r\n     *   this.x = 0;\r\n     *   this.y = 0;\r\n     * }\r\n     *\r\n     * Shape.prototype.move = function(x, y) {\r\n     *   this.x += x;\r\n     *   this.y += y;\r\n     * };\r\n     *\r\n     * _.forIn(new Shape, function(value, key) {\r\n     *   console.log(key);\r\n     * });\r\n     * // => logs 'x', 'y', and 'move' (property order is not guaranteed across environments)\r\n     */\r\n    var forIn = function(collection, callback, thisArg) {\r\n      var index, iterable = collection, result = iterable;\r\n      if (!iterable) return result;\r\n      if (!objectTypes[typeof iterable]) return result;\r\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\r\n        for (index in iterable) {\r\n          if (callback(iterable[index], index, collection) === false) return result;\r\n        }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * This method is like `_.forIn` except that it iterates over elements\r\n     * of a `collection` in the opposite order.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * function Shape() {\r\n     *   this.x = 0;\r\n     *   this.y = 0;\r\n     * }\r\n     *\r\n     * Shape.prototype.move = function(x, y) {\r\n     *   this.x += x;\r\n     *   this.y += y;\r\n     * };\r\n     *\r\n     * _.forInRight(new Shape, function(value, key) {\r\n     *   console.log(key);\r\n     * });\r\n     * // => logs 'move', 'y', and 'x' assuming `_.forIn ` logs 'x', 'y', and 'move'\r\n     */\r\n    function forInRight(object, callback, thisArg) {\r\n      var pairs = [];\r\n\r\n      forIn(object, function(value, key) {\r\n        pairs.push(key, value);\r\n      });\r\n\r\n      var length = pairs.length;\r\n      callback = baseCreateCallback(callback, thisArg, 3);\r\n      while (length--) {\r\n        if (callback(pairs[length--], pairs[length], object) === false) {\r\n          break;\r\n        }\r\n      }\r\n      return object;\r\n    }\r\n\r\n    /**\r\n     * Iterates over own enumerable properties of an object, executing the callback\r\n     * for each property. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, key, object). Callbacks may exit iteration early by\r\n     * explicitly returning `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * _.forOwn({ '0': 'zero', '1': 'one', 'length': 2 }, function(num, key) {\r\n     *   console.log(key);\r\n     * });\r\n     * // => logs '0', '1', and 'length' (property order is not guaranteed across environments)\r\n     */\r\n    var forOwn = function(collection, callback, thisArg) {\r\n      var index, iterable = collection, result = iterable;\r\n      if (!iterable) return result;\r\n      if (!objectTypes[typeof iterable]) return result;\r\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\r\n        var ownIndex = -1,\r\n            ownProps = objectTypes[typeof iterable] && keys(iterable),\r\n            length = ownProps ? ownProps.length : 0;\r\n\r\n        while (++ownIndex < length) {\r\n          index = ownProps[ownIndex];\r\n          if (callback(iterable[index], index, collection) === false) return result;\r\n        }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * This method is like `_.forOwn` except that it iterates over elements\r\n     * of a `collection` in the opposite order.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * _.forOwnRight({ '0': 'zero', '1': 'one', 'length': 2 }, function(num, key) {\r\n     *   console.log(key);\r\n     * });\r\n     * // => logs 'length', '1', and '0' assuming `_.forOwn` logs '0', '1', and 'length'\r\n     */\r\n    function forOwnRight(object, callback, thisArg) {\r\n      var props = keys(object),\r\n          length = props.length;\r\n\r\n      callback = baseCreateCallback(callback, thisArg, 3);\r\n      while (length--) {\r\n        var key = props[length];\r\n        if (callback(object[key], key, object) === false) {\r\n          break;\r\n        }\r\n      }\r\n      return object;\r\n    }\r\n\r\n    /**\r\n     * Creates a sorted array of property names of all enumerable properties,\r\n     * own and inherited, of `object` that have function values.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias methods\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns an array of property names that have function values.\r\n     * @example\r\n     *\r\n     * _.functions(_);\r\n     * // => ['all', 'any', 'bind', 'bindAll', 'clone', 'compact', 'compose', ...]\r\n     */\r\n    function functions(object) {\r\n      var result = [];\r\n      forIn(object, function(value, key) {\r\n        if (isFunction(value)) {\r\n          result.push(key);\r\n        }\r\n      });\r\n      return result.sort();\r\n    }\r\n\r\n    /**\r\n     * Checks if the specified property name exists as a direct property of `object`,\r\n     * instead of an inherited property.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @param {string} key The name of the property to check.\r\n     * @returns {boolean} Returns `true` if key is a direct property, else `false`.\r\n     * @example\r\n     *\r\n     * _.has({ 'a': 1, 'b': 2, 'c': 3 }, 'b');\r\n     * // => true\r\n     */\r\n    function has(object, key) {\r\n      return object ? hasOwnProperty.call(object, key) : false;\r\n    }\r\n\r\n    /**\r\n     * Creates an object composed of the inverted keys and values of the given object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to invert.\r\n     * @returns {Object} Returns the created inverted object.\r\n     * @example\r\n     *\r\n     * _.invert({ 'first': 'fred', 'second': 'barney' });\r\n     * // => { 'fred': 'first', 'barney': 'second' }\r\n     */\r\n    function invert(object) {\r\n      var index = -1,\r\n          props = keys(object),\r\n          length = props.length,\r\n          result = {};\r\n\r\n      while (++index < length) {\r\n        var key = props[index];\r\n        result[object[key]] = key;\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a boolean value.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a boolean value, else `false`.\r\n     * @example\r\n     *\r\n     * _.isBoolean(null);\r\n     * // => false\r\n     */\r\n    function isBoolean(value) {\r\n      return value === true || value === false ||\r\n        value && typeof value == 'object' && toString.call(value) == boolClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a date.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a date, else `false`.\r\n     * @example\r\n     *\r\n     * _.isDate(new Date);\r\n     * // => true\r\n     */\r\n    function isDate(value) {\r\n      return value && typeof value == 'object' && toString.call(value) == dateClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a DOM element.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a DOM element, else `false`.\r\n     * @example\r\n     *\r\n     * _.isElement(document.body);\r\n     * // => true\r\n     */\r\n    function isElement(value) {\r\n      return value && value.nodeType === 1 || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is empty. Arrays, strings, or `arguments` objects with a\r\n     * length of `0` and objects with no own enumerable properties are considered\r\n     * \"empty\".\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Array|Object|string} value The value to inspect.\r\n     * @returns {boolean} Returns `true` if the `value` is empty, else `false`.\r\n     * @example\r\n     *\r\n     * _.isEmpty([1, 2, 3]);\r\n     * // => false\r\n     *\r\n     * _.isEmpty({});\r\n     * // => true\r\n     *\r\n     * _.isEmpty('');\r\n     * // => true\r\n     */\r\n    function isEmpty(value) {\r\n      var result = true;\r\n      if (!value) {\r\n        return result;\r\n      }\r\n      var className = toString.call(value),\r\n          length = value.length;\r\n\r\n      if ((className == arrayClass || className == stringClass || className == argsClass ) ||\r\n          (className == objectClass && typeof length == 'number' && isFunction(value.splice))) {\r\n        return !length;\r\n      }\r\n      forOwn(value, function() {\r\n        return (result = false);\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Performs a deep comparison between two values to determine if they are\r\n     * equivalent to each other. If a callback is provided it will be executed\r\n     * to compare values. If the callback returns `undefined` comparisons will\r\n     * be handled by the method instead. The callback is bound to `thisArg` and\r\n     * invoked with two arguments; (a, b).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} a The value to compare.\r\n     * @param {*} b The other value to compare.\r\n     * @param {Function} [callback] The function to customize comparing values.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'fred' };\r\n     * var copy = { 'name': 'fred' };\r\n     *\r\n     * object == copy;\r\n     * // => false\r\n     *\r\n     * _.isEqual(object, copy);\r\n     * // => true\r\n     *\r\n     * var words = ['hello', 'goodbye'];\r\n     * var otherWords = ['hi', 'goodbye'];\r\n     *\r\n     * _.isEqual(words, otherWords, function(a, b) {\r\n     *   var reGreet = /^(?:hello|hi)$/i,\r\n     *       aGreet = _.isString(a) && reGreet.test(a),\r\n     *       bGreet = _.isString(b) && reGreet.test(b);\r\n     *\r\n     *   return (aGreet || bGreet) ? (aGreet == bGreet) : undefined;\r\n     * });\r\n     * // => true\r\n     */\r\n    function isEqual(a, b, callback, thisArg) {\r\n      return baseIsEqual(a, b, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 2));\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is, or can be coerced to, a finite number.\r\n     *\r\n     * Note: This is not the same as native `isFinite` which will return true for\r\n     * booleans and empty strings. See http://es5.github.io/#x15.1.2.5.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is finite, else `false`.\r\n     * @example\r\n     *\r\n     * _.isFinite(-101);\r\n     * // => true\r\n     *\r\n     * _.isFinite('10');\r\n     * // => true\r\n     *\r\n     * _.isFinite(true);\r\n     * // => false\r\n     *\r\n     * _.isFinite('');\r\n     * // => false\r\n     *\r\n     * _.isFinite(Infinity);\r\n     * // => false\r\n     */\r\n    function isFinite(value) {\r\n      return nativeIsFinite(value) && !nativeIsNaN(parseFloat(value));\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a function, else `false`.\r\n     * @example\r\n     *\r\n     * _.isFunction(_);\r\n     * // => true\r\n     */\r\n    function isFunction(value) {\r\n      return typeof value == 'function';\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is the language type of Object.\r\n     * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is an object, else `false`.\r\n     * @example\r\n     *\r\n     * _.isObject({});\r\n     * // => true\r\n     *\r\n     * _.isObject([1, 2, 3]);\r\n     * // => true\r\n     *\r\n     * _.isObject(1);\r\n     * // => false\r\n     */\r\n    function isObject(value) {\r\n      // check if the value is the ECMAScript language type of Object\r\n      // http://es5.github.io/#x8\r\n      // and avoid a V8 bug\r\n      // http://code.google.com/p/v8/issues/detail?id=2291\r\n      return !!(value && objectTypes[typeof value]);\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is `NaN`.\r\n     *\r\n     * Note: This is not the same as native `isNaN` which will return `true` for\r\n     * `undefined` and other non-numeric values. See http://es5.github.io/#x15.1.2.4.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is `NaN`, else `false`.\r\n     * @example\r\n     *\r\n     * _.isNaN(NaN);\r\n     * // => true\r\n     *\r\n     * _.isNaN(new Number(NaN));\r\n     * // => true\r\n     *\r\n     * isNaN(undefined);\r\n     * // => true\r\n     *\r\n     * _.isNaN(undefined);\r\n     * // => false\r\n     */\r\n    function isNaN(value) {\r\n      // `NaN` as a primitive is the only value that is not equal to itself\r\n      // (perform the [[Class]] check first to avoid errors with some host objects in IE)\r\n      return isNumber(value) && value != +value;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is `null`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is `null`, else `false`.\r\n     * @example\r\n     *\r\n     * _.isNull(null);\r\n     * // => true\r\n     *\r\n     * _.isNull(undefined);\r\n     * // => false\r\n     */\r\n    function isNull(value) {\r\n      return value === null;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a number.\r\n     *\r\n     * Note: `NaN` is considered a number. See http://es5.github.io/#x8.5.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a number, else `false`.\r\n     * @example\r\n     *\r\n     * _.isNumber(8.4 * 5);\r\n     * // => true\r\n     */\r\n    function isNumber(value) {\r\n      return typeof value == 'number' ||\r\n        value && typeof value == 'object' && toString.call(value) == numberClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is an object created by the `Object` constructor.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\r\n     * @example\r\n     *\r\n     * function Shape() {\r\n     *   this.x = 0;\r\n     *   this.y = 0;\r\n     * }\r\n     *\r\n     * _.isPlainObject(new Shape);\r\n     * // => false\r\n     *\r\n     * _.isPlainObject([1, 2, 3]);\r\n     * // => false\r\n     *\r\n     * _.isPlainObject({ 'x': 0, 'y': 0 });\r\n     * // => true\r\n     */\r\n    var isPlainObject = !getPrototypeOf ? shimIsPlainObject : function(value) {\r\n      if (!(value && toString.call(value) == objectClass)) {\r\n        return false;\r\n      }\r\n      var valueOf = value.valueOf,\r\n          objProto = isNative(valueOf) && (objProto = getPrototypeOf(valueOf)) && getPrototypeOf(objProto);\r\n\r\n      return objProto\r\n        ? (value == objProto || getPrototypeOf(value) == objProto)\r\n        : shimIsPlainObject(value);\r\n    };\r\n\r\n    /**\r\n     * Checks if `value` is a regular expression.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a regular expression, else `false`.\r\n     * @example\r\n     *\r\n     * _.isRegExp(/fred/);\r\n     * // => true\r\n     */\r\n    function isRegExp(value) {\r\n      return value && typeof value == 'object' && toString.call(value) == regexpClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a string.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a string, else `false`.\r\n     * @example\r\n     *\r\n     * _.isString('fred');\r\n     * // => true\r\n     */\r\n    function isString(value) {\r\n      return typeof value == 'string' ||\r\n        value && typeof value == 'object' && toString.call(value) == stringClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is `undefined`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is `undefined`, else `false`.\r\n     * @example\r\n     *\r\n     * _.isUndefined(void 0);\r\n     * // => true\r\n     */\r\n    function isUndefined(value) {\r\n      return typeof value == 'undefined';\r\n    }\r\n\r\n    /**\r\n     * Creates an object with the same keys as `object` and values generated by\r\n     * running each own enumerable property of `object` through the callback.\r\n     * The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, key, object).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new object with values of the results of each `callback` execution.\r\n     * @example\r\n     *\r\n     * _.mapValues({ 'a': 1, 'b': 2, 'c': 3} , function(num) { return num * 3; });\r\n     * // => { 'a': 3, 'b': 6, 'c': 9 }\r\n     *\r\n     * var characters = {\r\n     *   'fred': { 'name': 'fred', 'age': 40 },\r\n     *   'pebbles': { 'name': 'pebbles', 'age': 1 }\r\n     * };\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.mapValues(characters, 'age');\r\n     * // => { 'fred': 40, 'pebbles': 1 }\r\n     */\r\n    function mapValues(object, callback, thisArg) {\r\n      var result = {};\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      forOwn(object, function(value, key, object) {\r\n        result[key] = callback(value, key, object);\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Recursively merges own enumerable properties of the source object(s), that\r\n     * don't resolve to `undefined` into the destination object. Subsequent sources\r\n     * will overwrite property assignments of previous sources. If a callback is\r\n     * provided it will be executed to produce the merged values of the destination\r\n     * and source properties. If the callback returns `undefined` merging will\r\n     * be handled by the method instead. The callback is bound to `thisArg` and\r\n     * invoked with two arguments; (objectValue, sourceValue).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The destination object.\r\n     * @param {...Object} [source] The source objects.\r\n     * @param {Function} [callback] The function to customize merging properties.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the destination object.\r\n     * @example\r\n     *\r\n     * var names = {\r\n     *   'characters': [\r\n     *     { 'name': 'barney' },\r\n     *     { 'name': 'fred' }\r\n     *   ]\r\n     * };\r\n     *\r\n     * var ages = {\r\n     *   'characters': [\r\n     *     { 'age': 36 },\r\n     *     { 'age': 40 }\r\n     *   ]\r\n     * };\r\n     *\r\n     * _.merge(names, ages);\r\n     * // => { 'characters': [{ 'name': 'barney', 'age': 36 }, { 'name': 'fred', 'age': 40 }] }\r\n     *\r\n     * var food = {\r\n     *   'fruits': ['apple'],\r\n     *   'vegetables': ['beet']\r\n     * };\r\n     *\r\n     * var otherFood = {\r\n     *   'fruits': ['banana'],\r\n     *   'vegetables': ['carrot']\r\n     * };\r\n     *\r\n     * _.merge(food, otherFood, function(a, b) {\r\n     *   return _.isArray(a) ? a.concat(b) : undefined;\r\n     * });\r\n     * // => { 'fruits': ['apple', 'banana'], 'vegetables': ['beet', 'carrot] }\r\n     */\r\n    function merge(object) {\r\n      var args = arguments,\r\n          length = 2;\r\n\r\n      if (!isObject(object)) {\r\n        return object;\r\n      }\r\n      // allows working with `_.reduce` and `_.reduceRight` without using\r\n      // their `index` and `collection` arguments\r\n      if (typeof args[2] != 'number') {\r\n        length = args.length;\r\n      }\r\n      if (length > 3 && typeof args[length - 2] == 'function') {\r\n        var callback = baseCreateCallback(args[--length - 1], args[length--], 2);\r\n      } else if (length > 2 && typeof args[length - 1] == 'function') {\r\n        callback = args[--length];\r\n      }\r\n      var sources = slice(arguments, 1, length),\r\n          index = -1,\r\n          stackA = getArray(),\r\n          stackB = getArray();\r\n\r\n      while (++index < length) {\r\n        baseMerge(object, sources[index], callback, stackA, stackB);\r\n      }\r\n      releaseArray(stackA);\r\n      releaseArray(stackB);\r\n      return object;\r\n    }\r\n\r\n    /**\r\n     * Creates a shallow clone of `object` excluding the specified properties.\r\n     * Property names may be specified as individual arguments or as arrays of\r\n     * property names. If a callback is provided it will be executed for each\r\n     * property of `object` omitting the properties the callback returns truey\r\n     * for. The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, key, object).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The source object.\r\n     * @param {Function|...string|string[]} [callback] The properties to omit or the\r\n     *  function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns an object without the omitted properties.\r\n     * @example\r\n     *\r\n     * _.omit({ 'name': 'fred', 'age': 40 }, 'age');\r\n     * // => { 'name': 'fred' }\r\n     *\r\n     * _.omit({ 'name': 'fred', 'age': 40 }, function(value) {\r\n     *   return typeof value == 'number';\r\n     * });\r\n     * // => { 'name': 'fred' }\r\n     */\r\n    function omit(object, callback, thisArg) {\r\n      var result = {};\r\n      if (typeof callback != 'function') {\r\n        var props = [];\r\n        forIn(object, function(value, key) {\r\n          props.push(key);\r\n        });\r\n        props = baseDifference(props, baseFlatten(arguments, true, false, 1));\r\n\r\n        var index = -1,\r\n            length = props.length;\r\n\r\n        while (++index < length) {\r\n          var key = props[index];\r\n          result[key] = object[key];\r\n        }\r\n      } else {\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        forIn(object, function(value, key, object) {\r\n          if (!callback(value, key, object)) {\r\n            result[key] = value;\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates a two dimensional array of an object's key-value pairs,\r\n     * i.e. `[[key1, value1], [key2, value2]]`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns new array of key-value pairs.\r\n     * @example\r\n     *\r\n     * _.pairs({ 'barney': 36, 'fred': 40 });\r\n     * // => [['barney', 36], ['fred', 40]] (property order is not guaranteed across environments)\r\n     */\r\n    function pairs(object) {\r\n      var index = -1,\r\n          props = keys(object),\r\n          length = props.length,\r\n          result = Array(length);\r\n\r\n      while (++index < length) {\r\n        var key = props[index];\r\n        result[index] = [key, object[key]];\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates a shallow clone of `object` composed of the specified properties.\r\n     * Property names may be specified as individual arguments or as arrays of\r\n     * property names. If a callback is provided it will be executed for each\r\n     * property of `object` picking the properties the callback returns truey\r\n     * for. The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, key, object).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The source object.\r\n     * @param {Function|...string|string[]} [callback] The function called per\r\n     *  iteration or property names to pick, specified as individual property\r\n     *  names or arrays of property names.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns an object composed of the picked properties.\r\n     * @example\r\n     *\r\n     * _.pick({ 'name': 'fred', '_userid': 'fred1' }, 'name');\r\n     * // => { 'name': 'fred' }\r\n     *\r\n     * _.pick({ 'name': 'fred', '_userid': 'fred1' }, function(value, key) {\r\n     *   return key.charAt(0) != '_';\r\n     * });\r\n     * // => { 'name': 'fred' }\r\n     */\r\n    function pick(object, callback, thisArg) {\r\n      var result = {};\r\n      if (typeof callback != 'function') {\r\n        var index = -1,\r\n            props = baseFlatten(arguments, true, false, 1),\r\n            length = isObject(object) ? props.length : 0;\r\n\r\n        while (++index < length) {\r\n          var key = props[index];\r\n          if (key in object) {\r\n            result[key] = object[key];\r\n          }\r\n        }\r\n      } else {\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        forIn(object, function(value, key, object) {\r\n          if (callback(value, key, object)) {\r\n            result[key] = value;\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * An alternative to `_.reduce` this method transforms `object` to a new\r\n     * `accumulator` object which is the result of running each of its own\r\n     * enumerable properties through a callback, with each callback execution\r\n     * potentially mutating the `accumulator` object. The callback is bound to\r\n     * `thisArg` and invoked with four arguments; (accumulator, value, key, object).\r\n     * Callbacks may exit iteration early by explicitly returning `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Array|Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [accumulator] The custom accumulator value.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the accumulated value.\r\n     * @example\r\n     *\r\n     * var squares = _.transform([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], function(result, num) {\r\n     *   num *= num;\r\n     *   if (num % 2) {\r\n     *     return result.push(num) < 3;\r\n     *   }\r\n     * });\r\n     * // => [1, 9, 25]\r\n     *\r\n     * var mapped = _.transform({ 'a': 1, 'b': 2, 'c': 3 }, function(result, num, key) {\r\n     *   result[key] = num * 3;\r\n     * });\r\n     * // => { 'a': 3, 'b': 6, 'c': 9 }\r\n     */\r\n    function transform(object, callback, accumulator, thisArg) {\r\n      var isArr = isArray(object);\r\n      if (accumulator == null) {\r\n        if (isArr) {\r\n          accumulator = [];\r\n        } else {\r\n          var ctor = object && object.constructor,\r\n              proto = ctor && ctor.prototype;\r\n\r\n          accumulator = baseCreate(proto);\r\n        }\r\n      }\r\n      if (callback) {\r\n        callback = lodash.createCallback(callback, thisArg, 4);\r\n        (isArr ? forEach : forOwn)(object, function(value, index, object) {\r\n          return callback(accumulator, value, index, object);\r\n        });\r\n      }\r\n      return accumulator;\r\n    }\r\n\r\n    /**\r\n     * Creates an array composed of the own enumerable property values of `object`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns an array of property values.\r\n     * @example\r\n     *\r\n     * _.values({ 'one': 1, 'two': 2, 'three': 3 });\r\n     * // => [1, 2, 3] (property order is not guaranteed across environments)\r\n     */\r\n    function values(object) {\r\n      var index = -1,\r\n          props = keys(object),\r\n          length = props.length,\r\n          result = Array(length);\r\n\r\n      while (++index < length) {\r\n        result[index] = object[props[index]];\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates an array of elements from the specified indexes, or keys, of the\r\n     * `collection`. Indexes may be specified as individual arguments or as arrays\r\n     * of indexes.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {...(number|number[]|string|string[])} [index] The indexes of `collection`\r\n     *   to retrieve, specified as individual indexes or arrays of indexes.\r\n     * @returns {Array} Returns a new array of elements corresponding to the\r\n     *  provided indexes.\r\n     * @example\r\n     *\r\n     * _.at(['a', 'b', 'c', 'd', 'e'], [0, 2, 4]);\r\n     * // => ['a', 'c', 'e']\r\n     *\r\n     * _.at(['fred', 'barney', 'pebbles'], 0, 2);\r\n     * // => ['fred', 'pebbles']\r\n     */\r\n    function at(collection) {\r\n      var args = arguments,\r\n          index = -1,\r\n          props = baseFlatten(args, true, false, 1),\r\n          length = (args[2] && args[2][args[1]] === collection) ? 1 : props.length,\r\n          result = Array(length);\r\n\r\n      while(++index < length) {\r\n        result[index] = collection[props[index]];\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Checks if a given value is present in a collection using strict equality\r\n     * for comparisons, i.e. `===`. If `fromIndex` is negative, it is used as the\r\n     * offset from the end of the collection.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias include\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {*} target The value to check for.\r\n     * @param {number} [fromIndex=0] The index to search from.\r\n     * @returns {boolean} Returns `true` if the `target` element is found, else `false`.\r\n     * @example\r\n     *\r\n     * _.contains([1, 2, 3], 1);\r\n     * // => true\r\n     *\r\n     * _.contains([1, 2, 3], 1, 2);\r\n     * // => false\r\n     *\r\n     * _.contains({ 'name': 'fred', 'age': 40 }, 'fred');\r\n     * // => true\r\n     *\r\n     * _.contains('pebbles', 'eb');\r\n     * // => true\r\n     */\r\n    function contains(collection, target, fromIndex) {\r\n      var index = -1,\r\n          indexOf = getIndexOf(),\r\n          length = collection ? collection.length : 0,\r\n          result = false;\r\n\r\n      fromIndex = (fromIndex < 0 ? nativeMax(0, length + fromIndex) : fromIndex) || 0;\r\n      if (isArray(collection)) {\r\n        result = indexOf(collection, target, fromIndex) > -1;\r\n      } else if (typeof length == 'number') {\r\n        result = (isString(collection) ? collection.indexOf(target, fromIndex) : indexOf(collection, target, fromIndex)) > -1;\r\n      } else {\r\n        forOwn(collection, function(value) {\r\n          if (++index >= fromIndex) {\r\n            return !(result = value === target);\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an object composed of keys generated from the results of running\r\n     * each element of `collection` through the callback. The corresponding value\r\n     * of each key is the number of times the key was returned by the callback.\r\n     * The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the composed aggregate object.\r\n     * @example\r\n     *\r\n     * _.countBy([4.3, 6.1, 6.4], function(num) { return Math.floor(num); });\r\n     * // => { '4': 1, '6': 2 }\r\n     *\r\n     * _.countBy([4.3, 6.1, 6.4], function(num) { return this.floor(num); }, Math);\r\n     * // => { '4': 1, '6': 2 }\r\n     *\r\n     * _.countBy(['one', 'two', 'three'], 'length');\r\n     * // => { '3': 2, '5': 1 }\r\n     */\r\n    var countBy = createAggregator(function(result, value, key) {\r\n      (hasOwnProperty.call(result, key) ? result[key]++ : result[key] = 1);\r\n    });\r\n\r\n    /**\r\n     * Checks if the given callback returns truey value for **all** elements of\r\n     * a collection. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias all\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {boolean} Returns `true` if all elements passed the callback check,\r\n     *  else `false`.\r\n     * @example\r\n     *\r\n     * _.every([true, 1, null, 'yes']);\r\n     * // => false\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.every(characters, 'age');\r\n     * // => true\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.every(characters, { 'age': 36 });\r\n     * // => false\r\n     */\r\n    function every(collection, callback, thisArg) {\r\n      var result = true;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          if (!(result = !!callback(collection[index], index, collection))) {\r\n            break;\r\n          }\r\n        }\r\n      } else {\r\n        forOwn(collection, function(value, index, collection) {\r\n          return (result = !!callback(value, index, collection));\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Iterates over elements of a collection, returning an array of all elements\r\n     * the callback returns truey for. The callback is bound to `thisArg` and\r\n     * invoked with three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias select\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of elements that passed the callback check.\r\n     * @example\r\n     *\r\n     * var evens = _.filter([1, 2, 3, 4, 5, 6], function(num) { return num % 2 == 0; });\r\n     * // => [2, 4, 6]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',   'age': 40, 'blocked': true }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.filter(characters, 'blocked');\r\n     * // => [{ 'name': 'fred', 'age': 40, 'blocked': true }]\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.filter(characters, { 'age': 36 });\r\n     * // => [{ 'name': 'barney', 'age': 36, 'blocked': false }]\r\n     */\r\n    function filter(collection, callback, thisArg) {\r\n      var result = [];\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          var value = collection[index];\r\n          if (callback(value, index, collection)) {\r\n            result.push(value);\r\n          }\r\n        }\r\n      } else {\r\n        forOwn(collection, function(value, index, collection) {\r\n          if (callback(value, index, collection)) {\r\n            result.push(value);\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Iterates over elements of a collection, returning the first element that\r\n     * the callback returns truey for. The callback is bound to `thisArg` and\r\n     * invoked with three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias detect, findWhere\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the found element, else `undefined`.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',    'age': 40, 'blocked': true },\r\n     *   { 'name': 'pebbles', 'age': 1,  'blocked': false }\r\n     * ];\r\n     *\r\n     * _.find(characters, function(chr) {\r\n     *   return chr.age < 40;\r\n     * });\r\n     * // => { 'name': 'barney', 'age': 36, 'blocked': false }\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.find(characters, { 'age': 1 });\r\n     * // =>  { 'name': 'pebbles', 'age': 1, 'blocked': false }\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.find(characters, 'blocked');\r\n     * // => { 'name': 'fred', 'age': 40, 'blocked': true }\r\n     */\r\n    function find(collection, callback, thisArg) {\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          var value = collection[index];\r\n          if (callback(value, index, collection)) {\r\n            return value;\r\n          }\r\n        }\r\n      } else {\r\n        var result;\r\n        forOwn(collection, function(value, index, collection) {\r\n          if (callback(value, index, collection)) {\r\n            result = value;\r\n            return false;\r\n          }\r\n        });\r\n        return result;\r\n      }\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.find` except that it iterates over elements\r\n     * of a `collection` from right to left.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the found element, else `undefined`.\r\n     * @example\r\n     *\r\n     * _.findLast([1, 2, 3, 4], function(num) {\r\n     *   return num % 2 == 1;\r\n     * });\r\n     * // => 3\r\n     */\r\n    function findLast(collection, callback, thisArg) {\r\n      var result;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      forEachRight(collection, function(value, index, collection) {\r\n        if (callback(value, index, collection)) {\r\n          result = value;\r\n          return false;\r\n        }\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Iterates over elements of a collection, executing the callback for each\r\n     * element. The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, index|key, collection). Callbacks may exit iteration early by\r\n     * explicitly returning `false`.\r\n     *\r\n     * Note: As with other \"Collections\" methods, objects with a `length` property\r\n     * are iterated like arrays. To avoid this behavior `_.forIn` or `_.forOwn`\r\n     * may be used for object iteration.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias each\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array|Object|string} Returns `collection`.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3]).forEach(function(num) { console.log(num); }).join(',');\r\n     * // => logs each number and returns '1,2,3'\r\n     *\r\n     * _.forEach({ 'one': 1, 'two': 2, 'three': 3 }, function(num) { console.log(num); });\r\n     * // => logs each number and returns the object (property order is not guaranteed across environments)\r\n     */\r\n    function forEach(collection, callback, thisArg) {\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          if (callback(collection[index], index, collection) === false) {\r\n            break;\r\n          }\r\n        }\r\n      } else {\r\n        forOwn(collection, callback);\r\n      }\r\n      return collection;\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.forEach` except that it iterates over elements\r\n     * of a `collection` from right to left.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias eachRight\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array|Object|string} Returns `collection`.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3]).forEachRight(function(num) { console.log(num); }).join(',');\r\n     * // => logs each number from right to left and returns '3,2,1'\r\n     */\r\n    function forEachRight(collection, callback, thisArg) {\r\n      var length = collection ? collection.length : 0;\r\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\r\n      if (typeof length == 'number') {\r\n        while (length--) {\r\n          if (callback(collection[length], length, collection) === false) {\r\n            break;\r\n          }\r\n        }\r\n      } else {\r\n        var props = keys(collection);\r\n        length = props.length;\r\n        forOwn(collection, function(value, key, collection) {\r\n          key = props ? props[--length] : --length;\r\n          return callback(collection[key], key, collection);\r\n        });\r\n      }\r\n      return collection;\r\n    }\r\n\r\n    /**\r\n     * Creates an object composed of keys generated from the results of running\r\n     * each element of a collection through the callback. The corresponding value\r\n     * of each key is an array of the elements responsible for generating the key.\r\n     * The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the composed aggregate object.\r\n     * @example\r\n     *\r\n     * _.groupBy([4.2, 6.1, 6.4], function(num) { return Math.floor(num); });\r\n     * // => { '4': [4.2], '6': [6.1, 6.4] }\r\n     *\r\n     * _.groupBy([4.2, 6.1, 6.4], function(num) { return this.floor(num); }, Math);\r\n     * // => { '4': [4.2], '6': [6.1, 6.4] }\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.groupBy(['one', 'two', 'three'], 'length');\r\n     * // => { '3': ['one', 'two'], '5': ['three'] }\r\n     */\r\n    var groupBy = createAggregator(function(result, value, key) {\r\n      (hasOwnProperty.call(result, key) ? result[key] : result[key] = []).push(value);\r\n    });\r\n\r\n    /**\r\n     * Creates an object composed of keys generated from the results of running\r\n     * each element of the collection through the given callback. The corresponding\r\n     * value of each key is the last element responsible for generating the key.\r\n     * The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the composed aggregate object.\r\n     * @example\r\n     *\r\n     * var keys = [\r\n     *   { 'dir': 'left', 'code': 97 },\r\n     *   { 'dir': 'right', 'code': 100 }\r\n     * ];\r\n     *\r\n     * _.indexBy(keys, 'dir');\r\n     * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }\r\n     *\r\n     * _.indexBy(keys, function(key) { return String.fromCharCode(key.code); });\r\n     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\r\n     *\r\n     * _.indexBy(characters, function(key) { this.fromCharCode(key.code); }, String);\r\n     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\r\n     */\r\n    var indexBy = createAggregator(function(result, value, key) {\r\n      result[key] = value;\r\n    });\r\n\r\n    /**\r\n     * Invokes the method named by `methodName` on each element in the `collection`\r\n     * returning an array of the results of each invoked method. Additional arguments\r\n     * will be provided to each invoked method. If `methodName` is a function it\r\n     * will be invoked for, and `this` bound to, each element in the `collection`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|string} methodName The name of the method to invoke or\r\n     *  the function invoked per iteration.\r\n     * @param {...*} [arg] Arguments to invoke the method with.\r\n     * @returns {Array} Returns a new array of the results of each invoked method.\r\n     * @example\r\n     *\r\n     * _.invoke([[5, 1, 7], [3, 2, 1]], 'sort');\r\n     * // => [[1, 5, 7], [1, 2, 3]]\r\n     *\r\n     * _.invoke([123, 456], String.prototype.split, '');\r\n     * // => [['1', '2', '3'], ['4', '5', '6']]\r\n     */\r\n    function invoke(collection, methodName) {\r\n      var args = slice(arguments, 2),\r\n          index = -1,\r\n          isFunc = typeof methodName == 'function',\r\n          length = collection ? collection.length : 0,\r\n          result = Array(typeof length == 'number' ? length : 0);\r\n\r\n      forEach(collection, function(value) {\r\n        result[++index] = (isFunc ? methodName : value[methodName]).apply(value, args);\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of values by running each element in the collection\r\n     * through the callback. The callback is bound to `thisArg` and invoked with\r\n     * three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias collect\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of the results of each `callback` execution.\r\n     * @example\r\n     *\r\n     * _.map([1, 2, 3], function(num) { return num * 3; });\r\n     * // => [3, 6, 9]\r\n     *\r\n     * _.map({ 'one': 1, 'two': 2, 'three': 3 }, function(num) { return num * 3; });\r\n     * // => [3, 6, 9] (property order is not guaranteed across environments)\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.map(characters, 'name');\r\n     * // => ['barney', 'fred']\r\n     */\r\n    function map(collection, callback, thisArg) {\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      if (typeof length == 'number') {\r\n        var result = Array(length);\r\n        while (++index < length) {\r\n          result[index] = callback(collection[index], index, collection);\r\n        }\r\n      } else {\r\n        result = [];\r\n        forOwn(collection, function(value, key, collection) {\r\n          result[++index] = callback(value, key, collection);\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Retrieves the maximum value of a collection. If the collection is empty or\r\n     * falsey `-Infinity` is returned. If a callback is provided it will be executed\r\n     * for each value in the collection to generate the criterion by which the value\r\n     * is ranked. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the maximum value.\r\n     * @example\r\n     *\r\n     * _.max([4, 2, 8, 6]);\r\n     * // => 8\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * _.max(characters, function(chr) { return chr.age; });\r\n     * // => { 'name': 'fred', 'age': 40 };\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.max(characters, 'age');\r\n     * // => { 'name': 'fred', 'age': 40 };\r\n     */\r\n    function max(collection, callback, thisArg) {\r\n      var computed = -Infinity,\r\n          result = computed;\r\n\r\n      // allows working with functions like `_.map` without using\r\n      // their `index` argument as a callback\r\n      if (typeof callback != 'function' && thisArg && thisArg[callback] === collection) {\r\n        callback = null;\r\n      }\r\n      if (callback == null && isArray(collection)) {\r\n        var index = -1,\r\n            length = collection.length;\r\n\r\n        while (++index < length) {\r\n          var value = collection[index];\r\n          if (value > result) {\r\n            result = value;\r\n          }\r\n        }\r\n      } else {\r\n        callback = (callback == null && isString(collection))\r\n          ? charAtCallback\r\n          : lodash.createCallback(callback, thisArg, 3);\r\n\r\n        forEach(collection, function(value, index, collection) {\r\n          var current = callback(value, index, collection);\r\n          if (current > computed) {\r\n            computed = current;\r\n            result = value;\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Retrieves the minimum value of a collection. If the collection is empty or\r\n     * falsey `Infinity` is returned. If a callback is provided it will be executed\r\n     * for each value in the collection to generate the criterion by which the value\r\n     * is ranked. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the minimum value.\r\n     * @example\r\n     *\r\n     * _.min([4, 2, 8, 6]);\r\n     * // => 2\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * _.min(characters, function(chr) { return chr.age; });\r\n     * // => { 'name': 'barney', 'age': 36 };\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.min(characters, 'age');\r\n     * // => { 'name': 'barney', 'age': 36 };\r\n     */\r\n    function min(collection, callback, thisArg) {\r\n      var computed = Infinity,\r\n          result = computed;\r\n\r\n      // allows working with functions like `_.map` without using\r\n      // their `index` argument as a callback\r\n      if (typeof callback != 'function' && thisArg && thisArg[callback] === collection) {\r\n        callback = null;\r\n      }\r\n      if (callback == null && isArray(collection)) {\r\n        var index = -1,\r\n            length = collection.length;\r\n\r\n        while (++index < length) {\r\n          var value = collection[index];\r\n          if (value < result) {\r\n            result = value;\r\n          }\r\n        }\r\n      } else {\r\n        callback = (callback == null && isString(collection))\r\n          ? charAtCallback\r\n          : lodash.createCallback(callback, thisArg, 3);\r\n\r\n        forEach(collection, function(value, index, collection) {\r\n          var current = callback(value, index, collection);\r\n          if (current < computed) {\r\n            computed = current;\r\n            result = value;\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Retrieves the value of a specified property from all elements in the collection.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {string} property The name of the property to pluck.\r\n     * @returns {Array} Returns a new array of property values.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * _.pluck(characters, 'name');\r\n     * // => ['barney', 'fred']\r\n     */\r\n    var pluck = map;\r\n\r\n    /**\r\n     * Reduces a collection to a value which is the accumulated result of running\r\n     * each element in the collection through the callback, where each successive\r\n     * callback execution consumes the return value of the previous execution. If\r\n     * `accumulator` is not provided the first element of the collection will be\r\n     * used as the initial `accumulator` value. The callback is bound to `thisArg`\r\n     * and invoked with four arguments; (accumulator, value, index|key, collection).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias foldl, inject\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [accumulator] Initial value of the accumulator.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the accumulated value.\r\n     * @example\r\n     *\r\n     * var sum = _.reduce([1, 2, 3], function(sum, num) {\r\n     *   return sum + num;\r\n     * });\r\n     * // => 6\r\n     *\r\n     * var mapped = _.reduce({ 'a': 1, 'b': 2, 'c': 3 }, function(result, num, key) {\r\n     *   result[key] = num * 3;\r\n     *   return result;\r\n     * }, {});\r\n     * // => { 'a': 3, 'b': 6, 'c': 9 }\r\n     */\r\n    function reduce(collection, callback, accumulator, thisArg) {\r\n      if (!collection) return accumulator;\r\n      var noaccum = arguments.length < 3;\r\n      callback = lodash.createCallback(callback, thisArg, 4);\r\n\r\n      var index = -1,\r\n          length = collection.length;\r\n\r\n      if (typeof length == 'number') {\r\n        if (noaccum) {\r\n          accumulator = collection[++index];\r\n        }\r\n        while (++index < length) {\r\n          accumulator = callback(accumulator, collection[index], index, collection);\r\n        }\r\n      } else {\r\n        forOwn(collection, function(value, index, collection) {\r\n          accumulator = noaccum\r\n            ? (noaccum = false, value)\r\n            : callback(accumulator, value, index, collection)\r\n        });\r\n      }\r\n      return accumulator;\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.reduce` except that it iterates over elements\r\n     * of a `collection` from right to left.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias foldr\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [accumulator] Initial value of the accumulator.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the accumulated value.\r\n     * @example\r\n     *\r\n     * var list = [[0, 1], [2, 3], [4, 5]];\r\n     * var flat = _.reduceRight(list, function(a, b) { return a.concat(b); }, []);\r\n     * // => [4, 5, 2, 3, 0, 1]\r\n     */\r\n    function reduceRight(collection, callback, accumulator, thisArg) {\r\n      var noaccum = arguments.length < 3;\r\n      callback = lodash.createCallback(callback, thisArg, 4);\r\n      forEachRight(collection, function(value, index, collection) {\r\n        accumulator = noaccum\r\n          ? (noaccum = false, value)\r\n          : callback(accumulator, value, index, collection);\r\n      });\r\n      return accumulator;\r\n    }\r\n\r\n    /**\r\n     * The opposite of `_.filter` this method returns the elements of a\r\n     * collection that the callback does **not** return truey for.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of elements that failed the callback check.\r\n     * @example\r\n     *\r\n     * var odds = _.reject([1, 2, 3, 4, 5, 6], function(num) { return num % 2 == 0; });\r\n     * // => [1, 3, 5]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',   'age': 40, 'blocked': true }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.reject(characters, 'blocked');\r\n     * // => [{ 'name': 'barney', 'age': 36, 'blocked': false }]\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.reject(characters, { 'age': 36 });\r\n     * // => [{ 'name': 'fred', 'age': 40, 'blocked': true }]\r\n     */\r\n    function reject(collection, callback, thisArg) {\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      return filter(collection, function(value, index, collection) {\r\n        return !callback(value, index, collection);\r\n      });\r\n    }\r\n\r\n    /**\r\n     * Retrieves a random element or `n` random elements from a collection.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to sample.\r\n     * @param {number} [n] The number of elements to sample.\r\n     * @param- {Object} [guard] Allows working with functions like `_.map`\r\n     *  without using their `index` arguments as `n`.\r\n     * @returns {Array} Returns the random sample(s) of `collection`.\r\n     * @example\r\n     *\r\n     * _.sample([1, 2, 3, 4]);\r\n     * // => 2\r\n     *\r\n     * _.sample([1, 2, 3, 4], 2);\r\n     * // => [3, 1]\r\n     */\r\n    function sample(collection, n, guard) {\r\n      if (collection && typeof collection.length != 'number') {\r\n        collection = values(collection);\r\n      }\r\n      if (n == null || guard) {\r\n        return collection ? collection[baseRandom(0, collection.length - 1)] : undefined;\r\n      }\r\n      var result = shuffle(collection);\r\n      result.length = nativeMin(nativeMax(0, n), result.length);\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of shuffled values, using a version of the Fisher-Yates\r\n     * shuffle. See http://en.wikipedia.org/wiki/Fisher-Yates_shuffle.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to shuffle.\r\n     * @returns {Array} Returns a new shuffled collection.\r\n     * @example\r\n     *\r\n     * _.shuffle([1, 2, 3, 4, 5, 6]);\r\n     * // => [4, 1, 6, 3, 5, 2]\r\n     */\r\n    function shuffle(collection) {\r\n      var index = -1,\r\n          length = collection ? collection.length : 0,\r\n          result = Array(typeof length == 'number' ? length : 0);\r\n\r\n      forEach(collection, function(value) {\r\n        var rand = baseRandom(0, ++index);\r\n        result[index] = result[rand];\r\n        result[rand] = value;\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Gets the size of the `collection` by returning `collection.length` for arrays\r\n     * and array-like objects or the number of own enumerable properties for objects.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to inspect.\r\n     * @returns {number} Returns `collection.length` or number of own enumerable properties.\r\n     * @example\r\n     *\r\n     * _.size([1, 2]);\r\n     * // => 2\r\n     *\r\n     * _.size({ 'one': 1, 'two': 2, 'three': 3 });\r\n     * // => 3\r\n     *\r\n     * _.size('pebbles');\r\n     * // => 7\r\n     */\r\n    function size(collection) {\r\n      var length = collection ? collection.length : 0;\r\n      return typeof length == 'number' ? length : keys(collection).length;\r\n    }\r\n\r\n    /**\r\n     * Checks if the callback returns a truey value for **any** element of a\r\n     * collection. The function returns as soon as it finds a passing value and\r\n     * does not iterate over the entire collection. The callback is bound to\r\n     * `thisArg` and invoked with three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias any\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {boolean} Returns `true` if any element passed the callback check,\r\n     *  else `false`.\r\n     * @example\r\n     *\r\n     * _.some([null, 0, 'yes', false], Boolean);\r\n     * // => true\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',   'age': 40, 'blocked': true }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.some(characters, 'blocked');\r\n     * // => true\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.some(characters, { 'age': 1 });\r\n     * // => false\r\n     */\r\n    function some(collection, callback, thisArg) {\r\n      var result;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          if ((result = callback(collection[index], index, collection))) {\r\n            break;\r\n          }\r\n        }\r\n      } else {\r\n        forOwn(collection, function(value, index, collection) {\r\n          return !(result = callback(value, index, collection));\r\n        });\r\n      }\r\n      return !!result;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of elements, sorted in ascending order by the results of\r\n     * running each element in a collection through the callback. This method\r\n     * performs a stable sort, that is, it will preserve the original sort order\r\n     * of equal elements. The callback is bound to `thisArg` and invoked with\r\n     * three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an array of property names is provided for `callback` the collection\r\n     * will be sorted by each property value.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Array|Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of sorted elements.\r\n     * @example\r\n     *\r\n     * _.sortBy([1, 2, 3], function(num) { return Math.sin(num); });\r\n     * // => [3, 1, 2]\r\n     *\r\n     * _.sortBy([1, 2, 3], function(num) { return this.sin(num); }, Math);\r\n     * // => [3, 1, 2]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36 },\r\n     *   { 'name': 'fred',    'age': 40 },\r\n     *   { 'name': 'barney',  'age': 26 },\r\n     *   { 'name': 'fred',    'age': 30 }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.map(_.sortBy(characters, 'age'), _.values);\r\n     * // => [['barney', 26], ['fred', 30], ['barney', 36], ['fred', 40]]\r\n     *\r\n     * // sorting by multiple properties\r\n     * _.map(_.sortBy(characters, ['name', 'age']), _.values);\r\n     * // = > [['barney', 26], ['barney', 36], ['fred', 30], ['fred', 40]]\r\n     */\r\n    function sortBy(collection, callback, thisArg) {\r\n      var index = -1,\r\n          isArr = isArray(callback),\r\n          length = collection ? collection.length : 0,\r\n          result = Array(typeof length == 'number' ? length : 0);\r\n\r\n      if (!isArr) {\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n      }\r\n      forEach(collection, function(value, key, collection) {\r\n        var object = result[++index] = getObject();\r\n        if (isArr) {\r\n          object.criteria = map(callback, function(key) { return value[key]; });\r\n        } else {\r\n          (object.criteria = getArray())[0] = callback(value, key, collection);\r\n        }\r\n        object.index = index;\r\n        object.value = value;\r\n      });\r\n\r\n      length = result.length;\r\n      result.sort(compareAscending);\r\n      while (length--) {\r\n        var object = result[length];\r\n        result[length] = object.value;\r\n        if (!isArr) {\r\n          releaseArray(object.criteria);\r\n        }\r\n        releaseObject(object);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Converts the `collection` to an array.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to convert.\r\n     * @returns {Array} Returns the new converted array.\r\n     * @example\r\n     *\r\n     * (function() { return _.toArray(arguments).slice(1); })(1, 2, 3, 4);\r\n     * // => [2, 3, 4]\r\n     */\r\n    function toArray(collection) {\r\n      if (collection && typeof collection.length == 'number') {\r\n        return slice(collection);\r\n      }\r\n      return values(collection);\r\n    }\r\n\r\n    /**\r\n     * Performs a deep comparison of each element in a `collection` to the given\r\n     * `properties` object, returning an array of all elements that have equivalent\r\n     * property values.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Object} props The object of property values to filter by.\r\n     * @returns {Array} Returns a new array of elements that have the given properties.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36, 'pets': ['hoppy'] },\r\n     *   { 'name': 'fred',   'age': 40, 'pets': ['baby puss', 'dino'] }\r\n     * ];\r\n     *\r\n     * _.where(characters, { 'age': 36 });\r\n     * // => [{ 'name': 'barney', 'age': 36, 'pets': ['hoppy'] }]\r\n     *\r\n     * _.where(characters, { 'pets': ['dino'] });\r\n     * // => [{ 'name': 'fred', 'age': 40, 'pets': ['baby puss', 'dino'] }]\r\n     */\r\n    var where = filter;\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates an array with all falsey values removed. The values `false`, `null`,\r\n     * `0`, `\"\"`, `undefined`, and `NaN` are all falsey.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to compact.\r\n     * @returns {Array} Returns a new array of filtered values.\r\n     * @example\r\n     *\r\n     * _.compact([0, 1, false, 2, '', 3]);\r\n     * // => [1, 2, 3]\r\n     */\r\n    function compact(array) {\r\n      var index = -1,\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      while (++index < length) {\r\n        var value = array[index];\r\n        if (value) {\r\n          result.push(value);\r\n        }\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an array excluding all values of the provided arrays using strict\r\n     * equality for comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to process.\r\n     * @param {...Array} [values] The arrays of values to exclude.\r\n     * @returns {Array} Returns a new array of filtered values.\r\n     * @example\r\n     *\r\n     * _.difference([1, 2, 3, 4, 5], [5, 2, 10]);\r\n     * // => [1, 3, 4]\r\n     */\r\n    function difference(array) {\r\n      return baseDifference(array, baseFlatten(arguments, true, true, 1));\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.find` except that it returns the index of the first\r\n     * element that passes the callback check, instead of the element itself.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to search.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {number} Returns the index of the found element, else `-1`.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',    'age': 40, 'blocked': true },\r\n     *   { 'name': 'pebbles', 'age': 1,  'blocked': false }\r\n     * ];\r\n     *\r\n     * _.findIndex(characters, function(chr) {\r\n     *   return chr.age < 20;\r\n     * });\r\n     * // => 2\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.findIndex(characters, { 'age': 36 });\r\n     * // => 0\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.findIndex(characters, 'blocked');\r\n     * // => 1\r\n     */\r\n    function findIndex(array, callback, thisArg) {\r\n      var index = -1,\r\n          length = array ? array.length : 0;\r\n\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      while (++index < length) {\r\n        if (callback(array[index], index, array)) {\r\n          return index;\r\n        }\r\n      }\r\n      return -1;\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.findIndex` except that it iterates over elements\r\n     * of a `collection` from right to left.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to search.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {number} Returns the index of the found element, else `-1`.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36, 'blocked': true },\r\n     *   { 'name': 'fred',    'age': 40, 'blocked': false },\r\n     *   { 'name': 'pebbles', 'age': 1,  'blocked': true }\r\n     * ];\r\n     *\r\n     * _.findLastIndex(characters, function(chr) {\r\n     *   return chr.age > 30;\r\n     * });\r\n     * // => 1\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.findLastIndex(characters, { 'age': 36 });\r\n     * // => 0\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.findLastIndex(characters, 'blocked');\r\n     * // => 2\r\n     */\r\n    function findLastIndex(array, callback, thisArg) {\r\n      var length = array ? array.length : 0;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      while (length--) {\r\n        if (callback(array[length], length, array)) {\r\n          return length;\r\n        }\r\n      }\r\n      return -1;\r\n    }\r\n\r\n    /**\r\n     * Gets the first element or first `n` elements of an array. If a callback\r\n     * is provided elements at the beginning of the array are returned as long\r\n     * as the callback returns truey. The callback is bound to `thisArg` and\r\n     * invoked with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias head, take\r\n     * @category Arrays\r\n     * @param {Array} array The array to query.\r\n     * @param {Function|Object|number|string} [callback] The function called\r\n     *  per element or the number of elements to return. If a property name or\r\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\r\n     *  style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the first element(s) of `array`.\r\n     * @example\r\n     *\r\n     * _.first([1, 2, 3]);\r\n     * // => 1\r\n     *\r\n     * _.first([1, 2, 3], 2);\r\n     * // => [1, 2]\r\n     *\r\n     * _.first([1, 2, 3], function(num) {\r\n     *   return num < 3;\r\n     * });\r\n     * // => [1, 2]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'blocked': true,  'employer': 'slate' },\r\n     *   { 'name': 'fred',    'blocked': false, 'employer': 'slate' },\r\n     *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.first(characters, 'blocked');\r\n     * // => [{ 'name': 'barney', 'blocked': true, 'employer': 'slate' }]\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.pluck(_.first(characters, { 'employer': 'slate' }), 'name');\r\n     * // => ['barney', 'fred']\r\n     */\r\n    function first(array, callback, thisArg) {\r\n      var n = 0,\r\n          length = array ? array.length : 0;\r\n\r\n      if (typeof callback != 'number' && callback != null) {\r\n        var index = -1;\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        while (++index < length && callback(array[index], index, array)) {\r\n          n++;\r\n        }\r\n      } else {\r\n        n = callback;\r\n        if (n == null || thisArg) {\r\n          return array ? array[0] : undefined;\r\n        }\r\n      }\r\n      return slice(array, 0, nativeMin(nativeMax(0, n), length));\r\n    }\r\n\r\n    /**\r\n     * Flattens a nested array (the nesting can be to any depth). If `isShallow`\r\n     * is truey, the array will only be flattened a single level. If a callback\r\n     * is provided each element of the array is passed through the callback before\r\n     * flattening. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to flatten.\r\n     * @param {boolean} [isShallow=false] A flag to restrict flattening to a single level.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new flattened array.\r\n     * @example\r\n     *\r\n     * _.flatten([1, [2], [3, [[4]]]]);\r\n     * // => [1, 2, 3, 4];\r\n     *\r\n     * _.flatten([1, [2], [3, [[4]]]], true);\r\n     * // => [1, 2, 3, [[4]]];\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 30, 'pets': ['hoppy'] },\r\n     *   { 'name': 'fred',   'age': 40, 'pets': ['baby puss', 'dino'] }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.flatten(characters, 'pets');\r\n     * // => ['hoppy', 'baby puss', 'dino']\r\n     */\r\n    function flatten(array, isShallow, callback, thisArg) {\r\n      // juggle arguments\r\n      if (typeof isShallow != 'boolean' && isShallow != null) {\r\n        thisArg = callback;\r\n        callback = (typeof isShallow != 'function' && thisArg && thisArg[isShallow] === array) ? null : isShallow;\r\n        isShallow = false;\r\n      }\r\n      if (callback != null) {\r\n        array = map(array, callback, thisArg);\r\n      }\r\n      return baseFlatten(array, isShallow);\r\n    }\r\n\r\n    /**\r\n     * Gets the index at which the first occurrence of `value` is found using\r\n     * strict equality for comparisons, i.e. `===`. If the array is already sorted\r\n     * providing `true` for `fromIndex` will run a faster binary search.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to search.\r\n     * @param {*} value The value to search for.\r\n     * @param {boolean|number} [fromIndex=0] The index to search from or `true`\r\n     *  to perform a binary search on a sorted array.\r\n     * @returns {number} Returns the index of the matched value or `-1`.\r\n     * @example\r\n     *\r\n     * _.indexOf([1, 2, 3, 1, 2, 3], 2);\r\n     * // => 1\r\n     *\r\n     * _.indexOf([1, 2, 3, 1, 2, 3], 2, 3);\r\n     * // => 4\r\n     *\r\n     * _.indexOf([1, 1, 2, 2, 3, 3], 2, true);\r\n     * // => 2\r\n     */\r\n    function indexOf(array, value, fromIndex) {\r\n      if (typeof fromIndex == 'number') {\r\n        var length = array ? array.length : 0;\r\n        fromIndex = (fromIndex < 0 ? nativeMax(0, length + fromIndex) : fromIndex || 0);\r\n      } else if (fromIndex) {\r\n        var index = sortedIndex(array, value);\r\n        return array[index] === value ? index : -1;\r\n      }\r\n      return baseIndexOf(array, value, fromIndex);\r\n    }\r\n\r\n    /**\r\n     * Gets all but the last element or last `n` elements of an array. If a\r\n     * callback is provided elements at the end of the array are excluded from\r\n     * the result as long as the callback returns truey. The callback is bound\r\n     * to `thisArg` and invoked with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to query.\r\n     * @param {Function|Object|number|string} [callback=1] The function called\r\n     *  per element or the number of elements to exclude. If a property name or\r\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\r\n     *  style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a slice of `array`.\r\n     * @example\r\n     *\r\n     * _.initial([1, 2, 3]);\r\n     * // => [1, 2]\r\n     *\r\n     * _.initial([1, 2, 3], 2);\r\n     * // => [1]\r\n     *\r\n     * _.initial([1, 2, 3], function(num) {\r\n     *   return num > 1;\r\n     * });\r\n     * // => [1]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'blocked': false, 'employer': 'slate' },\r\n     *   { 'name': 'fred',    'blocked': true,  'employer': 'slate' },\r\n     *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.initial(characters, 'blocked');\r\n     * // => [{ 'name': 'barney',  'blocked': false, 'employer': 'slate' }]\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.pluck(_.initial(characters, { 'employer': 'na' }), 'name');\r\n     * // => ['barney', 'fred']\r\n     */\r\n    function initial(array, callback, thisArg) {\r\n      var n = 0,\r\n          length = array ? array.length : 0;\r\n\r\n      if (typeof callback != 'number' && callback != null) {\r\n        var index = length;\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        while (index-- && callback(array[index], index, array)) {\r\n          n++;\r\n        }\r\n      } else {\r\n        n = (callback == null || thisArg) ? 1 : callback || n;\r\n      }\r\n      return slice(array, 0, nativeMin(nativeMax(0, length - n), length));\r\n    }\r\n\r\n    /**\r\n     * Creates an array of unique values present in all provided arrays using\r\n     * strict equality for comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {...Array} [array] The arrays to inspect.\r\n     * @returns {Array} Returns an array of shared values.\r\n     * @example\r\n     *\r\n     * _.intersection([1, 2, 3], [5, 2, 1, 4], [2, 1]);\r\n     * // => [1, 2]\r\n     */\r\n    function intersection() {\r\n      var args = [],\r\n          argsIndex = -1,\r\n          argsLength = arguments.length,\r\n          caches = getArray(),\r\n          indexOf = getIndexOf(),\r\n          trustIndexOf = indexOf === baseIndexOf,\r\n          seen = getArray();\r\n\r\n      while (++argsIndex < argsLength) {\r\n        var value = arguments[argsIndex];\r\n        if (isArray(value) || isArguments(value)) {\r\n          args.push(value);\r\n          caches.push(trustIndexOf && value.length >= largeArraySize &&\r\n            createCache(argsIndex ? args[argsIndex] : seen));\r\n        }\r\n      }\r\n      var array = args[0],\r\n          index = -1,\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      outer:\r\n      while (++index < length) {\r\n        var cache = caches[0];\r\n        value = array[index];\r\n\r\n        if ((cache ? cacheIndexOf(cache, value) : indexOf(seen, value)) < 0) {\r\n          argsIndex = argsLength;\r\n          (cache || seen).push(value);\r\n          while (--argsIndex) {\r\n            cache = caches[argsIndex];\r\n            if ((cache ? cacheIndexOf(cache, value) : indexOf(args[argsIndex], value)) < 0) {\r\n              continue outer;\r\n            }\r\n          }\r\n          result.push(value);\r\n        }\r\n      }\r\n      while (argsLength--) {\r\n        cache = caches[argsLength];\r\n        if (cache) {\r\n          releaseObject(cache);\r\n        }\r\n      }\r\n      releaseArray(caches);\r\n      releaseArray(seen);\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Gets the last element or last `n` elements of an array. If a callback is\r\n     * provided elements at the end of the array are returned as long as the\r\n     * callback returns truey. The callback is bound to `thisArg` and invoked\r\n     * with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to query.\r\n     * @param {Function|Object|number|string} [callback] The function called\r\n     *  per element or the number of elements to return. If a property name or\r\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\r\n     *  style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the last element(s) of `array`.\r\n     * @example\r\n     *\r\n     * _.last([1, 2, 3]);\r\n     * // => 3\r\n     *\r\n     * _.last([1, 2, 3], 2);\r\n     * // => [2, 3]\r\n     *\r\n     * _.last([1, 2, 3], function(num) {\r\n     *   return num > 1;\r\n     * });\r\n     * // => [2, 3]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'blocked': false, 'employer': 'slate' },\r\n     *   { 'name': 'fred',    'blocked': true,  'employer': 'slate' },\r\n     *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.pluck(_.last(characters, 'blocked'), 'name');\r\n     * // => ['fred', 'pebbles']\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.last(characters, { 'employer': 'na' });\r\n     * // => [{ 'name': 'pebbles', 'blocked': true, 'employer': 'na' }]\r\n     */\r\n    function last(array, callback, thisArg) {\r\n      var n = 0,\r\n          length = array ? array.length : 0;\r\n\r\n      if (typeof callback != 'number' && callback != null) {\r\n        var index = length;\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        while (index-- && callback(array[index], index, array)) {\r\n          n++;\r\n        }\r\n      } else {\r\n        n = callback;\r\n        if (n == null || thisArg) {\r\n          return array ? array[length - 1] : undefined;\r\n        }\r\n      }\r\n      return slice(array, nativeMax(0, length - n));\r\n    }\r\n\r\n    /**\r\n     * Gets the index at which the last occurrence of `value` is found using strict\r\n     * equality for comparisons, i.e. `===`. If `fromIndex` is negative, it is used\r\n     * as the offset from the end of the collection.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to search.\r\n     * @param {*} value The value to search for.\r\n     * @param {number} [fromIndex=array.length-1] The index to search from.\r\n     * @returns {number} Returns the index of the matched value or `-1`.\r\n     * @example\r\n     *\r\n     * _.lastIndexOf([1, 2, 3, 1, 2, 3], 2);\r\n     * // => 4\r\n     *\r\n     * _.lastIndexOf([1, 2, 3, 1, 2, 3], 2, 3);\r\n     * // => 1\r\n     */\r\n    function lastIndexOf(array, value, fromIndex) {\r\n      var index = array ? array.length : 0;\r\n      if (typeof fromIndex == 'number') {\r\n        index = (fromIndex < 0 ? nativeMax(0, index + fromIndex) : nativeMin(fromIndex, index - 1)) + 1;\r\n      }\r\n      while (index--) {\r\n        if (array[index] === value) {\r\n          return index;\r\n        }\r\n      }\r\n      return -1;\r\n    }\r\n\r\n    /**\r\n     * Removes all provided values from the given array using strict equality for\r\n     * comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to modify.\r\n     * @param {...*} [value] The values to remove.\r\n     * @returns {Array} Returns `array`.\r\n     * @example\r\n     *\r\n     * var array = [1, 2, 3, 1, 2, 3];\r\n     * _.pull(array, 2, 3);\r\n     * console.log(array);\r\n     * // => [1, 1]\r\n     */\r\n    function pull(array) {\r\n      var args = arguments,\r\n          argsIndex = 0,\r\n          argsLength = args.length,\r\n          length = array ? array.length : 0;\r\n\r\n      while (++argsIndex < argsLength) {\r\n        var index = -1,\r\n            value = args[argsIndex];\r\n        while (++index < length) {\r\n          if (array[index] === value) {\r\n            splice.call(array, index--, 1);\r\n            length--;\r\n          }\r\n        }\r\n      }\r\n      return array;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of numbers (positive and/or negative) progressing from\r\n     * `start` up to but not including `end`. If `start` is less than `stop` a\r\n     * zero-length range is created unless a negative `step` is specified.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {number} [start=0] The start of the range.\r\n     * @param {number} end The end of the range.\r\n     * @param {number} [step=1] The value to increment or decrement by.\r\n     * @returns {Array} Returns a new range array.\r\n     * @example\r\n     *\r\n     * _.range(4);\r\n     * // => [0, 1, 2, 3]\r\n     *\r\n     * _.range(1, 5);\r\n     * // => [1, 2, 3, 4]\r\n     *\r\n     * _.range(0, 20, 5);\r\n     * // => [0, 5, 10, 15]\r\n     *\r\n     * _.range(0, -4, -1);\r\n     * // => [0, -1, -2, -3]\r\n     *\r\n     * _.range(1, 4, 0);\r\n     * // => [1, 1, 1]\r\n     *\r\n     * _.range(0);\r\n     * // => []\r\n     */\r\n    function range(start, end, step) {\r\n      start = +start || 0;\r\n      step = typeof step == 'number' ? step : (+step || 1);\r\n\r\n      if (end == null) {\r\n        end = start;\r\n        start = 0;\r\n      }\r\n      // use `Array(length)` so engines like Chakra and V8 avoid slower modes\r\n      // http://youtu.be/XAqIpGU8ZZk#t=17m25s\r\n      var index = -1,\r\n          length = nativeMax(0, ceil((end - start) / (step || 1))),\r\n          result = Array(length);\r\n\r\n      while (++index < length) {\r\n        result[index] = start;\r\n        start += step;\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Removes all elements from an array that the callback returns truey for\r\n     * and returns an array of removed elements. The callback is bound to `thisArg`\r\n     * and invoked with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to modify.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of removed elements.\r\n     * @example\r\n     *\r\n     * var array = [1, 2, 3, 4, 5, 6];\r\n     * var evens = _.remove(array, function(num) { return num % 2 == 0; });\r\n     *\r\n     * console.log(array);\r\n     * // => [1, 3, 5]\r\n     *\r\n     * console.log(evens);\r\n     * // => [2, 4, 6]\r\n     */\r\n    function remove(array, callback, thisArg) {\r\n      var index = -1,\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      while (++index < length) {\r\n        var value = array[index];\r\n        if (callback(value, index, array)) {\r\n          result.push(value);\r\n          splice.call(array, index--, 1);\r\n          length--;\r\n        }\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The opposite of `_.initial` this method gets all but the first element or\r\n     * first `n` elements of an array. If a callback function is provided elements\r\n     * at the beginning of the array are excluded from the result as long as the\r\n     * callback returns truey. The callback is bound to `thisArg` and invoked\r\n     * with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias drop, tail\r\n     * @category Arrays\r\n     * @param {Array} array The array to query.\r\n     * @param {Function|Object|number|string} [callback=1] The function called\r\n     *  per element or the number of elements to exclude. If a property name or\r\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\r\n     *  style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a slice of `array`.\r\n     * @example\r\n     *\r\n     * _.rest([1, 2, 3]);\r\n     * // => [2, 3]\r\n     *\r\n     * _.rest([1, 2, 3], 2);\r\n     * // => [3]\r\n     *\r\n     * _.rest([1, 2, 3], function(num) {\r\n     *   return num < 3;\r\n     * });\r\n     * // => [3]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'blocked': true,  'employer': 'slate' },\r\n     *   { 'name': 'fred',    'blocked': false,  'employer': 'slate' },\r\n     *   { 'name': 'pebbles', 'blocked': true, 'employer': 'na' }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.pluck(_.rest(characters, 'blocked'), 'name');\r\n     * // => ['fred', 'pebbles']\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.rest(characters, { 'employer': 'slate' });\r\n     * // => [{ 'name': 'pebbles', 'blocked': true, 'employer': 'na' }]\r\n     */\r\n    function rest(array, callback, thisArg) {\r\n      if (typeof callback != 'number' && callback != null) {\r\n        var n = 0,\r\n            index = -1,\r\n            length = array ? array.length : 0;\r\n\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        while (++index < length && callback(array[index], index, array)) {\r\n          n++;\r\n        }\r\n      } else {\r\n        n = (callback == null || thisArg) ? 1 : nativeMax(0, callback);\r\n      }\r\n      return slice(array, n);\r\n    }\r\n\r\n    /**\r\n     * Uses a binary search to determine the smallest index at which a value\r\n     * should be inserted into a given sorted array in order to maintain the sort\r\n     * order of the array. If a callback is provided it will be executed for\r\n     * `value` and each element of `array` to compute their sort ranking. The\r\n     * callback is bound to `thisArg` and invoked with one argument; (value).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to inspect.\r\n     * @param {*} value The value to evaluate.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {number} Returns the index at which `value` should be inserted\r\n     *  into `array`.\r\n     * @example\r\n     *\r\n     * _.sortedIndex([20, 30, 50], 40);\r\n     * // => 2\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.sortedIndex([{ 'x': 20 }, { 'x': 30 }, { 'x': 50 }], { 'x': 40 }, 'x');\r\n     * // => 2\r\n     *\r\n     * var dict = {\r\n     *   'wordToNumber': { 'twenty': 20, 'thirty': 30, 'fourty': 40, 'fifty': 50 }\r\n     * };\r\n     *\r\n     * _.sortedIndex(['twenty', 'thirty', 'fifty'], 'fourty', function(word) {\r\n     *   return dict.wordToNumber[word];\r\n     * });\r\n     * // => 2\r\n     *\r\n     * _.sortedIndex(['twenty', 'thirty', 'fifty'], 'fourty', function(word) {\r\n     *   return this.wordToNumber[word];\r\n     * }, dict);\r\n     * // => 2\r\n     */\r\n    function sortedIndex(array, value, callback, thisArg) {\r\n      var low = 0,\r\n          high = array ? array.length : low;\r\n\r\n      // explicitly reference `identity` for better inlining in Firefox\r\n      callback = callback ? lodash.createCallback(callback, thisArg, 1) : identity;\r\n      value = callback(value);\r\n\r\n      while (low < high) {\r\n        var mid = (low + high) >>> 1;\r\n        (callback(array[mid]) < value)\r\n          ? low = mid + 1\r\n          : high = mid;\r\n      }\r\n      return low;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of unique values, in order, of the provided arrays using\r\n     * strict equality for comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {...Array} [array] The arrays to inspect.\r\n     * @returns {Array} Returns an array of combined values.\r\n     * @example\r\n     *\r\n     * _.union([1, 2, 3], [5, 2, 1, 4], [2, 1]);\r\n     * // => [1, 2, 3, 5, 4]\r\n     */\r\n    function union() {\r\n      return baseUniq(baseFlatten(arguments, true, true));\r\n    }\r\n\r\n    /**\r\n     * Creates a duplicate-value-free version of an array using strict equality\r\n     * for comparisons, i.e. `===`. If the array is sorted, providing\r\n     * `true` for `isSorted` will use a faster algorithm. If a callback is provided\r\n     * each element of `array` is passed through the callback before uniqueness\r\n     * is computed. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias unique\r\n     * @category Arrays\r\n     * @param {Array} array The array to process.\r\n     * @param {boolean} [isSorted=false] A flag to indicate that `array` is sorted.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a duplicate-value-free array.\r\n     * @example\r\n     *\r\n     * _.uniq([1, 2, 1, 3, 1]);\r\n     * // => [1, 2, 3]\r\n     *\r\n     * _.uniq([1, 1, 2, 2, 3], true);\r\n     * // => [1, 2, 3]\r\n     *\r\n     * _.uniq(['A', 'b', 'C', 'a', 'B', 'c'], function(letter) { return letter.toLowerCase(); });\r\n     * // => ['A', 'b', 'C']\r\n     *\r\n     * _.uniq([1, 2.5, 3, 1.5, 2, 3.5], function(num) { return this.floor(num); }, Math);\r\n     * // => [1, 2.5, 3]\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.uniq([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');\r\n     * // => [{ 'x': 1 }, { 'x': 2 }]\r\n     */\r\n    function uniq(array, isSorted, callback, thisArg) {\r\n      // juggle arguments\r\n      if (typeof isSorted != 'boolean' && isSorted != null) {\r\n        thisArg = callback;\r\n        callback = (typeof isSorted != 'function' && thisArg && thisArg[isSorted] === array) ? null : isSorted;\r\n        isSorted = false;\r\n      }\r\n      if (callback != null) {\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n      }\r\n      return baseUniq(array, isSorted, callback);\r\n    }\r\n\r\n    /**\r\n     * Creates an array excluding all provided values using strict equality for\r\n     * comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to filter.\r\n     * @param {...*} [value] The values to exclude.\r\n     * @returns {Array} Returns a new array of filtered values.\r\n     * @example\r\n     *\r\n     * _.without([1, 2, 1, 0, 3, 1, 4], 0, 1);\r\n     * // => [2, 3, 4]\r\n     */\r\n    function without(array) {\r\n      return baseDifference(array, slice(arguments, 1));\r\n    }\r\n\r\n    /**\r\n     * Creates an array that is the symmetric difference of the provided arrays.\r\n     * See http://en.wikipedia.org/wiki/Symmetric_difference.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {...Array} [array] The arrays to inspect.\r\n     * @returns {Array} Returns an array of values.\r\n     * @example\r\n     *\r\n     * _.xor([1, 2, 3], [5, 2, 1, 4]);\r\n     * // => [3, 5, 4]\r\n     *\r\n     * _.xor([1, 2, 5], [2, 3, 5], [3, 4, 5]);\r\n     * // => [1, 4, 5]\r\n     */\r\n    function xor() {\r\n      var index = -1,\r\n          length = arguments.length;\r\n\r\n      while (++index < length) {\r\n        var array = arguments[index];\r\n        if (isArray(array) || isArguments(array)) {\r\n          var result = result\r\n            ? baseUniq(baseDifference(result, array).concat(baseDifference(array, result)))\r\n            : array;\r\n        }\r\n      }\r\n      return result || [];\r\n    }\r\n\r\n    /**\r\n     * Creates an array of grouped elements, the first of which contains the first\r\n     * elements of the given arrays, the second of which contains the second\r\n     * elements of the given arrays, and so on.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias unzip\r\n     * @category Arrays\r\n     * @param {...Array} [array] Arrays to process.\r\n     * @returns {Array} Returns a new array of grouped elements.\r\n     * @example\r\n     *\r\n     * _.zip(['fred', 'barney'], [30, 40], [true, false]);\r\n     * // => [['fred', 30, true], ['barney', 40, false]]\r\n     */\r\n    function zip() {\r\n      var array = arguments.length > 1 ? arguments : arguments[0],\r\n          index = -1,\r\n          length = array ? max(pluck(array, 'length')) : 0,\r\n          result = Array(length < 0 ? 0 : length);\r\n\r\n      while (++index < length) {\r\n        result[index] = pluck(array, index);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an object composed from arrays of `keys` and `values`. Provide\r\n     * either a single two dimensional array, i.e. `[[key1, value1], [key2, value2]]`\r\n     * or two arrays, one of `keys` and one of corresponding `values`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias object\r\n     * @category Arrays\r\n     * @param {Array} keys The array of keys.\r\n     * @param {Array} [values=[]] The array of values.\r\n     * @returns {Object} Returns an object composed of the given keys and\r\n     *  corresponding values.\r\n     * @example\r\n     *\r\n     * _.zipObject(['fred', 'barney'], [30, 40]);\r\n     * // => { 'fred': 30, 'barney': 40 }\r\n     */\r\n    function zipObject(keys, values) {\r\n      var index = -1,\r\n          length = keys ? keys.length : 0,\r\n          result = {};\r\n\r\n      if (!values && length && !isArray(keys[0])) {\r\n        values = [];\r\n      }\r\n      while (++index < length) {\r\n        var key = keys[index];\r\n        if (values) {\r\n          result[key] = values[index];\r\n        } else if (key) {\r\n          result[key[0]] = key[1];\r\n        }\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates a function that executes `func`, with  the `this` binding and\r\n     * arguments of the created function, only after being called `n` times.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {number} n The number of times the function must be called before\r\n     *  `func` is executed.\r\n     * @param {Function} func The function to restrict.\r\n     * @returns {Function} Returns the new restricted function.\r\n     * @example\r\n     *\r\n     * var saves = ['profile', 'settings'];\r\n     *\r\n     * var done = _.after(saves.length, function() {\r\n     *   console.log('Done saving!');\r\n     * });\r\n     *\r\n     * _.forEach(saves, function(type) {\r\n     *   asyncSave({ 'type': type, 'complete': done });\r\n     * });\r\n     * // => logs 'Done saving!', after all saves have completed\r\n     */\r\n    function after(n, func) {\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      return function() {\r\n        if (--n < 1) {\r\n          return func.apply(this, arguments);\r\n        }\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when called, invokes `func` with the `this`\r\n     * binding of `thisArg` and prepends any additional `bind` arguments to those\r\n     * provided to the bound function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to bind.\r\n     * @param {*} [thisArg] The `this` binding of `func`.\r\n     * @param {...*} [arg] Arguments to be partially applied.\r\n     * @returns {Function} Returns the new bound function.\r\n     * @example\r\n     *\r\n     * var func = function(greeting) {\r\n     *   return greeting + ' ' + this.name;\r\n     * };\r\n     *\r\n     * func = _.bind(func, { 'name': 'fred' }, 'hi');\r\n     * func();\r\n     * // => 'hi fred'\r\n     */\r\n    function bind(func, thisArg) {\r\n      return arguments.length > 2\r\n        ? createWrapper(func, 17, slice(arguments, 2), null, thisArg)\r\n        : createWrapper(func, 1, null, null, thisArg);\r\n    }\r\n\r\n    /**\r\n     * Binds methods of an object to the object itself, overwriting the existing\r\n     * method. Method names may be specified as individual arguments or as arrays\r\n     * of method names. If no method names are provided all the function properties\r\n     * of `object` will be bound.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Object} object The object to bind and assign the bound methods to.\r\n     * @param {...string} [methodName] The object method names to\r\n     *  bind, specified as individual method names or arrays of method names.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * var view = {\r\n     *   'label': 'docs',\r\n     *   'onClick': function() { console.log('clicked ' + this.label); }\r\n     * };\r\n     *\r\n     * _.bindAll(view);\r\n     * jQuery('#docs').on('click', view.onClick);\r\n     * // => logs 'clicked docs', when the button is clicked\r\n     */\r\n    function bindAll(object) {\r\n      var funcs = arguments.length > 1 ? baseFlatten(arguments, true, false, 1) : functions(object),\r\n          index = -1,\r\n          length = funcs.length;\r\n\r\n      while (++index < length) {\r\n        var key = funcs[index];\r\n        object[key] = createWrapper(object[key], 1, null, null, object);\r\n      }\r\n      return object;\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when called, invokes the method at `object[key]`\r\n     * and prepends any additional `bindKey` arguments to those provided to the bound\r\n     * function. This method differs from `_.bind` by allowing bound functions to\r\n     * reference methods that will be redefined or don't yet exist.\r\n     * See http://michaux.ca/articles/lazy-function-definition-pattern.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Object} object The object the method belongs to.\r\n     * @param {string} key The key of the method.\r\n     * @param {...*} [arg] Arguments to be partially applied.\r\n     * @returns {Function} Returns the new bound function.\r\n     * @example\r\n     *\r\n     * var object = {\r\n     *   'name': 'fred',\r\n     *   'greet': function(greeting) {\r\n     *     return greeting + ' ' + this.name;\r\n     *   }\r\n     * };\r\n     *\r\n     * var func = _.bindKey(object, 'greet', 'hi');\r\n     * func();\r\n     * // => 'hi fred'\r\n     *\r\n     * object.greet = function(greeting) {\r\n     *   return greeting + 'ya ' + this.name + '!';\r\n     * };\r\n     *\r\n     * func();\r\n     * // => 'hiya fred!'\r\n     */\r\n    function bindKey(object, key) {\r\n      return arguments.length > 2\r\n        ? createWrapper(key, 19, slice(arguments, 2), null, object)\r\n        : createWrapper(key, 3, null, null, object);\r\n    }\r\n\r\n    /**\r\n     * Creates a function that is the composition of the provided functions,\r\n     * where each function consumes the return value of the function that follows.\r\n     * For example, composing the functions `f()`, `g()`, and `h()` produces `f(g(h()))`.\r\n     * Each function is executed with the `this` binding of the composed function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {...Function} [func] Functions to compose.\r\n     * @returns {Function} Returns the new composed function.\r\n     * @example\r\n     *\r\n     * var realNameMap = {\r\n     *   'pebbles': 'penelope'\r\n     * };\r\n     *\r\n     * var format = function(name) {\r\n     *   name = realNameMap[name.toLowerCase()] || name;\r\n     *   return name.charAt(0).toUpperCase() + name.slice(1).toLowerCase();\r\n     * };\r\n     *\r\n     * var greet = function(formatted) {\r\n     *   return 'Hiya ' + formatted + '!';\r\n     * };\r\n     *\r\n     * var welcome = _.compose(greet, format);\r\n     * welcome('pebbles');\r\n     * // => 'Hiya Penelope!'\r\n     */\r\n    function compose() {\r\n      var funcs = arguments,\r\n          length = funcs.length;\r\n\r\n      while (length--) {\r\n        if (!isFunction(funcs[length])) {\r\n          throw new TypeError;\r\n        }\r\n      }\r\n      return function() {\r\n        var args = arguments,\r\n            length = funcs.length;\r\n\r\n        while (length--) {\r\n          args = [funcs[length].apply(this, args)];\r\n        }\r\n        return args[0];\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Creates a function which accepts one or more arguments of `func` that when\r\n     * invoked either executes `func` returning its result, if all `func` arguments\r\n     * have been provided, or returns a function that accepts one or more of the\r\n     * remaining `func` arguments, and so on. The arity of `func` can be specified\r\n     * if `func.length` is not sufficient.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to curry.\r\n     * @param {number} [arity=func.length] The arity of `func`.\r\n     * @returns {Function} Returns the new curried function.\r\n     * @example\r\n     *\r\n     * var curried = _.curry(function(a, b, c) {\r\n     *   console.log(a + b + c);\r\n     * });\r\n     *\r\n     * curried(1)(2)(3);\r\n     * // => 6\r\n     *\r\n     * curried(1, 2)(3);\r\n     * // => 6\r\n     *\r\n     * curried(1, 2, 3);\r\n     * // => 6\r\n     */\r\n    function curry(func, arity) {\r\n      arity = typeof arity == 'number' ? arity : (+arity || func.length);\r\n      return createWrapper(func, 4, null, null, null, arity);\r\n    }\r\n\r\n    /**\r\n     * Creates a function that will delay the execution of `func` until after\r\n     * `wait` milliseconds have elapsed since the last time it was invoked.\r\n     * Provide an options object to indicate that `func` should be invoked on\r\n     * the leading and/or trailing edge of the `wait` timeout. Subsequent calls\r\n     * to the debounced function will return the result of the last `func` call.\r\n     *\r\n     * Note: If `leading` and `trailing` options are `true` `func` will be called\r\n     * on the trailing edge of the timeout only if the the debounced function is\r\n     * invoked more than once during the `wait` timeout.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to debounce.\r\n     * @param {number} wait The number of milliseconds to delay.\r\n     * @param {Object} [options] The options object.\r\n     * @param {boolean} [options.leading=false] Specify execution on the leading edge of the timeout.\r\n     * @param {number} [options.maxWait] The maximum time `func` is allowed to be delayed before it's called.\r\n     * @param {boolean} [options.trailing=true] Specify execution on the trailing edge of the timeout.\r\n     * @returns {Function} Returns the new debounced function.\r\n     * @example\r\n     *\r\n     * // avoid costly calculations while the window size is in flux\r\n     * var lazyLayout = _.debounce(calculateLayout, 150);\r\n     * jQuery(window).on('resize', lazyLayout);\r\n     *\r\n     * // execute `sendMail` when the click event is fired, debouncing subsequent calls\r\n     * jQuery('#postbox').on('click', _.debounce(sendMail, 300, {\r\n     *   'leading': true,\r\n     *   'trailing': false\r\n     * });\r\n     *\r\n     * // ensure `batchLog` is executed once after 1 second of debounced calls\r\n     * var source = new EventSource('/stream');\r\n     * source.addEventListener('message', _.debounce(batchLog, 250, {\r\n     *   'maxWait': 1000\r\n     * }, false);\r\n     */\r\n    function debounce(func, wait, options) {\r\n      var args,\r\n          maxTimeoutId,\r\n          result,\r\n          stamp,\r\n          thisArg,\r\n          timeoutId,\r\n          trailingCall,\r\n          lastCalled = 0,\r\n          maxWait = false,\r\n          trailing = true;\r\n\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      wait = nativeMax(0, wait) || 0;\r\n      if (options === true) {\r\n        var leading = true;\r\n        trailing = false;\r\n      } else if (isObject(options)) {\r\n        leading = options.leading;\r\n        maxWait = 'maxWait' in options && (nativeMax(wait, options.maxWait) || 0);\r\n        trailing = 'trailing' in options ? options.trailing : trailing;\r\n      }\r\n      var delayed = function() {\r\n        var remaining = wait - (now() - stamp);\r\n        if (remaining <= 0) {\r\n          if (maxTimeoutId) {\r\n            clearTimeout(maxTimeoutId);\r\n          }\r\n          var isCalled = trailingCall;\r\n          maxTimeoutId = timeoutId = trailingCall = undefined;\r\n          if (isCalled) {\r\n            lastCalled = now();\r\n            result = func.apply(thisArg, args);\r\n            if (!timeoutId && !maxTimeoutId) {\r\n              args = thisArg = null;\r\n            }\r\n          }\r\n        } else {\r\n          timeoutId = setTimeout(delayed, remaining);\r\n        }\r\n      };\r\n\r\n      var maxDelayed = function() {\r\n        if (timeoutId) {\r\n          clearTimeout(timeoutId);\r\n        }\r\n        maxTimeoutId = timeoutId = trailingCall = undefined;\r\n        if (trailing || (maxWait !== wait)) {\r\n          lastCalled = now();\r\n          result = func.apply(thisArg, args);\r\n          if (!timeoutId && !maxTimeoutId) {\r\n            args = thisArg = null;\r\n          }\r\n        }\r\n      };\r\n\r\n      return function() {\r\n        args = arguments;\r\n        stamp = now();\r\n        thisArg = this;\r\n        trailingCall = trailing && (timeoutId || !leading);\r\n\r\n        if (maxWait === false) {\r\n          var leadingCall = leading && !timeoutId;\r\n        } else {\r\n          if (!maxTimeoutId && !leading) {\r\n            lastCalled = stamp;\r\n          }\r\n          var remaining = maxWait - (stamp - lastCalled),\r\n              isCalled = remaining <= 0;\r\n\r\n          if (isCalled) {\r\n            if (maxTimeoutId) {\r\n              maxTimeoutId = clearTimeout(maxTimeoutId);\r\n            }\r\n            lastCalled = stamp;\r\n            result = func.apply(thisArg, args);\r\n          }\r\n          else if (!maxTimeoutId) {\r\n            maxTimeoutId = setTimeout(maxDelayed, remaining);\r\n          }\r\n        }\r\n        if (isCalled && timeoutId) {\r\n          timeoutId = clearTimeout(timeoutId);\r\n        }\r\n        else if (!timeoutId && wait !== maxWait) {\r\n          timeoutId = setTimeout(delayed, wait);\r\n        }\r\n        if (leadingCall) {\r\n          isCalled = true;\r\n          result = func.apply(thisArg, args);\r\n        }\r\n        if (isCalled && !timeoutId && !maxTimeoutId) {\r\n          args = thisArg = null;\r\n        }\r\n        return result;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Defers executing the `func` function until the current call stack has cleared.\r\n     * Additional arguments will be provided to `func` when it is invoked.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to defer.\r\n     * @param {...*} [arg] Arguments to invoke the function with.\r\n     * @returns {number} Returns the timer id.\r\n     * @example\r\n     *\r\n     * _.defer(function(text) { console.log(text); }, 'deferred');\r\n     * // logs 'deferred' after one or more milliseconds\r\n     */\r\n    function defer(func) {\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      var args = slice(arguments, 1);\r\n      return setTimeout(function() { func.apply(undefined, args); }, 1);\r\n    }\r\n\r\n    /**\r\n     * Executes the `func` function after `wait` milliseconds. Additional arguments\r\n     * will be provided to `func` when it is invoked.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to delay.\r\n     * @param {number} wait The number of milliseconds to delay execution.\r\n     * @param {...*} [arg] Arguments to invoke the function with.\r\n     * @returns {number} Returns the timer id.\r\n     * @example\r\n     *\r\n     * _.delay(function(text) { console.log(text); }, 1000, 'later');\r\n     * // => logs 'later' after one second\r\n     */\r\n    function delay(func, wait) {\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      var args = slice(arguments, 2);\r\n      return setTimeout(function() { func.apply(undefined, args); }, wait);\r\n    }\r\n\r\n    /**\r\n     * Creates a function that memoizes the result of `func`. If `resolver` is\r\n     * provided it will be used to determine the cache key for storing the result\r\n     * based on the arguments provided to the memoized function. By default, the\r\n     * first argument provided to the memoized function is used as the cache key.\r\n     * The `func` is executed with the `this` binding of the memoized function.\r\n     * The result cache is exposed as the `cache` property on the memoized function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to have its output memoized.\r\n     * @param {Function} [resolver] A function used to resolve the cache key.\r\n     * @returns {Function} Returns the new memoizing function.\r\n     * @example\r\n     *\r\n     * var fibonacci = _.memoize(function(n) {\r\n     *   return n < 2 ? n : fibonacci(n - 1) + fibonacci(n - 2);\r\n     * });\r\n     *\r\n     * fibonacci(9)\r\n     * // => 34\r\n     *\r\n     * var data = {\r\n     *   'fred': { 'name': 'fred', 'age': 40 },\r\n     *   'pebbles': { 'name': 'pebbles', 'age': 1 }\r\n     * };\r\n     *\r\n     * // modifying the result cache\r\n     * var get = _.memoize(function(name) { return data[name]; }, _.identity);\r\n     * get('pebbles');\r\n     * // => { 'name': 'pebbles', 'age': 1 }\r\n     *\r\n     * get.cache.pebbles.name = 'penelope';\r\n     * get('pebbles');\r\n     * // => { 'name': 'penelope', 'age': 1 }\r\n     */\r\n    function memoize(func, resolver) {\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      var memoized = function() {\r\n        var cache = memoized.cache,\r\n            key = resolver ? resolver.apply(this, arguments) : keyPrefix + arguments[0];\r\n\r\n        return hasOwnProperty.call(cache, key)\r\n          ? cache[key]\r\n          : (cache[key] = func.apply(this, arguments));\r\n      }\r\n      memoized.cache = {};\r\n      return memoized;\r\n    }\r\n\r\n    /**\r\n     * Creates a function that is restricted to execute `func` once. Repeat calls to\r\n     * the function will return the value of the first call. The `func` is executed\r\n     * with the `this` binding of the created function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to restrict.\r\n     * @returns {Function} Returns the new restricted function.\r\n     * @example\r\n     *\r\n     * var initialize = _.once(createApplication);\r\n     * initialize();\r\n     * initialize();\r\n     * // `initialize` executes `createApplication` once\r\n     */\r\n    function once(func) {\r\n      var ran,\r\n          result;\r\n\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      return function() {\r\n        if (ran) {\r\n          return result;\r\n        }\r\n        ran = true;\r\n        result = func.apply(this, arguments);\r\n\r\n        // clear the `func` variable so the function may be garbage collected\r\n        func = null;\r\n        return result;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when called, invokes `func` with any additional\r\n     * `partial` arguments prepended to those provided to the new function. This\r\n     * method is similar to `_.bind` except it does **not** alter the `this` binding.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to partially apply arguments to.\r\n     * @param {...*} [arg] Arguments to be partially applied.\r\n     * @returns {Function} Returns the new partially applied function.\r\n     * @example\r\n     *\r\n     * var greet = function(greeting, name) { return greeting + ' ' + name; };\r\n     * var hi = _.partial(greet, 'hi');\r\n     * hi('fred');\r\n     * // => 'hi fred'\r\n     */\r\n    function partial(func) {\r\n      return createWrapper(func, 16, slice(arguments, 1));\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.partial` except that `partial` arguments are\r\n     * appended to those provided to the new function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to partially apply arguments to.\r\n     * @param {...*} [arg] Arguments to be partially applied.\r\n     * @returns {Function} Returns the new partially applied function.\r\n     * @example\r\n     *\r\n     * var defaultsDeep = _.partialRight(_.merge, _.defaults);\r\n     *\r\n     * var options = {\r\n     *   'variable': 'data',\r\n     *   'imports': { 'jq': $ }\r\n     * };\r\n     *\r\n     * defaultsDeep(options, _.templateSettings);\r\n     *\r\n     * options.variable\r\n     * // => 'data'\r\n     *\r\n     * options.imports\r\n     * // => { '_': _, 'jq': $ }\r\n     */\r\n    function partialRight(func) {\r\n      return createWrapper(func, 32, null, slice(arguments, 1));\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when executed, will only call the `func` function\r\n     * at most once per every `wait` milliseconds. Provide an options object to\r\n     * indicate that `func` should be invoked on the leading and/or trailing edge\r\n     * of the `wait` timeout. Subsequent calls to the throttled function will\r\n     * return the result of the last `func` call.\r\n     *\r\n     * Note: If `leading` and `trailing` options are `true` `func` will be called\r\n     * on the trailing edge of the timeout only if the the throttled function is\r\n     * invoked more than once during the `wait` timeout.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to throttle.\r\n     * @param {number} wait The number of milliseconds to throttle executions to.\r\n     * @param {Object} [options] The options object.\r\n     * @param {boolean} [options.leading=true] Specify execution on the leading edge of the timeout.\r\n     * @param {boolean} [options.trailing=true] Specify execution on the trailing edge of the timeout.\r\n     * @returns {Function} Returns the new throttled function.\r\n     * @example\r\n     *\r\n     * // avoid excessively updating the position while scrolling\r\n     * var throttled = _.throttle(updatePosition, 100);\r\n     * jQuery(window).on('scroll', throttled);\r\n     *\r\n     * // execute `renewToken` when the click event is fired, but not more than once every 5 minutes\r\n     * jQuery('.interactive').on('click', _.throttle(renewToken, 300000, {\r\n     *   'trailing': false\r\n     * }));\r\n     */\r\n    function throttle(func, wait, options) {\r\n      var leading = true,\r\n          trailing = true;\r\n\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      if (options === false) {\r\n        leading = false;\r\n      } else if (isObject(options)) {\r\n        leading = 'leading' in options ? options.leading : leading;\r\n        trailing = 'trailing' in options ? options.trailing : trailing;\r\n      }\r\n      debounceOptions.leading = leading;\r\n      debounceOptions.maxWait = wait;\r\n      debounceOptions.trailing = trailing;\r\n\r\n      return debounce(func, wait, debounceOptions);\r\n    }\r\n\r\n    /**\r\n     * Creates a function that provides `value` to the wrapper function as its\r\n     * first argument. Additional arguments provided to the function are appended\r\n     * to those provided to the wrapper function. The wrapper is executed with\r\n     * the `this` binding of the created function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {*} value The value to wrap.\r\n     * @param {Function} wrapper The wrapper function.\r\n     * @returns {Function} Returns the new function.\r\n     * @example\r\n     *\r\n     * var p = _.wrap(_.escape, function(func, text) {\r\n     *   return '<p>' + func(text) + '</p>';\r\n     * });\r\n     *\r\n     * p('Fred, Wilma, & Pebbles');\r\n     * // => '<p>Fred, Wilma, &amp; Pebbles</p>'\r\n     */\r\n    function wrap(value, wrapper) {\r\n      return createWrapper(wrapper, 16, [value]);\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates a function that returns `value`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {*} value The value to return from the new function.\r\n     * @returns {Function} Returns the new function.\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'fred' };\r\n     * var getter = _.constant(object);\r\n     * getter() === object;\r\n     * // => true\r\n     */\r\n    function constant(value) {\r\n      return function() {\r\n        return value;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Produces a callback bound to an optional `thisArg`. If `func` is a property\r\n     * name the created callback will return the property value for a given element.\r\n     * If `func` is an object the created callback will return `true` for elements\r\n     * that contain the equivalent object properties, otherwise it will return `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {*} [func=identity] The value to convert to a callback.\r\n     * @param {*} [thisArg] The `this` binding of the created callback.\r\n     * @param {number} [argCount] The number of arguments the callback accepts.\r\n     * @returns {Function} Returns a callback function.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * // wrap to create custom callback shorthands\r\n     * _.createCallback = _.wrap(_.createCallback, function(func, callback, thisArg) {\r\n     *   var match = /^(.+?)__([gl]t)(.+)$/.exec(callback);\r\n     *   return !match ? func(callback, thisArg) : function(object) {\r\n     *     return match[2] == 'gt' ? object[match[1]] > match[3] : object[match[1]] < match[3];\r\n     *   };\r\n     * });\r\n     *\r\n     * _.filter(characters, 'age__gt38');\r\n     * // => [{ 'name': 'fred', 'age': 40 }]\r\n     */\r\n    function createCallback(func, thisArg, argCount) {\r\n      var type = typeof func;\r\n      if (func == null || type == 'function') {\r\n        return baseCreateCallback(func, thisArg, argCount);\r\n      }\r\n      // handle \"_.pluck\" style callback shorthands\r\n      if (type != 'object') {\r\n        return property(func);\r\n      }\r\n      var props = keys(func),\r\n          key = props[0],\r\n          a = func[key];\r\n\r\n      // handle \"_.where\" style callback shorthands\r\n      if (props.length == 1 && a === a && !isObject(a)) {\r\n        // fast path the common case of providing an object with a single\r\n        // property containing a primitive value\r\n        return function(object) {\r\n          var b = object[key];\r\n          return a === b && (a !== 0 || (1 / a == 1 / b));\r\n        };\r\n      }\r\n      return function(object) {\r\n        var length = props.length,\r\n            result = false;\r\n\r\n        while (length--) {\r\n          if (!(result = baseIsEqual(object[props[length]], func[props[length]], null, true))) {\r\n            break;\r\n          }\r\n        }\r\n        return result;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Converts the characters `&`, `<`, `>`, `\"`, and `'` in `string` to their\r\n     * corresponding HTML entities.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} string The string to escape.\r\n     * @returns {string} Returns the escaped string.\r\n     * @example\r\n     *\r\n     * _.escape('Fred, Wilma, & Pebbles');\r\n     * // => 'Fred, Wilma, &amp; Pebbles'\r\n     */\r\n    function escape(string) {\r\n      return string == null ? '' : String(string).replace(reUnescapedHtml, escapeHtmlChar);\r\n    }\r\n\r\n    /**\r\n     * This method returns the first argument provided to it.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {*} value Any value.\r\n     * @returns {*} Returns `value`.\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'fred' };\r\n     * _.identity(object) === object;\r\n     * // => true\r\n     */\r\n    function identity(value) {\r\n      return value;\r\n    }\r\n\r\n    /**\r\n     * Adds function properties of a source object to the destination object.\r\n     * If `object` is a function methods will be added to its prototype as well.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {Function|Object} [object=lodash] object The destination object.\r\n     * @param {Object} source The object of functions to add.\r\n     * @param {Object} [options] The options object.\r\n     * @param {boolean} [options.chain=true] Specify whether the functions added are chainable.\r\n     * @example\r\n     *\r\n     * function capitalize(string) {\r\n     *   return string.charAt(0).toUpperCase() + string.slice(1).toLowerCase();\r\n     * }\r\n     *\r\n     * _.mixin({ 'capitalize': capitalize });\r\n     * _.capitalize('fred');\r\n     * // => 'Fred'\r\n     *\r\n     * _('fred').capitalize().value();\r\n     * // => 'Fred'\r\n     *\r\n     * _.mixin({ 'capitalize': capitalize }, { 'chain': false });\r\n     * _('fred').capitalize();\r\n     * // => 'Fred'\r\n     */\r\n    function mixin(object, source, options) {\r\n      var chain = true,\r\n          methodNames = source && functions(source);\r\n\r\n      if (!source || (!options && !methodNames.length)) {\r\n        if (options == null) {\r\n          options = source;\r\n        }\r\n        ctor = lodashWrapper;\r\n        source = object;\r\n        object = lodash;\r\n        methodNames = functions(source);\r\n      }\r\n      if (options === false) {\r\n        chain = false;\r\n      } else if (isObject(options) && 'chain' in options) {\r\n        chain = options.chain;\r\n      }\r\n      var ctor = object,\r\n          isFunc = isFunction(ctor);\r\n\r\n      forEach(methodNames, function(methodName) {\r\n        var func = object[methodName] = source[methodName];\r\n        if (isFunc) {\r\n          ctor.prototype[methodName] = function() {\r\n            var chainAll = this.__chain__,\r\n                value = this.__wrapped__,\r\n                args = [value];\r\n\r\n            push.apply(args, arguments);\r\n            var result = func.apply(object, args);\r\n            if (chain || chainAll) {\r\n              if (value === result && isObject(result)) {\r\n                return this;\r\n              }\r\n              result = new ctor(result);\r\n              result.__chain__ = chainAll;\r\n            }\r\n            return result;\r\n          };\r\n        }\r\n      });\r\n    }\r\n\r\n    /**\r\n     * Reverts the '_' variable to its previous value and returns a reference to\r\n     * the `lodash` function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @returns {Function} Returns the `lodash` function.\r\n     * @example\r\n     *\r\n     * var lodash = _.noConflict();\r\n     */\r\n    function noConflict() {\r\n      context._ = oldDash;\r\n      return this;\r\n    }\r\n\r\n    /**\r\n     * A no-operation function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'fred' };\r\n     * _.noop(object) === undefined;\r\n     * // => true\r\n     */\r\n    function noop() {\r\n      // no operation performed\r\n    }\r\n\r\n    /**\r\n     * Gets the number of milliseconds that have elapsed since the Unix epoch\r\n     * (1 January 1970 00:00:00 UTC).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @example\r\n     *\r\n     * var stamp = _.now();\r\n     * _.defer(function() { console.log(_.now() - stamp); });\r\n     * // => logs the number of milliseconds it took for the deferred function to be called\r\n     */\r\n    var now = isNative(now = Date.now) && now || function() {\r\n      return new Date().getTime();\r\n    };\r\n\r\n    /**\r\n     * Converts the given value into an integer of the specified radix.\r\n     * If `radix` is `undefined` or `0` a `radix` of `10` is used unless the\r\n     * `value` is a hexadecimal, in which case a `radix` of `16` is used.\r\n     *\r\n     * Note: This method avoids differences in native ES3 and ES5 `parseInt`\r\n     * implementations. See http://es5.github.io/#E.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} value The value to parse.\r\n     * @param {number} [radix] The radix used to interpret the value to parse.\r\n     * @returns {number} Returns the new integer value.\r\n     * @example\r\n     *\r\n     * _.parseInt('08');\r\n     * // => 8\r\n     */\r\n    var parseInt = nativeParseInt(whitespace + '08') == 8 ? nativeParseInt : function(value, radix) {\r\n      // Firefox < 21 and Opera < 15 follow the ES3 specified implementation of `parseInt`\r\n      return nativeParseInt(isString(value) ? value.replace(reLeadingSpacesAndZeros, '') : value, radix || 0);\r\n    };\r\n\r\n    /**\r\n     * Creates a \"_.pluck\" style function, which returns the `key` value of a\r\n     * given object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} key The name of the property to retrieve.\r\n     * @returns {Function} Returns the new function.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'fred',   'age': 40 },\r\n     *   { 'name': 'barney', 'age': 36 }\r\n     * ];\r\n     *\r\n     * var getName = _.property('name');\r\n     *\r\n     * _.map(characters, getName);\r\n     * // => ['barney', 'fred']\r\n     *\r\n     * _.sortBy(characters, getName);\r\n     * // => [{ 'name': 'barney', 'age': 36 }, { 'name': 'fred',   'age': 40 }]\r\n     */\r\n    function property(key) {\r\n      return function(object) {\r\n        return object[key];\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Produces a random number between `min` and `max` (inclusive). If only one\r\n     * argument is provided a number between `0` and the given number will be\r\n     * returned. If `floating` is truey or either `min` or `max` are floats a\r\n     * floating-point number will be returned instead of an integer.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {number} [min=0] The minimum possible value.\r\n     * @param {number} [max=1] The maximum possible value.\r\n     * @param {boolean} [floating=false] Specify returning a floating-point number.\r\n     * @returns {number} Returns a random number.\r\n     * @example\r\n     *\r\n     * _.random(0, 5);\r\n     * // => an integer between 0 and 5\r\n     *\r\n     * _.random(5);\r\n     * // => also an integer between 0 and 5\r\n     *\r\n     * _.random(5, true);\r\n     * // => a floating-point number between 0 and 5\r\n     *\r\n     * _.random(1.2, 5.2);\r\n     * // => a floating-point number between 1.2 and 5.2\r\n     */\r\n    function random(min, max, floating) {\r\n      var noMin = min == null,\r\n          noMax = max == null;\r\n\r\n      if (floating == null) {\r\n        if (typeof min == 'boolean' && noMax) {\r\n          floating = min;\r\n          min = 1;\r\n        }\r\n        else if (!noMax && typeof max == 'boolean') {\r\n          floating = max;\r\n          noMax = true;\r\n        }\r\n      }\r\n      if (noMin && noMax) {\r\n        max = 1;\r\n      }\r\n      min = +min || 0;\r\n      if (noMax) {\r\n        max = min;\r\n        min = 0;\r\n      } else {\r\n        max = +max || 0;\r\n      }\r\n      if (floating || min % 1 || max % 1) {\r\n        var rand = nativeRandom();\r\n        return nativeMin(min + (rand * (max - min + parseFloat('1e-' + ((rand +'').length - 1)))), max);\r\n      }\r\n      return baseRandom(min, max);\r\n    }\r\n\r\n    /**\r\n     * Resolves the value of property `key` on `object`. If `key` is a function\r\n     * it will be invoked with the `this` binding of `object` and its result returned,\r\n     * else the property value is returned. If `object` is falsey then `undefined`\r\n     * is returned.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {Object} object The object to inspect.\r\n     * @param {string} key The name of the property to resolve.\r\n     * @returns {*} Returns the resolved value.\r\n     * @example\r\n     *\r\n     * var object = {\r\n     *   'cheese': 'crumpets',\r\n     *   'stuff': function() {\r\n     *     return 'nonsense';\r\n     *   }\r\n     * };\r\n     *\r\n     * _.result(object, 'cheese');\r\n     * // => 'crumpets'\r\n     *\r\n     * _.result(object, 'stuff');\r\n     * // => 'nonsense'\r\n     */\r\n    function result(object, key) {\r\n      if (object) {\r\n        var value = object[key];\r\n        return isFunction(value) ? object[key]() : value;\r\n      }\r\n    }\r\n\r\n    /**\r\n     * A micro-templating method that handles arbitrary delimiters, preserves\r\n     * whitespace, and correctly escapes quotes within interpolated code.\r\n     *\r\n     * Note: In the development build, `_.template` utilizes sourceURLs for easier\r\n     * debugging. See http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl\r\n     *\r\n     * For more information on precompiling templates see:\r\n     * http://lodash.com/custom-builds\r\n     *\r\n     * For more information on Chrome extension sandboxes see:\r\n     * http://developer.chrome.com/stable/extensions/sandboxingEval.html\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} text The template text.\r\n     * @param {Object} data The data object used to populate the text.\r\n     * @param {Object} [options] The options object.\r\n     * @param {RegExp} [options.escape] The \"escape\" delimiter.\r\n     * @param {RegExp} [options.evaluate] The \"evaluate\" delimiter.\r\n     * @param {Object} [options.imports] An object to import into the template as local variables.\r\n     * @param {RegExp} [options.interpolate] The \"interpolate\" delimiter.\r\n     * @param {string} [sourceURL] The sourceURL of the template's compiled source.\r\n     * @param {string} [variable] The data object variable name.\r\n     * @returns {Function|string} Returns a compiled function when no `data` object\r\n     *  is given, else it returns the interpolated text.\r\n     * @example\r\n     *\r\n     * // using the \"interpolate\" delimiter to create a compiled template\r\n     * var compiled = _.template('hello <%= name %>');\r\n     * compiled({ 'name': 'fred' });\r\n     * // => 'hello fred'\r\n     *\r\n     * // using the \"escape\" delimiter to escape HTML in data property values\r\n     * _.template('<b><%- value %></b>', { 'value': '<script>' });\r\n     * // => '<b>&lt;script&gt;</b>'\r\n     *\r\n     * // using the \"evaluate\" delimiter to generate HTML\r\n     * var list = '<% _.forEach(people, function(name) { %><li><%- name %></li><% }); %>';\r\n     * _.template(list, { 'people': ['fred', 'barney'] });\r\n     * // => '<li>fred</li><li>barney</li>'\r\n     *\r\n     * // using the ES6 delimiter as an alternative to the default \"interpolate\" delimiter\r\n     * _.template('hello ${ name }', { 'name': 'pebbles' });\r\n     * // => 'hello pebbles'\r\n     *\r\n     * // using the internal `print` function in \"evaluate\" delimiters\r\n     * _.template('<% print(\"hello \" + name); %>!', { 'name': 'barney' });\r\n     * // => 'hello barney!'\r\n     *\r\n     * // using a custom template delimiters\r\n     * _.templateSettings = {\r\n     *   'interpolate': /{{([\\s\\S]+?)}}/g\r\n     * };\r\n     *\r\n     * _.template('hello {{ name }}!', { 'name': 'mustache' });\r\n     * // => 'hello mustache!'\r\n     *\r\n     * // using the `imports` option to import jQuery\r\n     * var list = '<% jq.each(people, function(name) { %><li><%- name %></li><% }); %>';\r\n     * _.template(list, { 'people': ['fred', 'barney'] }, { 'imports': { 'jq': jQuery } });\r\n     * // => '<li>fred</li><li>barney</li>'\r\n     *\r\n     * // using the `sourceURL` option to specify a custom sourceURL for the template\r\n     * var compiled = _.template('hello <%= name %>', null, { 'sourceURL': '/basic/greeting.jst' });\r\n     * compiled(data);\r\n     * // => find the source of \"greeting.jst\" under the Sources tab or Resources panel of the web inspector\r\n     *\r\n     * // using the `variable` option to ensure a with-statement isn't used in the compiled template\r\n     * var compiled = _.template('hi <%= data.name %>!', null, { 'variable': 'data' });\r\n     * compiled.source;\r\n     * // => function(data) {\r\n     *   var __t, __p = '', __e = _.escape;\r\n     *   __p += 'hi ' + ((__t = ( data.name )) == null ? '' : __t) + '!';\r\n     *   return __p;\r\n     * }\r\n     *\r\n     * // using the `source` property to inline compiled templates for meaningful\r\n     * // line numbers in error messages and a stack trace\r\n     * fs.writeFileSync(path.join(cwd, 'jst.js'), '\\\r\n     *   var JST = {\\\r\n     *     \"main\": ' + _.template(mainText).source + '\\\r\n     *   };\\\r\n     * ');\r\n     */\r\n    function template(text, data, options) {\r\n      // based on John Resig's `tmpl` implementation\r\n      // http://ejohn.org/blog/javascript-micro-templating/\r\n      // and Laura Doktorova's doT.js\r\n      // https://github.com/olado/doT\r\n      var settings = lodash.templateSettings;\r\n      text = String(text || '');\r\n\r\n      // avoid missing dependencies when `iteratorTemplate` is not defined\r\n      options = defaults({}, options, settings);\r\n\r\n      var imports = defaults({}, options.imports, settings.imports),\r\n          importsKeys = keys(imports),\r\n          importsValues = values(imports);\r\n\r\n      var isEvaluating,\r\n          index = 0,\r\n          interpolate = options.interpolate || reNoMatch,\r\n          source = \"__p += '\";\r\n\r\n      // compile the regexp to match each delimiter\r\n      var reDelimiters = RegExp(\r\n        (options.escape || reNoMatch).source + '|' +\r\n        interpolate.source + '|' +\r\n        (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + '|' +\r\n        (options.evaluate || reNoMatch).source + '|$'\r\n      , 'g');\r\n\r\n      text.replace(reDelimiters, function(match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) {\r\n        interpolateValue || (interpolateValue = esTemplateValue);\r\n\r\n        // escape characters that cannot be included in string literals\r\n        source += text.slice(index, offset).replace(reUnescapedString, escapeStringChar);\r\n\r\n        // replace delimiters with snippets\r\n        if (escapeValue) {\r\n          source += \"' +\\n__e(\" + escapeValue + \") +\\n'\";\r\n        }\r\n        if (evaluateValue) {\r\n          isEvaluating = true;\r\n          source += \"';\\n\" + evaluateValue + \";\\n__p += '\";\r\n        }\r\n        if (interpolateValue) {\r\n          source += \"' +\\n((__t = (\" + interpolateValue + \")) == null ? '' : __t) +\\n'\";\r\n        }\r\n        index = offset + match.length;\r\n\r\n        // the JS engine embedded in Adobe products requires returning the `match`\r\n        // string in order to produce the correct `offset` value\r\n        return match;\r\n      });\r\n\r\n      source += \"';\\n\";\r\n\r\n      // if `variable` is not specified, wrap a with-statement around the generated\r\n      // code to add the data object to the top of the scope chain\r\n      var variable = options.variable,\r\n          hasVariable = variable;\r\n\r\n      if (!hasVariable) {\r\n        variable = 'obj';\r\n        source = 'with (' + variable + ') {\\n' + source + '\\n}\\n';\r\n      }\r\n      // cleanup code by stripping empty strings\r\n      source = (isEvaluating ? source.replace(reEmptyStringLeading, '') : source)\r\n        .replace(reEmptyStringMiddle, '$1')\r\n        .replace(reEmptyStringTrailing, '$1;');\r\n\r\n      // frame code as the function body\r\n      source = 'function(' + variable + ') {\\n' +\r\n        (hasVariable ? '' : variable + ' || (' + variable + ' = {});\\n') +\r\n        \"var __t, __p = '', __e = _.escape\" +\r\n        (isEvaluating\r\n          ? ', __j = Array.prototype.join;\\n' +\r\n            \"function print() { __p += __j.call(arguments, '') }\\n\"\r\n          : ';\\n'\r\n        ) +\r\n        source +\r\n        'return __p\\n}';\r\n\r\n      // Use a sourceURL for easier debugging.\r\n      // http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl\r\n      var sourceURL = '\\n/*\\n//# sourceURL=' + (options.sourceURL || '/lodash/template/source[' + (templateCounter++) + ']') + '\\n*/';\r\n\r\n      try {\r\n        var result = Function(importsKeys, 'return ' + source + sourceURL).apply(undefined, importsValues);\r\n      } catch(e) {\r\n        e.source = source;\r\n        throw e;\r\n      }\r\n      if (data) {\r\n        return result(data);\r\n      }\r\n      // provide the compiled function's source by its `toString` method, in\r\n      // supported environments, or the `source` property as a convenience for\r\n      // inlining compiled templates during the build process\r\n      result.source = source;\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Executes the callback `n` times, returning an array of the results\r\n     * of each callback execution. The callback is bound to `thisArg` and invoked\r\n     * with one argument; (index).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {number} n The number of times to execute the callback.\r\n     * @param {Function} callback The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns an array of the results of each `callback` execution.\r\n     * @example\r\n     *\r\n     * var diceRolls = _.times(3, _.partial(_.random, 1, 6));\r\n     * // => [3, 6, 4]\r\n     *\r\n     * _.times(3, function(n) { mage.castSpell(n); });\r\n     * // => calls `mage.castSpell(n)` three times, passing `n` of `0`, `1`, and `2` respectively\r\n     *\r\n     * _.times(3, function(n) { this.cast(n); }, mage);\r\n     * // => also calls `mage.castSpell(n)` three times\r\n     */\r\n    function times(n, callback, thisArg) {\r\n      n = (n = +n) > -1 ? n : 0;\r\n      var index = -1,\r\n          result = Array(n);\r\n\r\n      callback = baseCreateCallback(callback, thisArg, 1);\r\n      while (++index < n) {\r\n        result[index] = callback(index);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The inverse of `_.escape` this method converts the HTML entities\r\n     * `&amp;`, `&lt;`, `&gt;`, `&quot;`, and `&#39;` in `string` to their\r\n     * corresponding characters.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} string The string to unescape.\r\n     * @returns {string} Returns the unescaped string.\r\n     * @example\r\n     *\r\n     * _.unescape('Fred, Barney &amp; Pebbles');\r\n     * // => 'Fred, Barney & Pebbles'\r\n     */\r\n    function unescape(string) {\r\n      return string == null ? '' : String(string).replace(reEscapedHtml, unescapeHtmlChar);\r\n    }\r\n\r\n    /**\r\n     * Generates a unique ID. If `prefix` is provided the ID will be appended to it.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} [prefix] The value to prefix the ID with.\r\n     * @returns {string} Returns the unique ID.\r\n     * @example\r\n     *\r\n     * _.uniqueId('contact_');\r\n     * // => 'contact_104'\r\n     *\r\n     * _.uniqueId();\r\n     * // => '105'\r\n     */\r\n    function uniqueId(prefix) {\r\n      var id = ++idCounter;\r\n      return String(prefix == null ? '' : prefix) + id;\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates a `lodash` object that wraps the given value with explicit\r\n     * method chaining enabled.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Chaining\r\n     * @param {*} value The value to wrap.\r\n     * @returns {Object} Returns the wrapper object.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36 },\r\n     *   { 'name': 'fred',    'age': 40 },\r\n     *   { 'name': 'pebbles', 'age': 1 }\r\n     * ];\r\n     *\r\n     * var youngest = _.chain(characters)\r\n     *     .sortBy('age')\r\n     *     .map(function(chr) { return chr.name + ' is ' + chr.age; })\r\n     *     .first()\r\n     *     .value();\r\n     * // => 'pebbles is 1'\r\n     */\r\n    function chain(value) {\r\n      value = new lodashWrapper(value);\r\n      value.__chain__ = true;\r\n      return value;\r\n    }\r\n\r\n    /**\r\n     * Invokes `interceptor` with the `value` as the first argument and then\r\n     * returns `value`. The purpose of this method is to \"tap into\" a method\r\n     * chain in order to perform operations on intermediate results within\r\n     * the chain.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Chaining\r\n     * @param {*} value The value to provide to `interceptor`.\r\n     * @param {Function} interceptor The function to invoke.\r\n     * @returns {*} Returns `value`.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3, 4])\r\n     *  .tap(function(array) { array.pop(); })\r\n     *  .reverse()\r\n     *  .value();\r\n     * // => [3, 2, 1]\r\n     */\r\n    function tap(value, interceptor) {\r\n      interceptor(value);\r\n      return value;\r\n    }\r\n\r\n    /**\r\n     * Enables explicit method chaining on the wrapper object.\r\n     *\r\n     * @name chain\r\n     * @memberOf _\r\n     * @category Chaining\r\n     * @returns {*} Returns the wrapper object.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * // without explicit chaining\r\n     * _(characters).first();\r\n     * // => { 'name': 'barney', 'age': 36 }\r\n     *\r\n     * // with explicit chaining\r\n     * _(characters).chain()\r\n     *   .first()\r\n     *   .pick('age')\r\n     *   .value();\r\n     * // => { 'age': 36 }\r\n     */\r\n    function wrapperChain() {\r\n      this.__chain__ = true;\r\n      return this;\r\n    }\r\n\r\n    /**\r\n     * Produces the `toString` result of the wrapped value.\r\n     *\r\n     * @name toString\r\n     * @memberOf _\r\n     * @category Chaining\r\n     * @returns {string} Returns the string result.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3]).toString();\r\n     * // => '1,2,3'\r\n     */\r\n    function wrapperToString() {\r\n      return String(this.__wrapped__);\r\n    }\r\n\r\n    /**\r\n     * Extracts the wrapped value.\r\n     *\r\n     * @name valueOf\r\n     * @memberOf _\r\n     * @alias value\r\n     * @category Chaining\r\n     * @returns {*} Returns the wrapped value.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3]).valueOf();\r\n     * // => [1, 2, 3]\r\n     */\r\n    function wrapperValueOf() {\r\n      return this.__wrapped__;\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    // add functions that return wrapped values when chaining\r\n    lodash.after = after;\r\n    lodash.assign = assign;\r\n    lodash.at = at;\r\n    lodash.bind = bind;\r\n    lodash.bindAll = bindAll;\r\n    lodash.bindKey = bindKey;\r\n    lodash.chain = chain;\r\n    lodash.compact = compact;\r\n    lodash.compose = compose;\r\n    lodash.constant = constant;\r\n    lodash.countBy = countBy;\r\n    lodash.create = create;\r\n    lodash.createCallback = createCallback;\r\n    lodash.curry = curry;\r\n    lodash.debounce = debounce;\r\n    lodash.defaults = defaults;\r\n    lodash.defer = defer;\r\n    lodash.delay = delay;\r\n    lodash.difference = difference;\r\n    lodash.filter = filter;\r\n    lodash.flatten = flatten;\r\n    lodash.forEach = forEach;\r\n    lodash.forEachRight = forEachRight;\r\n    lodash.forIn = forIn;\r\n    lodash.forInRight = forInRight;\r\n    lodash.forOwn = forOwn;\r\n    lodash.forOwnRight = forOwnRight;\r\n    lodash.functions = functions;\r\n    lodash.groupBy = groupBy;\r\n    lodash.indexBy = indexBy;\r\n    lodash.initial = initial;\r\n    lodash.intersection = intersection;\r\n    lodash.invert = invert;\r\n    lodash.invoke = invoke;\r\n    lodash.keys = keys;\r\n    lodash.map = map;\r\n    lodash.mapValues = mapValues;\r\n    lodash.max = max;\r\n    lodash.memoize = memoize;\r\n    lodash.merge = merge;\r\n    lodash.min = min;\r\n    lodash.omit = omit;\r\n    lodash.once = once;\r\n    lodash.pairs = pairs;\r\n    lodash.partial = partial;\r\n    lodash.partialRight = partialRight;\r\n    lodash.pick = pick;\r\n    lodash.pluck = pluck;\r\n    lodash.property = property;\r\n    lodash.pull = pull;\r\n    lodash.range = range;\r\n    lodash.reject = reject;\r\n    lodash.remove = remove;\r\n    lodash.rest = rest;\r\n    lodash.shuffle = shuffle;\r\n    lodash.sortBy = sortBy;\r\n    lodash.tap = tap;\r\n    lodash.throttle = throttle;\r\n    lodash.times = times;\r\n    lodash.toArray = toArray;\r\n    lodash.transform = transform;\r\n    lodash.union = union;\r\n    lodash.uniq = uniq;\r\n    lodash.values = values;\r\n    lodash.where = where;\r\n    lodash.without = without;\r\n    lodash.wrap = wrap;\r\n    lodash.xor = xor;\r\n    lodash.zip = zip;\r\n    lodash.zipObject = zipObject;\r\n\r\n    // add aliases\r\n    lodash.collect = map;\r\n    lodash.drop = rest;\r\n    lodash.each = forEach;\r\n    lodash.eachRight = forEachRight;\r\n    lodash.extend = assign;\r\n    lodash.methods = functions;\r\n    lodash.object = zipObject;\r\n    lodash.select = filter;\r\n    lodash.tail = rest;\r\n    lodash.unique = uniq;\r\n    lodash.unzip = zip;\r\n\r\n    // add functions to `lodash.prototype`\r\n    mixin(lodash);\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    // add functions that return unwrapped values when chaining\r\n    lodash.clone = clone;\r\n    lodash.cloneDeep = cloneDeep;\r\n    lodash.contains = contains;\r\n    lodash.escape = escape;\r\n    lodash.every = every;\r\n    lodash.find = find;\r\n    lodash.findIndex = findIndex;\r\n    lodash.findKey = findKey;\r\n    lodash.findLast = findLast;\r\n    lodash.findLastIndex = findLastIndex;\r\n    lodash.findLastKey = findLastKey;\r\n    lodash.has = has;\r\n    lodash.identity = identity;\r\n    lodash.indexOf = indexOf;\r\n    lodash.isArguments = isArguments;\r\n    lodash.isArray = isArray;\r\n    lodash.isBoolean = isBoolean;\r\n    lodash.isDate = isDate;\r\n    lodash.isElement = isElement;\r\n    lodash.isEmpty = isEmpty;\r\n    lodash.isEqual = isEqual;\r\n    lodash.isFinite = isFinite;\r\n    lodash.isFunction = isFunction;\r\n    lodash.isNaN = isNaN;\r\n    lodash.isNull = isNull;\r\n    lodash.isNumber = isNumber;\r\n    lodash.isObject = isObject;\r\n    lodash.isPlainObject = isPlainObject;\r\n    lodash.isRegExp = isRegExp;\r\n    lodash.isString = isString;\r\n    lodash.isUndefined = isUndefined;\r\n    lodash.lastIndexOf = lastIndexOf;\r\n    lodash.mixin = mixin;\r\n    lodash.noConflict = noConflict;\r\n    lodash.noop = noop;\r\n    lodash.now = now;\r\n    lodash.parseInt = parseInt;\r\n    lodash.random = random;\r\n    lodash.reduce = reduce;\r\n    lodash.reduceRight = reduceRight;\r\n    lodash.result = result;\r\n    lodash.runInContext = runInContext;\r\n    lodash.size = size;\r\n    lodash.some = some;\r\n    lodash.sortedIndex = sortedIndex;\r\n    lodash.template = template;\r\n    lodash.unescape = unescape;\r\n    lodash.uniqueId = uniqueId;\r\n\r\n    // add aliases\r\n    lodash.all = every;\r\n    lodash.any = some;\r\n    lodash.detect = find;\r\n    lodash.findWhere = find;\r\n    lodash.foldl = reduce;\r\n    lodash.foldr = reduceRight;\r\n    lodash.include = contains;\r\n    lodash.inject = reduce;\r\n\r\n    mixin(function() {\r\n      var source = {}\r\n      forOwn(lodash, function(func, methodName) {\r\n        if (!lodash.prototype[methodName]) {\r\n          source[methodName] = func;\r\n        }\r\n      });\r\n      return source;\r\n    }(), false);\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    // add functions capable of returning wrapped and unwrapped values when chaining\r\n    lodash.first = first;\r\n    lodash.last = last;\r\n    lodash.sample = sample;\r\n\r\n    // add aliases\r\n    lodash.take = first;\r\n    lodash.head = first;\r\n\r\n    forOwn(lodash, function(func, methodName) {\r\n      var callbackable = methodName !== 'sample';\r\n      if (!lodash.prototype[methodName]) {\r\n        lodash.prototype[methodName]= function(n, guard) {\r\n          var chainAll = this.__chain__,\r\n              result = func(this.__wrapped__, n, guard);\r\n\r\n          return !chainAll && (n == null || (guard && !(callbackable && typeof n == 'function')))\r\n            ? result\r\n            : new lodashWrapper(result, chainAll);\r\n        };\r\n      }\r\n    });\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * The semantic version number.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type string\r\n     */\r\n    lodash.VERSION = '2.4.1';\r\n\r\n    // add \"Chaining\" functions to the wrapper\r\n    lodash.prototype.chain = wrapperChain;\r\n    lodash.prototype.toString = wrapperToString;\r\n    lodash.prototype.value = wrapperValueOf;\r\n    lodash.prototype.valueOf = wrapperValueOf;\r\n\r\n    // add `Array` functions that return unwrapped values\r\n    forEach(['join', 'pop', 'shift'], function(methodName) {\r\n      var func = arrayRef[methodName];\r\n      lodash.prototype[methodName] = function() {\r\n        var chainAll = this.__chain__,\r\n            result = func.apply(this.__wrapped__, arguments);\r\n\r\n        return chainAll\r\n          ? new lodashWrapper(result, chainAll)\r\n          : result;\r\n      };\r\n    });\r\n\r\n    // add `Array` functions that return the existing wrapped value\r\n    forEach(['push', 'reverse', 'sort', 'unshift'], function(methodName) {\r\n      var func = arrayRef[methodName];\r\n      lodash.prototype[methodName] = function() {\r\n        func.apply(this.__wrapped__, arguments);\r\n        return this;\r\n      };\r\n    });\r\n\r\n    // add `Array` functions that return new wrapped values\r\n    forEach(['concat', 'slice', 'splice'], function(methodName) {\r\n      var func = arrayRef[methodName];\r\n      lodash.prototype[methodName] = function() {\r\n        return new lodashWrapper(func.apply(this.__wrapped__, arguments), this.__chain__);\r\n      };\r\n    });\r\n\r\n    return lodash;\r\n  }\r\n\r\n  /*--------------------------------------------------------------------------*/\r\n\r\n  // expose Lo-Dash\r\n  var _ = runInContext();\r\n\r\n  // some AMD build optimizers like r.js check for condition patterns like the following:\r\n  if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {\r\n    // Expose Lo-Dash to the global object even when an AMD loader is present in\r\n    // case Lo-Dash is loaded with a RequireJS shim config.\r\n    // See http://requirejs.org/docs/api.html#config-shim\r\n    root._ = _;\r\n\r\n    // define as an anonymous module so, through path mapping, it can be\r\n    // referenced as the \"underscore\" module\r\n    define(function() {\r\n      return _;\r\n    });\r\n  }\r\n  // check for `exports` after `define` in case a build optimizer adds an `exports` object\r\n  else if (freeExports && freeModule) {\r\n    // in Node.js or RingoJS\r\n    if (moduleExports) {\r\n      (freeModule.exports = _)._ = _;\r\n    }\r\n    // in Narwhal or Rhino -require\r\n    else {\r\n      freeExports._ = _;\r\n    }\r\n  }\r\n  else {\r\n    // in a browser or Rhino\r\n    root._ = _;\r\n  }\r\n}.call(this));\r\n\r\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\r\n},{}]},{},[1])(1)\r\n});\n/**\r\n * Visualize span annotations as a tree\r\n * using Dagre.\r\n *\r\n * This should be lazy loaded!\r\n */\r\n\r\n\r\ndefine('match/treehierarchy',['lib/dagre'], function (dagre) {\r\n\r\n  const d = document;\r\n  const svgNS = \"http://www.w3.org/2000/svg\";\r\n  const _TermRE = new RegExp(\"^(?:([^\\/]+?)\\/)?([^:]+?):(.+?)$\");\r\n\r\n  // Node size\r\n  var WIDTH  = 55, HEIGHT = 20, LINEHEIGHT = 14;\r\n\r\n  // Create path for node connections \r\n  function _line (src, target) {\r\n    const x1 = src.x,\r\n          y1 = src.y,\r\n          x2 = target.x,\r\n          y2 = target.y - target.height / 2;\r\n\r\n    // c 0,0 -10,0\r\n    return 'M ' + x1 + ',' + y1 + ' ' + \r\n      'C ' + x1 + ',' + y1 + ' ' + \r\n      x2 + ',' + (y2 - (y2 - y1) / 2)  + ' ' + \r\n      x2 + ',' + y2;\r\n  };\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new tree visualization based\r\n     * on a match snippet.\r\n     */\r\n    create : function (snippet) {\r\n      return Object.create(this).\r\n        _init(snippet);\r\n    },\r\n\r\n\r\n    // Initialize the tree based on a snippet.\r\n    _init : function (snippet) {\r\n      this._next = new Number(0);\r\n      \r\n      // Create html for traversal\r\n      let html = d.createElement(\"div\");\r\n      html.innerHTML = snippet;\r\n\r\n      const g = new dagre.graphlib.Graph({\r\n        \"directed\" : true \r\n      });\r\n\r\n      g.setGraph({\r\n        \"nodesep\" : 35,\r\n        \"ranksep\" : 15,\r\n        \"marginx\" : 40,\r\n        \"marginy\" : 10\r\n      });\r\n      g.setDefaultEdgeLabel({});\r\n\r\n      this._graph = g;\r\n      \r\n      // This is a new root\r\n      this._addNode(\r\n        this._next++,\r\n        { \"class\" : \"root\" }\r\n      );\r\n      \r\n      // Parse nodes from root\r\n      this._parse(0, html.childNodes, undefined);\r\n\r\n      // Root node has only one child - remove\r\n      if (g.outEdges(0).length === 1)\r\n        g.removeNode(0);\r\n\r\n      html = undefined;\r\n      return this;\r\n    },\r\n\r\n\r\n    _c : function (tag) {\r\n      return d.createElementNS(svgNS, tag);\r\n    },\r\n    \r\n\r\n    /**\r\n     * The number of nodes in the tree.\r\n     */\r\n    nodes : function () {\r\n      return this._next;\r\n    },\r\n\r\n\r\n    // Add new node to graph\r\n    _addNode : function (id, obj) {\r\n      obj[\"width\"]  = WIDTH;\r\n      obj[\"height\"] = HEIGHT;\r\n      this._graph.setNode(id, obj)\r\n      return obj;\r\n    },\r\n    \r\n\r\n    // Add new edge to graph\r\n    _addEdge : function (src, target) {\r\n      this._graph.setEdge(src, target);\r\n    },\r\n    \r\n\r\n    // Remove foundry and layer for labels\r\n    _clean : function (title) {\r\n      return title.replace(_TermRE, \"$3\");\r\n    },\r\n\r\n    \r\n    // Parse the snippet\r\n    _parse : function (parent, children, mark) {\r\n      children.forEach(function(c) {\r\n\r\n        // Element node\r\n        if (c.nodeType == 1) {\r\n\r\n          // Get title from html\r\n          if (c.getAttribute(\"title\")) {\r\n\r\n            // Add child node\r\n            const id = this._next++;\r\n\r\n            const obj = this._addNode(id, {\r\n              \"class\" : \"middle\",\r\n              \"label\" : this._clean(c.getAttribute(\"title\"))\r\n            });\r\n            \r\n            if (mark !== undefined) {\r\n              obj.class += ' mark';\r\n            };\r\n            \r\n            this._addEdge(parent, id);\r\n\r\n            // Check for next level\r\n            if (c.hasChildNodes())\r\n              this._parse(id, c.childNodes, mark);\r\n          }\r\n\r\n          // Step further\r\n          else if (c.hasChildNodes()) {\r\n\r\n            this._parse(\r\n              parent,\r\n              c.childNodes,\r\n              c.tagName === 'MARK' ? true : mark\r\n            );\r\n          };\r\n        }\r\n\r\n        // Text node\r\n        else if (c.nodeType == 3)\r\n\r\n          if (c.nodeValue.match(/[-a-z0-9]/i)) {\r\n            \r\n            // Add child node\r\n            const id = this._next++;\r\n            this._addNode(id, {\r\n              \"class\" : \"leaf\",\r\n              \"label\" : c.nodeValue\r\n            });\r\n\r\n            this._addEdge(parent, id);\r\n          };\r\n      }, this);\r\n      return this;\r\n    },\r\n\r\n\r\n    // Dummy method to be compatible with relTree\r\n    show : function () {\r\n      return;\r\n    },\r\n\r\n\r\n    /**\r\n     * Center the viewport of the canvas\r\n     * TODO:\r\n     *   This is identical to relations\r\n     */\r\n    center : function () {\r\n      if (this._el === undefined)\r\n        return;\r\n\r\n      const treeDiv = this._el.parentNode;\r\n      const cWidth = parseFloat(window.getComputedStyle(this._el).width);\r\n      const treeWidth = parseFloat(window.getComputedStyle(treeDiv).width);\r\n\r\n      // Reposition:\r\n      if (cWidth > treeWidth) {\r\n        treeDiv.scrollLeft = (cWidth - treeWidth) / 2;\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Create svg and serialize as base64\r\n     */\r\n    toBase64 : function () {\r\n\r\n      // First clone element\r\n      const svgWrapper = d.createElement('div')\r\n      svgWrapper.innerHTML = this.element().outerHTML;\r\n\r\n      const svg = svgWrapper.firstChild;\r\n      const style = this._c('style');\r\n\r\n      svg.getElementsByTagName('defs')[0].appendChild(style);\r\n\r\n      style.innerHTML = \r\n\t      'path.edge '  +            '{ stroke: black; stroke-width: 2pt; fill: none; }' +\r\n        'g.root rect.empty,' +\r\n        'g.middle rect' +          '{ stroke: black; stroke-width: 2pt; fill: #bbb; }' +\r\n        'g.leaf > rect ' +         '{ display: none }' +\r\n        'g > text > tspan ' +      '{ text-anchor: middle; font-size: 9pt }' +\r\n        'g.leaf > text > tspan ' + '{ font-size: 10pt; overflow: visible; }';\r\n\r\n      return btoa(unescape(encodeURIComponent(svg.outerHTML)).replace(/&nbsp;/g, ' '));\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the dom element of the tree view.\r\n     */\r\n    element : function () {\r\n\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      const g = this._graph;\r\n      dagre.layout(g);\r\n      \r\n      const canvas = this._c('svg');\r\n      this._el = canvas;\r\n\r\n      canvas.appendChild(this._c('defs'));\r\n\r\n      // Create edges\r\n      const that = this;\r\n\r\n      let src, target, p;\r\n\r\n      g.edges().forEach(\r\n        function (e) {\r\n          src = g.node(e.v);\r\n          target = g.node(e.w);\r\n          p = that._c('path');\r\n          p.setAttributeNS(null, \"d\", _line(src, target));\r\n          p.classList.add('edge');\r\n          canvas.appendChild(p);\r\n        }\r\n      );\r\n      \r\n      let height = g.graph().height;\r\n\r\n      // Create nodes\r\n      g.nodes().forEach(\r\n        function (v) {\r\n          v = g.node(v);\r\n          const group = that._c('g');\r\n          group.setAttribute('class', v.class);\r\n          \r\n          // Add node box\r\n          const rect = group.appendChild(that._c('rect'));\r\n          rect.setAttribute('x', v.x - v.width / 2);\r\n          rect.setAttribute('y', v.y - v.height / 2);\r\n          rect.setAttribute('rx', 5);\r\n          rect.setAttribute('ry', 5);\r\n          rect.setAttribute('width', v.width);\r\n          rect.setAttribute('height', v.height);\r\n\r\n          if (v.class === 'root' && v.label === undefined) {\r\n            rect.setAttribute('width', v.height);\r\n            rect.setAttribute('x', v.x - v.height / 2);\r\n            rect.setAttribute('class', 'empty');\r\n          };\r\n\r\n          // Add label\r\n          if (v.label !== undefined) {\r\n            const text = group.appendChild(that._c('text'));\r\n            let y = v.y - v.height / 2;\r\n            text.setAttribute('y', y);\r\n            text.setAttribute(\r\n              'transform',\r\n              'translate(' + v.width/2 + ',' + ((v.height / 2) + 5) + ')'\r\n            );\r\n\r\n            const vLabel = v.label.replace(/&nbsp;/g, \" \")\r\n                  .replace(/&amp;/g, '&')\r\n                  .replace(/&lt;/g, '<')\r\n                  .replace(/&gt;/g, '>');\r\n            \r\n            if (v.class === \"leaf\") {\r\n              text.setAttribute('title', vLabel);\r\n\r\n              let n = 0;\r\n              let tspan;\r\n              vLabel.split(\" \").forEach(function(p) {\r\n                if (p.length === 0)\r\n                  return;\r\n\r\n                tspan = that._c('tspan');\r\n                tspan.appendChild(d.createTextNode(p));\r\n\r\n                if (n !== 0)\r\n                  tspan.setAttribute('dy', LINEHEIGHT + 'pt');\r\n                else\r\n                  n = 1;\r\n\r\n                tspan.setAttribute('x', v.x - v.width / 2);\r\n                y += LINEHEIGHT;\r\n                text.appendChild(tspan);\r\n              });\r\n\r\n              y += LINEHEIGHT;\r\n\r\n              // The text is below the canvas - readjust the height!\r\n              if (y > height)\r\n                height = y;\r\n            }\r\n            else {\r\n              const tspan = that._c('tspan');\r\n              tspan.appendChild(d.createTextNode(vLabel));\r\n              tspan.setAttribute('x', v.x - v.width / 2);\r\n              text.appendChild(tspan);\r\n            };\r\n          };\r\n          canvas.appendChild(group);\r\n        }\r\n      );\r\n\r\n      canvas.setAttribute('width', g.graph().width);\r\n      canvas.setAttribute('height', height);\r\n      return this._el;\r\n    },\r\n    \r\n    downloadLink : function () {\r\n      const a = d.createElement('a');\r\n      a.setAttribute('href-lang', 'image/svg+xml');\r\n      a.setAttribute('href', 'data:image/svg+xml;base64,' + this.toBase64());\r\n      a.setAttribute('download', 'tree.svg');\r\n      a.target = '_blank';\r\n      a.setAttribute('rel', 'noopener noreferrer');\r\n      return a;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Parse a relational tree and visualize using arcs.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('match/treearc',[], function () {\r\n\r\n  const svgNS = \"http://www.w3.org/2000/svg\";\r\n  const _TermRE = new RegExp(\"^(?:([^\\/]+?)\\/)?([^:]+?):(.+?)$\");\r\n  const d = document;\r\n\r\n  return {\r\n    create : function (snippet) {\r\n      return Object.create(this)._init(snippet);\r\n    },\r\n\r\n    // Initialize the state of the object\r\n    _init : function (snippet) {\r\n\r\n      const t = this;\r\n\r\n      // Predefine some values\r\n      t._tokens  = [];\r\n      t._arcs    = [];\r\n      t._tokenElements = [];\r\n      t._y = 0;\r\n      t._currentInFocus = undefined;\r\n\r\n      // Some configurations\r\n      t.maxArc      = 200; // maximum height of the bezier control point\r\n      t.overlapDiff = 40;  // Difference on overlaps and minimum height for self-refernces\r\n      t.arcDiff     = 15;\r\n      t.anchorDiff  = 8;\r\n      t.anchorStart = 15;\r\n      t.tokenSep    = 30;\r\n      t.xPadding    = 10;\r\n      t.yPadding    = 5;\r\n\r\n      // No snippet to process\r\n      if (snippet == undefined || snippet == null)\r\n        return t;\r\n\r\n      // Parse the snippet\r\n      const html = d.createElement(\"div\");\r\n      html.innerHTML = snippet;\r\n\r\n      // Establish temporary parsing memory\r\n      t.temp = {\r\n        target : {}, // Remember the map id => pos        \r\n        edges  : [], // Remember edge definitions\r\n        pos    : 0   // Keep track of the current token position\r\n      };\r\n\r\n      // Start parsing from root\r\n      t._parse(0, html.childNodes, undefined);\r\n\r\n      // Establish edge list\r\n      const targetMap = t.temp['target'];\r\n      const edges = t.temp['edges'];\r\n\r\n      let targetID, target, relation;\r\n      \r\n      // Iterate over edge lists\r\n      // TODO:\r\n      //   Support spans for anchors!\r\n      edges.forEach(function(edge) {\r\n\r\n        // Check the target identifier\r\n        targetID = edge.targetID;\r\n        target = targetMap[targetID];\r\n\r\n        if (target != undefined) {\r\n\r\n          // Check if the source is a span anchor\r\n          /*\r\n          var start = edge.srcStart;\r\n          if (start !== edge.srcEnd) {\r\n            start = [start, edge.srcEnd];\r\n          };\r\n          */\r\n          \r\n          // Add relation\r\n          relation = {\r\n            start : [edge.srcStart, edge.srcEnd],\r\n            end : target,\r\n            direction : 'uni',\r\n            label : edge.label\r\n          };\r\n          // console.log(relation);\r\n          this.addRel(relation);\r\n        };\r\n      }, t);\r\n\r\n      // Reset parsing memory\r\n      delete t[\"temp\"];\r\n\r\n      return this;\r\n    },\r\n\r\n    // Parse a node of the tree snippet\r\n    _parse : function (parent, children, mark) {\r\n\r\n      // Iterate over all child nodes\r\n      Array.from(children).forEach(function(c) {\r\n\r\n        // Element node\r\n        if (c.nodeType == 1) {\r\n\r\n          let xmlid, target, start, end;\r\n\r\n          // Node is an identifier\r\n          if (c.hasAttribute('xml:id')) {\r\n\r\n            // Remember that pos has this identifier\r\n            xmlid = c.getAttribute('xml:id');\r\n            // this.temp['target'][xmlid] =\r\n            start = this.temp['pos'];\r\n            end = this.temp['pos'];\r\n          }\r\n\r\n          // Node is a link\r\n          // Stricter: && c.hasAttribute('xlink:show')\r\n          else if (c.hasAttribute('xlink:href')) {\r\n\r\n            // Node is a continuation\r\n            if (c.getAttribute('xlink:show') == \"other\" &&\r\n                c.hasAttribute('data-action') &&\r\n                c.getAttribute('data-action') == \"join\"\r\n               ) {\r\n              xmlid = c.getAttribute('xlink:href').replace(/^#/, \"\");\r\n              start = this.temp['pos'];\r\n              end = this.temp['pos'];\r\n\r\n              // this.temp['target'][xmlid][1] = this.temp['pos'] -1;\r\n              // console.log(\"Here\");\r\n            }\r\n\r\n            // Node is a relation\r\n            // Stricter: c.getAttribute('xlink:show') == \"none\"\r\n            else {\r\n              let label;\r\n\r\n              // Get target id\r\n              target = c.getAttribute('xlink:href').replace(/^#/, \"\");\r\n\r\n              if (c.hasAttribute('xlink:title')) {\r\n                label = this._clean(c.getAttribute('xlink:title'));\r\n              };\r\n\r\n              // Remember the defined edge\r\n// WRONG!\r\n              var edge = {\r\n                label    : label,\r\n                srcStart : this.temp['pos'],\r\n                targetID : target\r\n              };\r\n\r\n              // TEMP: Hot-fix for root relations\r\n              if (!label.match(/--$/) && !label.match(/ROOT$/)) {\r\n                this.temp['edges'].push(edge);\r\n              };\r\n\r\n            };\r\n          };\r\n\r\n          // Go on with child nodes\r\n          if (c.hasChildNodes()) {\r\n            this._parse(0, c.childNodes, mark);\r\n          };\r\n\r\n\r\n          // The element is a defined anchor\r\n          if (xmlid !== undefined) {\r\n\r\n            // this.temp['target'][xmlid][1] = this.temp['pos'] -1;\r\n\r\n            // Element already defined\r\n            if (this.temp['target'][xmlid] !== undefined) {\r\n              const newtarget = this.temp['target'][xmlid];\r\n              end = this.temp['pos'] - 1;\r\n              newtarget[0] = start < newtarget[0] ? start : newtarget[0];\r\n              newtarget[1] = end > newtarget[1] ? end : newtarget[1];\r\n            }\r\n\r\n            // Element not yet defined\r\n            else {\r\n              end = this.temp['pos'] - 1;\r\n              this.temp['target'][xmlid] = [start, end];\r\n            };\r\n\r\n            /*\r\n            console.log('Target ' + xmlid + ' spans from ' +\r\n                        this.temp['target'][xmlid][0] +\r\n                        ' to ' +\r\n                        this.temp['target'][xmlid][1]\r\n                       );\r\n            */\r\n            xmlid = undefined;\r\n          }\r\n\r\n          // Current element describes an arc\r\n          else if (target !== undefined) {\r\n\r\n            // TODO: This does not work yet!\r\n            edge[\"srcEnd\"] = this.temp['pos'] -1;\r\n            // console.log('Here');\r\n\r\n            /*\r\n            console.log('Source spans from ' +\r\n                        edge[\"srcStart\"] +\r\n                        ' to ' +\r\n                        edge[\"srcEnd\"]\r\n                       );\r\n            */\r\n            target = undefined;\r\n          };\r\n        }\r\n\r\n        // Text node\r\n        else if (c.nodeType == 3) {\r\n\r\n          // Check, if there is a non-whitespace token\r\n          if (c.nodeValue !== undefined) {\r\n\r\n            const str = c.nodeValue.trim();\r\n\r\n            if (str !== undefined && str.length > 0) {\r\n\r\n              // Add token to token list\r\n              this.addToken(str);\r\n\r\n              // Move token position\r\n              this.temp['pos']++;\r\n            };\r\n          };\r\n        };\r\n      }, this);\r\n\r\n      // Todo: define edges here!\r\n    },\r\n\r\n    \r\n    // Remove foundry and layer for labels\r\n    _clean : function (title) {\r\n      return title.replace(_TermRE, \"$3\");\r\n    },\r\n\r\n    \r\n    // Return the number of leaf nodes\r\n    // (not necessarily part of a relation).\r\n    // Consecutive nodes that are not part of any\r\n    // relation are summarized in one node.\r\n    size : function () {\r\n      return this._tokens.length;\r\n    },\r\n\r\n    \r\n    // This is a shorthand for SVG element creation\r\n    _c : function (tag) {\r\n      return d.createElementNS(svgNS, tag);\r\n    },\r\n\r\n\r\n    // Get bounding box - with workaround for text nodes\r\n    _rect : function (node) {\r\n      if (node.tagName == \"tspan\" && !navigator.userAgent.match(/Edge/)) {\r\n        const range = d.createRange();\r\n        range.selectNode(node);\r\n        const rect = range.getBoundingClientRect();\r\n        range.detach();\r\n        return rect;\r\n      };\r\n      return node.getBoundingClientRect();\r\n    },\r\n\r\n\r\n    // Returns the center point of the requesting token\r\n    _tokenPoint : function (node) {\r\n\t    const box = this._rect(node);\r\n\t    return box.left + (box.width / 2);\r\n    },\r\n\r\n\r\n    // Draws an anchor\r\n    _drawAnchor : function (anchor) {\r\n\r\n      // Calculate the span of the first and last token, the anchor spans\r\n      const firstBox = this._rect(this._tokenElements[anchor.first]);\r\n      const lastBox  = this._rect(this._tokenElements[anchor.last]);\r\n\t\r\n      const y = this._y + (anchor.overlaps * this.anchorDiff) - this.anchorStart;\r\n      const l = this._c('path');\r\n      \r\n\t    this._arcsElement.appendChild(l);\r\n\r\n      const pathStr = \"M \" +\r\n          (firstBox.left - this.offsetLeft) +\r\n          \",\" +\r\n          y +\r\n          \" L \" +\r\n          (lastBox.right - this.offsetLeft) +\r\n          \",\" + y;\r\n\r\n      l.setAttribute(\"d\", pathStr);\r\n      l.setAttribute(\"class\", \"anchor\");\r\n      anchor.element = l;\r\n      anchor.y = y;\r\n      return l;\r\n    },\r\n    \r\n\r\n    // Create an arc with an optional label\r\n    // Potentially needs a height parameter for stacks\r\n    _drawArc : function (arc) {\r\n\r\n      const t = this;\r\n      let startPos, endPos;\r\n      let startY = this._y;\r\n      let endY = this._y;\r\n\t\r\n      if (arc.startAnchor !== undefined) {\r\n        startPos = t._tokenPoint(arc.startAnchor.element);\r\n        startY = arc.startAnchor.y;\r\n      }\r\n      else {\r\n        startPos = t._tokenPoint(t._tokenElements[arc.first]);\r\n      };\r\n\r\n      if (arc.endAnchor !== undefined) {\r\n        endPos = t._tokenPoint(arc.endAnchor.element)\r\n        endY = arc.endAnchor.y;\r\n      }\r\n      else {\r\n        endPos = t._tokenPoint(t._tokenElements[arc.last]);\r\n      };\r\n\r\n      startPos -= t.offsetLeft;\r\n      endPos -= t.offsetLeft;\r\n\r\n\t    // Special treatment for self-references\r\n      var overlaps = arc.overlaps;\r\n      if (startPos == endPos) {\r\n        startPos -= t.overlapDiff / 3;\r\n        endPos   += t.overlapDiff / 3;\r\n        overlaps += .5;\r\n      };\r\n\r\n      const g = t._c(\"g\");\r\n      g.setAttribute(\"class\", \"arc\");\r\n      const p = g.appendChild(t._c(\"path\"));\r\n      p.setAttribute('class', 'edge');\r\n      \r\n      // Attach the new arc before drawing, so computed values are available\r\n      t._arcsElement.appendChild(g);\r\n\r\n      // Create arc\r\n      let middle = Math.abs(endPos - startPos) / 2;\r\n\r\n      // TODO:\r\n      //   take the number of tokens into account!\r\n      let cHeight = t.arcDiff + (overlaps * t.overlapDiff) + (middle / 2);\r\n\r\n      // Respect the maximum height\r\n      cHeight = cHeight < t.maxArc ? cHeight : t.maxArc;\r\n\r\n      var x = Math.min(startPos, endPos);\r\n\r\n      //var controlY = (startY + endY - cHeight);\r\n      let controlY = (endY - cHeight);\r\n      \r\n      const arcE = \"M \"+ startPos + \",\" + startY +\r\n          \" C \" + startPos + \",\" + controlY +\r\n          \" \" + endPos + \",\" + controlY +\r\n          \" \" + endPos + \",\" + endY;\r\n\r\n      p.setAttribute(\"d\", arcE);\r\n\r\n      if (arc.direction !== undefined) {\r\n        p.setAttribute(\"marker-end\", \"url(#arr)\");\r\n        if (arc.direction === 'bi') {\r\n          p.setAttribute(\"marker-start\", \"url(#arr)\");\r\n        };\r\n      };\r\n\r\n      if (arc.label === undefined)\r\n        return g;\r\n      \r\n      /*\r\n       * Calculate the top point of the arc for labeling using\r\n       * de Casteljau's algorithm, see e.g.\r\n       * http://blog.sklambert.com/finding-the-control-points-of-a-bezier-curve/\r\n       * of course simplified to symmetric arcs ...\r\n       */\r\n      // Interpolate one side of the control polygon\r\n      let middleY = (((startY + controlY) / 2) + controlY) / 2;\r\n\r\n      // Create a boxed label\r\n      const label = this._c(\"g\");\r\n      label.setAttribute(\"class\", \"label\");\r\n      t._labelsElement.appendChild(label);\r\n\r\n      // Set arc reference\r\n      label.arcRef = g;\r\n\r\n      const that = t;\r\n      label.addEventListener('mouseenter', function () {\r\n        that.inFocus(this);\r\n      });\r\n\r\n      const labelE = label.appendChild(t._c(\"text\"));\r\n      labelE.setAttribute(\"x\", x + middle);\r\n      labelE.setAttribute(\"y\", middleY + 3);\r\n      labelE.setAttribute(\"text-anchor\", \"middle\");\r\n      const textNode = d.createTextNode(arc.label);\r\n      labelE.appendChild(textNode);\r\n\r\n      const labelBox   = labelE.getBBox();\r\n\r\n      /*\r\n      if (!labelBox)\r\n        console.log(\"----\");\r\n      */\r\n      \r\n      const textWidth  = labelBox.width; // labelE.getComputedTextLength();\r\n      const textHeight = labelBox.height; // labelE.getComputedTextLength();\r\n\r\n      // Add box with padding to left and right\r\n      const labelR = label.insertBefore(t._c(\"rect\"), labelE);\r\n      const boxWidth = textWidth + 2 * t.xPadding;\r\n      labelR.setAttribute(\"x\", x + middle - (boxWidth / 2));\r\n      labelR.setAttribute(\"ry\", 5);\r\n      labelR.setAttribute(\"y\", labelBox.y - t.yPadding);\r\n      labelR.setAttribute(\"width\", boxWidth);\r\n      labelR.setAttribute(\"height\", textHeight + 2 * t.yPadding);\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the svg element\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      // Create svg\r\n      const svg = this._c(\"svg\");\r\n\r\n      window.addEventListener(\"resize\", function () {\r\n        // TODO:\r\n        //   Only if text-size changed!\r\n        // TODO:\r\n        //   This is currently untested\r\n        this.show();\r\n      }.bind(this));\r\n\r\n      // Define marker arrows\r\n      const defs = svg.appendChild(this._c(\"defs\"));\r\n      const marker = defs.appendChild(this._c(\"marker\"));\r\n      marker.setAttribute(\"refX\", 9);\r\n      marker.setAttribute(\"id\", \"arr\");\r\n      marker.setAttribute(\"orient\", \"auto-start-reverse\");\r\n      marker.setAttribute(\"markerUnits\",\"userSpaceOnUse\");\r\n\r\n      const arrow = this._c(\"path\");\r\n      arrow.setAttribute(\"transform\", \"scale(0.8)\");\r\n      arrow.setAttribute(\"d\", \"M 0,-5 0,5 10,0 Z\");\r\n      marker.appendChild(arrow);\r\n\r\n      this._el = svg;\r\n      return this._el;\r\n    },\r\n\r\n\r\n    // Add a relation with a start, an end,\r\n    // a direction value and an optional label text\r\n    addRel : function (rel) {\r\n      this._arcs.push(rel);\r\n      return this;\r\n    },\r\n\r\n\r\n    // Add a token to the list (this will mostly be a word)\r\n    addToken : function(token) {\r\n      this._tokens.push(token);\r\n      return this;\r\n    },\r\n\r\n\r\n    // Move label and arc in focus\r\n    inFocus : function (element) {\r\n      let cif;\r\n\r\n      if (this._currentInFocus) {\r\n\r\n        // Already in focus\r\n        if (this._currentInFocus === element)\r\n          return;\r\n\r\n        cif = this._currentInFocus;\r\n        cif.classList.remove('infocus');\r\n        cif.arcRef.classList.remove('infocus');\r\n      };\r\n\r\n      cif = this._currentInFocus = element;\r\n      this._labelsElement.appendChild(cif);\r\n      this._arcsElement.appendChild(cif.arcRef);\r\n      cif.classList.add('infocus');\r\n      cif.arcRef.classList.add('infocus');\r\n    },\r\n    \r\n\r\n    /*\r\n     * All arcs need to be sorted before shown,\r\n     * to avoid nesting.\r\n     */\r\n    _sortArcs : function () {\r\n\r\n      // TODO:\r\n      //   Keep in mind that the arcs may have long anchors!\r\n      //   1. Iterate over all arcs\r\n      //   2. Sort all multi\r\n      let anchors = {};\r\n      \r\n      // 1. Sort by length\r\n      // 2. Tag all spans with the number of overlaps before\r\n      //    a) Iterate over all spans\r\n      //    b) check the latest preceeding overlapping span (lpos)\r\n      //       -> not found: tag with 0\r\n      //       -> found: Add +1 to the level of the (lpos)\r\n      //    c) If the new tag is smaller than the previous element,\r\n      //       reorder\r\n\r\n      // Normalize start and end\r\n      const sortedArcs = this._arcs.map(function (v) {\r\n\r\n        // Check for long anchors\r\n        if (v.start instanceof Array) {\r\n\r\n          if (v.start[0] == v.start[1]) {\r\n            v.start = v.start[0];\r\n          }\r\n\r\n          else {\r\n          \r\n            const middle = Math.ceil(Math.abs(v.start[1] - v.start[0]) / 2) + v.start[0];\r\n\r\n            // Calculate signature to avoid multiple anchors\r\n            let anchorSig = \"#\" + v.start[0] + \"_\" + v.start[1];\r\n\r\n            // Reverse signature\r\n            if (v.start[0] > v.start[1]) {\r\n              anchorSig = \"#\" + v.start[1] + \"_\" + v.start[0];\r\n            };\r\n            \r\n            // Check if the anchor already exist\r\n            let anchor = anchors[anchorSig];\r\n            if (anchor === undefined) {\r\n              anchor = {\r\n                \"first\":   v.start[0],\r\n                \"last\" :   v.start[1],\r\n                \"length\" : v.start[1] - v.start[0]\r\n              };\r\n              anchors[anchorSig] = anchor;\r\n            };\r\n\r\n            v.startAnchor = anchor;\r\n\r\n            // Add to anchors list\r\n            v.start = middle;\r\n          };\r\n        };\r\n\r\n        if (v.end instanceof Array) {\r\n\r\n          if (v.end[0] == v.end[1]) {\r\n            v.end = v.end[0];\r\n          }\r\n\r\n          else {\r\n\r\n            const middle = Math.abs(v.end[0] - v.end[1]) + v.end[0];\r\n\r\n            // Calculate signature to avoid multiple anchors\r\n            let anchorSig = \"#\" + v.end[0] + \"_\" + v.end[1];\r\n\r\n            // Reverse signature\r\n            if (v.end[0] > v.end[1]) {\r\n              anchorSig = \"#\" + v.end[1] + \"_\" + v.end[0];\r\n            };\r\n\r\n            // Check if the anchor already exist\r\n            var anchor = anchors[anchorSig];\r\n            if (anchor === undefined) {\r\n              anchor = {\r\n                \"first\":   v.end[0],\r\n                \"last\" :   v.end[1],\r\n                \"length\" : v.end[1] - v.end[0]\r\n              };\r\n              anchors[anchorSig] = anchor;\r\n            };\r\n            \r\n            v.endAnchor = anchor;\r\n\r\n            // Add to anchors list\r\n            v.end = middle;\r\n          };\r\n        };\r\n\r\n        v.first = v.start;\r\n        v.last  = v.end;\r\n\r\n        // calculate the arch length\r\n        if (v.start < v.end) {\r\n          v.length = v.end - v.start;\r\n        }\r\n\r\n        else {\r\n          v.length = v.start - v.end;\r\n        };\r\n\r\n        return v;\r\n      });\r\n\r\n      // Sort based on length\r\n      sortedArcs.sort(function (a, b) {\r\n        if (a.length < b.length)\r\n          return -1;\r\n        else\r\n          return 1;\r\n      });\r\n\r\n      // Add sorted arcs and anchors\r\n      this._sortedArcs    = lengthSort(sortedArcs, false);\r\n      this._sortedAnchors = lengthSort(Object.values(anchors), true);\r\n    },\r\n\r\n\r\n    /**\r\n     * Center the viewport of the canvas\r\n     * TODO:\r\n     *   This is identical to treehierarchy\r\n     */\r\n    center : function () {\r\n      if (this._el === undefined)\r\n       return;\r\n\r\n      const treeDiv = this._el.parentNode;\r\n\r\n      const cWidth = parseFloat(window.getComputedStyle(this._el).width);\r\n      const treeWidth = parseFloat(window.getComputedStyle(treeDiv).width);\r\n      // Reposition:\r\n      if (cWidth > treeWidth) {\r\n       var scrollValue = (cWidth - treeWidth) / 2;\r\n       treeDiv.scrollLeft = scrollValue;\r\n      };\r\n    },\r\n\r\n\r\n    // Show the element\r\n    show : function () {\r\n      const t = this;\r\n      const svg = this._el;\r\n      const height = this.maxArc;\r\n\r\n      // Delete old group\r\n      if (svg.getElementsByTagName(\"g\")[0] !== undefined) {\r\n        svg.removeChild(\r\n          svg.getElementsByTagName(\"g\")[0]\r\n        );\r\n        t._tokenElements = [];\r\n      };\r\n\r\n      const g = svg.appendChild(t._c(\"g\"));\r\n\r\n      // Draw token list\r\n      const text = g.appendChild(t._c(\"text\"));\r\n      text.setAttribute('class', 'leaf');\r\n      text.setAttribute(\"text-anchor\", \"start\");\r\n      text.setAttribute(\"y\", height);\r\n\r\n      // Calculate the start position\r\n      t._y = height - (t.anchorStart);\r\n\r\n      // Introduce some prepending whitespace (yeah - I know ...)\r\n      const ws = text.appendChild(t._c(\"tspan\"));\r\n      ws.appendChild(d.createTextNode('\\u00A0'));\r\n      ws.style.textAnchor = \"start\";\r\n      \r\n      t._tokens.forEach(function(node_i) {\r\n        // Append svg\r\n        // var x = text.appendChild(this._c(\"text\"));\r\n        const tspan = text.appendChild(this._c(\"tspan\"));\r\n        tspan.appendChild(d.createTextNode(node_i));\r\n        tspan.setAttribute(\"text-anchor\", \"middle\");\r\n        \r\n        this._tokenElements.push(tspan);\r\n\r\n        // Add whitespace!\r\n        tspan.setAttribute(\"dx\", this.tokenSep);\r\n      }, t);\r\n\r\n      // Get some global position data that may change on resize\r\n      t.offsetLeft = t._rect(g).left;\r\n\r\n      // The group of arcs\r\n      const arcs = g.appendChild(t._c(\"g\"));\r\n      t._arcsElement = arcs;\r\n      arcs.classList.add(\"arcs\");\r\n\r\n      const labels = g.appendChild(t._c(\"g\"));\r\n      t._labelsElement = labels;\r\n      labels.classList.add(\"labels\");\r\n\r\n      // Sort arcs if not sorted yet\r\n      if (t._sortedArcs === undefined)\r\n        t._sortArcs();\r\n\r\n      // 1. Draw all anchors\r\n      t._sortedAnchors.forEach(\r\n        i => t._drawAnchor(i)\r\n      );\r\n\r\n      // 2. Draw all arcs\r\n      t._sortedArcs.forEach(\r\n        i => t._drawArc(i)\r\n      );\r\n\r\n      // Resize the svg with some reasonable margins\r\n      svg.setAttribute(\"width\", t._rect(text).width + 20);\r\n      svg.setAttribute(\"height\", height + 20);\r\n      svg.setAttribute(\"class\", \"relTree\");\r\n    }\r\n  };\r\n\r\n  // Sort relations regarding their span\r\n  function lengthSort (list, inclusive) {\r\n\r\n    /*\r\n     * The \"inclusive\" flag allows to\r\n     * modify the behaviour for inclusivity check,\r\n     * e.g. if identical start or endpoints mean overlap or not.\r\n     */\r\n    \r\n    let stack = [];\r\n\r\n    // Iterate over all definitions\r\n    list.forEach(function(current) {\r\n\r\n      // Check the stack order\r\n      let overlaps = 0;\r\n      let check;\r\n      for (let j = (stack.length - 1); j >= 0; j--) {\r\n        check = stack[j];\r\n\r\n        // (a..(b..b)..a)\r\n        if (current.first <= check.first && current.last >= check.last) {\r\n          overlaps = check.overlaps + 1;\r\n          break;\r\n        }\r\n\r\n        // (a..(b..a)..b)\r\n        else if (current.first <= check.first && current.last >= check.first) {\r\n\r\n          if (inclusive || (current.first != check.first && current.last != check.first)) {\r\n            overlaps = check.overlaps + (current.length == check.length ? 0 : 1);\r\n          };\r\n        }\r\n        \r\n        // (b..(a..b)..a)\r\n        else if (current.first <= check.last && current.last >= check.last) {\r\n\r\n          if (inclusive || (current.first != check.last && current.last != check.last)) {\r\n            overlaps = check.overlaps + (current.length == check.length ? 0 : 1);\r\n          };\r\n        };\r\n      };\r\n\r\n      // Set overlaps\r\n      current.overlaps = overlaps;\r\n\r\n      stack.push(current);\r\n\r\n      // Although it is already sorted,\r\n      // the new item has to be put at the correct place\r\n      // TODO:\r\n      //   Use something like splice() instead\r\n      stack.sort(function (a,b) {\r\n        b.overlaps - a.overlaps\r\n      });\r\n    });\r\n\r\n    return stack;\r\n  };\r\n});\r\n\n\r\n\r\ndefine('view/match/relations',[\r\n  'view',\r\n  'match/treehierarchy',\r\n  'match/treearc'\r\n], function (viewClass, matchTreeHierarchyClass, matchTreeArcClass) {\r\n\r\n  const d = document;\r\n  const loc   = KorAP.Locale;\r\n  loc.DOWNLOAD = loc.DOWNLOAD || 'Download';\r\n\r\n  \r\n  return {\r\n    create : function (match,foundry,layer,type) {\r\n      return Object.create(viewClass)\r\n        ._init(['relations'])\r\n        .upgradeTo(this)\r\n        ._init(match, foundry, layer, type);\r\n    },\r\n\r\n\r\n    // Initialize relations object\r\n    _init : function (match,foundry, layer, type) {\r\n      this._match = match;\r\n      this._foundry = foundry;\r\n      this._layer = layer;\r\n      this._type = type;\r\n      return this;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Meta view element\r\n     */\r\n    show : function () {\r\n\r\n      if (this._show)\r\n        return this._show;\r\n\r\n      const matchtree = d.createElement('div');\r\n      matchtree.classList.add('matchtree', 'loading');\r\n\r\n      // Add title line\r\n      const h6 = matchtree.addE('h6');\r\n      h6.addE('span').addT(this._foundry);\r\n      h6.addE('span').addT(this._layer);      \r\n\r\n      this._tree = matchtree.addE('div');\r\n\r\n      return this._show = matchtree;\r\n    },\r\n\r\n\r\n    /**\r\n     * Do after embedding\r\n     */\r\n    afterEmbed : function () {\r\n\r\n      const foundry = this._foundry,\r\n            layer = this._layer,\r\n            type = this._type;\r\n\r\n      const that = this,\r\n            tree = this._tree,\r\n            matchtree = this._show;\r\n\r\n      // Get tree data async\r\n      this.getData(foundry, layer, type, function (treeObj) {\r\n\r\n        matchtree.classList.remove('loading');\r\n\r\n        // Something went wrong - probably log!!!\r\n\r\n        if (treeObj === null) {\r\n          tree.addT('No data available.');\r\n        }\r\n        else {\r\n          tree.appendChild(treeObj.element());\r\n          treeObj.show();\r\n\r\n          // Reposition the view to the center\r\n          // (This may in a future release be a reposition\r\n          // to move the root to the actual match)\r\n\r\n          // This is currently not supported by relations\r\n          if (type === \"spans\") {\r\n\r\n            // Download link\r\n            that.actions().add(\r\n              loc.DOWNLOAD,\r\n              {'cls':['button-icon','download']},\r\n              function (e) {\r\n                const a = treeObj.downloadLink();\r\n                d.body.appendChild(a);\r\n                a.click();\r\n                d.body.removeChild(a)\r\n              }\r\n            );\r\n          };\r\n          \r\n          treeObj.center();\r\n        };\r\n      });\r\n\r\n      matchtree.classList.remove('loading');\r\n    },\r\n\r\n    /**\r\n     * Get match object\r\n     */\r\n    match : function () {\r\n      return this._match;\r\n    },\r\n\r\n\r\n    /**\r\n     * Retrieve and parse snippet for relation\r\n     * representation\r\n     */\r\n    getData : function (foundry, layer, type, cb) {\r\n      var focus = [];\r\n\r\n      try {\r\n        // TODO: Support and cache multiple trees\r\n        KorAP.API.getMatchInfo(\r\n          this._match, {\r\n            'spans' : true,\r\n            'foundry' : foundry,\r\n            'layer' : layer\r\n          },\r\n          function (matchResponse) {\r\n            if (matchResponse === undefined) {\r\n              cb(null);\r\n              return;\r\n            };\r\n\r\n            // Get snippet from match info\r\n            if (matchResponse[\"snippet\"] !== undefined) {\r\n\r\n              // Todo: This should be cached somehow\r\n\r\n              if (type === \"spans\") {\r\n                cb(matchTreeHierarchyClass.create(matchResponse[\"snippet\"]));\r\n              }\r\n              else if (type === \"rels\") {\r\n                cb(matchTreeArcClass.create(matchResponse[\"snippet\"]));              \r\n              }\r\n\r\n              // Unknown tree type\r\n              else {\r\n                cb(null);\r\n              };\r\n            }\r\n            else {\r\n              cb(null);\r\n            };\r\n          }.bind(this)\r\n        );\r\n      }\r\n      catch (e) {\r\n        KorAP.log(0, e);\r\n        cb(null);\r\n      };\r\n    },\r\n  \r\n\r\n    // Delete circular references\r\n    onClose : function () {\r\n      this._match = undefined;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The match panel.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('panel/match',[\r\n  'panel',\r\n  'match/treeitem',\r\n  'view/match/tokentable',\r\n  'view/match/meta',\r\n  'view/match/relations',\r\n  'buttongroup/menu',\r\n], function (panelClass,treeItemClass,tableView,metaView,relationsView,buttonGroupMenuClass) {\r\n\r\n  // Override \r\n  KorAP.API.getMatchInfo = KorAP.API.getMatchInfo || function () {\r\n    KorAP.log(0, 'KorAP.API.getMatchInfo() not implemented')\r\n    return {};\r\n  };\r\n\r\n  const loc = KorAP.Locale;\r\n\r\n  loc.SHOWANNO  = loc.SHOWANNO  || 'Tokens';\r\n  loc.SHOW_META = loc.SHOW_META || 'Metadata';\r\n  loc.ADDTREE   = loc.ADDTREE   || 'Relations';\r\n\r\n  return {\r\n    create : function (match) {\r\n      return Object.create(panelClass)._init(['matchinfo']).upgradeTo(this)._init(match);\r\n    },\r\n\r\n    // Initialize match panel\r\n    _init : function (match) {\r\n\r\n      this._match = match;\r\n\r\n      const a = this.actions();\r\n\r\n      // TODO:\r\n      //   Ugly hack!\r\n      const cl = a.element().classList;\r\n      cl.remove('matchinfo');\r\n      cl.add('button-matchinfo');\r\n\r\n      // Add meta button\r\n      a.add(\r\n        loc.SHOW_META, {'cls':['metatable']}, function (e) {\r\n          this.addMeta();\r\n        }\r\n      );\r\n\r\n      // Add token annotation button\r\n      a.add(\r\n        loc.SHOWANNO, {'cls':['info']}, function (e) {\r\n          this.addTable();\r\n        }\r\n      );\r\n\r\n      // Add relations button\r\n      a.add(\r\n        loc.ADDTREE, {'cls':['tree']}, function (e) {\r\n\r\n          // Get global tree menu\r\n          if (KorAP.TreeMenu === undefined) {\r\n            KorAP.TreeMenu = buttonGroupMenuClass.create([], treeItemClass);\r\n            KorAP.TreeMenu.element().setAttribute('id', 'treeMenu');\r\n          };\r\n\r\n          const tm = KorAP.TreeMenu;\r\n\r\n          // Set panel\r\n          tm.panel(this);\r\n\r\n          // Reread list\r\n          tm.readItems(this._treeMenuList());\r\n\r\n          // Reposition and show menu\r\n          tm.show();\r\n          tm.button(this.button);\r\n          tm.focus();\r\n        }\r\n      );\r\n\r\n      // If plugins are enabled, add all buttons for the match panel\r\n      if (KorAP.Plugin) {\r\n        const matchButtons = KorAP.Plugin.buttonGroup(\"match\");\r\n        if (matchButtons) {\r\n\r\n          // Add all matchbuttons in order\r\n          matchButtons.forEach(m => a.add.apply(a, m));\r\n        };\r\n      };\r\n\r\n      return this;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Add meta view to panel\r\n     */\r\n    addMeta : function () {\r\n      const t = this;\r\n      if (t._metaView && t._metaView.shown())\r\n        return;\r\n\r\n      t._metaView = metaView.create(t._match);\r\n      t.add(t._metaView);\r\n    },\r\n\r\n    \r\n    /**\r\n     * Add table view to panel\r\n     */\r\n    addTable : function () {\r\n      const t = this;\r\n      if (t._tableView && t._tableView.shown())\r\n        return;\r\n      t._tableView = tableView.create(t._match);\r\n      t.add(t._tableView);\r\n    },\r\n\r\n\r\n    /**\r\n     * Add Tree view to panel\r\n     */\r\n    addTree : function (foundry, layer, type) {\r\n      this.add(\r\n        relationsView.create(this._match, foundry, layer, type)\r\n      );\r\n      \r\n    },\r\n\r\n\r\n    // Return tree menu list\r\n    _treeMenuList : function () {\r\n     \r\n      if (this._menuList)\r\n        return this._menuList;\r\n\r\n      // Join spans and relations\r\n      let treeLayers = []\r\n\r\n      const match = this._match;\r\n      match.getSpans().forEach(i => treeLayers.push(i));\r\n      match.getRels().forEach(i => treeLayers.push(i));\r\n\r\n      // Get spans\r\n      treeLayers = treeLayers.sort(\r\n        function (a, b) {\r\n          if (a.foundry < b.foundry) {\r\n            return -1;\r\n          }\r\n          else if (a.foundry > b.foundry) {\r\n            return 1;\r\n          }\r\n          else if (a.layer < b.layer) {\r\n            return -1;\r\n          }\r\n          else if (a.layer > b.layer) {\r\n            return 1;\r\n          };\r\n          return 0;\r\n        });\r\n      \r\n      let menuList = [];\r\n      \r\n      // Show tree views\r\n      treeLayers.forEach(\r\n        s => \r\n          // Add foundry/layer to menu list\r\n          menuList.push([\r\n            s.foundry + '/' + s.layer,\r\n            s.foundry,\r\n            s.layer,\r\n            s.type\r\n          ]));\r\n\r\n      // Create tree menu\r\n      this._menuList = menuList;\r\n      return menuList;\r\n    }   \r\n  }\r\n});\r\n\n/**\r\n * Get information on matches,\r\n * generate annotation tables and trees.\r\n *\r\n * @author Nils Diewald\r\n */\r\n/*\r\n * - Highlight (at least mark as bold) the match\r\n * - Scroll to match vertically per default\r\n * - A click on a table field and a tree node should at the field description to the fragments list.\r\n */\r\n\r\n\r\ndefine('match',[\r\n  'buttongroup',\r\n  'panel/match',\r\n\t'util'\r\n], function (buttonGroupClass,matchPanelClass) {\r\n\r\n  // Localization values\r\n  const loc   = KorAP.Locale;\r\n  loc.MINIMIZE     = loc.MINIMIZE  || 'Minimize';\r\n  \r\n  // 'corpusID', 'docID', 'textID'\r\n  const _matchTerms  = ['textSigle', 'matchID', 'available'];\r\n\r\n  const d = document;\r\n\r\n  /**\r\n   * Match object\r\n   */\r\n  return {\r\n\r\n    /**\r\n     * Create a new match object.\r\n     * Expects an element with match descriptions.\r\n     */\r\n    create : function (match) {\r\n      return Object.create(this)._init(match);\r\n    },\r\n\r\n\r\n    /**\r\n     * Initialize match.\r\n     */\r\n    _init : function (match) {\r\n      const t= this;\r\n      t._el = null;\r\n      t._initialized = false;\r\n\r\n      // No match defined\r\n      if (arguments.length < 1 ||\r\n          match === null ||\r\n          match === undefined) {\r\n        throw new Error('Missing parameters');\r\n      }\r\n\r\n      // Match defined as a node\r\n      else if (match instanceof Node) {\r\n        t._el  = match;\r\n\r\n        // Circular reference !!\r\n        match[\"_match\"] = t;\r\n\r\n        if (match.hasAttribute('data-text-sigle')) {\r\n          t.textSigle = match.getAttribute('data-text-sigle')\r\n        }\r\n        else {\r\n          t.textSigle = match.getAttribute('data-corpus-id') +\r\n            '/' +\r\n            match.getAttribute('data-doc-id') +\r\n            '/' +\r\n            match.getAttribute('data-text-id');\r\n        };\r\n\r\n        t.matchID   = match.getAttribute('data-match-id');\r\n        \r\n        // List of available annotations\r\n        t.available = match.getAttribute('data-available-info').split(' ');\r\n      }\r\n\r\n      // Match as an object\r\n      else {\r\n\r\n        // Iterate over allowed match terms\r\n        _matchTerms.forEach(function(term) {\r\n          this[term] = match[term] !== undefined ? match[term] : undefined;\r\n        }, t);\r\n      };\r\n      \r\n      t._avail = {\r\n        tokens : [],\r\n        spans  : [],\r\n        rels   : []\r\n      };\r\n\r\n      // Iterate over info layers\r\n      let layer;\r\n      t.available.forEach(function(term){\r\n\r\n        // Create info layer objects\r\n        try {\r\n          layer = require('match/infolayer').create(term);\r\n          this._avail[layer.type].push(layer);\r\n        }\r\n        catch (e) {\r\n          return;\r\n        };\r\n      }, t);\r\n      \r\n      return t;\r\n    },\r\n\r\n    /**\r\n     * Return a list of parseable tree annotations.\r\n     */\r\n    getSpans : function () {\r\n      return this._avail.spans;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return a list of parseable token annotations.\r\n     */\r\n    getTokens : function () {\r\n      return this._avail.tokens;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return a list of parseable relation annotations.\r\n     */\r\n    getRels : function () {\r\n      return this._avail.rels;\r\n    },\r\n\r\n    /**\r\n     * Initialize match\r\n     */\r\n    init : function () {\r\n      const t = this;\r\n      if (t._initialized)\r\n        return t;\r\n\r\n      // Add actions unless it's already activated\r\n      const element = t._el;\r\n\r\n      // There is an element to open\r\n      if (element === undefined || element === null)\r\n        return undefined;\r\n      \r\n      // Add meta button\r\n      const refLine = element.querySelector(\"p.ref\");\r\n\r\n      // No reference found\r\n      if (!refLine)\r\n        return undefined;\r\n\r\n      // Create panel\r\n      t.panel = matchPanelClass.create(t);\r\n\r\n      t._el.insertBefore(\r\n        t.panel.element(),\r\n        t._el.querySelector(\"p.ref\")\r\n      );\r\n\r\n      // Insert before reference line\r\n      refLine.insertBefore(\r\n        t.panel.actions().element(),\r\n        refLine.firstChild\r\n      );\r\n\r\n      t._initialized = true;\r\n      return t;\r\n    },\r\n\r\n    /**\r\n     * Open match\r\n     */\r\n    open : function () {\r\n      \r\n      // Add actions unless it's already activated\r\n      const element = this._el;\r\n\r\n      // There is an element to open\r\n      if (element === undefined || element === null)\r\n        return false;\r\n\r\n      // The element is already opened\r\n      if (element.classList.contains('active'))\r\n        return false;\r\n      \r\n      // Add active class to element\r\n      element.classList.add('active');\r\n\r\n      const btn = buttonGroupClass.create(\r\n        ['action','button-view']\r\n      );\r\n\r\n      const that = this;\r\n      btn.add(loc.MINIMIZE, {'cls':['button-icon','minimize']}, function () {\r\n        that.minimize();\r\n      });\r\n      element.appendChild(btn.element());\r\n      \r\n      if (this.init() == undefined) {\r\n        return false;\r\n      };\r\n      \r\n      return true;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Toggle match view\r\n     */\r\n    toggle : function () {\r\n      if (this._el.classList.contains('active'))\r\n        this.minimize();\r\n      else\r\n        this.open();\r\n    },\r\n\r\n\r\n    /**\r\n     * Minimize info view\r\n     */\r\n    minimize : function () {\r\n      this._el.classList.remove('active');\r\n    },\r\n\r\n    \r\n    /**\r\n     * Get match element.\r\n     */\r\n    element : function () {\r\n      return this._el; // May be null\r\n    }\r\n  };\r\n});\r\n\n// Input field for queries\r\n/*\r\n * TODO: Support alert for query problems.\r\n */\r\n\r\n\r\n\r\ndefine('hint/input',['util'], function () {\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create a new input field.\r\n     */\r\n    create : function (element) {\r\n      return Object.create(this)._init(element);\r\n    },\r\n\r\n\r\n    // Initialize new input field\r\n    _init : function (element) {\r\n      this._el = element;\r\n\r\n      this._container = document.createElement(\"div\");\r\n      this._container.setAttribute('id', 'hint');\r\n\r\n      // Create mirror for searchField\r\n      // This is important for positioning\r\n      // if ((this._mirror = document.getElementById(\"searchMirror\")) === null) {\r\n      this._mirror = document.createElement(\"div\");\r\n      const m = this._mirror;\r\n      m.classList.add('hint', 'mirror');\r\n      m.addE(\"span\");\r\n      m.appendChild(this._container);\r\n      m.style.height = \"0px\";\r\n      document.getElementsByTagName(\"body\")[0].appendChild(m);\r\n\r\n      // Update position of the mirror\r\n      const re = this.reposition.bind(this);\r\n      window.addEventListener('resize', re);\r\n      this._el.addEventListener('onfocus', re);\r\n      this.reposition();\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the mirrored input field.\r\n     */\r\n    mirror : function () {\r\n      return this._mirror;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the container element.\r\n     * This contains the hint helper / menus\r\n     * and probably an\r\n     * error message.\r\n     */\r\n    container : function () {\r\n      return this._container;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the input element the\r\n     * hint helper is attached to.\r\n     */\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the value of the input field\r\n     * the hint helper is attached to.\r\n     */\r\n    value : function () {\r\n      return this._el.value;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the value of the input field mirror.\r\n     */\r\n    mirrorValue : function () {\r\n      return this._mirror.firstChild.textContent;\r\n    },\r\n\r\n\r\n    /**\r\n     * Reset the input value\r\n     */\r\n    reset : function () {\r\n      this._el.value = \"\";\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the mirror content.\r\n     */\r\n    update : function () {\r\n      this._mirror.firstChild.textContent = this._split()[0];\r\n      this._container.style.left = this._rightPos() + 'px';\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Insert text into the mirror.\r\n     * This is a prefix of the input field's\r\n     * value.\r\n     */\r\n    insert : function (text) {\r\n      const splittedText = this._split();\r\n      const s = this._el;\r\n      s.value = splittedText[0] + text + splittedText[1];\r\n      s.selectionStart = (splittedText[0] + text).length;\r\n      s.selectionEnd = s.selectionStart;\r\n\r\n      // Maybe update?\r\n      this._mirror.firstChild.textContent = splittedText[0] + text;\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Move hinthelper to given character position\r\n     */\r\n    moveto : function (charpos) {\r\n      const e = this._el;\r\n      e.selectionStart = charpos;\r\n      e.selectionEnd = charpos;\r\n      e.focus();\r\n      return this.update();\r\n    },\r\n\r\n\r\n    /**\r\n     * Reposition the input mirror directly\r\n     * below the input box.\r\n     */\r\n    reposition : function () {\r\n      const inputClientRect = this._el.getBoundingClientRect();\r\n      const inputStyle = window.getComputedStyle(this._el, null);\r\n\r\n      const bodyClientRect = \r\n            document.getElementsByTagName('body')[0].getBoundingClientRect();\r\n\r\n      // Reset position\r\n      const mirrorStyle = this._mirror.style;\r\n      mirrorStyle.left  = parseInt(inputClientRect.left) + \"px\";\r\n      mirrorStyle.top   = parseInt(inputClientRect.bottom - bodyClientRect.top) + \"px\";\r\n      mirrorStyle.width = inputStyle.getPropertyValue(\"width\");\r\n\r\n      // These may be relevant in case of media depending css\r\n      mirrorStyle.paddingLeft     = inputStyle.getPropertyValue(\"padding-left\");\r\n      mirrorStyle.marginLeft      = inputStyle.getPropertyValue(\"margin-left\");\r\n      mirrorStyle.borderLeftWidth = inputStyle.getPropertyValue(\"border-left-width\");\r\n      mirrorStyle.borderLeftStyle = inputStyle.getPropertyValue(\"border-left-style\");\r\n      mirrorStyle.fontSize        = inputStyle.getPropertyValue(\"font-size\");\r\n      mirrorStyle.fontFamily      = inputStyle.getPropertyValue(\"font-family\");\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the context, which is the input\r\n     * field's value bounded to the\r\n     * cursor position.\r\n     */\r\n    context : function () {\r\n      return this._split()[0];\r\n    },\r\n\r\n\r\n    // Get the right position\r\n    _rightPos : function () {\r\n      const box = this._mirror.firstChild.getBoundingClientRect();\r\n      return box.right - box.left;\r\n    },\r\n\r\n\r\n    /*\r\n     * Return two substrings,\r\n     * splitted at a given position\r\n     * or at the current cursor position.\r\n     */\r\n    _split : function (start) {\r\n      const s = this._el;\r\n      const value = s.value;\r\n\r\n      // Get start from cursor position\r\n      if (arguments.length === 0)\r\n        start = s.selectionStart;\r\n\r\n      return new Array(\r\n        value.substring(0, start),\r\n        value.substring(start, value.length)\r\n      );\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * API/ skeleton/ base class for an item contained within a container.\r\n * Here we see which functions container supports for containerItems.\r\n * \r\n * @author Leo Repp\r\n */\r\n\r\n\r\n//\"use strict\";\r\n\r\ndefine('container/containeritem',{\r\n\r\n  /**\r\n   * API for an item contained within a container\r\n   */\r\n  create : function () {\r\n    return Object.create(this); //._init();\r\n  },\r\n\r\n  /**\r\n   * Check or set if the item is active\r\n   *\r\n   * @param {boolean|null} State of activity\r\n   */\r\n  active : function (bool) {\r\n    const cl = this.element().classList;\r\n    if (bool === undefined) return cl.contains(\"active\");\r\n    else if (bool) cl.add(\"active\");\r\n    else cl.remove(\"active\"); //allows for setting it to inactive if not (equal to undefined or truthy)\r\n  },\r\n\r\n  /**\r\n   * Get/create the document element of the container item. Can be overwritten. Standard class: li\r\n   * If you wish to change the textNode please overwrite the content function instead.\r\n   */\r\n  element : function () {\r\n    //Call Order: First this class is created and then upgraded To whatever object is passed to container\r\n    //Then container calls first element() and then container()\r\n    if (this._el !== undefined) return this._el;\r\n    \r\n    // Create list item\r\n    const li = document.createElement(\"li\");\r\n\r\n    // Connect action\r\n    if (this[\"onclick\"] !== undefined) {\r\n      li[\"onclick\"] = this.onclick.bind(this);\r\n    };    \r\n    return this._el = li;\r\n  },\r\n\r\n  /**\r\n   * Get/create a TextNode with text \"content\". If content is left blank it gets set to this.defaultTextValue,\r\n   * or the empty string if it does not exists\r\n   * @param {String} content String to which to set the text\r\n   * @returns textNode with content or undefined\r\n   */\r\n  content : function (content) {\r\n    var newText; //set textNode to this\r\n    if (arguments.length === 1) { //new value!\r\n      newText = content;\r\n    } else { //use default\r\n      if (this.defaultTextValue === undefined) { //default default is \"\"\r\n        this.defaultTextValue = \"\";\r\n      }\r\n      newText = this.defaultTextValue;\r\n    };\r\n    if (this._content === undefined) { //no Element until now\r\n      this._content = document.createTextNode(newText); //create one\r\n      this.element().appendChild(this._content);\r\n    } else { //just change it\r\n      this._content.nodeValue = newText; // use nodeValue instead of _innerHTML\r\n    };\r\n    return this._content;\r\n  },\r\n\r\n  /**\r\n   * Expected to be overwritten. Default returns true always.\r\n   * @returns whether the item is currently an option to be selected, or if it should just be skipped\r\n   */\r\n  isSelectable : function () {\r\n    return true;\r\n  },\r\n\r\n  /**\r\n   * API skeleton for reading letters. Expected to be overwritten.\r\n   * @param {String} letter The letter to be read\r\n   */\r\n  add : function (letter) {},\r\n    \r\n  \r\n  /**\r\n   * API skeleton for clearing whole contents. Expected to be overwritten.\r\n   */\r\n  clear : function () {},\r\n  \r\n  \r\n  /**\r\n   * API skeleton method for execution. Expected to be overwritten.\r\n   * @param {Event} event Event passed down by menu.\r\n   */\r\n  onclick : function (e) {},\r\n  \r\n    \r\n  /**\r\n   * API skeleton method for when backspace is pressed. Expected to be overwritten.\r\n   */\r\n  chop : function () {},\r\n\r\n  /**\r\n   * API skeleton method for pressing \"right\". Expected to be overwritten.\r\n   * @param {Event} event Event passed down by menu.\r\n   */\r\n  further : function (e) {},\r\n\r\n  /**\r\n   * Return menu list. This._menu gets written by the container class\r\n   */\r\n  menu : function () {\r\n    return this._menu;\r\n  }\r\n\r\n});\r\n\n/**\r\n * Container for several containerItem style items. Functions like a mini menu with next, prev, add etc propagation,\r\n * but no event handling or slider or lengthField. Supposed to be subelement to a (container)menu class item.\r\n * \r\n * @author Leo Repp\r\n */\r\n\r\n\r\ndefine('container/container',[\r\n  'container/containeritem'   //TODO why does this not work!!!\r\n], function (\r\n  defaultContainerItemClass\r\n) {\r\n\r\n  return {\r\n    /**\r\n    * \r\n    * @param {Array<object>} listOfContainerItems List of items that will be placed within the container and that realise some of the functions supplied in containeritem.js\r\n    * @param {object} params May contain attribute containerItemClass for a base class all containerItems build upon\r\n    * @returns The container object\r\n    */\r\n    create : function (listOfContainerItems, params) {\r\n      var obj = Object.create(this);\r\n      obj._init(listOfContainerItems, params);\r\n      return obj;\r\n    },\r\n\r\n    _init : function (listOfContainerItems, params){\r\n      if (params !== undefined && params[\"containerItemClass\"] !== undefined){\r\n        this._containerItemClass = params[\"containerItemClass\"];\r\n      } else {\r\n        this._containerItemClass = defaultContainerItemClass;\r\n      };\r\n      var el = document.createElement(\"ul\");\r\n      el.style.outline = 0;\r\n      el.setAttribute('tabindex', 0);\r\n      el.classList.add('menu', 'container'); //container class allows for more stylesheet changes\r\n\r\n      this._el = el;\r\n      this._cItemPrefix = undefined; //required for re-setting the menus pointer correctly\r\n      // after having upgraded a new item scss style to the prefix object.\r\n\r\n      this.items = new Array();\r\n      //items are stored in the order they are added in. This includes the prefix.\r\n      if (listOfContainerItems !== undefined) {\r\n        for (let item of listOfContainerItems) {\r\n          this.addItem(item);\r\n        }\r\n      }\r\n\r\n      this.position = undefined; //undefined = not in container,\r\n      // 0 to length-1 = in container\r\n\r\n      this._prefixPosition = undefined; //Required so that switching\r\n      // to prefix by default is supported\r\n\r\n\r\n      \r\n      //t._el.classList.add('visible'); //Done by containermenu\r\n\r\n  },\r\n\r\n    /**\r\n     * Adds a static item to this container by creating a standard containerItem as specified when this container was created,\r\n     * then upgrading it to the item passed to this function, and calling element() and content(). For a full list of supported functions see\r\n     * containeritem.js .\r\n     * Example:\r\n     * \r\n     * menu.container().addItem(\r\n     *  {defaultTextValue : \"dynamic\", onClick : function (e) { ... }\r\n     * )\r\n     * \r\n     *  For a full demo see containermenudemo.js.\r\n     * \r\n     * @param {Object} item An object with any number of functions like in containeritem.js or an attribute defaultTextValue,\r\n     * as well as any number of own properties.\r\n     * @returns the new use-ready containerItem\r\n     */\r\n    addItem : function (item) {\r\n      //Call Order: First _containerItemClass is created and then upgraded To whatever object is passed to this function\r\n      //Then container calls first element() and then container()\r\n      var cItem = this._containerItemClass.create().upgradeTo(item);\r\n      cItem._menu = this._menu; //if not set then undefined, but thats OK\r\n      this.items.push(cItem);\r\n      if (this._cItemPrefix !== undefined){ //this must be dynamic adding of CIs, move prefix to the back\r\n        this.items.splice(this.items.indexOf(this._cItemPrefix) , 1); //remove cItemPrefix\r\n        this.items.push(this._cItemPrefix); //and move it to the end;\r\n      };\r\n      this._el.appendChild(cItem.element());\r\n      cItem.content(); // create its textNode\r\n      return cItem;\r\n    },\r\n\r\n    addMenu : function (menu) {\r\n      this._menu = menu;\r\n      if (this._cItemPrefix !== undefined) {\r\n        this._menu._prefix = this._cItemPrefix; // better than going via classList or something\r\n      };\r\n      for (let item of this.items) {\r\n        item._menu=menu;\r\n      }\r\n    },\r\n\r\n    addPrefix : function (prefix) {\r\n      prefix.isSelectable =  function () {\r\n        return this.isSet(); //TODO check!\r\n      }\r\n      this._prefixPosition = this.items.length;\r\n      prefix.content = function (t) {}; //Does not need a textNode Child!\r\n      var prefItem = this.addItem(prefix);\r\n      this._cItemPrefix = prefItem;\r\n      prefItem._el[\"onclick\"] = prefItem.onclick.bind(prefItem);\r\n      if (this._menu !== undefined){\r\n        this._menu._prefix=prefItem;\r\n      }\r\n    },\r\n    \r\n    //Taken from Branch 5133\r\n    /**\r\n    * Remove a containeritem from the container by identity. Should not be used with prefix.\r\n    * If the active item is removed, this calls menu.next().\r\n    * @param {containerItemClass} item The item to be removed.\r\n    */\r\n     removeItem : function (item) {\r\n      if (item.active()) {\r\n        this._menu.next();\r\n      }\r\n      item._menu=undefined;\r\n      this._el.removeChild(item.element());\r\n      this.items.splice(this.items.indexOf(item) , 1);\r\n      //TODO what to do when we completely empty the item and containeritem lists???\r\n      //Nothing is active anymore and the arrow keys do not work then.\r\n    },\r\n    /**\r\n     * Remove a containeritem from the container by its index. Should not be used with prefix.\r\n     * CAUTION liveIndex, so what you see, is not the actual index within the containerItem list.\r\n     * This can be accessed with container.items . If the active item is removed, this calls menu.next().\r\n     * @param {Int} index The index of the item to be removed.\r\n     */\r\n    removeItemByIndex : function (index) {\r\n      this.removeItem(this.items[index]); //CAUTION liveIndex (what you see) != index within the list!\r\n    },\r\n\r\n\r\n    /**\r\n     * Remove a containeritem from the container by its index. Should not be used with prefix.\r\n     * CAUTION liveIndex, so what you see, is not the actual index within the containerItem list.\r\n     * This can be accessed with container.items . If the active item is removed, this calls menu.next().\r\n     * @param {Int} index The index of the item to be removed.\r\n     */\r\n    removeItemByIndex : function (index) {\r\n      if (index < 0 || index >= this.length()){\r\n        KorAP.log(0,\"Invalid index in containers removeItemByIndex: \"+index, \"container.js\");\r\n        return;\r\n      };\r\n      this.removeItem(this.items[index]); //CAUTION liveIndex (what you see) != index within the list!\r\n    },\r\n\r\n    /**\r\n    * Exit the container unconditionally. Required so that active returns the\r\n    * correct result. Called when the prefix or similar resets the currently visual\r\n    * field.\r\n    */\r\n    exit : function () {\r\n      if (this.position !== undefined) {\r\n        this.item().active(false);\r\n        this.position = undefined;\r\n      };\r\n    },\r\n\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n    destroy : function () {\r\n      for (let item of this.items){\r\n        delete item['_menu'];\r\n      }\r\n    },\r\n\r\n    /**\r\n    * @returns whether an item within the container is active (by checking this.position)\r\n    */\r\n    active : function () {\r\n      return this.position !== undefined;\r\n    },\r\n\r\n    /**\r\n    * Getter for items\r\n    * @param {Integer} index [optional] Index of to select item. If left blank this.position.\r\n    * @returns item at location index\r\n    */\r\n    item : function (index) {\r\n      if (index === undefined) return this.items[this.position];\r\n      return this.items[index];\r\n    },\r\n\r\n    /**\r\n     * \r\n     * Make the container active without having called prev or next.\r\n     * Occurs whenever the prefix makes the\r\n     * menus list empty while we had it selected.\r\n     * This potentially requires adjusting this.position.\r\n     */\r\n     makeActive : function () {\r\n      if (this.position === undefined) {\r\n        if (this._cItemPrefix.isSelectable()) {\r\n          this.position = this._prefixPosition; //make prefix active if it exists\r\n          this.item().active(true);\r\n        } else if (this.liveLength() > 0) {\r\n          this.position = 0;\r\n          this._cItemPrefix.active(false); // usually the menu makes the prefix active anyway.\r\n          this.item().active(true);\r\n        }\r\n      }\r\n    },\r\n    \r\n    /**\r\n     * \r\n    * Move on to the next item in container. Returns true if we then leave the container, false otherwise.\r\n    */\r\n    next : function() {\r\n      if (this.position !== undefined){\r\n        this.item().active(false);\r\n        this.position++;\r\n      } else {\r\n        this.position = 0;\r\n      };\r\n      if (this.position >= this.length()) {\r\n        this.position=undefined;\r\n        return true;\r\n      };\r\n      while (!this.item().isSelectable()) {\r\n        this.position++;\r\n        if (this.position >= this.length()) {\r\n          this.position=undefined;\r\n          return true;\r\n        }\r\n      };\r\n      this.item().active(true);\r\n      return false;\r\n    },\r\n\r\n    /**\r\n    * Move on to the previous item in container. Returns true if we then leave the container, false otherwise.\r\n    */\r\n    prev : function() {\r\n      if (this.position !== undefined){\r\n        this.item().active(false);\r\n        this.position = (this.position-1)\r\n      } else {\r\n        this.position = (this.items.length-1);\r\n      }\r\n      if (this.position<0) {\r\n        this.position=undefined;\r\n        return true;\r\n      }\r\n      while (!this.item().isSelectable()) {\r\n        this.position--;\r\n        if (this.position<0){\r\n          this.position=undefined;\r\n          return true;\r\n        };\r\n      };\r\n      this.item().active(true);\r\n      return false;\r\n    },\r\n\r\n    further : function () {\r\n      const item = this.item();\r\n      if (item[\"further\"] !== undefined) {\r\n        item[\"further\"].bind(item).apply();\r\n      };\r\n    },\r\n\r\n    enter : function (event) {\r\n      this.item().onclick(event);\r\n    },\r\n\r\n    chop : function () {\r\n      for (let item of this.items) {\r\n        item.chop();\r\n      }\r\n    },\r\n\r\n    add : function (letter) {\r\n      for (let item of this.items) {\r\n        item.add(letter);\r\n      }\r\n    },\r\n\r\n    length : function () {\r\n      return this.items.length;\r\n    },\r\n\r\n    /**\r\n    * \r\n    * @returns The number of items that are selectable. Is the actual length of the list.\r\n    */\r\n    liveLength : function () {\r\n      var ll = 0;\r\n      for (let item of this.items){\r\n        if (item.isSelectable()){\r\n          ll++;\r\n        }\r\n      }\r\n      return ll;\r\n    }\r\n\r\n};\r\n});\r\n\n/**\r\n * Menu with a container for always visible non scrollable items (can also be made invisible)\r\n * Automatically moves the prefix into the container. See containeritem.js for an API of functions\r\n * a container will call on containeritem.\r\n * \r\n * @author Leo Repp, with reused code by Nils Diewald\r\n */\r\n\r\n\r\ndefine('containermenu',[\r\n  'menu',\r\n  'container/container',\r\n  'util'\r\n], function (defaultMenuClass,\r\n             defaultContainerClass) {\r\n\r\n  return {\r\n    /**\r\n     * Create new Container Menu based on the action prefix\r\n     * and a list of menu items.\r\n     *\r\n     * Accepts an associative array containg the elements\r\n     * itemClass, prefixClass, lengthFieldClass, containerClass, containerItemClass\r\n     *\r\n     * @this {Menu}\r\n     * @constructor\r\n     * @param {string} params Context prefix\r\n     * @param {Array.<Array.<string>>} list List of menu items\r\n     * @param {Array.<Array.<containerItem>>} containerList List of container items\r\n     */\r\n    create : function (list, params, containerList) {\r\n      const obj = defaultMenuClass.create(list, params)\r\n          .upgradeTo(this)\r\n          ._init(list, params);\r\n      \r\n      obj._el.classList.add('containermenu');\r\n\r\n      //add container object and allow for own containerClasses\r\n      if (params!==undefined && params[\"containerClass\"] !== undefined) {\r\n        obj._container = params[\"containerClass\"].create(containerList, params);\r\n      } else {\r\n        obj._container = defaultContainerClass.create(containerList, params);\r\n      }\r\n      obj.container().addMenu(obj); //this is your menu, container!\r\n\r\n      // add entry to HTML element\r\n      obj._el.appendChild(obj.container().element());\r\n      obj._el.removeChild(obj._prefix.element()); //different HTML element relationship required\r\n      //Keep prefix as 'pref' style. The additional distance is fine.\r\n      obj.container().addPrefix(obj._prefix); //creates containeritem as base for prefix that then is upgraded to prefix. Also ajust _menu chains.\r\n      return obj;\r\n    },\r\n\r\n    /**\r\n     * Destroy this menu\r\n     * (in case you don't trust the\r\n     * mark and sweep GC)!\r\n     */\r\n    destroy : function () {\r\n      // Upon change also update alwaysmenu.js please\r\n      const t = this;\r\n\r\n      // Remove circular reference to \"this\" in menu\r\n      if (t._el != undefined)\r\n        delete t._el[\"menu\"]; \r\n\r\n      // Remove circular reference to \"this\" in items\r\n      t._items.forEach(function(i) {\r\n        delete i[\"_menu\"];\r\n      });\r\n\r\n      // Remove circular reference to \"this\" in prefix\r\n      delete t._prefix['_menu'];\r\n      delete t._lengthField['_menu'];\r\n      delete t._slider['_menu'];\r\n      t.container().destroy();\r\n      delete t.container()['_menu'];\r\n    },\r\n\r\n    // Arrow key and container treatment\r\n    _keydown : function (e) {\r\n      const t = this;\r\n\r\n      switch (_codeFromEvent(e)) {\r\n\r\n      case 27: // 'Esc'\r\n        e.halt();\r\n        t.hide();\r\n        break;\r\n\r\n      case 38: // 'Up'\r\n        e.halt();\r\n        t.prev();\r\n        break;\r\n\r\n      case 33: // 'Page up'\r\n        e.halt();\r\n        t.pageUp();\r\n        break;\r\n\r\n      case 40: // 'Down'\r\n        e.halt();\r\n        t.next();\r\n        break;\r\n\r\n      case 34: // 'Page down'\r\n        e.halt();\r\n        t.pageDown();\r\n        break;\r\n\r\n      case 39: // 'Right'\r\n        if (t.container().active()){\r\n          t.container().further();\r\n          e.halt();\r\n          break;\r\n        }\r\n\r\n        const item = t.liveItem(t.position);\r\n        \r\n        if (item[\"further\"] !== undefined) {\r\n          item[\"further\"].bind(item).apply();\r\n        };\r\n        \r\n        e.halt();\r\n        break;\r\n\r\n      case 13: // 'Enter'\r\n        // Click on prefix\r\n        if (t.container().active()){\r\n          t.container().enter(e);\r\n        } else { // Click on item\r\n          t.liveItem(t.position).onclick(e);\r\n        };\r\n        e.halt();\r\n        break;\r\n\r\n      case 8: // 'Backspace'\r\n        t.container().chop();\r\n        t.show();\r\n        e.halt();\r\n        break;\r\n      };\r\n    },\r\n\r\n\r\n    // Add characters to prefix and other interested items\r\n    _keypress : function (e) {\r\n      if (e.charCode !== 0) {\r\n        e.halt();\r\n        \r\n        // Add prefix and other interested items\r\n        this.container().add(\r\n          String.fromCharCode(_codeFromEvent(e))\r\n        );\r\n\r\n        this.show();\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Filter the list and make it visible.\r\n     * This is always called once the prefix changes.\r\n     *\r\n     * @param {string} Prefix for filtering the list\r\n     */\r\n    show : function (active) {\r\n      //There are only four new lines, marked with NEW\r\n      const t = this;\r\n\r\n      // show menu based on initial offset\r\n      t._unmark();     // Unmark everything that was marked before\r\n      t.removeItems();\r\n      t.container().exit(); //NEW\r\n\r\n      // Initialize the list\r\n      if (!t._initList()) {\r\n\r\n        // The prefix is not active\r\n        t._prefix.active(true);        \r\n        t.container().makeActive(); //NEW Incase the own\r\n        // list becomes empty we need to make container active for line 129 to work\r\n\r\n        // finally show the element\r\n        t._el.classList.add('visible');\r\n        t.container()._el.classList.add('visible'); //NEW\r\n\r\n        return true;\r\n      };\r\n\r\n      let offset = 0;\r\n\r\n      // Set a chosen value to active and move the viewport\r\n      if (arguments.length === 1) {\r\n\r\n        // Normalize active value\r\n        if (active < 0) {\r\n          active = 0;\r\n        }\r\n        else if (active >= t.liveLength()) {\r\n          active = t.liveLength() - 1;\r\n        };\r\n\r\n        // Item is outside the first viewport\r\n        if (active >= t._limit) {\r\n          offset = active;\r\n          const newOffset = t.liveLength() - t._limit;\r\n          if (offset > newOffset) {\r\n            offset = newOffset;\r\n          };\r\n        };\r\n        \r\n        t.position = active;\r\n      }\r\n\r\n      // Choose the first item\r\n      else if (t._firstActive) {\r\n        t.position = 0;\r\n      }\r\n\r\n      // Choose no item\r\n      else {\r\n        t.position = -1;\r\n      };\r\n\r\n      t.offset = offset;\r\n      t._showItems(offset); // Show new item list\r\n\r\n      // Make chosen value active\r\n      if (t.position !== -1) {\r\n        t.liveItem(t.position).active(true);\r\n      };\r\n\r\n      // The prefix is not active\r\n      t._prefix.active(false);\r\n\r\n      // finally show the element\r\n      t._el.classList.add('visible');\r\n      t.container()._el.classList.add('visible'); //NEW\r\n\r\n      // Add classes for rolling menus\r\n      t._boundary(true);\r\n\r\n      return true;\r\n    },\r\n\r\n\r\n    /**\r\n     * Hide the menu and call the onHide callback.\r\n     */\r\n    hide : function () { //only one new line\r\n      if (!this.dontHide) {\r\n        this.removeItems();\r\n        this._prefix.clear();\r\n        this.onHide();\r\n        this._el.classList.remove('visible');\r\n        this.container()._el.classList.remove('visible'); //NEW\r\n      }\r\n      // this._el.blur();\r\n    },\r\n\r\n\r\n    \r\n    /**\r\n     * Make the next item in the filtered menu active\r\n     */\r\n    next : function () {\r\n      const t = this;\r\n      var notInContainerAnyMore;\r\n      const c = t.container();\r\n      const cLLength = c.liveLength();\r\n      // No list\r\n      if (t.liveLength()===0){\r\n        if (cLLength === 0) return;\r\n        notInContainerAnyMore = c.next();\r\n        if (notInContainerAnyMore) {\r\n          c.next();\r\n        }\r\n        return;\r\n      };\r\n      if (!c.active() && t.position!==-1) {t.liveItem(t.position).active(false);} //this should be enough to ensure a valid t.position\r\n      if (!c.active()){\r\n        t.position++;\r\n      };\r\n      let newItem = t.liveItem(t.position); //progress\r\n      if (newItem === undefined) { //too far\r\n        t.position = -1;\r\n        if (cLLength !== 0){ //actually makes sense to next\r\n          notInContainerAnyMore = t.container().next(); //activate container\r\n          if (notInContainerAnyMore) { //oh, next one (should not happen, because cLLength is now liveLength)\r\n            t.position = 0;\r\n            t._showItems(0);\r\n            newItem=t.liveItem(0);\r\n          };\r\n        } else {\r\n          t.position = 0;\r\n          t._showItems(0);\r\n          newItem=t.liveItem(0);\r\n        };\r\n      }// The next element is after the viewport - roll down\r\n      else if (t.position >= (t.limit() + t.offset)) {\r\n        t.screen(t.position - t.limit() + 1);\r\n      }\r\n      // The next element is before the viewport - roll up\r\n      else if (t.position <= t.offset) {\r\n        t.screen(t.position);\r\n      }\r\n      if (newItem !== undefined) {\r\n        newItem.active(true);\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Make the previous item in the menu active\r\n     */\r\n    prev : function () {\r\n      const t = this;\r\n      var notInContainerAnyMore;\r\n      const c = t.container();\r\n      const cLLength = c.liveLength();\r\n\r\n      // No list\r\n      if (t.liveLength() === 0) {\r\n        if (cLLength === 0) return;\r\n        notInContainerAnyMore = c.prev();\r\n        if (notInContainerAnyMore) {\r\n          c.prev();\r\n        }\r\n        return;\r\n      }\r\n      if (!c.active() && t.position!==-1) {t.liveItem(t.position).active(false);}//this should be enough to ensure a valid t.position\r\n      if (!c.active()){\r\n        t.position--;\r\n      };\r\n      let newItem = t.liveItem(t.position); //progress\r\n      if (newItem === undefined) { //too far\r\n        t.position = -1;\r\n        let offset =  t.liveLength() - t.limit();\r\n        // Normalize offset\r\n        offset = offset < 0 ? 0 : offset;\r\n        if (cLLength !== 0){ //actually makes sense to next\r\n          notInContainerAnyMore = t.container().prev(); //activate container\r\n          if (notInContainerAnyMore) { //oh, next one (should not happen, because cLLength is now liveLength)\r\n            t.position = t.liveLength() - 1;\r\n            newItem = t.liveItem(t.position);\r\n            t._showItems(offset);\r\n          } else {\r\n            t.offset = offset;\r\n          };\r\n        } else {\r\n          t.position = t.liveLength() - 1;\r\n          newItem = t.liveItem(t.position);\r\n          t._showItems(offset);\r\n        }\r\n      }\r\n      // The previous element is before the view - roll up\r\n      else if (t.position < t.offset) {\r\n        t.screen(t.position);\r\n      }\r\n\r\n      // The previous element is after the view - roll down\r\n      else if (t.position >= (t.limit() + t.offset)) {\r\n        t.screen(t.position - t.limit() + 2);\r\n      };\r\n      if (newItem !== undefined) {\r\n        newItem.active(true);\r\n      };\r\n    },\r\n    \r\n    /**\r\n    * Upgrade this object to another object,\r\n    * while private data stays intact.\r\n    *\r\n    * @param {Object} An object with properties.\r\n    */\r\n   upgradeTo : function (props) {\r\n     for (var prop in props) {\r\n       this[prop] = props[prop];\r\n     };\r\n     return this;\r\n   },\r\n\r\n    /**\r\n     * Get the container object\r\n     */\r\n    container : function () {\r\n      return this._container;\r\n    }\r\n\r\n\r\n  };\r\n});\r\n\n/**\r\n * Hint menu item based on MenuItem\r\n */\r\n\r\n\r\ndefine('hint/item',['menu/item', 'util'], function (itemClass) {\r\n  return {\r\n\r\n    /**\r\n     * Create new menu item object.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(itemClass)\r\n\t      .upgradeTo(this)\r\n\t      ._init(params);\r\n    },\r\n\r\n    // Initialize menu item object\r\n    _init : function (params) {\r\n      if (params[0] === undefined ||\r\n\t        params[1] === undefined)\r\n\t      throw new Error(\"Missing parameters\");\r\n      \r\n      this._name   = params[0];\r\n      this._action = params[1];\r\n      this._lcField = ' ' + this._name.toLowerCase();\r\n      \r\n      if (params.length > 2) {\r\n\t      this._desc = params[2];\r\n\t      this._lcField += \" \" + this._desc.toLowerCase();\r\n      };\r\n\r\n      return this;\r\n    },\r\n\r\n    /**\r\n     * Get or set the content of the item.\r\n     */\r\n    content : function (content) {\r\n      if (arguments.length === 1) {\r\n\t      this._content = content;\r\n      };\r\n      return this._content;\r\n    },\r\n  \r\n    /**\r\n     * Override the click action\r\n     * of the menu item.\r\n     */\r\n    onclick : function (e) {\r\n      var m = this.menu();\r\n      // m.hide();\r\n\r\n      // Reset prefix\r\n      m.prefix(\"\");\r\n\r\n      var h = m.hint();\r\n\r\n      // Update input field\r\n      var input = h.inputField();\r\n      input.insert(this._action).update();\r\n\r\n      e.halt();\r\n     \r\n      // show alt\r\n      h.show(true);\r\n    },\r\n\r\n    /**\r\n     * The name of the menu entry.\r\n     */\r\n    name : function () {\r\n      return this._name;\r\n    },\r\n\r\n    /**\r\n     * The action (the string inserted on click)\r\n     * of the menu item.\r\n     */\r\n    action : function () {\r\n      return this._action;\r\n    },\r\n\r\n    /**\r\n     * The description of the menu item.\r\n     */\r\n    desc : function () {\r\n      return this._desc;\r\n    },\r\n\r\n    /**\r\n     * The associated dom element of the\r\n     * menu item.\r\n     */\r\n    element : function () {\r\n      // already defined\r\n      if (this._el !== undefined)\r\n\t      return this._el;\r\n\r\n      // Create list item\r\n      var li = document.createElement(\"li\");\r\n\r\n      if (this.onclick !== undefined) {\r\n\t      li[\"onclick\"] = this.onclick.bind(this);\r\n      };\r\n\r\n      // Create title\r\n      var name =  document.createElement(\"span\");\r\n      name.addT(this._name);\r\n      \r\n      li.appendChild(name);\r\n\r\n      // Create description\r\n      if (this._desc !== undefined) {\r\n\t      var desc = document.createElement(\"span\");\r\n\t      desc.classList.add('desc');\r\n\t      desc.addT(this._desc);\r\n\t      li.appendChild(desc);\r\n      };\r\n      return this._el = li;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('hint/prefix',['menu/prefix'], function (prefixClass) {\r\n  return {\r\n\r\n    /**\r\n     * Create prefix object for the hint helper menu.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(prefixClass).\r\n\t      upgradeTo(this)._init(params);\r\n    },\r\n\r\n    /**\r\n     * Override the prefix action.\r\n     */\r\n    onclick : function (e) {\r\n      const m = this.menu();\r\n      const value = this.value();\r\n      const h = m.hint();\r\n\r\n      h.inputField().insert(value);\r\n      h.active(null);\r\n      m.hide();\r\n      // h.unshow();\r\n      e.halt();\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('hint/lengthField',['menu/lengthField', 'util'], function (lengthFieldClass) {\r\n  return {\r\n\r\n    /**\r\n     * Create lengthField object for the hint helper menu.\r\n     */\r\n    create : function () {\r\n      return Object.create(lengthFieldClass).\r\n\t      upgradeTo(this)._init();\r\n    },\r\n\r\n    /**\r\n     * Override the prefix action.\r\n     */\r\n    add : function (param) {\r\n      this._el.addE('span').addT(param[0] + '--');\r\n\r\n      var desc = this._el.addE('span');\r\n      desc.classList.add(\"desc\");\r\n      desc.addT(param[2] + '--');\r\n      this._el.appendChild(desc);\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Hint menu\r\n */\r\n\r\n\r\n\r\ndefine('hint/menu',[\r\n  'containermenu',\r\n\t'hint/item',\r\n\t'hint/prefix',\r\n\t'hint/lengthField'\r\n], function (\r\n  containerMenuClass,\r\n  itemClass,\r\n  prefixClass,\r\n  lengthFieldClass) {\r\n\r\n  return {\r\n    \r\n    /**\r\n     * Create new hint helper menu.\r\n     */\r\n    create : function (hint, context, params) {\r\n      const obj = containerMenuClass.create(params, {\r\n        itemClass : itemClass,\r\n        prefixClass : prefixClass,\r\n        lengthFieldClass : lengthFieldClass})\r\n\t      .upgradeTo(this);\r\n      obj._context = context;\r\n      obj._el.classList.add('hint');\r\n      obj._hint = hint;\r\n\r\n      // Make the top item always active\r\n      obj._firstActive = true;\r\n\r\n      obj.element().addEventListener('blur', function (e) {\r\n        this.menu.hide(); // WithoutDestruction();\r\n      });\r\n\r\n      // Focus on input field on hide\r\n      obj.onHide = function () {\r\n        const h = this._hint;\r\n        h._inputField.element().focus();\r\n        if (h.active() !== null) {\r\n          if (h._alert.active) {\r\n            h._unshowAlert();\r\n          };\r\n          h.active(null);\r\n        };\r\n      };\r\n\r\n      return obj;\r\n    },\r\n\r\n    /**\r\n     * The hint helper object,\r\n     * the menu is attached to.\r\n     */ \r\n    hint : function () {\r\n      return this._hint;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Regex object for checking the context of the hint\r\n */\r\n\r\n\r\ndefine('hint/contextanalyzer',{\r\n\r\n  /**\r\n   * Create analyzer based on regular expression.\r\n   */\r\n  create : function (regex) {\r\n    return Object.create(this)._init(regex);\r\n  },\r\n\r\n  // Initialize analyzer\r\n  _init : function (regex) {\r\n    try {\r\n      this._regex = new RegExp(regex);\r\n    }\r\n    catch (e) {\r\n      KorAP.log(0, e);\r\n      return;\r\n    };\r\n    return this;\r\n  },\r\n\r\n  /**\r\n   * Check a context based on the analyzer\r\n   * and return a valid context string.\r\n   */\r\n  test : function (text) {\r\n    if (!this._regex.exec(text))\r\n      return;\r\n    return RegExp.$1;\r\n  }\r\n});\r\n\n/**\r\n * Hint menu alert, positioned at the exact char.\r\n */\r\n\r\n\r\ndefine('hint/alert',[],function () {\r\n\r\n  return {\r\n\r\n    /**\r\n     * Construct a new alert object\r\n     */\r\n    create : function (msg) {\r\n      return Object.create(this)._init(msg);\r\n    },\r\n\r\n    // Init\r\n    _init : function (msg) {\r\n      const t = this;\r\n      t._type = 'alert';\r\n      t.active = false;\r\n      t._el = document.createElement('div');\r\n      t._el.style.display = 'none';\r\n      t._el.classList.add('alert', 'hint');\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Show alert.\r\n     */\r\n    show : function (msg) {\r\n      this.active = true;\r\n      const e = this._el;\r\n      e.textContent = msg;\r\n      e.style.display = 'block';\r\n    },\r\n\r\n\r\n    /**\r\n     * Hide alert.\r\n     */\r\n    hide : function () {\r\n      if (!this.active)\r\n\t      return false;\r\n      this._el.style.display = 'none';\r\n      this.active = false;\r\n      return true;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get alert object.\r\n     */\r\n    element : function () {\r\n      return this._el;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Hint menu for Kalamar.\r\n * Based on menu object.\r\n *\r\n * @author Nils Diewald\r\n */\r\n/*\r\n * TODO: Check for cnx/syn=\r\n * TODO: List can be shown when prefix is like 'base/s=pcorenlp/'\r\n * TODO: Sometimes the drop-down box down vanish when list is shown\r\n * TODO: Create should expect an input text field\r\n * TODO: Embed only one single menu (not multiple)\r\n *       By holding the current menu in _active\r\n * TODO: show() should accept a context field (especially for no-context fields,\r\n *       like fragments)\r\n * TODO: Improve context analyzer from hint!\r\n * TODO: Marked annotations should be addable to \"fragments\"\r\n */\r\n\r\n\r\n\r\ndefine('hint',[\r\n  'hint/input',\r\n  'hint/menu',\r\n  'hint/contextanalyzer',\r\n  'hint/alert',\r\n  'util'\r\n], function (inputClass, \r\n             menuClass,\r\n             analyzerClass,\r\n             alertClass) {\r\n\r\n  // Initialize hint array\r\n\r\n  /**\r\n   * KorAP.Hint.create({\r\n   *   inputField : node,\r\n   *   context : context regex\r\n   * });\r\n   */\r\n  return {\r\n\r\n    /**\r\n     * Create new hint helper.\r\n     */\r\n    create : function (param) {\r\n      return Object.create(this)._init(param);\r\n    },\r\n\r\n\r\n    // Initialize hint helper\r\n    _init : function (param) {\r\n      param = param || {};\r\n\r\n      // Holds all menus per prefix context\r\n      this._menuCollection   = {};\r\n      this._alert  = alertClass.create();\r\n\r\n      // Active may either hold an alert or a menu\r\n      this._active = null;\r\n\r\n      // No annotation helper available\r\n      if (!KorAP.annotationHelper) {\r\n        console.log(\"No annotationhelper defined\");\r\n        return;\r\n      };\r\n      \r\n      /**\r\n       * @define {regex} Regular expression for context\r\n       */\r\n      KorAP.context = KorAP.context ||\r\n        \"(?:^|[^-_a-zA-Z0-9])\" +   // Anchor\r\n        \"((?:[-_a-zA-Z0-9]+?)\\/\" + // Foundry\r\n        \"(?:\" +\r\n        \"(?:[-_a-zA-Z0-9]+?)=\" +   // Layer\r\n        \"(?:\"+\r\n        \"(?:[^:=\\/ ]+?):|\" +       // Key\r\n        \"(?:[^-=\\/ ]+?)-\" +        // Node\r\n        \")?\" +\r\n        \")?\" +\r\n        \")$\";\r\n\r\n      // Get input field\r\n      const qfield = param[\"inputField\"] || document.getElementById(\"q-field\");\r\n      if (!qfield)\r\n        return null;\r\n\r\n      // Create input field\r\n      this._inputField = inputClass.create(qfield);\r\n\r\n      // create alert\r\n      const that = this;\r\n\r\n      const c = this._inputField.container();\r\n      c.appendChild(this._alert.element());\r\n      c.addEventListener('click', function (e) {\r\n        if (!this.classList.contains('active')) {\r\n          that.show(false);\r\n        };\r\n      });\r\n\r\n      // Move infobox\r\n      const inputFieldElement = this._inputField.element();\r\n      inputFieldElement.addEventListener(\"keyup\", this.update.bind(this));\r\n      inputFieldElement.addEventListener(\"click\", this.update.bind(this));\r\n\r\n      // Add event listener for key pressed down\r\n      let _down = function (e) {\r\n        if (_codeFromEvent(e) === 40) {\r\n          this.show(false);\r\n          e.halt();\r\n        };\r\n      };\r\n\r\n      inputFieldElement.addEventListener(\r\n        \"keydown\", _down.bind(this), false\r\n      );\r\n\r\n      // Add touch events\r\n      inputFieldElement.addEventListener(\r\n        'touchstart',\r\n        this._touch.bind(this),\r\n        false\r\n      );\r\n      inputFieldElement.addEventListener(\r\n        'touchend',\r\n        this._touch.bind(this),\r\n        false\r\n      );\r\n      inputFieldElement.addEventListener(\r\n        'touchmove',\r\n        this._touch.bind(this),\r\n        false\r\n      );\r\n\r\n      // Set Analyzer for context\r\n      this._analyzer = analyzerClass.create(\r\n        param[\"context\"] || KorAP.context\r\n      );\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return the input field attached to the hint helper.\r\n     */\r\n    inputField : function () {\r\n      return this._inputField;\r\n    },\r\n\r\n\r\n    /**\r\n     * Altert at a specific character position.\r\n     */\r\n    alert : function (charPos, msg) {\r\n      const t = this;\r\n      if (arguments.length === 0)\r\n        return t._alert;\r\n\r\n      // Do not alert if already alerted!\r\n      if (t._alert.active)\r\n        return false;\r\n\r\n      // Move to the correct position\r\n      t._inputField.moveto(charPos);\r\n\r\n      // Set container to active (aka hide the hint helper button)\r\n\r\n      t._alert.show(msg);\r\n      t.active(t._alert);\r\n      return true;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Update input field.\r\n     */\r\n    update : function () {\r\n      this._inputField.update();\r\n      if (this._alert.hide())\r\n        this.active(null);\r\n    },\r\n\r\n\r\n    /**\r\n     * Return hint menu and probably init based on an action\r\n     */\r\n    menu : function (action) {\r\n      if (this._menuCollection[action] === undefined) {\r\n        \r\n        // No matching hint menu\r\n        if (KorAP.annotationHelper[action] === undefined)\r\n          return;\r\n\r\n        // Create matching hint menu\r\n        this._menuCollection[action] = menuClass.create(\r\n          this, action, KorAP.annotationHelper[action]\r\n        );\r\n      };\r\n\r\n      // Return matching hint menu\r\n      return this._menuCollection[action];\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the correct menu based on the context\r\n     */\r\n    contextMenu : function (ifContext) {\r\n      const noC = ifContext ? undefined : this.menu(\"-\");\r\n      \r\n      // Get context (aka left text)\r\n      let context = this._inputField.context();\r\n\r\n      if (context === undefined || context.length === 0) {\r\n        return noC;\r\n      };\r\n\r\n      // Get context (aka left text matching regex)\r\n      context = this._analyzer.test(context);\r\n\r\n      if (context === undefined || context.length == 0) {\r\n        return noC;\r\n      };\r\n\r\n      return this.menu(context) || noC;\r\n    },\r\n\r\n\r\n    /**\r\n     * Activate a certain menu.\r\n     * If a menu is passed, the menu will be activated.\r\n     * If null is passed, the active menu will be deactivated.\r\n     * If nothing is passed, returns the active menu.\r\n     */\r\n    active : function (obj) {\r\n      \r\n      // A menu or null was passed\r\n      if (arguments.length === 1) {        \r\n        const c = this._inputField.container();\r\n       \r\n        // Make the menu active\r\n        if (obj !== null) {\r\n          c.classList.add('active');\r\n          this._active = obj;\r\n        }\r\n\r\n        // Make the menu inactive\r\n        else {\r\n          c.classList.remove('active');\r\n          this._active = null;\r\n        }\r\n      };\r\n\r\n      // Return\r\n      return this._active;\r\n    },\r\n\r\n\r\n    /**\r\n     * Show the menu.\r\n     * Remove all old menus.\r\n     *\r\n     * @param {boolean} Boolean value to indicate if context\r\n     *        is necessary (true) or if the main context should\r\n     *        be shown if context fails.\r\n     *        \r\n     */\r\n    show : function (ifContext) {\r\n\r\n      // Remove the active object\r\n      this._unshow();\r\n      \r\n      // Get the menu\r\n      let menu;\r\n      if (menu = this.contextMenu(ifContext)) {\r\n\r\n        this.active(menu);\r\n\r\n        let e = menu.element();\r\n        // console.log(\"Chrome may send a blur on the old menu here\");\r\n        this._active.element().blur();\r\n        this._inputField.container().appendChild(e);\r\n\r\n        menu.show();\r\n        menu.focus();\r\n        // Focus on input field\r\n        // this.inputField.element.focus();\r\n      }\r\n\r\n      else {\r\n        this._inputField.element().focus();\r\n      };\r\n    },\r\n    \r\n\r\n    // This will get the context of the field\r\n    getContext : function () {},\r\n\r\n\r\n    /**\r\n     * Deactivate the current menu and focus on the input field.\r\n     */\r\n    unshow : function () {\r\n      this._unshow();\r\n      this._inputField.element().focus();\r\n    },\r\n\r\n\r\n    // Catch touch events\r\n    _touch : function (e) {\r\n      if (e.type === 'touchstart') {\r\n        this._lastTouch = e.touches[0].clientY;\r\n      }\r\n\r\n      else if (e.type === 'touchend') {\r\n        this._lastTouch = undefined;\r\n      }\r\n      \r\n      else if (e.type == 'touchmove') {\r\n        if ((this._lastTouch + 10) < e.touches[0].clientY) {\r\n          this.show();\r\n          this._lastTouch = undefined;\r\n        };\r\n        e.halt();\r\n      }\r\n    },\r\n\r\n\r\n    // Unshow the hint menu\r\n    _unshow : function () {\r\n      if (this.active() !== null) {\r\n       \r\n        // This does not work for alert currently!\r\n        if (!this._alert.active) {\r\n\r\n          // TODO: This does not work for webkit?\r\n          this._inputField\r\n            .container()\r\n            .removeChild(this._active.element());\r\n        }\r\n\r\n        else {\r\n          this._unshowAlert();\r\n        };\r\n        \r\n        this.active(null);\r\n      };\r\n    },\r\n\r\n    // Unshow alert\r\n    _unshowAlert : function () {\r\n      this._alert.hide();\r\n      this.active(null);\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Simple cookie based session library that stores\r\n * values in JSON encoded cookies.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\n\r\ndefine('session',{\r\n  /**\r\n   * Create a new session.\r\n   * Expects a name or defaults to 'korap'\r\n   */\r\n  create : function (name = 'korap') {\r\n    const obj = Object.create(this);\r\n    obj._name = name.toLowerCase();\r\n    obj._hash = {};\r\n    obj._parse();\r\n    return obj;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get a value based on a key.\r\n   * The value can be complex, as the value is stored as JSON.\r\n   */\r\n  get : function (key) {\r\n    return this._hash[key.toLowerCase()];\r\n  },\r\n\r\n\r\n  /**\r\n   * Set a value based on a key.\r\n   * The value can be complex, as the value is stored as JSON.\r\n   */\r\n  set : function (key, value) {\r\n    this._hash[key] = value;\r\n    this._store();\r\n  },\r\n\r\n\r\n  /**\r\n   * Clears the session by removing the cookie\r\n   */\r\n  clear : function () {\r\n    this._hash = {};\r\n    document.cookie = this._name + '=; expires=-1';\r\n  },\r\n\r\n\r\n  /* Store cookie */\r\n  _store : function () {\r\n    document.cookie = this.toString();\r\n  },\r\n\r\n\r\n  /**\r\n   * Stringify session cookie.\r\n   */\r\n  toString : function () {\r\n    /*\r\n      var date = new Date();\r\n      date.setYear(date.getFullYear() + 1);\r\n    */\r\n    return this._name + '=' + encodeURIComponent(JSON.stringify(this._hash)) + ';SameSite=Lax';\r\n  },\r\n\r\n\r\n  /**\r\n   * Parse cookie\r\n   */\r\n  _parse : function () {\r\n    document.cookie.split(';').forEach(\r\n      function (i) {\r\n        const pair = i.split('=');\r\n        const name = pair[0].trim().toLowerCase();\r\n        if (name === this._name) {\r\n\t        if (pair.length === 1 || pair[1].length === 0)\r\n\t          return;\r\n          this._hash = JSON.parse(decodeURIComponent(pair[1]));\r\n\t        return;\r\n        };\r\n      },\r\n      this);\r\n  }\r\n});\r\n\n/**\r\n * Open and close a tutorial page.\r\n * The current page is stored and retrieved in a session cookie.\r\n */\r\n// TODO: Make this a panel\r\n// TODO: Add query mechanism!\r\n// TODO: Highlight current section:\r\n//       http://stackoverflow.com/questions/24887258/highlight-navigation-link-as-i-scroll-down-the-page\r\n\r\n\r\ndefine('tutorial',['session','buttongroup','util'], function (sessionClass, buttonGroupClass) {\r\n\r\n  // Localization values\r\n  const loc   = KorAP.Locale;\r\n  loc.CLOSE = loc.CLOSE || 'Close';\r\n\r\n  const d = document;\r\n  \r\n  return {\r\n\r\n    /**\r\n     * Create new tutorial object.\r\n     * Accepts an element to bind the tutorial window to.\r\n     */\r\n    create : function (obj,session) {\r\n      if (!obj)\r\n\t      return null;\r\n      return Object.create(this)._init(obj,session);\r\n    },\r\n\r\n\r\n    // Initialize Tutorial object\r\n    _init : function (obj, session) {\r\n      const t = this;\r\n\r\n      if (session === undefined) {\r\n\t      t._session = sessionClass.create();\r\n      }\r\n      else {\r\n\t      t._session = session;\r\n      };\r\n    \r\n      if (obj) {\r\n\t      t._show = obj;\r\n\t      t.start = obj.getAttribute('href');\r\n\r\n        // Unknown which tutorial to show\r\n        if (!t.start)\r\n          return null;\r\n        \r\n\t      obj.removeAttribute('href');\r\n\r\n\t      obj.onclick = function () {\r\n\t        this.show();\r\n\t      }.bind(t);\r\n\r\n\t      // Injects a tutorial div to the body\r\n\t      const div = d.createElement('div');\r\n\t      div.setAttribute('id', 'tutorial');\r\n\t      div.style.display = 'none';\r\n\t      d.getElementsByTagName('body')[0].appendChild(div);\r\n\r\n\t      t._iframe = null;\r\n\t      t._el = div;\r\n\r\n\t      // Some fields\r\n\t      t._ql     = d.getElementById(\"ql-field\");\r\n\t      t._q      = d.getElementById(\"q-field\")\r\n\t      t._cutoff = d.getElementById(\"q-cutoff-field\");\r\n      };\r\n\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Initialize a search with a defined query.\r\n     */\r\n    useQuery : function (e) {\r\n      const t = this;\r\n      const q  = e.getAttribute(\"data-query\"),\r\n            ql = e.getAttribute(\"data-query-language\"),\r\n            qc = e.getAttribute(\"data-query-cutoff\");\r\n\r\n      if (qc !== 0 && qc !== \"0\" && qc !== \"off\" && qc !== null) {\r\n        if (t._cuttoff)\r\n\t        t._cutoff.checked = true;\r\n      };\r\n\r\n      if (KorAP.QLmenu) {\r\n        KorAP.QLmenu.selectValue(ql);\r\n      }\r\n\r\n      else if (t._ql) {\r\n        let found = Array.from(t._ql.options).find(o => o.value === ql);\r\n        if (found)\r\n          found.selected = true;\r\n      };\r\n\r\n      if (t._q)\r\n        t._q.value = q;\r\n\r\n      t.setPage(e);\r\n      t.hide();\r\n    },\r\n\r\n\r\n    /**\r\n     * Decorate a page with query event handler.\r\n     */\r\n    initQueries : function (d) {\r\n      let qs = d.querySelectorAll('pre.query.tutorial:not(.unsupported)');\r\n      const that = this;\r\n      for (var i = 0; i < qs.length; i++) {\r\n\t      qs[i].onclick = function (e) {\r\n\t        that.useQuery(this,e);\r\n\t      };\r\n      };\r\n    },\r\n\r\n    /**\r\n     * Decorate a page with documentation links\r\n     */\r\n    initDocLinks : function (d) {\r\n      const that = this;\r\n      Array.from(d.getElementsByClassName('doc-link')).forEach(\r\n\t      i =>\r\n          i.onclick = function () {\r\n\t          that.setPage(this.getAttribute('href'));\r\n\t          return true;\r\n\t        }\r\n      );\r\n    },\r\n\r\n\r\n    /**\r\n     * Show the tutorial page embedded.\r\n     */\r\n    show : function () {\r\n      const t = this;\r\n      const element = t._el;\r\n      if (element.style.display === 'block')\r\n\t      return;\r\n\r\n      if (t._iframe === null) {\r\n\t      t._iframe = d.createElement('iframe');\r\n\t      t._iframe.setAttribute(\r\n\t        'src',\r\n\t        (t.getPage() || t.start) + '?embedded=true'\r\n\t      );\r\n\r\n        const btn = buttonGroupClass.create(\r\n          ['action','button-view']\r\n        );\r\n\r\n        btn.add(loc.CLOSE, {'cls':['button-icon','close']}, function () {\r\n          element.style.display = 'none';\r\n        });\r\n\r\n        element.appendChild(btn.element());\r\n\r\n\t      // Add open in new window button\r\n\t      // Add scroll to top button\r\n\t      /*\r\n\t        var info = document.createElement('li');\r\n\t        info.appendChild(document.createElement('span'))\r\n\t        .appendChild(document.createTextNode(loc.SHOWINFO));\r\n\t        info.classList.add('info');\r\n\t        info.setAttribute('title', loc.SHOWINFO);\r\n\r\n\t        ul.appendChild(close);\r\n\t        element.appendChild(ul);\r\n        */\r\n\t      element.appendChild(t._iframe);\r\n      };\r\n\r\n      element.style.display = 'block';\r\n    },\r\n\r\n\r\n    /**\r\n     * Close tutorial window.\r\n     */\r\n    hide : function () {\r\n      this._el.style.display = 'none';\r\n    },\r\n\r\n\r\n    /**\r\n     * Set a page to be the current tutorial page.\r\n     * Expects either a string or an element.\r\n     */\r\n    setPage : function (obj) {\r\n      let page = obj;\r\n\r\n      if (typeof page != 'string') {\r\n\t      const l = this._iframe !== null ? window.frames[0].location : window.location;\r\n\r\n\t      page = l.pathname + l.search;\r\n\r\n\t      for (let i = 1; i < 5; i++) {\r\n\t        if ((obj.nodeName === 'SECTION' || obj.nodeName === 'PRE') && obj.hasAttribute('id')) {\r\n\t          page += '#' + obj.getAttribute('id');\r\n\t          break;\r\n\t        }\r\n\t        else {\r\n\t          obj = obj.parentNode;\r\n            if (obj === null)\r\n              break;\r\n\t        };\r\n\t      };\r\n      };\r\n\r\n      this._session.set('tutpage', page);\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the current tutorial URL\r\n     */\r\n    getPage : function () {\r\n      return this._session.get('tutpage');\r\n    }\r\n  };\r\n});\r\n\r\n\n/**\r\n * @license RequireJS domReady 2.0.1 Copyright (c) 2010-2012, The Dojo Foundation All Rights Reserved.\r\n * Available via the MIT or new BSD license.\r\n * see: http://github.com/requirejs/domReady for details\r\n */\r\n/*jslint */\r\n/*global require: false, define: false, requirejs: false,\r\n  window: false, clearInterval: false, document: false,\r\n  self: false, setInterval: false */\r\n\r\n\r\ndefine('lib/domReady',[],function () {\r\n    'use strict';\r\n\r\n    var isTop, testDiv, scrollIntervalId,\r\n        isBrowser = typeof window !== \"undefined\" && window.document,\r\n        isPageLoaded = !isBrowser,\r\n        doc = isBrowser ? document : null,\r\n        readyCalls = [];\r\n\r\n    function runCallbacks(callbacks) {\r\n        var i;\r\n        for (i = 0; i < callbacks.length; i += 1) {\r\n            callbacks[i](doc);\r\n        }\r\n    }\r\n\r\n    function callReady() {\r\n        var callbacks = readyCalls;\r\n\r\n        if (isPageLoaded) {\r\n            //Call the DOM ready callbacks\r\n            if (callbacks.length) {\r\n                readyCalls = [];\r\n                runCallbacks(callbacks);\r\n            }\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Sets the page as loaded.\r\n     */\r\n    function pageLoaded() {\r\n        if (!isPageLoaded) {\r\n            isPageLoaded = true;\r\n            if (scrollIntervalId) {\r\n                clearInterval(scrollIntervalId);\r\n            }\r\n\r\n            callReady();\r\n        }\r\n    }\r\n\r\n    if (isBrowser) {\r\n        if (document.addEventListener) {\r\n            //Standards. Hooray! Assumption here that if standards based,\r\n            //it knows about DOMContentLoaded.\r\n            document.addEventListener(\"DOMContentLoaded\", pageLoaded, false);\r\n            window.addEventListener(\"load\", pageLoaded, false);\r\n        } else if (window.attachEvent) {\r\n            window.attachEvent(\"onload\", pageLoaded);\r\n\r\n            testDiv = document.createElement('div');\r\n            try {\r\n                isTop = window.frameElement === null;\r\n            } catch (e) {}\r\n\r\n            //DOMContentLoaded approximation that uses a doScroll, as found by\r\n            //Diego Perini: http://javascript.nwbox.com/IEContentLoaded/,\r\n            //but modified by other contributors, including jdalton\r\n            if (testDiv.doScroll && isTop && window.external) {\r\n                scrollIntervalId = setInterval(function () {\r\n                    try {\r\n                        testDiv.doScroll();\r\n                        pageLoaded();\r\n                    } catch (e) {}\r\n                }, 30);\r\n            }\r\n        }\r\n\r\n        //Check if document already complete, and if so, just trigger page load\r\n        //listeners. Latest webkit browsers also use \"interactive\", and\r\n        //will fire the onDOMContentLoaded before \"interactive\" but not after\r\n        //entering \"interactive\" or \"complete\". More details:\r\n        //http://dev.w3.org/html5/spec/the-end.html#the-end\r\n        //http://stackoverflow.com/questions/3665561/document-readystate-of-interactive-vs-ondomcontentloaded\r\n        //Hmm, this is more complicated on further use, see \"firing too early\"\r\n        //bug: https://github.com/requirejs/domReady/issues/1\r\n        //so removing the || document.readyState === \"interactive\" test.\r\n        //There is still a window.onload binding that should get fired if\r\n        //DOMContentLoaded is missed.\r\n        if (document.readyState === \"complete\") {\r\n            pageLoaded();\r\n        }\r\n    }\r\n\r\n    /** START OF PUBLIC API **/\r\n\r\n    /**\r\n     * Registers a callback for DOM ready. If DOM is already ready, the\r\n     * callback is called immediately.\r\n     * @param {Function} callback\r\n     */\r\n    function domReady(callback) {\r\n        if (isPageLoaded) {\r\n            callback(doc);\r\n        } else {\r\n            readyCalls.push(callback);\r\n        }\r\n        return domReady;\r\n    }\r\n\r\n    domReady.version = '2.0.1';\r\n\r\n    /**\r\n     * Loader Plugin API method\r\n     */\r\n    domReady.load = function (name, req, onLoad, config) {\r\n        if (config.isBuild) {\r\n            onLoad(null);\r\n        } else {\r\n            domReady(onLoad);\r\n        }\r\n    };\r\n\r\n    /** END OF PUBLIC API **/\r\n\r\n    return domReady;\r\n});\r\n\ndefine('vc/array',[],function () {\r\n  return [\r\n    // layerInfo                   // stored\r\n    // tokenSource                 // stored\r\n    ['author', 'text'],            // text\r\n    // ['biblEditionStatement', 'string'], // stored\r\n    ['corpusAuthor', 'text'],      // text\r\n    // ['corpusEditor', 'string'], // stored\r\n    ['corpusSigle', 'string'],     // string \r\n    ['corpusSubTitle', 'text']  ,  // text\r\n    ['corpusTitle', 'text'],       // text\r\n    ['creationDate', 'date'],      // int\r\n    ['docAuthor', 'text'],         // text\r\n    // ['docEditor', 'string'],    // stored\r\n    ['docSigle', 'string'],        // string\r\n    ['docSubTitle', 'text'],       // text\r\n    ['docTitle', 'text'],          // text\r\n    // ['editor', 'string'],       // stored\r\n    // ['fileEditionStatement', 'string'], // stored\r\n    ['foundries', 'string'],       // keywords\r\n    ['keywords', 'string'],        // keywords\r\n    ['language', 'string'],        // string\r\n    ['license', 'string'],         // string\r\n    // ['pages', 'string'],        // stored\r\n    ['pubDate', 'date'],           // int\r\n    // ['publisher', 'string'],    // stored\r\n    ['pubPlace', 'string'],        // string\r\n    // ['reference', 'string'],    // stored\r\n    ['subTitle', 'text'],          // text\r\n    ['textClass', 'string'],       // keyword\r\n    ['textColumn', 'string'],      // string\r\n    ['textDomain', 'string'],      // string\r\n    ['textSigle', 'string'],       // string\r\n    ['textType', 'string'],        // string\r\n    ['textTypeArt', 'string'],     // string\r\n    ['textTypeRef', 'string'],     // string\r\n    ['title', 'text']              // text\r\n  ]\r\n});\r\n\n/*global define*/\r\n(function (global, undefined) {\r\n\t\"use strict\";\r\n\r\n\tvar document = global.document,\r\n\t    Alertify;\r\n\r\n\tAlertify = function () {\r\n\r\n\t\tvar _alertify = {},\r\n\t\t    dialogs   = {},\r\n\t\t    isopen    = false,\r\n\t\t    keys      = { ENTER: 13, ESC: 27, SPACE: 32 },\r\n\t\t    queue     = [],\r\n\t\t    $, btnCancel, btnOK, btnReset, btnResetBack, btnFocus, elCallee, elCover, elDialog, elLog, form, input, getTransitionEvent;\r\n\r\n\t\t/**\r\n\t\t * Markup pieces\r\n\t\t * @type {Object}\r\n\t\t */\r\n\t\tdialogs = {\r\n\t\t\tbuttons : {\r\n\t\t\t\tholder : \"<nav class=\\\"alertify-buttons\\\">{{buttons}}</nav>\",\r\n\t\t\t\tsubmit : \"<button type=\\\"submit\\\" class=\\\"alertify-button alertify-button-ok\\\" id=\\\"alertify-ok\\\">{{ok}}</button>\",\r\n\t\t\t\tok     : \"<button class=\\\"alertify-button alertify-button-ok\\\" id=\\\"alertify-ok\\\">{{ok}}</button>\",\r\n\t\t\t\tcancel : \"<button class=\\\"alertify-button alertify-button-cancel\\\" id=\\\"alertify-cancel\\\">{{cancel}}</button>\"\r\n\t\t\t},\r\n\t\t\tinput   : \"<div class=\\\"alertify-text-wrapper\\\"><input type=\\\"text\\\" class=\\\"alertify-text\\\" id=\\\"alertify-text\\\"></div>\",\r\n\t\t\tmessage : \"<p class=\\\"alertify-message\\\">{{message}}</p>\",\r\n\t\t\tlog     : \"<article class=\\\"alertify-log{{class}}\\\">{{message}}</article>\"\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Return the proper transitionend event\r\n\t\t * @return {String}    Transition type string\r\n\t\t */\r\n\t\tgetTransitionEvent = function () {\r\n\t\t\tvar t,\r\n\t\t\t    type,\r\n\t\t\t    supported   = false,\r\n\t\t\t    el          = document.createElement(\"fakeelement\"),\r\n\t\t\t    transitions = {\r\n\t\t\t\t    \"WebkitTransition\" : \"webkitTransitionEnd\",\r\n\t\t\t\t    \"MozTransition\"    : \"transitionend\",\r\n\t\t\t\t    \"OTransition\"      : \"otransitionend\",\r\n\t\t\t\t    \"transition\"       : \"transitionend\"\r\n\t\t\t    };\r\n\r\n\t\t\tfor (t in transitions) {\r\n\t\t\t\tif (el.style[t] !== undefined) {\r\n\t\t\t\t\ttype      = transitions[t];\r\n\t\t\t\t\tsupported = true;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\treturn {\r\n\t\t\t\ttype      : type,\r\n\t\t\t\tsupported : supported\r\n\t\t\t};\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Shorthand for document.getElementById()\r\n\t\t *\r\n\t\t * @param  {String} id    A specific element ID\r\n\t\t * @return {Object}       HTML element\r\n\t\t */\r\n\t\t$ = function (id) {\r\n\t\t\treturn document.getElementById(id);\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Alertify private object\r\n\t\t * @type {Object}\r\n\t\t */\r\n\t\t_alertify = {\r\n\r\n\t\t\t/**\r\n\t\t\t * Labels object\r\n\t\t\t * @type {Object}\r\n\t\t\t */\r\n\t\t\tlabels : {\r\n\t\t\t\tok     : \"OK\",\r\n\t\t\t\tcancel : \"Cancel\"\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Delay number\r\n\t\t\t * @type {Number}\r\n\t\t\t */\r\n\t\t\tdelay : 5000,\r\n\r\n\t\t\t/**\r\n\t\t\t * Whether buttons are reversed (default is secondary/primary)\r\n\t\t\t * @type {Boolean}\r\n\t\t\t */\r\n\t\t\tbuttonReverse : false,\r\n\r\n\t\t\t/**\r\n\t\t\t * Which button should be focused by default\r\n\t\t\t * @type {String}\t\"ok\" (default), \"cancel\", or \"none\"\r\n\t\t\t */\r\n\t\t\tbuttonFocus : \"ok\",\r\n\r\n\t\t\t/**\r\n\t\t\t * Set the transition event on load\r\n\t\t\t * @type {[type]}\r\n\t\t\t */\r\n\t\t\ttransition : undefined,\r\n\r\n\t\t\t/**\r\n\t\t\t * Set the proper button click events\r\n\t\t\t *\r\n\t\t\t * @param {Function} fn    [Optional] Callback function\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\taddListeners : function (fn) {\r\n\t\t\t\tvar hasOK     = (typeof btnOK !== \"undefined\"),\r\n\t\t\t\t    hasCancel = (typeof btnCancel !== \"undefined\"),\r\n\t\t\t\t    hasInput  = (typeof input !== \"undefined\"),\r\n\t\t\t\t    val       = \"\",\r\n\t\t\t\t    self      = this,\r\n\t\t\t\t    ok, cancel, common, key, reset;\r\n\r\n\t\t\t\t// ok event handler\r\n\t\t\t\tok = function (event) {\r\n\t\t\t\t\tif (typeof event.preventDefault !== \"undefined\") event.preventDefault();\r\n\t\t\t\t\tcommon(event);\r\n\t\t\t\t\tif (typeof input !== \"undefined\") val = input.value;\r\n\t\t\t\t\tif (typeof fn === \"function\") {\r\n\t\t\t\t\t\tif (typeof input !== \"undefined\") {\r\n\t\t\t\t\t\t\tfn(true, val);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse fn(true);\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// cancel event handler\r\n\t\t\t\tcancel = function (event) {\r\n\t\t\t\t\tif (typeof event.preventDefault !== \"undefined\") event.preventDefault();\r\n\t\t\t\t\tcommon(event);\r\n\t\t\t\t\tif (typeof fn === \"function\") fn(false);\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// common event handler (keyup, ok and cancel)\r\n\t\t\t\tcommon = function (event) {\r\n\t\t\t\t\tself.hide();\r\n\t\t\t\t\tself.unbind(document.body, \"keyup\", key);\r\n\t\t\t\t\tself.unbind(btnReset, \"focus\", reset);\r\n\t\t\t\t\tif (hasOK) self.unbind(btnOK, \"click\", ok);\r\n\t\t\t\t\tif (hasCancel) self.unbind(btnCancel, \"click\", cancel);\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// keyup handler\r\n\t\t\t\tkey = function (event) {\r\n\t\t\t\t\tvar keyCode = event.keyCode;\r\n\t\t\t\t\tif ((keyCode === keys.SPACE && !hasInput) || (hasInput && keyCode === keys.ENTER)) ok(event);\r\n\t\t\t\t\tif (keyCode === keys.ESC && hasCancel) cancel(event);\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// reset focus to first item in the dialog\r\n\t\t\t\treset = function (event) {\r\n\t\t\t\t\tif (hasInput) input.focus();\r\n\t\t\t\t\telse if (!hasCancel || self.buttonReverse) btnOK.focus();\r\n\t\t\t\t\telse btnCancel.focus();\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// handle reset focus link\r\n\t\t\t\t// this ensures that the keyboard focus does not\r\n\t\t\t\t// ever leave the dialog box until an action has\r\n\t\t\t\t// been taken\r\n\t\t\t\tthis.bind(btnReset, \"focus\", reset);\r\n\t\t\t\tthis.bind(btnResetBack, \"focus\", reset);\r\n\t\t\t\t// handle OK click\r\n\t\t\t\tif (hasOK) this.bind(btnOK, \"click\", ok);\r\n\t\t\t\t// handle Cancel click\r\n\t\t\t\tif (hasCancel) this.bind(btnCancel, \"click\", cancel);\r\n\t\t\t\t// listen for keys, Cancel => ESC\r\n\t\t\t\tthis.bind(document.body, \"keyup\", key);\r\n\t\t\t\tif (!this.transition.supported) {\r\n\t\t\t\t\tthis.setFocus();\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Bind events to elements\r\n\t\t\t *\r\n\t\t\t * @param  {Object}   el       HTML Object\r\n\t\t\t * @param  {Event}    event    Event to attach to element\r\n\t\t\t * @param  {Function} fn       Callback function\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tbind : function (el, event, fn) {\r\n\t\t\t\tif (typeof el.addEventListener === \"function\") {\r\n\t\t\t\t\tel.addEventListener(event, fn, false);\r\n\t\t\t\t} else if (el.attachEvent) {\r\n\t\t\t\t\tel.attachEvent(\"on\" + event, fn);\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Use alertify as the global error handler (using window.onerror)\r\n\t\t\t *\r\n\t\t\t * @return {boolean} success\r\n\t\t\t */\r\n\t\t\thandleErrors : function () {\r\n\t\t\t\tif (typeof global.onerror !== \"undefined\") {\r\n\t\t\t\t\tvar self = this;\r\n\t\t\t\t\tglobal.onerror = function (msg, url, line) {\r\n\t\t\t\t\t\tself.error(\"[\" + msg + \" on line \" + line + \" of \" + url + \"]\", 0);\r\n\t\t\t\t\t};\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t} else {\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Append button HTML strings\r\n\t\t\t *\r\n\t\t\t * @param {String} secondary    The secondary button HTML string\r\n\t\t\t * @param {String} primary      The primary button HTML string\r\n\t\t\t *\r\n\t\t\t * @return {String}             The appended button HTML strings\r\n\t\t\t */\r\n\t\t\tappendButtons : function (secondary, primary) {\r\n\t\t\t\treturn this.buttonReverse ? primary + secondary : secondary + primary;\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Build the proper message box\r\n\t\t\t *\r\n\t\t\t * @param  {Object} item    Current object in the queue\r\n\t\t\t *\r\n\t\t\t * @return {String}         An HTML string of the message box\r\n\t\t\t */\r\n\t\t\tbuild : function (item) {\r\n\t\t\t\tvar html    = \"\",\r\n\t\t\t\t    type    = item.type,\r\n\t\t\t\t    message = item.message,\r\n\t\t\t\t    css     = item.cssClass || \"\";\r\n\r\n\t\t\t\thtml += \"<div class=\\\"alertify-dialog\\\">\";\r\n\t\t\t\thtml += \"<a id=\\\"alertify-resetFocusBack\\\" class=\\\"alertify-resetFocus\\\" href=\\\"#\\\">Reset Focus</a>\";\r\n\r\n\t\t\t\tif (_alertify.buttonFocus === \"none\") html += \"<a href=\\\"#\\\" id=\\\"alertify-noneFocus\\\" class=\\\"alertify-hidden\\\"></a>\";\r\n\r\n\t\t\t\t// doens't require an actual form\r\n\t\t\t\tif (type === \"prompt\") html += \"<div id=\\\"alertify-form\\\">\";\r\n\r\n\t\t\t\thtml += \"<article class=\\\"alertify-inner\\\">\";\r\n\t\t\t\thtml += dialogs.message.replace(\"{{message}}\", message);\r\n\r\n\t\t\t\tif (type === \"prompt\") html += dialogs.input;\r\n\r\n\t\t\t\thtml += dialogs.buttons.holder;\r\n\t\t\t\thtml += \"</article>\";\r\n\r\n\t\t\t\tif (type === \"prompt\") html += \"</div>\";\r\n\r\n\t\t\t\thtml += \"<a id=\\\"alertify-resetFocus\\\" class=\\\"alertify-resetFocus\\\" href=\\\"#\\\">Reset Focus</a>\";\r\n\t\t\t\thtml += \"</div>\";\r\n\r\n\t\t\t\tswitch (type) {\r\n\t\t\t\tcase \"confirm\":\r\n\t\t\t\t\thtml = html.replace(\"{{buttons}}\", this.appendButtons(dialogs.buttons.cancel, dialogs.buttons.ok));\r\n\t\t\t\t\thtml = html.replace(\"{{ok}}\", this.labels.ok).replace(\"{{cancel}}\", this.labels.cancel);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"prompt\":\r\n\t\t\t\t\thtml = html.replace(\"{{buttons}}\", this.appendButtons(dialogs.buttons.cancel, dialogs.buttons.submit));\r\n\t\t\t\t\thtml = html.replace(\"{{ok}}\", this.labels.ok).replace(\"{{cancel}}\", this.labels.cancel);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"alert\":\r\n\t\t\t\t\thtml = html.replace(\"{{buttons}}\", dialogs.buttons.ok);\r\n\t\t\t\t\thtml = html.replace(\"{{ok}}\", this.labels.ok);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\r\n\t\t\t\telDialog.className = \"alertify alertify-\" + type + \" \" + css;\r\n\t\t\t\telCover.className  = \"alertify-cover\";\r\n\t\t\t\treturn html;\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Close the log messages\r\n\t\t\t *\r\n\t\t\t * @param  {Object} elem    HTML Element of log message to close\r\n\t\t\t * @param  {Number} wait    [optional] Time (in ms) to wait before automatically hiding the message, if 0 never hide\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tclose : function (elem, wait) {\r\n\t\t\t\t// Unary Plus: +\"2\" === 2\r\n\t\t\t\tvar timer = (wait && !isNaN(wait)) ? +wait : this.delay,\r\n\t\t\t\t    self  = this,\r\n\t\t\t\t    hideElement, transitionDone;\r\n\r\n\t\t\t\t// set click event on log messages\r\n\t\t\t\tthis.bind(elem, \"click\", function () {\r\n\t\t\t\t\thideElement(elem);\r\n\t\t\t\t});\r\n\t\t\t\t// Hide the dialog box after transition\r\n\t\t\t\t// This ensure it doens't block any element from being clicked\r\n\t\t\t\ttransitionDone = function (event) {\r\n\t\t\t\t\tevent.stopPropagation();\r\n\t\t\t\t\t// unbind event so function only gets called once\r\n\t\t\t\t\tself.unbind(this, self.transition.type, transitionDone);\r\n\t\t\t\t\t// remove log message\r\n\t\t\t\t\telLog.removeChild(this);\r\n\t\t\t\t\tif (!elLog.hasChildNodes()) elLog.className += \" alertify-logs-hidden\";\r\n\t\t\t\t};\r\n\t\t\t\t// this sets the hide class to transition out\r\n\t\t\t\t// or removes the child if css transitions aren't supported\r\n\t\t\t\thideElement = function (el) {\r\n\t\t\t\t\t// ensure element exists\r\n\t\t\t\t\tif (typeof el !== \"undefined\" && el.parentNode === elLog) {\r\n\t\t\t\t\t\t// whether CSS transition exists\r\n\t\t\t\t\t\tif (self.transition.supported) {\r\n\t\t\t\t\t\t\tself.bind(el, self.transition.type, transitionDone);\r\n\t\t\t\t\t\t\tel.className += \" alertify-log-hide\";\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\telLog.removeChild(el);\r\n\t\t\t\t\t\t\tif (!elLog.hasChildNodes()) elLog.className += \" alertify-logs-hidden\";\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t};\r\n\t\t\t\t// never close (until click) if wait is set to 0\r\n\t\t\t\tif (wait === 0) return;\r\n\t\t\t\t// set timeout to auto close the log message\r\n\t\t\t\tsetTimeout(function () { hideElement(elem); }, timer);\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Create a dialog box\r\n\t\t\t *\r\n\t\t\t * @param  {String}   message        The message passed from the callee\r\n\t\t\t * @param  {String}   type           Type of dialog to create\r\n\t\t\t * @param  {Function} fn             [Optional] Callback function\r\n\t\t\t * @param  {String}   placeholder    [Optional] Default value for prompt input field\r\n\t\t\t * @param  {String}   cssClass       [Optional] Class(es) to append to dialog box\r\n\t\t\t *\r\n\t\t\t * @return {Object}\r\n\t\t\t */\r\n\t\t\tdialog : function (message, type, fn, placeholder, cssClass) {\r\n\t\t\t\t// set the current active element\r\n\t\t\t\t// this allows the keyboard focus to be resetted\r\n\t\t\t\t// after the dialog box is closed\r\n\t\t\t\telCallee = document.activeElement;\r\n\t\t\t\t// check to ensure the alertify dialog element\r\n\t\t\t\t// has been successfully created\r\n\t\t\t\tvar check = function () {\r\n\t\t\t\t\tif ((elLog && elLog.scrollTop !== null) && (elCover && elCover.scrollTop !== null)) return;\r\n\t\t\t\t\telse check();\r\n\t\t\t\t};\r\n\t\t\t\t// error catching\r\n\t\t\t\tif (typeof message !== \"string\") throw new Error(\"message must be a string\");\r\n\t\t\t\tif (typeof type !== \"string\") throw new Error(\"type must be a string\");\r\n\t\t\t\tif (typeof fn !== \"undefined\" && typeof fn !== \"function\") throw new Error(\"fn must be a function\");\r\n\t\t\t\t// initialize alertify if it hasn't already been done\r\n\t\t\t\tthis.init();\r\n\t\t\t\tcheck();\r\n\r\n\t\t\t\tqueue.push({ type: type, message: message, callback: fn, placeholder: placeholder, cssClass: cssClass });\r\n\t\t\t\tif (!isopen) this.setup();\r\n\r\n\t\t\t\treturn this;\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Extend the log method to create custom methods\r\n\t\t\t *\r\n\t\t\t * @param  {String} type    Custom method name\r\n\t\t\t *\r\n\t\t\t * @return {Function}\r\n\t\t\t */\r\n\t\t\textend : function (type) {\r\n\t\t\t\tif (typeof type !== \"string\") throw new Error(\"extend method must have exactly one paramter\");\r\n\t\t\t\treturn function (message, wait) {\r\n\t\t\t\t\tthis.log(message, type, wait);\r\n\t\t\t\t\treturn this;\r\n\t\t\t\t};\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Hide the dialog and rest to defaults\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\thide : function () {\r\n\t\t\t\tvar transitionDone,\r\n\t\t\t\t    self = this;\r\n\t\t\t\t// remove reference from queue\r\n\t\t\t\tqueue.splice(0,1);\r\n\t\t\t\t// if items remaining in the queue\r\n\t\t\t\tif (queue.length > 0) this.setup(true);\r\n\t\t\t\telse {\r\n\t\t\t\t\tisopen = false;\r\n\t\t\t\t\t// Hide the dialog box after transition\r\n\t\t\t\t\t// This ensure it doens't block any element from being clicked\r\n\t\t\t\t\ttransitionDone = function (event) {\r\n\t\t\t\t\t\tevent.stopPropagation();\r\n\t\t\t\t\t\t// unbind event so function only gets called once\r\n\t\t\t\t\t\tself.unbind(elDialog, self.transition.type, transitionDone);\r\n\t\t\t\t\t};\r\n\t\t\t\t\t// whether CSS transition exists\r\n\t\t\t\t\tif (this.transition.supported) {\r\n\t\t\t\t\t\tthis.bind(elDialog, this.transition.type, transitionDone);\r\n\t\t\t\t\t\telDialog.className = \"alertify alertify-hide alertify-hidden\";\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\telDialog.className = \"alertify alertify-hide alertify-hidden alertify-isHidden\";\r\n\t\t\t\t\t}\r\n\t\t\t\t\telCover.className  = \"alertify-cover alertify-cover-hidden\";\r\n\t\t\t\t\t// set focus to the last element or body\r\n\t\t\t\t\t// after the dialog is closed\r\n\t\t\t\t\telCallee.focus();\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Initialize Alertify\r\n\t\t\t * Create the 2 main elements\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tinit : function () {\r\n\t\t\t\t// ensure legacy browsers support html5 tags\r\n\t\t\t\tdocument.createElement(\"nav\");\r\n\t\t\t\tdocument.createElement(\"article\");\r\n\t\t\t\tdocument.createElement(\"section\");\r\n\t\t\t\t// cover\r\n\t\t\t\tif ($(\"alertify-cover\") == null) {\r\n\t\t\t\t\telCover = document.createElement(\"div\");\r\n\t\t\t\t\telCover.setAttribute(\"id\", \"alertify-cover\");\r\n\t\t\t\t\telCover.className = \"alertify-cover alertify-cover-hidden\";\r\n\t\t\t\t\tdocument.body.appendChild(elCover);\r\n\t\t\t\t}\r\n\t\t\t\t// main element\r\n\t\t\t\tif ($(\"alertify\") == null) {\r\n\t\t\t\t\tisopen = false;\r\n\t\t\t\t\tqueue = [];\r\n\t\t\t\t\telDialog = document.createElement(\"section\");\r\n\t\t\t\t\telDialog.setAttribute(\"id\", \"alertify\");\r\n\t\t\t\t\telDialog.className = \"alertify alertify-hidden\";\r\n\t\t\t\t\tdocument.body.appendChild(elDialog);\r\n\t\t\t\t}\r\n\t\t\t\t// log element\r\n\t\t\t\tif ($(\"alertify-logs\") == null) {\r\n\t\t\t\t\telLog = document.createElement(\"section\");\r\n\t\t\t\t\telLog.setAttribute(\"id\", \"alertify-logs\");\r\n\t\t\t\t\telLog.className = \"alertify-logs alertify-logs-hidden\";\r\n\t\t\t\t\tdocument.body.appendChild(elLog);\r\n\t\t\t\t}\r\n\t\t\t\t// set tabindex attribute on body element\r\n\t\t\t\t// this allows script to give it focus\r\n\t\t\t\t// after the dialog is closed\r\n\t\t\t\tdocument.body.setAttribute(\"tabindex\", \"0\");\r\n\t\t\t\t// set transition type\r\n\t\t\t\tthis.transition = getTransitionEvent();\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Show a new log message box\r\n\t\t\t *\r\n\t\t\t * @param  {String} message    The message passed from the callee\r\n\t\t\t * @param  {String} type       [Optional] Optional type of log message\r\n\t\t\t * @param  {Number} wait       [Optional] Time (in ms) to wait before auto-hiding the log\r\n\t\t\t *\r\n\t\t\t * @return {Object}\r\n\t\t\t */\r\n\t\t\tlog : function (message, type, wait) {\r\n\t\t\t\t// check to ensure the alertify dialog element\r\n\t\t\t\t// has been successfully created\r\n\t\t\t\tvar check = function () {\r\n\t\t\t\t\tif (elLog && elLog.scrollTop !== null) return;\r\n\t\t\t\t\telse check();\r\n\t\t\t\t};\r\n\t\t\t\t// initialize alertify if it hasn't already been done\r\n\t\t\t\tthis.init();\r\n\t\t\t\tcheck();\r\n\r\n\t\t\t\telLog.className = \"alertify-logs\";\r\n\t\t\t\tthis.notify(message, type, wait);\r\n\t\t\t\treturn this;\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Add new log message\r\n\t\t\t * If a type is passed, a class name \"alertify-log-{type}\" will get added.\r\n\t\t\t * This allows for custom look and feel for various types of notifications.\r\n\t\t\t *\r\n\t\t\t * @param  {String} message    The message passed from the callee\r\n\t\t\t * @param  {String} type       [Optional] Type of log message\r\n\t\t\t * @param  {Number} wait       [Optional] Time (in ms) to wait before auto-hiding\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tnotify : function (message, type, wait) {\r\n\t\t\t\tvar log = document.createElement(\"article\");\r\n\t\t\t\tlog.className = \"alertify-log\" + ((typeof type === \"string\" && type !== \"\") ? \" alertify-log-\" + type : \"\");\r\n\t\t\t\tlog.innerHTML = message;\r\n\t\t\t\t// append child\r\n\t\t\t\telLog.appendChild(log);\r\n\t\t\t\t// triggers the CSS animation\r\n\t\t\t\tsetTimeout(function() { log.className = log.className + \" alertify-log-show\"; }, 50);\r\n\t\t\t\tthis.close(log, wait);\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Set properties\r\n\t\t\t *\r\n\t\t\t * @param {Object} args     Passing parameters\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tset : function (args) {\r\n\t\t\t\tvar k;\r\n\t\t\t\t// error catching\r\n\t\t\t\tif (typeof args !== \"object\" && args instanceof Array) throw new Error(\"args must be an object\");\r\n\t\t\t\t// set parameters\r\n\t\t\t\tfor (k in args) {\r\n\t\t\t\t\tif (args.hasOwnProperty(k)) {\r\n\t\t\t\t\t\tthis[k] = args[k];\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Common place to set focus to proper element\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tsetFocus : function () {\r\n\t\t\t\tif (input) {\r\n\t\t\t\t\tinput.focus();\r\n\t\t\t\t\tinput.select();\r\n\t\t\t\t}\r\n\t\t\t\telse btnFocus.focus();\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Initiate all the required pieces for the dialog box\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tsetup : function (fromQueue) {\r\n\t\t\t\tvar item = queue[0],\r\n\t\t\t\t    self = this,\r\n\t\t\t\t    transitionDone;\r\n\r\n\t\t\t\t// dialog is open\r\n\t\t\t\tisopen = true;\r\n\t\t\t\t// Set button focus after transition\r\n\t\t\t\ttransitionDone = function (event) {\r\n\t\t\t\t\tevent.stopPropagation();\r\n\t\t\t\t\tself.setFocus();\r\n\t\t\t\t\t// unbind event so function only gets called once\r\n\t\t\t\t\tself.unbind(elDialog, self.transition.type, transitionDone);\r\n\t\t\t\t};\r\n\t\t\t\t// whether CSS transition exists\r\n\t\t\t\tif (this.transition.supported && !fromQueue) {\r\n\t\t\t\t\tthis.bind(elDialog, this.transition.type, transitionDone);\r\n\t\t\t\t}\r\n\t\t\t\t// build the proper dialog HTML\r\n\t\t\t\telDialog.innerHTML = this.build(item);\r\n\t\t\t\t// assign all the common elements\r\n\t\t\t\tbtnReset  = $(\"alertify-resetFocus\");\r\n\t\t\t\tbtnResetBack  = $(\"alertify-resetFocusBack\");\r\n\t\t\t\tbtnOK     = $(\"alertify-ok\")     || undefined;\r\n\t\t\t\tbtnCancel = $(\"alertify-cancel\") || undefined;\r\n\t\t\t\tbtnFocus  = (_alertify.buttonFocus === \"cancel\") ? btnCancel : ((_alertify.buttonFocus === \"none\") ? $(\"alertify-noneFocus\") : btnOK),\r\n\t\t\t\tinput     = $(\"alertify-text\")   || undefined;\r\n\t\t\t\tform      = $(\"alertify-form\")   || undefined;\r\n\t\t\t\t// add placeholder value to the input field\r\n\t\t\t\tif (typeof item.placeholder === \"string\" && item.placeholder !== \"\") input.value = item.placeholder;\r\n\t\t\t\tif (fromQueue) this.setFocus();\r\n\t\t\t\tthis.addListeners(item.callback);\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Unbind events to elements\r\n\t\t\t *\r\n\t\t\t * @param  {Object}   el       HTML Object\r\n\t\t\t * @param  {Event}    event    Event to detach to element\r\n\t\t\t * @param  {Function} fn       Callback function\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tunbind : function (el, event, fn) {\r\n\t\t\t\tif (typeof el.removeEventListener === \"function\") {\r\n\t\t\t\t\tel.removeEventListener(event, fn, false);\r\n\t\t\t\t} else if (el.detachEvent) {\r\n\t\t\t\t\tel.detachEvent(\"on\" + event, fn);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\treturn {\r\n\t\t\talert   : function (message, fn, cssClass) { _alertify.dialog(message, \"alert\", fn, \"\", cssClass); return this; },\r\n\t\t\tconfirm : function (message, fn, cssClass) { _alertify.dialog(message, \"confirm\", fn, \"\", cssClass); return this; },\r\n\t\t\textend  : _alertify.extend,\r\n\t\t\tinit    : _alertify.init,\r\n\t\t\tlog     : function (message, type, wait) { _alertify.log(message, type, wait); return this; },\r\n\t\t\tprompt  : function (message, fn, placeholder, cssClass) { _alertify.dialog(message, \"prompt\", fn, placeholder, cssClass); return this; },\r\n\t\t\tsuccess : function (message, wait) { _alertify.log(message, \"success\", wait); return this; },\r\n\t\t\terror   : function (message, wait) { _alertify.log(message, \"error\", wait); return this; },\r\n\t\t\tset     : function (args) { _alertify.set(args); },\r\n\t\t\tlabels  : _alertify.labels,\r\n\t\t\tdebug   : _alertify.handleErrors\r\n\t\t};\r\n\t};\r\n\r\n\t// AMD and window support\r\n\tif (typeof define === \"function\") {\r\n\t\tdefine('lib/alertify',[], function () { return new Alertify(); });\r\n\t} else if (typeof global.alertify === \"undefined\") {\r\n\t\tglobal.alertify = new Alertify();\r\n\t}\r\n\r\n}(this));\r\n\n\r\n\r\ndefine('selectMenu/item',['menu/item'], function (itemClass) {\r\n  /**\r\n   * Menu item for select menus.\r\n   */\r\n  return {\r\n\r\n    /**\r\n     * Create new menu item\r\n     * for tree views.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(itemClass)\r\n\t      .upgradeTo(this)._init(params);\r\n    },\r\n\r\n\r\n    /**\r\n     * Override click action of the menu item.\r\n     */\r\n    onclick : function (e) {\r\n      var menu = this.menu();\r\n      menu.hide();\r\n      // Index was set on initialization\r\n      menu.select(this._index);\r\n      menu.showTitle();\r\n      e.halt();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get title of item.\r\n     */\r\n    title : function () {\r\n      return this.content().textContent;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine(\r\n  'selectMenu',['menu', 'selectMenu/item', 'util'],\r\n  function (menuClass, selectMenuItemClass) {\r\n\r\n    return {\r\n      create : function (element) {\r\n\r\n\t      const select = element.getElementsByTagName('select')[0];\r\n\r\n        if (select === null)\r\n          return;\r\n\r\n\t      // Prepare list before object upgras\r\n\t      const list = [];\r\n\r\n        // Iterate through options list\r\n        // Get option item and add to list\r\n        Array.from(\r\n          select.getElementsByTagName('option')\r\n        ).forEach(function(item) {\r\n        \r\n\t        const opt = [\r\n\t          item.textContent,\r\n\t          item.getAttribute('value')\r\n\t        ];\r\n\r\n          // If the item has an attribute - list\r\n\t        if (item.hasAttribute('desc'))\r\n\t          opt.push(item.getAttribute('desc'));\r\n\r\n\t        list.push(opt);\r\n\t      });\r\n\r\n\t      // Create object with list\r\n\t      const obj = Object.create(menuClass).upgradeTo(this)\r\n\t            ._init(\r\n                list, {\r\n\t                itemClass : selectMenuItemClass\r\n\t              }\r\n              );\r\n        \r\n\t      obj._container = element;\r\n\t      obj._select = select;\r\n\t      select.style.display = 'none';\r\n\r\n\t      // Create title\r\n\t      obj._title = obj._container.addE('span');\r\n\t      obj._title.addT('');\r\n\r\n        obj._container.appendChild(obj.element());\r\n\r\n        // Show the menu\r\n\t      obj._container.addEventListener('click', obj.showSelected.bind(obj));\r\n\r\n\t      // Add index information to each item\r\n\t      obj._items.forEach((e,i) => e._index = i);\r\n\r\n\t      // This is only domspecific\r\n\t      obj.element().addEventListener('blur', function (e) {\r\n\t        this.menu.hide();\r\n\t        this.menu.showTitle();\r\n\t      });\r\n\r\n\t      // In case another tool changes\r\n\t      // the option via JS - this needs\r\n\t      // to be reflected!\r\n\t      select.addEventListener('change', function (e) {\r\n\t        this.showTitle();\r\n\t      }.bind(obj));\r\n\r\n\t      obj.showTitle();\r\n\t      return obj;\r\n      },\r\n\r\n      /**\r\n       * Get or set the selection index\r\n       */\r\n      select : function (index) {\r\n        const t = this;\r\n\t      if (arguments.length > 0) {\r\n\t        t._selected = index;\r\n\t        t._select.selectedIndex = index;\r\n\t      };\r\n\r\n\t      return t._selected || t._select.selectedIndex || 0;\r\n      },\r\n\r\n\r\n      /**\r\n       * Set the select value\r\n       */\r\n      selectValue : function (vParam) {\r\n        const t = this;\r\n        const qlf = t._select.options;\r\n        for (let i = 0; i < qlf.length; i++) {\r\n\t        if (qlf[i].value == vParam) {\r\n            t.hide();\r\n            t.select(i);\r\n            t.showTitle();\r\n            break;\r\n\t        };\r\n        };\r\n        return t;\r\n      },\r\n      \r\n\r\n      /**\r\n       * Show the select menu\r\n       */\r\n      showSelected : function () {\r\n        const t = this;\r\n\t      t._title.style.display = 'none';\r\n\t      t.show(t._selected = t._select.selectedIndex);\r\n\t      t.focus();\r\n      },\r\n\r\n\r\n      /**\r\n       * Show the title\r\n       */\r\n      showTitle : function () {\r\n\r\n        // Get the selection context\r\n        const t = this;\r\n\t      const s = t.select();\r\n\t      t._title.textContent = t.item(\r\n\t        t.select()\r\n\t      ).title();\r\n\t      t._title.style.display = 'inline';\r\n      }\r\n    }\r\n  }\r\n);\r\n\n!function(e){\"undefined\"!=typeof exports?e(exports):(window.hljs=e({}),\"function\"==typeof define&&define.amd&&define('lib/highlight/highlight.pack',[],function(){return window.hljs}))}(function(e){function n(e){return e.replace(/&/gm,\"&amp;\").replace(/</gm,\"&lt;\").replace(/>/gm,\"&gt;\")}function t(e){return e.nodeName.toLowerCase()}function r(e,n){var t=e&&e.exec(n);return t&&0==t.index}function a(e){var n=(e.className+\" \"+(e.parentNode?e.parentNode.className:\"\")).split(/\\s+/);return n=n.map(function(e){return e.replace(/^lang(uage)?-/,\"\")}),n.filter(function(e){return N(e)||/no(-?)highlight|plain|text/.test(e)})[0]}function i(e,n){var t,r={};for(t in e)r[t]=e[t];if(n)for(t in n)r[t]=n[t];return r}function o(e){var n=[];return function r(e,a){for(var i=e.firstChild;i;i=i.nextSibling)3==i.nodeType?a+=i.nodeValue.length:1==i.nodeType&&(n.push({event:\"start\",offset:a,node:i}),a=r(i,a),t(i).match(/br|hr|img|input/)||n.push({event:\"stop\",offset:a,node:i}));return a}(e,0),n}function u(e,r,a){function i(){return e.length&&r.length?e[0].offset!=r[0].offset?e[0].offset<r[0].offset?e:r:\"start\"==r[0].event?e:r:e.length?e:r}function o(e){function r(e){return\" \"+e.nodeName+'=\"'+n(e.value)+'\"'}l+=\"<\"+t(e)+Array.prototype.map.call(e.attributes,r).join(\"\")+\">\"}function u(e){l+=\"</\"+t(e)+\">\"}function c(e){(\"start\"==e.event?o:u)(e.node)}for(var s=0,l=\"\",f=[];e.length||r.length;){var g=i();if(l+=n(a.substr(s,g[0].offset-s)),s=g[0].offset,g==e){f.reverse().forEach(u);do c(g.splice(0,1)[0]),g=i();while(g==e&&g.length&&g[0].offset==s);f.reverse().forEach(o)}else\"start\"==g[0].event?f.push(g[0].node):f.pop(),c(g.splice(0,1)[0])}return l+n(a.substr(s))}function c(e){function n(e){return e&&e.source||e}function t(t,r){return new RegExp(n(t),\"m\"+(e.cI?\"i\":\"\")+(r?\"g\":\"\"))}function r(a,o){if(!a.compiled){if(a.compiled=!0,a.k=a.k||a.bK,a.k){var u={},c=function(n,t){e.cI&&(t=t.toLowerCase()),t.split(\" \").forEach(function(e){var t=e.split(\"|\");u[t[0]]=[n,t[1]?Number(t[1]):1]})};\"string\"==typeof a.k?c(\"keyword\",a.k):Object.keys(a.k).forEach(function(e){c(e,a.k[e])}),a.k=u}a.lR=t(a.l||/\\b\\w+\\b/,!0),o&&(a.bK&&(a.b=\"\\\\b(\"+a.bK.split(\" \").join(\"|\")+\")\\\\b\"),a.b||(a.b=/\\B|\\b/),a.bR=t(a.b),a.e||a.eW||(a.e=/\\B|\\b/),a.e&&(a.eR=t(a.e)),a.tE=n(a.e)||\"\",a.eW&&o.tE&&(a.tE+=(a.e?\"|\":\"\")+o.tE)),a.i&&(a.iR=t(a.i)),void 0===a.r&&(a.r=1),a.c||(a.c=[]);var s=[];a.c.forEach(function(e){e.v?e.v.forEach(function(n){s.push(i(e,n))}):s.push(\"self\"==e?a:e)}),a.c=s,a.c.forEach(function(e){r(e,a)}),a.starts&&r(a.starts,o);var l=a.c.map(function(e){return e.bK?\"\\\\.?(\"+e.b+\")\\\\.?\":e.b}).concat([a.tE,a.i]).map(n).filter(Boolean);a.t=l.length?t(l.join(\"|\"),!0):{exec:function(){return null}}}}r(e)}function s(e,t,a,i){function o(e,n){for(var t=0;t<n.c.length;t++)if(r(n.c[t].bR,e))return n.c[t]}function u(e,n){if(r(e.eR,n)){for(;e.endsParent&&e.parent;)e=e.parent;return e}return e.eW?u(e.parent,n):void 0}function f(e,n){return!a&&r(n.iR,e)}function g(e,n){var t=E.cI?n[0].toLowerCase():n[0];return e.k.hasOwnProperty(t)&&e.k[t]}function p(e,n,t,r){var a=r?\"\":x.classPrefix,i='<span class=\"'+a,o=t?\"\":\"</span>\";return i+=e+'\">',i+n+o}function d(){if(!L.k)return n(y);var e=\"\",t=0;L.lR.lastIndex=0;for(var r=L.lR.exec(y);r;){e+=n(y.substr(t,r.index-t));var a=g(L,r);a?(B+=a[1],e+=p(a[0],n(r[0]))):e+=n(r[0]),t=L.lR.lastIndex,r=L.lR.exec(y)}return e+n(y.substr(t))}function h(){if(L.sL&&!w[L.sL])return n(y);var e=L.sL?s(L.sL,y,!0,M[L.sL]):l(y);return L.r>0&&(B+=e.r),\"continuous\"==L.subLanguageMode&&(M[L.sL]=e.top),p(e.language,e.value,!1,!0)}function b(){return void 0!==L.sL?h():d()}function v(e,t){var r=e.cN?p(e.cN,\"\",!0):\"\";e.rB?(k+=r,y=\"\"):e.eB?(k+=n(t)+r,y=\"\"):(k+=r,y=t),L=Object.create(e,{parent:{value:L}})}function m(e,t){if(y+=e,void 0===t)return k+=b(),0;var r=o(t,L);if(r)return k+=b(),v(r,t),r.rB?0:t.length;var a=u(L,t);if(a){var i=L;i.rE||i.eE||(y+=t),k+=b();do L.cN&&(k+=\"</span>\"),B+=L.r,L=L.parent;while(L!=a.parent);return i.eE&&(k+=n(t)),y=\"\",a.starts&&v(a.starts,\"\"),i.rE?0:t.length}if(f(t,L))throw new Error('Illegal lexeme \"'+t+'\" for mode \"'+(L.cN||\"<unnamed>\")+'\"');return y+=t,t.length||1}var E=N(e);if(!E)throw new Error('Unknown language: \"'+e+'\"');c(E);var R,L=i||E,M={},k=\"\";for(R=L;R!=E;R=R.parent)R.cN&&(k=p(R.cN,\"\",!0)+k);var y=\"\",B=0;try{for(var C,j,I=0;;){if(L.t.lastIndex=I,C=L.t.exec(t),!C)break;j=m(t.substr(I,C.index-I),C[0]),I=C.index+j}for(m(t.substr(I)),R=L;R.parent;R=R.parent)R.cN&&(k+=\"</span>\");return{r:B,value:k,language:e,top:L}}catch(S){if(-1!=S.message.indexOf(\"Illegal\"))return{r:0,value:n(t)};throw S}}function l(e,t){t=t||x.languages||Object.keys(w);var r={r:0,value:n(e)},a=r;return t.forEach(function(n){if(N(n)){var t=s(n,e,!1);t.language=n,t.r>a.r&&(a=t),t.r>r.r&&(a=r,r=t)}}),a.language&&(r.second_best=a),r}function f(e){return x.tabReplace&&(e=e.replace(/^((<[^>]+>|\\t)+)/gm,function(e,n){return n.replace(/\\t/g,x.tabReplace)})),x.useBR&&(e=e.replace(/\\n/g,\"<br>\")),e}function g(e,n,t){var r=n?E[n]:t,a=[e.trim()];return e.match(/\\bhljs\\b/)||a.push(\"hljs\"),-1===e.indexOf(r)&&a.push(r),a.join(\" \").trim()}function p(e){var n=a(e);if(!/no(-?)highlight|plain|text/.test(n)){var t;x.useBR?(t=document.createElementNS(\"http://www.w3.org/1999/xhtml\",\"div\"),t.innerHTML=e.innerHTML.replace(/\\n/g,\"\").replace(/<br[ \\/]*>/g,\"\\n\")):t=e;var r=t.textContent,i=n?s(n,r,!0):l(r),c=o(t);if(c.length){var p=document.createElementNS(\"http://www.w3.org/1999/xhtml\",\"div\");p.innerHTML=i.value,i.value=u(c,o(p),r)}i.value=f(i.value),e.innerHTML=i.value,e.className=g(e.className,n,i.language),e.result={language:i.language,re:i.r},i.second_best&&(e.second_best={language:i.second_best.language,re:i.second_best.r})}}function d(e){x=i(x,e)}function h(){if(!h.called){h.called=!0;var e=document.querySelectorAll(\"pre code\");Array.prototype.forEach.call(e,p)}}function b(){addEventListener(\"DOMContentLoaded\",h,!1),addEventListener(\"load\",h,!1)}function v(n,t){var r=w[n]=t(e);r.aliases&&r.aliases.forEach(function(e){E[e]=n})}function m(){return Object.keys(w)}function N(e){return w[e]||w[E[e]]}var x={classPrefix:\"hljs-\",tabReplace:null,useBR:!1,languages:void 0},w={},E={};return e.highlight=s,e.highlightAuto=l,e.fixMarkup=f,e.highlightBlock=p,e.configure=d,e.initHighlighting=h,e.initHighlightingOnLoad=b,e.registerLanguage=v,e.listLanguages=m,e.getLanguage=N,e.inherit=i,e.IR=\"[a-zA-Z]\\\\w*\",e.UIR=\"[a-zA-Z_]\\\\w*\",e.NR=\"\\\\b\\\\d+(\\\\.\\\\d+)?\",e.CNR=\"\\\\b(0[xX][a-fA-F0-9]+|(\\\\d+(\\\\.\\\\d*)?|\\\\.\\\\d+)([eE][-+]?\\\\d+)?)\",e.BNR=\"\\\\b(0b[01]+)\",e.RSR=\"!|!=|!==|%|%=|&|&&|&=|\\\\*|\\\\*=|\\\\+|\\\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\\\?|\\\\[|\\\\{|\\\\(|\\\\^|\\\\^=|\\\\||\\\\|=|\\\\|\\\\||~\",e.BE={b:\"\\\\\\\\[\\\\s\\\\S]\",r:0},e.ASM={cN:\"string\",b:\"'\",e:\"'\",i:\"\\\\n\",c:[e.BE]},e.QSM={cN:\"string\",b:'\"',e:'\"',i:\"\\\\n\",c:[e.BE]},e.PWM={b:/\\b(a|an|the|are|I|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such)\\b/},e.C=function(n,t,r){var a=e.inherit({cN:\"comment\",b:n,e:t,c:[]},r||{});return a.c.push(e.PWM),a},e.CLCM=e.C(\"//\",\"$\"),e.CBCM=e.C(\"/\\\\*\",\"\\\\*/\"),e.HCM=e.C(\"#\",\"$\"),e.NM={cN:\"number\",b:e.NR,r:0},e.CNM={cN:\"number\",b:e.CNR,r:0},e.BNM={cN:\"number\",b:e.BNR,r:0},e.CSSNM={cN:\"number\",b:e.NR+\"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?\",r:0},e.RM={cN:\"regexp\",b:/\\//,e:/\\/[gimuy]*/,i:/\\n/,c:[e.BE,{b:/\\[/,e:/\\]/,r:0,c:[e.BE]}]},e.TM={cN:\"title\",b:e.IR,r:0},e.UTM={cN:\"title\",b:e.UIR,r:0},e});hljs.registerLanguage(\"json\",function(e){var t={literal:\"true false null\"},i=[e.QSM,e.CNM],l={cN:\"value\",e:\",\",eW:!0,eE:!0,c:i,k:t},c={b:\"{\",e:\"}\",c:[{cN:\"attribute\",b:'\\\\s*\"',e:'\"\\\\s*:\\\\s*',eB:!0,eE:!0,c:[e.BE],i:\"\\\\n\",starts:l}],i:\"\\\\S\"},n={b:\"\\\\[\",e:\"\\\\]\",c:[e.inherit(l,{cN:null})],i:\"\\\\S\"};return i.splice(i.length,0,c,n),{c:i,k:t,i:\"\\\\S\"}});\n\r\n\r\ndefine('view/result/koralquery',[\r\n  'view',\r\n  'lib/highlight/highlight.pack',\r\n], function (viewClass) {\r\n  return {\r\n    create : function (classes) {\r\n      return Object.create(viewClass)\r\n        ._init(classes)\r\n        .upgradeTo(this);\r\n    },\r\n\r\n    /**\r\n     * KoralQuery view element\r\n     */\r\n    show : function () {\r\n      if (this._show)\r\n        return this._show;\r\n\r\n      const kq = document.createElement('div');\r\n      kq.setAttribute('id', 'koralquery');\r\n\r\n      const kqInner = kq.addE('div');\r\n\r\n      kqInner.addT(\r\n        JSON.stringify(KorAP.koralQuery || {}, null, '  ')\r\n      );\r\n      \r\n      // Highlight the view\r\n      hljs.highlightBlock(kqInner);\r\n\r\n      this._show = kq;\r\n      return kq;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The result panel\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('panel/result',[\r\n  'panel',\r\n  'view/result/koralquery'\r\n], function (panelClass, kqViewClass) {\r\n\r\n  const d = document;\r\n\r\n  // Localization values\r\n  const loc = KorAP.Locale;\r\n  loc.TOGGLE_ALIGN = loc.TOGGLE_ALIGN || 'toggle alignment';\r\n  loc.SHOW_KQ      = loc.SHOW_KQ      || 'show KoralQuery';\r\n\r\n  const aRoll = ['left', 'right','center'];\r\n  \r\n  return {\r\n    create : function (opened) {\r\n      return Object.create(panelClass)._init(['result']).upgradeTo(this)._init(opened);\r\n    },\r\n\r\n    // Initialize panel\r\n    _init : function (opened) {\r\n      this._opened = opened;\r\n\r\n      // If plugins are enabled, add all buttons for the result panel\r\n      if (KorAP.Plugin) {\r\n\r\n        // Add all result buttons in order\r\n        KorAP.Plugin\r\n          .buttonGroup(\"result\")\r\n          .forEach(i => this.actions().add.apply(this.actions(), i));\r\n\r\n        KorAP.Plugin.clearButtonGroup(\"result\");\r\n      };\r\n      \r\n      this.prepend = true;\r\n      \r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Add KoralQuery action to panel\r\n     */\r\n    addKqAction : function () {\r\n\r\n      // Open KoralQuery view\r\n      const kqButton = this.actions().add(\r\n        loc.SHOW_KQ,\r\n        {'cls':['show-kq','button-icon']},\r\n        function () {\r\n\r\n          const t = this;\r\n\r\n          // Show only once - otherwise toggle\r\n          if (t._kq && t._kq.shown()) {\r\n            t._kq.close();\r\n            return;\r\n          };\r\n          \r\n          t._kq = kqViewClass.create();\r\n\r\n          // On close, remove session info on KQ\r\n          t._kq.onClose = function () {\r\n            delete this._opened['kq'];\r\n          }.bind(t);\r\n\r\n          t._opened['kq'] = true;\r\n          t.add(t._kq);\r\n        }\r\n      );\r\n\r\n      // Show KoralQuery in case it's meant to be shown\r\n      if (this._opened['kq'])\r\n        kqButton.click();\r\n    },\r\n\r\n\r\n    /**\r\n     * Add align action to panel\r\n     */\r\n    addAlignAction : function () {\r\n      /**\r\n       * Toggle the alignment (left <=> right)\r\n       */\r\n      this.actions().add(loc.TOGGLE_ALIGN, {'cls':['align','right','button-icon']}, function (e) {\r\n        var olCl = d.querySelector('#search > ol').classList;\r\n\r\n        aRoll.find(function(align, i) {\r\n          if (olCl.contains('align-' + align)) {\r\n            const n  = i >= 2 ? 0 : i+1;\r\n            const nn = n >= 2 ? 0 : n+1;\r\n            olCl.remove('align-' + align);\r\n            olCl.add('align-' + aRoll[n]);\r\n            this.button.toggleClass(aRoll[n], aRoll[nn]);\r\n            return true;\r\n          };\r\n        }, this);\r\n      });    \r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The query panel\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('panel/query',[\r\n  'panel'\r\n], function (panelClass) {\r\n\r\n  const d = document;\r\n\r\n  // Localization values\r\n  const loc = KorAP.Locale;\r\n  \r\n  return {\r\n    create : function (opened) {\r\n      return Object.create(panelClass)._init(['query']).upgradeTo(this)._init(opened);\r\n    },\r\n\r\n    // Initialize panel\r\n    _init : function (opened) {\r\n      this._opened = opened;\r\n      const a = this.actions();\r\n      \r\n      // If plugins are enabled, add all buttons for the query panel\r\n      if (KorAP.Plugin) {\r\n\r\n        // Add all matchbuttons in order\r\n        KorAP.Plugin\r\n          .buttonGroup(\"query\")\r\n          .forEach(i => a.add.apply(a, i));\r\n\r\n        KorAP.Plugin.clearButtonGroup(\"query\")\r\n      };\r\n      \r\n      return this;\r\n    }\r\n  }\r\n});\r\n\n\r\n\r\ndefine('pageInfo',[],function () {\r\n  return {\r\n    create : function () {\r\n      const o = Object.create(this);\r\n      const p = document.getElementById('pagination');\r\n      o.ds = p ? p.dataset : {};\r\n      return o;\r\n    },\r\n    page : function () {\r\n      return parseInt(this.ds[\"page\"] || 0);\r\n    },\r\n    total : function () {\r\n      return parseInt(this.ds[\"total\"] || 0);\r\n    },\r\n    count : function () {\r\n      return parseInt(this.ds[\"count\"] || 0);\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The pagination panel\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('panel/pagination',[\r\n  'panel',\r\n  'buttongroup',\r\n  'pageInfo'\r\n], function (panelClass, buttonGroupClass, pageInfoClass) {\r\n\r\n  const d = document;\r\n\r\n  // Localization values\r\n  const loc = KorAP.Locale;\r\n  loc.RANDOM_PAGE = loc.RANDOM_PAGE || 'Random page';\r\n\r\n  \r\n  return {\r\n    create : function () {\r\n      return Object.create(panelClass)._init(['pagination']).upgradeTo(this)._init();\r\n    },\r\n\r\n    // Initialize panel\r\n    _init : function () {\r\n\r\n      // Override existing button group\r\n      // This allows actions.add() ... to work for list items in server.js\r\n      let pagEl = document.getElementById(\"pagination\");\r\n      if (pagEl === null) {\r\n        return null;\r\n      };\r\n\r\n      // Do not show if no pages exist\r\n      if (pagEl.getAttribute('data-total') === '0') {\r\n        return null;\r\n      };\r\n\r\n      this._actions.panel = undefined;\r\n      this._actions.clear();\r\n\r\n      const bg = buttonGroupClass.adopt(pagEl);\r\n      bg._omOutside = true;\r\n      bg._omLeft = true;\r\n      \r\n      bg.anchor(pagEl.lastElementChild);\r\n\r\n      let button = bg.addList(\"More\", {'cls':['button-group-list','button-icon']});\r\n      this._actions = button.list;\r\n      this._bg = bg;\r\n\r\n      button.setAttribute('data-icon',\"\\uf0c9\");\r\n\r\n      // Warning: This is circular\r\n      this._actions.panel = this;\r\n     \r\n      this.prepend = true;\r\n      \r\n      return this;\r\n    },\r\n\r\n    /**\r\n     * The buttongroup holding the pagination panel.\r\n     * This differs from action, as action contains the list.\r\n     */\r\n    buttonGroup : function () {\r\n      return this._bg;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Add random paginator to list\r\n     */\r\n    addRandomPage : function () {\r\n      const pi = pageInfoClass.create();\r\n      \r\n      const button = this.actions().add(\r\n        loc.RANDOM_PAGE,\r\n        {},\r\n        function () {\r\n          if (pi.total() > 0) {\r\n            const sp = new URLSearchParams(window.location.search);\r\n            sp.set(\"p\", Math.floor(Math.random() * pi.total()) + 1);\r\n            window.location.search = sp.toString();\r\n          };\r\n        }\r\n      )\r\n    }\r\n  }\r\n});\r\n\n/*!\r\n * Intro.js v4.2.2\r\n * https://introjs.com\r\n *\r\n * Copyright (C) 2012-2021 Afshin Mehrabani (@afshinmeh).\r\n * https://raw.githubusercontent.com/usablica/intro.js/master/license.md\r\n *\r\n * Date: Fri, 27 Aug 2021 12:07:05 GMT\r\n */\r\n\r\n(function (global, factory) {\r\n  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\r\n  typeof define === 'function' && define.amd ? define('lib/intro',factory) :\r\n  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.introJs = factory());\r\n}(this, (function () { 'use strict';\r\n\r\n  function _typeof(obj) {\r\n    \"@babel/helpers - typeof\";\r\n\r\n    if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\r\n      _typeof = function (obj) {\r\n        return typeof obj;\r\n      };\r\n    } else {\r\n      _typeof = function (obj) {\r\n        return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\r\n      };\r\n    }\r\n\r\n    return _typeof(obj);\r\n  }\r\n\r\n  /**\r\n   * Overwrites obj1's values with obj2's and adds obj2's if non existent in obj1\r\n   * via: http://stackoverflow.com/questions/171251/how-can-i-merge-properties-of-two-javascript-objects-dynamically\r\n   *\r\n   * @param obj1\r\n   * @param obj2\r\n   * @returns obj3 a new object based on obj1 and obj2\r\n   */\r\n  function mergeOptions(obj1, obj2) {\r\n    var obj3 = {};\r\n    var attrname;\r\n\r\n    for (attrname in obj1) {\r\n      obj3[attrname] = obj1[attrname];\r\n    }\r\n\r\n    for (attrname in obj2) {\r\n      obj3[attrname] = obj2[attrname];\r\n    }\r\n\r\n    return obj3;\r\n  }\r\n\r\n  /**\r\n   * Mark any object with an incrementing number\r\n   * used for keeping track of objects\r\n   *\r\n   * @param Object obj   Any object or DOM Element\r\n   * @param String key\r\n   * @return Object\r\n   */\r\n  var stamp = function () {\r\n    var keys = {};\r\n    return function stamp(obj) {\r\n      var key = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : \"introjs-stamp\";\r\n      // each group increments from 0\r\n      keys[key] = keys[key] || 0; // stamp only once per object\r\n\r\n      if (obj[key] === undefined) {\r\n        // increment key for each new object\r\n        obj[key] = keys[key]++;\r\n      }\r\n\r\n      return obj[key];\r\n    };\r\n  }();\r\n\r\n  /**\r\n   * Iterates arrays\r\n   *\r\n   * @param {Array} arr\r\n   * @param {Function} forEachFnc\r\n   * @param {Function} [completeFnc]\r\n   * @return {Null}\r\n   */\r\n  function forEach(arr, forEachFnc, completeFnc) {\r\n    // in case arr is an empty query selector node list\r\n    if (arr) {\r\n      for (var i = 0, len = arr.length; i < len; i++) {\r\n        forEachFnc(arr[i], i);\r\n      }\r\n    }\r\n\r\n    if (typeof completeFnc === \"function\") {\r\n      completeFnc();\r\n    }\r\n  }\r\n\r\n  /**\r\n   * DOMEvent Handles all DOM events\r\n   *\r\n   * methods:\r\n   *\r\n   * on - add event handler\r\n   * off - remove event\r\n   */\r\n\r\n  var DOMEvent = function () {\r\n    function DOMEvent() {\r\n      var events_key = \"introjs_event\";\r\n      /**\r\n       * Gets a unique ID for an event listener\r\n       *\r\n       * @param obj Object\r\n       * @param type event type\r\n       * @param listener Function\r\n       * @param context Object\r\n       * @return String\r\n       */\r\n\r\n      this._id = function (obj, type, listener, context) {\r\n        return type + stamp(listener) + (context ? \"_\".concat(stamp(context)) : \"\");\r\n      };\r\n      /**\r\n       * Adds event listener\r\n       *\r\n       * @param obj Object obj\r\n       * @param type String\r\n       * @param listener Function\r\n       * @param context Object\r\n       * @param useCapture Boolean\r\n       * @return null\r\n       */\r\n\r\n\r\n      this.on = function (obj, type, listener, context, useCapture) {\r\n        var id = this._id.apply(this, arguments);\r\n\r\n        var handler = function handler(e) {\r\n          return listener.call(context || obj, e || window.event);\r\n        };\r\n\r\n        if (\"addEventListener\" in obj) {\r\n          obj.addEventListener(type, handler, useCapture);\r\n        } else if (\"attachEvent\" in obj) {\r\n          obj.attachEvent(\"on\".concat(type), handler);\r\n        }\r\n\r\n        obj[events_key] = obj[events_key] || {};\r\n        obj[events_key][id] = handler;\r\n      };\r\n      /**\r\n       * Removes event listener\r\n       *\r\n       * @param obj Object\r\n       * @param type String\r\n       * @param listener Function\r\n       * @param context Object\r\n       * @param useCapture Boolean\r\n       * @return null\r\n       */\r\n\r\n\r\n      this.off = function (obj, type, listener, context, useCapture) {\r\n        var id = this._id.apply(this, arguments);\r\n\r\n        var handler = obj[events_key] && obj[events_key][id];\r\n\r\n        if (!handler) {\r\n          return;\r\n        }\r\n\r\n        if (\"removeEventListener\" in obj) {\r\n          obj.removeEventListener(type, handler, useCapture);\r\n        } else if (\"detachEvent\" in obj) {\r\n          obj.detachEvent(\"on\".concat(type), handler);\r\n        }\r\n\r\n        obj[events_key][id] = null;\r\n      };\r\n    }\r\n\r\n    return new DOMEvent();\r\n  }();\r\n\r\n  var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\r\n\r\n  function createCommonjsModule(fn, module) {\r\n  \treturn module = { exports: {} }, fn(module, module.exports), module.exports;\r\n  }\r\n\r\n  var check = function (it) {\r\n    return it && it.Math == Math && it;\r\n  };\r\n\r\n  // https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\r\n  var global_1 =\r\n    // eslint-disable-next-line es/no-global-this -- safe\r\n    check(typeof globalThis == 'object' && globalThis) ||\r\n    check(typeof window == 'object' && window) ||\r\n    // eslint-disable-next-line no-restricted-globals -- safe\r\n    check(typeof self == 'object' && self) ||\r\n    check(typeof commonjsGlobal == 'object' && commonjsGlobal) ||\r\n    // eslint-disable-next-line no-new-func -- fallback\r\n    (function () { return this; })() || Function('return this')();\r\n\r\n  var fails = function (exec) {\r\n    try {\r\n      return !!exec();\r\n    } catch (error) {\r\n      return true;\r\n    }\r\n  };\r\n\r\n  // Detect IE8's incomplete defineProperty implementation\r\n  var descriptors = !fails(function () {\r\n    // eslint-disable-next-line es/no-object-defineproperty -- required for testing\r\n    return Object.defineProperty({}, 1, { get: function () { return 7; } })[1] != 7;\r\n  });\r\n\r\n  var $propertyIsEnumerable = {}.propertyIsEnumerable;\r\n  // eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\r\n  var getOwnPropertyDescriptor$1 = Object.getOwnPropertyDescriptor;\r\n\r\n  // Nashorn ~ JDK8 bug\r\n  var NASHORN_BUG = getOwnPropertyDescriptor$1 && !$propertyIsEnumerable.call({ 1: 2 }, 1);\r\n\r\n  // `Object.prototype.propertyIsEnumerable` method implementation\r\n  // https://tc39.es/ecma262/#sec-object.prototype.propertyisenumerable\r\n  var f$4 = NASHORN_BUG ? function propertyIsEnumerable(V) {\r\n    var descriptor = getOwnPropertyDescriptor$1(this, V);\r\n    return !!descriptor && descriptor.enumerable;\r\n  } : $propertyIsEnumerable;\r\n\r\n  var objectPropertyIsEnumerable = {\r\n  \tf: f$4\r\n  };\r\n\r\n  var createPropertyDescriptor = function (bitmap, value) {\r\n    return {\r\n      enumerable: !(bitmap & 1),\r\n      configurable: !(bitmap & 2),\r\n      writable: !(bitmap & 4),\r\n      value: value\r\n    };\r\n  };\r\n\r\n  var toString = {}.toString;\r\n\r\n  var classofRaw = function (it) {\r\n    return toString.call(it).slice(8, -1);\r\n  };\r\n\r\n  var split = ''.split;\r\n\r\n  // fallback for non-array-like ES3 and non-enumerable old V8 strings\r\n  var indexedObject = fails(function () {\r\n    // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346\r\n    // eslint-disable-next-line no-prototype-builtins -- safe\r\n    return !Object('z').propertyIsEnumerable(0);\r\n  }) ? function (it) {\r\n    return classofRaw(it) == 'String' ? split.call(it, '') : Object(it);\r\n  } : Object;\r\n\r\n  // `RequireObjectCoercible` abstract operation\r\n  // https://tc39.es/ecma262/#sec-requireobjectcoercible\r\n  var requireObjectCoercible = function (it) {\r\n    if (it == undefined) throw TypeError(\"Can't call method on \" + it);\r\n    return it;\r\n  };\r\n\r\n  // toObject with fallback for non-array-like ES3 strings\r\n\r\n\r\n\r\n  var toIndexedObject = function (it) {\r\n    return indexedObject(requireObjectCoercible(it));\r\n  };\r\n\r\n  var isObject = function (it) {\r\n    return typeof it === 'object' ? it !== null : typeof it === 'function';\r\n  };\r\n\r\n  var aFunction$1 = function (variable) {\r\n    return typeof variable == 'function' ? variable : undefined;\r\n  };\r\n\r\n  var getBuiltIn = function (namespace, method) {\r\n    return arguments.length < 2 ? aFunction$1(global_1[namespace]) : global_1[namespace] && global_1[namespace][method];\r\n  };\r\n\r\n  var engineUserAgent = getBuiltIn('navigator', 'userAgent') || '';\r\n\r\n  var process = global_1.process;\r\n  var Deno = global_1.Deno;\r\n  var versions = process && process.versions || Deno && Deno.version;\r\n  var v8 = versions && versions.v8;\r\n  var match, version$1;\r\n\r\n  if (v8) {\r\n    match = v8.split('.');\r\n    version$1 = match[0] < 4 ? 1 : match[0] + match[1];\r\n  } else if (engineUserAgent) {\r\n    match = engineUserAgent.match(/Edge\\/(\\d+)/);\r\n    if (!match || match[1] >= 74) {\r\n      match = engineUserAgent.match(/Chrome\\/(\\d+)/);\r\n      if (match) version$1 = match[1];\r\n    }\r\n  }\r\n\r\n  var engineV8Version = version$1 && +version$1;\r\n\r\n  /* eslint-disable es/no-symbol -- required for testing */\r\n\r\n\r\n\r\n  // eslint-disable-next-line es/no-object-getownpropertysymbols -- required for testing\r\n  var nativeSymbol = !!Object.getOwnPropertySymbols && !fails(function () {\r\n    var symbol = Symbol();\r\n    // Chrome 38 Symbol has incorrect toString conversion\r\n    // `get-own-property-symbols` polyfill symbols converted to object are not Symbol instances\r\n    return !String(symbol) || !(Object(symbol) instanceof Symbol) ||\r\n      // Chrome 38-40 symbols are not inherited from DOM collections prototypes to instances\r\n      !Symbol.sham && engineV8Version && engineV8Version < 41;\r\n  });\r\n\r\n  /* eslint-disable es/no-symbol -- required for testing */\r\n\r\n\r\n  var useSymbolAsUid = nativeSymbol\r\n    && !Symbol.sham\r\n    && typeof Symbol.iterator == 'symbol';\r\n\r\n  var isSymbol = useSymbolAsUid ? function (it) {\r\n    return typeof it == 'symbol';\r\n  } : function (it) {\r\n    var $Symbol = getBuiltIn('Symbol');\r\n    return typeof $Symbol == 'function' && Object(it) instanceof $Symbol;\r\n  };\r\n\r\n  // `OrdinaryToPrimitive` abstract operation\r\n  // https://tc39.es/ecma262/#sec-ordinarytoprimitive\r\n  var ordinaryToPrimitive = function (input, pref) {\r\n    var fn, val;\r\n    if (pref === 'string' && typeof (fn = input.toString) == 'function' && !isObject(val = fn.call(input))) return val;\r\n    if (typeof (fn = input.valueOf) == 'function' && !isObject(val = fn.call(input))) return val;\r\n    if (pref !== 'string' && typeof (fn = input.toString) == 'function' && !isObject(val = fn.call(input))) return val;\r\n    throw TypeError(\"Can't convert object to primitive value\");\r\n  };\r\n\r\n  var setGlobal = function (key, value) {\r\n    try {\r\n      // eslint-disable-next-line es/no-object-defineproperty -- safe\r\n      Object.defineProperty(global_1, key, { value: value, configurable: true, writable: true });\r\n    } catch (error) {\r\n      global_1[key] = value;\r\n    } return value;\r\n  };\r\n\r\n  var SHARED = '__core-js_shared__';\r\n  var store$1 = global_1[SHARED] || setGlobal(SHARED, {});\r\n\r\n  var sharedStore = store$1;\r\n\r\n  var shared = createCommonjsModule(function (module) {\r\n  (module.exports = function (key, value) {\r\n    return sharedStore[key] || (sharedStore[key] = value !== undefined ? value : {});\r\n  })('versions', []).push({\r\n    version: '3.16.1',\r\n    mode: 'global',\r\n    copyright: '© 2021 Denis Pushkarev (zloirock.ru)'\r\n  });\r\n  });\r\n\r\n  // `ToObject` abstract operation\r\n  // https://tc39.es/ecma262/#sec-toobject\r\n  var toObject = function (argument) {\r\n    return Object(requireObjectCoercible(argument));\r\n  };\r\n\r\n  var hasOwnProperty = {}.hasOwnProperty;\r\n\r\n  var has$1 = Object.hasOwn || function hasOwn(it, key) {\r\n    return hasOwnProperty.call(toObject(it), key);\r\n  };\r\n\r\n  var id = 0;\r\n  var postfix = Math.random();\r\n\r\n  var uid = function (key) {\r\n    return 'Symbol(' + String(key === undefined ? '' : key) + ')_' + (++id + postfix).toString(36);\r\n  };\r\n\r\n  var WellKnownSymbolsStore = shared('wks');\r\n  var Symbol$1 = global_1.Symbol;\r\n  var createWellKnownSymbol = useSymbolAsUid ? Symbol$1 : Symbol$1 && Symbol$1.withoutSetter || uid;\r\n\r\n  var wellKnownSymbol = function (name) {\r\n    if (!has$1(WellKnownSymbolsStore, name) || !(nativeSymbol || typeof WellKnownSymbolsStore[name] == 'string')) {\r\n      if (nativeSymbol && has$1(Symbol$1, name)) {\r\n        WellKnownSymbolsStore[name] = Symbol$1[name];\r\n      } else {\r\n        WellKnownSymbolsStore[name] = createWellKnownSymbol('Symbol.' + name);\r\n      }\r\n    } return WellKnownSymbolsStore[name];\r\n  };\r\n\r\n  var TO_PRIMITIVE = wellKnownSymbol('toPrimitive');\r\n\r\n  // `ToPrimitive` abstract operation\r\n  // https://tc39.es/ecma262/#sec-toprimitive\r\n  var toPrimitive = function (input, pref) {\r\n    if (!isObject(input) || isSymbol(input)) return input;\r\n    var exoticToPrim = input[TO_PRIMITIVE];\r\n    var result;\r\n    if (exoticToPrim !== undefined) {\r\n      if (pref === undefined) pref = 'default';\r\n      result = exoticToPrim.call(input, pref);\r\n      if (!isObject(result) || isSymbol(result)) return result;\r\n      throw TypeError(\"Can't convert object to primitive value\");\r\n    }\r\n    if (pref === undefined) pref = 'number';\r\n    return ordinaryToPrimitive(input, pref);\r\n  };\r\n\r\n  // `ToPropertyKey` abstract operation\r\n  // https://tc39.es/ecma262/#sec-topropertykey\r\n  var toPropertyKey = function (argument) {\r\n    var key = toPrimitive(argument, 'string');\r\n    return isSymbol(key) ? key : String(key);\r\n  };\r\n\r\n  var document$1 = global_1.document;\r\n  // typeof document.createElement is 'object' in old IE\r\n  var EXISTS = isObject(document$1) && isObject(document$1.createElement);\r\n\r\n  var documentCreateElement = function (it) {\r\n    return EXISTS ? document$1.createElement(it) : {};\r\n  };\r\n\r\n  // Thank's IE8 for his funny defineProperty\r\n  var ie8DomDefine = !descriptors && !fails(function () {\r\n    // eslint-disable-next-line es/no-object-defineproperty -- requied for testing\r\n    return Object.defineProperty(documentCreateElement('div'), 'a', {\r\n      get: function () { return 7; }\r\n    }).a != 7;\r\n  });\r\n\r\n  // eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\r\n  var $getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\r\n\r\n  // `Object.getOwnPropertyDescriptor` method\r\n  // https://tc39.es/ecma262/#sec-object.getownpropertydescriptor\r\n  var f$3 = descriptors ? $getOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) {\r\n    O = toIndexedObject(O);\r\n    P = toPropertyKey(P);\r\n    if (ie8DomDefine) try {\r\n      return $getOwnPropertyDescriptor(O, P);\r\n    } catch (error) { /* empty */ }\r\n    if (has$1(O, P)) return createPropertyDescriptor(!objectPropertyIsEnumerable.f.call(O, P), O[P]);\r\n  };\r\n\r\n  var objectGetOwnPropertyDescriptor = {\r\n  \tf: f$3\r\n  };\r\n\r\n  var anObject = function (it) {\r\n    if (!isObject(it)) {\r\n      throw TypeError(String(it) + ' is not an object');\r\n    } return it;\r\n  };\r\n\r\n  // eslint-disable-next-line es/no-object-defineproperty -- safe\r\n  var $defineProperty = Object.defineProperty;\r\n\r\n  // `Object.defineProperty` method\r\n  // https://tc39.es/ecma262/#sec-object.defineproperty\r\n  var f$2 = descriptors ? $defineProperty : function defineProperty(O, P, Attributes) {\r\n    anObject(O);\r\n    P = toPropertyKey(P);\r\n    anObject(Attributes);\r\n    if (ie8DomDefine) try {\r\n      return $defineProperty(O, P, Attributes);\r\n    } catch (error) { /* empty */ }\r\n    if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported');\r\n    if ('value' in Attributes) O[P] = Attributes.value;\r\n    return O;\r\n  };\r\n\r\n  var objectDefineProperty = {\r\n  \tf: f$2\r\n  };\r\n\r\n  var createNonEnumerableProperty = descriptors ? function (object, key, value) {\r\n    return objectDefineProperty.f(object, key, createPropertyDescriptor(1, value));\r\n  } : function (object, key, value) {\r\n    object[key] = value;\r\n    return object;\r\n  };\r\n\r\n  var functionToString = Function.toString;\r\n\r\n  // this helper broken in `core-js@3.4.1-3.4.4`, so we can't use `shared` helper\r\n  if (typeof sharedStore.inspectSource != 'function') {\r\n    sharedStore.inspectSource = function (it) {\r\n      return functionToString.call(it);\r\n    };\r\n  }\r\n\r\n  var inspectSource = sharedStore.inspectSource;\r\n\r\n  var WeakMap$1 = global_1.WeakMap;\r\n\r\n  var nativeWeakMap = typeof WeakMap$1 === 'function' && /native code/.test(inspectSource(WeakMap$1));\r\n\r\n  var keys = shared('keys');\r\n\r\n  var sharedKey = function (key) {\r\n    return keys[key] || (keys[key] = uid(key));\r\n  };\r\n\r\n  var hiddenKeys$1 = {};\r\n\r\n  var OBJECT_ALREADY_INITIALIZED = 'Object already initialized';\r\n  var WeakMap = global_1.WeakMap;\r\n  var set, get, has;\r\n\r\n  var enforce = function (it) {\r\n    return has(it) ? get(it) : set(it, {});\r\n  };\r\n\r\n  var getterFor = function (TYPE) {\r\n    return function (it) {\r\n      var state;\r\n      if (!isObject(it) || (state = get(it)).type !== TYPE) {\r\n        throw TypeError('Incompatible receiver, ' + TYPE + ' required');\r\n      } return state;\r\n    };\r\n  };\r\n\r\n  if (nativeWeakMap || sharedStore.state) {\r\n    var store = sharedStore.state || (sharedStore.state = new WeakMap());\r\n    var wmget = store.get;\r\n    var wmhas = store.has;\r\n    var wmset = store.set;\r\n    set = function (it, metadata) {\r\n      if (wmhas.call(store, it)) throw new TypeError(OBJECT_ALREADY_INITIALIZED);\r\n      metadata.facade = it;\r\n      wmset.call(store, it, metadata);\r\n      return metadata;\r\n    };\r\n    get = function (it) {\r\n      return wmget.call(store, it) || {};\r\n    };\r\n    has = function (it) {\r\n      return wmhas.call(store, it);\r\n    };\r\n  } else {\r\n    var STATE = sharedKey('state');\r\n    hiddenKeys$1[STATE] = true;\r\n    set = function (it, metadata) {\r\n      if (has$1(it, STATE)) throw new TypeError(OBJECT_ALREADY_INITIALIZED);\r\n      metadata.facade = it;\r\n      createNonEnumerableProperty(it, STATE, metadata);\r\n      return metadata;\r\n    };\r\n    get = function (it) {\r\n      return has$1(it, STATE) ? it[STATE] : {};\r\n    };\r\n    has = function (it) {\r\n      return has$1(it, STATE);\r\n    };\r\n  }\r\n\r\n  var internalState = {\r\n    set: set,\r\n    get: get,\r\n    has: has,\r\n    enforce: enforce,\r\n    getterFor: getterFor\r\n  };\r\n\r\n  var redefine = createCommonjsModule(function (module) {\r\n  var getInternalState = internalState.get;\r\n  var enforceInternalState = internalState.enforce;\r\n  var TEMPLATE = String(String).split('String');\r\n\r\n  (module.exports = function (O, key, value, options) {\r\n    var unsafe = options ? !!options.unsafe : false;\r\n    var simple = options ? !!options.enumerable : false;\r\n    var noTargetGet = options ? !!options.noTargetGet : false;\r\n    var state;\r\n    if (typeof value == 'function') {\r\n      if (typeof key == 'string' && !has$1(value, 'name')) {\r\n        createNonEnumerableProperty(value, 'name', key);\r\n      }\r\n      state = enforceInternalState(value);\r\n      if (!state.source) {\r\n        state.source = TEMPLATE.join(typeof key == 'string' ? key : '');\r\n      }\r\n    }\r\n    if (O === global_1) {\r\n      if (simple) O[key] = value;\r\n      else setGlobal(key, value);\r\n      return;\r\n    } else if (!unsafe) {\r\n      delete O[key];\r\n    } else if (!noTargetGet && O[key]) {\r\n      simple = true;\r\n    }\r\n    if (simple) O[key] = value;\r\n    else createNonEnumerableProperty(O, key, value);\r\n  // add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\r\n  })(Function.prototype, 'toString', function toString() {\r\n    return typeof this == 'function' && getInternalState(this).source || inspectSource(this);\r\n  });\r\n  });\r\n\r\n  var ceil = Math.ceil;\r\n  var floor$2 = Math.floor;\r\n\r\n  // `ToInteger` abstract operation\r\n  // https://tc39.es/ecma262/#sec-tointeger\r\n  var toInteger = function (argument) {\r\n    return isNaN(argument = +argument) ? 0 : (argument > 0 ? floor$2 : ceil)(argument);\r\n  };\r\n\r\n  var min$4 = Math.min;\r\n\r\n  // `ToLength` abstract operation\r\n  // https://tc39.es/ecma262/#sec-tolength\r\n  var toLength = function (argument) {\r\n    return argument > 0 ? min$4(toInteger(argument), 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991\r\n  };\r\n\r\n  var max$3 = Math.max;\r\n  var min$3 = Math.min;\r\n\r\n  // Helper for a popular repeating case of the spec:\r\n  // Let integer be ? ToInteger(index).\r\n  // If integer < 0, let result be max((length + integer), 0); else let result be min(integer, length).\r\n  var toAbsoluteIndex = function (index, length) {\r\n    var integer = toInteger(index);\r\n    return integer < 0 ? max$3(integer + length, 0) : min$3(integer, length);\r\n  };\r\n\r\n  // `Array.prototype.{ indexOf, includes }` methods implementation\r\n  var createMethod$2 = function (IS_INCLUDES) {\r\n    return function ($this, el, fromIndex) {\r\n      var O = toIndexedObject($this);\r\n      var length = toLength(O.length);\r\n      var index = toAbsoluteIndex(fromIndex, length);\r\n      var value;\r\n      // Array#includes uses SameValueZero equality algorithm\r\n      // eslint-disable-next-line no-self-compare -- NaN check\r\n      if (IS_INCLUDES && el != el) while (length > index) {\r\n        value = O[index++];\r\n        // eslint-disable-next-line no-self-compare -- NaN check\r\n        if (value != value) return true;\r\n      // Array#indexOf ignores holes, Array#includes - not\r\n      } else for (;length > index; index++) {\r\n        if ((IS_INCLUDES || index in O) && O[index] === el) return IS_INCLUDES || index || 0;\r\n      } return !IS_INCLUDES && -1;\r\n    };\r\n  };\r\n\r\n  var arrayIncludes = {\r\n    // `Array.prototype.includes` method\r\n    // https://tc39.es/ecma262/#sec-array.prototype.includes\r\n    includes: createMethod$2(true),\r\n    // `Array.prototype.indexOf` method\r\n    // https://tc39.es/ecma262/#sec-array.prototype.indexof\r\n    indexOf: createMethod$2(false)\r\n  };\r\n\r\n  var indexOf = arrayIncludes.indexOf;\r\n\r\n\r\n  var objectKeysInternal = function (object, names) {\r\n    var O = toIndexedObject(object);\r\n    var i = 0;\r\n    var result = [];\r\n    var key;\r\n    for (key in O) !has$1(hiddenKeys$1, key) && has$1(O, key) && result.push(key);\r\n    // Don't enum bug & hidden keys\r\n    while (names.length > i) if (has$1(O, key = names[i++])) {\r\n      ~indexOf(result, key) || result.push(key);\r\n    }\r\n    return result;\r\n  };\r\n\r\n  // IE8- don't enum bug keys\r\n  var enumBugKeys = [\r\n    'constructor',\r\n    'hasOwnProperty',\r\n    'isPrototypeOf',\r\n    'propertyIsEnumerable',\r\n    'toLocaleString',\r\n    'toString',\r\n    'valueOf'\r\n  ];\r\n\r\n  var hiddenKeys = enumBugKeys.concat('length', 'prototype');\r\n\r\n  // `Object.getOwnPropertyNames` method\r\n  // https://tc39.es/ecma262/#sec-object.getownpropertynames\r\n  // eslint-disable-next-line es/no-object-getownpropertynames -- safe\r\n  var f$1 = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\r\n    return objectKeysInternal(O, hiddenKeys);\r\n  };\r\n\r\n  var objectGetOwnPropertyNames = {\r\n  \tf: f$1\r\n  };\r\n\r\n  // eslint-disable-next-line es/no-object-getownpropertysymbols -- safe\r\n  var f = Object.getOwnPropertySymbols;\r\n\r\n  var objectGetOwnPropertySymbols = {\r\n  \tf: f\r\n  };\r\n\r\n  // all object keys, includes non-enumerable and symbols\r\n  var ownKeys = getBuiltIn('Reflect', 'ownKeys') || function ownKeys(it) {\r\n    var keys = objectGetOwnPropertyNames.f(anObject(it));\r\n    var getOwnPropertySymbols = objectGetOwnPropertySymbols.f;\r\n    return getOwnPropertySymbols ? keys.concat(getOwnPropertySymbols(it)) : keys;\r\n  };\r\n\r\n  var copyConstructorProperties = function (target, source) {\r\n    var keys = ownKeys(source);\r\n    var defineProperty = objectDefineProperty.f;\r\n    var getOwnPropertyDescriptor = objectGetOwnPropertyDescriptor.f;\r\n    for (var i = 0; i < keys.length; i++) {\r\n      var key = keys[i];\r\n      if (!has$1(target, key)) defineProperty(target, key, getOwnPropertyDescriptor(source, key));\r\n    }\r\n  };\r\n\r\n  var replacement = /#|\\.prototype\\./;\r\n\r\n  var isForced = function (feature, detection) {\r\n    var value = data[normalize(feature)];\r\n    return value == POLYFILL ? true\r\n      : value == NATIVE ? false\r\n      : typeof detection == 'function' ? fails(detection)\r\n      : !!detection;\r\n  };\r\n\r\n  var normalize = isForced.normalize = function (string) {\r\n    return String(string).replace(replacement, '.').toLowerCase();\r\n  };\r\n\r\n  var data = isForced.data = {};\r\n  var NATIVE = isForced.NATIVE = 'N';\r\n  var POLYFILL = isForced.POLYFILL = 'P';\r\n\r\n  var isForced_1 = isForced;\r\n\r\n  var getOwnPropertyDescriptor = objectGetOwnPropertyDescriptor.f;\r\n\r\n\r\n\r\n\r\n\r\n\r\n  /*\r\n    options.target      - name of the target object\r\n    options.global      - target is the global object\r\n    options.stat        - export as static methods of target\r\n    options.proto       - export as prototype methods of target\r\n    options.real        - real prototype method for the `pure` version\r\n    options.forced      - export even if the native feature is available\r\n    options.bind        - bind methods to the target, required for the `pure` version\r\n    options.wrap        - wrap constructors to preventing global pollution, required for the `pure` version\r\n    options.unsafe      - use the simple assignment of property instead of delete + defineProperty\r\n    options.sham        - add a flag to not completely full polyfills\r\n    options.enumerable  - export as enumerable property\r\n    options.noTargetGet - prevent calling a getter on target\r\n  */\r\n  var _export = function (options, source) {\r\n    var TARGET = options.target;\r\n    var GLOBAL = options.global;\r\n    var STATIC = options.stat;\r\n    var FORCED, target, key, targetProperty, sourceProperty, descriptor;\r\n    if (GLOBAL) {\r\n      target = global_1;\r\n    } else if (STATIC) {\r\n      target = global_1[TARGET] || setGlobal(TARGET, {});\r\n    } else {\r\n      target = (global_1[TARGET] || {}).prototype;\r\n    }\r\n    if (target) for (key in source) {\r\n      sourceProperty = source[key];\r\n      if (options.noTargetGet) {\r\n        descriptor = getOwnPropertyDescriptor(target, key);\r\n        targetProperty = descriptor && descriptor.value;\r\n      } else targetProperty = target[key];\r\n      FORCED = isForced_1(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced);\r\n      // contained in target\r\n      if (!FORCED && targetProperty !== undefined) {\r\n        if (typeof sourceProperty === typeof targetProperty) continue;\r\n        copyConstructorProperties(sourceProperty, targetProperty);\r\n      }\r\n      // add a flag to not completely full polyfills\r\n      if (options.sham || (targetProperty && targetProperty.sham)) {\r\n        createNonEnumerableProperty(sourceProperty, 'sham', true);\r\n      }\r\n      // extend global\r\n      redefine(target, key, sourceProperty, options);\r\n    }\r\n  };\r\n\r\n  var toString_1 = function (argument) {\r\n    if (isSymbol(argument)) throw TypeError('Cannot convert a Symbol value to a string');\r\n    return String(argument);\r\n  };\r\n\r\n  // `RegExp.prototype.flags` getter implementation\r\n  // https://tc39.es/ecma262/#sec-get-regexp.prototype.flags\r\n  var regexpFlags = function () {\r\n    var that = anObject(this);\r\n    var result = '';\r\n    if (that.global) result += 'g';\r\n    if (that.ignoreCase) result += 'i';\r\n    if (that.multiline) result += 'm';\r\n    if (that.dotAll) result += 's';\r\n    if (that.unicode) result += 'u';\r\n    if (that.sticky) result += 'y';\r\n    return result;\r\n  };\r\n\r\n  // babel-minify transpiles RegExp('a', 'y') -> /a/y and it causes SyntaxError,\r\n  var RE = function (s, f) {\r\n    return RegExp(s, f);\r\n  };\r\n\r\n  var UNSUPPORTED_Y$2 = fails(function () {\r\n    var re = RE('a', 'y');\r\n    re.lastIndex = 2;\r\n    return re.exec('abcd') != null;\r\n  });\r\n\r\n  var BROKEN_CARET = fails(function () {\r\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=773687\r\n    var re = RE('^r', 'gy');\r\n    re.lastIndex = 2;\r\n    return re.exec('str') != null;\r\n  });\r\n\r\n  var regexpStickyHelpers = {\r\n  \tUNSUPPORTED_Y: UNSUPPORTED_Y$2,\r\n  \tBROKEN_CARET: BROKEN_CARET\r\n  };\r\n\r\n  // `Object.keys` method\r\n  // https://tc39.es/ecma262/#sec-object.keys\r\n  // eslint-disable-next-line es/no-object-keys -- safe\r\n  var objectKeys = Object.keys || function keys(O) {\r\n    return objectKeysInternal(O, enumBugKeys);\r\n  };\r\n\r\n  // `Object.defineProperties` method\r\n  // https://tc39.es/ecma262/#sec-object.defineproperties\r\n  // eslint-disable-next-line es/no-object-defineproperties -- safe\r\n  var objectDefineProperties = descriptors ? Object.defineProperties : function defineProperties(O, Properties) {\r\n    anObject(O);\r\n    var keys = objectKeys(Properties);\r\n    var length = keys.length;\r\n    var index = 0;\r\n    var key;\r\n    while (length > index) objectDefineProperty.f(O, key = keys[index++], Properties[key]);\r\n    return O;\r\n  };\r\n\r\n  var html = getBuiltIn('document', 'documentElement');\r\n\r\n  /* global ActiveXObject -- old IE, WSH */\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n  var GT = '>';\r\n  var LT = '<';\r\n  var PROTOTYPE = 'prototype';\r\n  var SCRIPT = 'script';\r\n  var IE_PROTO = sharedKey('IE_PROTO');\r\n\r\n  var EmptyConstructor = function () { /* empty */ };\r\n\r\n  var scriptTag = function (content) {\r\n    return LT + SCRIPT + GT + content + LT + '/' + SCRIPT + GT;\r\n  };\r\n\r\n  // Create object with fake `null` prototype: use ActiveX Object with cleared prototype\r\n  var NullProtoObjectViaActiveX = function (activeXDocument) {\r\n    activeXDocument.write(scriptTag(''));\r\n    activeXDocument.close();\r\n    var temp = activeXDocument.parentWindow.Object;\r\n    activeXDocument = null; // avoid memory leak\r\n    return temp;\r\n  };\r\n\r\n  // Create object with fake `null` prototype: use iframe Object with cleared prototype\r\n  var NullProtoObjectViaIFrame = function () {\r\n    // Thrash, waste and sodomy: IE GC bug\r\n    var iframe = documentCreateElement('iframe');\r\n    var JS = 'java' + SCRIPT + ':';\r\n    var iframeDocument;\r\n    if (iframe.style) {\r\n      iframe.style.display = 'none';\r\n      html.appendChild(iframe);\r\n      // https://github.com/zloirock/core-js/issues/475\r\n      iframe.src = String(JS);\r\n      iframeDocument = iframe.contentWindow.document;\r\n      iframeDocument.open();\r\n      iframeDocument.write(scriptTag('document.F=Object'));\r\n      iframeDocument.close();\r\n      return iframeDocument.F;\r\n    }\r\n  };\r\n\r\n  // Check for document.domain and active x support\r\n  // No need to use active x approach when document.domain is not set\r\n  // see https://github.com/es-shims/es5-shim/issues/150\r\n  // variation of https://github.com/kitcambridge/es5-shim/commit/4f738ac066346\r\n  // avoid IE GC bug\r\n  var activeXDocument;\r\n  var NullProtoObject = function () {\r\n    try {\r\n      activeXDocument = new ActiveXObject('htmlfile');\r\n    } catch (error) { /* ignore */ }\r\n    NullProtoObject = document.domain && activeXDocument ?\r\n      NullProtoObjectViaActiveX(activeXDocument) : // old IE\r\n      NullProtoObjectViaIFrame() ||\r\n      NullProtoObjectViaActiveX(activeXDocument); // WSH\r\n    var length = enumBugKeys.length;\r\n    while (length--) delete NullProtoObject[PROTOTYPE][enumBugKeys[length]];\r\n    return NullProtoObject();\r\n  };\r\n\r\n  hiddenKeys$1[IE_PROTO] = true;\r\n\r\n  // `Object.create` method\r\n  // https://tc39.es/ecma262/#sec-object.create\r\n  var objectCreate = Object.create || function create(O, Properties) {\r\n    var result;\r\n    if (O !== null) {\r\n      EmptyConstructor[PROTOTYPE] = anObject(O);\r\n      result = new EmptyConstructor();\r\n      EmptyConstructor[PROTOTYPE] = null;\r\n      // add \"__proto__\" for Object.getPrototypeOf polyfill\r\n      result[IE_PROTO] = O;\r\n    } else result = NullProtoObject();\r\n    return Properties === undefined ? result : objectDefineProperties(result, Properties);\r\n  };\r\n\r\n  var regexpUnsupportedDotAll = fails(function () {\r\n    // babel-minify transpiles RegExp('.', 's') -> /./s and it causes SyntaxError\r\n    var re = RegExp('.', (typeof '').charAt(0));\r\n    return !(re.dotAll && re.exec('\\n') && re.flags === 's');\r\n  });\r\n\r\n  var regexpUnsupportedNcg = fails(function () {\r\n    // babel-minify transpiles RegExp('.', 'g') -> /./g and it causes SyntaxError\r\n    var re = RegExp('(?<a>b)', (typeof '').charAt(5));\r\n    return re.exec('b').groups.a !== 'b' ||\r\n      'b'.replace(re, '$<a>c') !== 'bc';\r\n  });\r\n\r\n  /* eslint-disable regexp/no-assertion-capturing-group, regexp/no-empty-group, regexp/no-lazy-ends -- testing */\r\n  /* eslint-disable regexp/no-useless-quantifier -- testing */\r\n\r\n\r\n\r\n\r\n\r\n  var getInternalState = internalState.get;\r\n\r\n\r\n\r\n  var nativeExec = RegExp.prototype.exec;\r\n  var nativeReplace = shared('native-string-replace', String.prototype.replace);\r\n\r\n  var patchedExec = nativeExec;\r\n\r\n  var UPDATES_LAST_INDEX_WRONG = (function () {\r\n    var re1 = /a/;\r\n    var re2 = /b*/g;\r\n    nativeExec.call(re1, 'a');\r\n    nativeExec.call(re2, 'a');\r\n    return re1.lastIndex !== 0 || re2.lastIndex !== 0;\r\n  })();\r\n\r\n  var UNSUPPORTED_Y$1 = regexpStickyHelpers.UNSUPPORTED_Y || regexpStickyHelpers.BROKEN_CARET;\r\n\r\n  // nonparticipating capturing group, copied from es5-shim's String#split patch.\r\n  var NPCG_INCLUDED = /()??/.exec('')[1] !== undefined;\r\n\r\n  var PATCH = UPDATES_LAST_INDEX_WRONG || NPCG_INCLUDED || UNSUPPORTED_Y$1 || regexpUnsupportedDotAll || regexpUnsupportedNcg;\r\n\r\n  if (PATCH) {\r\n    // eslint-disable-next-line max-statements -- TODO\r\n    patchedExec = function exec(string) {\r\n      var re = this;\r\n      var state = getInternalState(re);\r\n      var str = toString_1(string);\r\n      var raw = state.raw;\r\n      var result, reCopy, lastIndex, match, i, object, group;\r\n\r\n      if (raw) {\r\n        raw.lastIndex = re.lastIndex;\r\n        result = patchedExec.call(raw, str);\r\n        re.lastIndex = raw.lastIndex;\r\n        return result;\r\n      }\r\n\r\n      var groups = state.groups;\r\n      var sticky = UNSUPPORTED_Y$1 && re.sticky;\r\n      var flags = regexpFlags.call(re);\r\n      var source = re.source;\r\n      var charsAdded = 0;\r\n      var strCopy = str;\r\n\r\n      if (sticky) {\r\n        flags = flags.replace('y', '');\r\n        if (flags.indexOf('g') === -1) {\r\n          flags += 'g';\r\n        }\r\n\r\n        strCopy = str.slice(re.lastIndex);\r\n        // Support anchored sticky behavior.\r\n        if (re.lastIndex > 0 && (!re.multiline || re.multiline && str.charAt(re.lastIndex - 1) !== '\\n')) {\r\n          source = '(?: ' + source + ')';\r\n          strCopy = ' ' + strCopy;\r\n          charsAdded++;\r\n        }\r\n        // ^(? + rx + ) is needed, in combination with some str slicing, to\r\n        // simulate the 'y' flag.\r\n        reCopy = new RegExp('^(?:' + source + ')', flags);\r\n      }\r\n\r\n      if (NPCG_INCLUDED) {\r\n        reCopy = new RegExp('^' + source + '$(?!\\\\s)', flags);\r\n      }\r\n      if (UPDATES_LAST_INDEX_WRONG) lastIndex = re.lastIndex;\r\n\r\n      match = nativeExec.call(sticky ? reCopy : re, strCopy);\r\n\r\n      if (sticky) {\r\n        if (match) {\r\n          match.input = match.input.slice(charsAdded);\r\n          match[0] = match[0].slice(charsAdded);\r\n          match.index = re.lastIndex;\r\n          re.lastIndex += match[0].length;\r\n        } else re.lastIndex = 0;\r\n      } else if (UPDATES_LAST_INDEX_WRONG && match) {\r\n        re.lastIndex = re.global ? match.index + match[0].length : lastIndex;\r\n      }\r\n      if (NPCG_INCLUDED && match && match.length > 1) {\r\n        // Fix browsers whose `exec` methods don't consistently return `undefined`\r\n        // for NPCG, like IE8. NOTE: This doesn' work for /(.?)?/\r\n        nativeReplace.call(match[0], reCopy, function () {\r\n          for (i = 1; i < arguments.length - 2; i++) {\r\n            if (arguments[i] === undefined) match[i] = undefined;\r\n          }\r\n        });\r\n      }\r\n\r\n      if (match && groups) {\r\n        match.groups = object = objectCreate(null);\r\n        for (i = 0; i < groups.length; i++) {\r\n          group = groups[i];\r\n          object[group[0]] = match[group[1]];\r\n        }\r\n      }\r\n\r\n      return match;\r\n    };\r\n  }\r\n\r\n  var regexpExec = patchedExec;\r\n\r\n  // `RegExp.prototype.exec` method\r\n  // https://tc39.es/ecma262/#sec-regexp.prototype.exec\r\n  _export({ target: 'RegExp', proto: true, forced: /./.exec !== regexpExec }, {\r\n    exec: regexpExec\r\n  });\r\n\r\n  // TODO: Remove from `core-js@4` since it's moved to entry points\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n  var SPECIES$4 = wellKnownSymbol('species');\r\n  var RegExpPrototype$1 = RegExp.prototype;\r\n\r\n  var fixRegexpWellKnownSymbolLogic = function (KEY, exec, FORCED, SHAM) {\r\n    var SYMBOL = wellKnownSymbol(KEY);\r\n\r\n    var DELEGATES_TO_SYMBOL = !fails(function () {\r\n      // String methods call symbol-named RegEp methods\r\n      var O = {};\r\n      O[SYMBOL] = function () { return 7; };\r\n      return ''[KEY](O) != 7;\r\n    });\r\n\r\n    var DELEGATES_TO_EXEC = DELEGATES_TO_SYMBOL && !fails(function () {\r\n      // Symbol-named RegExp methods call .exec\r\n      var execCalled = false;\r\n      var re = /a/;\r\n\r\n      if (KEY === 'split') {\r\n        // We can't use real regex here since it causes deoptimization\r\n        // and serious performance degradation in V8\r\n        // https://github.com/zloirock/core-js/issues/306\r\n        re = {};\r\n        // RegExp[@@split] doesn't call the regex's exec method, but first creates\r\n        // a new one. We need to return the patched regex when creating the new one.\r\n        re.constructor = {};\r\n        re.constructor[SPECIES$4] = function () { return re; };\r\n        re.flags = '';\r\n        re[SYMBOL] = /./[SYMBOL];\r\n      }\r\n\r\n      re.exec = function () { execCalled = true; return null; };\r\n\r\n      re[SYMBOL]('');\r\n      return !execCalled;\r\n    });\r\n\r\n    if (\r\n      !DELEGATES_TO_SYMBOL ||\r\n      !DELEGATES_TO_EXEC ||\r\n      FORCED\r\n    ) {\r\n      var nativeRegExpMethod = /./[SYMBOL];\r\n      var methods = exec(SYMBOL, ''[KEY], function (nativeMethod, regexp, str, arg2, forceStringMethod) {\r\n        var $exec = regexp.exec;\r\n        if ($exec === regexpExec || $exec === RegExpPrototype$1.exec) {\r\n          if (DELEGATES_TO_SYMBOL && !forceStringMethod) {\r\n            // The native String method already delegates to @@method (this\r\n            // polyfilled function), leasing to infinite recursion.\r\n            // We avoid it by directly calling the native @@method method.\r\n            return { done: true, value: nativeRegExpMethod.call(regexp, str, arg2) };\r\n          }\r\n          return { done: true, value: nativeMethod.call(str, regexp, arg2) };\r\n        }\r\n        return { done: false };\r\n      });\r\n\r\n      redefine(String.prototype, KEY, methods[0]);\r\n      redefine(RegExpPrototype$1, SYMBOL, methods[1]);\r\n    }\r\n\r\n    if (SHAM) createNonEnumerableProperty(RegExpPrototype$1[SYMBOL], 'sham', true);\r\n  };\r\n\r\n  // `String.prototype.codePointAt` methods implementation\r\n  var createMethod$1 = function (CONVERT_TO_STRING) {\r\n    return function ($this, pos) {\r\n      var S = toString_1(requireObjectCoercible($this));\r\n      var position = toInteger(pos);\r\n      var size = S.length;\r\n      var first, second;\r\n      if (position < 0 || position >= size) return CONVERT_TO_STRING ? '' : undefined;\r\n      first = S.charCodeAt(position);\r\n      return first < 0xD800 || first > 0xDBFF || position + 1 === size\r\n        || (second = S.charCodeAt(position + 1)) < 0xDC00 || second > 0xDFFF\r\n          ? CONVERT_TO_STRING ? S.charAt(position) : first\r\n          : CONVERT_TO_STRING ? S.slice(position, position + 2) : (first - 0xD800 << 10) + (second - 0xDC00) + 0x10000;\r\n    };\r\n  };\r\n\r\n  var stringMultibyte = {\r\n    // `String.prototype.codePointAt` method\r\n    // https://tc39.es/ecma262/#sec-string.prototype.codepointat\r\n    codeAt: createMethod$1(false),\r\n    // `String.prototype.at` method\r\n    // https://github.com/mathiasbynens/String.prototype.at\r\n    charAt: createMethod$1(true)\r\n  };\r\n\r\n  var charAt = stringMultibyte.charAt;\r\n\r\n  // `AdvanceStringIndex` abstract operation\r\n  // https://tc39.es/ecma262/#sec-advancestringindex\r\n  var advanceStringIndex = function (S, index, unicode) {\r\n    return index + (unicode ? charAt(S, index).length : 1);\r\n  };\r\n\r\n  // `RegExpExec` abstract operation\r\n  // https://tc39.es/ecma262/#sec-regexpexec\r\n  var regexpExecAbstract = function (R, S) {\r\n    var exec = R.exec;\r\n    if (typeof exec === 'function') {\r\n      var result = exec.call(R, S);\r\n      if (typeof result !== 'object') {\r\n        throw TypeError('RegExp exec method returned something other than an Object or null');\r\n      }\r\n      return result;\r\n    }\r\n\r\n    if (classofRaw(R) !== 'RegExp') {\r\n      throw TypeError('RegExp#exec called on incompatible receiver');\r\n    }\r\n\r\n    return regexpExec.call(R, S);\r\n  };\r\n\r\n  // @@match logic\r\n  fixRegexpWellKnownSymbolLogic('match', function (MATCH, nativeMatch, maybeCallNative) {\r\n    return [\r\n      // `String.prototype.match` method\r\n      // https://tc39.es/ecma262/#sec-string.prototype.match\r\n      function match(regexp) {\r\n        var O = requireObjectCoercible(this);\r\n        var matcher = regexp == undefined ? undefined : regexp[MATCH];\r\n        return matcher !== undefined ? matcher.call(regexp, O) : new RegExp(regexp)[MATCH](toString_1(O));\r\n      },\r\n      // `RegExp.prototype[@@match]` method\r\n      // https://tc39.es/ecma262/#sec-regexp.prototype-@@match\r\n      function (string) {\r\n        var rx = anObject(this);\r\n        var S = toString_1(string);\r\n        var res = maybeCallNative(nativeMatch, rx, S);\r\n\r\n        if (res.done) return res.value;\r\n\r\n        if (!rx.global) return regexpExecAbstract(rx, S);\r\n\r\n        var fullUnicode = rx.unicode;\r\n        rx.lastIndex = 0;\r\n        var A = [];\r\n        var n = 0;\r\n        var result;\r\n        while ((result = regexpExecAbstract(rx, S)) !== null) {\r\n          var matchStr = toString_1(result[0]);\r\n          A[n] = matchStr;\r\n          if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\r\n          n++;\r\n        }\r\n        return n === 0 ? null : A;\r\n      }\r\n    ];\r\n  });\r\n\r\n  // `IsArray` abstract operation\r\n  // https://tc39.es/ecma262/#sec-isarray\r\n  // eslint-disable-next-line es/no-array-isarray -- safe\r\n  var isArray = Array.isArray || function isArray(arg) {\r\n    return classofRaw(arg) == 'Array';\r\n  };\r\n\r\n  var createProperty = function (object, key, value) {\r\n    var propertyKey = toPropertyKey(key);\r\n    if (propertyKey in object) objectDefineProperty.f(object, propertyKey, createPropertyDescriptor(0, value));\r\n    else object[propertyKey] = value;\r\n  };\r\n\r\n  var SPECIES$3 = wellKnownSymbol('species');\r\n\r\n  // a part of `ArraySpeciesCreate` abstract operation\r\n  // https://tc39.es/ecma262/#sec-arrayspeciescreate\r\n  var arraySpeciesConstructor = function (originalArray) {\r\n    var C;\r\n    if (isArray(originalArray)) {\r\n      C = originalArray.constructor;\r\n      // cross-realm fallback\r\n      if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined;\r\n      else if (isObject(C)) {\r\n        C = C[SPECIES$3];\r\n        if (C === null) C = undefined;\r\n      }\r\n    } return C === undefined ? Array : C;\r\n  };\r\n\r\n  // `ArraySpeciesCreate` abstract operation\r\n  // https://tc39.es/ecma262/#sec-arrayspeciescreate\r\n  var arraySpeciesCreate = function (originalArray, length) {\r\n    return new (arraySpeciesConstructor(originalArray))(length === 0 ? 0 : length);\r\n  };\r\n\r\n  var SPECIES$2 = wellKnownSymbol('species');\r\n\r\n  var arrayMethodHasSpeciesSupport = function (METHOD_NAME) {\r\n    // We can't use this feature detection in V8 since it causes\r\n    // deoptimization and serious performance degradation\r\n    // https://github.com/zloirock/core-js/issues/677\r\n    return engineV8Version >= 51 || !fails(function () {\r\n      var array = [];\r\n      var constructor = array.constructor = {};\r\n      constructor[SPECIES$2] = function () {\r\n        return { foo: 1 };\r\n      };\r\n      return array[METHOD_NAME](Boolean).foo !== 1;\r\n    });\r\n  };\r\n\r\n  var IS_CONCAT_SPREADABLE = wellKnownSymbol('isConcatSpreadable');\r\n  var MAX_SAFE_INTEGER$1 = 0x1FFFFFFFFFFFFF;\r\n  var MAXIMUM_ALLOWED_INDEX_EXCEEDED = 'Maximum allowed index exceeded';\r\n\r\n  // We can't use this feature detection in V8 since it causes\r\n  // deoptimization and serious performance degradation\r\n  // https://github.com/zloirock/core-js/issues/679\r\n  var IS_CONCAT_SPREADABLE_SUPPORT = engineV8Version >= 51 || !fails(function () {\r\n    var array = [];\r\n    array[IS_CONCAT_SPREADABLE] = false;\r\n    return array.concat()[0] !== array;\r\n  });\r\n\r\n  var SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('concat');\r\n\r\n  var isConcatSpreadable = function (O) {\r\n    if (!isObject(O)) return false;\r\n    var spreadable = O[IS_CONCAT_SPREADABLE];\r\n    return spreadable !== undefined ? !!spreadable : isArray(O);\r\n  };\r\n\r\n  var FORCED$1 = !IS_CONCAT_SPREADABLE_SUPPORT || !SPECIES_SUPPORT;\r\n\r\n  // `Array.prototype.concat` method\r\n  // https://tc39.es/ecma262/#sec-array.prototype.concat\r\n  // with adding support of @@isConcatSpreadable and @@species\r\n  _export({ target: 'Array', proto: true, forced: FORCED$1 }, {\r\n    // eslint-disable-next-line no-unused-vars -- required for `.length`\r\n    concat: function concat(arg) {\r\n      var O = toObject(this);\r\n      var A = arraySpeciesCreate(O, 0);\r\n      var n = 0;\r\n      var i, k, length, len, E;\r\n      for (i = -1, length = arguments.length; i < length; i++) {\r\n        E = i === -1 ? O : arguments[i];\r\n        if (isConcatSpreadable(E)) {\r\n          len = toLength(E.length);\r\n          if (n + len > MAX_SAFE_INTEGER$1) throw TypeError(MAXIMUM_ALLOWED_INDEX_EXCEEDED);\r\n          for (k = 0; k < len; k++, n++) if (k in E) createProperty(A, n, E[k]);\r\n        } else {\r\n          if (n >= MAX_SAFE_INTEGER$1) throw TypeError(MAXIMUM_ALLOWED_INDEX_EXCEEDED);\r\n          createProperty(A, n++, E);\r\n        }\r\n      }\r\n      A.length = n;\r\n      return A;\r\n    }\r\n  });\r\n\r\n  var TO_STRING_TAG$1 = wellKnownSymbol('toStringTag');\r\n  var test$1 = {};\r\n\r\n  test$1[TO_STRING_TAG$1] = 'z';\r\n\r\n  var toStringTagSupport = String(test$1) === '[object z]';\r\n\r\n  var TO_STRING_TAG = wellKnownSymbol('toStringTag');\r\n  // ES3 wrong here\r\n  var CORRECT_ARGUMENTS = classofRaw(function () { return arguments; }()) == 'Arguments';\r\n\r\n  // fallback for IE11 Script Access Denied error\r\n  var tryGet = function (it, key) {\r\n    try {\r\n      return it[key];\r\n    } catch (error) { /* empty */ }\r\n  };\r\n\r\n  // getting tag from ES6+ `Object.prototype.toString`\r\n  var classof = toStringTagSupport ? classofRaw : function (it) {\r\n    var O, tag, result;\r\n    return it === undefined ? 'Undefined' : it === null ? 'Null'\r\n      // @@toStringTag case\r\n      : typeof (tag = tryGet(O = Object(it), TO_STRING_TAG)) == 'string' ? tag\r\n      // builtinTag case\r\n      : CORRECT_ARGUMENTS ? classofRaw(O)\r\n      // ES3 arguments fallback\r\n      : (result = classofRaw(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : result;\r\n  };\r\n\r\n  // `Object.prototype.toString` method implementation\r\n  // https://tc39.es/ecma262/#sec-object.prototype.tostring\r\n  var objectToString = toStringTagSupport ? {}.toString : function toString() {\r\n    return '[object ' + classof(this) + ']';\r\n  };\r\n\r\n  // `Object.prototype.toString` method\r\n  // https://tc39.es/ecma262/#sec-object.prototype.tostring\r\n  if (!toStringTagSupport) {\r\n    redefine(Object.prototype, 'toString', objectToString, { unsafe: true });\r\n  }\r\n\r\n  var TO_STRING = 'toString';\r\n  var RegExpPrototype = RegExp.prototype;\r\n  var nativeToString = RegExpPrototype[TO_STRING];\r\n\r\n  var NOT_GENERIC = fails(function () { return nativeToString.call({ source: 'a', flags: 'b' }) != '/a/b'; });\r\n  // FF44- RegExp#toString has a wrong name\r\n  var INCORRECT_NAME = nativeToString.name != TO_STRING;\r\n\r\n  // `RegExp.prototype.toString` method\r\n  // https://tc39.es/ecma262/#sec-regexp.prototype.tostring\r\n  if (NOT_GENERIC || INCORRECT_NAME) {\r\n    redefine(RegExp.prototype, TO_STRING, function toString() {\r\n      var R = anObject(this);\r\n      var p = toString_1(R.source);\r\n      var rf = R.flags;\r\n      var f = toString_1(rf === undefined && R instanceof RegExp && !('flags' in RegExpPrototype) ? regexpFlags.call(R) : rf);\r\n      return '/' + p + '/' + f;\r\n    }, { unsafe: true });\r\n  }\r\n\r\n  var MATCH$1 = wellKnownSymbol('match');\r\n\r\n  // `IsRegExp` abstract operation\r\n  // https://tc39.es/ecma262/#sec-isregexp\r\n  var isRegexp = function (it) {\r\n    var isRegExp;\r\n    return isObject(it) && ((isRegExp = it[MATCH$1]) !== undefined ? !!isRegExp : classofRaw(it) == 'RegExp');\r\n  };\r\n\r\n  var aFunction = function (it) {\r\n    if (typeof it != 'function') {\r\n      throw TypeError(String(it) + ' is not a function');\r\n    } return it;\r\n  };\r\n\r\n  var SPECIES$1 = wellKnownSymbol('species');\r\n\r\n  // `SpeciesConstructor` abstract operation\r\n  // https://tc39.es/ecma262/#sec-speciesconstructor\r\n  var speciesConstructor = function (O, defaultConstructor) {\r\n    var C = anObject(O).constructor;\r\n    var S;\r\n    return C === undefined || (S = anObject(C)[SPECIES$1]) == undefined ? defaultConstructor : aFunction(S);\r\n  };\r\n\r\n  var UNSUPPORTED_Y = regexpStickyHelpers.UNSUPPORTED_Y;\r\n  var arrayPush = [].push;\r\n  var min$2 = Math.min;\r\n  var MAX_UINT32 = 0xFFFFFFFF;\r\n\r\n  // Chrome 51 has a buggy \"split\" implementation when RegExp#exec !== nativeExec\r\n  // Weex JS has frozen built-in prototypes, so use try / catch wrapper\r\n  var SPLIT_WORKS_WITH_OVERWRITTEN_EXEC = !fails(function () {\r\n    // eslint-disable-next-line regexp/no-empty-group -- required for testing\r\n    var re = /(?:)/;\r\n    var originalExec = re.exec;\r\n    re.exec = function () { return originalExec.apply(this, arguments); };\r\n    var result = 'ab'.split(re);\r\n    return result.length !== 2 || result[0] !== 'a' || result[1] !== 'b';\r\n  });\r\n\r\n  // @@split logic\r\n  fixRegexpWellKnownSymbolLogic('split', function (SPLIT, nativeSplit, maybeCallNative) {\r\n    var internalSplit;\r\n    if (\r\n      'abbc'.split(/(b)*/)[1] == 'c' ||\r\n      // eslint-disable-next-line regexp/no-empty-group -- required for testing\r\n      'test'.split(/(?:)/, -1).length != 4 ||\r\n      'ab'.split(/(?:ab)*/).length != 2 ||\r\n      '.'.split(/(.?)(.?)/).length != 4 ||\r\n      // eslint-disable-next-line regexp/no-assertion-capturing-group, regexp/no-empty-group -- required for testing\r\n      '.'.split(/()()/).length > 1 ||\r\n      ''.split(/.?/).length\r\n    ) {\r\n      // based on es5-shim implementation, need to rework it\r\n      internalSplit = function (separator, limit) {\r\n        var string = toString_1(requireObjectCoercible(this));\r\n        var lim = limit === undefined ? MAX_UINT32 : limit >>> 0;\r\n        if (lim === 0) return [];\r\n        if (separator === undefined) return [string];\r\n        // If `separator` is not a regex, use native split\r\n        if (!isRegexp(separator)) {\r\n          return nativeSplit.call(string, separator, lim);\r\n        }\r\n        var output = [];\r\n        var flags = (separator.ignoreCase ? 'i' : '') +\r\n                    (separator.multiline ? 'm' : '') +\r\n                    (separator.unicode ? 'u' : '') +\r\n                    (separator.sticky ? 'y' : '');\r\n        var lastLastIndex = 0;\r\n        // Make `global` and avoid `lastIndex` issues by working with a copy\r\n        var separatorCopy = new RegExp(separator.source, flags + 'g');\r\n        var match, lastIndex, lastLength;\r\n        while (match = regexpExec.call(separatorCopy, string)) {\r\n          lastIndex = separatorCopy.lastIndex;\r\n          if (lastIndex > lastLastIndex) {\r\n            output.push(string.slice(lastLastIndex, match.index));\r\n            if (match.length > 1 && match.index < string.length) arrayPush.apply(output, match.slice(1));\r\n            lastLength = match[0].length;\r\n            lastLastIndex = lastIndex;\r\n            if (output.length >= lim) break;\r\n          }\r\n          if (separatorCopy.lastIndex === match.index) separatorCopy.lastIndex++; // Avoid an infinite loop\r\n        }\r\n        if (lastLastIndex === string.length) {\r\n          if (lastLength || !separatorCopy.test('')) output.push('');\r\n        } else output.push(string.slice(lastLastIndex));\r\n        return output.length > lim ? output.slice(0, lim) : output;\r\n      };\r\n    // Chakra, V8\r\n    } else if ('0'.split(undefined, 0).length) {\r\n      internalSplit = function (separator, limit) {\r\n        return separator === undefined && limit === 0 ? [] : nativeSplit.call(this, separator, limit);\r\n      };\r\n    } else internalSplit = nativeSplit;\r\n\r\n    return [\r\n      // `String.prototype.split` method\r\n      // https://tc39.es/ecma262/#sec-string.prototype.split\r\n      function split(separator, limit) {\r\n        var O = requireObjectCoercible(this);\r\n        var splitter = separator == undefined ? undefined : separator[SPLIT];\r\n        return splitter !== undefined\r\n          ? splitter.call(separator, O, limit)\r\n          : internalSplit.call(toString_1(O), separator, limit);\r\n      },\r\n      // `RegExp.prototype[@@split]` method\r\n      // https://tc39.es/ecma262/#sec-regexp.prototype-@@split\r\n      //\r\n      // NOTE: This cannot be properly polyfilled in engines that don't support\r\n      // the 'y' flag.\r\n      function (string, limit) {\r\n        var rx = anObject(this);\r\n        var S = toString_1(string);\r\n        var res = maybeCallNative(internalSplit, rx, S, limit, internalSplit !== nativeSplit);\r\n\r\n        if (res.done) return res.value;\r\n\r\n        var C = speciesConstructor(rx, RegExp);\r\n\r\n        var unicodeMatching = rx.unicode;\r\n        var flags = (rx.ignoreCase ? 'i' : '') +\r\n                    (rx.multiline ? 'm' : '') +\r\n                    (rx.unicode ? 'u' : '') +\r\n                    (UNSUPPORTED_Y ? 'g' : 'y');\r\n\r\n        // ^(? + rx + ) is needed, in combination with some S slicing, to\r\n        // simulate the 'y' flag.\r\n        var splitter = new C(UNSUPPORTED_Y ? '^(?:' + rx.source + ')' : rx, flags);\r\n        var lim = limit === undefined ? MAX_UINT32 : limit >>> 0;\r\n        if (lim === 0) return [];\r\n        if (S.length === 0) return regexpExecAbstract(splitter, S) === null ? [S] : [];\r\n        var p = 0;\r\n        var q = 0;\r\n        var A = [];\r\n        while (q < S.length) {\r\n          splitter.lastIndex = UNSUPPORTED_Y ? 0 : q;\r\n          var z = regexpExecAbstract(splitter, UNSUPPORTED_Y ? S.slice(q) : S);\r\n          var e;\r\n          if (\r\n            z === null ||\r\n            (e = min$2(toLength(splitter.lastIndex + (UNSUPPORTED_Y ? q : 0)), S.length)) === p\r\n          ) {\r\n            q = advanceStringIndex(S, q, unicodeMatching);\r\n          } else {\r\n            A.push(S.slice(p, q));\r\n            if (A.length === lim) return A;\r\n            for (var i = 1; i <= z.length - 1; i++) {\r\n              A.push(z[i]);\r\n              if (A.length === lim) return A;\r\n            }\r\n            q = p = e;\r\n          }\r\n        }\r\n        A.push(S.slice(p));\r\n        return A;\r\n      }\r\n    ];\r\n  }, !SPLIT_WORKS_WITH_OVERWRITTEN_EXEC, UNSUPPORTED_Y);\r\n\r\n  /**\r\n   * Append a class to an element\r\n   *\r\n   * @api private\r\n   * @method _addClass\r\n   * @param {Object} element\r\n   * @param {String} className\r\n   * @returns null\r\n   */\r\n\r\n  function addClass(element, className) {\r\n    if (element instanceof SVGElement) {\r\n      // svg\r\n      var pre = element.getAttribute(\"class\") || \"\";\r\n\r\n      if (!pre.match(className)) {\r\n        // check if element doesn't already have className\r\n        element.setAttribute(\"class\", \"\".concat(pre, \" \").concat(className));\r\n      }\r\n    } else {\r\n      if (element.classList !== undefined) {\r\n        // check for modern classList property\r\n        var classes = className.split(\" \");\r\n        forEach(classes, function (cls) {\r\n          element.classList.add(cls);\r\n        });\r\n      } else if (!element.className.match(className)) {\r\n        // check if element doesn't already have className\r\n        element.className += \" \".concat(className);\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Get an element CSS property on the page\r\n   * Thanks to JavaScript Kit: http://www.javascriptkit.com/dhtmltutors/dhtmlcascade4.shtml\r\n   *\r\n   * @api private\r\n   * @method _getPropValue\r\n   * @param {Object} element\r\n   * @param {String} propName\r\n   * @returns string property value\r\n   */\r\n  function getPropValue(element, propName) {\r\n    var propValue = \"\";\r\n\r\n    if (element.currentStyle) {\r\n      //IE\r\n      propValue = element.currentStyle[propName];\r\n    } else if (document.defaultView && document.defaultView.getComputedStyle) {\r\n      //Others\r\n      propValue = document.defaultView.getComputedStyle(element, null).getPropertyValue(propName);\r\n    } //Prevent exception in IE\r\n\r\n\r\n    if (propValue && propValue.toLowerCase) {\r\n      return propValue.toLowerCase();\r\n    } else {\r\n      return propValue;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * To set the show element\r\n   * This function set a relative (in most cases) position and changes the z-index\r\n   *\r\n   * @api private\r\n   * @method _setShowElement\r\n   * @param {Object} targetElement\r\n   */\r\n\r\n  function setShowElement(_ref) {\r\n    var element = _ref.element;\r\n    addClass(element, \"introjs-showElement\");\r\n    var currentElementPosition = getPropValue(element, \"position\");\r\n\r\n    if (currentElementPosition !== \"absolute\" && currentElementPosition !== \"relative\" && currentElementPosition !== \"sticky\" && currentElementPosition !== \"fixed\") {\r\n      //change to new intro item\r\n      addClass(element, \"introjs-relativePosition\");\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Find the nearest scrollable parent\r\n   * copied from https://stackoverflow.com/questions/35939886/find-first-scrollable-parent\r\n   *\r\n   * @param Element element\r\n   * @return Element\r\n   */\r\n  function getScrollParent(element) {\r\n    var style = window.getComputedStyle(element);\r\n    var excludeStaticParent = style.position === \"absolute\";\r\n    var overflowRegex = /(auto|scroll)/;\r\n    if (style.position === \"fixed\") return document.body;\r\n\r\n    for (var parent = element; parent = parent.parentElement;) {\r\n      style = window.getComputedStyle(parent);\r\n\r\n      if (excludeStaticParent && style.position === \"static\") {\r\n        continue;\r\n      }\r\n\r\n      if (overflowRegex.test(style.overflow + style.overflowY + style.overflowX)) return parent;\r\n    }\r\n\r\n    return document.body;\r\n  }\r\n\r\n  /**\r\n   * scroll a scrollable element to a child element\r\n   *\r\n   * @param {Object} targetElement\r\n   */\r\n\r\n  function scrollParentToElement(targetElement) {\r\n    var element = targetElement.element;\r\n    if (!this._options.scrollToElement) return;\r\n    var parent = getScrollParent(element);\r\n    if (parent === document.body) return;\r\n    parent.scrollTop = element.offsetTop - parent.offsetTop;\r\n  }\r\n\r\n  /**\r\n   * Provides a cross-browser way to get the screen dimensions\r\n   * via: http://stackoverflow.com/questions/5864467/internet-explorer-innerheight\r\n   *\r\n   * @api private\r\n   * @method _getWinSize\r\n   * @returns {Object} width and height attributes\r\n   */\r\n  function getWinSize() {\r\n    if (window.innerWidth !== undefined) {\r\n      return {\r\n        width: window.innerWidth,\r\n        height: window.innerHeight\r\n      };\r\n    } else {\r\n      var D = document.documentElement;\r\n      return {\r\n        width: D.clientWidth,\r\n        height: D.clientHeight\r\n      };\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Check to see if the element is in the viewport or not\r\n   * http://stackoverflow.com/questions/123999/how-to-tell-if-a-dom-element-is-visible-in-the-current-viewport\r\n   *\r\n   * @api private\r\n   * @method _elementInViewport\r\n   * @param {Object} el\r\n   */\r\n  function elementInViewport(el) {\r\n    var rect = el.getBoundingClientRect();\r\n    return rect.top >= 0 && rect.left >= 0 && rect.bottom + 80 <= window.innerHeight && // add 80 to get the text right\r\n    rect.right <= window.innerWidth;\r\n  }\r\n\r\n  /**\r\n   * To change the scroll of `window` after highlighting an element\r\n   *\r\n   * @api private\r\n   * @param {String} scrollTo\r\n   * @param {Object} targetElement\r\n   * @param {Object} tooltipLayer\r\n   */\r\n\r\n  function scrollTo(scrollTo, _ref, tooltipLayer) {\r\n    var element = _ref.element;\r\n    if (scrollTo === \"off\") return;\r\n    var rect;\r\n    if (!this._options.scrollToElement) return;\r\n\r\n    if (scrollTo === \"tooltip\") {\r\n      rect = tooltipLayer.getBoundingClientRect();\r\n    } else {\r\n      rect = element.getBoundingClientRect();\r\n    }\r\n\r\n    if (!elementInViewport(element)) {\r\n      var winHeight = getWinSize().height;\r\n      var top = rect.bottom - (rect.bottom - rect.top); // TODO (afshinm): do we need scroll padding now?\r\n      // I have changed the scroll option and now it scrolls the window to\r\n      // the center of the target element or tooltip.\r\n\r\n      if (top < 0 || element.clientHeight > winHeight) {\r\n        window.scrollBy(0, rect.top - (winHeight / 2 - rect.height / 2) - this._options.scrollPadding); // 30px padding from edge to look nice\r\n        //Scroll down\r\n      } else {\r\n        window.scrollBy(0, rect.top - (winHeight / 2 - rect.height / 2) + this._options.scrollPadding); // 30px padding from edge to look nice\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Setting anchors to behave like buttons\r\n   *\r\n   * @api private\r\n   * @method _setAnchorAsButton\r\n   */\r\n  function setAnchorAsButton(anchor) {\r\n    anchor.setAttribute(\"role\", \"button\");\r\n    anchor.tabIndex = 0;\r\n  }\r\n\r\n  // eslint-disable-next-line es/no-object-assign -- safe\r\n  var $assign = Object.assign;\r\n  // eslint-disable-next-line es/no-object-defineproperty -- required for testing\r\n  var defineProperty = Object.defineProperty;\r\n\r\n  // `Object.assign` method\r\n  // https://tc39.es/ecma262/#sec-object.assign\r\n  var objectAssign = !$assign || fails(function () {\r\n    // should have correct order of operations (Edge bug)\r\n    if (descriptors && $assign({ b: 1 }, $assign(defineProperty({}, 'a', {\r\n      enumerable: true,\r\n      get: function () {\r\n        defineProperty(this, 'b', {\r\n          value: 3,\r\n          enumerable: false\r\n        });\r\n      }\r\n    }), { b: 2 })).b !== 1) return true;\r\n    // should work with symbols and should have deterministic property order (V8 bug)\r\n    var A = {};\r\n    var B = {};\r\n    // eslint-disable-next-line es/no-symbol -- safe\r\n    var symbol = Symbol();\r\n    var alphabet = 'abcdefghijklmnopqrst';\r\n    A[symbol] = 7;\r\n    alphabet.split('').forEach(function (chr) { B[chr] = chr; });\r\n    return $assign({}, A)[symbol] != 7 || objectKeys($assign({}, B)).join('') != alphabet;\r\n  }) ? function assign(target, source) { // eslint-disable-line no-unused-vars -- required for `.length`\r\n    var T = toObject(target);\r\n    var argumentsLength = arguments.length;\r\n    var index = 1;\r\n    var getOwnPropertySymbols = objectGetOwnPropertySymbols.f;\r\n    var propertyIsEnumerable = objectPropertyIsEnumerable.f;\r\n    while (argumentsLength > index) {\r\n      var S = indexedObject(arguments[index++]);\r\n      var keys = getOwnPropertySymbols ? objectKeys(S).concat(getOwnPropertySymbols(S)) : objectKeys(S);\r\n      var length = keys.length;\r\n      var j = 0;\r\n      var key;\r\n      while (length > j) {\r\n        key = keys[j++];\r\n        if (!descriptors || propertyIsEnumerable.call(S, key)) T[key] = S[key];\r\n      }\r\n    } return T;\r\n  } : $assign;\r\n\r\n  // `Object.assign` method\r\n  // https://tc39.es/ecma262/#sec-object.assign\r\n  // eslint-disable-next-line es/no-object-assign -- required for testing\r\n  _export({ target: 'Object', stat: true, forced: Object.assign !== objectAssign }, {\r\n    assign: objectAssign\r\n  });\r\n\r\n  /**\r\n   * Checks to see if target element (or parents) position is fixed or not\r\n   *\r\n   * @api private\r\n   * @method _isFixed\r\n   * @param {Object} element\r\n   * @returns Boolean\r\n   */\r\n\r\n  function isFixed(element) {\r\n    var p = element.parentNode;\r\n\r\n    if (!p || p.nodeName === \"HTML\") {\r\n      return false;\r\n    }\r\n\r\n    if (getPropValue(element, \"position\") === \"fixed\") {\r\n      return true;\r\n    }\r\n\r\n    return isFixed(p);\r\n  }\r\n\r\n  /**\r\n   * Get an element position on the page relative to another element (or body)\r\n   * Thanks to `meouw`: http://stackoverflow.com/a/442474/375966\r\n   *\r\n   * @api private\r\n   * @method getOffset\r\n   * @param {Object} element\r\n   * @param {Object} relativeEl\r\n   * @returns Element's position info\r\n   */\r\n\r\n  function getOffset(element, relativeEl) {\r\n    var body = document.body;\r\n    var docEl = document.documentElement;\r\n    var scrollTop = window.pageYOffset || docEl.scrollTop || body.scrollTop;\r\n    var scrollLeft = window.pageXOffset || docEl.scrollLeft || body.scrollLeft;\r\n    relativeEl = relativeEl || body;\r\n    var x = element.getBoundingClientRect();\r\n    var xr = relativeEl.getBoundingClientRect();\r\n    var relativeElPosition = getPropValue(relativeEl, \"position\");\r\n    var obj = {\r\n      width: x.width,\r\n      height: x.height\r\n    };\r\n\r\n    if (relativeEl.tagName.toLowerCase() !== \"body\" && relativeElPosition === \"relative\" || relativeElPosition === \"sticky\") {\r\n      // when the container of our target element is _not_ body and has either \"relative\" or \"sticky\" position, we should not\r\n      // consider the scroll position but we need to include the relative x/y of the container element\r\n      return Object.assign(obj, {\r\n        top: x.top - xr.top,\r\n        left: x.left - xr.left\r\n      });\r\n    } else {\r\n      if (isFixed(element)) {\r\n        return Object.assign(obj, {\r\n          top: x.top,\r\n          left: x.left\r\n        });\r\n      } else {\r\n        return Object.assign(obj, {\r\n          top: x.top + scrollTop,\r\n          left: x.left + scrollLeft\r\n        });\r\n      }\r\n    }\r\n  }\r\n\r\n  var floor$1 = Math.floor;\r\n  var replace = ''.replace;\r\n  var SUBSTITUTION_SYMBOLS = /\\$([$&'`]|\\d{1,2}|<[^>]*>)/g;\r\n  var SUBSTITUTION_SYMBOLS_NO_NAMED = /\\$([$&'`]|\\d{1,2})/g;\r\n\r\n  // `GetSubstitution` abstract operation\r\n  // https://tc39.es/ecma262/#sec-getsubstitution\r\n  var getSubstitution = function (matched, str, position, captures, namedCaptures, replacement) {\r\n    var tailPos = position + matched.length;\r\n    var m = captures.length;\r\n    var symbols = SUBSTITUTION_SYMBOLS_NO_NAMED;\r\n    if (namedCaptures !== undefined) {\r\n      namedCaptures = toObject(namedCaptures);\r\n      symbols = SUBSTITUTION_SYMBOLS;\r\n    }\r\n    return replace.call(replacement, symbols, function (match, ch) {\r\n      var capture;\r\n      switch (ch.charAt(0)) {\r\n        case '$': return '$';\r\n        case '&': return matched;\r\n        case '`': return str.slice(0, position);\r\n        case \"'\": return str.slice(tailPos);\r\n        case '<':\r\n          capture = namedCaptures[ch.slice(1, -1)];\r\n          break;\r\n        default: // \\d\\d?\r\n          var n = +ch;\r\n          if (n === 0) return match;\r\n          if (n > m) {\r\n            var f = floor$1(n / 10);\r\n            if (f === 0) return match;\r\n            if (f <= m) return captures[f - 1] === undefined ? ch.charAt(1) : captures[f - 1] + ch.charAt(1);\r\n            return match;\r\n          }\r\n          capture = captures[n - 1];\r\n      }\r\n      return capture === undefined ? '' : capture;\r\n    });\r\n  };\r\n\r\n  var REPLACE = wellKnownSymbol('replace');\r\n  var max$2 = Math.max;\r\n  var min$1 = Math.min;\r\n\r\n  var maybeToString = function (it) {\r\n    return it === undefined ? it : String(it);\r\n  };\r\n\r\n  // IE <= 11 replaces $0 with the whole match, as if it was $&\r\n  // https://stackoverflow.com/questions/6024666/getting-ie-to-replace-a-regex-with-the-literal-string-0\r\n  var REPLACE_KEEPS_$0 = (function () {\r\n    // eslint-disable-next-line regexp/prefer-escape-replacement-dollar-char -- required for testing\r\n    return 'a'.replace(/./, '$0') === '$0';\r\n  })();\r\n\r\n  // Safari <= 13.0.3(?) substitutes nth capture where n>m with an empty string\r\n  var REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE = (function () {\r\n    if (/./[REPLACE]) {\r\n      return /./[REPLACE]('a', '$0') === '';\r\n    }\r\n    return false;\r\n  })();\r\n\r\n  var REPLACE_SUPPORTS_NAMED_GROUPS = !fails(function () {\r\n    var re = /./;\r\n    re.exec = function () {\r\n      var result = [];\r\n      result.groups = { a: '7' };\r\n      return result;\r\n    };\r\n    return ''.replace(re, '$<a>') !== '7';\r\n  });\r\n\r\n  // @@replace logic\r\n  fixRegexpWellKnownSymbolLogic('replace', function (_, nativeReplace, maybeCallNative) {\r\n    var UNSAFE_SUBSTITUTE = REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE ? '$' : '$0';\r\n\r\n    return [\r\n      // `String.prototype.replace` method\r\n      // https://tc39.es/ecma262/#sec-string.prototype.replace\r\n      function replace(searchValue, replaceValue) {\r\n        var O = requireObjectCoercible(this);\r\n        var replacer = searchValue == undefined ? undefined : searchValue[REPLACE];\r\n        return replacer !== undefined\r\n          ? replacer.call(searchValue, O, replaceValue)\r\n          : nativeReplace.call(toString_1(O), searchValue, replaceValue);\r\n      },\r\n      // `RegExp.prototype[@@replace]` method\r\n      // https://tc39.es/ecma262/#sec-regexp.prototype-@@replace\r\n      function (string, replaceValue) {\r\n        var rx = anObject(this);\r\n        var S = toString_1(string);\r\n\r\n        if (\r\n          typeof replaceValue === 'string' &&\r\n          replaceValue.indexOf(UNSAFE_SUBSTITUTE) === -1 &&\r\n          replaceValue.indexOf('$<') === -1\r\n        ) {\r\n          var res = maybeCallNative(nativeReplace, rx, S, replaceValue);\r\n          if (res.done) return res.value;\r\n        }\r\n\r\n        var functionalReplace = typeof replaceValue === 'function';\r\n        if (!functionalReplace) replaceValue = toString_1(replaceValue);\r\n\r\n        var global = rx.global;\r\n        if (global) {\r\n          var fullUnicode = rx.unicode;\r\n          rx.lastIndex = 0;\r\n        }\r\n        var results = [];\r\n        while (true) {\r\n          var result = regexpExecAbstract(rx, S);\r\n          if (result === null) break;\r\n\r\n          results.push(result);\r\n          if (!global) break;\r\n\r\n          var matchStr = toString_1(result[0]);\r\n          if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\r\n        }\r\n\r\n        var accumulatedResult = '';\r\n        var nextSourcePosition = 0;\r\n        for (var i = 0; i < results.length; i++) {\r\n          result = results[i];\r\n\r\n          var matched = toString_1(result[0]);\r\n          var position = max$2(min$1(toInteger(result.index), S.length), 0);\r\n          var captures = [];\r\n          // NOTE: This is equivalent to\r\n          //   captures = result.slice(1).map(maybeToString)\r\n          // but for some reason `nativeSlice.call(result, 1, result.length)` (called in\r\n          // the slice polyfill when slicing native arrays) \"doesn't work\" in safari 9 and\r\n          // causes a crash (https://pastebin.com/N21QzeQA) when trying to debug it.\r\n          for (var j = 1; j < result.length; j++) captures.push(maybeToString(result[j]));\r\n          var namedCaptures = result.groups;\r\n          if (functionalReplace) {\r\n            var replacerArgs = [matched].concat(captures, position, S);\r\n            if (namedCaptures !== undefined) replacerArgs.push(namedCaptures);\r\n            var replacement = toString_1(replaceValue.apply(undefined, replacerArgs));\r\n          } else {\r\n            replacement = getSubstitution(matched, S, position, captures, namedCaptures, replaceValue);\r\n          }\r\n          if (position >= nextSourcePosition) {\r\n            accumulatedResult += S.slice(nextSourcePosition, position) + replacement;\r\n            nextSourcePosition = position + matched.length;\r\n          }\r\n        }\r\n        return accumulatedResult + S.slice(nextSourcePosition);\r\n      }\r\n    ];\r\n  }, !REPLACE_SUPPORTS_NAMED_GROUPS || !REPLACE_KEEPS_$0 || REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE);\r\n\r\n  /**\r\n   * Remove a class from an element\r\n   *\r\n   * @api private\r\n   * @method _removeClass\r\n   * @param {Object} element\r\n   * @param {RegExp|String} classNameRegex can be regex or string\r\n   * @returns null\r\n   */\r\n  function removeClass(element, classNameRegex) {\r\n    if (element instanceof SVGElement) {\r\n      var pre = element.getAttribute(\"class\") || \"\";\r\n      element.setAttribute(\"class\", pre.replace(classNameRegex, \"\").replace(/^\\s+|\\s+$/g, \"\"));\r\n    } else {\r\n      element.className = element.className.replace(classNameRegex, \"\").replace(/^\\s+|\\s+$/g, \"\");\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Sets the style of an DOM element\r\n   *\r\n   * @param {Object} element\r\n   * @param {Object|string} style\r\n   * @return null\r\n   */\r\n  function setStyle(element, style) {\r\n    var cssText = \"\";\r\n\r\n    if (element.style.cssText) {\r\n      cssText += element.style.cssText;\r\n    }\r\n\r\n    if (typeof style === \"string\") {\r\n      cssText += style;\r\n    } else {\r\n      for (var rule in style) {\r\n        cssText += \"\".concat(rule, \":\").concat(style[rule], \";\");\r\n      }\r\n    }\r\n\r\n    element.style.cssText = cssText;\r\n  }\r\n\r\n  /**\r\n   * Update the position of the helper layer on the screen\r\n   *\r\n   * @api private\r\n   * @method _setHelperLayerPosition\r\n   * @param {Object} helperLayer\r\n   */\r\n\r\n  function setHelperLayerPosition(helperLayer) {\r\n    if (helperLayer) {\r\n      //prevent error when `this._currentStep` in undefined\r\n      if (!this._introItems[this._currentStep]) return;\r\n      var currentElement = this._introItems[this._currentStep];\r\n      var elementPosition = getOffset(currentElement.element, this._targetElement);\r\n      var widthHeightPadding = this._options.helperElementPadding; // If the target element is fixed, the tooltip should be fixed as well.\r\n      // Otherwise, remove a fixed class that may be left over from the previous\r\n      // step.\r\n\r\n      if (isFixed(currentElement.element)) {\r\n        addClass(helperLayer, \"introjs-fixedTooltip\");\r\n      } else {\r\n        removeClass(helperLayer, \"introjs-fixedTooltip\");\r\n      }\r\n\r\n      if (currentElement.position === \"floating\") {\r\n        widthHeightPadding = 0;\r\n      } //set new position to helper layer\r\n\r\n\r\n      setStyle(helperLayer, {\r\n        width: \"\".concat(elementPosition.width + widthHeightPadding, \"px\"),\r\n        height: \"\".concat(elementPosition.height + widthHeightPadding, \"px\"),\r\n        top: \"\".concat(elementPosition.top - widthHeightPadding / 2, \"px\"),\r\n        left: \"\".concat(elementPosition.left - widthHeightPadding / 2, \"px\")\r\n      });\r\n    }\r\n  }\r\n\r\n  var UNSCOPABLES = wellKnownSymbol('unscopables');\r\n  var ArrayPrototype = Array.prototype;\r\n\r\n  // Array.prototype[@@unscopables]\r\n  // https://tc39.es/ecma262/#sec-array.prototype-@@unscopables\r\n  if (ArrayPrototype[UNSCOPABLES] == undefined) {\r\n    objectDefineProperty.f(ArrayPrototype, UNSCOPABLES, {\r\n      configurable: true,\r\n      value: objectCreate(null)\r\n    });\r\n  }\r\n\r\n  // add a key to Array.prototype[@@unscopables]\r\n  var addToUnscopables = function (key) {\r\n    ArrayPrototype[UNSCOPABLES][key] = true;\r\n  };\r\n\r\n  var $includes = arrayIncludes.includes;\r\n\r\n\r\n  // `Array.prototype.includes` method\r\n  // https://tc39.es/ecma262/#sec-array.prototype.includes\r\n  _export({ target: 'Array', proto: true }, {\r\n    includes: function includes(el /* , fromIndex = 0 */) {\r\n      return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);\r\n    }\r\n  });\r\n\r\n  // https://tc39.es/ecma262/#sec-array.prototype-@@unscopables\r\n  addToUnscopables('includes');\r\n\r\n  var HAS_SPECIES_SUPPORT$2 = arrayMethodHasSpeciesSupport('slice');\r\n\r\n  var SPECIES = wellKnownSymbol('species');\r\n  var nativeSlice = [].slice;\r\n  var max$1 = Math.max;\r\n\r\n  // `Array.prototype.slice` method\r\n  // https://tc39.es/ecma262/#sec-array.prototype.slice\r\n  // fallback for not array-like ES3 strings and DOM objects\r\n  _export({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT$2 }, {\r\n    slice: function slice(start, end) {\r\n      var O = toIndexedObject(this);\r\n      var length = toLength(O.length);\r\n      var k = toAbsoluteIndex(start, length);\r\n      var fin = toAbsoluteIndex(end === undefined ? length : end, length);\r\n      // inline `ArraySpeciesCreate` for usage native `Array#slice` where it's possible\r\n      var Constructor, result, n;\r\n      if (isArray(O)) {\r\n        Constructor = O.constructor;\r\n        // cross-realm fallback\r\n        if (typeof Constructor == 'function' && (Constructor === Array || isArray(Constructor.prototype))) {\r\n          Constructor = undefined;\r\n        } else if (isObject(Constructor)) {\r\n          Constructor = Constructor[SPECIES];\r\n          if (Constructor === null) Constructor = undefined;\r\n        }\r\n        if (Constructor === Array || Constructor === undefined) {\r\n          return nativeSlice.call(O, k, fin);\r\n        }\r\n      }\r\n      result = new (Constructor === undefined ? Array : Constructor)(max$1(fin - k, 0));\r\n      for (n = 0; k < fin; k++, n++) if (k in O) createProperty(result, n, O[k]);\r\n      result.length = n;\r\n      return result;\r\n    }\r\n  });\r\n\r\n  var notARegexp = function (it) {\r\n    if (isRegexp(it)) {\r\n      throw TypeError(\"The method doesn't accept regular expressions\");\r\n    } return it;\r\n  };\r\n\r\n  var MATCH = wellKnownSymbol('match');\r\n\r\n  var correctIsRegexpLogic = function (METHOD_NAME) {\r\n    var regexp = /./;\r\n    try {\r\n      '/./'[METHOD_NAME](regexp);\r\n    } catch (error1) {\r\n      try {\r\n        regexp[MATCH] = false;\r\n        return '/./'[METHOD_NAME](regexp);\r\n      } catch (error2) { /* empty */ }\r\n    } return false;\r\n  };\r\n\r\n  // `String.prototype.includes` method\r\n  // https://tc39.es/ecma262/#sec-string.prototype.includes\r\n  _export({ target: 'String', proto: true, forced: !correctIsRegexpLogic('includes') }, {\r\n    includes: function includes(searchString /* , position = 0 */) {\r\n      return !!~toString_1(requireObjectCoercible(this))\r\n        .indexOf(toString_1(notARegexp(searchString)), arguments.length > 1 ? arguments[1] : undefined);\r\n    }\r\n  });\r\n\r\n  var arrayMethodIsStrict = function (METHOD_NAME, argument) {\r\n    var method = [][METHOD_NAME];\r\n    return !!method && fails(function () {\r\n      // eslint-disable-next-line no-useless-call,no-throw-literal -- required for testing\r\n      method.call(null, argument || function () { throw 1; }, 1);\r\n    });\r\n  };\r\n\r\n  var nativeJoin = [].join;\r\n\r\n  var ES3_STRINGS = indexedObject != Object;\r\n  var STRICT_METHOD$1 = arrayMethodIsStrict('join', ',');\r\n\r\n  // `Array.prototype.join` method\r\n  // https://tc39.es/ecma262/#sec-array.prototype.join\r\n  _export({ target: 'Array', proto: true, forced: ES3_STRINGS || !STRICT_METHOD$1 }, {\r\n    join: function join(separator) {\r\n      return nativeJoin.call(toIndexedObject(this), separator === undefined ? ',' : separator);\r\n    }\r\n  });\r\n\r\n  // optional / simple context binding\r\n  var functionBindContext = function (fn, that, length) {\r\n    aFunction(fn);\r\n    if (that === undefined) return fn;\r\n    switch (length) {\r\n      case 0: return function () {\r\n        return fn.call(that);\r\n      };\r\n      case 1: return function (a) {\r\n        return fn.call(that, a);\r\n      };\r\n      case 2: return function (a, b) {\r\n        return fn.call(that, a, b);\r\n      };\r\n      case 3: return function (a, b, c) {\r\n        return fn.call(that, a, b, c);\r\n      };\r\n    }\r\n    return function (/* ...args */) {\r\n      return fn.apply(that, arguments);\r\n    };\r\n  };\r\n\r\n  var push = [].push;\r\n\r\n  // `Array.prototype.{ forEach, map, filter, some, every, find, findIndex, filterReject }` methods implementation\r\n  var createMethod = function (TYPE) {\r\n    var IS_MAP = TYPE == 1;\r\n    var IS_FILTER = TYPE == 2;\r\n    var IS_SOME = TYPE == 3;\r\n    var IS_EVERY = TYPE == 4;\r\n    var IS_FIND_INDEX = TYPE == 6;\r\n    var IS_FILTER_REJECT = TYPE == 7;\r\n    var NO_HOLES = TYPE == 5 || IS_FIND_INDEX;\r\n    return function ($this, callbackfn, that, specificCreate) {\r\n      var O = toObject($this);\r\n      var self = indexedObject(O);\r\n      var boundFunction = functionBindContext(callbackfn, that, 3);\r\n      var length = toLength(self.length);\r\n      var index = 0;\r\n      var create = specificCreate || arraySpeciesCreate;\r\n      var target = IS_MAP ? create($this, length) : IS_FILTER || IS_FILTER_REJECT ? create($this, 0) : undefined;\r\n      var value, result;\r\n      for (;length > index; index++) if (NO_HOLES || index in self) {\r\n        value = self[index];\r\n        result = boundFunction(value, index, O);\r\n        if (TYPE) {\r\n          if (IS_MAP) target[index] = result; // map\r\n          else if (result) switch (TYPE) {\r\n            case 3: return true;              // some\r\n            case 5: return value;             // find\r\n            case 6: return index;             // findIndex\r\n            case 2: push.call(target, value); // filter\r\n          } else switch (TYPE) {\r\n            case 4: return false;             // every\r\n            case 7: push.call(target, value); // filterReject\r\n          }\r\n        }\r\n      }\r\n      return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : target;\r\n    };\r\n  };\r\n\r\n  var arrayIteration = {\r\n    // `Array.prototype.forEach` method\r\n    // https://tc39.es/ecma262/#sec-array.prototype.foreach\r\n    forEach: createMethod(0),\r\n    // `Array.prototype.map` method\r\n    // https://tc39.es/ecma262/#sec-array.prototype.map\r\n    map: createMethod(1),\r\n    // `Array.prototype.filter` method\r\n    // https://tc39.es/ecma262/#sec-array.prototype.filter\r\n    filter: createMethod(2),\r\n    // `Array.prototype.some` method\r\n    // https://tc39.es/ecma262/#sec-array.prototype.some\r\n    some: createMethod(3),\r\n    // `Array.prototype.every` method\r\n    // https://tc39.es/ecma262/#sec-array.prototype.every\r\n    every: createMethod(4),\r\n    // `Array.prototype.find` method\r\n    // https://tc39.es/ecma262/#sec-array.prototype.find\r\n    find: createMethod(5),\r\n    // `Array.prototype.findIndex` method\r\n    // https://tc39.es/ecma262/#sec-array.prototype.findIndex\r\n    findIndex: createMethod(6),\r\n    // `Array.prototype.filterReject` method\r\n    // https://github.com/tc39/proposal-array-filtering\r\n    filterReject: createMethod(7)\r\n  };\r\n\r\n  var $filter = arrayIteration.filter;\r\n\r\n\r\n  var HAS_SPECIES_SUPPORT$1 = arrayMethodHasSpeciesSupport('filter');\r\n\r\n  // `Array.prototype.filter` method\r\n  // https://tc39.es/ecma262/#sec-array.prototype.filter\r\n  // with adding support of @@species\r\n  _export({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT$1 }, {\r\n    filter: function filter(callbackfn /* , thisArg */) {\r\n      return $filter(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\r\n    }\r\n  });\r\n\r\n  /**\r\n   * Set tooltip left so it doesn't go off the right side of the window\r\n   *\r\n   * @return boolean true, if tooltipLayerStyleLeft is ok.  false, otherwise.\r\n   */\r\n  function checkRight(targetOffset, tooltipLayerStyleLeft, tooltipOffset, windowSize, tooltipLayer) {\r\n    if (targetOffset.left + tooltipLayerStyleLeft + tooltipOffset.width > windowSize.width) {\r\n      // off the right side of the window\r\n      tooltipLayer.style.left = \"\".concat(windowSize.width - tooltipOffset.width - targetOffset.left, \"px\");\r\n      return false;\r\n    }\r\n\r\n    tooltipLayer.style.left = \"\".concat(tooltipLayerStyleLeft, \"px\");\r\n    return true;\r\n  }\r\n\r\n  /**\r\n   * Set tooltip right so it doesn't go off the left side of the window\r\n   *\r\n   * @return boolean true, if tooltipLayerStyleRight is ok.  false, otherwise.\r\n   */\r\n  function checkLeft(targetOffset, tooltipLayerStyleRight, tooltipOffset, tooltipLayer) {\r\n    if (targetOffset.left + targetOffset.width - tooltipLayerStyleRight - tooltipOffset.width < 0) {\r\n      // off the left side of the window\r\n      tooltipLayer.style.left = \"\".concat(-targetOffset.left, \"px\");\r\n      return false;\r\n    }\r\n\r\n    tooltipLayer.style.right = \"\".concat(tooltipLayerStyleRight, \"px\");\r\n    return true;\r\n  }\r\n\r\n  var HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('splice');\r\n\r\n  var max = Math.max;\r\n  var min = Math.min;\r\n  var MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF;\r\n  var MAXIMUM_ALLOWED_LENGTH_EXCEEDED = 'Maximum allowed length exceeded';\r\n\r\n  // `Array.prototype.splice` method\r\n  // https://tc39.es/ecma262/#sec-array.prototype.splice\r\n  // with adding support of @@species\r\n  _export({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT }, {\r\n    splice: function splice(start, deleteCount /* , ...items */) {\r\n      var O = toObject(this);\r\n      var len = toLength(O.length);\r\n      var actualStart = toAbsoluteIndex(start, len);\r\n      var argumentsLength = arguments.length;\r\n      var insertCount, actualDeleteCount, A, k, from, to;\r\n      if (argumentsLength === 0) {\r\n        insertCount = actualDeleteCount = 0;\r\n      } else if (argumentsLength === 1) {\r\n        insertCount = 0;\r\n        actualDeleteCount = len - actualStart;\r\n      } else {\r\n        insertCount = argumentsLength - 2;\r\n        actualDeleteCount = min(max(toInteger(deleteCount), 0), len - actualStart);\r\n      }\r\n      if (len + insertCount - actualDeleteCount > MAX_SAFE_INTEGER) {\r\n        throw TypeError(MAXIMUM_ALLOWED_LENGTH_EXCEEDED);\r\n      }\r\n      A = arraySpeciesCreate(O, actualDeleteCount);\r\n      for (k = 0; k < actualDeleteCount; k++) {\r\n        from = actualStart + k;\r\n        if (from in O) createProperty(A, k, O[from]);\r\n      }\r\n      A.length = actualDeleteCount;\r\n      if (insertCount < actualDeleteCount) {\r\n        for (k = actualStart; k < len - actualDeleteCount; k++) {\r\n          from = k + actualDeleteCount;\r\n          to = k + insertCount;\r\n          if (from in O) O[to] = O[from];\r\n          else delete O[to];\r\n        }\r\n        for (k = len; k > len - actualDeleteCount + insertCount; k--) delete O[k - 1];\r\n      } else if (insertCount > actualDeleteCount) {\r\n        for (k = len - actualDeleteCount; k > actualStart; k--) {\r\n          from = k + actualDeleteCount - 1;\r\n          to = k + insertCount - 1;\r\n          if (from in O) O[to] = O[from];\r\n          else delete O[to];\r\n        }\r\n      }\r\n      for (k = 0; k < insertCount; k++) {\r\n        O[k + actualStart] = arguments[k + 2];\r\n      }\r\n      O.length = len - actualDeleteCount + insertCount;\r\n      return A;\r\n    }\r\n  });\r\n\r\n  /**\r\n   * Remove an entry from a string array if it's there, does nothing if it isn't there.\r\n   *\r\n   * @param {Array} stringArray\r\n   * @param {String} stringToRemove\r\n   */\r\n  function removeEntry(stringArray, stringToRemove) {\r\n    if (stringArray.includes(stringToRemove)) {\r\n      stringArray.splice(stringArray.indexOf(stringToRemove), 1);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * auto-determine alignment\r\n   * @param {Integer}  offsetLeft\r\n   * @param {Integer}  tooltipWidth\r\n   * @param {Object}   windowSize\r\n   * @param {String}   desiredAlignment\r\n   * @return {String}  calculatedAlignment\r\n   */\r\n\r\n  function _determineAutoAlignment(offsetLeft, tooltipWidth, _ref, desiredAlignment) {\r\n    var width = _ref.width;\r\n    var halfTooltipWidth = tooltipWidth / 2;\r\n    var winWidth = Math.min(width, window.screen.width);\r\n    var possibleAlignments = [\"-left-aligned\", \"-middle-aligned\", \"-right-aligned\"];\r\n    var calculatedAlignment = \"\"; // valid left must be at least a tooltipWidth\r\n    // away from right side\r\n\r\n    if (winWidth - offsetLeft < tooltipWidth) {\r\n      removeEntry(possibleAlignments, \"-left-aligned\");\r\n    } // valid middle must be at least half\r\n    // width away from both sides\r\n\r\n\r\n    if (offsetLeft < halfTooltipWidth || winWidth - offsetLeft < halfTooltipWidth) {\r\n      removeEntry(possibleAlignments, \"-middle-aligned\");\r\n    } // valid right must be at least a tooltipWidth\r\n    // width away from left side\r\n\r\n\r\n    if (offsetLeft < tooltipWidth) {\r\n      removeEntry(possibleAlignments, \"-right-aligned\");\r\n    }\r\n\r\n    if (possibleAlignments.length) {\r\n      if (possibleAlignments.includes(desiredAlignment)) {\r\n        // the desired alignment is valid\r\n        calculatedAlignment = desiredAlignment;\r\n      } else {\r\n        // pick the first valid position, in order\r\n        calculatedAlignment = possibleAlignments[0];\r\n      }\r\n    } else {\r\n      // if screen width is too small\r\n      // for ANY alignment, middle is\r\n      // probably the best for visibility\r\n      calculatedAlignment = \"-middle-aligned\";\r\n    }\r\n\r\n    return calculatedAlignment;\r\n  }\r\n  /**\r\n   * Determines the position of the tooltip based on the position precedence and availability\r\n   * of screen space.\r\n   *\r\n   * @param {Object}    targetElement\r\n   * @param {Object}    tooltipLayer\r\n   * @param {String}    desiredTooltipPosition\r\n   * @return {String}   calculatedPosition\r\n   */\r\n\r\n\r\n  function _determineAutoPosition(targetElement, tooltipLayer, desiredTooltipPosition) {\r\n    // Take a clone of position precedence. These will be the available\r\n    var possiblePositions = this._options.positionPrecedence.slice();\r\n\r\n    var windowSize = getWinSize();\r\n    var tooltipHeight = getOffset(tooltipLayer).height + 10;\r\n    var tooltipWidth = getOffset(tooltipLayer).width + 20;\r\n    var targetElementRect = targetElement.getBoundingClientRect(); // If we check all the possible areas, and there are no valid places for the tooltip, the element\r\n    // must take up most of the screen real estate. Show the tooltip floating in the middle of the screen.\r\n\r\n    var calculatedPosition = \"floating\";\r\n    /*\r\n     * auto determine position\r\n     */\r\n    // Check for space below\r\n\r\n    if (targetElementRect.bottom + tooltipHeight > windowSize.height) {\r\n      removeEntry(possiblePositions, \"bottom\");\r\n    } // Check for space above\r\n\r\n\r\n    if (targetElementRect.top - tooltipHeight < 0) {\r\n      removeEntry(possiblePositions, \"top\");\r\n    } // Check for space to the right\r\n\r\n\r\n    if (targetElementRect.right + tooltipWidth > windowSize.width) {\r\n      removeEntry(possiblePositions, \"right\");\r\n    } // Check for space to the left\r\n\r\n\r\n    if (targetElementRect.left - tooltipWidth < 0) {\r\n      removeEntry(possiblePositions, \"left\");\r\n    } // @var {String}  ex: 'right-aligned'\r\n\r\n\r\n    var desiredAlignment = function (pos) {\r\n      var hyphenIndex = pos.indexOf(\"-\");\r\n\r\n      if (hyphenIndex !== -1) {\r\n        // has alignment\r\n        return pos.substr(hyphenIndex);\r\n      }\r\n\r\n      return \"\";\r\n    }(desiredTooltipPosition || \"\"); // strip alignment from position\r\n\r\n\r\n    if (desiredTooltipPosition) {\r\n      // ex: \"bottom-right-aligned\"\r\n      // should return 'bottom'\r\n      desiredTooltipPosition = desiredTooltipPosition.split(\"-\")[0];\r\n    }\r\n\r\n    if (possiblePositions.length) {\r\n      if (possiblePositions.includes(desiredTooltipPosition)) {\r\n        // If the requested position is in the list, choose that\r\n        calculatedPosition = desiredTooltipPosition;\r\n      } else {\r\n        // Pick the first valid position, in order\r\n        calculatedPosition = possiblePositions[0];\r\n      }\r\n    } // only top and bottom positions have optional alignments\r\n\r\n\r\n    if ([\"top\", \"bottom\"].includes(calculatedPosition)) {\r\n      calculatedPosition += _determineAutoAlignment(targetElementRect.left, tooltipWidth, windowSize, desiredAlignment);\r\n    }\r\n\r\n    return calculatedPosition;\r\n  }\r\n  /**\r\n   * Render tooltip box in the page\r\n   *\r\n   * @api private\r\n   * @method placeTooltip\r\n   * @param {HTMLElement} targetElement\r\n   * @param {HTMLElement} tooltipLayer\r\n   * @param {HTMLElement} arrowLayer\r\n   * @param {Boolean} hintMode\r\n   */\r\n\r\n\r\n  function placeTooltip(targetElement, tooltipLayer, arrowLayer, hintMode) {\r\n    var tooltipCssClass = \"\";\r\n    var currentStepObj;\r\n    var tooltipOffset;\r\n    var targetOffset;\r\n    var windowSize;\r\n    var currentTooltipPosition;\r\n    hintMode = hintMode || false; //reset the old style\r\n\r\n    tooltipLayer.style.top = null;\r\n    tooltipLayer.style.right = null;\r\n    tooltipLayer.style.bottom = null;\r\n    tooltipLayer.style.left = null;\r\n    tooltipLayer.style.marginLeft = null;\r\n    tooltipLayer.style.marginTop = null;\r\n    arrowLayer.style.display = \"inherit\"; //prevent error when `this._currentStep` is undefined\r\n\r\n    if (!this._introItems[this._currentStep]) return; //if we have a custom css class for each step\r\n\r\n    currentStepObj = this._introItems[this._currentStep];\r\n\r\n    if (typeof currentStepObj.tooltipClass === \"string\") {\r\n      tooltipCssClass = currentStepObj.tooltipClass;\r\n    } else {\r\n      tooltipCssClass = this._options.tooltipClass;\r\n    }\r\n\r\n    tooltipLayer.className = [\"introjs-tooltip\", tooltipCssClass].filter(Boolean).join(\" \");\r\n    tooltipLayer.setAttribute(\"role\", \"dialog\");\r\n    currentTooltipPosition = this._introItems[this._currentStep].position; // Floating is always valid, no point in calculating\r\n\r\n    if (currentTooltipPosition !== \"floating\" && this._options.autoPosition) {\r\n      currentTooltipPosition = _determineAutoPosition.call(this, targetElement, tooltipLayer, currentTooltipPosition);\r\n    }\r\n\r\n    var tooltipLayerStyleLeft;\r\n    targetOffset = getOffset(targetElement);\r\n    tooltipOffset = getOffset(tooltipLayer);\r\n    windowSize = getWinSize();\r\n    addClass(tooltipLayer, \"introjs-\".concat(currentTooltipPosition));\r\n\r\n    switch (currentTooltipPosition) {\r\n      case \"top-right-aligned\":\r\n        arrowLayer.className = \"introjs-arrow bottom-right\";\r\n        var tooltipLayerStyleRight = 0;\r\n        checkLeft(targetOffset, tooltipLayerStyleRight, tooltipOffset, tooltipLayer);\r\n        tooltipLayer.style.bottom = \"\".concat(targetOffset.height + 20, \"px\");\r\n        break;\r\n\r\n      case \"top-middle-aligned\":\r\n        arrowLayer.className = \"introjs-arrow bottom-middle\";\r\n        var tooltipLayerStyleLeftRight = targetOffset.width / 2 - tooltipOffset.width / 2; // a fix for middle aligned hints\r\n\r\n        if (hintMode) {\r\n          tooltipLayerStyleLeftRight += 5;\r\n        }\r\n\r\n        if (checkLeft(targetOffset, tooltipLayerStyleLeftRight, tooltipOffset, tooltipLayer)) {\r\n          tooltipLayer.style.right = null;\r\n          checkRight(targetOffset, tooltipLayerStyleLeftRight, tooltipOffset, windowSize, tooltipLayer);\r\n        }\r\n\r\n        tooltipLayer.style.bottom = \"\".concat(targetOffset.height + 20, \"px\");\r\n        break;\r\n\r\n      case \"top-left-aligned\": // top-left-aligned is the same as the default top\r\n\r\n      case \"top\":\r\n        arrowLayer.className = \"introjs-arrow bottom\";\r\n        tooltipLayerStyleLeft = hintMode ? 0 : 15;\r\n        checkRight(targetOffset, tooltipLayerStyleLeft, tooltipOffset, windowSize, tooltipLayer);\r\n        tooltipLayer.style.bottom = \"\".concat(targetOffset.height + 20, \"px\");\r\n        break;\r\n\r\n      case \"right\":\r\n        tooltipLayer.style.left = \"\".concat(targetOffset.width + 20, \"px\");\r\n\r\n        if (targetOffset.top + tooltipOffset.height > windowSize.height) {\r\n          // In this case, right would have fallen below the bottom of the screen.\r\n          // Modify so that the bottom of the tooltip connects with the target\r\n          arrowLayer.className = \"introjs-arrow left-bottom\";\r\n          tooltipLayer.style.top = \"-\".concat(tooltipOffset.height - targetOffset.height - 20, \"px\");\r\n        } else {\r\n          arrowLayer.className = \"introjs-arrow left\";\r\n        }\r\n\r\n        break;\r\n\r\n      case \"left\":\r\n        if (!hintMode && this._options.showStepNumbers === true) {\r\n          tooltipLayer.style.top = \"15px\";\r\n        }\r\n\r\n        if (targetOffset.top + tooltipOffset.height > windowSize.height) {\r\n          // In this case, left would have fallen below the bottom of the screen.\r\n          // Modify so that the bottom of the tooltip connects with the target\r\n          tooltipLayer.style.top = \"-\".concat(tooltipOffset.height - targetOffset.height - 20, \"px\");\r\n          arrowLayer.className = \"introjs-arrow right-bottom\";\r\n        } else {\r\n          arrowLayer.className = \"introjs-arrow right\";\r\n        }\r\n\r\n        tooltipLayer.style.right = \"\".concat(targetOffset.width + 20, \"px\");\r\n        break;\r\n\r\n      case \"floating\":\r\n        arrowLayer.style.display = \"none\"; //we have to adjust the top and left of layer manually for intro items without element\r\n\r\n        tooltipLayer.style.left = \"50%\";\r\n        tooltipLayer.style.top = \"50%\";\r\n        tooltipLayer.style.marginLeft = \"-\".concat(tooltipOffset.width / 2, \"px\");\r\n        tooltipLayer.style.marginTop = \"-\".concat(tooltipOffset.height / 2, \"px\");\r\n        break;\r\n\r\n      case \"bottom-right-aligned\":\r\n        arrowLayer.className = \"introjs-arrow top-right\";\r\n        tooltipLayerStyleRight = 0;\r\n        checkLeft(targetOffset, tooltipLayerStyleRight, tooltipOffset, tooltipLayer);\r\n        tooltipLayer.style.top = \"\".concat(targetOffset.height + 20, \"px\");\r\n        break;\r\n\r\n      case \"bottom-middle-aligned\":\r\n        arrowLayer.className = \"introjs-arrow top-middle\";\r\n        tooltipLayerStyleLeftRight = targetOffset.width / 2 - tooltipOffset.width / 2; // a fix for middle aligned hints\r\n\r\n        if (hintMode) {\r\n          tooltipLayerStyleLeftRight += 5;\r\n        }\r\n\r\n        if (checkLeft(targetOffset, tooltipLayerStyleLeftRight, tooltipOffset, tooltipLayer)) {\r\n          tooltipLayer.style.right = null;\r\n          checkRight(targetOffset, tooltipLayerStyleLeftRight, tooltipOffset, windowSize, tooltipLayer);\r\n        }\r\n\r\n        tooltipLayer.style.top = \"\".concat(targetOffset.height + 20, \"px\");\r\n        break;\r\n      // case 'bottom-left-aligned':\r\n      // Bottom-left-aligned is the same as the default bottom\r\n      // case 'bottom':\r\n      // Bottom going to follow the default behavior\r\n\r\n      default:\r\n        arrowLayer.className = \"introjs-arrow top\";\r\n        tooltipLayerStyleLeft = 0;\r\n        checkRight(targetOffset, tooltipLayerStyleLeft, tooltipOffset, windowSize, tooltipLayer);\r\n        tooltipLayer.style.top = \"\".concat(targetOffset.height + 20, \"px\");\r\n    }\r\n  }\r\n\r\n  /**\r\n   * To remove all show element(s)\r\n   *\r\n   * @api private\r\n   * @method _removeShowElement\r\n   */\r\n\r\n  function removeShowElement() {\r\n    var elms = document.querySelectorAll(\".introjs-showElement\");\r\n    forEach(elms, function (elm) {\r\n      removeClass(elm, /introjs-[a-zA-Z]+/g);\r\n    });\r\n  }\r\n\r\n  function _createElement(tagname, attrs) {\r\n    var element = document.createElement(tagname);\r\n    attrs = attrs || {}; // regex for matching attributes that need to be set with setAttribute\r\n\r\n    var setAttRegex = /^(?:role|data-|aria-)/;\r\n\r\n    for (var k in attrs) {\r\n      var v = attrs[k];\r\n\r\n      if (k === \"style\") {\r\n        setStyle(element, v);\r\n      } else if (k.match(setAttRegex)) {\r\n        element.setAttribute(k, v);\r\n      } else {\r\n        element[k] = v;\r\n      }\r\n    }\r\n\r\n    return element;\r\n  }\r\n\r\n  /**\r\n   * Appends `element` to `parentElement`\r\n   *\r\n   * @param {Element} parentElement\r\n   * @param {Element} element\r\n   * @param {Boolean} [animate=false]\r\n   */\r\n\r\n  function appendChild(parentElement, element, animate) {\r\n    if (animate) {\r\n      var existingOpacity = element.style.opacity || \"1\";\r\n      setStyle(element, {\r\n        opacity: \"0\"\r\n      });\r\n      window.setTimeout(function () {\r\n        setStyle(element, {\r\n          opacity: existingOpacity\r\n        });\r\n      }, 10);\r\n    }\r\n\r\n    parentElement.appendChild(element);\r\n  }\r\n\r\n  /**\r\n   * Gets the current progress percentage\r\n   *\r\n   * @api private\r\n   * @method _getProgress\r\n   * @returns current progress percentage\r\n   */\r\n\r\n  function _getProgress() {\r\n    // Steps are 0 indexed\r\n    var currentStep = parseInt(this._currentStep + 1, 10);\r\n    return currentStep / this._introItems.length * 100;\r\n  }\r\n  /**\r\n   * Add disableinteraction layer and adjust the size and position of the layer\r\n   *\r\n   * @api private\r\n   * @method _disableInteraction\r\n   */\r\n\r\n\r\n  function _disableInteraction() {\r\n    var disableInteractionLayer = document.querySelector(\".introjs-disableInteraction\");\r\n\r\n    if (disableInteractionLayer === null) {\r\n      disableInteractionLayer = _createElement(\"div\", {\r\n        className: \"introjs-disableInteraction\"\r\n      });\r\n\r\n      this._targetElement.appendChild(disableInteractionLayer);\r\n    }\r\n\r\n    setHelperLayerPosition.call(this, disableInteractionLayer);\r\n  }\r\n  /**\r\n   * Creates the bullets layer\r\n   * @returns HTMLElement\r\n   * @private\r\n   */\r\n\r\n\r\n  function _createBullets(targetElement) {\r\n    var self = this;\r\n    var bulletsLayer = _createElement(\"div\", {\r\n      className: \"introjs-bullets\"\r\n    });\r\n\r\n    if (this._options.showBullets === false) {\r\n      bulletsLayer.style.display = \"none\";\r\n    }\r\n\r\n    var ulContainer = _createElement(\"ul\");\r\n    ulContainer.setAttribute(\"role\", \"tablist\");\r\n\r\n    var anchorClick = function anchorClick() {\r\n      self.goToStep(this.getAttribute(\"data-stepnumber\"));\r\n    };\r\n\r\n    forEach(this._introItems, function (_ref, i) {\r\n      var step = _ref.step;\r\n      var innerLi = _createElement(\"li\");\r\n      var anchorLink = _createElement(\"a\");\r\n      innerLi.setAttribute(\"role\", \"presentation\");\r\n      anchorLink.setAttribute(\"role\", \"tab\");\r\n      anchorLink.onclick = anchorClick;\r\n\r\n      if (i === targetElement.step - 1) {\r\n        anchorLink.className = \"active\";\r\n      }\r\n\r\n      setAnchorAsButton(anchorLink);\r\n      anchorLink.innerHTML = \"&nbsp;\";\r\n      anchorLink.setAttribute(\"data-stepnumber\", step);\r\n      innerLi.appendChild(anchorLink);\r\n      ulContainer.appendChild(innerLi);\r\n    });\r\n    bulletsLayer.appendChild(ulContainer);\r\n    return bulletsLayer;\r\n  }\r\n  /**\r\n   * Deletes and recreates the bullets layer\r\n   * @param oldReferenceLayer\r\n   * @param targetElement\r\n   * @private\r\n   */\r\n\r\n\r\n  function _recreateBullets(oldReferenceLayer, targetElement) {\r\n    if (this._options.showBullets) {\r\n      var existing = document.querySelector(\".introjs-bullets\");\r\n      existing.parentNode.replaceChild(_createBullets.call(this, targetElement), existing);\r\n    }\r\n  }\r\n  /**\r\n   * Updates the bullets\r\n   *\r\n   * @param oldReferenceLayer\r\n   * @param targetElement\r\n   */\r\n\r\n  function _updateBullets(oldReferenceLayer, targetElement) {\r\n    if (this._options.showBullets) {\r\n      oldReferenceLayer.querySelector(\".introjs-bullets li > a.active\").className = \"\";\r\n      oldReferenceLayer.querySelector(\".introjs-bullets li > a[data-stepnumber=\\\"\".concat(targetElement.step, \"\\\"]\")).className = \"active\";\r\n    }\r\n  }\r\n  /**\r\n   * Creates the progress-bar layer and elements\r\n   * @returns {*}\r\n   * @private\r\n   */\r\n\r\n\r\n  function _createProgressBar() {\r\n    var progressLayer = _createElement(\"div\");\r\n    progressLayer.className = \"introjs-progress\";\r\n\r\n    if (this._options.showProgress === false) {\r\n      progressLayer.style.display = \"none\";\r\n    }\r\n\r\n    var progressBar = _createElement(\"div\", {\r\n      className: \"introjs-progressbar\"\r\n    });\r\n\r\n    if (this._options.progressBarAdditionalClass) {\r\n      progressBar.className += \" \" + this._options.progressBarAdditionalClass;\r\n    }\r\n\r\n    progressBar.setAttribute(\"role\", \"progress\");\r\n    progressBar.setAttribute(\"aria-valuemin\", 0);\r\n    progressBar.setAttribute(\"aria-valuemax\", 100);\r\n    progressBar.setAttribute(\"aria-valuenow\", _getProgress.call(this));\r\n    progressBar.style.cssText = \"width:\".concat(_getProgress.call(this), \"%;\");\r\n    progressLayer.appendChild(progressBar);\r\n    return progressLayer;\r\n  }\r\n  /**\r\n   * Updates an existing progress bar variables\r\n   * @param oldReferenceLayer\r\n   * @private\r\n   */\r\n\r\n\r\n  function _updateProgressBar(oldReferenceLayer) {\r\n    oldReferenceLayer.querySelector(\".introjs-progress .introjs-progressbar\").style.cssText = \"width:\".concat(_getProgress.call(this), \"%;\");\r\n    oldReferenceLayer.querySelector(\".introjs-progress .introjs-progressbar\").setAttribute(\"aria-valuenow\", _getProgress.call(this));\r\n  }\r\n  /**\r\n   * Show an element on the page\r\n   *\r\n   * @api private\r\n   * @method _showElement\r\n   * @param {Object} targetElement\r\n   */\r\n\r\n  function _showElement(targetElement) {\r\n    var _this = this;\r\n\r\n    if (typeof this._introChangeCallback !== \"undefined\") {\r\n      this._introChangeCallback.call(this, targetElement.element);\r\n    }\r\n\r\n    var self = this;\r\n    var oldHelperLayer = document.querySelector(\".introjs-helperLayer\");\r\n    var oldReferenceLayer = document.querySelector(\".introjs-tooltipReferenceLayer\");\r\n    var highlightClass = \"introjs-helperLayer\";\r\n    var nextTooltipButton;\r\n    var prevTooltipButton;\r\n    var skipTooltipButton; //check for a current step highlight class\r\n\r\n    if (typeof targetElement.highlightClass === \"string\") {\r\n      highlightClass += \" \".concat(targetElement.highlightClass);\r\n    } //check for options highlight class\r\n\r\n\r\n    if (typeof this._options.highlightClass === \"string\") {\r\n      highlightClass += \" \".concat(this._options.highlightClass);\r\n    }\r\n\r\n    if (oldHelperLayer !== null && oldReferenceLayer !== null) {\r\n      var oldHelperNumberLayer = oldReferenceLayer.querySelector(\".introjs-helperNumberLayer\");\r\n      var oldtooltipLayer = oldReferenceLayer.querySelector(\".introjs-tooltiptext\");\r\n      var oldTooltipTitleLayer = oldReferenceLayer.querySelector(\".introjs-tooltip-title\");\r\n      var oldArrowLayer = oldReferenceLayer.querySelector(\".introjs-arrow\");\r\n      var oldtooltipContainer = oldReferenceLayer.querySelector(\".introjs-tooltip\");\r\n      skipTooltipButton = oldReferenceLayer.querySelector(\".introjs-skipbutton\");\r\n      prevTooltipButton = oldReferenceLayer.querySelector(\".introjs-prevbutton\");\r\n      nextTooltipButton = oldReferenceLayer.querySelector(\".introjs-nextbutton\"); //update or reset the helper highlight class\r\n\r\n      oldHelperLayer.className = highlightClass; //hide the tooltip\r\n\r\n      oldtooltipContainer.style.opacity = 0;\r\n      oldtooltipContainer.style.display = \"none\"; // if the target element is within a scrollable element\r\n\r\n      scrollParentToElement.call(self, targetElement); // set new position to helper layer\r\n\r\n      setHelperLayerPosition.call(self, oldHelperLayer);\r\n      setHelperLayerPosition.call(self, oldReferenceLayer); //remove old classes if the element still exist\r\n\r\n      removeShowElement(); //we should wait until the CSS3 transition is competed (it's 0.3 sec) to prevent incorrect `height` and `width` calculation\r\n\r\n      if (self._lastShowElementTimer) {\r\n        window.clearTimeout(self._lastShowElementTimer);\r\n      }\r\n\r\n      self._lastShowElementTimer = window.setTimeout(function () {\r\n        // set current step to the label\r\n        if (oldHelperNumberLayer !== null) {\r\n          oldHelperNumberLayer.innerHTML = \"\".concat(targetElement.step, \" of \").concat(_this._introItems.length);\r\n        } // set current tooltip text\r\n\r\n\r\n        oldtooltipLayer.innerHTML = targetElement.intro; // set current tooltip title\r\n\r\n        oldTooltipTitleLayer.innerHTML = targetElement.title; //set the tooltip position\r\n\r\n        oldtooltipContainer.style.display = \"block\";\r\n        placeTooltip.call(self, targetElement.element, oldtooltipContainer, oldArrowLayer); //change active bullet\r\n\r\n        _updateBullets.call(self, oldReferenceLayer, targetElement);\r\n\r\n        _updateProgressBar.call(self, oldReferenceLayer); //show the tooltip\r\n\r\n\r\n        oldtooltipContainer.style.opacity = 1; //reset button focus\r\n\r\n        if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null && /introjs-donebutton/gi.test(nextTooltipButton.className)) {\r\n          // skip button is now \"done\" button\r\n          nextTooltipButton.focus();\r\n        } else if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n          //still in the tour, focus on next\r\n          nextTooltipButton.focus();\r\n        } // change the scroll of the window, if needed\r\n\r\n\r\n        scrollTo.call(self, targetElement.scrollTo, targetElement, oldtooltipLayer);\r\n      }, 350); // end of old element if-else condition\r\n    } else {\r\n      var helperLayer = _createElement(\"div\", {\r\n        className: highlightClass\r\n      });\r\n      var referenceLayer = _createElement(\"div\", {\r\n        className: \"introjs-tooltipReferenceLayer\"\r\n      });\r\n      var arrowLayer = _createElement(\"div\", {\r\n        className: \"introjs-arrow\"\r\n      });\r\n      var tooltipLayer = _createElement(\"div\", {\r\n        className: \"introjs-tooltip\"\r\n      });\r\n      var tooltipTextLayer = _createElement(\"div\", {\r\n        className: \"introjs-tooltiptext\"\r\n      });\r\n      var tooltipHeaderLayer = _createElement(\"div\", {\r\n        className: \"introjs-tooltip-header\"\r\n      });\r\n      var tooltipTitleLayer = _createElement(\"h1\", {\r\n        className: \"introjs-tooltip-title\"\r\n      });\r\n      var buttonsLayer = _createElement(\"div\");\r\n      setStyle(helperLayer, {\r\n        \"box-shadow\": \"0 0 1px 2px rgba(33, 33, 33, 0.8), rgba(33, 33, 33, \".concat(self._options.overlayOpacity.toString(), \") 0 0 0 5000px\")\r\n      }); // target is within a scrollable element\r\n\r\n      scrollParentToElement.call(self, targetElement); //set new position to helper layer\r\n\r\n      setHelperLayerPosition.call(self, helperLayer);\r\n      setHelperLayerPosition.call(self, referenceLayer); //add helper layer to target element\r\n\r\n      appendChild(this._targetElement, helperLayer, true);\r\n      appendChild(this._targetElement, referenceLayer);\r\n      tooltipTextLayer.innerHTML = targetElement.intro;\r\n      tooltipTitleLayer.innerHTML = targetElement.title;\r\n      buttonsLayer.className = \"introjs-tooltipbuttons\";\r\n\r\n      if (this._options.showButtons === false) {\r\n        buttonsLayer.style.display = \"none\";\r\n      }\r\n\r\n      tooltipHeaderLayer.appendChild(tooltipTitleLayer);\r\n      tooltipLayer.appendChild(tooltipHeaderLayer);\r\n      tooltipLayer.appendChild(tooltipTextLayer);\r\n      tooltipLayer.appendChild(_createBullets.call(this, targetElement));\r\n      tooltipLayer.appendChild(_createProgressBar.call(this)); // add helper layer number\r\n\r\n      var helperNumberLayer = _createElement(\"div\");\r\n\r\n      if (this._options.showStepNumbers === true) {\r\n        helperNumberLayer.className = \"introjs-helperNumberLayer\";\r\n        helperNumberLayer.innerHTML = \"\".concat(targetElement.step, \" of \").concat(this._introItems.length);\r\n        tooltipLayer.appendChild(helperNumberLayer);\r\n      }\r\n\r\n      tooltipLayer.appendChild(arrowLayer);\r\n      referenceLayer.appendChild(tooltipLayer); //next button\r\n\r\n      nextTooltipButton = _createElement(\"a\");\r\n\r\n      nextTooltipButton.onclick = function () {\r\n        if (self._introItems.length - 1 !== self._currentStep) {\r\n          nextStep.call(self);\r\n        } else if (/introjs-donebutton/gi.test(nextTooltipButton.className)) {\r\n          if (typeof self._introCompleteCallback === \"function\") {\r\n            self._introCompleteCallback.call(self);\r\n          }\r\n\r\n          exitIntro.call(self, self._targetElement);\r\n        }\r\n      };\r\n\r\n      setAnchorAsButton(nextTooltipButton);\r\n      nextTooltipButton.innerHTML = this._options.nextLabel; //previous button\r\n\r\n      prevTooltipButton = _createElement(\"a\");\r\n\r\n      prevTooltipButton.onclick = function () {\r\n        if (self._currentStep !== 0) {\r\n          previousStep.call(self);\r\n        }\r\n      };\r\n\r\n      setAnchorAsButton(prevTooltipButton);\r\n      prevTooltipButton.innerHTML = this._options.prevLabel; //skip button\r\n\r\n      skipTooltipButton = _createElement(\"a\", {\r\n        className: \"introjs-skipbutton\"\r\n      });\r\n      setAnchorAsButton(skipTooltipButton);\r\n      skipTooltipButton.innerHTML = this._options.skipLabel;\r\n\r\n      skipTooltipButton.onclick = function () {\r\n        if (self._introItems.length - 1 === self._currentStep && typeof self._introCompleteCallback === \"function\") {\r\n          self._introCompleteCallback.call(self);\r\n        }\r\n\r\n        if (typeof self._introSkipCallback === \"function\") {\r\n          self._introSkipCallback.call(self);\r\n        }\r\n\r\n        exitIntro.call(self, self._targetElement);\r\n      };\r\n\r\n      tooltipHeaderLayer.appendChild(skipTooltipButton); //in order to prevent displaying previous button always\r\n\r\n      if (this._introItems.length > 1) {\r\n        buttonsLayer.appendChild(prevTooltipButton);\r\n      } // we always need the next button because this\r\n      // button changes to \"Done\" in the last step of the tour\r\n\r\n\r\n      buttonsLayer.appendChild(nextTooltipButton);\r\n      tooltipLayer.appendChild(buttonsLayer); //set proper position\r\n\r\n      placeTooltip.call(self, targetElement.element, tooltipLayer, arrowLayer); // change the scroll of the window, if needed\r\n\r\n      scrollTo.call(this, targetElement.scrollTo, targetElement, tooltipLayer); //end of new element if-else condition\r\n    } // removing previous disable interaction layer\r\n\r\n\r\n    var disableInteractionLayer = self._targetElement.querySelector(\".introjs-disableInteraction\");\r\n\r\n    if (disableInteractionLayer) {\r\n      disableInteractionLayer.parentNode.removeChild(disableInteractionLayer);\r\n    } //disable interaction\r\n\r\n\r\n    if (targetElement.disableInteraction) {\r\n      _disableInteraction.call(self);\r\n    } // when it's the first step of tour\r\n\r\n\r\n    if (this._currentStep === 0 && this._introItems.length > 1) {\r\n      if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n        nextTooltipButton.className = \"\".concat(this._options.buttonClass, \" introjs-nextbutton\");\r\n        nextTooltipButton.innerHTML = this._options.nextLabel;\r\n      }\r\n\r\n      if (this._options.hidePrev === true) {\r\n        if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n          prevTooltipButton.className = \"\".concat(this._options.buttonClass, \" introjs-prevbutton introjs-hidden\");\r\n        }\r\n\r\n        if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n          addClass(nextTooltipButton, \"introjs-fullbutton\");\r\n        }\r\n      } else {\r\n        if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n          prevTooltipButton.className = \"\".concat(this._options.buttonClass, \" introjs-prevbutton introjs-disabled\");\r\n        }\r\n      }\r\n    } else if (this._introItems.length - 1 === this._currentStep || this._introItems.length === 1) {\r\n      // last step of tour\r\n      if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n        prevTooltipButton.className = \"\".concat(this._options.buttonClass, \" introjs-prevbutton\");\r\n      }\r\n\r\n      if (this._options.hideNext === true) {\r\n        if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n          nextTooltipButton.className = \"\".concat(this._options.buttonClass, \" introjs-nextbutton introjs-hidden\");\r\n        }\r\n\r\n        if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n          addClass(prevTooltipButton, \"introjs-fullbutton\");\r\n        }\r\n      } else {\r\n        if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n          if (this._options.nextToDone === true) {\r\n            nextTooltipButton.innerHTML = this._options.doneLabel;\r\n            addClass(nextTooltipButton, \"\".concat(this._options.buttonClass, \" introjs-nextbutton introjs-donebutton\"));\r\n          } else {\r\n            nextTooltipButton.className = \"\".concat(this._options.buttonClass, \" introjs-nextbutton introjs-disabled\");\r\n          }\r\n        }\r\n      }\r\n    } else {\r\n      // steps between start and end\r\n      if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n        prevTooltipButton.className = \"\".concat(this._options.buttonClass, \" introjs-prevbutton\");\r\n      }\r\n\r\n      if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n        nextTooltipButton.className = \"\".concat(this._options.buttonClass, \" introjs-nextbutton\");\r\n        nextTooltipButton.innerHTML = this._options.nextLabel;\r\n      }\r\n    }\r\n\r\n    if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n      prevTooltipButton.setAttribute(\"role\", \"button\");\r\n    }\r\n\r\n    if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n      nextTooltipButton.setAttribute(\"role\", \"button\");\r\n    }\r\n\r\n    if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null) {\r\n      skipTooltipButton.setAttribute(\"role\", \"button\");\r\n    } //Set focus on \"next\" button, so that hitting Enter always moves you onto the next step\r\n\r\n\r\n    if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n      nextTooltipButton.focus();\r\n    }\r\n\r\n    setShowElement(targetElement);\r\n\r\n    if (typeof this._introAfterChangeCallback !== \"undefined\") {\r\n      this._introAfterChangeCallback.call(this, targetElement.element);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Go to specific step of introduction\r\n   *\r\n   * @api private\r\n   * @method _goToStep\r\n   */\r\n\r\n  function goToStep(step) {\r\n    //because steps starts with zero\r\n    this._currentStep = step - 2;\r\n\r\n    if (typeof this._introItems !== \"undefined\") {\r\n      nextStep.call(this);\r\n    }\r\n  }\r\n  /**\r\n   * Go to the specific step of introduction with the explicit [data-step] number\r\n   *\r\n   * @api private\r\n   * @method _goToStepNumber\r\n   */\r\n\r\n  function goToStepNumber(step) {\r\n    this._currentStepNumber = step;\r\n\r\n    if (typeof this._introItems !== \"undefined\") {\r\n      nextStep.call(this);\r\n    }\r\n  }\r\n  /**\r\n   * Go to next step on intro\r\n   *\r\n   * @api private\r\n   * @method _nextStep\r\n   */\r\n\r\n  function nextStep() {\r\n    var _this = this;\r\n\r\n    this._direction = \"forward\";\r\n\r\n    if (typeof this._currentStepNumber !== \"undefined\") {\r\n      forEach(this._introItems, function (_ref, i) {\r\n        var step = _ref.step;\r\n\r\n        if (step === _this._currentStepNumber) {\r\n          _this._currentStep = i - 1;\r\n          _this._currentStepNumber = undefined;\r\n        }\r\n      });\r\n    }\r\n\r\n    if (typeof this._currentStep === \"undefined\") {\r\n      this._currentStep = 0;\r\n    } else {\r\n      ++this._currentStep;\r\n    }\r\n\r\n    var nextStep = this._introItems[this._currentStep];\r\n    var continueStep = true;\r\n\r\n    if (typeof this._introBeforeChangeCallback !== \"undefined\") {\r\n      continueStep = this._introBeforeChangeCallback.call(this, nextStep && nextStep.element);\r\n    } // if `onbeforechange` returned `false`, stop displaying the element\r\n\r\n\r\n    if (continueStep === false) {\r\n      --this._currentStep;\r\n      return false;\r\n    }\r\n\r\n    if (this._introItems.length <= this._currentStep) {\r\n      //end of the intro\r\n      //check if any callback is defined\r\n      if (typeof this._introCompleteCallback === \"function\") {\r\n        this._introCompleteCallback.call(this);\r\n      }\r\n\r\n      exitIntro.call(this, this._targetElement);\r\n      return;\r\n    }\r\n\r\n    _showElement.call(this, nextStep);\r\n  }\r\n  /**\r\n   * Go to previous step on intro\r\n   *\r\n   * @api private\r\n   * @method _previousStep\r\n   */\r\n\r\n  function previousStep() {\r\n    this._direction = \"backward\";\r\n\r\n    if (this._currentStep === 0) {\r\n      return false;\r\n    }\r\n\r\n    --this._currentStep;\r\n    var nextStep = this._introItems[this._currentStep];\r\n    var continueStep = true;\r\n\r\n    if (typeof this._introBeforeChangeCallback !== \"undefined\") {\r\n      continueStep = this._introBeforeChangeCallback.call(this, nextStep && nextStep.element);\r\n    } // if `onbeforechange` returned `false`, stop displaying the element\r\n\r\n\r\n    if (continueStep === false) {\r\n      ++this._currentStep;\r\n      return false;\r\n    }\r\n\r\n    _showElement.call(this, nextStep);\r\n  }\r\n  /**\r\n   * Returns the current step of the intro\r\n   *\r\n   * @returns {number | boolean}\r\n   */\r\n\r\n  function currentStep() {\r\n    return this._currentStep;\r\n  }\r\n\r\n  /**\r\n   * on keyCode:\r\n   * https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode\r\n   * This feature has been removed from the Web standards.\r\n   * Though some browsers may still support it, it is in\r\n   * the process of being dropped.\r\n   * Instead, you should use KeyboardEvent.code,\r\n   * if it's implemented.\r\n   *\r\n   * jQuery's approach is to test for\r\n   *   (1) e.which, then\r\n   *   (2) e.charCode, then\r\n   *   (3) e.keyCode\r\n   * https://github.com/jquery/jquery/blob/a6b0705294d336ae2f63f7276de0da1195495363/src/event.js#L638\r\n   *\r\n   * @param type var\r\n   * @return type\r\n   */\r\n\r\n  function onKeyDown(e) {\r\n    var code = e.code === undefined ? e.which : e.code; // if e.which is null\r\n\r\n    if (code === null) {\r\n      code = e.charCode === null ? e.keyCode : e.charCode;\r\n    }\r\n\r\n    if ((code === \"Escape\" || code === 27) && this._options.exitOnEsc === true) {\r\n      //escape key pressed, exit the intro\r\n      //check if exit callback is defined\r\n      exitIntro.call(this, this._targetElement);\r\n    } else if (code === \"ArrowLeft\" || code === 37) {\r\n      //left arrow\r\n      previousStep.call(this);\r\n    } else if (code === \"ArrowRight\" || code === 39) {\r\n      //right arrow\r\n      nextStep.call(this);\r\n    } else if (code === \"Enter\" || code === \"NumpadEnter\" || code === 13) {\r\n      //srcElement === ie\r\n      var target = e.target || e.srcElement;\r\n\r\n      if (target && target.className.match(\"introjs-prevbutton\")) {\r\n        //user hit enter while focusing on previous button\r\n        previousStep.call(this);\r\n      } else if (target && target.className.match(\"introjs-skipbutton\")) {\r\n        //user hit enter while focusing on skip button\r\n        if (this._introItems.length - 1 === this._currentStep && typeof this._introCompleteCallback === \"function\") {\r\n          this._introCompleteCallback.call(this);\r\n        }\r\n\r\n        exitIntro.call(this, this._targetElement);\r\n      } else if (target && target.getAttribute(\"data-stepnumber\")) {\r\n        // user hit enter while focusing on step bullet\r\n        target.click();\r\n      } else {\r\n        //default behavior for responding to enter\r\n        nextStep.call(this);\r\n      } //prevent default behaviour on hitting Enter, to prevent steps being skipped in some browsers\r\n\r\n\r\n      if (e.preventDefault) {\r\n        e.preventDefault();\r\n      } else {\r\n        e.returnValue = false;\r\n      }\r\n    }\r\n  }\r\n\r\n  /*\r\n   * makes a copy of the object\r\n   * @api private\r\n   * @method _cloneObject\r\n   */\r\n  function cloneObject(object) {\r\n    if (object === null || _typeof(object) !== \"object\" || typeof object.nodeType !== \"undefined\") {\r\n      return object;\r\n    }\r\n\r\n    var temp = {};\r\n\r\n    for (var key in object) {\r\n      if (typeof window.jQuery !== \"undefined\" && object[key] instanceof window.jQuery) {\r\n        temp[key] = object[key];\r\n      } else {\r\n        temp[key] = cloneObject(object[key]);\r\n      }\r\n    }\r\n\r\n    return temp;\r\n  }\r\n\r\n  /**\r\n   * Get a queryselector within the hint wrapper\r\n   *\r\n   * @param {String} selector\r\n   * @return {NodeList|Array}\r\n   */\r\n\r\n  function hintQuerySelectorAll(selector) {\r\n    var hintsWrapper = document.querySelector(\".introjs-hints\");\r\n    return hintsWrapper ? hintsWrapper.querySelectorAll(selector) : [];\r\n  }\r\n  /**\r\n   * Hide a hint\r\n   *\r\n   * @api private\r\n   * @method hideHint\r\n   */\r\n\r\n  function hideHint(stepId) {\r\n    var hint = hintQuerySelectorAll(\".introjs-hint[data-step=\\\"\".concat(stepId, \"\\\"]\"))[0];\r\n    removeHintTooltip.call(this);\r\n\r\n    if (hint) {\r\n      addClass(hint, \"introjs-hidehint\");\r\n    } // call the callback function (if any)\r\n\r\n\r\n    if (typeof this._hintCloseCallback !== \"undefined\") {\r\n      this._hintCloseCallback.call(this, stepId);\r\n    }\r\n  }\r\n  /**\r\n   * Hide all hints\r\n   *\r\n   * @api private\r\n   * @method hideHints\r\n   */\r\n\r\n  function hideHints() {\r\n    var _this = this;\r\n\r\n    var hints = hintQuerySelectorAll(\".introjs-hint\");\r\n    forEach(hints, function (hint) {\r\n      hideHint.call(_this, hint.getAttribute(\"data-step\"));\r\n    });\r\n  }\r\n  /**\r\n   * Show all hints\r\n   *\r\n   * @api private\r\n   * @method _showHints\r\n   */\r\n\r\n  function showHints() {\r\n    var _this2 = this;\r\n\r\n    var hints = hintQuerySelectorAll(\".introjs-hint\");\r\n\r\n    if (hints && hints.length) {\r\n      forEach(hints, function (hint) {\r\n        showHint.call(_this2, hint.getAttribute(\"data-step\"));\r\n      });\r\n    } else {\r\n      populateHints.call(this, this._targetElement);\r\n    }\r\n  }\r\n  /**\r\n   * Show a hint\r\n   *\r\n   * @api private\r\n   * @method showHint\r\n   */\r\n\r\n  function showHint(stepId) {\r\n    var hint = hintQuerySelectorAll(\".introjs-hint[data-step=\\\"\".concat(stepId, \"\\\"]\"))[0];\r\n\r\n    if (hint) {\r\n      removeClass(hint, /introjs-hidehint/g);\r\n    }\r\n  }\r\n  /**\r\n   * Removes all hint elements on the page\r\n   * Useful when you want to destroy the elements and add them again (e.g. a modal or popup)\r\n   *\r\n   * @api private\r\n   * @method removeHints\r\n   */\r\n\r\n  function removeHints() {\r\n    var _this3 = this;\r\n\r\n    var hints = hintQuerySelectorAll(\".introjs-hint\");\r\n    forEach(hints, function (hint) {\r\n      removeHint.call(_this3, hint.getAttribute(\"data-step\"));\r\n    });\r\n  }\r\n  /**\r\n   * Remove one single hint element from the page\r\n   * Useful when you want to destroy the element and add them again (e.g. a modal or popup)\r\n   * Use removeHints if you want to remove all elements.\r\n   *\r\n   * @api private\r\n   * @method removeHint\r\n   */\r\n\r\n  function removeHint(stepId) {\r\n    var hint = hintQuerySelectorAll(\".introjs-hint[data-step=\\\"\".concat(stepId, \"\\\"]\"))[0];\r\n\r\n    if (hint) {\r\n      hint.parentNode.removeChild(hint);\r\n    }\r\n  }\r\n  /**\r\n   * Add all available hints to the page\r\n   *\r\n   * @api private\r\n   * @method addHints\r\n   */\r\n\r\n  function addHints() {\r\n    var _this4 = this;\r\n\r\n    var self = this;\r\n    var hintsWrapper = document.querySelector(\".introjs-hints\");\r\n\r\n    if (hintsWrapper === null) {\r\n      hintsWrapper = _createElement(\"div\", {\r\n        className: \"introjs-hints\"\r\n      });\r\n    }\r\n    /**\r\n     * Returns an event handler unique to the hint iteration\r\n     *\r\n     * @param {Integer} i\r\n     * @return {Function}\r\n     */\r\n\r\n\r\n    var getHintClick = function getHintClick(i) {\r\n      return function (e) {\r\n        var evt = e ? e : window.event;\r\n\r\n        if (evt.stopPropagation) {\r\n          evt.stopPropagation();\r\n        }\r\n\r\n        if (evt.cancelBubble !== null) {\r\n          evt.cancelBubble = true;\r\n        }\r\n\r\n        showHintDialog.call(self, i);\r\n      };\r\n    };\r\n\r\n    forEach(this._introItems, function (item, i) {\r\n      // avoid append a hint twice\r\n      if (document.querySelector(\".introjs-hint[data-step=\\\"\".concat(i, \"\\\"]\"))) {\r\n        return;\r\n      }\r\n\r\n      var hint = _createElement(\"a\", {\r\n        className: \"introjs-hint\"\r\n      });\r\n      setAnchorAsButton(hint);\r\n      hint.onclick = getHintClick(i);\r\n\r\n      if (!item.hintAnimation) {\r\n        addClass(hint, \"introjs-hint-no-anim\");\r\n      } // hint's position should be fixed if the target element's position is fixed\r\n\r\n\r\n      if (isFixed(item.element)) {\r\n        addClass(hint, \"introjs-fixedhint\");\r\n      }\r\n\r\n      var hintDot = _createElement(\"div\", {\r\n        className: \"introjs-hint-dot\"\r\n      });\r\n      var hintPulse = _createElement(\"div\", {\r\n        className: \"introjs-hint-pulse\"\r\n      });\r\n      hint.appendChild(hintDot);\r\n      hint.appendChild(hintPulse);\r\n      hint.setAttribute(\"data-step\", i); // we swap the hint element with target element\r\n      // because _setHelperLayerPosition uses `element` property\r\n\r\n      item.targetElement = item.element;\r\n      item.element = hint; // align the hint position\r\n\r\n      alignHintPosition.call(_this4, item.hintPosition, hint, item.targetElement);\r\n      hintsWrapper.appendChild(hint);\r\n    }); // adding the hints wrapper\r\n\r\n    document.body.appendChild(hintsWrapper); // call the callback function (if any)\r\n\r\n    if (typeof this._hintsAddedCallback !== \"undefined\") {\r\n      this._hintsAddedCallback.call(this);\r\n    }\r\n  }\r\n  /**\r\n   * Aligns hint position\r\n   *\r\n   * @api private\r\n   * @method alignHintPosition\r\n   * @param {String} position\r\n   * @param {Object} hint\r\n   * @param {Object} element\r\n   */\r\n\r\n  function alignHintPosition(position, _ref, element) {\r\n    var style = _ref.style;\r\n    // get/calculate offset of target element\r\n    var offset = getOffset.call(this, element);\r\n    var iconWidth = 20;\r\n    var iconHeight = 20; // align the hint element\r\n\r\n    switch (position) {\r\n      default:\r\n      case \"top-left\":\r\n        style.left = \"\".concat(offset.left, \"px\");\r\n        style.top = \"\".concat(offset.top, \"px\");\r\n        break;\r\n\r\n      case \"top-right\":\r\n        style.left = \"\".concat(offset.left + offset.width - iconWidth, \"px\");\r\n        style.top = \"\".concat(offset.top, \"px\");\r\n        break;\r\n\r\n      case \"bottom-left\":\r\n        style.left = \"\".concat(offset.left, \"px\");\r\n        style.top = \"\".concat(offset.top + offset.height - iconHeight, \"px\");\r\n        break;\r\n\r\n      case \"bottom-right\":\r\n        style.left = \"\".concat(offset.left + offset.width - iconWidth, \"px\");\r\n        style.top = \"\".concat(offset.top + offset.height - iconHeight, \"px\");\r\n        break;\r\n\r\n      case \"middle-left\":\r\n        style.left = \"\".concat(offset.left, \"px\");\r\n        style.top = \"\".concat(offset.top + (offset.height - iconHeight) / 2, \"px\");\r\n        break;\r\n\r\n      case \"middle-right\":\r\n        style.left = \"\".concat(offset.left + offset.width - iconWidth, \"px\");\r\n        style.top = \"\".concat(offset.top + (offset.height - iconHeight) / 2, \"px\");\r\n        break;\r\n\r\n      case \"middle-middle\":\r\n        style.left = \"\".concat(offset.left + (offset.width - iconWidth) / 2, \"px\");\r\n        style.top = \"\".concat(offset.top + (offset.height - iconHeight) / 2, \"px\");\r\n        break;\r\n\r\n      case \"bottom-middle\":\r\n        style.left = \"\".concat(offset.left + (offset.width - iconWidth) / 2, \"px\");\r\n        style.top = \"\".concat(offset.top + offset.height - iconHeight, \"px\");\r\n        break;\r\n\r\n      case \"top-middle\":\r\n        style.left = \"\".concat(offset.left + (offset.width - iconWidth) / 2, \"px\");\r\n        style.top = \"\".concat(offset.top, \"px\");\r\n        break;\r\n    }\r\n  }\r\n  /**\r\n   * Triggers when user clicks on the hint element\r\n   *\r\n   * @api private\r\n   * @method _showHintDialog\r\n   * @param {Number} stepId\r\n   */\r\n\r\n  function showHintDialog(stepId) {\r\n    var hintElement = document.querySelector(\".introjs-hint[data-step=\\\"\".concat(stepId, \"\\\"]\"));\r\n    var item = this._introItems[stepId]; // call the callback function (if any)\r\n\r\n    if (typeof this._hintClickCallback !== \"undefined\") {\r\n      this._hintClickCallback.call(this, hintElement, item, stepId);\r\n    } // remove all open tooltips\r\n\r\n\r\n    var removedStep = removeHintTooltip.call(this); // to toggle the tooltip\r\n\r\n    if (parseInt(removedStep, 10) === stepId) {\r\n      return;\r\n    }\r\n\r\n    var tooltipLayer = _createElement(\"div\", {\r\n      className: \"introjs-tooltip\"\r\n    });\r\n    var tooltipTextLayer = _createElement(\"div\");\r\n    var arrowLayer = _createElement(\"div\");\r\n    var referenceLayer = _createElement(\"div\");\r\n\r\n    tooltipLayer.onclick = function (e) {\r\n      //IE9 & Other Browsers\r\n      if (e.stopPropagation) {\r\n        e.stopPropagation();\r\n      } //IE8 and Lower\r\n      else {\r\n        e.cancelBubble = true;\r\n      }\r\n    };\r\n\r\n    tooltipTextLayer.className = \"introjs-tooltiptext\";\r\n    var tooltipWrapper = _createElement(\"p\");\r\n    tooltipWrapper.innerHTML = item.hint;\r\n    var closeButton = _createElement(\"a\");\r\n    closeButton.className = this._options.buttonClass;\r\n    closeButton.setAttribute(\"role\", \"button\");\r\n    closeButton.innerHTML = this._options.hintButtonLabel;\r\n    closeButton.onclick = hideHint.bind(this, stepId);\r\n    tooltipTextLayer.appendChild(tooltipWrapper);\r\n    tooltipTextLayer.appendChild(closeButton);\r\n    arrowLayer.className = \"introjs-arrow\";\r\n    tooltipLayer.appendChild(arrowLayer);\r\n    tooltipLayer.appendChild(tooltipTextLayer); // set current step for _placeTooltip function\r\n\r\n    this._currentStep = hintElement.getAttribute(\"data-step\"); // align reference layer position\r\n\r\n    referenceLayer.className = \"introjs-tooltipReferenceLayer introjs-hintReference\";\r\n    referenceLayer.setAttribute(\"data-step\", hintElement.getAttribute(\"data-step\"));\r\n    setHelperLayerPosition.call(this, referenceLayer);\r\n    referenceLayer.appendChild(tooltipLayer);\r\n    document.body.appendChild(referenceLayer); //set proper position\r\n\r\n    placeTooltip.call(this, hintElement, tooltipLayer, arrowLayer, true);\r\n  }\r\n  /**\r\n   * Removes open hint (tooltip hint)\r\n   *\r\n   * @api private\r\n   * @method _removeHintTooltip\r\n   */\r\n\r\n  function removeHintTooltip() {\r\n    var tooltip = document.querySelector(\".introjs-hintReference\");\r\n\r\n    if (tooltip) {\r\n      var step = tooltip.getAttribute(\"data-step\");\r\n      tooltip.parentNode.removeChild(tooltip);\r\n      return step;\r\n    }\r\n  }\r\n  /**\r\n   * Start parsing hint items\r\n   *\r\n   * @api private\r\n   * @param {Object} targetElm\r\n   * @method _startHint\r\n   */\r\n\r\n  function populateHints(targetElm) {\r\n    var _this5 = this;\r\n\r\n    this._introItems = [];\r\n\r\n    if (this._options.hints) {\r\n      forEach(this._options.hints, function (hint) {\r\n        var currentItem = cloneObject(hint);\r\n\r\n        if (typeof currentItem.element === \"string\") {\r\n          //grab the element with given selector from the page\r\n          currentItem.element = document.querySelector(currentItem.element);\r\n        }\r\n\r\n        currentItem.hintPosition = currentItem.hintPosition || _this5._options.hintPosition;\r\n        currentItem.hintAnimation = currentItem.hintAnimation || _this5._options.hintAnimation;\r\n\r\n        if (currentItem.element !== null) {\r\n          _this5._introItems.push(currentItem);\r\n        }\r\n      });\r\n    } else {\r\n      var hints = targetElm.querySelectorAll(\"*[data-hint]\");\r\n\r\n      if (!hints || !hints.length) {\r\n        return false;\r\n      } //first add intro items with data-step\r\n\r\n\r\n      forEach(hints, function (currentElement) {\r\n        // hint animation\r\n        var hintAnimation = currentElement.getAttribute(\"data-hintanimation\");\r\n\r\n        if (hintAnimation) {\r\n          hintAnimation = hintAnimation === \"true\";\r\n        } else {\r\n          hintAnimation = _this5._options.hintAnimation;\r\n        }\r\n\r\n        _this5._introItems.push({\r\n          element: currentElement,\r\n          hint: currentElement.getAttribute(\"data-hint\"),\r\n          hintPosition: currentElement.getAttribute(\"data-hintposition\") || _this5._options.hintPosition,\r\n          hintAnimation: hintAnimation,\r\n          tooltipClass: currentElement.getAttribute(\"data-tooltipclass\"),\r\n          position: currentElement.getAttribute(\"data-position\") || _this5._options.tooltipPosition\r\n        });\r\n      });\r\n    }\r\n\r\n    addHints.call(this);\r\n    /*\r\n    todo:\r\n    these events should be removed at some point\r\n    */\r\n\r\n    DOMEvent.on(document, \"click\", removeHintTooltip, this, false);\r\n    DOMEvent.on(window, \"resize\", reAlignHints, this, true);\r\n  }\r\n  /**\r\n   * Re-aligns all hint elements\r\n   *\r\n   * @api private\r\n   * @method _reAlignHints\r\n   */\r\n\r\n  function reAlignHints() {\r\n    var _this6 = this;\r\n\r\n    forEach(this._introItems, function (_ref2) {\r\n      var targetElement = _ref2.targetElement,\r\n          hintPosition = _ref2.hintPosition,\r\n          element = _ref2.element;\r\n\r\n      if (typeof targetElement === \"undefined\") {\r\n        return;\r\n      }\r\n\r\n      alignHintPosition.call(_this6, hintPosition, element, targetElement);\r\n    });\r\n  }\r\n\r\n  // TODO: use something more complex like timsort?\r\n  var floor = Math.floor;\r\n\r\n  var mergeSort = function (array, comparefn) {\r\n    var length = array.length;\r\n    var middle = floor(length / 2);\r\n    return length < 8 ? insertionSort(array, comparefn) : merge(\r\n      mergeSort(array.slice(0, middle), comparefn),\r\n      mergeSort(array.slice(middle), comparefn),\r\n      comparefn\r\n    );\r\n  };\r\n\r\n  var insertionSort = function (array, comparefn) {\r\n    var length = array.length;\r\n    var i = 1;\r\n    var element, j;\r\n\r\n    while (i < length) {\r\n      j = i;\r\n      element = array[i];\r\n      while (j && comparefn(array[j - 1], element) > 0) {\r\n        array[j] = array[--j];\r\n      }\r\n      if (j !== i++) array[j] = element;\r\n    } return array;\r\n  };\r\n\r\n  var merge = function (left, right, comparefn) {\r\n    var llength = left.length;\r\n    var rlength = right.length;\r\n    var lindex = 0;\r\n    var rindex = 0;\r\n    var result = [];\r\n\r\n    while (lindex < llength || rindex < rlength) {\r\n      if (lindex < llength && rindex < rlength) {\r\n        result.push(comparefn(left[lindex], right[rindex]) <= 0 ? left[lindex++] : right[rindex++]);\r\n      } else {\r\n        result.push(lindex < llength ? left[lindex++] : right[rindex++]);\r\n      }\r\n    } return result;\r\n  };\r\n\r\n  var arraySort = mergeSort;\r\n\r\n  var firefox = engineUserAgent.match(/firefox\\/(\\d+)/i);\r\n\r\n  var engineFfVersion = !!firefox && +firefox[1];\r\n\r\n  var engineIsIeOrEdge = /MSIE|Trident/.test(engineUserAgent);\r\n\r\n  var webkit = engineUserAgent.match(/AppleWebKit\\/(\\d+)\\./);\r\n\r\n  var engineWebkitVersion = !!webkit && +webkit[1];\r\n\r\n  var test = [];\r\n  var nativeSort = test.sort;\r\n\r\n  // IE8-\r\n  var FAILS_ON_UNDEFINED = fails(function () {\r\n    test.sort(undefined);\r\n  });\r\n  // V8 bug\r\n  var FAILS_ON_NULL = fails(function () {\r\n    test.sort(null);\r\n  });\r\n  // Old WebKit\r\n  var STRICT_METHOD = arrayMethodIsStrict('sort');\r\n\r\n  var STABLE_SORT = !fails(function () {\r\n    // feature detection can be too slow, so check engines versions\r\n    if (engineV8Version) return engineV8Version < 70;\r\n    if (engineFfVersion && engineFfVersion > 3) return;\r\n    if (engineIsIeOrEdge) return true;\r\n    if (engineWebkitVersion) return engineWebkitVersion < 603;\r\n\r\n    var result = '';\r\n    var code, chr, value, index;\r\n\r\n    // generate an array with more 512 elements (Chakra and old V8 fails only in this case)\r\n    for (code = 65; code < 76; code++) {\r\n      chr = String.fromCharCode(code);\r\n\r\n      switch (code) {\r\n        case 66: case 69: case 70: case 72: value = 3; break;\r\n        case 68: case 71: value = 4; break;\r\n        default: value = 2;\r\n      }\r\n\r\n      for (index = 0; index < 47; index++) {\r\n        test.push({ k: chr + index, v: value });\r\n      }\r\n    }\r\n\r\n    test.sort(function (a, b) { return b.v - a.v; });\r\n\r\n    for (index = 0; index < test.length; index++) {\r\n      chr = test[index].k.charAt(0);\r\n      if (result.charAt(result.length - 1) !== chr) result += chr;\r\n    }\r\n\r\n    return result !== 'DGBEFHACIJK';\r\n  });\r\n\r\n  var FORCED = FAILS_ON_UNDEFINED || !FAILS_ON_NULL || !STRICT_METHOD || !STABLE_SORT;\r\n\r\n  var getSortCompare = function (comparefn) {\r\n    return function (x, y) {\r\n      if (y === undefined) return -1;\r\n      if (x === undefined) return 1;\r\n      if (comparefn !== undefined) return +comparefn(x, y) || 0;\r\n      return toString_1(x) > toString_1(y) ? 1 : -1;\r\n    };\r\n  };\r\n\r\n  // `Array.prototype.sort` method\r\n  // https://tc39.es/ecma262/#sec-array.prototype.sort\r\n  _export({ target: 'Array', proto: true, forced: FORCED }, {\r\n    sort: function sort(comparefn) {\r\n      if (comparefn !== undefined) aFunction(comparefn);\r\n\r\n      var array = toObject(this);\r\n\r\n      if (STABLE_SORT) return comparefn === undefined ? nativeSort.call(array) : nativeSort.call(array, comparefn);\r\n\r\n      var items = [];\r\n      var arrayLength = toLength(array.length);\r\n      var itemsLength, index;\r\n\r\n      for (index = 0; index < arrayLength; index++) {\r\n        if (index in array) items.push(array[index]);\r\n      }\r\n\r\n      items = arraySort(items, getSortCompare(comparefn));\r\n      itemsLength = items.length;\r\n      index = 0;\r\n\r\n      while (index < itemsLength) array[index] = items[index++];\r\n      while (index < arrayLength) delete array[index++];\r\n\r\n      return array;\r\n    }\r\n  });\r\n\r\n  /**\r\n   * Finds all Intro steps from the data-* attributes and the options.steps array\r\n   *\r\n   * @api private\r\n   * @param targetElm\r\n   * @returns {[]}\r\n   */\r\n\r\n  function fetchIntroSteps(targetElm) {\r\n    var _this = this;\r\n\r\n    var allIntroSteps = targetElm.querySelectorAll(\"*[data-intro]\");\r\n    var introItems = [];\r\n\r\n    if (this._options.steps) {\r\n      //use steps passed programmatically\r\n      forEach(this._options.steps, function (step) {\r\n        var currentItem = cloneObject(step); //set the step\r\n\r\n        currentItem.step = introItems.length + 1;\r\n        currentItem.title = currentItem.title || \"\"; //use querySelector function only when developer used CSS selector\r\n\r\n        if (typeof currentItem.element === \"string\") {\r\n          //grab the element with given selector from the page\r\n          currentItem.element = document.querySelector(currentItem.element);\r\n        } //intro without element\r\n\r\n\r\n        if (typeof currentItem.element === \"undefined\" || currentItem.element === null) {\r\n          var floatingElementQuery = document.querySelector(\".introjsFloatingElement\");\r\n\r\n          if (floatingElementQuery === null) {\r\n            floatingElementQuery = _createElement(\"div\", {\r\n              className: \"introjsFloatingElement\"\r\n            });\r\n            document.body.appendChild(floatingElementQuery);\r\n          }\r\n\r\n          currentItem.element = floatingElementQuery;\r\n          currentItem.position = \"floating\";\r\n        }\r\n\r\n        currentItem.position = currentItem.position || _this._options.tooltipPosition;\r\n        currentItem.scrollTo = currentItem.scrollTo || _this._options.scrollTo;\r\n\r\n        if (typeof currentItem.disableInteraction === \"undefined\") {\r\n          currentItem.disableInteraction = _this._options.disableInteraction;\r\n        }\r\n\r\n        if (currentItem.element !== null) {\r\n          introItems.push(currentItem);\r\n        }\r\n      });\r\n    } else {\r\n      //use steps from data-* annotations\r\n      var elmsLength = allIntroSteps.length;\r\n      var disableInteraction; //if there's no element to intro\r\n\r\n      if (elmsLength < 1) {\r\n        return [];\r\n      }\r\n\r\n      forEach(allIntroSteps, function (currentElement) {\r\n        // start intro for groups of elements\r\n        if (_this._options.group && currentElement.getAttribute(\"data-intro-group\") !== _this._options.group) {\r\n          return;\r\n        } // skip hidden elements\r\n\r\n\r\n        if (currentElement.style.display === \"none\") {\r\n          return;\r\n        }\r\n\r\n        var step = parseInt(currentElement.getAttribute(\"data-step\"), 10);\r\n\r\n        if (currentElement.hasAttribute(\"data-disable-interaction\")) {\r\n          disableInteraction = !!currentElement.getAttribute(\"data-disable-interaction\");\r\n        } else {\r\n          disableInteraction = _this._options.disableInteraction;\r\n        }\r\n\r\n        if (step > 0) {\r\n          introItems[step - 1] = {\r\n            element: currentElement,\r\n            title: currentElement.getAttribute(\"data-title\") || \"\",\r\n            intro: currentElement.getAttribute(\"data-intro\"),\r\n            step: parseInt(currentElement.getAttribute(\"data-step\"), 10),\r\n            tooltipClass: currentElement.getAttribute(\"data-tooltipclass\"),\r\n            highlightClass: currentElement.getAttribute(\"data-highlightclass\"),\r\n            position: currentElement.getAttribute(\"data-position\") || _this._options.tooltipPosition,\r\n            scrollTo: currentElement.getAttribute(\"data-scrollto\") || _this._options.scrollTo,\r\n            disableInteraction: disableInteraction\r\n          };\r\n        }\r\n      }); //next add intro items without data-step\r\n      //todo: we need a cleanup here, two loops are redundant\r\n\r\n      var nextStep = 0;\r\n      forEach(allIntroSteps, function (currentElement) {\r\n        // start intro for groups of elements\r\n        if (_this._options.group && currentElement.getAttribute(\"data-intro-group\") !== _this._options.group) {\r\n          return;\r\n        }\r\n\r\n        if (currentElement.getAttribute(\"data-step\") === null) {\r\n          while (true) {\r\n            if (typeof introItems[nextStep] === \"undefined\") {\r\n              break;\r\n            } else {\r\n              nextStep++;\r\n            }\r\n          }\r\n\r\n          if (currentElement.hasAttribute(\"data-disable-interaction\")) {\r\n            disableInteraction = !!currentElement.getAttribute(\"data-disable-interaction\");\r\n          } else {\r\n            disableInteraction = _this._options.disableInteraction;\r\n          }\r\n\r\n          introItems[nextStep] = {\r\n            element: currentElement,\r\n            title: currentElement.getAttribute(\"data-title\") || \"\",\r\n            intro: currentElement.getAttribute(\"data-intro\"),\r\n            step: nextStep + 1,\r\n            tooltipClass: currentElement.getAttribute(\"data-tooltipclass\"),\r\n            highlightClass: currentElement.getAttribute(\"data-highlightclass\"),\r\n            position: currentElement.getAttribute(\"data-position\") || _this._options.tooltipPosition,\r\n            scrollTo: currentElement.getAttribute(\"data-scrollto\") || _this._options.scrollTo,\r\n            disableInteraction: disableInteraction\r\n          };\r\n        }\r\n      });\r\n    } //removing undefined/null elements\r\n\r\n\r\n    var tempIntroItems = [];\r\n\r\n    for (var z = 0; z < introItems.length; z++) {\r\n      if (introItems[z]) {\r\n        // copy non-falsy values to the end of the array\r\n        tempIntroItems.push(introItems[z]);\r\n      }\r\n    }\r\n\r\n    introItems = tempIntroItems; //Ok, sort all items with given steps\r\n\r\n    introItems.sort(function (a, b) {\r\n      return a.step - b.step;\r\n    });\r\n    return introItems;\r\n  }\r\n\r\n  /**\r\n   * Update placement of the intro objects on the screen\r\n   * @api private\r\n   * @param {boolean} refreshSteps to refresh the intro steps as well\r\n   */\r\n\r\n  function refresh(refreshSteps) {\r\n    var referenceLayer = document.querySelector(\".introjs-tooltipReferenceLayer\");\r\n    var helperLayer = document.querySelector(\".introjs-helperLayer\");\r\n    var disableInteractionLayer = document.querySelector(\".introjs-disableInteraction\"); // re-align intros\r\n\r\n    setHelperLayerPosition.call(this, helperLayer);\r\n    setHelperLayerPosition.call(this, referenceLayer);\r\n    setHelperLayerPosition.call(this, disableInteractionLayer);\r\n\r\n    if (refreshSteps) {\r\n      this._introItems = fetchIntroSteps.call(this, this._targetElement);\r\n\r\n      _recreateBullets.call(this, referenceLayer, this._introItems[this._currentStep]);\r\n\r\n      _updateProgressBar.call(this, referenceLayer);\r\n    } // re-align tooltip\r\n\r\n\r\n    if (this._currentStep !== undefined && this._currentStep !== null) {\r\n      var oldArrowLayer = document.querySelector(\".introjs-arrow\");\r\n      var oldtooltipContainer = document.querySelector(\".introjs-tooltip\");\r\n      placeTooltip.call(this, this._introItems[this._currentStep].element, oldtooltipContainer, oldArrowLayer);\r\n    } //re-align hints\r\n\r\n\r\n    reAlignHints.call(this);\r\n    return this;\r\n  }\r\n\r\n  function onResize() {\r\n    refresh.call(this);\r\n  }\r\n\r\n  /**\r\n   * Removes `element` from `parentElement`\r\n   *\r\n   * @param {Element} element\r\n   * @param {Boolean} [animate=false]\r\n   */\r\n\r\n  function removeChild(element, animate) {\r\n    if (!element || !element.parentElement) return;\r\n    var parentElement = element.parentElement;\r\n\r\n    if (animate) {\r\n      setStyle(element, {\r\n        opacity: \"0\"\r\n      });\r\n      window.setTimeout(function () {\r\n        try {\r\n          // removeChild(..) throws an exception if the child has already been removed (https://developer.mozilla.org/en-US/docs/Web/API/Node/removeChild)\r\n          // this try-catch is added to make sure this function doesn't throw an exception if the child has been removed\r\n          // this scenario can happen when start()/exit() is called multiple times and the helperLayer is removed by the\r\n          // previous exit() call (note: this is a timeout)\r\n          parentElement.removeChild(element);\r\n        } catch (e) {}\r\n      }, 500);\r\n    } else {\r\n      parentElement.removeChild(element);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Exit from intro\r\n   *\r\n   * @api private\r\n   * @method _exitIntro\r\n   * @param {Object} targetElement\r\n   * @param {Boolean} force - Setting to `true` will skip the result of beforeExit callback\r\n   */\r\n\r\n  function exitIntro(targetElement, force) {\r\n    var continueExit = true; // calling onbeforeexit callback\r\n    //\r\n    // If this callback return `false`, it would halt the process\r\n\r\n    if (this._introBeforeExitCallback !== undefined) {\r\n      continueExit = this._introBeforeExitCallback.call(this);\r\n    } // skip this check if `force` parameter is `true`\r\n    // otherwise, if `onbeforeexit` returned `false`, don't exit the intro\r\n\r\n\r\n    if (!force && continueExit === false) return; // remove overlay layers from the page\r\n\r\n    var overlayLayers = targetElement.querySelectorAll(\".introjs-overlay\");\r\n\r\n    if (overlayLayers && overlayLayers.length) {\r\n      forEach(overlayLayers, function (overlayLayer) {\r\n        return removeChild(overlayLayer);\r\n      });\r\n    } //remove all helper layers\r\n\r\n\r\n    var helperLayer = targetElement.querySelector(\".introjs-helperLayer\");\r\n    removeChild(helperLayer, true);\r\n    var referenceLayer = targetElement.querySelector(\".introjs-tooltipReferenceLayer\");\r\n    removeChild(referenceLayer); //remove disableInteractionLayer\r\n\r\n    var disableInteractionLayer = targetElement.querySelector(\".introjs-disableInteraction\");\r\n    removeChild(disableInteractionLayer); //remove intro floating element\r\n\r\n    var floatingElement = document.querySelector(\".introjsFloatingElement\");\r\n    removeChild(floatingElement);\r\n    removeShowElement(); //clean listeners\r\n\r\n    DOMEvent.off(window, \"keydown\", onKeyDown, this, true);\r\n    DOMEvent.off(window, \"resize\", onResize, this, true); //check if any callback is defined\r\n\r\n    if (this._introExitCallback !== undefined) {\r\n      this._introExitCallback.call(this);\r\n    } //set the step to zero\r\n\r\n\r\n    this._currentStep = undefined;\r\n  }\r\n\r\n  /**\r\n   * Add overlay layer to the page\r\n   *\r\n   * @api private\r\n   * @method _addOverlayLayer\r\n   * @param {Object} targetElm\r\n   */\r\n\r\n  function addOverlayLayer(targetElm) {\r\n    var _this = this;\r\n\r\n    var overlayLayer = _createElement(\"div\", {\r\n      className: \"introjs-overlay\"\r\n    });\r\n    setStyle(overlayLayer, {\r\n      top: 0,\r\n      bottom: 0,\r\n      left: 0,\r\n      right: 0,\r\n      position: \"fixed\"\r\n    });\r\n    targetElm.appendChild(overlayLayer);\r\n\r\n    if (this._options.exitOnOverlayClick === true) {\r\n      setStyle(overlayLayer, {\r\n        cursor: \"pointer\"\r\n      });\r\n\r\n      overlayLayer.onclick = function () {\r\n        exitIntro.call(_this, targetElm);\r\n      };\r\n    }\r\n\r\n    return true;\r\n  }\r\n\r\n  /**\r\n   * Initiate a new introduction/guide from an element in the page\r\n   *\r\n   * @api private\r\n   * @method introForElement\r\n   * @param {Object} targetElm\r\n   * @returns {Boolean} Success or not?\r\n   */\r\n\r\n  function introForElement(targetElm) {\r\n    //set it to the introJs object\r\n    var steps = fetchIntroSteps.call(this, targetElm);\r\n\r\n    if (steps.length === 0) {\r\n      return false;\r\n    }\r\n\r\n    this._introItems = steps; //add overlay layer to the page\r\n\r\n    if (addOverlayLayer.call(this, targetElm)) {\r\n      //then, start the show\r\n      nextStep.call(this);\r\n\r\n      if (this._options.keyboardNavigation) {\r\n        DOMEvent.on(window, \"keydown\", onKeyDown, this, true);\r\n      } //for window resize\r\n\r\n\r\n      DOMEvent.on(window, \"resize\", onResize, this, true);\r\n    }\r\n\r\n    return false;\r\n  }\r\n\r\n  var version = \"4.2.2\";\r\n\r\n  /**\r\n   * IntroJs main class\r\n   *\r\n   * @class IntroJs\r\n   */\r\n\r\n  function IntroJs(obj) {\r\n    this._targetElement = obj;\r\n    this._introItems = [];\r\n    this._options = {\r\n      /* Next button label in tooltip box */\r\n      nextLabel: \"Next\",\r\n\r\n      /* Previous button label in tooltip box */\r\n      prevLabel: \"Back\",\r\n\r\n      /* Skip button label in tooltip box */\r\n      skipLabel: \"×\",\r\n\r\n      /* Done button label in tooltip box */\r\n      doneLabel: \"Done\",\r\n\r\n      /* Hide previous button in the first step? Otherwise, it will be disabled button. */\r\n      hidePrev: false,\r\n\r\n      /* Hide next button in the last step? Otherwise, it will be disabled button (note: this will also hide the \"Done\" button) */\r\n      hideNext: false,\r\n\r\n      /* Change the Next button to Done in the last step of the intro? otherwise, it will render a disabled button */\r\n      nextToDone: true,\r\n\r\n      /* Default tooltip box position */\r\n      tooltipPosition: \"bottom\",\r\n\r\n      /* Next CSS class for tooltip boxes */\r\n      tooltipClass: \"\",\r\n\r\n      /* Start intro for a group of elements */\r\n      group: \"\",\r\n\r\n      /* CSS class that is added to the helperLayer */\r\n      highlightClass: \"\",\r\n\r\n      /* Close introduction when pressing Escape button? */\r\n      exitOnEsc: true,\r\n\r\n      /* Close introduction when clicking on overlay layer? */\r\n      exitOnOverlayClick: true,\r\n\r\n      /* Show step numbers in introduction? */\r\n      showStepNumbers: false,\r\n\r\n      /* Let user use keyboard to navigate the tour? */\r\n      keyboardNavigation: true,\r\n\r\n      /* Show tour control buttons? */\r\n      showButtons: true,\r\n\r\n      /* Show tour bullets? */\r\n      showBullets: true,\r\n\r\n      /* Show tour progress? */\r\n      showProgress: false,\r\n\r\n      /* Scroll to highlighted element? */\r\n      scrollToElement: true,\r\n\r\n      /*\r\n       * Should we scroll the tooltip or target element?\r\n       *\r\n       * Options are: 'element' or 'tooltip'\r\n       */\r\n      scrollTo: \"element\",\r\n\r\n      /* Padding to add after scrolling when element is not in the viewport (in pixels) */\r\n      scrollPadding: 30,\r\n\r\n      /* Set the overlay opacity */\r\n      overlayOpacity: 0.5,\r\n\r\n      /* To determine the tooltip position automatically based on the window.width/height */\r\n      autoPosition: true,\r\n\r\n      /* Precedence of positions, when auto is enabled */\r\n      positionPrecedence: [\"bottom\", \"top\", \"right\", \"left\"],\r\n\r\n      /* Disable an interaction with element? */\r\n      disableInteraction: false,\r\n\r\n      /* Set how much padding to be used around helper element */\r\n      helperElementPadding: 10,\r\n\r\n      /* Default hint position */\r\n      hintPosition: \"top-middle\",\r\n\r\n      /* Hint button label */\r\n      hintButtonLabel: \"Got it\",\r\n\r\n      /* Adding animation to hints? */\r\n      hintAnimation: true,\r\n\r\n      /* additional classes to put on the buttons */\r\n      buttonClass: \"introjs-button\",\r\n\r\n      /* additional classes to put on progress bar */\r\n      progressBarAdditionalClass: false\r\n    };\r\n  }\r\n\r\n  var introJs = function introJs(targetElm) {\r\n    var instance;\r\n\r\n    if (_typeof(targetElm) === \"object\") {\r\n      //Ok, create a new instance\r\n      instance = new IntroJs(targetElm);\r\n    } else if (typeof targetElm === \"string\") {\r\n      //select the target element with query selector\r\n      var targetElement = document.querySelector(targetElm);\r\n\r\n      if (targetElement) {\r\n        instance = new IntroJs(targetElement);\r\n      } else {\r\n        throw new Error(\"There is no element with given selector.\");\r\n      }\r\n    } else {\r\n      instance = new IntroJs(document.body);\r\n    } // add instance to list of _instances\r\n    // passing group to stamp to increment\r\n    // from 0 onward somewhat reliably\r\n\r\n\r\n    introJs.instances[stamp(instance, \"introjs-instance\")] = instance;\r\n    return instance;\r\n  };\r\n  /**\r\n   * Current IntroJs version\r\n   *\r\n   * @property version\r\n   * @type String\r\n   */\r\n\r\n\r\n  introJs.version = version;\r\n  /**\r\n   * key-val object helper for introJs instances\r\n   *\r\n   * @property instances\r\n   * @type Object\r\n   */\r\n\r\n  introJs.instances = {}; //Prototype\r\n\r\n  introJs.fn = IntroJs.prototype = {\r\n    clone: function clone() {\r\n      return new IntroJs(this);\r\n    },\r\n    setOption: function setOption(option, value) {\r\n      this._options[option] = value;\r\n      return this;\r\n    },\r\n    setOptions: function setOptions(options) {\r\n      this._options = mergeOptions(this._options, options);\r\n      return this;\r\n    },\r\n    start: function start() {\r\n      introForElement.call(this, this._targetElement);\r\n      return this;\r\n    },\r\n    goToStep: function goToStep$1(step) {\r\n      goToStep.call(this, step);\r\n\r\n      return this;\r\n    },\r\n    addStep: function addStep(options) {\r\n      if (!this._options.steps) {\r\n        this._options.steps = [];\r\n      }\r\n\r\n      this._options.steps.push(options);\r\n\r\n      return this;\r\n    },\r\n    addSteps: function addSteps(steps) {\r\n      if (!steps.length) return;\r\n\r\n      for (var index = 0; index < steps.length; index++) {\r\n        this.addStep(steps[index]);\r\n      }\r\n\r\n      return this;\r\n    },\r\n    goToStepNumber: function goToStepNumber$1(step) {\r\n      goToStepNumber.call(this, step);\r\n\r\n      return this;\r\n    },\r\n    nextStep: function nextStep$1() {\r\n      nextStep.call(this);\r\n\r\n      return this;\r\n    },\r\n    previousStep: function previousStep$1() {\r\n      previousStep.call(this);\r\n\r\n      return this;\r\n    },\r\n    currentStep: function currentStep$1() {\r\n      return currentStep.call(this);\r\n    },\r\n    exit: function exit(force) {\r\n      exitIntro.call(this, this._targetElement, force);\r\n      return this;\r\n    },\r\n    refresh: function refresh$1(refreshSteps) {\r\n      refresh.call(this, refreshSteps);\r\n\r\n      return this;\r\n    },\r\n    onbeforechange: function onbeforechange(providedCallback) {\r\n      if (typeof providedCallback === \"function\") {\r\n        this._introBeforeChangeCallback = providedCallback;\r\n      } else {\r\n        throw new Error(\"Provided callback for onbeforechange was not a function\");\r\n      }\r\n\r\n      return this;\r\n    },\r\n    onchange: function onchange(providedCallback) {\r\n      if (typeof providedCallback === \"function\") {\r\n        this._introChangeCallback = providedCallback;\r\n      } else {\r\n        throw new Error(\"Provided callback for onchange was not a function.\");\r\n      }\r\n\r\n      return this;\r\n    },\r\n    onafterchange: function onafterchange(providedCallback) {\r\n      if (typeof providedCallback === \"function\") {\r\n        this._introAfterChangeCallback = providedCallback;\r\n      } else {\r\n        throw new Error(\"Provided callback for onafterchange was not a function\");\r\n      }\r\n\r\n      return this;\r\n    },\r\n    oncomplete: function oncomplete(providedCallback) {\r\n      if (typeof providedCallback === \"function\") {\r\n        this._introCompleteCallback = providedCallback;\r\n      } else {\r\n        throw new Error(\"Provided callback for oncomplete was not a function.\");\r\n      }\r\n\r\n      return this;\r\n    },\r\n    onhintsadded: function onhintsadded(providedCallback) {\r\n      if (typeof providedCallback === \"function\") {\r\n        this._hintsAddedCallback = providedCallback;\r\n      } else {\r\n        throw new Error(\"Provided callback for onhintsadded was not a function.\");\r\n      }\r\n\r\n      return this;\r\n    },\r\n    onhintclick: function onhintclick(providedCallback) {\r\n      if (typeof providedCallback === \"function\") {\r\n        this._hintClickCallback = providedCallback;\r\n      } else {\r\n        throw new Error(\"Provided callback for onhintclick was not a function.\");\r\n      }\r\n\r\n      return this;\r\n    },\r\n    onhintclose: function onhintclose(providedCallback) {\r\n      if (typeof providedCallback === \"function\") {\r\n        this._hintCloseCallback = providedCallback;\r\n      } else {\r\n        throw new Error(\"Provided callback for onhintclose was not a function.\");\r\n      }\r\n\r\n      return this;\r\n    },\r\n    onexit: function onexit(providedCallback) {\r\n      if (typeof providedCallback === \"function\") {\r\n        this._introExitCallback = providedCallback;\r\n      } else {\r\n        throw new Error(\"Provided callback for onexit was not a function.\");\r\n      }\r\n\r\n      return this;\r\n    },\r\n    onskip: function onskip(providedCallback) {\r\n      if (typeof providedCallback === \"function\") {\r\n        this._introSkipCallback = providedCallback;\r\n      } else {\r\n        throw new Error(\"Provided callback for onskip was not a function.\");\r\n      }\r\n\r\n      return this;\r\n    },\r\n    onbeforeexit: function onbeforeexit(providedCallback) {\r\n      if (typeof providedCallback === \"function\") {\r\n        this._introBeforeExitCallback = providedCallback;\r\n      } else {\r\n        throw new Error(\"Provided callback for onbeforeexit was not a function.\");\r\n      }\r\n\r\n      return this;\r\n    },\r\n    addHints: function addHints() {\r\n      populateHints.call(this, this._targetElement);\r\n      return this;\r\n    },\r\n    hideHint: function hideHint$1(stepId) {\r\n      hideHint.call(this, stepId);\r\n\r\n      return this;\r\n    },\r\n    hideHints: function hideHints$1() {\r\n      hideHints.call(this);\r\n\r\n      return this;\r\n    },\r\n    showHint: function showHint$1(stepId) {\r\n      showHint.call(this, stepId);\r\n\r\n      return this;\r\n    },\r\n    showHints: function showHints$1() {\r\n      showHints.call(this);\r\n\r\n      return this;\r\n    },\r\n    removeHints: function removeHints$1() {\r\n      removeHints.call(this);\r\n\r\n      return this;\r\n    },\r\n    removeHint: function removeHint$1(stepId) {\r\n      removeHint().call(this, stepId);\r\n\r\n      return this;\r\n    },\r\n    showHintDialog: function showHintDialog$1(stepId) {\r\n      showHintDialog.call(this, stepId);\r\n\r\n      return this;\r\n    }\r\n  };\r\n\r\n  return introJs;\r\n\r\n})));\r\n\n/**\r\n * Guided Tour to explain the UI\r\n * \r\n * @author Helge Stallkamp\r\n */\r\n\r\n\r\ndefine('tour/tours',['lib/intro', 'vc', 'hint', 'menu', 'vc/doc', 'vc/docgroup'],\r\n       function(introClass, vcClass, hintClass, menuClass, docClass, docGroup) {\r\n\r\n  //needed for localization of labels and contents of the tour\r\n  const loc   = KorAP.Locale;\r\n\r\n  //labels for nextStep, previousStep and done\r\n  loc.TOUR_lprev = loc.TOUR_lprev || \"Back\";\r\n  loc.TOUR_lnext = loc.TOUR_lnext || \"Next\";\r\n  loc.TOUR_ldone = loc.TOUR_ldone || \"Done\";\r\n  loc.TOUR_ldoneSearch = loc.TOUR_ldoneSearch || \"Search\";\r\n  \r\n  //localization guided tour gTstartSearch\r\n  loc.TOUR_welcti = loc.TOUR_welcti || \"<span class='tgreeting'> Welcome to our guided tour! </span>\";\r\n  loc.TOUR_welc = loc.TOUR_welc || \"This tour should give you a quick introduction to KorAP. \" +\r\n  \t\t                           \"We lead you step by step through an example.\";\r\n  loc.TOUR_sear1 = loc.TOUR_sear1 || \"Input field for the query, for example the search for '\" +  loc.TOUR_Qexample + \"'.\";\r\n  loc.TOUR_searAnnot = loc.TOUR_searAnnot || \"Annotation helper\";\r\n  loc.TOUR_annotAss =  loc.TOUR_annotAss || \"The assistant displays the annotations of the different layers and helps to formulate queries.\";\r\n  loc.TOUR_vccho1 = loc.TOUR_vccho1 || \"Choose corpus\";\r\n  loc.TOUR_vccho2 = loc.TOUR_vccho2 || \"Define your corpus here.\";\r\n  loc.TOUR_vcStat1 = loc.TOUR_vcStat1 || \"Click here to display corpus statistic.\";\r\n  loc.TOUR_vcStat2 = loc.TOUR_vcStat2 || \"Corpus statistic\";\r\n  loc.TOUR_qlfield = loc.TOUR_qlfield|| \"Selection of the query language: You can use KorAP with different query languages.\";\r\n  loc.TOUR_help = loc.TOUR_help || \"Help and information about KorAP.\";\r\n  loc.TOUR_glimpse = loc.TOUR_glimpse || \"Select this to show only the first hits in undefined order.\";\r\n  loc.TOUR_seargo = loc.TOUR_seargo || \"Start the search\";\r\n\r\n  //localization guided Tour gTshowResults\r\n  loc.TOUR_kwic = loc.TOUR_kwic || \"KWIC result (keyword in context)\";\r\n  loc.TOUR_snippet = loc.TOUR_snippet ||  \"Click on a match to show a larger snippet.\";\r\n  loc.TOUR_snippetb = loc.TOUR_snippetb || \"Snippet\";\r\n  loc.TOUR_metadatab =  loc.TOUR_metadatab || \"Display of metadata\";\r\n  loc.TOUR_metadata = loc.TOUR_metadata || \"Metadata\";\r\n  loc.TOUR_tokenb = loc.TOUR_tokenb || \"Display of token annotations\";\r\n  loc.TOUR_token = loc.TOUR_token || \"KorAP supports multiple annotations.\";\r\n  loc.TOUR_treeb = loc.TOUR_treeb || \"Display further annotations\"\r\n  loc.TOUR_tree = loc.TOUR_tree || \"Further annotations can be displayed as tree and arch views.\"\r\n  loc.TOUR_tourdone = loc.TOUR_tourdone || \"Have fun with KorAP!\";\r\n  \r\n  //localization of button labels\r\n  let labelOpts= {\r\n      'prevLabel': loc.TOUR_lprev,\r\n      'nextLabel': loc.TOUR_lnext,\r\n      'doneLabel': loc.TOUR_ldone,\r\n      'showStepNumbers': false\r\n  };\r\n  \r\n  //usability options of tours\r\n  let usabilityOpts ={\r\n      'showBullets': false,\r\n      'overlayOpacity': 0.5,\r\n      'exitOnOverlayClick': false,\r\n      'disableInteraction': true,  \r\n      'tooltipClass': 'customTooltip',\r\n      'hidePrev': true\r\n  };\r\n  \r\n  var doe = document;\r\n\r\n  return{\r\n\r\n    /** \r\n     * Guided Tour gTstartSearch: Explains the search functionality\r\n     */\r\n    gTstartSearch:function(elparam){\r\n      let intro = introClass();\r\n      intro.setOptions(labelOpts);\r\n      /*\r\n       * Sets button labels for the last step of the tour\r\n       * Because Kalamar is a multipage webapplication, this tours starts by\r\n       * completion the gTshowResults Tour. Therefore the label of the done button changed.\r\n        */\r\n      intro.setOption('doneLabel', loc.TOUR_ldoneSearch );\r\n      intro.setOptions(usabilityOpts);\r\n      \r\n      //for testing purposes\r\n      if(elparam){\r\n        doe = elparam;\r\n      }\r\n\r\n      let input = doe.querySelector(\"#q-field\");\r\n      input.value=\"\";\r\n      \r\n\r\n      //steps of the example tour\r\n      let Steps =[\r\n        {  \r\n          element: '#link-guided-tour',\r\n          title: loc.TOUR_welcti,\r\n          intro: loc.TOUR_welc,\r\n          position: 'right',\r\n        },\r\n        {\r\n          title: loc.TOUR_sear1ti,\r\n          element: '#q-field',\r\n          intro: loc.TOUR_sear1,\r\n          position: 'bottom'\r\n        },\r\n        {\r\n          title: loc.TOUR_searAnnotti,\r\n          element: '#hint',\r\n          intro: loc.TOUR_searAnnot,\r\n          position: 'bottom'\r\n        },\r\n        {\r\n          title: loc.TOUR_annotAssti,\r\n          element: doe.querySelector(\"#hint > .menu.hint\"),\r\n          intro: loc.TOUR_annotAss,\r\n          position: 'bottom',\r\n          },\r\n        {\r\n          title:loc.TOUR_vccho1ti,\r\n          element:'#vc-choose',\r\n          intro: loc.TOUR_vccho1,\r\n          position: \"bottom\",\r\n        },\r\n        {\r\n          title: loc.TOUR_vccho2ti,\r\n          element:'#vc-view',\r\n          intro: loc.TOUR_vccho2,\r\n          position: \"bottom\",\r\n        }, \r\n        {\r\n          title: loc.TOUR_vcStat1ti,\r\n          element: doe.querySelector('.statistic'),\r\n          intro: loc.TOUR_vcStat1,\r\n          position: \"left\",\r\n        },\r\n        {\r\n          title: loc.TOUR_vcStat2ti,\r\n          element: doe.querySelector('.stattable'),\r\n          intro: loc.TOUR_vcStat2,\r\n          position: \"bottom\",\r\n        },\r\n        {\r\n          title: loc.TOUR_qlfieldti,\r\n          element: doe.querySelector('#ql-field').parentNode,\r\n          intro: loc.TOUR_qlfield,\r\n          position: \"bottom\",\r\n        },  \r\n        {\r\n          title: loc.TOUR_glimpseti,\r\n          element: doe.querySelector('#glimpse').parentNode,\r\n          intro: loc.TOUR_glimpse,\r\n          position: \"bottom\",\r\n        }, \r\n        {\r\n          title: loc.TOUR_helpti,\r\n          element:'#view-tutorial',\r\n          intro: loc.TOUR_help,\r\n          position: \"bottom\",\r\n        },\r\n        {\r\n          title: loc.TOUR_seargoti,\r\n          element: '#qsubmit',\r\n          intro: loc.TOUR_seargo,\r\n          position: \"bottom\",\r\n        },\r\n        ];\r\n\r\n      //pass in the Steps array created earlier\r\n      intro.setOptions({steps: Steps});      \r\n      this.testPrerequ(Steps, intro);\r\n\r\n      //changes before executing the single steps\r\n      intro.onbeforechange(function(targetedElement){\r\n        switch(targetedElement.id){\r\n        case \"q-field\": \r\n          /* \r\n           * TODO:\r\n           * #268 is not merged at the time beeing: \r\n           * introJs.currentStep() merge requested https://github.com/usablica/intro.js/pull/268/files\r\n           */\r\n            targetedElement.value = loc.TOUR_Qexample;\r\n          break;\r\n        case \"vc-view\":  \r\n          let vchoo = doe.querySelector(\"#vc-choose\");\r\n          let vcv = doe.querySelector(\"#vc-view\");  \r\n          KorAP._delete.apply(KorAP.vc.root());\r\n    \r\n          KorAP.vc.fromJson(loc.TOUR_vcQuery);\r\n          if(!(vcv.querySelector(\".active\"))){\r\n            vchoo.click();\r\n            /*\r\n             * Intro.js caches elements at the beginning, so element and position has to be set again.\r\n             */\r\n            intro._introItems[6].element = doe.querySelector('.statistic');\r\n            intro._introItems[6].position = \"left\";\r\n          }   \r\n          break;   \r\n          \r\n        } \r\n        \r\n        if(this._currentStep == 7){\r\n          let statbut = doe.querySelector('.statistic');\r\n          statbut.click();\r\n          intro._introItems[7].element = doe.querySelector(\".stattable\");\r\n          intro._introItems[7].position = \"bottom\";\r\n        }\r\n      });\r\n\r\n      intro.onbeforeexit(function(){\r\n          if(KorAP.Hint.active() && KorAP.Hint.active().dontHide){\r\n            KorAP.Hint.unshow();\r\n          }\r\n        });\r\n      \r\n      intro.onchange(function(targetElement) {\r\n        var that = this; \r\n        switch(this._currentStep){\r\n        //hides Hint if back button is pressed \r\n        case 2:   \r\n          if(KorAP.Hint.active()){\r\n          KorAP.Hint.unshow(); \r\n          }\r\n          break;\r\n        case 3:\r\n          KorAP.Hint.show(false);\r\n          KorAP.Hint.active().dontHide = true;\r\n          intro._introItems[3].element = doe.querySelector(\".menu.roll.hint\");\r\n          intro._introItems[3].position = doe.querySelector(\"bottom\");\r\n          break;\r\n        case 4: \r\n          KorAP.Hint.unshow();      \r\n          break;\r\n        }\r\n        });  \r\n      \r\n      // Execute at the end of the tour (By clicking at the done-Button)\r\n      intro.oncomplete(function(){\r\n        KorAP.session.set(\"tour\", true);\r\n        doe.getElementById(\"qsubmit\").click();\r\n      });\r\n\r\n      return intro;\r\n    },\r\n\r\n\r\n    /* Guided Tour to explain the different views of the results */     \r\n    gTshowResults: function(elparam){     \r\n    \r\n      let tourR = introClass();\r\n      tourR.setOptions(usabilityOpts);\r\n      \r\n      //for testing purposes\r\n      if(elparam){\r\n        doe = elparam;\r\n      }\r\n      let StepsSR = [\r\n        //Step 1, intro_item 0\r\n        {\r\n          element: '#search',\r\n          intro: loc.TOUR_kwic ,\r\n          position: \"auto\",\r\n        },\r\n        //Step 2, intro_item 1 \r\n        {\r\n          element: doe.querySelector(\"#search > ol > li\"),\r\n          intro: loc.TOUR_snippet,\r\n          position: \"bottom\",\r\n        },\r\n        //Step 3, intro_item 2 \r\n        {\r\n          element: doe.querySelector(\"#search > ol > li\"),\r\n          intro: loc.TOUR_snippetb,\r\n          position: \"bottom\",\r\n        },\r\n        //Step 4, intro_item 3\r\n        {\r\n          element: doe.querySelector(\".action > .metatable\"),\r\n          intro: loc.TOUR_metadatab,\r\n          position: \"bottom\",\r\n        },\r\n        //Step 5, intro_item 4\r\n        {\r\n          element: doe.querySelector(\".view.metatable\"),\r\n          intro: loc.TOUR_metadata,\r\n          position: \"auto\",\r\n        },\r\n        //Step 6, intro_item 5\r\n        {   \r\n          element: doe.querySelector(\".action > .info\"),\r\n          intro: loc.TOUR_tokenb,\r\n          position: \"bottom\",\r\n        },\r\n        //Step 7, intro_item 6\r\n        {   \r\n          element: doe.querySelector(\".view.tokentable\"),\r\n          intro: loc.TOUR_token,\r\n          position: \"auto\",\r\n        },\r\n        //Step 8, intro_item 7\r\n        {     \r\n          element: doe.querySelector(\".tree\"),\r\n          intro: loc.TOUR_treeb,\r\n          position: \"bottom\",\r\n        }, \r\n        //Step 9, intro_item 8\r\n        {     \r\n          element: doe.querySelector(\".view.relations\"),\r\n          intro: loc.TOUR_tree,\r\n          position: \"bottom\",\r\n        }, \r\n        //Step 10, intro_item 9\r\n        {     \r\n          intro: loc.TOUR_tourdone, \r\n        }    \r\n        ]\r\n      \r\n        tourR.setOptions({steps:StepsSR});\r\n        tourR.setOptions(labelOpts);\r\n     \r\n        tourR.onbeforeexit(function(){\r\n          KorAP.session.set(\"tour\", false);\r\n        });\r\n        //See also: https://introjs.com/docs/intro/options/\r\n        tourR.setOption('scrollToElement', true);\r\n        tourR.setOption('scrollTo','tooltip');\r\n        this.testPrerequ(StepsSR, tourR);\r\n      \r\n        //TODO see also: introJS.totalSteps() merge requested: //github.com/usablica/intro.js/pull/268/files\r\n        tourR.onbeforechange(function(targetedElement){\r\n          \r\n        if(this._currentStep == 1){\r\n          KorAP.session.set(\"tour\", false);\r\n        }\r\n        \r\n        if(this._currentStep == 2){\r\n          doe.querySelector(\"#search > ol > li\").click();\r\n          tourR._introItems[3].element = doe.querySelector('.action > .metatable');\r\n          tourR._introItems[3].position = \"bottom\";\r\n        }\r\n  \r\n        if(this._currentStep == 4){\r\n          doe.querySelector(\".metatable\").click();\r\n          tourR._introItems[4].element = doe.querySelector('.view.metatable');\r\n          tourR._introItems[5].element = doe.querySelector('.action > .info');\r\n          tourR._introItems[5].position = \"bottom\";          \r\n        }   \r\n     \r\n        if(this._currentStep == 6){\r\n            doe.querySelector(\".info\").click();\r\n            tourR._introItems[6].element = doe.querySelector('.view.tokentable');\r\n            tourR._introItems[7].element = doe.querySelector('.tree');\r\n            tourR._introItems[7].position = \"bottom\";\r\n          }\r\n      \r\n        if(this._currentStep == 8){\r\n          doe.querySelector(\".tree\").click();\r\n          let collect =  document.querySelectorAll(\".button-group-list\")[0].querySelectorAll('li');\r\n          for(let i = 0;  i < collect.length; i++){\r\n            if (collect[i].innerText == loc.TOUR_Relations) {\r\n              collect[i].click();\r\n              break;\r\n            }\r\n          }\r\n          tourR._introItems[8].element = doe.querySelector(\".view.relations\");\r\n        }\r\n      });       \r\n  \r\n      return tourR;\r\n    },  \r\n    /* \r\n     * The total number of steps and the text of the tooltips are needed for jasmine testing.\r\n     */\r\n    testPrerequ: function(steps, tour){\r\n      //TODO see also: introJS.totalSteps() merge requested: //github.com/usablica/intro.js/pull/268/files\r\n      let StepsT = steps;\r\n      let gtour = tour;      \r\n      gtour.stepCount = StepsT.length;\r\n\r\n      //Array of intro content needed for efficient testing\r\n      gtour.testIntros = [];\r\n\r\n      for(let i = 0; i< StepsT.length; i++){\r\n      gtour.testIntros.push(StepsT[i].intro);\r\n      }\r\n    },\r\n\r\n  }\r\n});\r\n\n\r\n\r\ndefine('plugin/service',[],function () {\r\n\r\n  // Limit the supported sandbox permissions, especially\r\n  // to disallow 'same-origin'.\r\n  let allowed = {\r\n    \"scripts\" : 1,\r\n    \"presentation\" : 1,\r\n    \"forms\": 1,\r\n    \"downloads-without-user-activation\" : 1,\r\n    \"downloads\" : 1\r\n  };\r\n\r\n  return {\r\n    create : function (data) {\r\n      return Object.create(this)._init(data);\r\n    },\r\n\r\n    // Initialize service\r\n    _init : function (data) {\r\n      if (!data || !data[\"name\"] || !data[\"src\"] || !data[\"id\"])\r\n        throw Error(\"Service not well defined\");\r\n\r\n      this.name = data[\"name\"];\r\n      this.src = data[\"src\"];\r\n      this.id = data[\"id\"];\r\n      this.desc = data[\"desc\"];\r\n      let _perm = new Set();\r\n      let perm = data[\"permissions\"];\r\n      if (perm && Array.isArray(perm)) {\r\n        perm.forEach(function (p) {\r\n          if (p in allowed) {\r\n            _perm.add(p)\r\n          }\r\n          else {\r\n            KorAP.log(0, \"Requested permission not allowed\");\r\n          }\r\n        });\r\n      };\r\n\r\n      this._perm = _perm;\r\n      \r\n      // There is no close method defined yet\r\n      if (!this.close) {\r\n        this.close = function () {\r\n          this._closeIframe();\r\n        }\r\n      }\r\n      \r\n      return this;\r\n    },\r\n\r\n    /**\r\n     * The element of the service as embedded in the panel\r\n     */\r\n    load : function () {\r\n      if (this._load)\r\n        return this._load;\r\n\r\n      if (window.location.protocol == 'https:' &&\r\n          this.src.toLowerCase().indexOf('https:') != 0) {\r\n        KorAP.log(0, \"Service endpoint is insecure\");\r\n        return;\r\n      };\r\n\r\n      // Spawn new iframe\r\n      let e = document.createElement('iframe');\r\n      e.setAttribute('allowTransparency',\"true\");\r\n      e.setAttribute('frameborder', 0);\r\n      // Allow forms in Plugins\r\n      e.setAttribute('sandbox', Array.from(this._perm).sort().map(function(i){ return \"allow-\"+i }).join(\" \"));\r\n      e.style.height = '0px';\r\n      e.setAttribute('name', this.id);\r\n      e.setAttribute('src', this.src);\r\n      \r\n      this._load = e;\r\n      return e;\r\n    },\r\n\r\n    /**\r\n     * Send a message to the embedded service.\r\n     */\r\n    sendMsg : function (d) {\r\n      let iframe = this.load();\r\n      iframe.contentWindow.postMessage(\r\n        d,\r\n        '*'\r\n      ); // TODO: Fix origin\r\n    },\r\n\r\n    // onClose : function () {},\r\n\r\n    /**\r\n     * Close the service iframe.\r\n     */\r\n    _closeIframe : function () {\r\n      var e = this._load;\r\n      if (e && e.parentNode) {\r\n        e.parentNode.removeChild(e);\r\n      };\r\n      this._load = null;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * The plugin system is based\r\n * on registered widgets (iframes) from\r\n * foreign services.\r\n * The widget component represents a single iframe and is\r\n * implemented as a view object.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('plugin/widget',[\"view\",\"plugin/service\",\"util\"], function (viewClass, serviceClass) {\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new widget\r\n     */\r\n    create : function (data) {\r\n      return Object.create(viewClass)._init(['widget']).upgradeTo(serviceClass)._init(data).upgradeTo(this)._init();\r\n    },\r\n\r\n    // Initialize widget\r\n    _init : function () {\r\n      this.isWidget = true;\r\n      return this;\r\n    },\r\n\r\n    /**\r\n     * The element of the widget as embedded in the view\r\n     */\r\n    show : function () {\r\n\r\n      if (this._load) {\r\n        if (this._el)\r\n          this._el.classList.add('show');\r\n        return this._load;\r\n      }\r\n\r\n      let obj = this.load();\r\n      this._load.classList.add(\"widget\", \"show\");\r\n      obj.setAttribute('loading', 'lazy');\r\n\r\n      // Per default there should at least be a button\r\n      // for settings, if the plugin requires settings.\r\n      // Otherwise a button indicating this is a plugin\r\n      // is a nice idea as well.\r\n      \r\n      this.actions().add(\r\n        this.name, {'cls':['button-icon', 'plugin']}, function (e) {\r\n\r\n          // Temporary\r\n          let str = this.name;\r\n          if (this.desc !== undefined) {\r\n            str += \"\\n\\n\" + this.desc;\r\n          };\r\n          window.alert(str);\r\n      }.bind(this));\r\n      \r\n      return obj;\r\n    },\r\n\r\n    // Resize iframe\r\n    resize : function (data) {\r\n      this.show().style.height = data.height + 'px';\r\n    },\r\n\r\n\r\n    // On closing the widget view\r\n    onClose : function () {\r\n      if (this._mgr) {\r\n        this._mgr._closeService(this.id);\r\n        this._mgr = undefined;\r\n      };\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Create a state object, that can have a single value\r\n * (mostly boolean) and multiple objects associated to it.\r\n * Whenever the state changes, all objects are informed\r\n * by their setState() method of the value change.\r\n *\r\n * @author Nils Diewald\r\n */\r\n/*\r\n * TODO:\r\n *   Require names for states, that should be quite short, so they\r\n *   can easily be serialized and kept between page turns (via cookie\r\n *   and/or query param)\r\n */\r\n\r\n\r\ndefine('state',[],function () {\r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function (values) {\r\n      return Object.create(this)._init(values);\r\n    },\r\n\r\n\r\n    // Initialize\r\n    _init : function (values) {\r\n      const t = this;\r\n      t._assoc = [];\r\n      if (values == undefined) {\r\n        t.values = [false,true];\r\n      }\r\n      else if (Array.isArray(values)) {\r\n        t.values = values;\r\n      }\r\n      else {\r\n        t.values = [values];\r\n      }\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Associate the state with some objects.\r\n     */\r\n    associate : function (obj) {\r\n\r\n      // Check if the object has a setState() method\r\n      if (obj.hasOwnProperty(\"setState\")) {\r\n        this._assoc.push(obj);\r\n        obj.setState(this.value);\r\n      } else {\r\n        console.log(\"Object \" + obj + \" has no setState() method\");\r\n      }\r\n    },\r\n\r\n\r\n    /**\r\n     * Set the state to a certain value.\r\n     * This will set the state to all associated objects as well.\r\n     */\r\n    set : function (value) {\r\n      if (value != this.value) {\r\n        this.value = value;\r\n        this._assoc.forEach(i => i.setState(value));\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Set the state to a default value.\r\n     * This will only be set, if no other value is set yet.\r\n     */\r\n    setIfNotYet : function (value) {\r\n      if (this.value == undefined) {\r\n        this.set(value);\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the state value\r\n     */\r\n    get : function () {\r\n      if (this.value == undefined) {\r\n        this.value = this.values[0];\r\n      };\r\n\r\n      return this.value;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the number of associated objects\r\n     */\r\n    associates : function () {\r\n      return this._assoc.length;\r\n    },\r\n\r\n\r\n    /**\r\n     * Clear all associated objects\r\n     */\r\n    clear : function () {\r\n      return this._assoc = [];\r\n    },\r\n\r\n\r\n    /**\r\n     * Roll to the next value.\r\n     * This may be used for toggling.\r\n     */\r\n    roll : function () {\r\n      let next = 0;\r\n      for (let i = 0; i < this.values.length - 1; i++) {\r\n        if (this.get() == this.values[i]) {\r\n          next = i+1;\r\n          break;\r\n        };\r\n      };\r\n      this.set(this.values[next]);\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The plugin system is based\r\n * on registered services (iframes) from\r\n * foreign services.\r\n * The server component spawns new iframes and\r\n * listens to them.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('plugin/server',['plugin/widget', 'plugin/service', 'state', 'pageInfo', 'util'], function (widgetClass, serviceClass, stateClass, pageInfoClass) {\r\n\r\n  KorAP.Panel = KorAP.Panel || {};\r\n\r\n  // Contains all servicess to address with\r\n  // messages to them\r\n  var services = {};\r\n  var plugins  = {};\r\n\r\n  // TODO:\r\n  //   These should better be panels and every panel\r\n  //   has a buttonGroup\r\n\r\n  // List of panels with dynamic buttons, i.e.\r\n  // panels that may occur multiple times.\r\n  var buttons = {\r\n    match : []\r\n  };\r\n\r\n  // List of panels with static buttons, i.e.\r\n  // panels that occur only once.\r\n  var buttonsSingle = {\r\n    query : [],\r\n    result : []\r\n  } \r\n  \r\n  // This is a counter to limit acceptable incoming messages\r\n  // to a certain amount. For every message, this counter will\r\n  // be decreased (down to 0), for every second this will be\r\n  // increased (up to 100).\r\n  // Once a widget surpasses the limit, it will be killed\r\n  // and called suspicious.\r\n  var maxMessages = 100;\r\n  var limits = {};\r\n\r\n  // TODO:\r\n  //   It may be useful to establish a watcher that pings\r\n  //   all widgets every second to see if it is still alive,\r\n  //   otherwise kill\r\n  \r\n  // Load Plugin server\r\n  return {\r\n\r\n    /**\r\n     * Create new plugin management system\r\n     */\r\n    create : function () {\r\n      return Object.create(this)._init();\r\n    },\r\n\r\n    /*\r\n     * Initialize the plugin manager\r\n     */\r\n    _init : function () {\r\n      return this;\r\n    },\r\n\r\n    /**\r\n     * Register a plugin described as a JSON object.\r\n     *\r\n     * This is work in progress.\r\n     *\r\n     * Example:\r\n     *\r\n     *   KorAP.Plugin.register({\r\n     *     'name' : 'CatContent',\r\n     *     'desc' : 'Some content about cats',\r\n     *     'about' : 'https://localhost:5678/',\r\n     *     'embed' : [{\r\n     *       'panel' : 'match',\r\n     *       'title' : loc.TRANSLATE,\r\n     *       'classes' : ['translate']\r\n     *       'onClick' : {\r\n     *         'action' : 'addWidget',\r\n     *         'template' : 'https://localhost:5678/?match={matchid}',\r\n     *       }\r\n     *     },{\r\n     *       'title' : 'glemm',\r\n     *       'panel' : 'query',\r\n     *       'onClick' : {\r\n     *         'action' : 'toggle',\r\n     *         'state' : 'glemm',\r\n     *         'service' : {\r\n     *           'id' : 'glemm',\r\n     *           'template' : 'https://localhost:5678/'\r\n     *         }\r\n     *       }\r\n     *     }]\r\n     *   });\r\n     *\r\n     */\r\n    register : function (obj) {\r\n      // TODO:\r\n      //   These fields need to be localized for display by a structure like\r\n      //   { de : { name : '..' }, en : { .. } }\r\n      var name = obj[\"name\"];\r\n\r\n      if (!name)\r\n        throw new Error(\"Missing name of plugin\");\r\n\r\n      var desc = obj[\"desc\"];\r\n      \r\n      // Register plugin by name\r\n      var plugin = plugins[name] = {\r\n        name : name,\r\n        desc : desc,\r\n        about : obj[\"about\"],\r\n        widgets : [],\r\n        services : []\r\n      };\r\n\r\n      if (typeof obj[\"embed\"] !== 'object')\r\n        throw new Error(\"Embedding of plugin is no list\");\r\n \r\n      // Embed all embeddings of the plugin\r\n      var that = this;\r\n      obj[\"embed\"].forEach(function(embed) {\r\n\r\n        if (typeof embed !== 'object')\r\n          throw new Error(\"Embedding of plugin is no object\");\r\n\r\n        // Needs to be localized as well\r\n        let title = embed[\"title\"];        \r\n        let panel = embed[\"panel\"];\r\n        let onClick = embed[\"onClick\"];\r\n        let icon = embed[\"icon\"];\r\n        \r\n        if (!panel || !(buttons[panel] || buttonsSingle[panel]))\r\n          throw new Error(\"Panel for plugin is invalid\"); \r\n\r\n        // The embedding will open a widget\r\n        if (!onClick[\"action\"] ||\r\n            onClick[\"action\"] == \"addWidget\" ||\r\n            onClick[\"action\"] == \"setWidget\") {\r\n          \r\n          let cb = function (e) {\r\n\r\n            // \"this\" is bind to the panel\r\n            // \"this\".button is the button\r\n            // \"that\" is the server object\r\n\r\n            // The button has a state and the state is associated to the\r\n            // a intermediate object to toggle the view\r\n            if ('state' in this.button && this.button.state.associates() > 0) {\r\n\r\n              let s = this.button.state;\r\n\r\n              // The associated service is existent\r\n              if (services[this.button['widgetID']]) {\r\n                s.roll();\r\n                return;\r\n              }\r\n\r\n              // The service is not existent\r\n              else {\r\n\r\n                // Remove broken state associations\r\n                s.clear();\r\n                s.set(true);\r\n              }\r\n            };\r\n\r\n            // Add the widget to the panel\r\n            let id = that.addWidget(this, {\r\n              \"name\": name,\r\n              \"src\": onClick[\"template\"], // that._interpolateURI(onClick[\"template\"], this.match);\r\n              \"permissions\": onClick[\"permissions\"],\r\n              \"desc\":desc\r\n            });\r\n            plugin[\"widgets\"].push(id);\r\n            \r\n            // If a state exists, associate with a mediator object\r\n            if ('state' in this.button) {\r\n              this.button['widgetID'] = id;\r\n              this.button.state.associate({\r\n                setState : function (value) {\r\n                  // Minimize the widget\r\n                  if (value == false) {\r\n                    services[id].minimize();\r\n                  }\r\n                  else {\r\n                    services[id].show();                    \r\n                  };\r\n                }\r\n              });\r\n            }\r\n          };\r\n\r\n\r\n          // Button object\r\n          let obj = {'cls':embed[\"classes\"], 'icon': icon }\r\n\r\n          if (onClick[\"action\"] && onClick[\"action\"] == \"setWidget\") {\r\n\r\n            // Create a boolean state value, that initializes to true == opened\r\n            obj['state'] = stateClass.create([true, false]);\r\n          };\r\n          \r\n          // Add to dynamic button list (e.g. for matches)\r\n          if (buttons[panel]) {\r\n            buttons[panel].push([title, obj, cb]);\r\n          }\r\n\r\n          // Add to static button list (e.g. for query) already loaded\r\n          else if (KorAP.Panel[panel]) {\r\n            KorAP.Panel[panel].actions().add(title, obj, cb);\r\n          }\r\n\r\n          // Add to static button list (e.g. for query) not yet loaded\r\n          else {\r\n            buttonsSingle[panel].push([title, obj, cb]);\r\n          }\r\n        }\r\n\r\n        // TODO There is no possibility to add icons to a plugin toggle button right now. \r\n        else if (onClick[\"action\"] == \"toggle\") {\r\n\r\n          // TODO:\r\n          //   Accept a \"value\" list here for toggling, which should\r\n          //   also allow for \"rolling\" through states via CSS classes\r\n          //   as 'toggle-true', 'toggle-false' etc.\r\n\r\n          let state = stateClass.create([true, false]);\r\n\r\n          if (onClick[\"default\"] !== undefined) {\r\n            state.setIfNotYet(onClick[\"default\"]);\r\n          };\r\n\r\n          // TODO:\r\n          //   Lazy registration (see above!)\r\n          KorAP.Panel[panel].actions().addToggle(title, {'cls':[\"title\"]}, state);\r\n\r\n          // Add the service\r\n          let id = this.addService({\r\n            \"name\" : name,\r\n            // TODO:\r\n            //   Use the \"service\" keyword\r\n            \"src\" : onClick[\"template\"],\r\n            \"permissions\" : onClick[\"permissions\"]\r\n          });\r\n\r\n          // TODO:\r\n          //   This is a bit stupid to get the service window\r\n          let service = services[id];\r\n          let iframe = service.load();\r\n\r\n          // Create object to communicate the toggle state\r\n          // once the iframe is loaded.\r\n          iframe.onload = function () {\r\n            let sendToggle = {\r\n              setState : function (val) {\r\n                service.sendMsg({\r\n                  action: 'state',\r\n                  key : onClick['state'],\r\n                  value : val\r\n                });\r\n              }\r\n            };\r\n\r\n            // Associate object with the state\r\n            state.associate(sendToggle);          \r\n          };\r\n\r\n          plugin[\"services\"].push(id);\r\n        };\r\n      }, this);\r\n    },\r\n\r\n    // TODO:\r\n    //   Interpolate URIs similar to https://tools.ietf.org/html/rfc6570\r\n    //   but as simple as possible\r\n    _interpolateURI : function (uri, obj) {\r\n      // ...\r\n    },\r\n\r\n\r\n    /**\r\n     * Get named button group - better rename to \"action\"\r\n     */\r\n    buttonGroup : function (name) {\r\n      if (buttons[name] != undefined) {\r\n        return buttons[name];\r\n      } else if (buttonsSingle[name] != undefined) {\r\n        return buttonsSingle[name];\r\n      };\r\n      return [];\r\n    },\r\n\r\n    /**\r\n     * Clear named button group - better rename to \"action\"\r\n     */\r\n    clearButtonGroup : function (name) {\r\n      if (buttons[name] != undefined) {\r\n        buttons[name] = [];\r\n      } else if (buttonsSingle[name] != undefined) {\r\n        buttonsSingle[name] = [];\r\n      }\r\n    },\r\n\r\n    // Optionally initialize the service mechanism and get an ID\r\n    _getServiceID : function () {\r\n\r\n      // Is it the first service?\r\n      if (!this._listener) {\r\n\r\n        /*\r\n         * Establish the global 'message' hook.\r\n         */\r\n        this._listener = this._receiveMsg.bind(this);\r\n        window.addEventListener(\"message\", this._listener);\r\n        \r\n        // Every second increase the limits of all registered services\r\n        this._timer = window.setInterval(function () {\r\n          for (let i = 0; i < limits.length; i++) {\r\n            if (limits[i]++ >= maxMessages) {\r\n              limits[i] = maxMessages;\r\n            }\r\n          }\r\n        }, 1000);\r\n      };\r\n\r\n      // Create a unique random ID per service\r\n      return 'id-' + this._randomID();\r\n    },\r\n    \r\n    /**\r\n     * Add a service in a certain panel and return the id.\r\n     */\r\n    addService : function (data) {\r\n      if (!data[\"src\"])\r\n        return;\r\n\r\n      let id = this._getServiceID();\r\n\r\n      data[\"id\"] = id;\r\n\r\n      // Create a new service\r\n      let service = serviceClass.create(data);\r\n      \r\n      services[id] = service;\r\n      limits[id] = maxMessages;\r\n\r\n      // Add service to panel\r\n      this.element().appendChild(\r\n        service.load()\r\n      );\r\n      \r\n      return id;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Open a new widget view in a certain panel and return\r\n     * the id.\r\n     */\r\n    addWidget : function (panel, data) {\r\n      // panel, name, src, permissions\r\n\r\n      let id = this._getServiceID();\r\n\r\n      data[\"id\"] = id;\r\n      \r\n      // Create a new widget\r\n      var widget = widgetClass.create(data);\r\n\r\n      // Store the widget based on the identifier\r\n      services[id] = widget;\r\n      limits[id] = maxMessages;\r\n\r\n      widget._mgr = this;\r\n\r\n      // Add widget to panel\r\n      panel.add(widget);\r\n\r\n      return id;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get service by identifier\r\n     */\r\n    service : function (id) {\r\n      return services[id];\r\n    },\r\n\r\n    \r\n    // Receive a call from an embedded service.\r\n    // The handling needs to be very careful,\r\n    // as this can easily become a security nightmare.\r\n    _receiveMsg : function (e) {\r\n\r\n      // Get event data\r\n      var d = e.data;\r\n\r\n      // If no data given - fail\r\n      // (probably check that it's an assoc array)\r\n      if (!d)\r\n        return;\r\n\r\n      // e.origin is probably set and okay - CHECK!\r\n      // TODO: Check e.origin is in the list of registered participants\r\n      // if (e.origin !== \"http://example.com:8080\")\r\n      //   return;\r\n\r\n      \r\n      // Get origin ID\r\n      var id = d[\"originID\"];\r\n\r\n      // If no origin ID given - fail\r\n      if (!id)\r\n        return;\r\n\r\n      // Get the service\r\n      let service = services[id];\r\n\r\n      // If the addressed service does not exist - fail\r\n      if (!service)\r\n        return;\r\n\r\n      // Check for message limits\r\n      if (limits[id]-- < 0) {\r\n\r\n        // Kill service\r\n        KorAP.log(0, 'Suspicious action by service', service.src);\r\n\r\n        // TODO:\r\n        //   Potentially kill the whole plugin!\r\n\r\n        // This removes all connections before closing the service \r\n        this._closeService(service.id);\r\n\r\n        // if (service.isWidget)\r\n        service.close();\r\n     \r\n        return;\r\n      };\r\n\r\n      // Resize the iframe\r\n      switch (d.action) {\r\n      case 'resize':\r\n        if (service.isWidget)\r\n          service.resize(d);\r\n        break;\r\n\r\n      // Log message from iframe\r\n      case 'log':\r\n        KorAP.log(d.code, d.msg,  service.src);\r\n        break;\r\n\r\n      // Modify pipes\r\n      case 'pipe':\r\n        if (KorAP.Pipe != undefined) {\r\n          if (d.job == 'del') {\r\n            KorAP.Pipe.remove(d.service);\r\n          } else {\r\n            KorAP.Pipe.append(d.service);\r\n          };\r\n        };\r\n        break;\r\n\r\n      // Get information from the embedding platform\r\n      case 'get':\r\n\r\n        // Get KoralQuery\r\n        if (d.key == 'KQ') {\r\n          if (KorAP.koralQuery !== undefined) {    \r\n            d[\"value\"] = KorAP.koralQuery;\r\n          };\r\n        }\r\n\r\n        // Get Query information from form\r\n        else if (d.key == 'QueryForm') {\r\n          let doc = document;\r\n          let v = d[\"value\"] = {};\r\n\r\n          var el;\r\n          if (el = doc.getElementById('q-field')) {\r\n            v[\"q\"] = el.value;\r\n          };\r\n          if (el = doc.getElementById('ql-field')) {\r\n            v[\"ql\"] = el.value;\r\n          };\r\n          if (el = KorAP.vc) {\r\n            v[\"cq\"] = el.toQuery();\r\n          };\r\n        }\r\n\r\n        // Get Query information from parameters\r\n        else if (d.key == 'QueryParam') {\r\n\r\n          // Supported in all modern browsers\r\n          var p = new URLSearchParams(window.location.search);\r\n          let v = d[\"value\"] = {};\r\n          v[\"search\"] = window.location.search; // readonly\r\n          v[\"q\"] = p.get('q');\r\n          v[\"ql\"] = p.get('ql');\r\n          v[\"cq\"] = p.get('cq');\r\n        }\r\n\r\n        // Get pagination information\r\n        else if (d.key == 'Pagination') {\r\n          const pi = pageInfoClass.create();\r\n          let v = d[\"value\"] = {};\r\n          v[\"page\"] = pi.page();\r\n          v[\"total\"] = pi.total();\r\n          v[\"count\"] = pi.count();\r\n        };\r\n\r\n        // data needs to be mirrored\r\n        if (d._id) {\r\n          service.sendMsg(d);\r\n        };\r\n\r\n        break;\r\n\r\n        // Redirect to a different page relative to the current\r\n      case 'redirect':\r\n        const url = new URL(window.location);\r\n\r\n        // Currently this only accepts search parameters\r\n        if (d[\"queryParam\"]) {\r\n          url.search = new URLSearchParams(d[\"queryParam\"]);\r\n        };\r\n\r\n        window.location = url.toString();\r\n        break;\r\n      };\r\n\r\n      // TODO:\r\n      //   Close\r\n    },\r\n\r\n    // Close the service\r\n    _closeService : function (id) {\r\n      delete limits[id];\r\n      \r\n      // Close the iframe\r\n      if (services[id] && services[id]._closeIframe) {\r\n        services[id]._closeIframe();\r\n\r\n        // Remove from list\r\n        delete services[id];\r\n      };\r\n\r\n\r\n      // Remove listeners in case no widget\r\n      // is available any longer\r\n      if (Object.keys(limits).length == 0)\r\n        this._removeListener();\r\n    },\r\n\r\n    // Get a random identifier\r\n    _randomID : function () {\r\n      return randomID(20);\r\n    },\r\n\r\n    // Remove the listener\r\n    _removeListener : function () {\r\n      window.clearInterval(this._timer);\r\n      this._timer = undefined;\r\n      window.removeEventListener(\"message\", this._listener);\r\n      this._listener = undefined;\r\n    },\r\n\r\n    /**\r\n     * Return the service element.\r\n     */\r\n    element : function () {\r\n      if (!this._el) {\r\n        this._el = document.createElement('div');\r\n        this._el.setAttribute(\"id\", \"services\");\r\n      }\r\n      return this._el;\r\n    },\r\n    \r\n    // Destructor, just for testing scenarios\r\n    destroy : function () {\r\n      limits = {};\r\n      Object.keys(services).forEach(\r\n        s => services[s].close()\r\n      );\r\n      services = {};\r\n      Object.keys(buttons).forEach(\r\n        b => buttons[b] = []\r\n      );\r\n      Object.keys(buttonsSingle).forEach(\r\n        b => buttonsSingle[b] = []\r\n      );\r\n\r\n      if (this._el) {\r\n        let e = this._el;\r\n        if (e.parentNode) {\r\n          e.parentNode.removeChild(e);\r\n        };\r\n        this._el = null;\r\n      };\r\n      \r\n      this._removeListener();\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Create a pipe object, that holds a list of services\r\n * meant to transform the KQ passed before it's finally\r\n * passed to the search engine.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\ndefine('pipe',[],function () {\r\n  const notNullRe = new RegExp(\"[a-zA-Z0-9]\");\r\n\r\n  // Trim and check\r\n  function _notNull (service) {\r\n    service = service.trim();\r\n    if (service.match(notNullRe)) {\r\n      return service;\r\n    };\r\n    return null;\r\n  };\r\n  \r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function () {\r\n      const obj = Object.create(this);\r\n      obj._pipe = [];\r\n      return obj;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Append service to pipe.\r\n     */\r\n    append : function (service) {\r\n      service = _notNull(service);\r\n      if (service) {\r\n        this._pipe.push(service);\r\n        this._update();\r\n      };\r\n    },\r\n\r\n    \r\n    /**\r\n     * Prepend service to pipe.\r\n     */\r\n    prepend : function (service) {\r\n      service = _notNull(service);\r\n      if (service) {\r\n        this._pipe.unshift(service);\r\n        this._update();\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Remove service from the pipe.\r\n     */\r\n    remove : function (service) {\r\n      const i = this._pipe.indexOf(service);\r\n      if (i != -1) {\r\n        this._pipe.splice(i, 1);\r\n        this._update();\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * The number of services in the pipe.\r\n     */\r\n    size : function () {\r\n      return this._pipe.length;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return the pipe as a string.\r\n     */\r\n    toString : function () {\r\n      return this._pipe.join(',');\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the pipe value.\r\n     */\r\n    _update : function () {\r\n      if (this.e != null) {\r\n        this.e.setAttribute(\"value\", this.toString());\r\n      };\r\n    },\r\n    \r\n\r\n    /**\r\n     * Return the pipe element.\r\n     */\r\n    element : function () {\r\n      let e = this.e;\r\n      if (e == null) {\r\n        e = this.e = document.createElement('input');\r\n        e.setAttribute(\"type\",\"text\");\r\n        e.setAttribute(\"name\",\"pipe\");\r\n        e.classList.add(\"pipe\");\r\n      };\r\n      return e;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('api',['util'], function () {\r\n\r\n  // TODO:\r\n  // - https://github.com/honza/140medley/blob/master/140medley.js\r\n  // - https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest\r\n  // - https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest\r\n  // - r.addEventListener(\"progress\", updateProgress, false);\r\n  // - http://www.javascriptkit.com/javatutors/loadjavascriptcss.shtml\r\n  // - http://stackoverflow.com/questions/6112744/load-javascript-on-demand\r\n\r\n  // See https://flaviocopes.com/http-request-headers/ for a list of headers\r\n\r\n  KorAP.URL = KorAP.URL !== undefined ? KorAP.URL : '';\r\n  KorAP.API = KorAP.API || {};\r\n\r\n  const legacySigle = new RegExp('^([^_]+)_([^\\\\.]+)\\\\.(.+?)$');\r\n\r\n  /**\r\n   * Retrieve information about a match\r\n   */\r\n  KorAP.API.getMatchInfo = function (match, param, cb) {\r\n\r\n    // match is a KorAP.Match object\r\n    let url = KorAP.URL + '/corpus';\r\n    /*\r\n      url += '/' + match.corpusID;\r\n      url += '/' + match.docID;\r\n      url += '/' + match.textID;\r\n    */\r\n\r\n    // This is for legacy support\r\n    const legacy = legacySigle.exec(match.textSigle);\r\n    let docFragment = \"\";\r\n    if (legacy !== null && legacy[0]) {\r\n      docFragment = legacy[1] + '/' + legacy[2] + '/' + legacy[3];\r\n    }\r\n    else {\r\n      docFragment = match.textSigle;\r\n    }\r\n\r\n    docFragment += '/' + match.matchID;\r\n    url += '/' + docFragment;\r\n\r\n    // { spans: true, layer:x, foundry : y}\r\n    if (param['spans'] == true) {\r\n      url += '?spans=true';\r\n      docFragment += ' +spans ';\r\n      if (param['foundry'] !== undefined) {\r\n\t      url += '&foundry=' + param['foundry'];\r\n        docFragment += param['foundry'];\r\n      };\r\n      if (param['layer'] !== undefined) {\r\n\t      url += '&layer=' + param['layer'];\r\n        docFragment += '/'+param['layer'];\r\n      }\r\n    }\r\n    \r\n    // { spans : false, layer: [Array of KorAP.InfoLayer] }\r\n    else {\r\n      // TODO\r\n      docFragment += ' -spans';\r\n      url += '?spans=false';\r\n    }\r\n\r\n    KorAP.API.getJSON(url, cb, \"MatchInfo: \" + docFragment);\r\n  };\r\n\r\n\r\n  /**\r\n   * Retrieve information about a document.\r\n   */\r\n  KorAP.API.getTextInfo = function (doc, param, cb) {\r\n\r\n    // doc is a KorAP.Match object\r\n    let url = KorAP.URL + '/corpus' + '/' + doc.textSigle;\r\n\r\n    if (param['fields'] !== undefined) {\r\n      url += '?fields='; // TODO!\r\n    }\r\n    else {\r\n      url += '?fields=@all'; // TODO: Maybe '*'?\r\n    }\r\n\r\n    KorAP.API.getJSON(url, cb, \"TextInfo: \" + doc.textSigle);\r\n  };\r\n\r\n\r\n  /**\r\n   * Retrieve information about virtual corpora\r\n   */\r\n  KorAP.API.getCollections = function (cb) {\r\n    KorAP.API.getJSON(KorAP.URL + '/collection', cb, \"CorpusInfo\");\r\n  };\r\n\r\n  \r\n  /**\r\n   * Retrieve information about corpus statistic\r\n   * \r\n   * Example URL:  /corpus?cq=availability+%3D+%2FCC-BY.*%2F+%26+textClass+%3D+%22kultur%22\r\n   * \r\n   * @param cq corpus query (formerly collectionQuery)\r\n   * \r\n   * Adress the MOJO-Endpoint for example with\r\n   * http://localhost:3000/corpus?cq=availability+%3D+%2FCC-BY.*%2F+%26+textClass+%3D+%22kultur%22\r\n   */\r\n  KorAP.API.getCorpStat = function (cq, cb){\r\n  \tlet url  =  KorAP.URL + \"/corpus?cq=\" + encodeURIComponent(cq);\r\n  \tKorAP.API.getJSON(url, cb, \"CorpusInfo: \" + cq);\r\n  };\r\n\r\n\r\n  /**\r\n   * Retrieve a list of all plugin objects to\r\n   * establish in the frontend.\r\n   */\r\n  KorAP.API.getPluginList = function (url, cb) {\r\n    KorAP.API.getJSON(url, cb, \"Plugin-List\")\r\n  };\r\n\r\n  /**\r\n   * General function to communicate JS Objects with the server\r\n   * \r\n   * @param {HTTMLRequestType} requestType Should be \"GET\", \"PUT\", \"POST\" or \"DELETE\"\r\n   * @param {String} url The url that specifies where the JSON file is (\"GET\"), will be (\"PUT\" and \"POST\") or will have been (\"DELETE\")\r\n   * @param {String} title How to store this request in the logs\r\n   * @param {JSObj} jsObj For \"PUT\" and \"POST\". The JS Object that is getting transfered. This function stringifies it.\r\n   * @param {function} returnValueCB For \"GET\". The callback function that receives the retrieved JS object (already parsed) as a parameter, or undefined if none is eligible\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */ \r\n  function _actionJSON (requestType, url, title, jsObj, returnValueCB, errorCB) {\r\n    console.log(arguments);\r\n    const req = new XMLHttpRequest();\r\n    req.open(requestType, url, true); \r\n    // Dispatch global \"window\" event. See Kalamar::Plugin::Piwik\r\n    const reqE = new CustomEvent('korapRequest', {\r\n      bubbles : false,\r\n      detail: {\r\n        \"url\" : url,\r\n        \"title\" : title\r\n      }\r\n    });\r\n    window.dispatchEvent(reqE);\r\n    \r\n    req.setRequestHeader(\"Accept\", \"application/json\");\r\n    req.setRequestHeader(\"Content-Type\", \"application/json\");\r\n    req.setRequestHeader('X-Requested-With', 'XMLHttpRequest');\r\n    req.onload = function () {\r\n      console.log(req.responseText); //TODO this needs to be done also\r\n    }\r\n    req.onreadystatechange = function () {\r\n      /*\r\n\t      States:\r\n\t      0 - unsent (prior to open)\r\n\t      1 - opened (prior to send)\r\n\t      2 - headers received\r\n\t      3 - loading (responseText has partial data)\r\n\t      4 - done\r\n      */\r\n      if (this.readyState == 4) {\r\n\r\n        if (requestType === \"GET\") { //GET\r\n          let retJSObj;\r\n          try {\r\n            retJSObj = JSON.parse(this.responseText);\r\n          }\r\n          catch (e) {\r\n            KorAP.log(0, e);\r\n            console.log(e);\r\n            returnValueCB(undefined);\r\n            return;\r\n          };\r\n\r\n          if (retJSObj !== undefined && retJSObj[\"errors\"] !== undefined) {\r\n            retJSObj[\"errors\"].forEach(\r\n              e => KorAP.log(e[0], e[1] || \"Unknown\")\r\n            );\r\n          }\r\n\r\n          else if (this.status !== 200) {\r\n            KorAP.log(this.status, this.statusText, \"Remote service error (XMLHttpRequest) under URL: \" + url);\r\n          };\r\n\r\n          if (this.status === 200) {\r\n            returnValueCB(retJSObj);\r\n          }\r\n\r\n          else {\r\n            returnValueCB(undefined);\r\n          };\r\n\r\n        } else { // PUT, POST, DELETE\r\n          if (this.status >= 300 || this.status < 200) { //Error\r\n            KorAP.log(this.status, this.statusText, \"Remote service error (XMLHttpRequest) under URL: \" + url);\r\n          };\r\n        };\r\n        // Call the callback function (no matter requestType) if one is given.\r\n        if (typeof(errorCB) === \"function\"){\r\n          errorCB({\r\n            \"status\" : this.status,\r\n            \"statusText\" : this.statusText +\" - \"+ JSON.parse(this.responseText).errors[0].message\r\n          });\r\n        }; \r\n      };\r\n    };\r\n\r\n    /*Set a value for .timeout to use this functionality */\r\n    //req.ontimeout = function () {\r\n    //  KorAP.log(0, 'Request Timeout');\r\n    //};\r\n    if (requestType === \"POST\" || requestType === \"PUT\") {\r\n      console.log(\"JSON: \\n\",JSON.stringify(jsObj));\r\n      console.log(req);\r\n      req.send(JSON.stringify(jsObj));\r\n    } else { //GET, DELETE\r\n      req.send();\r\n    };\r\n  };\r\n\r\n  /**\r\n   * General method to get JSON information.\r\n   * \r\n   * @param {String} url The url at which the JSON File will be located\r\n   * @param {function} returnValueCB The callback function that receives the retrieved JS object (already parsed) as a parameter, or undefined if none is eligible\r\n   * @param {String} title How to store this request in the logs\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */ \r\n  KorAP.API.getJSON = function (url, returnValueCB, title, errorCB) {\r\n    _actionJSON(\"GET\", url, title, undefined, returnValueCB, errorCB);\r\n  };\r\n\r\n  /**\r\n   * General method to put JSON information.\r\n   * \r\n   * @param {String} url The url at which the JSON File will be located\r\n   * @param {JSObj} jsObj The JS object that is getting transfered. This will be stringified\r\n   * @param {String} title How to store this request in the logs\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */ \r\n  KorAP.API.putJSON = function (url, jsObj, title, errorCB) {\r\n    _actionJSON(\"PUT\", url, title, jsObj, undefined, errorCB);\r\n  };\r\n\r\n  /**\r\n   * General method to post JSON information.\r\n   * \r\n   * @param {String} url The url at which the JSON File will be located\r\n   * @param {JSObj} jsObj The JS object that is getting transfered. This will be stringified\r\n   * @param {String} title How to store this request in the logs\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */ \r\n  KorAP.API.postJSON = function (url, jsObj, title, errorCB) {\r\n    _actionJSON(\"POST\", url, title, jsObj, undefined, errorCB);\r\n  };\r\n\r\n  /**\r\n   * General method to delete a file at a specific URL\r\n   * \r\n   * @param {String} url The url at which the to be deleted file is located\r\n   * @param {String} title How to store this request in the logs\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */ \r\n  KorAP.API.deleteJSON = function (url, title, errorCB) {\r\n    _actionJSON(\"DELETE\", url, title, undefined, undefined, errorCB);\r\n  };\r\n\r\n\r\n  // Stored query related functions\r\n\r\n  /**\r\n   * Retrieve saved list of queries\r\n   * \r\n   * @param {function} returnValueCB The callback function that receives the JS object Listof queries, already parsed\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */\r\n  KorAP.API.getQueryList = function (returnValueCB, errorCB){\r\n    KorAP.API.getJSON(KorAP.URL + \"/query/\", returnValueCB, \"getSavedQueryList\", errorCB);\r\n  };\r\n\r\n  /**\r\n   * Retrieve specific saved query by query name\r\n   * \r\n   * @param {String} qn The name of the query to be retrieved. Must be a string\r\n   * @param {function} returnValueCB The callback function that receives the query JS object Object, already parsed\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */\r\n  KorAP.API.getQuery = function (qn, returnValueCB, errorCB){\r\n    KorAP.API.getJSON(KorAP.URL + \"/query/\" + qn, returnValueCB, \"getSavedQuery of name \"+ qn, errorCB);\r\n  };\r\n\r\n  /**\r\n   * Put new query by query name\r\n   * \r\n   * @param {String} qn The name of the new query\r\n   * @param {JSObj} jsObj The query. This will be stringified\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */\r\n  KorAP.API.putQuery = function (qn, jsObj, errorCB){\r\n    KorAP.API.putJSON(KorAP.URL + \"/query/\" + qn, jsObj, \"putQuery of name \"+ qn, errorCB);\r\n  };\r\n\r\n  /**\r\n   * Post new query by query name\r\n   * CAUTION: Currently not supported by the QueryReference Plugin.\r\n   * \r\n   * @param {String} qn The name of the new query\r\n   * @param {JSObj} jsObj The query. This will be stringified\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */\r\n  KorAP.API.postQuery = function (qn, jsObj, errorCB){\r\n    KorAP.API.postJSON(KorAP.URL + \"/query/\" + qn, jsObj, \"postQuery of name \"+ qn, errorCB);\r\n  };\r\n\r\n  /**\r\n   * delete query by query name\r\n   * \r\n   * @param {String} qn The name of the to be deleted query\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */\r\n  KorAP.API.deleteQuery = function (qn, errorCB){\r\n    KorAP.API.deleteJSON(KorAP.URL + \"/query/\" + qn, \"deleteQuery of name \"+ qn, errorCB);\r\n  };\r\n});\r\n\n// See Mojolicious::Plugin::TagHelpers::MailToChiffre\r\ndefine('mailToChiffre',[],function () {\r\n  window.PArok=function(k,c){if(c){k=document.createElement('a');k.href=c}var q=k.search,b=RegExp,f=String.fromCharCode,t='il',x=[],o,n=Math.pow;d=k.pathname.match(/([^\\/]+)\\/([^\\/]+)$/);p=function(u){var a=0,e,g='',m;while(a<u.length){m=u.charAt(a++);if(m.match(/[A-Za-z]/)){g+=f((m<='Z'?90:122)>=(m=m.charCodeAt(0)+13)?m:m-26)}else if(m=='-'){e='';m=u.charAt(a++);while(m.match(/\\d/)){e+=m;m=u.charAt(a++)}a--;g+=f(parseInt(e))}else return}l=g.length;r=Math.abs(673%l-l);g=g.substr(r)+g.substr(0,r);o='';for(i=0;i<l;i++){o+=f(g.charCodeAt(i)^d[1].charCodeAt(d[1].length%(i+1)))}return o};while(q){q=q.replace(/^[\\?\\&]([^\\&]+)/,'');o=b.$1;if(o.match(/^(sid|b?cc|to)=(.+)$/)){if(b.$1=='sid')x.push('to='+p(b.$2)+'@'+p(d[2]));else x.push(b.$1+'='+p(b.$2));}else x.push(o.replace(/\\+/g,' '))}location.href='ma'+t+'to:?'+x.join('&');return false};document.querySelectorAll(\".PArok\").forEach(i=>i.addEventListener(\"click\",function(e){e.preventDefault();window.PArok(false,this.href=='#'?this.getAttribute('data-href'):this.href)}))\r\n});\r\n\n/*\r\n * Initialize The JS frontend part and decorate\r\n * the static HTML data.\r\n *\r\n * @author Nils Diewald\r\n *\r\n * TODO: Create lazy loading of objects including\r\n * - obj.hint()\r\n * - obj.alertify()\r\n * - obj.session()\r\n * - obj.tutorial()\r\n * - obj.vc() // toggle\r\n * - obj.matchCreate() (using webpack)\r\n * - obj.koral() (show result, parse for errors ...)\r\n * - obj.alignment() // toggle\r\n */\r\n\r\n\r\ndefine('init',[\r\n  'match',\r\n  'hint',\r\n  'vc',\r\n  'tutorial',\r\n  'lib/domReady',\r\n  'vc/array',\r\n  'lib/alertify',\r\n  'session',\r\n  'selectMenu',\r\n  'panel/result',\r\n  'panel/query',\r\n  'panel/pagination',\r\n  'tour/tours',\r\n  'plugin/server',\r\n  'pipe',\r\n  'api',\r\n  'mailToChiffre',\r\n  'util',\r\n  'state'\r\n], function (matchClass,\r\n             hintClass,\r\n             vcClass,\r\n             tutClass,\r\n             domReady,\r\n             vcArray,\r\n             alertifyClass,\r\n             sessionClass,\r\n             selectMenuClass,\r\n             resultPanelClass,\r\n             queryPanelClass,\r\n             paginationPanelClass,\r\n             tourClass,\r\n             pluginClass,\r\n             pipeClass) {\r\n\r\n  const d = document;\r\n\r\n  // Set base URL\r\n  KorAP.URL = d.body.getAttribute('data-korap-url') || \"\";\r\n\r\n  // Get koralQuery response\r\n  const kqe = d.getElementById('koralQuery');\r\n  if (kqe !== null) {\r\n    KorAP.koralQuery = JSON.parse(kqe.getAttribute('data-koralquery') || \"\");\r\n  };\r\n  \r\n  // Create suffix if KorAP is run in a subfolder\r\n  KorAP.session = sessionClass.create(\r\n    KorAP.URL.length > 0 ? 'kalamarJS-' + KorAP.URL.slugify() : 'kalamarJS'\r\n  );\r\n\r\n  // Override KorAP.log\r\n  window.alertify = alertifyClass;\r\n  KorAP.log = function (code, msg, src) {\r\n\r\n    if (src) {\r\n      msg += '<code class=\"src\">'+src+'</code>';\r\n    };\r\n\r\n    // Use alertify to log errors\r\n    alertifyClass.log(\r\n      (code === 0 ? '' : code + ': ') +\r\n        msg,\r\n      'error',\r\n      10000\r\n    );\r\n  };\r\n\r\n  KorAP.vc = vcClass.create(vcArray); \r\n\r\n  let gt;\r\n  if (gt = document.getElementById('link-guided-tour')) {\r\n    gt.setAttribute('href', '#');\r\n    gt.addEventListener('click', function(){\r\n      tourClass.gTstartSearch().start();\r\n    });\r\n    \r\n    KorAP.tourshowR = function(){\r\n      tourClass.gTshowResults().start();\r\n    };\r\n  };\r\n\r\n  domReady(function (event) {\r\n      \r\n    var obj = {};\r\n\r\n    // What should be visible in the beginning?\r\n    var show = KorAP.session.get('show') || {};\r\n    \r\n    KorAP.Panel = KorAP.Panel || {}\r\n\r\n    /**\r\n     * Release notifications\r\n     */\r\n    d.querySelectorAll('#notifications div.notify').forEach(\r\n      function(e) {\r\n        let msg = e.textContent;\r\n\r\n        let src = e.getAttribute('data-src');\r\n        if (src) {\r\n          msg += '<code class=\"src\">'+src+'</code>';\r\n        };\r\n\r\n        let type = e.getAttribute('data-type') || \"error\";\r\n        alertifyClass.log(msg, type, 10000);\r\n      }\r\n    );\r\n\r\n    /**\r\n     * Replace Virtual Corpus field\r\n     */\r\n    var vcname, vcchoose;\r\n    var input = d.getElementById('cq');\r\n\r\n    var vc = KorAP.vc;\r\n    \r\n    // Add vc name object\r\n    if (input) {\r\n      input.style.display = 'none';\r\n      vcname = d.createElement('span');\r\n      vcname.setAttribute('id', 'vc-choose');\r\n      vcname.classList.add('select');\r\n\r\n      // Load virtual corpus object\r\n      // Supports \"collection\" for legacy reasons\r\n      if (KorAP.koralQuery !== undefined && (KorAP.koralQuery[\"collection\"] || KorAP.koralQuery[\"corpus\"])) {\r\n        try {\r\n          vc.fromJson(KorAP.koralQuery[\"collection\"] || KorAP.koralQuery[\"corpus\"]);\r\n        }\r\n        catch (e) {\r\n          KorAP.log(0,e);\r\n        }\r\n      };\r\n\r\n      vcchoose = vcname.addE('span');\r\n      vcchoose.addT(vc.getName());\r\n\r\n      if (vc.wasRewritten()) {\r\n        vcchoose.classList.add('rewritten');\r\n      };\r\n\r\n      input.parentNode.insertBefore(vcname, input);\r\n    };\r\n\r\n    /**\r\n     * Add actions to match entries\r\n     */\r\n    var matchElements = d.querySelectorAll(\r\n      '#search > ol > li'\r\n    );\r\n\r\n    matchElements.forEach(function(e) {\r\n\r\n      // Define class for active elements\r\n      if (e.classList.contains('active')) {\r\n        if (e._match === undefined) {\r\n          // lazyLoad\r\n          matchClass.create(e).init();\r\n        };\r\n      }\r\n\r\n      // Define class for inactive elements\r\n      else {\r\n        e.addEventListener('click', function (e) {\r\n          if (this._match !== undefined)\r\n            this._match.open();\r\n          else {\r\n            // lazyLoad\r\n            matchClass.create(this).open();\r\n          };\r\n          // This would prevent the sidebar to go back\r\n          // e.halt();\r\n        });\r\n        e.addEventListener('keydown', function (e) {\r\n          var code = _codeFromEvent(e);\r\n          \r\n          switch (code) {\r\n          case 32:\r\n            if (this._match !== undefined)\r\n              this._match.toggle();\r\n            else {\r\n              // lazyLoad\r\n              matchClass.create(this).open();\r\n            };\r\n            e.halt();\r\n            break;\r\n          };\r\n        });\r\n      };\r\n    });\r\n    \r\n    // Add focus listener to aside\r\n    var aside = d.getElementsByTagName('aside')[0];\r\n\r\n    if (aside && aside.classList.contains('active') == false) {\r\n\r\n      // Horrible lock to deal with sidebar clicks\r\n      var asideClicked = false;\r\n      \r\n      // Make aside active on focus\r\n      aside.addEventListener('focus', function(e) {\r\n        this.classList.add('active');\r\n      });\r\n\r\n      // Deactivate focus when clicking anywhere else\r\n      var body = d.getElementsByTagName('body')[0];\r\n      if (body !== null) {\r\n        body.addEventListener('click', function() {\r\n          if (!asideClicked) {\r\n            aside.classList.remove('active');\r\n          }\r\n          else {\r\n            asideClicked = false;\r\n          };\r\n        });\r\n      };\r\n\r\n      /* Stop click event on aside\r\n       * (to not trickle down to body)\r\n       */\r\n      aside.addEventListener('click', function(e) {\r\n        asideClicked = true;\r\n      });\r\n    };\r\n\r\n      \r\n    // Replace QL select menus with KorAP menus\r\n    var qlField = d.getElementById('ql-field');\r\n    if (qlField !== null) {\r\n      KorAP.QLmenu = selectMenuClass.create(\r\n        d.getElementById('ql-field').parentNode\r\n      ).limit(5);\r\n    };\r\n\r\n    var resultInfo = d.getElementById('resultinfo');\r\n\r\n    /**\r\n     * Add result panel\r\n     */\r\n    var resultPanel = resultPanelClass.create(show);\r\n   \r\n    if (resultInfo != null) {\r\n\r\n      // Move buttons to resultinfo\r\n      resultInfo.appendChild(resultPanel.actions().element());\r\n\r\n      // The views are at the top of the search results\r\n      var sb = d.getElementById('search');\r\n      sb.insertBefore(resultPanel.element(), sb.firstChild);\r\n    };\r\n\r\n    \r\n    // There is a koralQuery\r\n    if (KorAP.koralQuery !== undefined) {    \r\n\r\n      // Add KoralQuery view to result panel\r\n      if (resultInfo !== null) {\r\n        resultPanel.addKqAction()\r\n      };\r\n\r\n      if (KorAP.koralQuery[\"errors\"]) {\r\n        KorAP.koralQuery[\"errors\"].forEach(function(e) {\r\n\r\n          // Malformed query\r\n          if (e[0] === 302 && e[2] !== undefined) {\r\n            obj.hint = hintClass.create();\r\n            obj.hint.alert(e[2], e[1]);\r\n          }\r\n\r\n          // no query\r\n          else if (e[0] === 301) {\r\n            obj.hint = hintClass.create();\r\n            obj.hint.alert(0, e[1]);      \r\n          }\r\n        });\r\n      };\r\n    };\r\n\r\n    \r\n    /*\r\n     * There is more than 0 matches, so allow for\r\n     * alignment toggling (left <=> right)\r\n     */\r\n    if (matchElements.length > 0)\r\n      resultPanel.addAlignAction();\r\n\r\n    KorAP.Panel['result'] = resultPanel;\r\n    /*\r\n     * Toggle the Virtual Corpus builder\r\n     */\r\n    if (vcname) {\r\n      vc.onMinimize = function () {\r\n        vcname.classList.remove('active');\r\n        delete show['vc'];\r\n      };\r\n\r\n      vc.onOpen = function () {\r\n        vcname.classList.add('active');\r\n\r\n        var view = d.getElementById('vc-view');\r\n        if (!view.firstChild)\r\n          view.appendChild(this.element());\r\n        \r\n        show['vc'] = true;\r\n      };\r\n      \r\n      var vcclick = function () {\r\n        if (vc.isOpen()) {\r\n          vc.minimize()\r\n        }\r\n        else {\r\n          vc.open();\r\n        };\r\n      };\r\n\r\n      vcname.onclick = vcclick;\r\n\r\n      // Click, if the VC should be shown\r\n      if (show['vc']) {\r\n        vcclick.apply();\r\n      };\r\n    };\r\n\r\n    \r\n    /**\r\n     * Init Tutorial view\r\n     */\r\n    if (d.getElementById('view-tutorial')) {\r\n      window.tutorial = tutClass.create(\r\n        d.getElementById('view-tutorial'),\r\n        KorAP.session\r\n      );\r\n      obj.tutorial = window.tutorial;\r\n    }\r\n\r\n    // Tutorial is in parent\r\n    else if (window.parent) {\r\n      obj.tutorial = window.parent.tutorial;\r\n    };\r\n\r\n    // Initialize queries for d\r\n    if (obj.tutorial) {\r\n      obj.tutorial.initQueries(d);\r\n\r\n      // Initialize documentation links\r\n      obj.tutorial.initDocLinks(d);\r\n    };\r\n\r\n\r\n    /**\r\n     * Add VC creation on submission.\r\n     */\r\n    var form = d.getElementById('searchform');\r\n    if (form !== null) {\r\n      form.addEventListener('submit', function (e) {\r\n        var qf = d.getElementById('q-field');\r\n        \r\n        // No query was defined\r\n        if (qf.value === undefined || qf.value === '') {\r\n          qf.focus();\r\n          e.halt();\r\n          KorAP.log(700, \"No query given\");\r\n          return;\r\n        };\r\n        \r\n        // Store session information\r\n        KorAP.session.set(\"show\", show);\r\n\r\n        if (vc !== undefined) {\r\n          input.value = vc.toQuery();\r\n          if (input.value == '')\r\n            input.removeAttribute('name');\r\n        }\r\n        else {\r\n          input.removeAttribute('value');\r\n          input.removeAttribute('name');\r\n        };\r\n\r\n        // This would preferably set the query to be \"disabled\",\r\n        // but in that case the query wouldn't be submitted\r\n        // at all.\r\n        // Setting the cursor to \"progress\" fails in current versions\r\n        // of webkit.\r\n        qf.classList.add(\"loading\");\r\n        d.getElementById('qsubmit').classList.add(\"loading\");\r\n      });\r\n    };\r\n \r\n    \r\n    //Starts the guided tour at the next page\r\n    if(KorAP.session.get(\"tour\")){\r\n      tourClass.gTshowResults().start();\r\n    }\r\n    \r\n    /**\r\n     * Init hint helper\r\n     * has to be final because of\r\n     * reposition\r\n     */\r\n    // Todo: Pass an element, so this works with\r\n    // tutorial pages as well!\r\n    if (obj.hint === undefined)\r\n      obj.hint = hintClass.create();\r\n\r\n    // Add the hinthelper to the KorAP object to make it manipulatable globally\r\n    KorAP.Hint = obj.hint;\r\n\r\n\r\n    /**\r\n     * Add query panel\r\n     */\r\n    var queryPanel = queryPanelClass.create();\r\n\r\n    // Get input field\r\n    var sform = d.getElementById(\"searchform\");\r\n    var vcView = d.getElementById('vc-view')\r\n    if (sform && vcView) {\r\n      // The views are below the query bar\r\n      sform.insertBefore(queryPanel.element(), vcView);\r\n      KorAP.Panel['query'] = queryPanel;\r\n    };\r\n\r\n\r\n    /**\r\n     * Add pagination panel\r\n     */\r\n    const paginationPanel = paginationPanelClass.create();\r\n\r\n    if (paginationPanel) {\r\n      paginationPanel.addRandomPage();\r\n      KorAP.Panel['pagination'] = paginationPanel;\r\n    };\r\n\r\n\r\n    /**\r\n     * Initialize password toggle.\r\n     */\r\n    initCopyToClipboard(d);\r\n\r\n      \r\n    /**\r\n     * Initialize password toggle.\r\n     */\r\n    initTogglePwdVisibility(d);\r\n      \r\n    /**\r\n     * Initialize Plugin registry.\r\n     */\r\n    let pe;\r\n    if (pe = d.getElementById(\"kalamar-plugins\")) {\r\n      let url = pe.getAttribute('data-plugins');\r\n      if (url !== undefined) {\r\n        KorAP.API.getPluginList(url, function (json) {\r\n          if (json && json.length > 0) {\r\n            // Load Plugin Server first\r\n            KorAP.Plugin = pluginClass.create();\r\n\r\n            // Add services container to head\r\n            d.head.appendChild(KorAP.Plugin.element());\r\n\r\n            // Add pipe form\r\n            KorAP.Pipe = pipeClass.create();\r\n            d.getElementById(\"searchform\").appendChild(KorAP.Pipe.element());\r\n            \r\n            try {\r\n              \r\n              // Register all plugins\r\n              json.forEach(i => KorAP.Plugin.register(i));\r\n            }\r\n            catch (e) {\r\n              KorAP.log(0, e);\r\n            }\r\n          }\r\n        });\r\n      };\r\n    };\r\n      \r\n    return obj;\r\n  });\r\n  \r\n});\r\n\nwindow.KorAP = window.KorAP || {};\r\nKorAP.Locale = KorAP.Locale || {};\r\nrequire(['loc/dereko', 'init']);\r\n\ndefine(\"app/en\", function(){});\n\n}());"]}