{"version":3,"sources":["public/js/kalamar-0.43.1-de.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","ADDTREE","SHOWANNO","SHOWINFO","DOWNLOAD","TOGGLE_ALIGN","SHOW_KQ","SHOW_META","NEW_QUERY","NEW_CONSTRAINT","TOUR_lprev","TOUR_lnext","TOUR_ldone","TOUR_ldoneSearch","TOUR_welcti","TOUR_welc","TOUR_sear1ti","TOUR_sear1","TOUR_searAnnotti","TOUR_searAnnot","TOUR_annotAssti","TOUR_annotAss","TOUR_vccho1ti","TOUR_vccho1","TOUR_vccho2ti","TOUR_vccho2","TOUR_vcStat1ti","TOUR_vcStat1","TOUR_vcStat2ti","TOUR_vcStat2","TOUR_qlfieldti","TOUR_qlfield","TOUR_glimpseti","TOUR_glimpse","TOUR_helpti","TOUR_help","TOUR_seargoti","TOUR_seargo","TOUR_kwic","TOUR_snippet","TOUR_snippetb","TOUR_metadatab","TOUR_metadata","TOUR_tokenb","TOUR_token","TOUR_treeb","TOUR_tree","TOUR_tourdone","RANDOM_PAGE","foundry","_foundry","layer","_layer","addTree","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","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","matchtree","h6","_tree","treeObj","body","treeItemClass","tableView","metaView","relationsView","buttonGroupMenuClass","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","aRoll","opened","_opened","clearButtonGroup","addKqAction","kqButton","_kq","addAlignAction","olCl","nn","ds","dataset","total","count","pageInfoClass","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","labelOpts","usabilityOpts","doe","gTstartSearch","elparam","Steps","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('loc/de',[],function () {\r\n  const loc = KorAP.Locale;\r\n  loc.OR = 'oder';\r\n  loc.AND = 'und';\r\n  // EMPTY, DELETE\r\n\r\n  // Virtual corpus:\r\n  loc.VC_allCorpora = 'allen Korpora';\r\n  loc.VC_oneCollection = 'einem virtuellen Korpus';\r\n\r\n  // Regex:\r\n  loc.REGEX_DESC = loc.REGEX_DESC || 'Regulären Ausdruck verwenden';\r\n\r\n  // Date picker:\r\n  loc.WDAY = ['Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa', 'So'];\r\n  loc.MONTH = [\r\n    'Januar', 'Februar', 'März', 'April',\r\n    'Mai', 'Juni', 'Juli', 'August',\r\n    'September', 'Oktober', 'November',\r\n    'Dezember'\r\n  ];\r\n\r\n  // Match view\r\n  loc.ADDTREE   = 'Relationen';\r\n  loc.SHOWANNO  = 'Token';\r\n  loc.SHOWINFO  = 'Informationen';\r\n  loc.CLOSE     = 'Schließen';\r\n  loc.MINIMIZE  = 'Zuklappen';\r\n  loc.DOWNLOAD  = 'Herunterladen';\r\n  loc.TOGGLE_ALIGN = 'tausche Textausrichtung';\r\n  loc.SHOW_KQ      = 'zeige KoralQuery';\r\n  loc.SHOW_META    = 'Metadaten';\r\n  loc.NEW_QUERY = 'Neue Anfrage';\r\n  \r\n  //Corpus statistic\r\n  loc.SHOW_STAT = 'Korpusstatistik';\r\n  loc.REFRESH = 'Neu laden';\r\n \r\n  loc.NEW_CONSTRAINT = 'Neue Bedingung';\r\n\r\n  //Guided Tour:Buttonlabels\r\n  loc.TOUR_lprev = \"Zurück\";\r\n  loc.TOUR_lnext = \"Weiter\";\r\n  loc.TOUR_ldone = \"Beenden\";\r\n  loc.TOUR_ldoneSearch = \"Suchen\";\r\n  //Guided Tour: Steps\r\n  loc.TOUR_welcti = \" <span class='tgreeting'> Willkommen zur KorAP Tour! </span>\";\r\n  loc.TOUR_welc = \"Hier zeigen wir Ihnen einige wichtige Funktionalitäten von KorAP. \" +\r\n                  \"Wir führen Sie Schritt für Schritt anhand eines Beispiels durch die Anwendung.\";\r\n  \r\n  loc.TOUR_sear1ti = \"Suchanfrage\";\r\n  loc.TOUR_sear1 = \"Hier können Sie die Suchanfrage eingeben, zum Beispiel die Suche nach '\" + loc.TOUR_Qexample + \"'.\" ;\r\n  loc.TOUR_searAnnotti = \"Annotationsassistent (1)\";\r\n  loc.TOUR_searAnnot =\"<p> Für die Suche nach Annotationen steht der Annotationsassistent zur Verfügung. </p> \" +\r\n            \"<p> Er wird ausgewählt, in dem Sie auf den kleinen orangen Balken unter dem Sucheingabefenster klicken \" +\r\n            \"oder die Pfeiltaste nach unten &darr; betätigen. </p>\";\r\n  loc.TOUR_annotAssti = \"Annotationsassistent (2)\";\r\n  loc.TOUR_annotAss = \"Der Annotationsassistent erleichert die Formulierung von Suchanfragen mit Annotationen.\";\r\n  loc.TOUR_vccho1ti = \"Auswahl der Korpora\",\r\n  loc.TOUR_vccho1 = \"Hier gelangen Sie zum Korpusassistenten.\";\r\n  loc.TOUR_vccho2ti = \"Korpusassistent\",\r\n  loc.TOUR_vccho2 = \"Im Korpusassistenten ist die Definition von Subkorpora durch die Verknüpfung beliebiger Metadatenfelder möglich.\";\r\n  loc.TOUR_vcStat1ti =  \"Korpusstatistik (1)\",\r\n  loc.TOUR_vcStat1 = \"Anzeige der Korpusstatistik.\";\r\n  loc.TOUR_vcStat2ti = \"Korpusstatistik (2)\",\r\n  loc.TOUR_vcStat2 = \"Hier sehen sie die Korpusstatistik.\";\r\n  loc.TOUR_qlfieldti =  \"Suchanfragen\",\r\n  loc.TOUR_qlfield = \"In KorAP können mehrere Suchanfragesprachen verwendet werden. Welche Sie verwenden wollen, wählen Sie hier aus.\";\r\n  loc.TOUR_glimpseti = \"Glimpse\",\r\n  loc.TOUR_glimpse = \"Durch das Aktivieren dieser Option legen Sie fest, dass nur die ersten Treffer in undefinierter Reihenfolge angezeigt werden.\";\r\n  loc.TOUR_helpti = \"Hilfe\",\r\n  loc.TOUR_help = \"Hier finden Sie die Hilfe zu KorAP.\";\r\n  loc.TOUR_seargoti = \"Suche\",\r\n  loc.TOUR_seargo = \"Durch das Klicken auf das Lupensymbol wird die Suchanfrage gestartet.\";\r\n    \r\n  //Guided Tour: explain the result\r\n  loc.TOUR_kwic = \"Anzeige des Ergebnisses als KWIC (keyword in context).\";\r\n  loc.TOUR_snippet = \"Durch Klicken auf das KWIC kann ein größerer Kontext angezeigt werden.\";  \r\n  loc.TOUR_snippetb = \"Anzeige des Snippets\";\r\n  loc.TOUR_metadatab = \"Durch die Auswahl des Buttons werden die Metadaten angezeigt.\";\r\n  loc.TOUR_metadata = \"Anzeige der Metadaten\";\r\n  loc.TOUR_tokenb = loc.TOUR_tokenb || \"Anzeige der Token-Annotationen\";\r\n  loc.TOUR_token = loc.TOUR_token || \"KorAP unterstützt multiple Annotationen.\";\r\n  loc.TOUR_treeb = loc.TOUR_tree || \"Anzeige weiterer Ansichten\"\r\n  loc.TOUR_tree = loc.TOUR_tree || \"Weitere Ansichten können als Baum- oder Bogenansichten angezeigt werden.\";\r\n  loc.TOUR_tourdone = \"Viel Spaß mit KorAP!\";\r\n\r\n  // Pagination panel\r\n  loc.RANDOM_PAGE = 'Zufallsseite';\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', 'loc/de', 'init']);\r\n\ndefine(\"app/de\", function(){});\n\n}());"]}