{"version":3,"sources":["public/js/kalamar-0.43.0-en.js"],"names":["requirejs","require","define","undef","main","req","makeMap","handlers","defined","waiting","config","defining","hasOwn","Object","prototype","hasOwnProperty","aps","slice","jsSuffixRegExp","hasProp","obj","prop","call","normalize","name","baseName","nameParts","nameSegment","mapValue","foundMap","lastIndex","foundI","foundStarMap","starI","i","j","part","baseParts","split","map","starMap","length","nodeIdCompat","test","replace","charAt","concat","splice","join","makeRequire","relName","forceSync","args","arguments","push","apply","makeLoad","depName","value","callDep","Error","splitPrefix","prefix","index","indexOf","substring","makeRelParts","makeConfig","relParts","plugin","parts","relResourceName","f","n","pr","p","exports","e","module","id","uri","deps","callback","cjsModule","ret","usingExports","callbackType","load","undefined","alt","setTimeout","cfg","_defined","amd","jQuery","window","KorAP","Event","halt","this","stopPropagation","preventDefault","_quoteRE","RegExp","String","quote","_escapeRE","escapeRegex","_slug1RE","_slug2RE","_removeChildren","node","firstChild","removeChild","_codeFromEvent","keyCode","charCode","_dec2hex","dec","toString","substr","slugify","toLowerCase","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","upgradeTo","props","content","_content","action","_action","lcField","_lcField","active","bool","element","noMore","_el","li","onclick","bind","highlight","_prefix","lowlight","children","childNodes","_highlight","marks","getElementsByTagName","parentNode","replaceChild","nodeValue","elem","prefixString","nodeType","textlc","prefixes","trim","testPos","pos","len","forEach","insertBefore","hl","third","thirdE","t","_onclick","textContent","m","menu","hide","_menu","_string","_update","innerHTML","isSet","string","clear","chop","param","reset","_length","limit","_limit","_active","movetoRel","relativePos","relativeOffset","_rulerHeight","_sliderHeight","off","offset","parseInt","_screens","_event","initOffset","screen","movetoAbs","absPos","absOffset","_offset","_slider","style","top","_step","reInit","s","display","_height","height","el","setAttribute","_ruler","addEventListener","_mouseclick","_mousedown","_initClientHeight","clientHeight","_mousemove","clientY","init","_mouseup","removeEventListener","mov","up","focus","ev","getClientRects","defaultItemClass","defaultPrefixClass","defaultLengthFieldClass","sliderClass","list","_notItemElements","_itemClass","_lengthField","outline","_keydown","_keypress","_mousewheel","_touch","_items","Array","readItems","dontHide","_list","removeItems","liveLength","_firstActive","position","append","item","data","_initList","_boundary","prefixList","maxPoints","it","points","destroy","delta","deltaY","next","prev","slider","_lastTouch","touches","to","viewDown","viewUp","pageUp","pageDown","liveItem","show","fromCharCode","nr","_showItems","itemClass","_unmark","newOffset","onHide","pref","lengthField","liElements","ignoredCount","shownItem","newItem","_append","lastChild","_prepend","shown","menuClass","_left","_below","_outside","openAt","left","below","outside","panel","panelVar","_panel","button","btn","_button","_repos","_onscroll","title","cb","that","b","_bind","blur","bounding","getBoundingClientRect","pageXOffset","right","bottom","width","clientWidth","treeMenuClass","classes","adopt","_omBelow","_omOutside","_omLeft","anchor","_anchor","_insert","span","addList","addToggle","state","check","setState","associate","roll","buttonGroupClass","_bool","_add","parent","ldType","operation","newAfter","wrapOnRoot","wrap","DEL","_and","_or","_delete","delOperand","update","clean","and","or","del","op","cls","_del","_parent","operatorsClass","__changed","_ldType","_ops","refTo","_operands","group","root","operators","toJson","@type","rewrites","incomplete","toQuery","jsonldClass","_validRewriteOpRE","json","fromJson","_src","_op","scope","attr","_scope","str","toUpperCase","rewriteClass","comments","rewriteText","rewrite","REGEX","REGEX_DESC","a","regexOp","regex","_regexOp","_regex","__regexOp","toggleRegex","val","_value","_input","store","r","re","_inField","rewriteListClass","stringValClass","EMPTY","refTitle","refE","_refE","ref","_changeRef","_rewrites","vc","dispatchEvent","CustomEvent","detail","_ref","_changed","strElem","replaceOperand","docGroupRefClass","errstr802","_obj","keyE","_keyE","_changeKey","key","k","matchopE","_matchopE","matchop","_changeMatchop","valueE","_valueE","_changeValue","replaceWith","_vcKeyMenu","typeOf","_validUnspecMatchRE","_validStringMatchRE","_validTextMatchRE","_validDateRE","_validDateMatchRE","errstr804","_key","released","doc","match","_type","_matchop","_vcMatchopMenu","mo","dp","_vcDatePicker","fromString","selected","input","docClass","newDoc","keyType","ellipsis","unspecClass","_validGroupOpRE","docGroupClass","operand","_duplicate","find","dupl","docGroup","operands","docGroupRef","getOperand","oldOp","newOp","reverse","opArray","brackets","filter","_name","release","prefixClass","_cb","found","statistic","_statistic","statDL","statSp","statDT","statDD","keys","Number","toLocaleString","WDAY","MONTH","d","_selected","select","year","month","day","_showYear","_showMonth","_showDay","set","_store","_click","dir","today","Date","getYear","getMonth","_monthHelper","_yearHelper","_dayHelper","_stringHelper","_updateYear","_updateMonth","_updateDay","getDate","incrYear","decrYear","incrMonth","decrMonth","_yElement","_selectYear","_mElement","_selectMonth","table","tr","_dBElement","_dayBody","showDate","date","click","setDate","getDay","tb","td","getFullYear","newBody","views","_classes","c","_actions","prepend","actions","_viewE","aElem","_viewElement","view","afterEmbed","delView","CLOSE","_shown","close","minimize","onClose","viewClass","statClass","buttonGroup","REFRESH","getvc","getStatistic","getCorpStat","statResponse","notif","_show","statTable","checkStatActive","newString","oldString","oldvcQuery","startsWith","disableStat","statt","getElementsByClassName","btg","reloadCorpStat","panelClass","corpStatVClass","SHOW_STAT","VERB_SHOWSTAT","addCorpStat","statView","unspecDocClass","dpClass","buttonGrClass","vcPanelClass","_validTextOnlyMatchRE","_overrideStyles","VC_allCorpora","VC_oneCollection","MINIMIZE","keyList","insertRule","l","unshift","_root","wasRewritten","builder","_builder","addVcInfPanel","isOpen","open","onOpen","onMinimize","getName","addRequired","vcClass","TOUR_Qexample","TOUR_vcQuery","TOUR_Relations","foundry","_foundry","layer","_layer","addTree","NEW_QUERY","esc","_getKeyValue","keyValue","_getAnnotation","target","orGroup","sort","innerText","matchTable","Node","_query","_matchTable","clickOnAnno","_queryFragment","toQueryBar","_ql","getElementById","_q","event","currentTarget","sib","annotation","tagName","previousSibling","toggleInToken","parentCell","nextSibling","from","keyvaluepair","_addToToken","term","token","arr","lastIndexOf","_removeFromToken","distance","ql","options","scrollTo","matchQueryCreator","_TermRE","snippet","html","_pos","_token","_mark","_markE","_cutted","_info","_parse","_matchCreator","toMark","scrollIntoView","inline","block","getToken","getValue","mark","newMark","hasAttribute","exec","getAttribute","$2","$1","$3","hasChildNodes","addCell","surface","tbody","cell","_AvailableRE","matchTableClass","infoLayerClass","_match","matchtable","getData","tokens","getTokens","getMatchInfo","spans","matchResponse","_table","_doc","NEW_CONSTRAINT","isEmpty","_frag","documents","vcFragmentClass","meta","_vc","_meta","Conf","clickOnMeta","_fragment","toVcBuilder","previousElementSibling","uriRE","mapRE","url","decodeURIComponent","payload","start","base64","isLink","contentType","atob","cbmClass","attClass","METADATA","fields","_fields","metaDL","posInMetaArray","metaL","dt","metaDescr","metaDD","att","field","md","_corpusByMatch","matchMetaClass","metaTable","getTextInfo","textResponse","global","self","dagre","o","u","code","1","graphlib","layout","debug","util","time","notime","version","./lib/debug","./lib/graphlib","./lib/layout","./lib/util","./lib/version","2","_","greedyFAS","run","g","fas","graph","acyclicer","edge","weight","weightFn","stack","visited","dfs","has","each","outEdges","w","nodes","dfsFAS","label","removeEdge","forwardName","reversed","setEdge","uniqueId","undo","edges","./greedy-fas","./lodash","3","addBorderNode","sg","sgNode","rank","curr","addDummyNode","setParent","borderLeft","borderRight","minRank","maxRank","./util","4","swapWidthHeight","swapWidthHeightOne","attrs","reverseYOne","y","swapXYOne","x","adjust","rankDir","rankdir","reverseY","swapXY","5","List","sentinel","_next","_prev","_sentinel","unlink","entry","filterOutLinks","dequeue","enqueue","strs","JSON","stringify","6","Graph","debugOrdering","layerMatrix","buildLayerMatrix","h","compound","multigraph","setGraph","setNode","layerV","reduce","./graphlib","7","8","nodeCount","fasGraph","maxIn","maxOut","in","out","prevWeight","edgeWeight","Math","max","buckets","range","zeroIdx","assignBucket","buildState","DEFAULT_WEIGHT_FN","results","sources","sinks","removeNode","doGreedyFAS","flatten","constant","collectPredecessors","inEdges","uEntry","wEntry","./data/list","9","acyclic","normalizeRanks","parentDummyChains","removeEmptyRanks","nestingGraph","addBorderSegments","coordinateSystem","order","opts","debugTiming","layoutGraph","inputGraph","canonicalize","merge","graphDefaults","selectNumberAttrs","graphNumAttrs","pick","graphAttrs","defaults","nodeNumAttrs","nodeDefaults","edgeDefaults","edgeNumAttrs","edgeAttrs","buildLayoutGraph","ranksep","minlen","labelpos","labeloffset","makeSpaceForEdgeLabels","selfEdges","removeSelfEdges","asNonCompoundGraph","injectEdgeLabelProxies","cleanup","borderTop","borderBottom","assignRankMinMax","dummy","labelRank","removeEdgeLabelProxies","layers","orderShift","selfEdge","insertSelfEdges","selfNode","dx","dy","positionSelfEdges","last","abs","removeBorderNodes","fixupEdgeLabelCoords","minX","POSITIVE_INFINITY","maxX","minY","maxY","graphLabel","marginX","marginx","marginY","marginy","getExtremes","min","translateGraph","p1","p2","nodeV","nodeW","intersectRect","assignNodeIntersects","reversePointsForReversedEdges","runLayout","inputLabel","layoutLabel","updateInputGraph","edgesep","nodesep","mapValues","newAttrs","./acyclic","./add-border-segments","./coordinate-system","./nesting-graph","./normalize","./order","./parent-dummy-chains","./position","./rank","10","lodash","11","depths","depth","child","treeDepths","nodeSep","nestingRoot","acc","sumWeights","childNode","childTop","childBottom","thisWeight","nestingEdge","nodeRankFactor","12","dummyChains","vRank","wRank","edgeLabel","edgeObj","normalizeEdge","origLabel","successors","13","cg","vs","rootPrev","prevChild","../lodash","14","movable","inV","result","nodeU","sum","barycenter","15","relationship","hasNode","createRootNode","setDefaultNodeLabel","isUndefined","../graphlib","16","twoLayerCrossCount","northLayer","southLayer","southPos","zipObject","southEntries","chain","sortBy","firstIndex","treeSize","tree","cc","weightSum","layering","17","initOrder","crossCount","sortSubgraph","buildLayerGraph","addSubgraphConstraints","buildLayerGraphs","ranks","sweepLayerGraphs","layerGraphs","biasRight","lg","sorted","assignOrder","downLayerGraphs","upLayerGraphs","best","bestCC","lastBest","cloneDeep","../util","./add-subgraph-constraints","./build-layer-graph","./cross-count","./init-order","./sort-subgraph","18","simpleNodes","orderedVs","19","entries","mappedEntries","tmp","indegree","entryV","entryW","sourceSet","handleIn","vEntry","merged","source","mergeEntries","handleOut","pop","doResolveConflicts","20","resolveConflicts","bl","br","subgraphs","barycenters","subgraphResult","other","expandSubgraphs","predecessors","blPred","brPred","./barycenter","./resolve-conflicts","./sort","21","consumeUnsortable","unsortable","partition","sortable","lhs","rhs","vsIndex","bias","22","postorderNums","lim","low","postorder","pathData","lca","vPath","wPath","path","findPath","pathIdx","pathV","ascending","23","findType1Conflicts","conflicts","prevLayer","k0","scanPos","prevLayerLength","lastNode","findOtherInnerSegmentNode","k1","scanNode","uLabel","uPos","addConflict","findType2Conflicts","scan","south","southEnd","prevNorthBorder","nextNorthBorder","uNode","north","nextNorthPos","prevNorthPos","southLookahead","conflictsV","hasConflict","verticalAlignment","neighborFn","align","prevIdx","ws","mp","floor","il","ceil","horizontalCompaction","reverseSep","xs","blockG","blockGraph","sepFn","edgeSep","vLabel","wLabel","sep","vRoot","uRoot","prevMax","buildBlockGraph","pass1","pass2","findSmallestWidthAlignment","xss","alignCoordinates","alignTo","alignToMin","alignToMax","vert","horiz","alignment","balance","ul","ignore","pluck","positionX","adjustedLayering","values","inner","smallestWidth","24","rankSep","prevY","maxHeight","positionY","./bk","25","slack","tightTree","nodeEdges","edgeV","findMinSlackEdge","shiftRanks","directed","size","26","longestPath","feasibleTree","networkSimplex","ranker","networkSimplexRanker","tightTreeRanker","longestPathRanker","./feasible-tree","./network-simplex","27","initRank","preorder","alg","simplify","initLowLimValues","initCutValues","leaveEdge","exchangeEdges","enterEdge","cutvalue","calcCutValue","assignCutValue","childIsTail","graphEdge","cutValue","isOutEdge","pointsToHead","otherWeight","hasEdge","otherCutValue","dfsAssignLowLim","nextLim","neighbors","tailLabel","flip","candidates","isDescendant","flipped","updateRanks","rootLabel","28","29","simplified","simpleLabel","isMultigraph","successorWeights","weightMap","sucs","predecessorWeights","preds","rect","point","sx","sy","collection","fn","now","30","31","lib","./lib","./lib/alg","./lib/json","32","cmpt","cmpts","33","isArray","doDfs","34","dijkstra","weightFunc","edgeFunc","transform","./dijkstra","35","PriorityQueue","edgeFn","pq","updateNeighbors","predecessor","decrease","removeMin","runDijkstra","DEFAULT_WEIGHT_FUNC","../data/priority-queue","36","tarjan","./tarjan","37","rowK","rowI","ik","kj","ij","altDistance","runFloydWarshall","38","components","dijkstraAll","findCycles","floydWarshall","isAcyclic","prim","topsort","./components","./dijkstra-all","./find-cycles","./floyd-warshall","./is-acyclic","./postorder","./preorder","./prim","./topsort","39","CycleException","40","./dfs","41","42","parents","pri","priority","../graph","43","onStack","lowlink","44","visit","45","_arr","_keyIndices","keyIndices","_decrease","_swap","_heapify","largest","origArrI","origArrJ","46","_isDirected","_isMultigraph","_isCompound","_label","_defaultNodeLabelFn","_defaultEdgeLabelFn","_nodes","_children","_in","_preds","_out","_sucs","_edgeObjs","_edgeLabels","incrementOrInitEntry","decrementOrRemoveEntry","edgeArgsToId","isDirected","edgeArgsToObj","edgeObjToId","_nodeCount","_edgeCount","isCompound","newDefault","isFunction","setNodes","_removeFromParentsChildList","ancestor","predsV","sucsV","union","setDefaultEdgeLabel","edgeCount","setPath","valueSpecified","isPlainObject","freeze","outV","47","./graph","./version","48","writeNodes","writeEdges","edgeValue","write","clone","read","49","/Users/cpettitt/projects/dagre/lib/lodash.js","50","51","arrayPool","objectPool","idCounter","keyPrefix","reEmptyStringLeading","reEmptyStringMiddle","reEmptyStringTrailing","reEsTemplate","reFlags","reFuncName","reInterpolate","reLeadingSpacesAndZeros","reNoMatch","reThis","reUnescapedString","contextProps","templateCounter","argsClass","arrayClass","boolClass","dateClass","objectClass","stringClass","cloneableClasses","[object Function]","debounceOptions","leading","maxWait","trailing","descriptor","configurable","enumerable","writable","objectTypes","boolean","function","object","number","stringEscapes","\\","'","\n","\r","\t"," "," ","freeExports","freeModule","moduleExports","freeGlobal","baseIndexOf","array","fromIndex","cacheIndexOf","cache","cachePush","typeCache","charAtCallback","charCodeAt","compareAscending","ac","criteria","bc","createCache","first","mid","getObject","escapeStringChar","getArray","false","null","true","releaseArray","releaseObject","end","runInContext","context","Boolean","Function","TypeError","arrayRef","objectProto","oldDash","reNative","clearTimeout","fnToString","getPrototypeOf","isNative","defineProperty","func","nativeCreate","nativeIsArray","nativeIsFinite","isFinite","nativeIsNaN","isNaN","nativeKeys","nativeMax","nativeMin","nativeParseInt","nativeRandom","random","ctorByClass","lodashWrapper","chainAll","__chain__","__wrapped__","support","baseBind","bindData","partialArgs","thisArg","bound","thisBinding","baseCreate","isObject","setBindData","baseClone","isDeep","stackA","stackB","className","ctor","isArr","initedStack","assign","forOwn","objValue","properties","baseCreateCallback","argCount","identity","__bindData__","funcNames","funcDecomp","accumulator","baseCreateWrapper","bitmask","partialRightArgs","arity","isBind","isBindKey","isCurry","isCurryBound","baseDifference","getIndexOf","isLarge","baseFlatten","isShallow","isStrict","isArguments","valIndex","valLength","resIndex","baseIsEqual","isWhere","otherClass","aWrapped","bWrapped","ctorA","constructor","ctorB","forIn","baseMerge","stackLength","baseRandom","baseUniq","isSorted","seen","computed","createAggregator","setter","createCallback","createWrapper","isPartial","isPartialRight","escapeHtmlChar","htmlEscapes","WinRTError","templateSettings","escape","evaluate","interpolate","variable","imports","noop","shimIsPlainObject","unescapeHtmlChar","htmlUnescapes","iterable","&","<",">","\"","invert","reEscapedHtml","reUnescapedHtml","guard","argsIndex","argsLength","ownIndex","ownProps","forOwnRight","functions","isNumber","valueOf","objProto","isString","countBy","every","forEachRight","groupBy","indexBy","Infinity","current","noaccum","reduceRight","shuffle","rand","some","where","sortedIndex","rest","high","uniq","zip","debounce","wait","maxTimeoutId","stamp","timeoutId","trailingCall","lastCalled","delayed","remaining","isCalled","maxDelayed","leadingCall","mixin","methodNames","isFunc","methodName","getTime","whitespace","radix","property","wrapperValueOf","after","at","bindAll","funcs","bindKey","compact","compose","curry","defer","delay","difference","forInRight","pairs","initial","intersection","caches","trustIndexOf","outer","invoke","memoize","resolver","memoized","omit","once","ran","partial","partialRight","pull","step","reject","tap","interceptor","throttle","times","toArray","proto","without","wrapper","xor","collect","drop","eachRight","extend","methods","tail","unique","unzip","findIndex","findKey","findLast","findLastIndex","findLastKey","isBoolean","isDate","isElement","isEqual","parseFloat","isNull","isRegExp","noConflict","floating","noMin","noMax","template","settings","isEvaluating","importsKeys","importsValues","reDelimiters","escapeValue","interpolateValue","esTemplateValue","evaluateValue","hasVariable","sourceURL","unescape","all","any","detect","findWhere","foldl","foldr","include","inject","sample","take","callbackable","VERSION","_graph","_addNode","class","_c","createElementNS","_addEdge","_clean","center","treeDiv","cWidth","getComputedStyle","treeWidth","scrollLeft","toBase64","svgWrapper","outerHTML","svg","btoa","encodeURIComponent","canvas","setAttributeNS","x1","y1","x2","y2","_line","tspan","LINEHEIGHT","downloadLink","_tokens","_arcs","_tokenElements","_y","_currentInFocus","maxArc","overlapDiff","arcDiff","anchorDiff","anchorStart","tokenSep","xPadding","yPadding","temp","targetMap","targetID","relation","srcStart","srcEnd","direction","addRel","xmlid","newtarget","addToken","_rect","navigator","userAgent","createRange","selectNode","detach","_tokenPoint","box","_drawAnchor","firstBox","lastBox","overlaps","_arcsElement","pathStr","offsetLeft","_drawArc","arc","startPos","endPos","startY","endY","startAnchor","endAnchor","middle","cHeight","controlY","arcE","middleY","_labelsElement","arcRef","inFocus","labelE","textNode","labelBox","getBBox","textWidth","textHeight","labelR","boxWidth","marker","arrow","rel","cif","_sortArcs","anchors","sortedArcs","anchorSig","_sortedArcs","lengthSort","_sortedAnchors","scrollValue","textAnchor","node_i","arcs","labels","inclusive","matchTreeHierarchyClass","matchTreeArcClass","DOWNLOAD","matchtree","h6","_tree","treeObj","body","treeItemClass","tableView","metaView","relationsView","buttonGroupMenuClass","SHOWANNO","SHOW_META","ADDTREE","addMeta","addTable","TreeMenu","tm","_treeMenuList","Plugin","matchButtons","_metaView","_tableView","_menuList","treeLayers","getSpans","getRels","menuList","matchPanelClass","_matchTerms","_initialized","textSigle","matchID","available","_avail","rels","refLine","querySelector","toggle","_container","_mirror","reposition","mirror","container","mirrorValue","_split","_rightPos","insert","splittedText","selectionStart","selectionEnd","moveto","charpos","inputClientRect","inputStyle","bodyClientRect","mirrorStyle","getPropertyValue","paddingLeft","marginLeft","borderLeftWidth","borderLeftStyle","fontSize","fontFamily","newText","defaultTextValue","isSelectable","letter","further","defaultContainerItemClass","listOfContainerItems","_containerItemClass","_cItemPrefix","items","addItem","cItem","addMenu","addPrefix","prefItem","exit","enter","ll","defaultMenuClass","defaultContainerClass","containerList","cLLength","_desc","hint","inputField","desc","lengthFieldClass","containerMenuClass","_context","_hint","_inputField","_alert","_unshowAlert","inputClass","analyzerClass","alertClass","_menuCollection","qfield","inputFieldElement","_analyzer","alert","charPos","contextMenu","ifContext","noC","_unshow","getContext","unshow","_hash","get","cookie","pair","parse","sessionClass","session","_session","removeAttribute","div","_iframe","_cutoff","useQuery","q","qc","_cuttoff","checked","QLmenu","selectValue","setPage","initQueries","qs","querySelectorAll","initDocLinks","getPage","page","frames","location","pathname","search","nodeName","isTop","testDiv","scrollIntervalId","isBrowser","isPageLoaded","readyCalls","callReady","callbacks","runCallbacks","pageLoaded","clearInterval","attachEvent","frameElement","doScroll","external","setInterval","readyState","domReady","onLoad","isBuild","Alertify","$","btnCancel","btnOK","btnReset","btnResetBack","btnFocus","elCallee","elCover","elDialog","elLog","getTransitionEvent","_alertify","dialogs","isopen","queue","buttons","holder","submit","ok","cancel","message","supported","transitions","WebkitTransition","MozTransition","OTransition","transition","cssClass","dialog","confirm","buttonReverse","buttonFocus","addListeners","common","hasOK","hasCancel","hasInput","unbind","setFocus","handleErrors","onerror","line","error","appendButtons","secondary","primary","build","css","hideElement","transitionDone","timer","placeholder","activeElement","scrollTop","setup","notify","fromQueue","detachEvent","prompt","success","alertify","_index","showTitle","selectMenuItemClass","opt","_select","_title","showSelected","selectedIndex","vParam","qlf","hljs","attributes","cI","compiled","bK","lR","bR","eW","eR","tE","iR","starts","endsParent","E","classPrefix","L","sL","M","B","subLanguageMode","language","cN","rB","eB","rE","eE","N","R","C","I","S","languages","second_best","tabReplace","useBR","called","highlightAuto","fixMarkup","highlightBlock","configure","initHighlighting","initHighlightingOnLoad","registerLanguage","aliases","listLanguages","getLanguage","inherit","IR","UIR","NR","CNR","BNR","RSR","BE","ASM","QSM","PWM","CLCM","CBCM","HCM","NM","CNM","BNM","CSSNM","RM","TM","UTM","literal","kq","kqInner","koralQuery","kqViewClass","TOGGLE_ALIGN","SHOW_KQ","aRoll","opened","_opened","clearButtonGroup","addKqAction","kqButton","_kq","addAlignAction","olCl","nn","introJs","warn","IntroJs","_targetElement","_introItems","_options","nextLabel","prevLabel","skipLabel","doneLabel","hidePrev","hideNext","tooltipPosition","tooltipClass","highlightClass","exitOnEsc","exitOnOverlayClick","showStepNumbers","keyboardNavigation","showButtons","showBullets","showProgress","scrollToElement","scrollPadding","overlayOpacity","positionPrecedence","disableInteraction","helperElementPadding","hintPosition","hintButtonLabel","hintAnimation","buttonClass","_introForElement","targetElm","allIntroSteps","introItems","steps","_forEach","currentItem","_cloneObject","floatingElementQuery","currentElement","intro","nextStep","tempIntroItems","z","_addOverlayLayer","_nextStep","DOMEvent","on","_onKeyDown","_onResize","refresh","which","_previousStep","srcElement","_currentStep","_introCompleteCallback","_exitIntro","returnValue","_goToStep","_goToStepNumber","_currentStepNumber","_direction","continueStep","_introBeforeChangeCallback","_showElement","_refresh","_setHelperLayerPosition","oldHelperNumberLayer","oldArrowLayer","oldtooltipContainer","_placeTooltip","_reAlignHints","targetElement","force","continueExit","_introBeforeExitCallback","overlayLayers","overlayLayer","opacity","helperLayer","referenceLayer","disableInteractionLayer","floatingElement","_removeShowElement","_removeClass","_introExitCallback","tooltipLayer","arrowLayer","helperNumberLayer","hintMode","currentStepObj","tooltipOffset","targetOffset","windowSize","currentTooltipPosition","tooltipCssClass","marginTop","_determineAutoPosition","_getOffset","_getWinSize","_addClass","tooltipLayerStyleRight","_checkLeft","tooltipLayerStyleLeftRight","_checkRight","tooltipLayerStyleLeft","desiredTooltipPosition","possiblePositions","tooltipHeight","tooltipWidth","targetElementRect","calculatedPosition","_removeEntry","hyphenIndex","desiredAlignment","halfTooltipWidth","winWidth","possibleAlignments","calculatedAlignment","_determineAutoAlignment","stringArray","stringToRemove","elementPosition","widthHeightPadding","_isFixed","cssText","_disableInteraction","_setAnchorAsButton","tabIndex","_introChangeCallback","nextTooltipButton","prevTooltipButton","skipTooltipButton","scrollParent","oldHelperLayer","oldReferenceLayer","oldtooltipLayer","lastIntroItem","_getScrollParent","_scrollParentToElement","_lastShowElementTimer","_getProgress","_scrollTo","tooltipTextLayer","bulletsLayer","progressLayer","buttonsLayer","ulContainer","anchorClick","goToStep","innerLi","anchorLink","progressBar","_introSkipCallback","parentElm","SVGElement","currentElementPosition","_getPropValue","zIndex","_setShowElement","_introAfterChangeCallback","innerHeight","innerWidth","_elementInViewport","winHeight","scrollBy","elm","forEachFnc","completeFnc","_stamp","events_key","_id","listener","useCapture","handler","pre","classNameRegex","propName","propValue","currentStyle","defaultView","D","documentElement","styleText","_removeHintTooltip","tooltip","_populateHints","hints","_addHints","_alignHintPosition","_hintQuerySelectorAll","selector","hintsWrapper","_hideHint","stepId","_hintCloseCallback","_hideHints","_showHints","_showHint","_removeHints","_removeHint","evt","cancelBubble","_showHintDialog","getHintClick","hintDot","hintPulse","_hintsAddedCallback","hintElement","_hintClickCallback","removedStep","tooltipWrapper","closeButton","docEl","pageYOffset","excludeStaticParent","overflowRegex","parentElement","overflow","overflowY","overflowX","offsetTop","instance","instances","setOption","option","setOptions","obj1","obj2","attrname","obj3","_mergeOptions","addStep","addSteps","goToStepNumber","previousStep","onbeforechange","providedCallback","onchange","onafterchange","oncomplete","onhintsadded","onhintclick","onhintclose","onexit","onskip","onbeforeexit","addHints","hideHint","hideHints","showHint","showHints","removeHints","removeHint","showHintDialog","introClass","hintClass","TOUR_lskip","TOUR_lprev","TOUR_lnext","TOUR_ldone","TOUR_ldoneSearch","TOUR_welc","TOUR_sear1","TOUR_searAnnot","TOUR_annotAss","TOUR_vccho1","TOUR_vccho2","TOUR_vcStat1","TOUR_vcStat2","TOUR_qlfield","TOUR_help","TOUR_glimpse","TOUR_seargo","TOUR_kwic","TOUR_snippet","TOUR_snippetb","TOUR_metadatab","TOUR_metadata","TOUR_tokenb","TOUR_token","TOUR_treeb","TOUR_tree","TOUR_tourdone","labelOpts","usabilityOpts","doe","gTstartSearch","elparam","Steps","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","contentWindow","postMessage","serviceClass","isWidget","resize","_mgr","_closeService","_assoc","associates","ds","dataset","total","count","widgetClass","stateClass","pageInfoClass","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","URLSearchParams","pi","URL","_removeListener","Uint8Array","crypto","getRandomValues","randomID","notNullRe","_notNull","_pipe","legacySigle","_actionJSON","requestType","jsObj","returnValueCB","errorCB","XMLHttpRequest","reqE","bubbles","setRequestHeader","onreadystatechange","retJSObj","responseText","status","statusText","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","tourClass","pluginClass","pipeClass","kqe","gt","tourshowR","vcname","vcchoose","matchElements","aside","asideClicked","resultInfo","resultPanel","sb","vcclick","tutorial","form","qf","queryPanel","sform","vcView","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// 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};\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   * 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 (let prop in props) {\r\n      this[prop] = props[prop];\r\n    };\r\n    return this;\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   * 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 (let prop in props) {\r\n      this[prop] = props[prop];\r\n    };\r\n    return this;\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   * 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 (let prop in props) {\r\n      this[prop] = props[prop];\r\n    };\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     * 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    /**\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.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     * 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    _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      this.add(title, data, function (e) {\r\n        list.show();\r\n        list.button(this.button);\r\n        list.focus();\r\n      });\r\n      return list;\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    /**\r\n     * Upgrade this object to another object\r\n     * while private data stays intact\r\n     */\r\n    upgradeTo : function (props) {\r\n      for (let prop in props) {\r\n\t      this[prop] = props[prop];\r\n      };\r\n      return 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    /**\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 (let prop in props) {\r\n        this[prop] = props[prop];\r\n      };\r\n      return this;\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    /**\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 (let prop in props) {\r\n        this[prop] = props[prop];\r\n      };\r\n      return this;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * View: corpus statistic view\r\n * \r\n * @author Helge Stallkamp\r\n */\r\n\r\n\r\ndefine('view/vc/corpstatv',['view', 'vc/statistic', 'buttongroup'],\r\n       function (viewClass, statClass, buttonGroup) {\r\n\r\n         // Localization values\r\n  const loc   = KorAP.Locale;\r\n  loc.REFRESH = loc.REFRESH || 'Refresh';\r\n\r\n  return {\r\n    create : function(vc, panel) {\r\n      return Object.create(viewClass).\r\n        _init([ 'vcstatistic' ]).\r\n        upgradeTo(this).\r\n        _init(vc, panel);\r\n    },\r\n\r\n    _init : function(vc, panel) {\r\n      this.vc = vc;\r\n      this.panel = panel;\r\n      return this;\r\n    },\r\n\r\n    /*\r\n     * Returns corpus of the view,\r\n     * vc is used to create the corpus query string \r\n     * which is needed to receive the corpus statistic from the server \r\n     * (see also getStatistic : function(cb) {...))\r\n     */\r\n    getvc : function() {\r\n      return this.vc;\r\n    },\r\n\r\n\r\n    /**\r\n     * Receive Corpus statistic from the server\r\n     */\r\n    getStatistic : function (cb) {\r\n      const vc = this.vc;\r\n\r\n      try {\r\n        KorAP.API.getCorpStat(vc.toQuery(), function(statResponse) {\r\n          if (statResponse === null) {\r\n            cb(null);\r\n            return;\r\n          }\r\n          if (statResponse === undefined) {\r\n            cb(null);\r\n            return;\r\n          }\r\n\r\n          // catches notifications\r\n          if (statResponse[\"notifications\"] !== null\r\n              && statResponse[\"notifications\"] !== undefined) {\r\n            const notif = statResponse[\"notifications\"];\r\n            KorAP.log(0, notif[0][1]);\r\n            cb(null);\r\n            return;\r\n          }\r\n\r\n          cb(statResponse);\r\n        });\r\n      }\r\n\r\n      catch (e) {\r\n        KorAP.log(0, e);\r\n        cb(null);\r\n      }\r\n\r\n    },\r\n\r\n    /** \r\n     * Show corpus statistic view \r\n     */\r\n    show : function() {\r\n      \r\n      if (this._show)\r\n        return this._show; \r\n      \r\n      const statTable = document.createElement('div');\r\n      statTable.classList.add('stattable', 'loading');\r\n  \r\n      /*\r\n       * Get corpus statistic, remove \"loading\"-image and\r\n       * append result to statTable\r\n       */\r\n      this.getStatistic(function(statistic) {\r\n        statTable.classList.remove('loading');\r\n\r\n        if (statistic === null)\r\n          return;\r\n\r\n        statTable.appendChild(\r\n          statClass.create(statistic).element()\r\n        );\r\n      });\r\n\r\n      return this._show = statTable;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Checks if statistic has to be disabled\r\n     */\r\n    checkStatActive : function () {\r\n      let newString = KorAP.vc.toQuery();\r\n      const oldString = this.vc.oldvcQuery;\r\n      /*\r\n       * Do ignore surrounding round brackets\r\n       * Definining an incomplete docGroup in the vc builder: \r\n       * (foo = bar and author = Goethe) and ... \r\n       * leads to \r\n       * vc.toQuery() -> (foo = bar and author=Goethe)\r\n       */\r\n  \r\n      if (newString || newString === '') {\r\n        if (newString.startsWith('(')) {\r\n          newString = newString.slice(1, newString.length-1);\r\n        };\r\n       \r\n        if (newString != oldString) {\r\n          this.disableStat();\r\n        }\r\n      }\r\n    },\r\n   \r\n\r\n    /**\r\n     * Disabling corpus statistic if in vc builder a different vc is choosen.\r\n     * After clicking at the reload-button the up-to-date corpus statistic is displayed.\r\n     */   \r\n    disableStat : function(){\r\n      const statt = this._show;\r\n  \r\n      if (statt.getElementsByClassName('reloadStatB').length == 0) {\r\n        const btg = buttonGroup.create(['reloadStatB', 'button-panel']);\r\n\r\n        btg.add(loc.REFRESH, {'cls':['refresh', 'button-icon']}, function (e) {\r\n          statt.classList.remove('stdisabled');\r\n          this.panel.reloadCorpStat(); \r\n        }.bind(this));\r\n\r\n        statt.appendChild(btg.element());\r\n        statt.classList.add('stdisabled');\r\n      };\r\n    },\r\n\r\n    \r\n    /**\r\n     * Close the view.\r\n     */\r\n    onClose : function() {\r\n      this.vc = undefined;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The vc info panel\r\n * \r\n * The vc info panel displays information about the virtual corpus, \r\n * for example the corpus statistic\r\n * \r\n * @author Helge Stallkamp\r\n */\r\n\r\n\r\n\r\ndefine('panel/vc',[\r\n  'panel',\r\n  'view/vc/corpstatv'\r\n], function (panelClass, corpStatVClass) {\r\n  \r\n  const d = document;\r\n\r\n  // Localization values\r\n  const loc = KorAP.Locale;\r\n  loc.SHOW_STAT= loc.SHOW_STAT || 'Statistics';\r\n  loc.VERB_SHOWSTAT = loc.VERB_SHOWSTAT    || 'Corpus Statistics';\r\n  \r\n  return {\r\n    create : function (vc) {\r\n      return Object.create(panelClass)._init(['vcinfo']).upgradeTo(this)._init(vc);\r\n    }, \r\n    \r\n    _init : function(vc){\r\n     this.vc = vc;\r\n      const actions = this.actions();\r\n      actions.add(loc.SHOW_STAT, {'cls':['statistic']}, function() {\r\n        this.addCorpStat();\r\n      }.bind(this));\r\n      return this;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Add corpus statistic view to panel\r\n     */\r\n    addCorpStat: function(){\r\n      const t = this;\r\n\r\n      //Refreshes corpus statistic\r\n      if (t.statView !== undefined && t.statView.shown()){\r\n        let statt = t.statView.show();\r\n        if (statt.classList.contains('stdisabled')){\r\n          t.reloadCorpStat(); \r\n          statt.classList.remove('stdisabled');\r\n        }\r\n      };\r\n      \r\n      //Add corpus statistic\r\n      if (t.statView === undefined || !t.statView.shown()) {\r\n        t.statView = corpStatVClass.create(t.vc,t);\r\n        t.add(t.statView);\r\n        t.vc.oldvcQuery = KorAP.vc.toQuery();\r\n      };\r\n    },\r\n    \r\n    /**\r\n     * Reload corpus statistic \r\n     *\r\n     */\r\n    reloadCorpStat: function(){\r\n      this.statView.close();\r\n      this.addCorpStat();\r\n    }    \r\n  }\r\n});\r\n\n/**\r\n * Create virtual corpora with a visual user interface. This resembles the\r\n * corpus/collection type objects of a KoralQuery \"collection\"/\"corpus\" object.\r\n * \r\n * KoralQuery v0.3 is expected.\r\n * \r\n * @author Nils Diewald\r\n */\r\n/*\r\n * This replaces a previous version written by Mengfei Zhou\r\n */\r\n\r\n/*\r\n  TODO: Disable \"and\" or \"or\" in case it's followed \r\n        by an unspecified document\r\n  TODO: Add \"and\"-method to root to add further constraints \r\n        based on match-input (like clicking on a pubDate timestamp in a match) \r\n  TODO: Implement \"persistence\"-Option, injecting the current creation \r\n        date stamp \r\n  TODO: Implement vec-Type for document-id vectors like docID in [1,2,3,4 ...]\r\n\r\n  Error codes: \r\n  701: \"JSON-LD group has no @type attribute\" \r\n  704: \"Operation needs operand list\" \r\n  802: \"Match type is not supported by value type\" \r\n  804: \"Unknown value type\" \r\n  805: \"Value is invalid\" \r\n  806: \"Value is not a valid date string\" \r\n  807: \"Value is not a valid regular expression\" \r\n  810: \"Unknown document group operation\" (like 711) \r\n  811: \"Document group expects operation\" (like 703) \r\n  812: \"Operand not supported in document group\" (like 744) \r\n  813: \"Collection type is not supported\" (like 713) \r\n  814: \"Unknown rewrite operation\" \r\n  815: \"Rewrite expects source\"\r\n  \r\n  Localization strings: \r\n  KorAP.Locale = {\r\n    EMPTY : '...', \r\n    AND : 'and', \r\n    OR : 'or',\r\n   DELETE : 'x' }\r\n   \r\n   and various field names with the prefix 'VC_'\r\n */\r\n\r\n\r\ndefine('vc',[\r\n  'vc/unspecified',\r\n  'vc/doc',\r\n  'vc/docgroup',\r\n  'vc/docgroupref',\r\n  'vc/menu',\r\n  'vc/statistic',\r\n  'datepicker',\r\n  'buttongroup',\r\n  'panel/vc',\r\n  'view/vc/corpstatv',\r\n  'buttongroup',\r\n  'util'\r\n], function(\r\n  unspecDocClass,\r\n  docClass,\r\n  docGroupClass,\r\n  docGroupRefClass,\r\n  menuClass,\r\n  statClass,\r\n  dpClass,\r\n  buttonGrClass,\r\n  vcPanelClass,\r\n  corpStatVClass,\r\n  buttonGroupClass) {\r\n\r\n  KorAP._validUnspecMatchRE = new RegExp(\r\n    \"^(?:eq|ne|contains(?:not)?|excludes)$\");\r\n  KorAP._validStringMatchRE = new RegExp(\"^(?:eq|ne)$\");\r\n  KorAP._validTextMatchRE = KorAP._validUnspecMatchRE;\r\n  KorAP._validTextOnlyMatchRE = new RegExp(\r\n    \"^(?:contains(?:not)?|excludes)$\");\r\n  KorAP._overrideStyles = false;\r\n  // KorAP._validDateMatchRE is defined in datepicker.js!\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.SHOW_STAT        = loc.SHOW_STAT        || 'Statistics';\r\n  loc.VERB_SHOWSTAT    = loc.VERB_SHOWSTAT    || 'Corpus Statistics';\r\n  loc.VC_allCorpora    = loc.VC_allCorpora    || 'all corpora';\r\n  loc.VC_oneCollection = loc.VC_oneCollection || 'a virtual corpus';\r\n  loc.MINIMIZE         = loc.MINIMIZE         || 'Minimize';\r\n\r\n  KorAP._vcKeyMenu = undefined;\r\n  KorAP._vcDatePicker = dpClass.create();\r\n\r\n  // Create match menus ....\r\n  KorAP._vcMatchopMenu = {\r\n    'string' : menuClass.create([\r\n      [ 'eq', null ],\r\n      [ 'ne', null ]\r\n    ]),\r\n    'text' : menuClass.create([\r\n      [ 'eq', null ], // Requires exact match\r\n      [ 'ne', null ],\r\n      [ 'contains', null ], // Requires token sequence match\r\n      [ 'containsnot', null ]\r\n    ]),\r\n    'date' : menuClass.create([\r\n      [ 'eq', null ],\r\n      [ 'ne', null ],\r\n      [ 'geq', null ],\r\n      [ 'leq', null ]\r\n    ]),\r\n    'regex' : menuClass.create([\r\n      [ 'eq', null ],\r\n      [ 'ne', null ]\r\n    ])\r\n  };\r\n\r\n\r\n  /**\r\n   * Virtual corpus\r\n   */\r\n  return {\r\n\r\n    /**\r\n     * The JSON-LD type of the virtual corpus\r\n     */\r\n    ldType : function() {\r\n      return null;\r\n    },\r\n\r\n\r\n    // Initialize virtual corpus\r\n    _init : function(keyList) {\r\n\r\n      // Inject localized css styles\r\n      if (!KorAP._overrideStyles) {\r\n\r\n        const sheet = KorAP.newStyleSheet();\r\n\r\n        // Add css rule for OR operations\r\n        sheet.insertRule('.vc .docGroup[data-operation=or] > .doc::before,'\r\n                         + '.vc .docGroup[data-operation=or] > .docGroup::before '\r\n                         + '{ content: \"' + loc.OR + '\" }', 0);\r\n\r\n        // Add css rule for AND operations\r\n        sheet.insertRule(\r\n          '.vc .docGroup[data-operation=and] > .doc::before,'\r\n            + '.vc .docGroup[data-operation=and] > .docGroup::before '\r\n            + '{ content: \"' + loc.AND + '\" }', 1);\r\n\r\n        KorAP._overrideStyles = true;\r\n      };\r\n\r\n      let l;\r\n      if (keyList) {\r\n        l = keyList.slice();\r\n        l.unshift(['referTo', 'ref']);\r\n      }\r\n      else {\r\n        l = [['referTo', 'ref']];\r\n      }\r\n      \r\n      // Create key menu\r\n      KorAP._vcKeyMenu = menuClass.create(l);\r\n      KorAP._vcKeyMenu.limit(6);\r\n\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Create a new virtual corpus\r\n     */\r\n    create : function (keyList) {\r\n      const obj = Object.create(this)._init(keyList);\r\n      obj._root = unspecDocClass.create(obj);\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Create and render a new virtual corpus based on a KoralQuery\r\n     * corpus document\r\n     */\r\n    fromJson : function(json) {\r\n\r\n      let obj;\r\n      \r\n      if (json !== undefined) {\r\n\r\n        // Parse root document\r\n        if (json['@type'] == 'koral:doc') {\r\n          obj = docClass.create(this, json);\r\n        }\r\n\r\n        // parse root group\r\n        else if (json['@type'] == 'koral:docGroup') {\r\n          obj = docGroupClass.create(this, json);\r\n        }\r\n\r\n        // parse root reference\r\n        else if (json['@type'] == 'koral:docGroupRef') {\r\n          obj = docGroupRefClass.create(this, json);\r\n        }\r\n        \r\n        // Unknown collection type\r\n        else {\r\n          KorAP.log(813, \"Collection type is not supported\");\r\n          return;\r\n        };\r\n      }\r\n\r\n      else {\r\n        // Add unspecified object\r\n        obj = unspecDocClass.create(this);\r\n      };\r\n\r\n      // Init element and update\r\n      this.root(obj);   \r\n \r\n      return this;\r\n    },\r\n\r\n\r\n    // Check if the virtual corpus contains a rerite\r\n    wasRewritten : function (obj) {\r\n\r\n      if (arguments.length !== 1) {\r\n        obj = this._root;\r\n      };\r\n\r\n      // Check for rewrite\r\n      if (obj.rewrites() && obj.rewrites().length() > 0) {\r\n        return true;\r\n      }\r\n\r\n      // Check recursively\r\n      else if (obj.ldType() === 'docGroup') {\r\n\r\n        // If there was a rewritten object\r\n        if (obj.operands().find(op => this.wasRewritten(op)) !== undefined) {\r\n          return true;\r\n        };\r\n      };\r\n      \r\n      return false;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Clean the virtual document to unspecified doc.\r\n     */\r\n    clean : function() {\r\n      const t = this;\r\n      if (t._root.ldType() !== \"non\") {\r\n        t._root.destroy();\r\n        t.root(unspecDocClass.create(t));\r\n      };\r\n\r\n      // update for graying corpus statistic by deleting the first line of the vc builder\r\n      t.update();\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the root object of the virtual corpus\r\n     */\r\n    root : function(obj) {\r\n      if (arguments.length === 1) {\r\n        const e = this.builder();\r\n        \r\n        if (e.firstChild !== null) {\r\n\r\n          // Object not yet set\r\n          if (e.firstChild !== obj.element()) {\r\n            e.replaceChild(obj.element(), e.firstChild);\r\n          };\r\n        }\r\n\r\n        // Append root element\r\n        else {\r\n          e.appendChild(obj.element());\r\n        };\r\n\r\n        // Update parent child relations\r\n        this._root = obj;\r\n        obj.parent(this);\r\n\r\n        this.update();\r\n      };\r\n\r\n      return this._root;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the wrapper element associated with the vc\r\n     */\r\n    builder : function () {\r\n      const t = this;\r\n\r\n      // Initialize if necessary\r\n      if (t._builder !== undefined)\r\n        return t._builder;\r\n\r\n      t.element();\r\n      return t._builder;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the element associated with the virtual corpus\r\n     */\r\n    element : function() {\r\n      const t = this;\r\n      let e = t._el;\r\n\r\n      if (e !== undefined)\r\n        return e;\r\n\r\n\r\n      e = t._el = document.createElement('div');\r\n      e.classList.add('vc');\r\n\r\n\r\n      t._builder = e.addE('div');\r\n      t._builder.setAttribute('class', 'builder');\r\n\r\n      const btn = buttonGroupClass.create(\r\n        ['action','button-view']\r\n      );\r\n\r\n      btn.add(loc.MINIMIZE, {'cls':['button-icon','minimize']}, function () {\r\n        this.minimize();\r\n      }.bind(t));\r\n\r\n      e.appendChild(btn.element());\r\n      \r\n      // Initialize root\r\n      t._builder.appendChild(t._root.element());      \r\n      \r\n      // Add panel to display corpus statistic, ...\r\n      t.addVcInfPanel();\r\n      \r\n      //Adds EventListener for corpus changes\r\n      t._el.addEventListener('vcChange', function (e) {\r\n        this.checkStatActive(e.detail);\r\n      }.bind(t), false);\r\n      \r\n      return e;\r\n    },\r\n\r\n\r\n    /**\r\n     * Check, if the VC is open\r\n     */\r\n    isOpen : function () {\r\n      if (!this._el)\r\n        return false;\r\n      return this._el.classList.contains('active');\r\n    },\r\n    \r\n\r\n    /**\r\n     * Open the VC view\r\n     */\r\n    open : function () {\r\n      this.element().classList.add('active');\r\n      if (this.onOpen)\r\n        this.onOpen();\r\n    },\r\n\r\n\r\n    /**\r\n     * Minimize the VC view\r\n     */\r\n    minimize : function () {\r\n      this.element().classList.remove('active');\r\n      if (this.onMinimize)\r\n        this.onMinimize();\r\n    },\r\n\r\n    \r\n    /**\r\n     * Update the whole object based on the underlying data structure\r\n     */    \r\n    update : function() {\r\n      this._root.update();\r\n      if (KorAP.vc) {\r\n        this.element().dispatchEvent(\r\n          new CustomEvent('vcChange', {'detail':this})\r\n        );\r\n      };\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Make the vc persistant by injecting the current timestamp as a\r\n     * creation date limit criterion.\r\n     * THIS IS CURRENTLY NOT USED\r\n     */\r\n    /*\r\n    makePersistant : function() {\r\n      // this.root().wrapOnRoot('and');\r\n      var todayStr = KorAP._vcDatePicker.today();\r\n      var doc = docClass.create();\r\n      var root = this.root();\r\n\r\n      if (root.ldType() === 'docGroup' && root.operation === 'and') {\r\n        root.append(cond);\r\n      } else {\r\n        root.wrapOnRoot('and');\r\n        root.append(doc);\r\n      };\r\n\r\n      doc.key(\"creationDate\");\r\n      doc.type(\"date\");\r\n      doc.matchop(\"leq\");\r\n      doc.value(todayStr);\r\n\r\n      // { \"@type\" : \"koral:doc\", \"key\" : \"creationDate\", \"type\" :\r\n      // \"type:date\", \"match\" : \"match:leq\", \"value\" : todayStr }\r\n      // this.root().append(cond);\r\n      this.update();\r\n    },\r\n    */\r\n\r\n\r\n    // Get the reference name\r\n    getName : function () {\r\n      if (this._root.ldType() === 'non') {\r\n        return loc.VC_allCorpora;\r\n      }\r\n      else if (this._root.ldType() === 'docGroupRef') {\r\n        return this._root.ref();\r\n      }\r\n      else {\r\n        return loc.VC_oneCollection;\r\n      }\r\n    },\r\n\r\n\r\n    // Add \"and\" constraint to VC\r\n    addRequired : function (doc) {\r\n      const root = this.root();\r\n      const ldType = root.ldType();\r\n      const parent = root.parent();\r\n\r\n      if (ldType === 'non') {\r\n        parent.root(doc);\r\n      }\r\n\r\n      // root is doc\r\n      else if (\r\n        ldType === 'doc' ||\r\n          ldType === 'docGroupRef' ||\r\n          (ldType === 'docGroup' &&\r\n           root.operation() === 'or'\r\n          )) {\r\n        const group = require('vc/docgroup').create(\r\n          parent\r\n        );\r\n        group.operation(\"and\");\r\n        group.append(root);\r\n        group.append(doc);\r\n        group.element(); // Init (seems to be necessary)\r\n        parent.root(group);\r\n      }\r\n      \r\n      // root is a docGroup\r\n      // and is already an 'and'-Group\r\n      else if (ldType === 'docGroup') {\r\n        root.append(doc);\r\n      }\r\n\r\n      // Unknown\r\n      else {\r\n        console.log(\"Unknown root object\");\r\n      };\r\n\r\n      // Init element and update\r\n      this.update();\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the generated json string\r\n     */\r\n    toJson : function () {\r\n      return this._root.toJson();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the generated query string\r\n     */\r\n    toQuery : function () {\r\n      return this._root.toQuery();\r\n    },\r\n\r\n    \r\n    /**\r\n     * Add panel to display virtual corpus information\r\n     */\r\n    addVcInfPanel : function () {\r\n      // Create panel  \r\n      this.panel = vcPanelClass.create(this); \r\n      this._el.addE('div').appendChild(this.panel.element());\r\n      \r\n    },\r\n    \r\n    /**\r\n     * Checks if corpus statistic has to be disabled,\r\n     * and to be updated after clicking at the \"reload-button\"\r\n     */\r\n    checkStatActive : function (){\r\n      if (this.panel !== undefined && this.panel.statView !== undefined){\r\n        this.panel.statView.checkStatActive();\r\n      };\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Corpus specific localization, here for DeReKo (http://www1.ids-mannheim.de/kl/projekte/korpora.html)\r\n * \r\n * @author Helge Stallkamp\r\n */\r\n\r\n\r\n\r\ndefine('loc/dereko',['vc', 'vc/doc'], function (vcClass, docClass) {\r\n  const loc = KorAP.Locale;\r\n  \r\n  //Query example for guided tour\r\n  loc.TOUR_Qexample = \"laufen\";\r\n\r\n  /* To define vc for guided tour */\r\n  loc.TOUR_vcQuery = {\r\n      '@type' : 'koral:doc',\r\n      'key' : 'docSigle', \r\n      'match': 'match:eq',\r\n      'value' : 'WPD17/D01',   \r\n    };\r\n  \r\n  loc.TOUR_Relations = \"corenlp/c\";\r\n\r\n});\r\n\n\r\n\r\ndefine('match/treeitem',['menu/item'], function (itemClass) {\r\n\r\n  /**\r\n   * Menu item for tree view choice.\r\n   */\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new menu item\r\n     * for tree views.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(itemClass)\r\n\t      .upgradeTo(this)._init(params);\r\n    },\r\n\r\n    /**\r\n     * Get or set the content of the\r\n     * menu item.\r\n     */\r\n    content : function (content) {\r\n      if (arguments.length === 1) {\r\n\t      this._content = content;\r\n      };\r\n      return this._content;\r\n    },\r\n    \r\n\r\n    /**\r\n     * The foundry attribute of the menu item.\r\n     */\r\n    foundry : function () {\r\n      return this._foundry;\r\n    },\r\n\r\n\r\n    /**\r\n     * The layer attribute of the menu item.\r\n     */\r\n    layer : function () {\r\n      return this._layer;\r\n    },\r\n\r\n\r\n    /**\r\n     * The type attribute of the menu item.\r\n     * Is either \"spans\" or \"rels\".\r\n     */\r\n    type : function () {\r\n      return this._type;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Override click action of the menu item.\r\n     */\r\n    onclick : function (e) {\r\n      const menu = this.menu();\r\n      menu.hide();\r\n      e.halt();\r\n\r\n      if (menu.panel() !== undefined) {\r\n\t      menu.panel().addTree(this._foundry, this._layer, this._type);\r\n      };\r\n    },\r\n\r\n\r\n    // Initialize tree menu item.\r\n    _init : function (params) {\r\n      if (params[0] === undefined)\r\n\t      throw new Error(\"Missing parameters\");\r\n\r\n      const t = this;\r\n\r\n      t._name    = params[0];\r\n      t._foundry = params[1];\r\n      t._layer   = params[2];\r\n      t._type    = params[3];\r\n      t._content = document.createTextNode(t._name);\r\n      t._lcField = ' ' + t.content().textContent.toLowerCase();\r\n      return t;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * QueryCreator for Kalamar.\r\n * This creates a Poliqarp/CQP query by using the\r\n * annotation table.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('match/querycreator',['util'], function () {\r\n\r\n  /*\r\n   * TODO:\r\n   *   Cache foundry and layer information per row.\r\n   * TODO:\r\n   *   Or-Groups are no longer in use.\r\n   * TODO:\r\n   *   Make language and input fields snigletons!\r\n   */\r\n  const loc = KorAP.Locale;\r\n  loc.NEW_QUERY = loc.NEW_QUERY || 'New Query';\r\n\r\n  const esc = RegExp(\"[ \\.\\'\\\\\\\\\\|\\&]\");\r\n  \r\n  function _getKeyValue (keyValue) {\r\n    if (keyValue.match(esc) != null) {\r\n      return \"'\" + keyValue.replace(/\\\\/g, \"\\\\\\\\\").replace(/'/g, \"\\\\'\") + \"'\";\r\n    };\r\n    return keyValue;\r\n  };\r\n  \r\n  function _getAnnotation (prefix, target) {\r\n\r\n    // Complex annotation\r\n    if (target.childNodes.length > 1) {\r\n      let orGroup = [];\r\n\r\n      // Iterate over alternative annotations\r\n      target.childNodes.forEach(function (item) {\r\n        if (item.nodeType === 3)\r\n          orGroup.push(prefix + _getKeyValue(item.data));\r\n      });\r\n      return '(' + orGroup.sort().join(' | ') + ')';\r\n    }\r\n\r\n    // Simple annotation\r\n    else {\r\n      if (target.innerText == '')\r\n        return '';\r\n\r\n      return prefix + _getKeyValue(target.innerText);\r\n    };\r\n  };\r\n\r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function (matchTable) {\r\n      return Object.create(this)._init(matchTable);\r\n    },\r\n\r\n    // Initialize query creator\r\n    _init : function (matchTable) {\r\n\r\n      // Parameter checks\r\n      if (matchTable === undefined)\r\n        throw new Error('Missing parameters');\r\n      else if (!(matchTable instanceof Node))\r\n        throw new Error('Requires element');\r\n\r\n      const t = this;\r\n\r\n      // Collect the token sequence in an array\r\n      t._query = []\r\n\r\n      // Get the match table\r\n      t._matchTable = matchTable;\r\n\r\n      // Listen on the match table\r\n      t._matchTable.addEventListener(\r\n        \"click\", t.clickOnAnno.bind(t), false\r\n      );\r\n\r\n      // Initialize element\r\n      const e = t._el = document.createElement('p');\r\n      e.classList.add('query','fragment');\r\n\r\n      // Prepend info text\r\n      e.addE('span').addT(loc.NEW_QUERY + ':');\r\n\r\n      // Append query fragment part\r\n      t._queryFragment = e.addE('span');\r\n\r\n      // Event when the query fragment is clicked\r\n      e.addEventListener('click', t.toQueryBar.bind(t), 1);\r\n\r\n      // Get some basic information - see tutorial.js\r\n      // TODO:\r\n      //   It may be better to consultate a global object\r\n      //   like KorAP.Hint, however ...\r\n      t._ql = document.getElementById(\"ql-field\");\r\n\t    t._q = document.getElementById(\"q-field\")\r\n\r\n      t._shown = false;\r\n      return t;\r\n    },\r\n\r\n\r\n    // Realease a click event on the annotation table\r\n    clickOnAnno : function (event) {\r\n      \r\n      // Listen for clicks on table cells\r\n      if (event.target !== event.currentTarget) {\r\n\r\n        // Get target event\r\n        const target = event.target;\r\n\r\n        let head, foundry, layer, i, sib, annotation;\r\n\r\n        if (target.tagName == 'TD') {\r\n\r\n          if (target.innerText == '')\r\n            return;\r\n\r\n          if (target.classList.contains('matchkeyvalues'))\r\n            return;\r\n\r\n\r\n          // Check foundry and layer\r\n          head    = target.parentNode.getElementsByTagName('th');\r\n          foundry = head[0].innerText;\r\n          layer   = head[1].innerText;\r\n\r\n          // Check index position:\r\n          i = -2;\r\n          sib = target;\r\n          while ((sib = sib.previousSibling) != null) {\r\n            if (sib.nodeType === 1)\r\n              i++;\r\n          };\r\n\r\n          // Get annotation value from cell\r\n          annotation = _getAnnotation(foundry + '/' + layer + '=', target);\r\n\r\n          if (annotation !== '') {\r\n\r\n            // Add term\r\n            this.toggleInToken(target, i, annotation);\r\n          };\r\n        }\r\n\r\n        // The annotation is part of a key-value-pair\r\n        else if (target.tagName == 'SPAN' || target.tagName == 'DIV') {\r\n\r\n          if (target.innerText == '')\r\n            return;\r\n\r\n          if (target.tagName == 'SPAN') {\r\n            target = target.parentNode;\r\n          };\r\n\r\n          // Check foundry and layer\r\n          const parentCell = target.parentNode;\r\n          head    = parentCell.parentNode.getElementsByTagName('th');\r\n          foundry = head[0].innerText;\r\n          layer   = head[1].innerText;\r\n\r\n          // Check index position of parent cell\r\n          i = -2;\r\n          sib = parentCell;\r\n          while((sib = sib.previousSibling) != null) {\r\n            if (sib.nodeType === 1)\r\n              i++;\r\n          };\r\n\r\n          // Get annotation value from cell\r\n          annotation = _getAnnotation(foundry + '/' + layer + '=', target);\r\n\r\n          if (annotation !== '') {\r\n\r\n            // Add term\r\n            this.toggleInToken(target, i, annotation);\r\n          }\r\n        }\r\n\r\n        // Get orth values\r\n        else if (target.tagName == 'TH') {\r\n\r\n          // The head is in the top row\r\n          if (target.parentNode.parentNode.tagName == 'THEAD') {\r\n\r\n            // Ignore cutted field\r\n            if (target.classList.contains(\"cutted\")) {\r\n              return;\r\n            }\r\n\r\n            i = -2;\r\n            sib = target;\r\n            while ((sib = sib.previousSibling) != null) {\r\n              if (sib.nodeType === 1)\r\n                i++;\r\n            };\r\n\r\n            // Target is an orth\r\n            if (i >= 0) {\r\n              this.toggleInToken(target, i, _getAnnotation(\"orth=\",target));\r\n            }            \r\n          }\r\n\r\n          // The head refers to the complete row\r\n          // Mark the complete row!\r\n          else {\r\n\r\n            // Check foundry and layer\r\n            head    = target.parentNode.getElementsByTagName('th');\r\n            foundry = head[0].innerText;\r\n            layer   = head[1].innerText;\r\n            const prefix = foundry + '/' + layer + '=';\r\n\r\n            // Iterate over all siblings\r\n            i = 0;\r\n            sib = target;\r\n            while ((sib = sib.nextSibling) != null) {\r\n              if (sib.nodeType !== 1 || sib.tagName === 'TH')\r\n                continue;\r\n\r\n              // Is a key-value-cell\r\n              if (sib.classList.contains('matchkeyvalues')) {\r\n\r\n                Array.from(\r\n                  sib.getElementsByTagName('div')\r\n                ).forEach(function(keyvaluepair){\r\n\r\n                  // Get annotation value from cell\r\n                  annotation = _getAnnotation(prefix, keyvaluepair);\r\n\r\n                  if (annotation !== '') {\r\n\r\n                    // Add annotation to string\r\n                    this._addToToken(i, annotation);\r\n                    keyvaluepair.classList.add('chosen');\r\n                  };\r\n                }, this);\r\n              }\r\n\r\n              // Normal cell\r\n              else {\r\n\r\n                // Get annotation value from cell\r\n                annotation = _getAnnotation(prefix, sib);\r\n\r\n                if (annotation !== '') {\r\n\r\n                  // Add annotation to string\r\n                  this._addToToken(i, annotation);\r\n                  sib.classList.add('chosen');\r\n                };\r\n              }\r\n\r\n              i++;\r\n            };\r\n          };\r\n        };\r\n      };\r\n\r\n      event.stopPropagation();\r\n    },\r\n\r\n\r\n    // Add term to token\r\n    _addToToken : function (index, term) {\r\n\r\n      let token = this._query[index];\r\n\r\n      // Initialize token\r\n      if (token === undefined) {\r\n        token = this._query[index] = [];\r\n      };\r\n\r\n      // Push to token array\r\n      token.push(term);\r\n\r\n      // Make terms unique\r\n      this._query[index] = token.filter(\r\n        function (e, i, arr) {\r\n          return arr.lastIndexOf(e) === i;\r\n        }\r\n      );\r\n\r\n      this.show();\r\n    },\r\n\r\n\r\n    // Remove term from token\r\n    _removeFromToken : function (index, term) {\r\n      let token = this._query[index];\r\n\r\n      if (token === undefined)\r\n        return;\r\n\r\n      token.splice(token.indexOf(term), 1);\r\n\r\n      this._query[index] = token.length > 0 ? token : undefined;\r\n      \r\n      this.show();\r\n    },\r\n\r\n    \r\n    // Get element representing annotation line\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n\r\n    // Check if the query fragment is shown\r\n    shown : function () {\r\n      return this._shown;\r\n    },\r\n\r\n    \r\n    // Show annotation fragment\r\n    show : function () {\r\n\r\n      const t = this;\r\n      const str = t.toString();\r\n      const m = t._matchTable;\r\n\r\n      // Fragment is empty\r\n      if (str === '') {\r\n\r\n        // Hide element\r\n        if (t._shown === true) {\r\n          m.parentNode.removeChild(t._el);\r\n          t._shown = false;\r\n        }\r\n      }\r\n\r\n      // Fragment is defined\r\n      else {\r\n\r\n        if (t._shown === false) {\r\n\r\n          // Insert after\r\n          m.parentNode.insertBefore(\r\n            t._el, m.nextSibling\r\n          );\r\n          t._shown = true;\r\n        };\r\n\r\n        // set value\r\n        t._queryFragment.innerText = str;\r\n      };\r\n    },\r\n\r\n\r\n    // Add term to token if not yet chosen, otherwise remove\r\n    toggleInToken : function (node, index, term) {\r\n      const cl = node.classList;\r\n      if (cl.contains('chosen')) {\r\n        this._removeFromToken(index, term);\r\n        cl.remove('chosen');\r\n      }\r\n      else {\r\n        this._addToToken(index, term);\r\n        cl.add('chosen');\r\n      };\r\n    },\r\n\r\n\r\n    // Stringify annotation\r\n    toString : function () {\r\n      let str = '';\r\n      let distance = 0;\r\n\r\n      // This needs to take undefined tokens into account, therefore\r\n      // forEach() is not an option\r\n      let token;\r\n      for (let i = 0; i < this._query.length; i++) {\r\n        token = this._query[i];\r\n\r\n        // Token is defined\r\n        if (token !== undefined) {\r\n          if (distance > 0) {\r\n            str += '[]';\r\n            if (distance > 1) {\r\n              str += '{' + distance + '}';\r\n            };\r\n            distance = 0;\r\n          };\r\n          \r\n          str += '[' + token.sort().join(\" & \") + ']';\r\n        }\r\n\r\n        // Token is not defined - but distances count\r\n        else if (str !== '') {\r\n          distance++;\r\n        };\r\n      };\r\n\r\n      return str;\r\n    },\r\n\r\n\r\n    // Add query fragment to query bar\r\n    toQueryBar : function (e) {\r\n      const t = this;\r\n\r\n      if (t._ql === undefined || t._q === undefined || t._ql === null) {\r\n        console.log('No query language object defined');\r\n        return;\r\n      };\r\n\r\n      // Find query language field for Poliqarp\r\n      const ql = Array.from(\r\n        t._ql.options\r\n      ).find(e => e.value == 'poliqarp');\r\n\r\n      if (ql)\r\n        ql.selected = true;\r\n\r\n      // Insert to query bar\r\n      t._q.value = t.toString();\r\n\r\n      // Scroll to top\r\n      window.scrollTo(0, 0);\r\n    }\r\n  };  \r\n});\r\n\n/**\r\n * Table representation of token-based\r\n * annotations of a match.\r\n */\r\n\r\n\r\ndefine('match/table',[\r\n  'match/querycreator',\r\n  \"util\"\r\n], function (matchQueryCreator) {\r\n\r\n  /*\r\n   * TODO:\r\n   *   Create base object for all matchinfo classes!\r\n   * TODO:\r\n   *   Rename to match/annotationtable\r\n   */\r\n  const _TermRE = new RegExp(\"^(?:([^\\/]+?)\\/)?([^:]+?):(.+?)$\");\r\n  const d = document;\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new table view for a match\r\n     * based on a snippet string.\r\n     */\r\n    create : function (snippet) {\r\n      return Object.create(this)._init(snippet);\r\n    },\r\n\r\n    // Initialize table based on snippet\r\n    _init : function (snippet) {\r\n\r\n      // Create html for traversal\r\n      const html = d.createElement(\"div\");\r\n      const t = this;\r\n      html.innerHTML = snippet;\r\n      \r\n      t._pos     = 0;\r\n      t._token   = [];\r\n      t._mark    = [];\r\n      t._markE   = undefined;\r\n      t._cutted  = [];\r\n      t._info    = [];\r\n      t._foundry = {};\r\n      t._layer   = {};\r\n    \r\n      // Parse the snippet\r\n      t._parse(html.childNodes, false);      \r\n\r\n      html.innerHTML = '';\r\n      return t;\r\n    },\r\n\r\n\r\n    // TODO: Destroy match!\r\n    destroy : function () {\r\n      this._matchCreator = undefined;\r\n    },\r\n\r\n\r\n    /**\r\n     * Length of the table (columns),\r\n     * aka the number of tokens\r\n     * in the snippet.\r\n     */\r\n    length : function () {\r\n      return this._pos;\r\n    },\r\n\r\n\r\n    /**\r\n     * Move the viewport to the match\r\n     */\r\n    toMark : function () {\r\n      if (this._markE === undefined)\r\n        return;\r\n      this._markE.scrollIntoView({\r\n        inline: \"start\",\r\n        block: \"nearest\"\r\n      });\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the token in the snippet\r\n     * At a given position.\r\n     *\r\n     * @param pos\r\n     */\r\n    getToken : function (pos) {\r\n      if (pos === undefined)\r\n        return this._token;\r\n      return this._token[pos];\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the annotation of a token\r\n     * in the snippet based on the position,\r\n     * the foundry, and the layer.\r\n     *\r\n     * @param pos\r\n     * @param foundry\r\n     * @param layer\r\n     */\r\n    getValue : function (pos, foundry, layer) {\r\n      return this._info[pos][foundry + '/' + layer]\r\n    },\r\n\r\n\r\n    // Parse the snippet\r\n    _parse : function (children, mark) {\r\n\r\n      // Get all children\r\n      children.forEach(function(c) {\r\n        const t = this;\r\n\r\n        // Create object on position unless it exists\r\n        if (t._info[t._pos] === undefined) {\r\n          t._info[t._pos] = {};\r\n        };\r\n\r\n        // Store at position in foundry/layer as array\r\n        const found = t._info[t._pos];\r\n\r\n        // Element with title\r\n        if (c.nodeType === 1) {\r\n          let newMark = mark;\r\n\r\n          if (c.tagName === 'MARK') {\r\n            newMark = true;\r\n          }\r\n\r\n          else if (c.hasAttribute(\"title\") &&\r\n              _TermRE.exec(c.getAttribute(\"title\"))) {\r\n\r\n            // Fill position with info\r\n            let foundry, layer, value;\r\n            if (RegExp.$2) {\r\n              foundry = RegExp.$1;\r\n              layer   = RegExp.$2;\r\n            }\r\n            else {\r\n              foundry = \"base\";\r\n              layer   = RegExp.$1\r\n            };\r\n\r\n            value = RegExp.$3;\r\n      \r\n            if (found[foundry + \"/\" + layer] === undefined) {\r\n              found[foundry + \"/\" + layer] = [value];\r\n            }\r\n            else {\r\n              // if (found[foundry + \"/\" + layer].indexOf(value) === -1) {\r\n              if (!found[foundry + \"/\" + layer].includes(value)) {\r\n                // Push value to foundry/layer at correct position\r\n                found[foundry + \"/\" + layer].push(value);\r\n              };\r\n            }\r\n\r\n            // Set foundry\r\n            if (t._foundry[foundry] === undefined)\r\n              t._foundry[foundry] = {};\r\n            t._foundry[foundry][layer] = 1;\r\n\r\n            // Set layer\r\n            if (t._layer[layer] === undefined)\r\n              t._layer[layer] = {};\r\n            t._layer[layer][foundry] = 1;\r\n          }\r\n\r\n          // The current position marks a cut\r\n          else if (c.hasAttribute(\"class\") && c.getAttribute(\"class\") == \"cutted\") {\r\n            t._cutted.push(t._pos);\r\n            t._token[t._pos++] = \"\";            \r\n          }\r\n\r\n          // depth search\r\n          if (c.hasChildNodes())\r\n            t._parse(c.childNodes, newMark);\r\n        }\r\n\r\n        // Leaf node\r\n        // store string on position and go to next string\r\n        else if (c.nodeType === 3) {\r\n          if (c.nodeValue.match(/[a-z0-9\\u25ae]/iu)) {\r\n            t._mark[t._pos] = mark ? true : false;\r\n            t._token[t._pos++] = c.nodeValue;\r\n          };\r\n        };\r\n      }, this);\r\n\r\n      delete this._info[this._pos];\r\n    },\r\n\r\n\r\n    /**\r\n     * Get HTML table view of annotations.\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      // First the legend table\r\n      const wrap = d.createElement('div');\r\n\r\n      const table = wrap.addE('table');\r\n\r\n      this._el = wrap;\r\n\r\n      // Single row in head\r\n      let tr = table.addE('thead').addE('tr');\r\n\r\n      const ah = KorAP.annotationHelper || { \"getDesc\" : function () {}};\r\n      \r\n      // Add cell to row\r\n      const addCell = function (type, key, value) {        \r\n        const c = this.addE(type);\r\n\r\n        if (value === undefined)\r\n          return c;\r\n\r\n        if (key && value instanceof Array && value[1] !== undefined) {\r\n\r\n          // There are multiple values to add\r\n          c.classList.add('matchkeyvalues');\r\n\r\n          let e, anno;\r\n          value.forEach(function(v) {\r\n            e = c.addE('div');\r\n            e.addT(v);\r\n\r\n            anno = ah.getDesc(key, v);\r\n\r\n            if (anno)\r\n              e.setAttribute(\"title\", anno);\r\n          });\r\n        }\r\n\r\n        else {\r\n\r\n          if (value instanceof Array)\r\n            value = value[0];\r\n\r\n          c.addT(value);\r\n\r\n          // Add tooltip\r\n          const anno = ah.getDesc(key, value);\r\n          if (anno)\r\n            c.setAttribute(\"title\", anno);\r\n        };\r\n\r\n        return c;\r\n      };\r\n\r\n      tr.addCell = addCell;\r\n\r\n      // Add header information\r\n      tr.addCell('th', undefined, 'Foundry');\r\n      tr.addCell('th', undefined, 'Layer');\r\n\r\n      // Add tokens\r\n      Object.keys(this._token).forEach(function(i) {\r\n        const surface = this.getToken(i);\r\n        const c = tr.addCell('th', undefined, surface);\r\n        if (this._mark[i]) {\r\n          c.classList.add('mark');\r\n          if (this._markE === undefined) {\r\n            this._markE = c;\r\n          };\r\n        }\r\n        else if (this._cutted[0] == i || this._cutted[1] == i) {\r\n          c.classList.add('cutted');\r\n        };\r\n\r\n        // In case the title is very long - add a title attribute\r\n        if (surface.length > 20) {\r\n          c.setAttribute(\"title\", surface)\r\n        }\r\n      }, this);\r\n      \r\n      const tbody = table.addE('tbody');\r\n\r\n      let layerList, key, v, value, cell;\r\n      \r\n      Object.keys(this._foundry).sort().forEach(function(foundry) {\r\n        let layerList =\r\n            Object.keys(this._foundry[foundry]).sort();\r\n\r\n        layerList.forEach(function(layer) {\r\n\r\n          tr = tbody.addE('tr');\r\n          tr.setAttribute('tabindex', 0);\r\n          tr.addCell = addCell;\r\n          tr.addCell('th', undefined, foundry);\r\n          tr.addCell('th', undefined, layer);\r\n\r\n          key = foundry + '/' + layer + '=';\r\n\r\n          for (v = 0; v < this.length(); v++) {\r\n\r\n            // Get the cell value\r\n            value = this.getValue(v, foundry, layer);\r\n\r\n            // Add cell to row\r\n            cell = tr.addCell(\r\n              'td',\r\n              key,\r\n              value \r\n            );\r\n\r\n            if (this._mark[v]) {\r\n              cell.classList.add('mark');\r\n            };\r\n          };\r\n        }, this);\r\n      }, this);\r\n      \r\n      // Add query creator\r\n      this._matchCreator = matchQueryCreator.create(this._el);\r\n      \r\n      return this._el;\r\n    },\r\n  };\r\n});\r\n\n/**\r\n * Object representing information\r\n * about a match's layer annotation.\r\n */\r\n\r\n\r\ndefine('match/infolayer',[],function () {\r\n\r\n  const _AvailableRE =\r\n    new RegExp(\"^([^\\/]+?)\\/([^=]+?)(?:=(spans|rels|tokens))?$\");\r\n\r\n  return {\r\n    /**\r\n     * Create new match information\r\n     * object for one layer.\r\n     *\r\n     * Alternatively pass a string as\r\n     * <tt>base/s=span</tt>\r\n     *\r\n     * @param foundry\r\n     */\r\n    create : function (foundry, layer, type) {\r\n      return Object.create(this)._init(foundry, layer, type);\r\n    },\r\n\r\n\r\n    // Initialize Layer \r\n    _init : function (foundry, layer, type) {\r\n      if (foundry === undefined)\r\n\t      throw new Error(\"Missing parameters\");\r\n\r\n      const t = this;\r\n      \r\n      if (layer === undefined) {\r\n\t      if (_AvailableRE.exec(foundry)) {\r\n\t        t.foundry = RegExp.$1;\r\n\t        t.layer = RegExp.$2;\r\n\t        t.type = RegExp.$3;\r\n\t      }\r\n\t      else {\r\n\t        throw new Error(\"Missing parameters\");\r\n\t      };\r\n      }\r\n      else {\r\n\t      t.foundry = foundry;\r\n\t      t.layer = layer;\r\n\t      t.type = type;\r\n      };\r\n      \r\n      if (t.type === undefined)\r\n\t      t.type = 'tokens';\r\n\r\n      return t;\r\n    }\r\n  };\r\n});\r\n\r\n\n\r\n\r\ndefine('view/match/tokentable',[\r\n  'view',\r\n  'match/table',\r\n  'match/infolayer'\r\n], function (viewClass, matchTableClass, infoLayerClass) {\r\n\r\n  const d = document;\r\n  \r\n  return {\r\n    create : function (match) {\r\n      return Object.create(viewClass)\r\n        ._init(['tokentable'])\r\n        .upgradeTo(this)\r\n        ._init(match);\r\n    },\r\n\r\n\r\n    _init : function (match) {\r\n      this._match = match;\r\n      return this;\r\n    },\r\n    \r\n\r\n    /**\r\n     * TokenTable view element\r\n     */\r\n    show : function () {\r\n      if (this._show)\r\n        return this._show;\r\n\r\n      // Append default table\r\n      const matchtable = d.createElement('div');\r\n      matchtable.classList.add('matchtable', 'loading');\r\n      this._show = matchtable;\r\n      return matchtable;\r\n    },\r\n\r\n\r\n    /**\r\n     * Do after embedding\r\n     */\r\n    afterEmbed : function () {\r\n      // TODO:\r\n      //   Create try-catch-exception-handling\r\n\r\n      // TODO:\r\n      //   Loading should have a timeout on view-level\r\n      //   matchtable.classList.remove('loading');\r\n\r\n      // var that = this;\r\n      const matchtable = this._show;\r\n\r\n      // Create the table asynchronous\r\n      this.getData(undefined, function (table) {\r\n\r\n        if (table !== null) {\r\n          matchtable.appendChild(table.element());\r\n          table.toMark();\r\n\t      };\r\n      });\r\n\r\n      // Load data\r\n      matchtable.classList.remove('loading');      \r\n    },\r\n\r\n\r\n    /**\r\n     * Get match object\r\n     */\r\n    match : function () {\r\n      return this._match;\r\n    },\r\n\r\n\r\n    /**\r\n     * Retrieve and parse snippet for table\r\n     * representation\r\n     */\r\n    getData : function (tokens, cb) {\r\n      let focus = [];\r\n\r\n      // Get all tokens\r\n      if (tokens === undefined) {\r\n        focus = this._match.getTokens();\r\n      }\r\n\r\n      // Get only some tokens\r\n      else {\r\n        \r\n        // Push newly to focus array\r\n        tokens.forEach(function(term) {\r\n          try {\r\n            // Create info layer objects\r\n            const layer = infoLayerClass.create(term);\r\n            layer.type = \"tokens\";\r\n            focus.push(layer);\r\n          }\r\n          catch (e) {\r\n            return;\r\n          };\r\n        });\r\n      };\r\n      \r\n      // No tokens chosen\r\n      if (focus.length == 0)\r\n        cb(null);\r\n\r\n      try {\r\n        // Get info (may be cached)\r\n        KorAP.API.getMatchInfo(\r\n          this._match,\r\n          { 'spans' : false, 'layer' : focus },\r\n        \r\n          // Callback for retrieval\r\n          function (matchResponse) {\r\n\r\n            if (matchResponse === undefined)\r\n              cb(null);\r\n\r\n            // Get snippet from match info\r\n            if (matchResponse[\"snippet\"] !== undefined) {\r\n              cb(\r\n                this._table = matchTableClass.create(matchResponse[\"snippet\"])\r\n              );\r\n            };\r\n          }.bind(this)\r\n        );\r\n      }\r\n      catch (e) {\r\n        KorAP.log(0, e);\r\n        cb(null);\r\n      };\r\n\r\n      /*\r\n      // Todo: Store the table as a hash of the focus\r\n      return null;\r\n      */\r\n    },\r\n\r\n\r\n    // Delete circular references\r\n    onClose : function () {\r\n      this._match = undefined;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Create a virtual corpus fragment,\r\n * that can be shown and merged with the\r\n * main VC.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\n\r\ndefine('vc/fragment',['vc/doc', 'util'], function (docClass) {\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.NEW_CONSTRAINT = loc.NEW_CONSTRAINT || 'New Constraint';\r\n  \r\n  // Create a VC doc\r\n  function _doc (op) {\r\n    const doc = document.createElement('div');\r\n    doc.setAttribute('class','doc');\r\n          \r\n    const key = doc.addE('span');\r\n    key.setAttribute('class','key');\r\n    key.addT(op[0]);\r\n\r\n    const match = doc.addE('span');\r\n    match.setAttribute('class','match');\r\n    match.addT('eq');\r\n\r\n    const value = doc.addE('span');\r\n    value.setAttribute('class', 'value');\r\n    value.addT(op[1]);\r\n\r\n    return doc;\r\n  };\r\n\r\n\r\n  // Return object\r\n  return {\r\n\r\n    /**\r\n     * Construct a new VC fragment.\r\n     */\r\n    create : function () {\r\n      const obj = Object.create(this);\r\n      obj._operands = [];\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Add document constraint to fragment\r\n     */\r\n    add : function (key, value, type) {\r\n      this._operands.forEach(function (op, i, arr) {\r\n        if (op[0] === key && op[1] === value) {\r\n          arr.splice(i,1);\r\n        }\r\n      });\r\n      this._operands.push([key, value, type]);\r\n      this.update();\r\n    },\r\n\r\n    \r\n    /**\r\n     * Remove document constraint from fragment\r\n     */\r\n    remove : function (key, value) {\r\n      for (let i = 0; i < this._operands.length; i++) {\r\n        let op = this._operands[i];\r\n        if (op[0] === key && op[1] === value) {\r\n          this._operands.splice(i, 1);\r\n          this.update();\r\n          return;\r\n        };\r\n      };\r\n      return;\r\n    },\r\n\r\n\r\n    /**\r\n     * Check, if the fragment contains any constraints\r\n     */\r\n    isEmpty : function () {\r\n      return this._operands.length > 0 ? false : true;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the element associated with the virtual corpus\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined) {\r\n        return this._el;\r\n      };\r\n\r\n      // Initialize element\r\n      const e = this._el = document.createElement('div');\r\n      e.classList.add('vc', 'fragment');\r\n\r\n      // Prepend info text\r\n      e.addE('span').addT(loc.NEW_CONSTRAINT + ':');\r\n      this._frag = e.addE('div');\r\n      \r\n      return e;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return operands as document objects\r\n     */\r\n    documents : function () {\r\n      return this._operands.map(\r\n        function (item) {\r\n          const doc = docClass.create();\r\n          doc.key(item[0]);\r\n          doc.matchop(\"eq\");\r\n          doc.value(item[1]);\r\n          doc.type(item[2] === \"date\" ? \"date\" : \"string\");\r\n          return doc;\r\n        }\r\n      );\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the whole object based on the underlying data structure\r\n     */\r\n    update : function() {\r\n\r\n      // <div class=\"docGroup\" data-operation=\"and\">\r\n      //   <div class=\"doc\">\r\n      //     <span class=\"key\">author</span>\r\n      //     <span class=\"match\">eq</span>\r\n      //     <span class=\"value\">Baum</span>\r\n      //   </div>\r\n      // </div>\r\n      let root;\r\n      const l = this._operands.length;\r\n\r\n      if (l > 1) {\r\n        root = document.createElement('div');\r\n        root.setAttribute('class','docGroup');\r\n        root.setAttribute('data-operation', 'and');\r\n        this._operands.forEach(i => root.appendChild(_doc(i)));\r\n      }\r\n\r\n      else if (l == 1) {\r\n        root = _doc(this._operands[0]);\r\n      };\r\n\r\n      // Init element\r\n      this.element();\r\n\r\n      const e = this._frag;\r\n      if (l === 0) {\r\n        _removeChildren(e);\r\n      }\r\n      else if (e.firstChild)\r\n        e.replaceChild(root, e.firstChild);\r\n      else\r\n        e.appendChild(root);\r\n        \r\n      return this;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Stringification\r\n     */\r\n    toQuery : function () {\r\n\r\n      if (this._operands.length === 0)\r\n        return '';\r\n\r\n      return this._operands.map(\r\n        function (item) {\r\n          if (item[2] === \"date\") {\r\n            return item[0] + ' in ' + item[1];\r\n          };\r\n          return item[0] + ' = ' + new String(item[1]).quote();\r\n        }\r\n      ).join(\" & \");\r\n    }\r\n  }\r\n});\r\n\n\r\n\r\ndefine('match/corpusByMatch',['vc/fragment', 'util'], function (vcFragmentClass) {\r\n  \r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function (meta) {\r\n      return Object.create(this)._init(meta);\r\n    },\r\n\r\n\r\n    // Initialize corpusByMatch\r\n    _init : function (meta) {\r\n      const t = this;\r\n\r\n      // Meta is an element <dl />\r\n      if (meta === undefined) {\r\n        throw new Error('Missing parameters');\r\n      }\r\n      else if (!(meta instanceof Node)) {\r\n        throw new Error(\"Requires element\");\r\n      };\r\n\r\n      // Collect the meta constraints\r\n      t._vc = {};\r\n\r\n      // Remember the meta table\r\n      t._meta = meta;\r\n\r\n      // CorpusByMatch can be disabled per configuration.\r\n      // This is necessary, as the feature won't work with\r\n      // indices created before Krill V0.57.\r\n      // This is an undocumented feature and will be\r\n      // removed in future versions.\r\n      // This will also require a change in matchinfo.scss\r\n      if (KorAP.Conf && KorAP.Conf[\"CorpusByMatchDisabled\"]) {\r\n        t._meta.classList.add(\"cbm-disabled\");\r\n        return t;\r\n      };\r\n\r\n      t._meta.addEventListener(\r\n        \"click\", t.clickOnMeta.bind(t), false\r\n      );\r\n\r\n      t._fragment = vcFragmentClass.create();      \r\n\r\n      t._fragment.element().addEventListener(\r\n        \"click\", t.toVcBuilder.bind(t), true\r\n      );\r\n\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Join fragment with VC\r\n     */\r\n    toVcBuilder : function (e) {\r\n      if (e)\r\n        e.stopPropagation();\r\n\r\n      if (this._fragment.isEmpty())\r\n        return;\r\n\r\n      const vc = KorAP.vc;\r\n      if (!vc) {\r\n        console.log(\"Global VC not established\");\r\n        return;\r\n      };\r\n\r\n      for (const doc of this._fragment.documents()) {\r\n        vc.addRequired(doc);\r\n      };\r\n\r\n      if (!vc.isOpen())\r\n        vc.open();\r\n\r\n      // Scroll to top\r\n      window.scrollTo(0, 0);\r\n    },\r\n\r\n\r\n    // Event handler for meta constraint creation\r\n    clickOnMeta : function (e) {\r\n      e.stopPropagation();\r\n      if (e.target === e.currentTarget) {\r\n        return;\r\n      };\r\n\r\n      // Get event target\r\n      const target = e.target;\r\n\r\n      let key, value, type;\r\n\r\n      // Meta information is a single value\r\n      if (target.tagName === 'DD') {\r\n        type = target.getAttribute(\"data-type\");\r\n        key  = target.previousElementSibling.innerText;\r\n        value = target.innerText;\r\n      }\r\n\r\n      // Meta information is in a list\r\n      else if (target.tagName === 'DIV') {\r\n        type = target.parentNode.getAttribute(\"data-type\");\r\n        key = target.parentNode.previousElementSibling.innerText;\r\n        value = target.innerText;\r\n      };\r\n\r\n      // Ignore stored types\r\n      if (type === \"type:store\" || type === \"type:attachement\")\r\n        return;\r\n\r\n      type = type || \"type:string\";\r\n\r\n      // Add or remove the constraint to the fragment\r\n      if (key && value) {\r\n        const t = this;\r\n        if (target.classList.contains(\"chosen\")) {\r\n          target.classList.remove(\"chosen\");\r\n          t.remove(key, value);\r\n        }\r\n        else {\r\n          target.classList.add(\"chosen\");\r\n          t.add(key, value, type);\r\n        };\r\n\r\n        // Check if the fragment is empty\r\n        // If empty - hide!\r\n        if (!t._fragment.isEmpty()) {\r\n          t._meta.parentNode.insertBefore(\r\n            t._fragment.element(),\r\n            t._meta.nextSibling\r\n          );\r\n        }\r\n\r\n        // Otherwise show!\r\n        else {\r\n          t._meta.parentNode.removeChild(\r\n            t._fragment.element()\r\n          );\r\n        };\r\n      }\r\n    },\r\n\r\n    /**\r\n     * Add constraint to fragment\r\n     */\r\n    add : function (key, value, type) {\r\n      type = type.replace(/^type:/, '');\r\n      this._fragment.add(key, value, type);\r\n    },\r\n\r\n\r\n    /**\r\n     * Remove constraint from fragment\r\n     */\r\n    remove : function (key, value) {\r\n      this._fragment.remove(key, value);\r\n    },\r\n    \r\n    /**\r\n     * Stringify fragment\r\n     */\r\n    toQuery : function () {\r\n      return this._fragment.toQuery();\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Parse Data URI scheme for attachement fields\r\n * Afterwards the object has the parameters\r\n * - contentType (defaults to text/plain)\r\n * - base64 (if the data was base64 encoded)\r\n * - isLink (if the contentType is application/x.korap-link)\r\n * - param (as a map of arbitrary parameters)\r\n * - payload (the URI decoded data)\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('match/attachement',[],function () {\r\n\r\n  const uriRE = new RegExp(\"^data: *([^;,]*?(?: *; *[^,;]+?)*) *, *(.+)$\");\r\n  const mapRE = new RegExp(\"^ *([^=]+?) *= *(.+?) *$\");\r\n\r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function (url) {\r\n      return Object.create(this)._init(url);\r\n    },\r\n\r\n    // Parse URI scheme\r\n    _init : function (url) {\r\n      const t = this;\r\n\r\n      // Decode\r\n      url = decodeURIComponent(url);\r\n\r\n      if (!uriRE.exec(url))\r\n        return;\r\n\r\n      t.payload = RegExp.$2;\r\n\r\n      let map = {};\r\n      let start = 0;\r\n      t.base64 = false;\r\n      t.isLink = false;\r\n      t.contentType = \"text/plain\";\r\n\r\n      // Split parameter map\r\n      RegExp.$1.split(/ *; */).map(function (item) {\r\n        const t = this;\r\n\r\n        // Check first parameter\r\n        if (!start++ && item.match(/^[-a-z0-9]+?\\/.+$/)) {\r\n          t.contentType = item;\r\n\r\n          if (item === \"application/x.korap-link\")\r\n            t.isLink = true;\r\n        }\r\n       \r\n        // Decode b64\r\n        else if (item.toLowerCase() == \"base64\") {\r\n          t.base64 = true;\r\n          t.payload = window.atob(t.payload);\r\n        }\r\n\r\n        // Parse arbitrary metadata\r\n        else if (mapRE.exec(item)) {\r\n          map[RegExp.$1] = RegExp.$2;\r\n        };\r\n      }.bind(t));\r\n\r\n      t.param = map;\r\n      return t;\r\n    },\r\n\r\n    /**\r\n     * Inline the attachement\r\n     * This should optimally be plugin-treatable\r\n     */ \r\n    inline : function () {\r\n      if (this.isLink) {\r\n        const title = this.param[\"title\"] || this.payload;\r\n        const a = document.createElement('a');\r\n        a.setAttribute('href', this.payload);\r\n        a.setAttribute('rel', 'noopener noreferrer');\r\n        a.addT(title);\r\n        return a;\r\n      };\r\n\r\n      return document.createTextNode(this.payload);\r\n    }\r\n  }\r\n});\r\n\n\r\n\r\ndefine('match/meta',['match/corpusByMatch','match/attachement','util'], function (cbmClass, attClass) {\r\n\r\n  // Localization values\r\n  const loc   = KorAP.Locale;\r\n  loc.METADATA = loc.METADATA || 'Metadata';\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new match object\r\n     */\r\n    create : function (match, fields) {\r\n      return Object.create(this)._init(match, fields);\r\n    },\r\n\r\n\r\n    /**\r\n     * Initialize object\r\n     */\r\n    _init : function (match, fields) {\r\n      this._match = match;\r\n      this._fields = fields;\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get match object\r\n     */\r\n    match : function () {\r\n      return this._match;\r\n    },\r\n\r\n\r\n    /**\r\n     * Create match reference view.\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      if (this._fields === null)\r\n        return;\r\n\r\n      const metaDL = document.createElement('dl');\r\n      metaDL.classList.add(\"flex\");\r\n\r\n      this._el = metaDL;\r\n\r\n      const fields = this._fields;\r\n\r\n      // Copy original array position to object\r\n      // before sorting by key title\r\n      const posInMetaArray = {};\r\n      fields.forEach((f,i) => posInMetaArray[f[\"key\"]] = i);\r\n\r\n      // TODO: Meta fields should be separated\r\n\r\n      // Sort all meta keys alphabetically\r\n      Object.keys(posInMetaArray).sort().forEach(function(k) {\r\n        let field = fields[posInMetaArray[k]]; // This is the object\r\n\r\n        let metaL, dt, metaDescr, metaDD, att;\r\n\r\n        // Ignore internal IDs\r\n        if (k !== \"UID\" &&\r\n            k !== \"corpusID\" &&\r\n            k !== \"docID\" &&\r\n            k !== \"textID\" &&\r\n            k !== \"layerInfos\") {\r\n\r\n          metaL = document.createElement('div');\r\n          \r\n          dt = metaL.addE('dt');\r\n          dt.addT(k);\r\n          dt.setAttribute(\"title\", k);\r\n          \r\n          metaDescr = field[\"value\"];\r\n          metaDD = metaL.addE('dd');\r\n          metaDD.setAttribute('data-type', field[\"type\"]);\r\n\r\n          if(metaDescr instanceof Array){\r\n        \t  metaDD.classList.add(\"metakeyvalues\");\r\n            metaDescr.forEach(function(md) {\r\n              if (field[\"type\"] === 'type:attachement') {\r\n                att = attClass.create(md);\r\n                if (att)\r\n        \t        metaDD.addE('div').appendChild(att.inline());\r\n              }\r\n              else {\r\n        \t      metaDD.addE('div').addT(md);\r\n              }\r\n        \t  });\r\n          }\r\n          else{\r\n            if (field[\"type\"] === 'type:attachement') {\r\n              att = attClass.create(field[\"value\"]);\r\n              if (att)\r\n                metaDD.appendChild(att.inline());\r\n            }\r\n            else {\r\n              metaDD.addT(field[\"value\"]);\r\n            };\r\n          }\r\n          \r\n          metaDL.appendChild(metaL);\r\n        };\r\n      });\r\n\r\n      // Add corpusByMatch assistant\r\n      this._corpusByMatch = cbmClass.create(this._el);\r\n\r\n      return this._el;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('view/match/meta',[\r\n  'view',\r\n  'match/meta'\r\n], function (viewClass, matchMetaClass) {\r\n\r\n  const d = document;\r\n  \r\n  return {\r\n    create : function (match) {\r\n      return Object.create(viewClass)\r\n        ._init(['metatable'])\r\n        .upgradeTo(this)\r\n        ._init(match);\r\n    },\r\n\r\n\r\n    _init : function (match) {\r\n      this._match = match;\r\n      return this;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Meta view element\r\n     */\r\n    show : function () {\r\n      if (this._show)\r\n        return this._show;\r\n\r\n      const metaTable = document.createElement('div');\r\n      metaTable.classList.add('metatable', 'loading');\r\n\r\n      this.getData(function (meta) {\r\n        if (meta === null)\r\n          return;\r\n\r\n        // Load data\r\n        metaTable.classList.remove('loading');\r\n        metaTable.appendChild(meta.element());\r\n      });\r\n\r\n\r\n      // TODO:\r\n      //   Loading should have a timeout on view-level\r\n      //   matchtable.classList.remove('loading');\r\n\r\n      return this._show = metaTable;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get match object\r\n     */\r\n    match : function () {\r\n      return this._match;\r\n    },\r\n\r\n\r\n    /**\r\n     * Retrieve and parse snippet for table\r\n     * representation\r\n     */\r\n    getData : function (cb) {\r\n\r\n      const match = this._match;\r\n      try {\r\n        KorAP.API.getTextInfo(\r\n          match, {}, function (textResponse) {\r\n            \r\n            if (textResponse === undefined) {\r\n              cb(null);\r\n              return;\r\n            };\r\n\r\n            const doc = textResponse[\"document\"];\r\n            if (doc === undefined) {\r\n              cb(null);\r\n              return;\r\n            };\r\n\r\n            const fields = doc[\"fields\"];\r\n            if (fields === undefined) {\r\n              cb(null);\r\n              return;\r\n            };\r\n\r\n            // Add metainfo to matchview\r\n            cb(matchMetaClass.create(\r\n              match, fields\r\n            ));\r\n          }\r\n        );\r\n      }\r\n      catch (e) {\r\n        KorAP.log(0, e);\r\n        cb(null);\r\n      };\r\n    },\r\n\r\n\r\n    // Delete circular references\r\n    onClose : function () {\r\n      this._match = undefined;\r\n    }\r\n  }\r\n});\r\n\n!function(e){if(\"object\"==typeof exports&&\"undefined\"!=typeof module)module.exports=e();else if(\"function\"==typeof define&&define.amd)define('lib/dagre',[],e);else{var f;\"undefined\"!=typeof window?f=window:\"undefined\"!=typeof global?f=global:\"undefined\"!=typeof self&&(f=self),f.dagre=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){\r\n/*\r\nCopyright (c) 2012-2014 Chris Pettitt\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in\r\nall copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\nTHE SOFTWARE.\r\n*/\r\n\r\nmodule.exports = {\r\n  graphlib: require(\"./lib/graphlib\"),\r\n\r\n  layout: require(\"./lib/layout\"),\r\n  debug: require(\"./lib/debug\"),\r\n  util: {\r\n    time: require(\"./lib/util\").time,\r\n    notime: require(\"./lib/util\").notime\r\n  },\r\n  version: require(\"./lib/version\")\r\n};\r\n\r\n},{\"./lib/debug\":6,\"./lib/graphlib\":7,\"./lib/layout\":9,\"./lib/util\":29,\"./lib/version\":30}],2:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\"),\r\n    greedyFAS = require(\"./greedy-fas\");\r\n\r\nmodule.exports = {\r\n  run: run,\r\n  undo: undo\r\n};\r\n\r\nfunction run(g) {\r\n  var fas = (g.graph().acyclicer === \"greedy\"\r\n                ? greedyFAS(g, weightFn(g))\r\n                : dfsFAS(g));\r\n  _.each(fas, function(e) {\r\n    var label = g.edge(e);\r\n    g.removeEdge(e);\r\n    label.forwardName = e.name;\r\n    label.reversed = true;\r\n    g.setEdge(e.w, e.v, label, _.uniqueId(\"rev\"));\r\n  });\r\n\r\n  function weightFn(g) {\r\n    return function(e) {\r\n      return g.edge(e).weight;\r\n    };\r\n  }\r\n}\r\n\r\nfunction dfsFAS(g) {\r\n  var fas = [],\r\n      stack = {},\r\n      visited = {};\r\n\r\n  function dfs(v) {\r\n    if (_.has(visited, v)) {\r\n      return;\r\n    }\r\n    visited[v] = true;\r\n    stack[v] = true;\r\n    _.each(g.outEdges(v), function(e) {\r\n      if (_.has(stack, e.w)) {\r\n        fas.push(e);\r\n      } else {\r\n        dfs(e.w);\r\n      }\r\n    });\r\n    delete stack[v];\r\n  }\r\n\r\n  _.each(g.nodes(), dfs);\r\n  return fas;\r\n}\r\n\r\nfunction undo(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var label = g.edge(e);\r\n    if (label.reversed) {\r\n      g.removeEdge(e);\r\n\r\n      var forwardName = label.forwardName;\r\n      delete label.reversed;\r\n      delete label.forwardName;\r\n      g.setEdge(e.w, e.v, label, forwardName);\r\n    }\r\n  });\r\n}\r\n\r\n},{\"./greedy-fas\":8,\"./lodash\":10}],3:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    util = require(\"./util\");\r\n\r\nmodule.exports = addBorderSegments;\r\n\r\nfunction addBorderSegments(g) {\r\n  function dfs(v) {\r\n    var children = g.children(v),\r\n        node = g.node(v);\r\n    if (children.length) {\r\n      _.each(children, dfs);\r\n    }\r\n\r\n    if (_.has(node, \"minRank\")) {\r\n      node.borderLeft = [];\r\n      node.borderRight = [];\r\n      for (var rank = node.minRank, maxRank = node.maxRank + 1;\r\n           rank < maxRank;\r\n           ++rank) {\r\n        addBorderNode(g, \"borderLeft\", \"_bl\", v, node, rank);\r\n        addBorderNode(g, \"borderRight\", \"_br\", v, node, rank);\r\n      }\r\n    }\r\n  }\r\n\r\n  _.each(g.children(), dfs);\r\n}\r\n\r\nfunction addBorderNode(g, prop, prefix, sg, sgNode, rank) {\r\n  var label = { width: 0, height: 0, rank: rank },\r\n      prev = sgNode[prop][rank - 1],\r\n      curr = util.addDummyNode(g, \"border\", label, prefix);\r\n  sgNode[prop][rank] = curr;\r\n  g.setParent(curr, sg);\r\n  if (prev) {\r\n    g.setEdge(prev, curr, { weight: 1 });\r\n  }\r\n}\r\n\r\n},{\"./lodash\":10,\"./util\":29}],4:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\");\r\n\r\nmodule.exports = {\r\n  adjust: adjust,\r\n  undo: undo\r\n};\r\n\r\nfunction adjust(g) {\r\n  var rankDir = g.graph().rankdir.toLowerCase();\r\n  if (rankDir === \"lr\" || rankDir === \"rl\") {\r\n    swapWidthHeight(g);\r\n  }\r\n}\r\n\r\nfunction undo(g) {\r\n  var rankDir = g.graph().rankdir.toLowerCase();\r\n  if (rankDir === \"bt\" || rankDir === \"rl\") {\r\n    reverseY(g);\r\n  }\r\n\r\n  if (rankDir === \"lr\" || rankDir === \"rl\") {\r\n    swapXY(g);\r\n    swapWidthHeight(g);\r\n  }\r\n}\r\n\r\nfunction swapWidthHeight(g) {\r\n  _.each(g.nodes(), function(v) { swapWidthHeightOne(g.node(v)); });\r\n  _.each(g.edges(), function(e) { swapWidthHeightOne(g.edge(e)); });\r\n}\r\n\r\nfunction swapWidthHeightOne(attrs) {\r\n  var w = attrs.width;\r\n  attrs.width = attrs.height;\r\n  attrs.height = w;\r\n}\r\n\r\nfunction reverseY(g) {\r\n  _.each(g.nodes(), function(v) { reverseYOne(g.node(v)); });\r\n\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    _.each(edge.points, reverseYOne);\r\n    if (_.has(edge, \"y\")) {\r\n      reverseYOne(edge);\r\n    }\r\n  });\r\n}\r\n\r\nfunction reverseYOne(attrs) {\r\n  attrs.y = -attrs.y;\r\n}\r\n\r\nfunction swapXY(g) {\r\n  _.each(g.nodes(), function(v) { swapXYOne(g.node(v)); });\r\n\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    _.each(edge.points, swapXYOne);\r\n    if (_.has(edge, \"x\")) {\r\n      swapXYOne(edge);\r\n    }\r\n  });\r\n}\r\n\r\nfunction swapXYOne(attrs) {\r\n  var x = attrs.x;\r\n  attrs.x = attrs.y;\r\n  attrs.y = x;\r\n}\r\n\r\n},{\"./lodash\":10}],5:[function(require,module,exports){\r\n/*\r\n * Simple doubly linked list implementation derived from Cormen, et al.,\r\n * \"Introduction to Algorithms\".\r\n */\r\n\r\nmodule.exports = List;\r\n\r\nfunction List() {\r\n  var sentinel = {};\r\n  sentinel._next = sentinel._prev = sentinel;\r\n  this._sentinel = sentinel;\r\n}\r\n\r\nList.prototype.dequeue = function() {\r\n  var sentinel = this._sentinel,\r\n      entry = sentinel._prev;\r\n  if (entry !== sentinel) {\r\n    unlink(entry);\r\n    return entry;\r\n  }\r\n};\r\n\r\nList.prototype.enqueue = function(entry) {\r\n  var sentinel = this._sentinel;\r\n  if (entry._prev && entry._next) {\r\n    unlink(entry);\r\n  }\r\n  entry._next = sentinel._next;\r\n  sentinel._next._prev = entry;\r\n  sentinel._next = entry;\r\n  entry._prev = sentinel;\r\n};\r\n\r\nList.prototype.toString = function() {\r\n  var strs = [],\r\n      sentinel = this._sentinel,\r\n      curr = sentinel._prev;\r\n  while (curr !== sentinel) {\r\n    strs.push(JSON.stringify(curr, filterOutLinks));\r\n    curr = curr._prev;\r\n  }\r\n  return \"[\" + strs.join(\", \") + \"]\";\r\n};\r\n\r\nfunction unlink(entry) {\r\n  entry._prev._next = entry._next;\r\n  entry._next._prev = entry._prev;\r\n  delete entry._next;\r\n  delete entry._prev;\r\n}\r\n\r\nfunction filterOutLinks(k, v) {\r\n  if (k !== \"_next\" && k !== \"_prev\") {\r\n    return v;\r\n  }\r\n}\r\n\r\n},{}],6:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    util = require(\"./util\"),\r\n    Graph = require(\"./graphlib\").Graph;\r\n\r\nmodule.exports = {\r\n  debugOrdering: debugOrdering\r\n};\r\n\r\n/* istanbul ignore next */\r\nfunction debugOrdering(g) {\r\n  var layerMatrix = util.buildLayerMatrix(g);\r\n\r\n  var h = new Graph({ compound: true, multigraph: true }).setGraph({});\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    h.setNode(v, { label: v });\r\n    h.setParent(v, \"layer\" + g.node(v).rank);\r\n  });\r\n\r\n  _.each(g.edges(), function(e) {\r\n    h.setEdge(e.v, e.w, {}, e.name);\r\n  });\r\n\r\n  _.each(layerMatrix, function(layer, i) {\r\n    var layerV = \"layer\" + i;\r\n    h.setNode(layerV, { rank: \"same\" });\r\n    _.reduce(layer, function(u, v) {\r\n      h.setEdge(u, v, { style: \"invis\" });\r\n      return v;\r\n    });\r\n  });\r\n\r\n  return h;\r\n}\r\n\r\n},{\"./graphlib\":7,\"./lodash\":10,\"./util\":29}],7:[function(require,module,exports){\r\n/* global window */\r\n\r\nvar graphlib;\r\n\r\nif (require) {\r\n  try {\r\n    graphlib = require(\"graphlib\");\r\n  } catch (e) {}\r\n}\r\n\r\nif (!graphlib) {\r\n  graphlib = window.graphlib;\r\n}\r\n\r\nmodule.exports = graphlib;\r\n\r\n},{\"graphlib\":31}],8:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    Graph = require(\"./graphlib\").Graph,\r\n    List = require(\"./data/list\");\r\n\r\n/*\r\n * A greedy heuristic for finding a feedback arc set for a graph. A feedback\r\n * arc set is a set of edges that can be removed to make a graph acyclic.\r\n * The algorithm comes from: P. Eades, X. Lin, and W. F. Smyth, \"A fast and\r\n * effective heuristic for the feedback arc set problem.\" This implementation\r\n * adjusts that from the paper to allow for weighted edges.\r\n */\r\nmodule.exports = greedyFAS;\r\n\r\nvar DEFAULT_WEIGHT_FN = _.constant(1);\r\n\r\nfunction greedyFAS(g, weightFn) {\r\n  if (g.nodeCount() <= 1) {\r\n    return [];\r\n  }\r\n  var state = buildState(g, weightFn || DEFAULT_WEIGHT_FN);\r\n  var results = doGreedyFAS(state.graph, state.buckets, state.zeroIdx);\r\n\r\n  // Expand multi-edges\r\n  return _.flatten(_.map(results, function(e) {\r\n    return g.outEdges(e.v, e.w);\r\n  }), true);\r\n}\r\n\r\nfunction doGreedyFAS(g, buckets, zeroIdx) {\r\n  var results = [],\r\n      sources = buckets[buckets.length - 1],\r\n      sinks = buckets[0];\r\n\r\n  var entry;\r\n  while (g.nodeCount()) {\r\n    while ((entry = sinks.dequeue()))   { removeNode(g, buckets, zeroIdx, entry); }\r\n    while ((entry = sources.dequeue())) { removeNode(g, buckets, zeroIdx, entry); }\r\n    if (g.nodeCount()) {\r\n      for (var i = buckets.length - 2; i > 0; --i) {\r\n        entry = buckets[i].dequeue();\r\n        if (entry) {\r\n          results = results.concat(removeNode(g, buckets, zeroIdx, entry, true));\r\n          break;\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  return results;\r\n}\r\n\r\nfunction removeNode(g, buckets, zeroIdx, entry, collectPredecessors) {\r\n  var results = collectPredecessors ? [] : undefined;\r\n\r\n  _.each(g.inEdges(entry.v), function(edge) {\r\n    var weight = g.edge(edge),\r\n        uEntry = g.node(edge.v);\r\n\r\n    if (collectPredecessors) {\r\n      results.push({ v: edge.v, w: edge.w });\r\n    }\r\n\r\n    uEntry.out -= weight;\r\n    assignBucket(buckets, zeroIdx, uEntry);\r\n  });\r\n\r\n  _.each(g.outEdges(entry.v), function(edge) {\r\n    var weight = g.edge(edge),\r\n        w = edge.w,\r\n        wEntry = g.node(w);\r\n    wEntry[\"in\"] -= weight;\r\n    assignBucket(buckets, zeroIdx, wEntry);\r\n  });\r\n\r\n  g.removeNode(entry.v);\r\n\r\n  return results;\r\n}\r\n\r\nfunction buildState(g, weightFn) {\r\n  var fasGraph = new Graph(),\r\n      maxIn = 0,\r\n      maxOut = 0;\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    fasGraph.setNode(v, { v: v, \"in\": 0, out: 0 });\r\n  });\r\n\r\n  // Aggregate weights on nodes, but also sum the weights across multi-edges\r\n  // into a single edge for the fasGraph.\r\n  _.each(g.edges(), function(e) {\r\n    var prevWeight = fasGraph.edge(e.v, e.w) || 0,\r\n        weight = weightFn(e),\r\n        edgeWeight = prevWeight + weight;\r\n    fasGraph.setEdge(e.v, e.w, edgeWeight);\r\n    maxOut = Math.max(maxOut, fasGraph.node(e.v).out += weight);\r\n    maxIn  = Math.max(maxIn,  fasGraph.node(e.w)[\"in\"]  += weight);\r\n  });\r\n\r\n  var buckets = _.range(maxOut + maxIn + 3).map(function() { return new List(); });\r\n  var zeroIdx = maxIn + 1;\r\n\r\n  _.each(fasGraph.nodes(), function(v) {\r\n    assignBucket(buckets, zeroIdx, fasGraph.node(v));\r\n  });\r\n\r\n  return { graph: fasGraph, buckets: buckets, zeroIdx: zeroIdx };\r\n}\r\n\r\nfunction assignBucket(buckets, zeroIdx, entry) {\r\n  if (!entry.out) {\r\n    buckets[0].enqueue(entry);\r\n  } else if (!entry[\"in\"]) {\r\n    buckets[buckets.length - 1].enqueue(entry);\r\n  } else {\r\n    buckets[entry.out - entry[\"in\"] + zeroIdx].enqueue(entry);\r\n  }\r\n}\r\n\r\n},{\"./data/list\":5,\"./graphlib\":7,\"./lodash\":10}],9:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\"),\r\n    acyclic = require(\"./acyclic\"),\r\n    normalize = require(\"./normalize\"),\r\n    rank = require(\"./rank\"),\r\n    normalizeRanks = require(\"./util\").normalizeRanks,\r\n    parentDummyChains = require(\"./parent-dummy-chains\"),\r\n    removeEmptyRanks = require(\"./util\").removeEmptyRanks,\r\n    nestingGraph = require(\"./nesting-graph\"),\r\n    addBorderSegments = require(\"./add-border-segments\"),\r\n    coordinateSystem = require(\"./coordinate-system\"),\r\n    order = require(\"./order\"),\r\n    position = require(\"./position\"),\r\n    util = require(\"./util\"),\r\n    Graph = require(\"./graphlib\").Graph;\r\n\r\nmodule.exports = layout;\r\n\r\nfunction layout(g, opts) {\r\n  var time = opts && opts.debugTiming ? util.time : util.notime;\r\n  time(\"layout\", function() {\r\n    var layoutGraph = time(\"  buildLayoutGraph\",\r\n                               function() { return buildLayoutGraph(g); });\r\n    time(\"  runLayout\",        function() { runLayout(layoutGraph, time); });\r\n    time(\"  updateInputGraph\", function() { updateInputGraph(g, layoutGraph); });\r\n  });\r\n}\r\n\r\nfunction runLayout(g, time) {\r\n  time(\"    makeSpaceForEdgeLabels\", function() { makeSpaceForEdgeLabels(g); });\r\n  time(\"    removeSelfEdges\",        function() { removeSelfEdges(g); });\r\n  time(\"    acyclic\",                function() { acyclic.run(g); });\r\n  time(\"    nestingGraph.run\",       function() { nestingGraph.run(g); });\r\n  time(\"    rank\",                   function() { rank(util.asNonCompoundGraph(g)); });\r\n  time(\"    injectEdgeLabelProxies\", function() { injectEdgeLabelProxies(g); });\r\n  time(\"    removeEmptyRanks\",       function() { removeEmptyRanks(g); });\r\n  time(\"    nestingGraph.cleanup\",   function() { nestingGraph.cleanup(g); });\r\n  time(\"    normalizeRanks\",         function() { normalizeRanks(g); });\r\n  time(\"    assignRankMinMax\",       function() { assignRankMinMax(g); });\r\n  time(\"    removeEdgeLabelProxies\", function() { removeEdgeLabelProxies(g); });\r\n  time(\"    normalize.run\",          function() { normalize.run(g); });\r\n  time(\"    parentDummyChains\",      function() { parentDummyChains(g); });\r\n  time(\"    addBorderSegments\",      function() { addBorderSegments(g); });\r\n  time(\"    order\",                  function() { order(g); });\r\n  time(\"    insertSelfEdges\",        function() { insertSelfEdges(g); });\r\n  time(\"    adjustCoordinateSystem\", function() { coordinateSystem.adjust(g); });\r\n  time(\"    position\",               function() { position(g); });\r\n  time(\"    positionSelfEdges\",      function() { positionSelfEdges(g); });\r\n  time(\"    removeBorderNodes\",      function() { removeBorderNodes(g); });\r\n  time(\"    normalize.undo\",         function() { normalize.undo(g); });\r\n  time(\"    fixupEdgeLabelCoords\",   function() { fixupEdgeLabelCoords(g); });\r\n  time(\"    undoCoordinateSystem\",   function() { coordinateSystem.undo(g); });\r\n  time(\"    translateGraph\",         function() { translateGraph(g); });\r\n  time(\"    assignNodeIntersects\",   function() { assignNodeIntersects(g); });\r\n  time(\"    reversePoints\",          function() { reversePointsForReversedEdges(g); });\r\n  time(\"    acyclic.undo\",           function() { acyclic.undo(g); });\r\n}\r\n\r\n/*\r\n * Copies final layout information from the layout graph back to the input\r\n * graph. This process only copies whitelisted attributes from the layout graph\r\n * to the input graph, so it serves as a good place to determine what\r\n * attributes can influence layout.\r\n */\r\nfunction updateInputGraph(inputGraph, layoutGraph) {\r\n  _.each(inputGraph.nodes(), function(v) {\r\n    var inputLabel = inputGraph.node(v),\r\n        layoutLabel = layoutGraph.node(v);\r\n\r\n    if (inputLabel) {\r\n      inputLabel.x = layoutLabel.x;\r\n      inputLabel.y = layoutLabel.y;\r\n\r\n      if (layoutGraph.children(v).length) {\r\n        inputLabel.width = layoutLabel.width;\r\n        inputLabel.height = layoutLabel.height;\r\n      }\r\n    }\r\n  });\r\n\r\n  _.each(inputGraph.edges(), function(e) {\r\n    var inputLabel = inputGraph.edge(e),\r\n        layoutLabel = layoutGraph.edge(e);\r\n\r\n    inputLabel.points = layoutLabel.points;\r\n    if (_.has(layoutLabel, \"x\")) {\r\n      inputLabel.x = layoutLabel.x;\r\n      inputLabel.y = layoutLabel.y;\r\n    }\r\n  });\r\n\r\n  inputGraph.graph().width = layoutGraph.graph().width;\r\n  inputGraph.graph().height = layoutGraph.graph().height;\r\n}\r\n\r\nvar graphNumAttrs = [\"nodesep\", \"edgesep\", \"ranksep\", \"marginx\", \"marginy\"],\r\n    graphDefaults = { ranksep: 50, edgesep: 20, nodesep: 50, rankdir: \"tb\" },\r\n    graphAttrs = [\"acyclicer\", \"ranker\", \"rankdir\", \"align\"],\r\n    nodeNumAttrs = [\"width\", \"height\"],\r\n    nodeDefaults = { width: 0, height: 0 },\r\n    edgeNumAttrs = [\"minlen\", \"weight\", \"width\", \"height\", \"labeloffset\"],\r\n    edgeDefaults = {\r\n      minlen: 1, weight: 1, width: 0, height: 0,\r\n      labeloffset: 10, labelpos: \"r\"\r\n    },\r\n    edgeAttrs = [\"labelpos\"];\r\n\r\n/*\r\n * Constructs a new graph from the input graph, which can be used for layout.\r\n * This process copies only whitelisted attributes from the input graph to the\r\n * layout graph. Thus this function serves as a good place to determine what\r\n * attributes can influence layout.\r\n */\r\nfunction buildLayoutGraph(inputGraph) {\r\n  var g = new Graph({ multigraph: true, compound: true }),\r\n      graph = canonicalize(inputGraph.graph());\r\n\r\n  g.setGraph(_.merge({},\r\n    graphDefaults,\r\n    selectNumberAttrs(graph, graphNumAttrs),\r\n    _.pick(graph, graphAttrs)));\r\n\r\n  _.each(inputGraph.nodes(), function(v) {\r\n    var node = canonicalize(inputGraph.node(v));\r\n    g.setNode(v, _.defaults(selectNumberAttrs(node, nodeNumAttrs), nodeDefaults));\r\n    g.setParent(v, inputGraph.parent(v));\r\n  });\r\n\r\n  _.each(inputGraph.edges(), function(e) {\r\n    var edge = canonicalize(inputGraph.edge(e));\r\n    g.setEdge(e, _.merge({},\r\n      edgeDefaults,\r\n      selectNumberAttrs(edge, edgeNumAttrs),\r\n      _.pick(edge, edgeAttrs)));\r\n  });\r\n\r\n  return g;\r\n}\r\n\r\n/*\r\n * This idea comes from the Gansner paper: to account for edge labels in our\r\n * layout we split each rank in half by doubling minlen and halving ranksep.\r\n * Then we can place labels at these mid-points between nodes.\r\n *\r\n * We also add some minimal padding to the width to push the label for the edge\r\n * away from the edge itself a bit.\r\n */\r\nfunction makeSpaceForEdgeLabels(g) {\r\n  var graph = g.graph();\r\n  graph.ranksep /= 2;\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    edge.minlen *= 2;\r\n    if (edge.labelpos.toLowerCase() !== \"c\") {\r\n      if (graph.rankdir === \"TB\" || graph.rankdir === \"BT\") {\r\n        edge.width += edge.labeloffset;\r\n      } else {\r\n        edge.height += edge.labeloffset;\r\n      }\r\n    }\r\n  });\r\n}\r\n\r\n/*\r\n * Creates temporary dummy nodes that capture the rank in which each edge's\r\n * label is going to, if it has one of non-zero width and height. We do this\r\n * so that we can safely remove empty ranks while preserving balance for the\r\n * label's position.\r\n */\r\nfunction injectEdgeLabelProxies(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (edge.width && edge.height) {\r\n      var v = g.node(e.v),\r\n          w = g.node(e.w),\r\n          label = { rank: (w.rank - v.rank) / 2 + v.rank, e: e };\r\n      util.addDummyNode(g, \"edge-proxy\", label, \"_ep\");\r\n    }\r\n  });\r\n}\r\n\r\nfunction assignRankMinMax(g) {\r\n  var maxRank = 0;\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    if (node.borderTop) {\r\n      node.minRank = g.node(node.borderTop).rank;\r\n      node.maxRank = g.node(node.borderBottom).rank;\r\n      maxRank = _.max(maxRank, node.maxRank);\r\n    }\r\n  });\r\n  g.graph().maxRank = maxRank;\r\n}\r\n\r\nfunction removeEdgeLabelProxies(g) {\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    if (node.dummy === \"edge-proxy\") {\r\n      g.edge(node.e).labelRank = node.rank;\r\n      g.removeNode(v);\r\n    }\r\n  });\r\n}\r\n\r\nfunction translateGraph(g) {\r\n  var minX = Number.POSITIVE_INFINITY,\r\n      maxX = 0,\r\n      minY = Number.POSITIVE_INFINITY,\r\n      maxY = 0,\r\n      graphLabel = g.graph(),\r\n      marginX = graphLabel.marginx || 0,\r\n      marginY = graphLabel.marginy || 0;\r\n\r\n  function getExtremes(attrs) {\r\n    var x = attrs.x,\r\n        y = attrs.y,\r\n        w = attrs.width,\r\n        h = attrs.height;\r\n    minX = Math.min(minX, x - w / 2);\r\n    maxX = Math.max(maxX, x + w / 2);\r\n    minY = Math.min(minY, y - h / 2);\r\n    maxY = Math.max(maxY, y + h / 2);\r\n  }\r\n\r\n  _.each(g.nodes(), function(v) { getExtremes(g.node(v)); });\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (_.has(edge, \"x\")) {\r\n      getExtremes(edge);\r\n    }\r\n  });\r\n\r\n  minX -= marginX;\r\n  minY -= marginY;\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    node.x -= minX;\r\n    node.y -= minY;\r\n  });\r\n\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    _.each(edge.points, function(p) {\r\n      p.x -= minX;\r\n      p.y -= minY;\r\n    });\r\n    if (_.has(edge, \"x\")) { edge.x -= minX; }\r\n    if (_.has(edge, \"y\")) { edge.y -= minY; }\r\n  });\r\n\r\n  graphLabel.width = maxX - minX + marginX;\r\n  graphLabel.height = maxY - minY + marginY;\r\n}\r\n\r\nfunction assignNodeIntersects(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e),\r\n        nodeV = g.node(e.v),\r\n        nodeW = g.node(e.w),\r\n        p1, p2;\r\n    if (!edge.points) {\r\n      edge.points = [];\r\n      p1 = nodeW;\r\n      p2 = nodeV;\r\n    } else {\r\n      p1 = edge.points[0];\r\n      p2 = edge.points[edge.points.length - 1];\r\n    }\r\n    edge.points.unshift(util.intersectRect(nodeV, p1));\r\n    edge.points.push(util.intersectRect(nodeW, p2));\r\n  });\r\n}\r\n\r\nfunction fixupEdgeLabelCoords(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (_.has(edge, \"x\")) {\r\n      if (edge.labelpos === \"l\" || edge.labelpos === \"r\") {\r\n        edge.width -= edge.labeloffset;\r\n      }\r\n      switch (edge.labelpos) {\r\n        case \"l\": edge.x -= edge.width / 2 + edge.labeloffset; break;\r\n        case \"r\": edge.x += edge.width / 2 + edge.labeloffset; break;\r\n      }\r\n    }\r\n  });\r\n}\r\n\r\nfunction reversePointsForReversedEdges(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (edge.reversed) {\r\n      edge.points.reverse();\r\n    }\r\n  });\r\n}\r\n\r\nfunction removeBorderNodes(g) {\r\n  _.each(g.nodes(), function(v) {\r\n    if (g.children(v).length) {\r\n      var node = g.node(v),\r\n          t = g.node(node.borderTop),\r\n          b = g.node(node.borderBottom),\r\n          l = g.node(_.last(node.borderLeft)),\r\n          r = g.node(_.last(node.borderRight));\r\n\r\n      node.width = Math.abs(r.x - l.x);\r\n      node.height = Math.abs(b.y - t.y);\r\n      node.x = l.x + node.width / 2;\r\n      node.y = t.y + node.height / 2;\r\n    }\r\n  });\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    if (g.node(v).dummy === \"border\") {\r\n      g.removeNode(v);\r\n    }\r\n  });\r\n}\r\n\r\nfunction removeSelfEdges(g) {\r\n  _.each(g.edges(), function(e) {\r\n    if (e.v === e.w) {\r\n      var node = g.node(e.v);\r\n      if (!node.selfEdges) {\r\n        node.selfEdges = [];\r\n      }\r\n      node.selfEdges.push({ e: e, label: g.edge(e) });\r\n      g.removeEdge(e);\r\n    }\r\n  });\r\n}\r\n\r\nfunction insertSelfEdges(g) {\r\n  var layers = util.buildLayerMatrix(g);\r\n  _.each(layers, function(layer) {\r\n    var orderShift = 0;\r\n    _.each(layer, function(v, i) {\r\n      var node = g.node(v);\r\n      node.order = i + orderShift;\r\n      _.each(node.selfEdges, function(selfEdge) {\r\n        util.addDummyNode(g, \"selfedge\", {\r\n          width: selfEdge.label.width,\r\n          height: selfEdge.label.height,\r\n          rank: node.rank,\r\n          order: i + (++orderShift),\r\n          e: selfEdge.e,\r\n          label: selfEdge.label\r\n        }, \"_se\");\r\n      });\r\n      delete node.selfEdges;\r\n    });\r\n  });\r\n}\r\n\r\nfunction positionSelfEdges(g) {\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    if (node.dummy === \"selfedge\") {\r\n      var selfNode = g.node(node.e.v),\r\n          x = selfNode.x + selfNode.width / 2,\r\n          y = selfNode.y,\r\n          dx = node.x - x,\r\n          dy = selfNode.height / 2;\r\n      g.setEdge(node.e, node.label);\r\n      g.removeNode(v);\r\n      node.label.points = [\r\n        { x: x + 2 * dx / 3, y: y - dy },\r\n        { x: x + 5 * dx / 6, y: y - dy },\r\n        { x: x +     dx    , y: y },\r\n        { x: x + 5 * dx / 6, y: y + dy },\r\n        { x: x + 2 * dx / 3, y: y + dy },\r\n      ];\r\n      node.label.x = node.x;\r\n      node.label.y = node.y;\r\n    }\r\n  });\r\n}\r\n\r\nfunction selectNumberAttrs(obj, attrs) {\r\n  return _.mapValues(_.pick(obj, attrs), Number);\r\n}\r\n\r\nfunction canonicalize(attrs) {\r\n  var newAttrs = {};\r\n  _.each(attrs, function(v, k) {\r\n    newAttrs[k.toLowerCase()] = v;\r\n  });\r\n  return newAttrs;\r\n}\r\n\r\n},{\"./acyclic\":2,\"./add-border-segments\":3,\"./coordinate-system\":4,\"./graphlib\":7,\"./lodash\":10,\"./nesting-graph\":11,\"./normalize\":12,\"./order\":17,\"./parent-dummy-chains\":22,\"./position\":24,\"./rank\":26,\"./util\":29}],10:[function(require,module,exports){\r\n/* global window */\r\n\r\nvar lodash;\r\n\r\nif (require) {\r\n  try {\r\n    lodash = require(\"lodash\");\r\n  } catch (e) {}\r\n}\r\n\r\nif (!lodash) {\r\n  lodash = window._;\r\n}\r\n\r\nmodule.exports = lodash;\r\n\r\n},{\"lodash\":51}],11:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    util = require(\"./util\");\r\n\r\nmodule.exports = {\r\n  run: run,\r\n  cleanup: cleanup\r\n};\r\n\r\n/*\r\n * A nesting graph creates dummy nodes for the tops and bottoms of subgraphs,\r\n * adds appropriate edges to ensure that all cluster nodes are placed between\r\n * these boundries, and ensures that the graph is connected.\r\n *\r\n * In addition we ensure, through the use of the minlen property, that nodes\r\n * and subgraph border nodes to not end up on the same rank.\r\n *\r\n * Preconditions:\r\n *\r\n *    1. Input graph is a DAG\r\n *    2. Nodes in the input graph has a minlen attribute\r\n *\r\n * Postconditions:\r\n *\r\n *    1. Input graph is connected.\r\n *    2. Dummy nodes are added for the tops and bottoms of subgraphs.\r\n *    3. The minlen attribute for nodes is adjusted to ensure nodes do not\r\n *       get placed on the same rank as subgraph border nodes.\r\n *\r\n * The nesting graph idea comes from Sander, \"Layout of Compound Directed\r\n * Graphs.\"\r\n */\r\nfunction run(g) {\r\n  var root = util.addDummyNode(g, \"root\", {}, \"_root\"),\r\n      depths = treeDepths(g),\r\n      height = _.max(depths) - 1,\r\n      nodeSep = 2 * height + 1;\r\n\r\n  g.graph().nestingRoot = root;\r\n\r\n  // Multiply minlen by nodeSep to align nodes on non-border ranks.\r\n  _.each(g.edges(), function(e) { g.edge(e).minlen *= nodeSep; });\r\n\r\n  // Calculate a weight that is sufficient to keep subgraphs vertically compact\r\n  var weight = sumWeights(g) + 1;\r\n\r\n  // Create border nodes and link them up\r\n  _.each(g.children(), function(child) {\r\n    dfs(g, root, nodeSep, weight, height, depths, child);\r\n  });\r\n\r\n  // Save the multiplier for node layers for later removal of empty border\r\n  // layers.\r\n  g.graph().nodeRankFactor = nodeSep;\r\n}\r\n\r\nfunction dfs(g, root, nodeSep, weight, height, depths, v) {\r\n  var children = g.children(v);\r\n  if (!children.length) {\r\n    if (v !== root) {\r\n      g.setEdge(root, v, { weight: 0, minlen: nodeSep });\r\n    }\r\n    return;\r\n  }\r\n\r\n  var top = util.addBorderNode(g, \"_bt\"),\r\n      bottom = util.addBorderNode(g, \"_bb\"),\r\n      label = g.node(v);\r\n\r\n  g.setParent(top, v);\r\n  label.borderTop = top;\r\n  g.setParent(bottom, v);\r\n  label.borderBottom = bottom;\r\n\r\n  _.each(children, function(child) {\r\n    dfs(g, root, nodeSep, weight, height, depths, child);\r\n\r\n    var childNode = g.node(child),\r\n        childTop = childNode.borderTop ? childNode.borderTop : child,\r\n        childBottom = childNode.borderBottom ? childNode.borderBottom : child,\r\n        thisWeight = childNode.borderTop ? weight : 2 * weight,\r\n        minlen = childTop !== childBottom ? 1 : height - depths[v] + 1;\r\n\r\n    g.setEdge(top, childTop, {\r\n      weight: thisWeight,\r\n      minlen: minlen,\r\n      nestingEdge: true\r\n    });\r\n\r\n    g.setEdge(childBottom, bottom, {\r\n      weight: thisWeight,\r\n      minlen: minlen,\r\n      nestingEdge: true\r\n    });\r\n  });\r\n\r\n  if (!g.parent(v)) {\r\n    g.setEdge(root, top, { weight: 0, minlen: height + depths[v] });\r\n  }\r\n}\r\n\r\nfunction treeDepths(g) {\r\n  var depths = {};\r\n  function dfs(v, depth) {\r\n    var children = g.children(v);\r\n    if (children && children.length) {\r\n      _.each(children, function(child) {\r\n        dfs(child, depth + 1);\r\n      });\r\n    }\r\n    depths[v] = depth;\r\n  }\r\n  _.each(g.children(), function(v) { dfs(v, 1); });\r\n  return depths;\r\n}\r\n\r\nfunction sumWeights(g) {\r\n  return _.reduce(g.edges(), function(acc, e) {\r\n    return acc + g.edge(e).weight;\r\n  }, 0);\r\n}\r\n\r\nfunction cleanup(g) {\r\n  var graphLabel = g.graph();\r\n  g.removeNode(graphLabel.nestingRoot);\r\n  delete graphLabel.nestingRoot;\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (edge.nestingEdge) {\r\n      g.removeEdge(e);\r\n    }\r\n  });\r\n}\r\n\r\n},{\"./lodash\":10,\"./util\":29}],12:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\"),\r\n    util = require(\"./util\");\r\n\r\nmodule.exports = {\r\n  run: run,\r\n  undo: undo\r\n};\r\n\r\n/*\r\n * Breaks any long edges in the graph into short segments that span 1 layer\r\n * each. This operation is undoable with the denormalize function.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. The input graph is a DAG.\r\n *    2. Each node in the graph has a \"rank\" property.\r\n *\r\n * Post-condition:\r\n *\r\n *    1. All edges in the graph have a length of 1.\r\n *    2. Dummy nodes are added where edges have been split into segments.\r\n *    3. The graph is augmented with a \"dummyChains\" attribute which contains\r\n *       the first dummy in each chain of dummy nodes produced.\r\n */\r\nfunction run(g) {\r\n  g.graph().dummyChains = [];\r\n  _.each(g.edges(), function(edge) { normalizeEdge(g, edge); });\r\n}\r\n\r\nfunction normalizeEdge(g, e) {\r\n  var v = e.v,\r\n      vRank = g.node(v).rank,\r\n      w = e.w,\r\n      wRank = g.node(w).rank,\r\n      name = e.name,\r\n      edgeLabel = g.edge(e),\r\n      labelRank = edgeLabel.labelRank;\r\n\r\n  if (wRank === vRank + 1) return;\r\n\r\n  g.removeEdge(e);\r\n\r\n  var dummy, attrs, i;\r\n  for (i = 0, ++vRank; vRank < wRank; ++i, ++vRank) {\r\n    edgeLabel.points = [];\r\n    attrs = {\r\n      width: 0, height: 0,\r\n      edgeLabel: edgeLabel, edgeObj: e,\r\n      rank: vRank\r\n    };\r\n    dummy = util.addDummyNode(g, \"edge\", attrs, \"_d\");\r\n    if (vRank === labelRank) {\r\n      attrs.width = edgeLabel.width;\r\n      attrs.height = edgeLabel.height;\r\n      attrs.dummy = \"edge-label\";\r\n      attrs.labelpos = edgeLabel.labelpos;\r\n    }\r\n    g.setEdge(v, dummy, { weight: edgeLabel.weight }, name);\r\n    if (i === 0) {\r\n      g.graph().dummyChains.push(dummy);\r\n    }\r\n    v = dummy;\r\n  }\r\n\r\n  g.setEdge(v, w, { weight: edgeLabel.weight }, name);\r\n}\r\n\r\nfunction undo(g) {\r\n  _.each(g.graph().dummyChains, function(v) {\r\n    var node = g.node(v),\r\n        origLabel = node.edgeLabel,\r\n        w;\r\n    g.setEdge(node.edgeObj, origLabel);\r\n    while (node.dummy) {\r\n      w = g.successors(v)[0];\r\n      g.removeNode(v);\r\n      origLabel.points.push({ x: node.x, y: node.y });\r\n      if (node.dummy === \"edge-label\") {\r\n        origLabel.x = node.x;\r\n        origLabel.y = node.y;\r\n        origLabel.width = node.width;\r\n        origLabel.height = node.height;\r\n      }\r\n      v = w;\r\n      node = g.node(v);\r\n    }\r\n  });\r\n}\r\n\r\n},{\"./lodash\":10,\"./util\":29}],13:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = addSubgraphConstraints;\r\n\r\nfunction addSubgraphConstraints(g, cg, vs) {\r\n  var prev = {},\r\n      rootPrev;\r\n\r\n  _.each(vs, function(v) {\r\n    var child = g.parent(v),\r\n        parent,\r\n        prevChild;\r\n    while (child) {\r\n      parent = g.parent(child);\r\n      if (parent) {\r\n        prevChild = prev[parent];\r\n        prev[parent] = child;\r\n      } else {\r\n        prevChild = rootPrev;\r\n        rootPrev = child;\r\n      }\r\n      if (prevChild && prevChild !== child) {\r\n        cg.setEdge(prevChild, child);\r\n        return;\r\n      }\r\n      child = parent;\r\n    }\r\n  });\r\n\r\n  /*\r\n  function dfs(v) {\r\n    var children = v ? g.children(v) : g.children();\r\n    if (children.length) {\r\n      var min = Number.POSITIVE_INFINITY,\r\n          subgraphs = [];\r\n      _.each(children, function(child) {\r\n        var childMin = dfs(child);\r\n        if (g.children(child).length) {\r\n          subgraphs.push({ v: child, order: childMin });\r\n        }\r\n        min = Math.min(min, childMin);\r\n      });\r\n      _.reduce(_.sortBy(subgraphs, \"order\"), function(prev, curr) {\r\n        cg.setEdge(prev.v, curr.v);\r\n        return curr;\r\n      });\r\n      return min;\r\n    }\r\n    return g.node(v).order;\r\n  }\r\n  dfs(undefined);\r\n  */\r\n}\r\n\r\n},{\"../lodash\":10}],14:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = barycenter;\r\n\r\nfunction barycenter(g, movable) {\r\n  return _.map(movable, function(v) {\r\n    var inV = g.inEdges(v);\r\n    if (!inV.length) {\r\n      return { v: v };\r\n    } else {\r\n      var result = _.reduce(inV, function(acc, e) {\r\n        var edge = g.edge(e),\r\n            nodeU = g.node(e.v);\r\n        return {\r\n          sum: acc.sum + (edge.weight * nodeU.order),\r\n          weight: acc.weight + edge.weight\r\n        };\r\n      }, { sum: 0, weight: 0 });\r\n\r\n      return {\r\n        v: v,\r\n        barycenter: result.sum / result.weight,\r\n        weight: result.weight\r\n      };\r\n    }\r\n  });\r\n}\r\n\r\n\r\n},{\"../lodash\":10}],15:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    Graph = require(\"../graphlib\").Graph;\r\n\r\nmodule.exports = buildLayerGraph;\r\n\r\n/*\r\n * Constructs a graph that can be used to sort a layer of nodes. The graph will\r\n * contain all base and subgraph nodes from the request layer in their original\r\n * hierarchy and any edges that are incident on these nodes and are of the type\r\n * requested by the \"relationship\" parameter.\r\n *\r\n * Nodes from the requested rank that do not have parents are assigned a root\r\n * node in the output graph, which is set in the root graph attribute. This\r\n * makes it easy to walk the hierarchy of movable nodes during ordering.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Input graph is a DAG\r\n *    2. Base nodes in the input graph have a rank attribute\r\n *    3. Subgraph nodes in the input graph has minRank and maxRank attributes\r\n *    4. Edges have an assigned weight\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. Output graph has all nodes in the movable rank with preserved\r\n *       hierarchy.\r\n *    2. Root nodes in the movable layer are made children of the node\r\n *       indicated by the root attribute of the graph.\r\n *    3. Non-movable nodes incident on movable nodes, selected by the\r\n *       relationship parameter, are included in the graph (without hierarchy).\r\n *    4. Edges incident on movable nodes, selected by the relationship\r\n *       parameter, are added to the output graph.\r\n *    5. The weights for copied edges are aggregated as need, since the output\r\n *       graph is not a multi-graph.\r\n */\r\nfunction buildLayerGraph(g, rank, relationship) {\r\n  var root = createRootNode(g),\r\n      result = new Graph({ compound: true }).setGraph({ root: root })\r\n                  .setDefaultNodeLabel(function(v) { return g.node(v); });\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v),\r\n        parent = g.parent(v);\r\n\r\n    if (node.rank === rank || node.minRank <= rank && rank <= node.maxRank) {\r\n      result.setNode(v);\r\n      result.setParent(v, parent || root);\r\n\r\n      // This assumes we have only short edges!\r\n      _.each(g[relationship](v), function(e) {\r\n        var u = e.v === v ? e.w : e.v,\r\n            edge = result.edge(u, v),\r\n            weight = !_.isUndefined(edge) ? edge.weight : 0;\r\n        result.setEdge(u, v, { weight: g.edge(e).weight + weight });\r\n      });\r\n\r\n      if (_.has(node, \"minRank\")) {\r\n        result.setNode(v, {\r\n          borderLeft: node.borderLeft[rank],\r\n          borderRight: node.borderRight[rank]\r\n        });\r\n      }\r\n    }\r\n  });\r\n\r\n  return result;\r\n}\r\n\r\nfunction createRootNode(g) {\r\n  var v;\r\n  while (g.hasNode((v = _.uniqueId(\"_root\"))));\r\n  return v;\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10}],16:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = crossCount;\r\n\r\n/*\r\n * A function that takes a layering (an array of layers, each with an array of\r\n * ordererd nodes) and a graph and returns a weighted crossing count.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Input graph must be simple (not a multigraph), directed, and include\r\n *       only simple edges.\r\n *    2. Edges in the input graph must have assigned weights.\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. The graph and layering matrix are left unchanged.\r\n *\r\n * This algorithm is derived from Barth, et al., \"Bilayer Cross Counting.\"\r\n */\r\nfunction crossCount(g, layering) {\r\n  var cc = 0;\r\n  for (var i = 1; i < layering.length; ++i) {\r\n    cc += twoLayerCrossCount(g, layering[i-1], layering[i]);\r\n  }\r\n  return cc;\r\n}\r\n\r\nfunction twoLayerCrossCount(g, northLayer, southLayer) {\r\n  // Sort all of the edges between the north and south layers by their position\r\n  // in the north layer and then the south. Map these edges to the position of\r\n  // their head in the south layer.\r\n  var southPos = _.zipObject(southLayer,\r\n                             _.map(southLayer, function (v, i) { return i; }));\r\n  var southEntries = _.flatten(_.map(northLayer, function(v) {\r\n    return _.chain(g.outEdges(v))\r\n            .map(function(e) {\r\n              return { pos: southPos[e.w], weight: g.edge(e).weight };\r\n            })\r\n            .sortBy(\"pos\")\r\n            .value();\r\n  }), true);\r\n\r\n  // Build the accumulator tree\r\n  var firstIndex = 1;\r\n  while (firstIndex < southLayer.length) firstIndex <<= 1;\r\n  var treeSize = 2 * firstIndex - 1;\r\n  firstIndex -= 1;\r\n  var tree = _.map(new Array(treeSize), function() { return 0; });\r\n\r\n  // Calculate the weighted crossings\r\n  var cc = 0;\r\n  _.each(southEntries.forEach(function(entry) {\r\n    var index = entry.pos + firstIndex;\r\n    tree[index] += entry.weight;\r\n    var weightSum = 0;\r\n    while (index > 0) {\r\n      if (index % 2) {\r\n        weightSum += tree[index + 1];\r\n      }\r\n      index = (index - 1) >> 1;\r\n      tree[index] += entry.weight;\r\n    }\r\n    cc += entry.weight * weightSum;\r\n  }));\r\n\r\n  return cc;\r\n}\r\n\r\n},{\"../lodash\":10}],17:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    initOrder = require(\"./init-order\"),\r\n    crossCount = require(\"./cross-count\"),\r\n    sortSubgraph = require(\"./sort-subgraph\"),\r\n    buildLayerGraph = require(\"./build-layer-graph\"),\r\n    addSubgraphConstraints = require(\"./add-subgraph-constraints\"),\r\n    Graph = require(\"../graphlib\").Graph,\r\n    util = require(\"../util\");\r\n\r\nmodule.exports = order;\r\n\r\n/*\r\n * Applies heuristics to minimize edge crossings in the graph and sets the best\r\n * order solution as an order attribute on each node.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Graph must be DAG\r\n *    2. Graph nodes must be objects with a \"rank\" attribute\r\n *    3. Graph edges must have the \"weight\" attribute\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. Graph nodes will have an \"order\" attribute based on the results of the\r\n *       algorithm.\r\n */\r\nfunction order(g) {\r\n  var maxRank = util.maxRank(g),\r\n      downLayerGraphs = buildLayerGraphs(g, _.range(1, maxRank + 1), \"inEdges\"),\r\n      upLayerGraphs = buildLayerGraphs(g, _.range(maxRank - 1, -1, -1), \"outEdges\");\r\n\r\n  var layering = initOrder(g);\r\n  assignOrder(g, layering);\r\n\r\n  var bestCC = Number.POSITIVE_INFINITY,\r\n      best;\r\n\r\n  for (var i = 0, lastBest = 0; lastBest < 4; ++i, ++lastBest) {\r\n    sweepLayerGraphs(i % 2 ? downLayerGraphs : upLayerGraphs, i % 4 >= 2);\r\n\r\n    layering = util.buildLayerMatrix(g);\r\n    var cc = crossCount(g, layering);\r\n    if (cc < bestCC) {\r\n      lastBest = 0;\r\n      best = _.cloneDeep(layering);\r\n      bestCC = cc;\r\n    }\r\n  }\r\n\r\n  assignOrder(g, best);\r\n}\r\n\r\nfunction buildLayerGraphs(g, ranks, relationship) {\r\n  return _.map(ranks, function(rank) {\r\n    return buildLayerGraph(g, rank, relationship);\r\n  });\r\n}\r\n\r\nfunction sweepLayerGraphs(layerGraphs, biasRight) {\r\n  var cg = new Graph();\r\n  _.each(layerGraphs, function(lg) {\r\n    var root = lg.graph().root;\r\n    var sorted = sortSubgraph(lg, root, cg, biasRight);\r\n    _.each(sorted.vs, function(v, i) {\r\n      lg.node(v).order = i;\r\n    });\r\n    addSubgraphConstraints(lg, cg, sorted.vs);\r\n  });\r\n}\r\n\r\nfunction assignOrder(g, layering) {\r\n  _.each(layering, function(layer) {\r\n    _.each(layer, function(v, i) {\r\n      g.node(v).order = i;\r\n    });\r\n  });\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10,\"../util\":29,\"./add-subgraph-constraints\":13,\"./build-layer-graph\":15,\"./cross-count\":16,\"./init-order\":18,\"./sort-subgraph\":20}],18:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = initOrder;\r\n\r\n/*\r\n * Assigns an initial order value for each node by performing a DFS search\r\n * starting from nodes in the first rank. Nodes are assigned an order in their\r\n * rank as they are first visited.\r\n *\r\n * This approach comes from Gansner, et al., \"A Technique for Drawing Directed\r\n * Graphs.\"\r\n *\r\n * Returns a layering matrix with an array per layer and each layer sorted by\r\n * the order of its nodes.\r\n */\r\nfunction initOrder(g) {\r\n  var visited = {},\r\n      simpleNodes = _.filter(g.nodes(), function(v) {\r\n        return !g.children(v).length;\r\n      }),\r\n      maxRank = _.max(_.map(simpleNodes, function(v) { return g.node(v).rank; })),\r\n      layers = _.map(_.range(maxRank + 1), function() { return []; });\r\n\r\n  function dfs(v) {\r\n    if (_.has(visited, v)) return;\r\n    visited[v] = true;\r\n    var node = g.node(v);\r\n    layers[node.rank].push(v);\r\n    _.each(g.successors(v), dfs);\r\n  }\r\n\r\n  var orderedVs = _.sortBy(simpleNodes, function(v) { return g.node(v).rank; });\r\n  _.each(orderedVs, dfs);\r\n\r\n  return layers;\r\n}\r\n\r\n},{\"../lodash\":10}],19:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = resolveConflicts;\r\n\r\n/*\r\n * Given a list of entries of the form {v, barycenter, weight} and a\r\n * constraint graph this function will resolve any conflicts between the\r\n * constraint graph and the barycenters for the entries. If the barycenters for\r\n * an entry would violate a constraint in the constraint graph then we coalesce\r\n * the nodes in the conflict into a new node that respects the contraint and\r\n * aggregates barycenter and weight information.\r\n *\r\n * This implementation is based on the description in Forster, \"A Fast and\r\n * Simple Hueristic for Constrained Two-Level Crossing Reduction,\" thought it\r\n * differs in some specific details.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Each entry has the form {v, barycenter, weight}, or if the node has\r\n *       no barycenter, then {v}.\r\n *\r\n * Returns:\r\n *\r\n *    A new list of entries of the form {vs, i, barycenter, weight}. The list\r\n *    `vs` may either be a singleton or it may be an aggregation of nodes\r\n *    ordered such that they do not violate constraints from the constraint\r\n *    graph. The property `i` is the lowest original index of any of the\r\n *    elements in `vs`.\r\n */\r\nfunction resolveConflicts(entries, cg) {\r\n  var mappedEntries = {};\r\n  _.each(entries, function(entry, i) {\r\n    var tmp = mappedEntries[entry.v] = {\r\n      indegree: 0,\r\n      \"in\": [],\r\n      out: [],\r\n      vs: [entry.v],\r\n      i: i\r\n    };\r\n    if (!_.isUndefined(entry.barycenter)) {\r\n      tmp.barycenter = entry.barycenter;\r\n      tmp.weight = entry.weight;\r\n    }\r\n  });\r\n\r\n  _.each(cg.edges(), function(e) {\r\n    var entryV = mappedEntries[e.v],\r\n        entryW = mappedEntries[e.w];\r\n    if (!_.isUndefined(entryV) && !_.isUndefined(entryW)) {\r\n      entryW.indegree++;\r\n      entryV.out.push(mappedEntries[e.w]);\r\n    }\r\n  });\r\n\r\n  var sourceSet = _.filter(mappedEntries, function(entry) {\r\n    return !entry.indegree;\r\n  });\r\n\r\n  return doResolveConflicts(sourceSet);\r\n}\r\n\r\nfunction doResolveConflicts(sourceSet) {\r\n  var entries = [];\r\n\r\n  function handleIn(vEntry) {\r\n    return function(uEntry) {\r\n      if (uEntry.merged) {\r\n        return;\r\n      }\r\n      if (_.isUndefined(uEntry.barycenter) ||\r\n          _.isUndefined(vEntry.barycenter) ||\r\n          uEntry.barycenter >= vEntry.barycenter) {\r\n        mergeEntries(vEntry, uEntry);\r\n      }\r\n    };\r\n  }\r\n\r\n  function handleOut(vEntry) {\r\n    return function(wEntry) {\r\n      wEntry[\"in\"].push(vEntry);\r\n      if (--wEntry.indegree === 0) {\r\n        sourceSet.push(wEntry);\r\n      }\r\n    };\r\n  }\r\n\r\n  while (sourceSet.length) {\r\n    var entry = sourceSet.pop();\r\n    entries.push(entry);\r\n    _.each(entry[\"in\"].reverse(), handleIn(entry));\r\n    _.each(entry.out, handleOut(entry));\r\n  }\r\n\r\n  return _.chain(entries)\r\n          .filter(function(entry) { return !entry.merged; })\r\n          .map(function(entry) {\r\n            return _.pick(entry, [\"vs\", \"i\", \"barycenter\", \"weight\"]);\r\n          })\r\n          .value();\r\n}\r\n\r\nfunction mergeEntries(target, source) {\r\n  var sum = 0,\r\n      weight = 0;\r\n\r\n  if (target.weight) {\r\n    sum += target.barycenter * target.weight;\r\n    weight += target.weight;\r\n  }\r\n\r\n  if (source.weight) {\r\n    sum += source.barycenter * source.weight;\r\n    weight += source.weight;\r\n  }\r\n\r\n  target.vs = source.vs.concat(target.vs);\r\n  target.barycenter = sum / weight;\r\n  target.weight = weight;\r\n  target.i = Math.min(source.i, target.i);\r\n  source.merged = true;\r\n}\r\n\r\n},{\"../lodash\":10}],20:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    barycenter = require(\"./barycenter\"),\r\n    resolveConflicts = require(\"./resolve-conflicts\"),\r\n    sort = require(\"./sort\");\r\n\r\nmodule.exports = sortSubgraph;\r\n\r\nfunction sortSubgraph(g, v, cg, biasRight) {\r\n  var movable = g.children(v),\r\n      node = g.node(v),\r\n      bl = node ? node.borderLeft : undefined,\r\n      br = node ? node.borderRight: undefined,\r\n      subgraphs = {};\r\n\r\n  if (bl) {\r\n    movable = _.filter(movable, function(w) {\r\n      return w !== bl && w !== br;\r\n    });\r\n  }\r\n\r\n  var barycenters = barycenter(g, movable);\r\n  _.each(barycenters, function(entry) {\r\n    if (g.children(entry.v).length) {\r\n      var subgraphResult = sortSubgraph(g, entry.v, cg, biasRight);\r\n      subgraphs[entry.v] = subgraphResult;\r\n      if (_.has(subgraphResult, \"barycenter\")) {\r\n        mergeBarycenters(entry, subgraphResult);\r\n      }\r\n    }\r\n  });\r\n\r\n  var entries = resolveConflicts(barycenters, cg);\r\n  expandSubgraphs(entries, subgraphs);\r\n\r\n  var result = sort(entries, biasRight);\r\n\r\n  if (bl) {\r\n    result.vs = _.flatten([bl, result.vs, br], true);\r\n    if (g.predecessors(bl).length) {\r\n      var blPred = g.node(g.predecessors(bl)[0]),\r\n          brPred = g.node(g.predecessors(br)[0]);\r\n      if (!_.has(result, \"barycenter\")) {\r\n        result.barycenter = 0;\r\n        result.weight = 0;\r\n      }\r\n      result.barycenter = (result.barycenter * result.weight +\r\n                           blPred.order + brPred.order) / (result.weight + 2);\r\n      result.weight += 2;\r\n    }\r\n  }\r\n\r\n  return result;\r\n}\r\n\r\nfunction expandSubgraphs(entries, subgraphs) {\r\n  _.each(entries, function(entry) {\r\n    entry.vs = _.flatten(entry.vs.map(function(v) {\r\n      if (subgraphs[v]) {\r\n        return subgraphs[v].vs;\r\n      }\r\n      return v;\r\n    }), true);\r\n  });\r\n}\r\n\r\nfunction mergeBarycenters(target, other) {\r\n  if (!_.isUndefined(target.barycenter)) {\r\n    target.barycenter = (target.barycenter * target.weight +\r\n                         other.barycenter * other.weight) /\r\n                        (target.weight + other.weight);\r\n    target.weight += other.weight;\r\n  } else {\r\n    target.barycenter = other.barycenter;\r\n    target.weight = other.weight;\r\n  }\r\n}\r\n\r\n},{\"../lodash\":10,\"./barycenter\":14,\"./resolve-conflicts\":19,\"./sort\":21}],21:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    util = require(\"../util\");\r\n\r\nmodule.exports = sort;\r\n\r\nfunction sort(entries, biasRight) {\r\n  var parts = util.partition(entries, function(entry) {\r\n    return _.has(entry, \"barycenter\");\r\n  });\r\n  var sortable = parts.lhs,\r\n      unsortable = _.sortBy(parts.rhs, function(entry) { return -entry.i; }),\r\n      vs = [],\r\n      sum = 0,\r\n      weight = 0,\r\n      vsIndex = 0;\r\n\r\n  sortable.sort(compareWithBias(!!biasRight));\r\n\r\n  vsIndex = consumeUnsortable(vs, unsortable, vsIndex);\r\n\r\n  _.each(sortable, function (entry) {\r\n    vsIndex += entry.vs.length;\r\n    vs.push(entry.vs);\r\n    sum += entry.barycenter * entry.weight;\r\n    weight += entry.weight;\r\n    vsIndex = consumeUnsortable(vs, unsortable, vsIndex);\r\n  });\r\n\r\n  var result = { vs: _.flatten(vs, true) };\r\n  if (weight) {\r\n    result.barycenter = sum / weight;\r\n    result.weight = weight;\r\n  }\r\n  return result;\r\n}\r\n\r\nfunction consumeUnsortable(vs, unsortable, index) {\r\n  var last;\r\n  while (unsortable.length && (last = _.last(unsortable)).i <= index) {\r\n    unsortable.pop();\r\n    vs.push(last.vs);\r\n    index++;\r\n  }\r\n  return index;\r\n}\r\n\r\nfunction compareWithBias(bias) {\r\n  return function(entryV, entryW) {\r\n    if (entryV.barycenter < entryW.barycenter) {\r\n      return -1;\r\n    } else if (entryV.barycenter > entryW.barycenter) {\r\n      return 1;\r\n    }\r\n\r\n    return !bias ? entryV.i - entryW.i : entryW.i - entryV.i;\r\n  };\r\n}\r\n\r\n},{\"../lodash\":10,\"../util\":29}],22:[function(require,module,exports){\r\nvar _ = require(\"./lodash\");\r\n\r\nmodule.exports = parentDummyChains;\r\n\r\nfunction parentDummyChains(g) {\r\n  var postorderNums = postorder(g);\r\n\r\n  _.each(g.graph().dummyChains, function(v) {\r\n    var node = g.node(v),\r\n        edgeObj = node.edgeObj,\r\n        pathData = findPath(g, postorderNums, edgeObj.v, edgeObj.w),\r\n        path = pathData.path,\r\n        lca = pathData.lca,\r\n        pathIdx = 0,\r\n        pathV = path[pathIdx],\r\n        ascending = true;\r\n\r\n    while (v !== edgeObj.w) {\r\n      node = g.node(v);\r\n\r\n      if (ascending) {\r\n        while ((pathV = path[pathIdx]) !== lca &&\r\n               g.node(pathV).maxRank < node.rank) {\r\n          pathIdx++;\r\n        }\r\n\r\n        if (pathV === lca) {\r\n          ascending = false;\r\n        }\r\n      }\r\n\r\n      if (!ascending) {\r\n        while (pathIdx < path.length - 1 &&\r\n               g.node(pathV = path[pathIdx + 1]).minRank <= node.rank) {\r\n          pathIdx++;\r\n        }\r\n        pathV = path[pathIdx];\r\n      }\r\n\r\n      g.setParent(v, pathV);\r\n      v = g.successors(v)[0];\r\n    }\r\n  });\r\n}\r\n\r\n// Find a path from v to w through the lowest common ancestor (LCA). Return the\r\n// full path and the LCA.\r\nfunction findPath(g, postorderNums, v, w) {\r\n  var vPath = [],\r\n      wPath = [],\r\n      low = Math.min(postorderNums[v].low, postorderNums[w].low),\r\n      lim = Math.max(postorderNums[v].lim, postorderNums[w].lim),\r\n      parent,\r\n      lca;\r\n\r\n  // Traverse up from v to find the LCA\r\n  parent = v;\r\n  do {\r\n    parent = g.parent(parent);\r\n    vPath.push(parent);\r\n  } while (parent &&\r\n           (postorderNums[parent].low > low || lim > postorderNums[parent].lim));\r\n  lca = parent;\r\n\r\n  // Traverse from w to LCA\r\n  parent = w;\r\n  while ((parent = g.parent(parent)) !== lca) {\r\n    wPath.push(parent);\r\n  }\r\n\r\n  return { path: vPath.concat(wPath.reverse()), lca: lca };\r\n}\r\n\r\nfunction postorder(g) {\r\n  var result = {},\r\n      lim = 0;\r\n\r\n  function dfs(v) {\r\n    var low = lim;\r\n    _.each(g.children(v), dfs);\r\n    result[v] = { low: low, lim: lim++ };\r\n  }\r\n  _.each(g.children(), dfs);\r\n\r\n  return result;\r\n}\r\n\r\n},{\"./lodash\":10}],23:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    Graph = require(\"../graphlib\").Graph,\r\n    util = require(\"../util\");\r\n\r\n/*\r\n * This module provides coordinate assignment based on Brandes and Köpf, \"Fast\r\n * and Simple Horizontal Coordinate Assignment.\"\r\n */\r\n\r\nmodule.exports = {\r\n  positionX: positionX,\r\n  findType1Conflicts: findType1Conflicts,\r\n  findType2Conflicts: findType2Conflicts,\r\n  addConflict: addConflict,\r\n  hasConflict: hasConflict,\r\n  verticalAlignment: verticalAlignment,\r\n  horizontalCompaction: horizontalCompaction,\r\n  alignCoordinates: alignCoordinates,\r\n  findSmallestWidthAlignment: findSmallestWidthAlignment,\r\n  balance: balance\r\n};\r\n\r\n/*\r\n * Marks all edges in the graph with a type-1 conflict with the \"type1Conflict\"\r\n * property. A type-1 conflict is one where a non-inner segment crosses an\r\n * inner segment. An inner segment is an edge with both incident nodes marked\r\n * with the \"dummy\" property.\r\n *\r\n * This algorithm scans layer by layer, starting with the second, for type-1\r\n * conflicts between the current layer and the previous layer. For each layer\r\n * it scans the nodes from left to right until it reaches one that is incident\r\n * on an inner segment. It then scans predecessors to determine if they have\r\n * edges that cross that inner segment. At the end a final scan is done for all\r\n * nodes on the current rank to see if they cross the last visited inner\r\n * segment.\r\n *\r\n * This algorithm (safely) assumes that a dummy node will only be incident on a\r\n * single node in the layers being scanned.\r\n */\r\nfunction findType1Conflicts(g, layering) {\r\n  var conflicts = {};\r\n\r\n  function visitLayer(prevLayer, layer) {\r\n    var\r\n      // last visited node in the previous layer that is incident on an inner\r\n      // segment.\r\n      k0 = 0,\r\n      // Tracks the last node in this layer scanned for crossings with a type-1\r\n      // segment.\r\n      scanPos = 0,\r\n      prevLayerLength = prevLayer.length,\r\n      lastNode = _.last(layer);\r\n\r\n    _.each(layer, function(v, i) {\r\n      var w = findOtherInnerSegmentNode(g, v),\r\n          k1 = w ? g.node(w).order : prevLayerLength;\r\n\r\n      if (w || v === lastNode) {\r\n        _.each(layer.slice(scanPos, i +1), function(scanNode) {\r\n          _.each(g.predecessors(scanNode), function(u) {\r\n            var uLabel = g.node(u),\r\n                uPos = uLabel.order;\r\n            if ((uPos < k0 || k1 < uPos) &&\r\n                !(uLabel.dummy && g.node(scanNode).dummy)) {\r\n              addConflict(conflicts, u, scanNode);\r\n            }\r\n          });\r\n        });\r\n        scanPos = i + 1;\r\n        k0 = k1;\r\n      }\r\n    });\r\n\r\n    return layer;\r\n  }\r\n\r\n  _.reduce(layering, visitLayer);\r\n  return conflicts;\r\n}\r\n\r\nfunction findType2Conflicts(g, layering) {\r\n  var conflicts = {};\r\n\r\n  function scan(south, southPos, southEnd, prevNorthBorder, nextNorthBorder) {\r\n    var v;\r\n    _.each(_.range(southPos, southEnd), function(i) {\r\n      v = south[i];\r\n      if (g.node(v).dummy) {\r\n        _.each(g.predecessors(v), function(u) {\r\n          var uNode = g.node(u);\r\n          if (uNode.dummy &&\r\n              (uNode.order < prevNorthBorder || uNode.order > nextNorthBorder)) {\r\n            addConflict(conflicts, u, v);\r\n          }\r\n        });\r\n      }\r\n    });\r\n  }\r\n\r\n\r\n  function visitLayer(north, south) {\r\n    var prevNorthPos = -1,\r\n        nextNorthPos,\r\n        southPos = 0;\r\n\r\n    _.each(south, function(v, southLookahead) {\r\n      if (g.node(v).dummy === \"border\") {\r\n        var predecessors = g.predecessors(v);\r\n        if (predecessors.length) {\r\n          nextNorthPos = g.node(predecessors[0]).order;\r\n          scan(south, southPos, southLookahead, prevNorthPos, nextNorthPos);\r\n          southPos = southLookahead;\r\n          prevNorthPos = nextNorthPos;\r\n        }\r\n      }\r\n      scan(south, southPos, south.length, nextNorthPos, north.length);\r\n    });\r\n\r\n    return south;\r\n  }\r\n\r\n  _.reduce(layering, visitLayer);\r\n  return conflicts;\r\n}\r\n\r\nfunction findOtherInnerSegmentNode(g, v) {\r\n  if (g.node(v).dummy) {\r\n    return _.find(g.predecessors(v), function(u) {\r\n      return g.node(u).dummy;\r\n    });\r\n  }\r\n}\r\n\r\nfunction addConflict(conflicts, v, w) {\r\n  if (v > w) {\r\n    var tmp = v;\r\n    v = w;\r\n    w = tmp;\r\n  }\r\n\r\n  var conflictsV = conflicts[v];\r\n  if (!conflictsV) {\r\n    conflicts[v] = conflictsV = {};\r\n  }\r\n  conflictsV[w] = true;\r\n}\r\n\r\nfunction hasConflict(conflicts, v, w) {\r\n  if (v > w) {\r\n    var tmp = v;\r\n    v = w;\r\n    w = tmp;\r\n  }\r\n  return _.has(conflicts[v], w);\r\n}\r\n\r\n/*\r\n * Try to align nodes into vertical \"blocks\" where possible. This algorithm\r\n * attempts to align a node with one of its median neighbors. If the edge\r\n * connecting a neighbor is a type-1 conflict then we ignore that possibility.\r\n * If a previous node has already formed a block with a node after the node\r\n * we're trying to form a block with, we also ignore that possibility - our\r\n * blocks would be split in that scenario.\r\n */\r\nfunction verticalAlignment(g, layering, conflicts, neighborFn) {\r\n  var root = {},\r\n      align = {},\r\n      pos = {};\r\n\r\n  // We cache the position here based on the layering because the graph and\r\n  // layering may be out of sync. The layering matrix is manipulated to\r\n  // generate different extreme alignments.\r\n  _.each(layering, function(layer) {\r\n    _.each(layer, function(v, order) {\r\n      root[v] = v;\r\n      align[v] = v;\r\n      pos[v] = order;\r\n    });\r\n  });\r\n\r\n  _.each(layering, function(layer) {\r\n    var prevIdx = -1;\r\n    _.each(layer, function(v) {\r\n      var ws = neighborFn(v);\r\n      if (ws.length) {\r\n        ws = _.sortBy(ws, function(w) { return pos[w]; });\r\n        var mp = (ws.length - 1) / 2;\r\n        for (var i = Math.floor(mp), il = Math.ceil(mp); i <= il; ++i) {\r\n          var w = ws[i];\r\n          if (align[v] === v &&\r\n              prevIdx < pos[w] &&\r\n              !hasConflict(conflicts, v, w)) {\r\n            align[w] = v;\r\n            align[v] = root[v] = root[w];\r\n            prevIdx = pos[w];\r\n          }\r\n        }\r\n      }\r\n    });\r\n  });\r\n\r\n  return { root: root, align: align };\r\n}\r\n\r\nfunction horizontalCompaction(g, layering, root, align, reverseSep) {\r\n  // This portion of the algorithm differs from BK due to a number of problems.\r\n  // Instead of their algorithm we construct a new block graph and do two\r\n  // sweeps. The first sweep places blocks with the smallest possible\r\n  // coordinates. The second sweep removes unused space by moving blocks to the\r\n  // greatest coordinates without violating separation.\r\n  var xs = {},\r\n      blockG = buildBlockGraph(g, layering, root, reverseSep);\r\n\r\n  // First pass, assign smallest coordinates via DFS\r\n  var visited = {};\r\n  function pass1(v) {\r\n    if (!_.has(visited, v)) {\r\n      visited[v] = true;\r\n      xs[v] = _.reduce(blockG.inEdges(v), function(max, e) {\r\n        pass1(e.v);\r\n        return Math.max(max, xs[e.v] + blockG.edge(e));\r\n      }, 0);\r\n    }\r\n  }\r\n  _.each(blockG.nodes(), pass1);\r\n\r\n  function pass2(v) {\r\n    if (visited[v] !== 2) {\r\n      visited[v]++;\r\n      var min = _.reduce(blockG.outEdges(v), function(min, e) {\r\n        pass2(e.w);\r\n        return Math.min(min, xs[e.w] - blockG.edge(e));\r\n      }, Number.POSITIVE_INFINITY);\r\n      if (min !== Number.POSITIVE_INFINITY) {\r\n        xs[v] = Math.max(xs[v], min);\r\n      }\r\n    }\r\n  }\r\n  _.each(blockG.nodes(), pass2);\r\n\r\n\r\n  // Assign x coordinates to all nodes\r\n  _.each(align, function(v) {\r\n    xs[v] = xs[root[v]];\r\n  });\r\n\r\n  return xs;\r\n}\r\n\r\n\r\nfunction buildBlockGraph(g, layering, root, reverseSep) {\r\n  var blockGraph = new Graph(),\r\n      graphLabel = g.graph(),\r\n      sepFn = sep(graphLabel.nodesep, graphLabel.edgesep, reverseSep);\r\n\r\n  _.each(layering, function(layer) {\r\n    var u;\r\n    _.each(layer, function(v) {\r\n      var vRoot = root[v];\r\n      blockGraph.setNode(vRoot);\r\n      if (u) {\r\n        var uRoot = root[u],\r\n            prevMax = blockGraph.edge(uRoot, vRoot);\r\n        blockGraph.setEdge(uRoot, vRoot, Math.max(sepFn(g, v, u), prevMax || 0));\r\n      }\r\n      u = v;\r\n    });\r\n  });\r\n\r\n  return blockGraph;\r\n}\r\n\r\n/*\r\n * Returns the alignment that has the smallest width of the given alignments.\r\n */\r\nfunction findSmallestWidthAlignment(g, xss) {\r\n  return _.min(xss, function(xs) {\r\n    var min = _.min(xs, function(x, v) { return x - width(g, v) / 2; }),\r\n        max = _.max(xs, function(x, v) { return x + width(g, v) / 2; });\r\n    return max - min;\r\n  });\r\n}\r\n\r\n/*\r\n * Align the coordinates of each of the layout alignments such that\r\n * left-biased alignments have their minimum coordinate at the same point as\r\n * the minimum coordinate of the smallest width alignment and right-biased\r\n * alignments have their maximum coordinate at the same point as the maximum\r\n * coordinate of the smallest width alignment.\r\n */\r\nfunction alignCoordinates(xss, alignTo) {\r\n  var alignToMin = _.min(alignTo),\r\n      alignToMax = _.max(alignTo);\r\n\r\n  _.each([\"u\", \"d\"], function(vert) {\r\n    _.each([\"l\", \"r\"], function(horiz) {\r\n      var alignment = vert + horiz,\r\n          xs = xss[alignment],\r\n          delta;\r\n      if (xs === alignTo) return;\r\n\r\n      delta = horiz === \"l\" ? alignToMin - _.min(xs) : alignToMax - _.max(xs);\r\n\r\n      if (delta) {\r\n        xss[alignment] = _.mapValues(xs, function(x) { return x + delta; });\r\n      }\r\n    });\r\n  });\r\n}\r\n\r\nfunction balance(xss, align) {\r\n  return _.mapValues(xss.ul, function(ignore, v) {\r\n    if (align) {\r\n      return xss[align.toLowerCase()][v];\r\n    } else {\r\n      var xs = _.sortBy(_.pluck(xss, v));\r\n      return (xs[1] + xs[2]) / 2;\r\n    }\r\n  });\r\n}\r\n\r\nfunction positionX(g) {\r\n  var layering = util.buildLayerMatrix(g),\r\n      conflicts = _.merge(findType1Conflicts(g, layering),\r\n                          findType2Conflicts(g, layering));\r\n\r\n  var xss = {},\r\n      adjustedLayering;\r\n  _.each([\"u\", \"d\"], function(vert) {\r\n    adjustedLayering = vert === \"u\" ? layering : _.values(layering).reverse();\r\n    _.each([\"l\", \"r\"], function(horiz) {\r\n      if (horiz === \"r\") {\r\n        adjustedLayering = _.map(adjustedLayering, function(inner) {\r\n          return _.values(inner).reverse();\r\n        });\r\n      }\r\n\r\n      var neighborFn = _.bind(vert === \"u\" ? g.predecessors : g.successors, g);\r\n      var align = verticalAlignment(g, adjustedLayering, conflicts, neighborFn);\r\n      var xs = horizontalCompaction(g, adjustedLayering,\r\n                                    align.root, align.align,\r\n                                    horiz === \"r\");\r\n      if (horiz === \"r\") {\r\n        xs = _.mapValues(xs, function(x) { return -x; });\r\n      }\r\n      xss[vert + horiz] = xs;\r\n    });\r\n  });\r\n\r\n  var smallestWidth = findSmallestWidthAlignment(g, xss);\r\n  alignCoordinates(xss, smallestWidth);\r\n  return balance(xss, g.graph().align);\r\n}\r\n\r\nfunction sep(nodeSep, edgeSep, reverseSep) {\r\n  return function(g, v, w) {\r\n    var vLabel = g.node(v),\r\n        wLabel = g.node(w),\r\n        sum = 0,\r\n        delta;\r\n\r\n    sum += vLabel.width / 2;\r\n    if (_.has(vLabel, \"labelpos\")) {\r\n      switch (vLabel.labelpos.toLowerCase()) {\r\n        case \"l\": delta = -vLabel.width / 2; break;\r\n        case \"r\": delta = vLabel.width / 2; break;\r\n      }\r\n    }\r\n    if (delta) {\r\n      sum += reverseSep ? delta : -delta;\r\n    }\r\n    delta = 0;\r\n\r\n    sum += (vLabel.dummy ? edgeSep : nodeSep) / 2;\r\n    sum += (wLabel.dummy ? edgeSep : nodeSep) / 2;\r\n\r\n    sum += wLabel.width / 2;\r\n    if (_.has(wLabel, \"labelpos\")) {\r\n      switch (wLabel.labelpos.toLowerCase()) {\r\n        case \"l\": delta = wLabel.width / 2; break;\r\n        case \"r\": delta = -wLabel.width / 2; break;\r\n      }\r\n    }\r\n    if (delta) {\r\n      sum += reverseSep ? delta : -delta;\r\n    }\r\n    delta = 0;\r\n\r\n    return sum;\r\n  };\r\n}\r\n\r\nfunction width(g, v) {\r\n  return g.node(v).width;\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10,\"../util\":29}],24:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    util = require(\"../util\"),\r\n    positionX = require(\"./bk\").positionX;\r\n\r\nmodule.exports = position;\r\n\r\nfunction position(g) {\r\n  g = util.asNonCompoundGraph(g);\r\n\r\n  positionY(g);\r\n  _.each(positionX(g), function(x, v) {\r\n    g.node(v).x = x;\r\n  });\r\n}\r\n\r\nfunction positionY(g) {\r\n  var layering = util.buildLayerMatrix(g),\r\n      rankSep = g.graph().ranksep,\r\n      prevY = 0;\r\n  _.each(layering, function(layer) {\r\n    var maxHeight = _.max(_.map(layer, function(v) { return g.node(v).height; }));\r\n    _.each(layer, function(v) {\r\n      g.node(v).y = prevY + maxHeight / 2;\r\n    });\r\n    prevY += maxHeight + rankSep;\r\n  });\r\n}\r\n\r\n\r\n},{\"../lodash\":10,\"../util\":29,\"./bk\":23}],25:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    Graph = require(\"../graphlib\").Graph,\r\n    slack = require(\"./util\").slack;\r\n\r\nmodule.exports = feasibleTree;\r\n\r\n/*\r\n * Constructs a spanning tree with tight edges and adjusted the input node's\r\n * ranks to achieve this. A tight edge is one that is has a length that matches\r\n * its \"minlen\" attribute.\r\n *\r\n * The basic structure for this function is derived from Gansner, et al., \"A\r\n * Technique for Drawing Directed Graphs.\"\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Graph must be a DAG.\r\n *    2. Graph must be connected.\r\n *    3. Graph must have at least one node.\r\n *    5. Graph nodes must have been previously assigned a \"rank\" property that\r\n *       respects the \"minlen\" property of incident edges.\r\n *    6. Graph edges must have a \"minlen\" property.\r\n *\r\n * Post-conditions:\r\n *\r\n *    - Graph nodes will have their rank adjusted to ensure that all edges are\r\n *      tight.\r\n *\r\n * Returns a tree (undirected graph) that is constructed using only \"tight\"\r\n * edges.\r\n */\r\nfunction feasibleTree(g) {\r\n  var t = new Graph({ directed: false });\r\n\r\n  // Choose arbitrary node from which to start our tree\r\n  var start = g.nodes()[0],\r\n      size = g.nodeCount();\r\n  t.setNode(start, {});\r\n\r\n  var edge, delta;\r\n  while (tightTree(t, g) < size) {\r\n    edge = findMinSlackEdge(t, g);\r\n    delta = t.hasNode(edge.v) ? slack(g, edge) : -slack(g, edge);\r\n    shiftRanks(t, g, delta);\r\n  }\r\n\r\n  return t;\r\n}\r\n\r\n/*\r\n * Finds a maximal tree of tight edges and returns the number of nodes in the\r\n * tree.\r\n */\r\nfunction tightTree(t, g) {\r\n  function dfs(v) {\r\n    _.each(g.nodeEdges(v), function(e) {\r\n      var edgeV = e.v,\r\n          w = (v === edgeV) ? e.w : edgeV;\r\n      if (!t.hasNode(w) && !slack(g, e)) {\r\n        t.setNode(w, {});\r\n        t.setEdge(v, w, {});\r\n        dfs(w);\r\n      }\r\n    });\r\n  }\r\n\r\n  _.each(t.nodes(), dfs);\r\n  return t.nodeCount();\r\n}\r\n\r\n/*\r\n * Finds the edge with the smallest slack that is incident on tree and returns\r\n * it.\r\n */\r\nfunction findMinSlackEdge(t, g) {\r\n  return _.min(g.edges(), function(e) {\r\n    if (t.hasNode(e.v) !== t.hasNode(e.w)) {\r\n      return slack(g, e);\r\n    }\r\n  });\r\n}\r\n\r\nfunction shiftRanks(t, g, delta) {\r\n  _.each(t.nodes(), function(v) {\r\n    g.node(v).rank += delta;\r\n  });\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10,\"./util\":28}],26:[function(require,module,exports){\r\n\r\n\r\nvar rankUtil = require(\"./util\"),\r\n    longestPath = rankUtil.longestPath,\r\n    feasibleTree = require(\"./feasible-tree\"),\r\n    networkSimplex = require(\"./network-simplex\");\r\n\r\nmodule.exports = rank;\r\n\r\n/*\r\n * Assigns a rank to each node in the input graph that respects the \"minlen\"\r\n * constraint specified on edges between nodes.\r\n *\r\n * This basic structure is derived from Gansner, et al., \"A Technique for\r\n * Drawing Directed Graphs.\"\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Graph must be a connected DAG\r\n *    2. Graph nodes must be objects\r\n *    3. Graph edges must have \"weight\" and \"minlen\" attributes\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. Graph nodes will have a \"rank\" attribute based on the results of the\r\n *       algorithm. Ranks can start at any index (including negative), we'll\r\n *       fix them up later.\r\n */\r\nfunction rank(g) {\r\n  switch(g.graph().ranker) {\r\n    case \"network-simplex\": networkSimplexRanker(g); break;\r\n    case \"tight-tree\": tightTreeRanker(g); break;\r\n    case \"longest-path\": longestPathRanker(g); break;\r\n    default: networkSimplexRanker(g);\r\n  }\r\n}\r\n\r\n// A fast and simple ranker, but results are far from optimal.\r\nvar longestPathRanker = longestPath;\r\n\r\nfunction tightTreeRanker(g) {\r\n  longestPath(g);\r\n  feasibleTree(g);\r\n}\r\n\r\nfunction networkSimplexRanker(g) {\r\n  networkSimplex(g);\r\n}\r\n\r\n},{\"./feasible-tree\":25,\"./network-simplex\":27,\"./util\":28}],27:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    feasibleTree = require(\"./feasible-tree\"),\r\n    slack = require(\"./util\").slack,\r\n    initRank = require(\"./util\").longestPath,\r\n    preorder = require(\"../graphlib\").alg.preorder,\r\n    postorder = require(\"../graphlib\").alg.postorder,\r\n    simplify = require(\"../util\").simplify;\r\n\r\nmodule.exports = networkSimplex;\r\n\r\n// Expose some internals for testing purposes\r\nnetworkSimplex.initLowLimValues = initLowLimValues;\r\nnetworkSimplex.initCutValues = initCutValues;\r\nnetworkSimplex.calcCutValue = calcCutValue;\r\nnetworkSimplex.leaveEdge = leaveEdge;\r\nnetworkSimplex.enterEdge = enterEdge;\r\nnetworkSimplex.exchangeEdges = exchangeEdges;\r\n\r\n/*\r\n * The network simplex algorithm assigns ranks to each node in the input graph\r\n * and iteratively improves the ranking to reduce the length of edges.\r\n *\r\n * Preconditions:\r\n *\r\n *    1. The input graph must be a DAG.\r\n *    2. All nodes in the graph must have an object value.\r\n *    3. All edges in the graph must have \"minlen\" and \"weight\" attributes.\r\n *\r\n * Postconditions:\r\n *\r\n *    1. All nodes in the graph will have an assigned \"rank\" attribute that has\r\n *       been optimized by the network simplex algorithm. Ranks start at 0.\r\n *\r\n *\r\n * A rough sketch of the algorithm is as follows:\r\n *\r\n *    1. Assign initial ranks to each node. We use the longest path algorithm,\r\n *       which assigns ranks to the lowest position possible. In general this\r\n *       leads to very wide bottom ranks and unnecessarily long edges.\r\n *    2. Construct a feasible tight tree. A tight tree is one such that all\r\n *       edges in the tree have no slack (difference between length of edge\r\n *       and minlen for the edge). This by itself greatly improves the assigned\r\n *       rankings by shorting edges.\r\n *    3. Iteratively find edges that have negative cut values. Generally a\r\n *       negative cut value indicates that the edge could be removed and a new\r\n *       tree edge could be added to produce a more compact graph.\r\n *\r\n * Much of the algorithms here are derived from Gansner, et al., \"A Technique\r\n * for Drawing Directed Graphs.\" The structure of the file roughly follows the\r\n * structure of the overall algorithm.\r\n */\r\nfunction networkSimplex(g) {\r\n  g = simplify(g);\r\n  initRank(g);\r\n  var t = feasibleTree(g);\r\n  initLowLimValues(t);\r\n  initCutValues(t, g);\r\n\r\n  var e, f;\r\n  while ((e = leaveEdge(t))) {\r\n    f = enterEdge(t, g, e);\r\n    exchangeEdges(t, g, e, f);\r\n  }\r\n}\r\n\r\n/*\r\n * Initializes cut values for all edges in the tree.\r\n */\r\nfunction initCutValues(t, g) {\r\n  var vs = postorder(t, t.nodes());\r\n  vs = vs.slice(0, vs.length - 1);\r\n  _.each(vs, function(v) {\r\n    assignCutValue(t, g, v);\r\n  });\r\n}\r\n\r\nfunction assignCutValue(t, g, child) {\r\n  var childLab = t.node(child),\r\n      parent = childLab.parent;\r\n  t.edge(child, parent).cutvalue = calcCutValue(t, g, child);\r\n}\r\n\r\n/*\r\n * Given the tight tree, its graph, and a child in the graph calculate and\r\n * return the cut value for the edge between the child and its parent.\r\n */\r\nfunction calcCutValue(t, g, child) {\r\n  var childLab = t.node(child),\r\n      parent = childLab.parent,\r\n      // True if the child is on the tail end of the edge in the directed graph\r\n      childIsTail = true,\r\n      // The graph's view of the tree edge we're inspecting\r\n      graphEdge = g.edge(child, parent),\r\n      // The accumulated cut value for the edge between this node and its parent\r\n      cutValue = 0;\r\n\r\n  if (!graphEdge) {\r\n    childIsTail = false;\r\n    graphEdge = g.edge(parent, child);\r\n  }\r\n\r\n  cutValue = graphEdge.weight;\r\n\r\n  _.each(g.nodeEdges(child), function(e) {\r\n    var isOutEdge = e.v === child,\r\n        other = isOutEdge ? e.w : e.v;\r\n\r\n    if (other !== parent) {\r\n      var pointsToHead = isOutEdge === childIsTail,\r\n          otherWeight = g.edge(e).weight;\r\n\r\n      cutValue += pointsToHead ? otherWeight : -otherWeight;\r\n      if (isTreeEdge(t, child, other)) {\r\n        var otherCutValue = t.edge(child, other).cutvalue;\r\n        cutValue += pointsToHead ? -otherCutValue : otherCutValue;\r\n      }\r\n    }\r\n  });\r\n\r\n  return cutValue;\r\n}\r\n\r\nfunction initLowLimValues(tree, root) {\r\n  if (arguments.length < 2) {\r\n    root = tree.nodes()[0];\r\n  }\r\n  dfsAssignLowLim(tree, {}, 1, root);\r\n}\r\n\r\nfunction dfsAssignLowLim(tree, visited, nextLim, v, parent) {\r\n  var low = nextLim,\r\n      label = tree.node(v);\r\n\r\n  visited[v] = true;\r\n  _.each(tree.neighbors(v), function(w) {\r\n    if (!_.has(visited, w)) {\r\n      nextLim = dfsAssignLowLim(tree, visited, nextLim, w, v);\r\n    }\r\n  });\r\n\r\n  label.low = low;\r\n  label.lim = nextLim++;\r\n  if (parent) {\r\n    label.parent = parent;\r\n  } else {\r\n    // TODO should be able to remove this when we incrementally update low lim\r\n    delete label.parent;\r\n  }\r\n\r\n  return nextLim;\r\n}\r\n\r\nfunction leaveEdge(tree) {\r\n  return _.find(tree.edges(), function(e) {\r\n    return tree.edge(e).cutvalue < 0;\r\n  });\r\n}\r\n\r\nfunction enterEdge(t, g, edge) {\r\n  var v = edge.v,\r\n      w = edge.w;\r\n\r\n  // For the rest of this function we assume that v is the tail and w is the\r\n  // head, so if we don't have this edge in the graph we should flip it to\r\n  // match the correct orientation.\r\n  if (!g.hasEdge(v, w)) {\r\n    v = edge.w;\r\n    w = edge.v;\r\n  }\r\n\r\n  var vLabel = t.node(v),\r\n      wLabel = t.node(w),\r\n      tailLabel = vLabel,\r\n      flip = false;\r\n\r\n  // If the root is in the tail of the edge then we need to flip the logic that\r\n  // checks for the head and tail nodes in the candidates function below.\r\n  if (vLabel.lim > wLabel.lim) {\r\n    tailLabel = wLabel;\r\n    flip = true;\r\n  }\r\n\r\n  var candidates = _.filter(g.edges(), function(edge) {\r\n    return flip === isDescendant(t, t.node(edge.v), tailLabel) &&\r\n           flip !== isDescendant(t, t.node(edge.w), tailLabel);\r\n  });\r\n\r\n  return _.min(candidates, function(edge) { return slack(g, edge); });\r\n}\r\n\r\nfunction exchangeEdges(t, g, e, f) {\r\n  var v = e.v,\r\n      w = e.w;\r\n  t.removeEdge(v, w);\r\n  t.setEdge(f.v, f.w, {});\r\n  initLowLimValues(t);\r\n  initCutValues(t, g);\r\n  updateRanks(t, g);\r\n}\r\n\r\nfunction updateRanks(t, g) {\r\n  var root = _.find(t.nodes(), function(v) { return !g.node(v).parent; }),\r\n      vs = preorder(t, root);\r\n  vs = vs.slice(1);\r\n  _.each(vs, function(v) {\r\n    var parent = t.node(v).parent,\r\n        edge = g.edge(v, parent),\r\n        flipped = false;\r\n\r\n    if (!edge) {\r\n      edge = g.edge(parent, v);\r\n      flipped = true;\r\n    }\r\n\r\n    g.node(v).rank = g.node(parent).rank + (flipped ? edge.minlen : -edge.minlen);\r\n  });\r\n}\r\n\r\n/*\r\n * Returns true if the edge is in the tree.\r\n */\r\nfunction isTreeEdge(tree, u, v) {\r\n  return tree.hasEdge(u, v);\r\n}\r\n\r\n/*\r\n * Returns true if the specified node is descendant of the root node per the\r\n * assigned low and lim attributes in the tree.\r\n */\r\nfunction isDescendant(tree, vLabel, rootLabel) {\r\n  return rootLabel.low <= vLabel.lim && vLabel.lim <= rootLabel.lim;\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10,\"../util\":29,\"./feasible-tree\":25,\"./util\":28}],28:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = {\r\n  longestPath: longestPath,\r\n  slack: slack\r\n};\r\n\r\n/*\r\n * Initializes ranks for the input graph using the longest path algorithm. This\r\n * algorithm scales well and is fast in practice, it yields rather poor\r\n * solutions. Nodes are pushed to the lowest layer possible, leaving the bottom\r\n * ranks wide and leaving edges longer than necessary. However, due to its\r\n * speed, this algorithm is good for getting an initial ranking that can be fed\r\n * into other algorithms.\r\n *\r\n * This algorithm does not normalize layers because it will be used by other\r\n * algorithms in most cases. If using this algorithm directly, be sure to\r\n * run normalize at the end.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Input graph is a DAG.\r\n *    2. Input graph node labels can be assigned properties.\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. Each node will be assign an (unnormalized) \"rank\" property.\r\n */\r\nfunction longestPath(g) {\r\n  var visited = {};\r\n\r\n  function dfs(v) {\r\n    var label = g.node(v);\r\n    if (_.has(visited, v)) {\r\n      return label.rank;\r\n    }\r\n    visited[v] = true;\r\n\r\n    var rank = _.min(_.map(g.outEdges(v), function(e) {\r\n      return dfs(e.w) - g.edge(e).minlen;\r\n    }));\r\n\r\n    if (rank === Number.POSITIVE_INFINITY) {\r\n      rank = 0;\r\n    }\r\n\r\n    return (label.rank = rank);\r\n  }\r\n\r\n  _.each(g.sources(), dfs);\r\n}\r\n\r\n/*\r\n * Returns the amount of slack for the given edge. The slack is defined as the\r\n * difference between the length of the edge and its minimum length.\r\n */\r\nfunction slack(g, e) {\r\n  return g.node(e.w).rank - g.node(e.v).rank - g.edge(e).minlen;\r\n}\r\n\r\n},{\"../lodash\":10}],29:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\"),\r\n    Graph = require(\"./graphlib\").Graph;\r\n\r\nmodule.exports = {\r\n  addDummyNode: addDummyNode,\r\n  simplify: simplify,\r\n  asNonCompoundGraph: asNonCompoundGraph,\r\n  successorWeights: successorWeights,\r\n  predecessorWeights: predecessorWeights,\r\n  intersectRect: intersectRect,\r\n  buildLayerMatrix: buildLayerMatrix,\r\n  normalizeRanks: normalizeRanks,\r\n  removeEmptyRanks: removeEmptyRanks,\r\n  addBorderNode: addBorderNode,\r\n  maxRank: maxRank,\r\n  partition: partition,\r\n  time: time,\r\n  notime: notime\r\n};\r\n\r\n/*\r\n * Adds a dummy node to the graph and return v.\r\n */\r\nfunction addDummyNode(g, type, attrs, name) {\r\n  var v;\r\n  do {\r\n    v = _.uniqueId(name);\r\n  } while (g.hasNode(v));\r\n\r\n  attrs.dummy = type;\r\n  g.setNode(v, attrs);\r\n  return v;\r\n}\r\n\r\n/*\r\n * Returns a new graph with only simple edges. Handles aggregation of data\r\n * associated with multi-edges.\r\n */\r\nfunction simplify(g) {\r\n  var simplified = new Graph().setGraph(g.graph());\r\n  _.each(g.nodes(), function(v) { simplified.setNode(v, g.node(v)); });\r\n  _.each(g.edges(), function(e) {\r\n    var simpleLabel = simplified.edge(e.v, e.w) || { weight: 0, minlen: 1 },\r\n        label = g.edge(e);\r\n    simplified.setEdge(e.v, e.w, {\r\n      weight: simpleLabel.weight + label.weight,\r\n      minlen: Math.max(simpleLabel.minlen, label.minlen)\r\n    });\r\n  });\r\n  return simplified;\r\n}\r\n\r\nfunction asNonCompoundGraph(g) {\r\n  var simplified = new Graph({ multigraph: g.isMultigraph() }).setGraph(g.graph());\r\n  _.each(g.nodes(), function(v) {\r\n    if (!g.children(v).length) {\r\n      simplified.setNode(v, g.node(v));\r\n    }\r\n  });\r\n  _.each(g.edges(), function(e) {\r\n    simplified.setEdge(e, g.edge(e));\r\n  });\r\n  return simplified;\r\n}\r\n\r\nfunction successorWeights(g) {\r\n  var weightMap = _.map(g.nodes(), function(v) {\r\n    var sucs = {};\r\n    _.each(g.outEdges(v), function(e) {\r\n      sucs[e.w] = (sucs[e.w] || 0) + g.edge(e).weight;\r\n    });\r\n    return sucs;\r\n  });\r\n  return _.zipObject(g.nodes(), weightMap);\r\n}\r\n\r\nfunction predecessorWeights(g) {\r\n  var weightMap = _.map(g.nodes(), function(v) {\r\n    var preds = {};\r\n    _.each(g.inEdges(v), function(e) {\r\n      preds[e.v] = (preds[e.v] || 0) + g.edge(e).weight;\r\n    });\r\n    return preds;\r\n  });\r\n  return _.zipObject(g.nodes(), weightMap);\r\n}\r\n\r\n/*\r\n * Finds where a line starting at point ({x, y}) would intersect a rectangle\r\n * ({x, y, width, height}) if it were pointing at the rectangle's center.\r\n */\r\nfunction intersectRect(rect, point) {\r\n  var x = rect.x;\r\n  var y = rect.y;\r\n\r\n  // Rectangle intersection algorithm from:\r\n  // http://math.stackexchange.com/questions/108113/find-edge-between-two-boxes\r\n  var dx = point.x - x;\r\n  var dy = point.y - y;\r\n  var w = rect.width / 2;\r\n  var h = rect.height / 2;\r\n\r\n  if (!dx && !dy) {\r\n    throw new Error(\"Not possible to find intersection inside of the rectangle\");\r\n  }\r\n\r\n  var sx, sy;\r\n  if (Math.abs(dy) * w > Math.abs(dx) * h) {\r\n    // Intersection is top or bottom of rect.\r\n    if (dy < 0) {\r\n      h = -h;\r\n    }\r\n    sx = h * dx / dy;\r\n    sy = h;\r\n  } else {\r\n    // Intersection is left or right of rect.\r\n    if (dx < 0) {\r\n      w = -w;\r\n    }\r\n    sx = w;\r\n    sy = w * dy / dx;\r\n  }\r\n\r\n  return { x: x + sx, y: y + sy };\r\n}\r\n\r\n/*\r\n * Given a DAG with each node assigned \"rank\" and \"order\" properties, this\r\n * function will produce a matrix with the ids of each node.\r\n */\r\nfunction buildLayerMatrix(g) {\r\n  var layering = _.map(_.range(maxRank(g) + 1), function() { return []; });\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v),\r\n        rank = node.rank;\r\n    if (!_.isUndefined(rank)) {\r\n      layering[rank][node.order] = v;\r\n    }\r\n  });\r\n  return layering;\r\n}\r\n\r\n/*\r\n * Adjusts the ranks for all nodes in the graph such that all nodes v have\r\n * rank(v) >= 0 and at least one node w has rank(w) = 0.\r\n */\r\nfunction normalizeRanks(g) {\r\n  var min = _.min(_.map(g.nodes(), function(v) { return g.node(v).rank; }));\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    if (_.has(node, \"rank\")) {\r\n      node.rank -= min;\r\n    }\r\n  });\r\n}\r\n\r\nfunction removeEmptyRanks(g) {\r\n  // Ranks may not start at 0, so we need to offset them\r\n  var offset = _.min(_.map(g.nodes(), function(v) { return g.node(v).rank; }));\r\n\r\n  var layers = [];\r\n  _.each(g.nodes(), function(v) {\r\n    var rank = g.node(v).rank - offset;\r\n    if (!_.has(layers, rank)) {\r\n      layers[rank] = [];\r\n    }\r\n    layers[rank].push(v);\r\n  });\r\n\r\n  var delta = 0,\r\n      nodeRankFactor = g.graph().nodeRankFactor;\r\n  _.each(layers, function(vs, i) {\r\n    if (_.isUndefined(vs) && i % nodeRankFactor !== 0) {\r\n      --delta;\r\n    } else if (delta) {\r\n      _.each(vs, function(v) { g.node(v).rank += delta; });\r\n    }\r\n  });\r\n}\r\n\r\nfunction addBorderNode(g, prefix, rank, order) {\r\n  var node = {\r\n    width: 0,\r\n    height: 0\r\n  };\r\n  if (arguments.length >= 4) {\r\n    node.rank = rank;\r\n    node.order = order;\r\n  }\r\n  return addDummyNode(g, \"border\", node, prefix);\r\n}\r\n\r\nfunction maxRank(g) {\r\n  return _.max(_.map(g.nodes(), function(v) {\r\n    var rank = g.node(v).rank;\r\n    if (!_.isUndefined(rank)) {\r\n      return rank;\r\n    }\r\n  }));\r\n}\r\n\r\n/*\r\n * Partition a collection into two groups: `lhs` and `rhs`. If the supplied\r\n * function returns true for an entry it goes into `lhs`. Otherwise it goes\r\n * into `rhs.\r\n */\r\nfunction partition(collection, fn) {\r\n  var result = { lhs: [], rhs: [] };\r\n  _.each(collection, function(value) {\r\n    if (fn(value)) {\r\n      result.lhs.push(value);\r\n    } else {\r\n      result.rhs.push(value);\r\n    }\r\n  });\r\n  return result;\r\n}\r\n\r\n/*\r\n * Returns a new function that wraps `fn` with a timer. The wrapper logs the\r\n * time it takes to execute the function.\r\n */\r\nfunction time(name, fn) {\r\n  var start = _.now();\r\n  try {\r\n    return fn();\r\n  } finally {\r\n    console.log(name + \" time: \" + (_.now() - start) + \"ms\");\r\n  }\r\n}\r\n\r\nfunction notime(name, fn) {\r\n  return fn();\r\n}\r\n\r\n},{\"./graphlib\":7,\"./lodash\":10}],30:[function(require,module,exports){\r\nmodule.exports = \"0.7.1\";\r\n\r\n},{}],31:[function(require,module,exports){\r\n/**\r\n * Copyright (c) 2014, Chris Pettitt\r\n * All rights reserved.\r\n *\r\n * Redistribution and use in source and binary forms, with or without\r\n * modification, are permitted provided that the following conditions are met:\r\n *\r\n * 1. Redistributions of source code must retain the above copyright notice, this\r\n * list of conditions and the following disclaimer.\r\n *\r\n * 2. Redistributions in binary form must reproduce the above copyright notice,\r\n * this list of conditions and the following disclaimer in the documentation\r\n * and/or other materials provided with the distribution.\r\n *\r\n * 3. Neither the name of the copyright holder nor the names of its contributors\r\n * may be used to endorse or promote products derived from this software without\r\n * specific prior written permission.\r\n *\r\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\r\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\r\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\r\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\r\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\r\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\r\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n */\r\n\r\nvar lib = require(\"./lib\");\r\n\r\nmodule.exports = {\r\n  Graph: lib.Graph,\r\n  json: require(\"./lib/json\"),\r\n  alg: require(\"./lib/alg\"),\r\n  version: lib.version\r\n};\r\n\r\n},{\"./lib\":47,\"./lib/alg\":38,\"./lib/json\":48}],32:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = components;\r\n\r\nfunction components(g) {\r\n  var visited = {},\r\n      cmpts = [],\r\n      cmpt;\r\n\r\n  function dfs(v) {\r\n    if (_.has(visited, v)) return;\r\n    visited[v] = true;\r\n    cmpt.push(v);\r\n    _.each(g.successors(v), dfs);\r\n    _.each(g.predecessors(v), dfs);\r\n  }\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    cmpt = [];\r\n    dfs(v);\r\n    if (cmpt.length) {\r\n      cmpts.push(cmpt);\r\n    }\r\n  });\r\n\r\n  return cmpts;\r\n}\r\n\r\n},{\"../lodash\":49}],33:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = dfs;\r\n\r\n/*\r\n * A helper that preforms a pre- or post-order traversal on the input graph\r\n * and returns the nodes in the order they were visited. This algorithm treats\r\n * the input as undirected.\r\n *\r\n * Order must be one of \"pre\" or \"post\".\r\n */\r\nfunction dfs(g, vs, order) {\r\n  if (!_.isArray(vs)) {\r\n    vs = [vs];\r\n  }\r\n\r\n  var acc = [],\r\n      visited = {};\r\n  _.each(vs, function(v) {\r\n    if (!g.hasNode(v)) {\r\n      throw new Error(\"Graph does not have node: \" + v);\r\n    }\r\n\r\n    doDfs(g, v, order === \"post\", visited, acc);\r\n  });\r\n  return acc;\r\n}\r\n\r\nfunction doDfs(g, v, postorder, visited, acc) {\r\n  if (!_.has(visited, v)) {\r\n    visited[v] = true;\r\n\r\n    if (!postorder) { acc.push(v); }\r\n    _.each(g.neighbors(v), function(w) {\r\n      doDfs(g, w, postorder, visited, acc);\r\n    });\r\n    if (postorder) { acc.push(v); }\r\n  }\r\n}\r\n\r\n},{\"../lodash\":49}],34:[function(require,module,exports){\r\nvar dijkstra = require(\"./dijkstra\"),\r\n    _ = require(\"../lodash\");\r\n\r\nmodule.exports = dijkstraAll;\r\n\r\nfunction dijkstraAll(g, weightFunc, edgeFunc) {\r\n  return _.transform(g.nodes(), function(acc, v) {\r\n    acc[v] = dijkstra(g, v, weightFunc, edgeFunc);\r\n  }, {});\r\n}\r\n\r\n},{\"../lodash\":49,\"./dijkstra\":35}],35:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    PriorityQueue = require(\"../data/priority-queue\");\r\n\r\nmodule.exports = dijkstra;\r\n\r\nvar DEFAULT_WEIGHT_FUNC = _.constant(1);\r\n\r\nfunction dijkstra(g, source, weightFn, edgeFn) {\r\n  return runDijkstra(g, String(source),\r\n                     weightFn || DEFAULT_WEIGHT_FUNC,\r\n                     edgeFn || function(v) { return g.outEdges(v); });\r\n}\r\n\r\nfunction runDijkstra(g, source, weightFn, edgeFn) {\r\n  var results = {},\r\n      pq = new PriorityQueue(),\r\n      v, vEntry;\r\n\r\n  var updateNeighbors = function(edge) {\r\n    var w = edge.v !== v ? edge.v : edge.w,\r\n        wEntry = results[w],\r\n        weight = weightFn(edge),\r\n        distance = vEntry.distance + weight;\r\n\r\n    if (weight < 0) {\r\n      throw new Error(\"dijkstra does not allow negative edge weights. \" +\r\n                      \"Bad edge: \" + edge + \" Weight: \" + weight);\r\n    }\r\n\r\n    if (distance < wEntry.distance) {\r\n      wEntry.distance = distance;\r\n      wEntry.predecessor = v;\r\n      pq.decrease(w, distance);\r\n    }\r\n  };\r\n\r\n  g.nodes().forEach(function(v) {\r\n    var distance = v === source ? 0 : Number.POSITIVE_INFINITY;\r\n    results[v] = { distance: distance };\r\n    pq.add(v, distance);\r\n  });\r\n\r\n  while (pq.size() > 0) {\r\n    v = pq.removeMin();\r\n    vEntry = results[v];\r\n    if (vEntry.distance === Number.POSITIVE_INFINITY) {\r\n      break;\r\n    }\r\n\r\n    edgeFn(v).forEach(updateNeighbors);\r\n  }\r\n\r\n  return results;\r\n}\r\n\r\n},{\"../data/priority-queue\":45,\"../lodash\":49}],36:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    tarjan = require(\"./tarjan\");\r\n\r\nmodule.exports = findCycles;\r\n\r\nfunction findCycles(g) {\r\n  return _.filter(tarjan(g), function(cmpt) { return cmpt.length > 1; });\r\n}\r\n\r\n},{\"../lodash\":49,\"./tarjan\":43}],37:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = floydWarshall;\r\n\r\nvar DEFAULT_WEIGHT_FUNC = _.constant(1);\r\n\r\nfunction floydWarshall(g, weightFn, edgeFn) {\r\n  return runFloydWarshall(g,\r\n                          weightFn || DEFAULT_WEIGHT_FUNC,\r\n                          edgeFn || function(v) { return g.outEdges(v); });\r\n}\r\n\r\nfunction runFloydWarshall(g, weightFn, edgeFn) {\r\n  var results = {},\r\n      nodes = g.nodes();\r\n\r\n  nodes.forEach(function(v) {\r\n    results[v] = {};\r\n    results[v][v] = { distance: 0 };\r\n    nodes.forEach(function(w) {\r\n      if (v !== w) {\r\n        results[v][w] = { distance: Number.POSITIVE_INFINITY };\r\n      }\r\n    });\r\n    edgeFn(v).forEach(function(edge) {\r\n      var w = edge.v === v ? edge.w : edge.v,\r\n          d = weightFn(edge);\r\n      results[v][w] = { distance: d, predecessor: v };\r\n    });\r\n  });\r\n\r\n  nodes.forEach(function(k) {\r\n    var rowK = results[k];\r\n    nodes.forEach(function(i) {\r\n      var rowI = results[i];\r\n      nodes.forEach(function(j) {\r\n        var ik = rowI[k];\r\n        var kj = rowK[j];\r\n        var ij = rowI[j];\r\n        var altDistance = ik.distance + kj.distance;\r\n        if (altDistance < ij.distance) {\r\n          ij.distance = altDistance;\r\n          ij.predecessor = kj.predecessor;\r\n        }\r\n      });\r\n    });\r\n  });\r\n\r\n  return results;\r\n}\r\n\r\n},{\"../lodash\":49}],38:[function(require,module,exports){\r\nmodule.exports = {\r\n  components: require(\"./components\"),\r\n  dijkstra: require(\"./dijkstra\"),\r\n  dijkstraAll: require(\"./dijkstra-all\"),\r\n  findCycles: require(\"./find-cycles\"),\r\n  floydWarshall: require(\"./floyd-warshall\"),\r\n  isAcyclic: require(\"./is-acyclic\"),\r\n  postorder: require(\"./postorder\"),\r\n  preorder: require(\"./preorder\"),\r\n  prim: require(\"./prim\"),\r\n  tarjan: require(\"./tarjan\"),\r\n  topsort: require(\"./topsort\")\r\n};\r\n\r\n},{\"./components\":32,\"./dijkstra\":35,\"./dijkstra-all\":34,\"./find-cycles\":36,\"./floyd-warshall\":37,\"./is-acyclic\":39,\"./postorder\":40,\"./preorder\":41,\"./prim\":42,\"./tarjan\":43,\"./topsort\":44}],39:[function(require,module,exports){\r\nvar topsort = require(\"./topsort\");\r\n\r\nmodule.exports = isAcyclic;\r\n\r\nfunction isAcyclic(g) {\r\n  try {\r\n    topsort(g);\r\n  } catch (e) {\r\n    if (e instanceof topsort.CycleException) {\r\n      return false;\r\n    }\r\n    throw e;\r\n  }\r\n  return true;\r\n}\r\n\r\n},{\"./topsort\":44}],40:[function(require,module,exports){\r\nvar dfs = require(\"./dfs\");\r\n\r\nmodule.exports = postorder;\r\n\r\nfunction postorder(g, vs) {\r\n  return dfs(g, vs, \"post\");\r\n}\r\n\r\n},{\"./dfs\":33}],41:[function(require,module,exports){\r\nvar dfs = require(\"./dfs\");\r\n\r\nmodule.exports = preorder;\r\n\r\nfunction preorder(g, vs) {\r\n  return dfs(g, vs, \"pre\");\r\n}\r\n\r\n},{\"./dfs\":33}],42:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    Graph = require(\"../graph\"),\r\n    PriorityQueue = require(\"../data/priority-queue\");\r\n\r\nmodule.exports = prim;\r\n\r\nfunction prim(g, weightFunc) {\r\n  var result = new Graph(),\r\n      parents = {},\r\n      pq = new PriorityQueue(),\r\n      v;\r\n\r\n  function updateNeighbors(edge) {\r\n    var w = edge.v === v ? edge.w : edge.v,\r\n        pri = pq.priority(w);\r\n    if (pri !== undefined) {\r\n      var edgeWeight = weightFunc(edge);\r\n      if (edgeWeight < pri) {\r\n        parents[w] = v;\r\n        pq.decrease(w, edgeWeight);\r\n      }\r\n    }\r\n  }\r\n\r\n  if (g.nodeCount() === 0) {\r\n    return result;\r\n  }\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    pq.add(v, Number.POSITIVE_INFINITY);\r\n    result.setNode(v);\r\n  });\r\n\r\n  // Start from an arbitrary node\r\n  pq.decrease(g.nodes()[0], 0);\r\n\r\n  var init = false;\r\n  while (pq.size() > 0) {\r\n    v = pq.removeMin();\r\n    if (_.has(parents, v)) {\r\n      result.setEdge(v, parents[v]);\r\n    } else if (init) {\r\n      throw new Error(\"Input graph is not connected: \" + g);\r\n    } else {\r\n      init = true;\r\n    }\r\n\r\n    g.nodeEdges(v).forEach(updateNeighbors);\r\n  }\r\n\r\n  return result;\r\n}\r\n\r\n},{\"../data/priority-queue\":45,\"../graph\":46,\"../lodash\":49}],43:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = tarjan;\r\n\r\nfunction tarjan(g) {\r\n  var index = 0,\r\n      stack = [],\r\n      visited = {}, // node id -> { onStack, lowlink, index }\r\n      results = [];\r\n\r\n  function dfs(v) {\r\n    var entry = visited[v] = {\r\n      onStack: true,\r\n      lowlink: index,\r\n      index: index++\r\n    };\r\n    stack.push(v);\r\n\r\n    g.successors(v).forEach(function(w) {\r\n      if (!_.has(visited, w)) {\r\n        dfs(w);\r\n        entry.lowlink = Math.min(entry.lowlink, visited[w].lowlink);\r\n      } else if (visited[w].onStack) {\r\n        entry.lowlink = Math.min(entry.lowlink, visited[w].index);\r\n      }\r\n    });\r\n\r\n    if (entry.lowlink === entry.index) {\r\n      var cmpt = [],\r\n          w;\r\n      do {\r\n        w = stack.pop();\r\n        visited[w].onStack = false;\r\n        cmpt.push(w);\r\n      } while (v !== w);\r\n      results.push(cmpt);\r\n    }\r\n  }\r\n\r\n  g.nodes().forEach(function(v) {\r\n    if (!_.has(visited, v)) {\r\n      dfs(v);\r\n    }\r\n  });\r\n\r\n  return results;\r\n}\r\n\r\n},{\"../lodash\":49}],44:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = topsort;\r\ntopsort.CycleException = CycleException;\r\n\r\nfunction topsort(g) {\r\n  var visited = {},\r\n      stack = {},\r\n      results = [];\r\n\r\n  function visit(node) {\r\n    if (_.has(stack, node)) {\r\n      throw new CycleException();\r\n    }\r\n\r\n    if (!_.has(visited, node)) {\r\n      stack[node] = true;\r\n      visited[node] = true;\r\n      _.each(g.predecessors(node), visit);\r\n      delete stack[node];\r\n      results.push(node);\r\n    }\r\n  }\r\n\r\n  _.each(g.sinks(), visit);\r\n\r\n  if (_.size(visited) !== g.nodeCount()) {\r\n    throw new CycleException();\r\n  }\r\n\r\n  return results;\r\n}\r\n\r\nfunction CycleException() {}\r\n\r\n},{\"../lodash\":49}],45:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = PriorityQueue;\r\n\r\n/**\r\n * A min-priority queue data structure. This algorithm is derived from Cormen,\r\n * et al., \"Introduction to Algorithms\". The basic idea of a min-priority\r\n * queue is that you can efficiently (in O(1) time) get the smallest key in\r\n * the queue. Adding and removing elements takes O(log n) time. A key can\r\n * have its priority decreased in O(log n) time.\r\n */\r\nfunction PriorityQueue() {\r\n  this._arr = [];\r\n  this._keyIndices = {};\r\n}\r\n\r\n/**\r\n * Returns the number of elements in the queue. Takes `O(1)` time.\r\n */\r\nPriorityQueue.prototype.size = function() {\r\n  return this._arr.length;\r\n};\r\n\r\n/**\r\n * Returns the keys that are in the queue. Takes `O(n)` time.\r\n */\r\nPriorityQueue.prototype.keys = function() {\r\n  return this._arr.map(function(x) { return x.key; });\r\n};\r\n\r\n/**\r\n * Returns `true` if **key** is in the queue and `false` if not.\r\n */\r\nPriorityQueue.prototype.has = function(key) {\r\n  return _.has(this._keyIndices, key);\r\n};\r\n\r\n/**\r\n * Returns the priority for **key**. If **key** is not present in the queue\r\n * then this function returns `undefined`. Takes `O(1)` time.\r\n *\r\n * @param {Object} key\r\n */\r\nPriorityQueue.prototype.priority = function(key) {\r\n  var index = this._keyIndices[key];\r\n  if (index !== undefined) {\r\n    return this._arr[index].priority;\r\n  }\r\n};\r\n\r\n/**\r\n * Returns the key for the minimum element in this queue. If the queue is\r\n * empty this function throws an Error. Takes `O(1)` time.\r\n */\r\nPriorityQueue.prototype.min = function() {\r\n  if (this.size() === 0) {\r\n    throw new Error(\"Queue underflow\");\r\n  }\r\n  return this._arr[0].key;\r\n};\r\n\r\n/**\r\n * Inserts a new key into the priority queue. If the key already exists in\r\n * the queue this function returns `false`; otherwise it will return `true`.\r\n * Takes `O(n)` time.\r\n *\r\n * @param {Object} key the key to add\r\n * @param {Number} priority the initial priority for the key\r\n */\r\nPriorityQueue.prototype.add = function(key, priority) {\r\n  var keyIndices = this._keyIndices;\r\n  key = String(key);\r\n  if (!_.has(keyIndices, key)) {\r\n    var arr = this._arr;\r\n    var index = arr.length;\r\n    keyIndices[key] = index;\r\n    arr.push({key: key, priority: priority});\r\n    this._decrease(index);\r\n    return true;\r\n  }\r\n  return false;\r\n};\r\n\r\n/**\r\n * Removes and returns the smallest key in the queue. Takes `O(log n)` time.\r\n */\r\nPriorityQueue.prototype.removeMin = function() {\r\n  this._swap(0, this._arr.length - 1);\r\n  var min = this._arr.pop();\r\n  delete this._keyIndices[min.key];\r\n  this._heapify(0);\r\n  return min.key;\r\n};\r\n\r\n/**\r\n * Decreases the priority for **key** to **priority**. If the new priority is\r\n * greater than the previous priority, this function will throw an Error.\r\n *\r\n * @param {Object} key the key for which to raise priority\r\n * @param {Number} priority the new priority for the key\r\n */\r\nPriorityQueue.prototype.decrease = function(key, priority) {\r\n  var index = this._keyIndices[key];\r\n  if (priority > this._arr[index].priority) {\r\n    throw new Error(\"New priority is greater than current priority. \" +\r\n        \"Key: \" + key + \" Old: \" + this._arr[index].priority + \" New: \" + priority);\r\n  }\r\n  this._arr[index].priority = priority;\r\n  this._decrease(index);\r\n};\r\n\r\nPriorityQueue.prototype._heapify = function(i) {\r\n  var arr = this._arr;\r\n  var l = 2 * i,\r\n      r = l + 1,\r\n      largest = i;\r\n  if (l < arr.length) {\r\n    largest = arr[l].priority < arr[largest].priority ? l : largest;\r\n    if (r < arr.length) {\r\n      largest = arr[r].priority < arr[largest].priority ? r : largest;\r\n    }\r\n    if (largest !== i) {\r\n      this._swap(i, largest);\r\n      this._heapify(largest);\r\n    }\r\n  }\r\n};\r\n\r\nPriorityQueue.prototype._decrease = function(index) {\r\n  var arr = this._arr;\r\n  var priority = arr[index].priority;\r\n  var parent;\r\n  while (index !== 0) {\r\n    parent = index >> 1;\r\n    if (arr[parent].priority < priority) {\r\n      break;\r\n    }\r\n    this._swap(index, parent);\r\n    index = parent;\r\n  }\r\n};\r\n\r\nPriorityQueue.prototype._swap = function(i, j) {\r\n  var arr = this._arr;\r\n  var keyIndices = this._keyIndices;\r\n  var origArrI = arr[i];\r\n  var origArrJ = arr[j];\r\n  arr[i] = origArrJ;\r\n  arr[j] = origArrI;\r\n  keyIndices[origArrJ.key] = i;\r\n  keyIndices[origArrI.key] = j;\r\n};\r\n\r\n},{\"../lodash\":49}],46:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\");\r\n\r\nmodule.exports = Graph;\r\n\r\nvar DEFAULT_EDGE_NAME = \"\\x00\",\r\n    GRAPH_NODE = \"\\x00\",\r\n    EDGE_KEY_DELIM = \"\\x01\";\r\n\r\n// Implementation notes:\r\n//\r\n//  * Node id query functions should return string ids for the nodes\r\n//  * Edge id query functions should return an \"edgeObj\", edge object, that is\r\n//    composed of enough information to uniquely identify an edge: {v, w, name}.\r\n//  * Internally we use an \"edgeId\", a stringified form of the edgeObj, to\r\n//    reference edges. This is because we need a performant way to look these\r\n//    edges up and, object properties, which have string keys, are the closest\r\n//    we're going to get to a performant hashtable in JavaScript.\r\n\r\nfunction Graph(opts) {\r\n  this._isDirected = _.has(opts, \"directed\") ? opts.directed : true;\r\n  this._isMultigraph = _.has(opts, \"multigraph\") ? opts.multigraph : false;\r\n  this._isCompound = _.has(opts, \"compound\") ? opts.compound : false;\r\n\r\n  // Label for the graph itself\r\n  this._label = undefined;\r\n\r\n  // Defaults to be set when creating a new node\r\n  this._defaultNodeLabelFn = _.constant(undefined);\r\n\r\n  // Defaults to be set when creating a new edge\r\n  this._defaultEdgeLabelFn = _.constant(undefined);\r\n\r\n  // v -> label\r\n  this._nodes = {};\r\n\r\n  if (this._isCompound) {\r\n    // v -> parent\r\n    this._parent = {};\r\n\r\n    // v -> children\r\n    this._children = {};\r\n    this._children[GRAPH_NODE] = {};\r\n  }\r\n\r\n  // v -> edgeObj\r\n  this._in = {};\r\n\r\n  // u -> v -> Number\r\n  this._preds = {};\r\n\r\n  // v -> edgeObj\r\n  this._out = {};\r\n\r\n  // v -> w -> Number\r\n  this._sucs = {};\r\n\r\n  // e -> edgeObj\r\n  this._edgeObjs = {};\r\n\r\n  // e -> label\r\n  this._edgeLabels = {};\r\n}\r\n\r\n/* Number of nodes in the graph. Should only be changed by the implementation. */\r\nGraph.prototype._nodeCount = 0;\r\n\r\n/* Number of edges in the graph. Should only be changed by the implementation. */\r\nGraph.prototype._edgeCount = 0;\r\n\r\n\r\n/* === Graph functions ========= */\r\n\r\nGraph.prototype.isDirected = function() {\r\n  return this._isDirected;\r\n};\r\n\r\nGraph.prototype.isMultigraph = function() {\r\n  return this._isMultigraph;\r\n};\r\n\r\nGraph.prototype.isCompound = function() {\r\n  return this._isCompound;\r\n};\r\n\r\nGraph.prototype.setGraph = function(label) {\r\n  this._label = label;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.graph = function() {\r\n  return this._label;\r\n};\r\n\r\n\r\n/* === Node functions ========== */\r\n\r\nGraph.prototype.setDefaultNodeLabel = function(newDefault) {\r\n  if (!_.isFunction(newDefault)) {\r\n    newDefault = _.constant(newDefault);\r\n  }\r\n  this._defaultNodeLabelFn = newDefault;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.nodeCount = function() {\r\n  return this._nodeCount;\r\n};\r\n\r\nGraph.prototype.nodes = function() {\r\n  return _.keys(this._nodes);\r\n};\r\n\r\nGraph.prototype.sources = function() {\r\n  return _.filter(this.nodes(), function(v) {\r\n    return _.isEmpty(this._in[v]);\r\n  }, this);\r\n};\r\n\r\nGraph.prototype.sinks = function() {\r\n  return _.filter(this.nodes(), function(v) {\r\n    return _.isEmpty(this._out[v]);\r\n  }, this);\r\n};\r\n\r\nGraph.prototype.setNodes = function(vs, value) {\r\n  var args = arguments;\r\n  _.each(vs, function(v) {\r\n    if (args.length > 1) {\r\n      this.setNode(v, value);\r\n    } else {\r\n      this.setNode(v);\r\n    }\r\n  }, this);\r\n  return this;\r\n};\r\n\r\nGraph.prototype.setNode = function(v, value) {\r\n  if (_.has(this._nodes, v)) {\r\n    if (arguments.length > 1) {\r\n      this._nodes[v] = value;\r\n    }\r\n    return this;\r\n  }\r\n\r\n  this._nodes[v] = arguments.length > 1 ? value : this._defaultNodeLabelFn(v);\r\n  if (this._isCompound) {\r\n    this._parent[v] = GRAPH_NODE;\r\n    this._children[v] = {};\r\n    this._children[GRAPH_NODE][v] = true;\r\n  }\r\n  this._in[v] = {};\r\n  this._preds[v] = {};\r\n  this._out[v] = {};\r\n  this._sucs[v] = {};\r\n  ++this._nodeCount;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.node = function(v) {\r\n  return this._nodes[v];\r\n};\r\n\r\nGraph.prototype.hasNode = function(v) {\r\n  return _.has(this._nodes, v);\r\n};\r\n\r\nGraph.prototype.removeNode =  function(v) {\r\n  var self = this;\r\n  if (_.has(this._nodes, v)) {\r\n    var removeEdge = function(e) { self.removeEdge(self._edgeObjs[e]); };\r\n    delete this._nodes[v];\r\n    if (this._isCompound) {\r\n      this._removeFromParentsChildList(v);\r\n      delete this._parent[v];\r\n      _.each(this.children(v), function(child) {\r\n        this.setParent(child);\r\n      }, this);\r\n      delete this._children[v];\r\n    }\r\n    _.each(_.keys(this._in[v]), removeEdge);\r\n    delete this._in[v];\r\n    delete this._preds[v];\r\n    _.each(_.keys(this._out[v]), removeEdge);\r\n    delete this._out[v];\r\n    delete this._sucs[v];\r\n    --this._nodeCount;\r\n  }\r\n  return this;\r\n};\r\n\r\nGraph.prototype.setParent = function(v, parent) {\r\n  if (!this._isCompound) {\r\n    throw new Error(\"Cannot set parent in a non-compound graph\");\r\n  }\r\n\r\n  if (_.isUndefined(parent)) {\r\n    parent = GRAPH_NODE;\r\n  } else {\r\n    for (var ancestor = parent;\r\n         !_.isUndefined(ancestor);\r\n         ancestor = this.parent(ancestor)) {\r\n      if (ancestor === v) {\r\n        throw new Error(\"Setting \" + parent+ \" as parent of \" + v +\r\n                        \" would create create a cycle\");\r\n      }\r\n    }\r\n\r\n    this.setNode(parent);\r\n  }\r\n\r\n  this.setNode(v);\r\n  this._removeFromParentsChildList(v);\r\n  this._parent[v] = parent;\r\n  this._children[parent][v] = true;\r\n  return this;\r\n};\r\n\r\nGraph.prototype._removeFromParentsChildList = function(v) {\r\n  delete this._children[this._parent[v]][v];\r\n};\r\n\r\nGraph.prototype.parent = function(v) {\r\n  if (this._isCompound) {\r\n    var parent = this._parent[v];\r\n    if (parent !== GRAPH_NODE) {\r\n      return parent;\r\n    }\r\n  }\r\n};\r\n\r\nGraph.prototype.children = function(v) {\r\n  if (_.isUndefined(v)) {\r\n    v = GRAPH_NODE;\r\n  }\r\n\r\n  if (this._isCompound) {\r\n    var children = this._children[v];\r\n    if (children) {\r\n      return _.keys(children);\r\n    }\r\n  } else if (v === GRAPH_NODE) {\r\n    return this.nodes();\r\n  } else if (this.hasNode(v)) {\r\n    return [];\r\n  }\r\n};\r\n\r\nGraph.prototype.predecessors = function(v) {\r\n  var predsV = this._preds[v];\r\n  if (predsV) {\r\n    return _.keys(predsV);\r\n  }\r\n};\r\n\r\nGraph.prototype.successors = function(v) {\r\n  var sucsV = this._sucs[v];\r\n  if (sucsV) {\r\n    return _.keys(sucsV);\r\n  }\r\n};\r\n\r\nGraph.prototype.neighbors = function(v) {\r\n  var preds = this.predecessors(v);\r\n  if (preds) {\r\n    return _.union(preds, this.successors(v));\r\n  }\r\n};\r\n\r\n/* === Edge functions ========== */\r\n\r\nGraph.prototype.setDefaultEdgeLabel = function(newDefault) {\r\n  if (!_.isFunction(newDefault)) {\r\n    newDefault = _.constant(newDefault);\r\n  }\r\n  this._defaultEdgeLabelFn = newDefault;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.edgeCount = function() {\r\n  return this._edgeCount;\r\n};\r\n\r\nGraph.prototype.edges = function() {\r\n  return _.values(this._edgeObjs);\r\n};\r\n\r\nGraph.prototype.setPath = function(vs, value) {\r\n  var self = this,\r\n      args = arguments;\r\n  _.reduce(vs, function(v, w) {\r\n    if (args.length > 1) {\r\n      self.setEdge(v, w, value);\r\n    } else {\r\n      self.setEdge(v, w);\r\n    }\r\n    return w;\r\n  });\r\n  return this;\r\n};\r\n\r\n/*\r\n * setEdge(v, w, [value, [name]])\r\n * setEdge({ v, w, [name] }, [value])\r\n */\r\nGraph.prototype.setEdge = function() {\r\n  var v, w, name, value,\r\n      valueSpecified = false;\r\n\r\n  if (_.isPlainObject(arguments[0])) {\r\n    v = arguments[0].v;\r\n    w = arguments[0].w;\r\n    name = arguments[0].name;\r\n    if (arguments.length === 2) {\r\n      value = arguments[1];\r\n      valueSpecified = true;\r\n    }\r\n  } else {\r\n    v = arguments[0];\r\n    w = arguments[1];\r\n    name = arguments[3];\r\n    if (arguments.length > 2) {\r\n      value = arguments[2];\r\n      valueSpecified = true;\r\n    }\r\n  }\r\n\r\n  v = \"\" + v;\r\n  w = \"\" + w;\r\n  if (!_.isUndefined(name)) {\r\n    name = \"\" + name;\r\n  }\r\n\r\n  var e = edgeArgsToId(this._isDirected, v, w, name);\r\n  if (_.has(this._edgeLabels, e)) {\r\n    if (valueSpecified) {\r\n      this._edgeLabels[e] = value;\r\n    }\r\n    return this;\r\n  }\r\n\r\n  if (!_.isUndefined(name) && !this._isMultigraph) {\r\n    throw new Error(\"Cannot set a named edge when isMultigraph = false\");\r\n  }\r\n\r\n  // It didn't exist, so we need to create it.\r\n  // First ensure the nodes exist.\r\n  this.setNode(v);\r\n  this.setNode(w);\r\n\r\n  this._edgeLabels[e] = valueSpecified ? value : this._defaultEdgeLabelFn(v, w, name);\r\n\r\n  var edgeObj = edgeArgsToObj(this._isDirected, v, w, name);\r\n  // Ensure we add undirected edges in a consistent way.\r\n  v = edgeObj.v;\r\n  w = edgeObj.w;\r\n\r\n  Object.freeze(edgeObj);\r\n  this._edgeObjs[e] = edgeObj;\r\n  incrementOrInitEntry(this._preds[w], v);\r\n  incrementOrInitEntry(this._sucs[v], w);\r\n  this._in[w][e] = edgeObj;\r\n  this._out[v][e] = edgeObj;\r\n  this._edgeCount++;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.edge = function(v, w, name) {\r\n  var e = (arguments.length === 1\r\n            ? edgeObjToId(this._isDirected, arguments[0])\r\n            : edgeArgsToId(this._isDirected, v, w, name));\r\n  return this._edgeLabels[e];\r\n};\r\n\r\nGraph.prototype.hasEdge = function(v, w, name) {\r\n  var e = (arguments.length === 1\r\n            ? edgeObjToId(this._isDirected, arguments[0])\r\n            : edgeArgsToId(this._isDirected, v, w, name));\r\n  return _.has(this._edgeLabels, e);\r\n};\r\n\r\nGraph.prototype.removeEdge = function(v, w, name) {\r\n  var e = (arguments.length === 1\r\n            ? edgeObjToId(this._isDirected, arguments[0])\r\n            : edgeArgsToId(this._isDirected, v, w, name)),\r\n      edge = this._edgeObjs[e];\r\n  if (edge) {\r\n    v = edge.v;\r\n    w = edge.w;\r\n    delete this._edgeLabels[e];\r\n    delete this._edgeObjs[e];\r\n    decrementOrRemoveEntry(this._preds[w], v);\r\n    decrementOrRemoveEntry(this._sucs[v], w);\r\n    delete this._in[w][e];\r\n    delete this._out[v][e];\r\n    this._edgeCount--;\r\n  }\r\n  return this;\r\n};\r\n\r\nGraph.prototype.inEdges = function(v, u) {\r\n  var inV = this._in[v];\r\n  if (inV) {\r\n    var edges = _.values(inV);\r\n    if (!u) {\r\n      return edges;\r\n    }\r\n    return _.filter(edges, function(edge) { return edge.v === u; });\r\n  }\r\n};\r\n\r\nGraph.prototype.outEdges = function(v, w) {\r\n  var outV = this._out[v];\r\n  if (outV) {\r\n    var edges = _.values(outV);\r\n    if (!w) {\r\n      return edges;\r\n    }\r\n    return _.filter(edges, function(edge) { return edge.w === w; });\r\n  }\r\n};\r\n\r\nGraph.prototype.nodeEdges = function(v, w) {\r\n  var inEdges = this.inEdges(v, w);\r\n  if (inEdges) {\r\n    return inEdges.concat(this.outEdges(v, w));\r\n  }\r\n};\r\n\r\nfunction incrementOrInitEntry(map, k) {\r\n  if (_.has(map, k)) {\r\n    map[k]++;\r\n  } else {\r\n    map[k] = 1;\r\n  }\r\n}\r\n\r\nfunction decrementOrRemoveEntry(map, k) {\r\n  if (!--map[k]) { delete map[k]; }\r\n}\r\n\r\nfunction edgeArgsToId(isDirected, v, w, name) {\r\n  if (!isDirected && v > w) {\r\n    var tmp = v;\r\n    v = w;\r\n    w = tmp;\r\n  }\r\n  return v + EDGE_KEY_DELIM + w + EDGE_KEY_DELIM +\r\n             (_.isUndefined(name) ? DEFAULT_EDGE_NAME : name);\r\n}\r\n\r\nfunction edgeArgsToObj(isDirected, v, w, name) {\r\n  if (!isDirected && v > w) {\r\n    var tmp = v;\r\n    v = w;\r\n    w = tmp;\r\n  }\r\n  var edgeObj =  { v: v, w: w };\r\n  if (name) {\r\n    edgeObj.name = name;\r\n  }\r\n  return edgeObj;\r\n}\r\n\r\nfunction edgeObjToId(isDirected, edgeObj) {\r\n  return edgeArgsToId(isDirected, edgeObj.v, edgeObj.w, edgeObj.name);\r\n}\r\n\r\n},{\"./lodash\":49}],47:[function(require,module,exports){\r\n// Includes only the \"core\" of graphlib\r\nmodule.exports = {\r\n  Graph: require(\"./graph\"),\r\n  version: require(\"./version\")\r\n};\r\n\r\n},{\"./graph\":46,\"./version\":50}],48:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    Graph = require(\"./graph\");\r\n\r\nmodule.exports = {\r\n  write: write,\r\n  read: read\r\n};\r\n\r\nfunction write(g) {\r\n  var json = {\r\n    options: {\r\n      directed: g.isDirected(),\r\n      multigraph: g.isMultigraph(),\r\n      compound: g.isCompound()\r\n    },\r\n    nodes: writeNodes(g),\r\n    edges: writeEdges(g)\r\n  };\r\n  if (!_.isUndefined(g.graph())) {\r\n    json.value = _.clone(g.graph());\r\n  }\r\n  return json;\r\n}\r\n\r\nfunction writeNodes(g) {\r\n  return _.map(g.nodes(), function(v) {\r\n    var nodeValue = g.node(v),\r\n        parent = g.parent(v),\r\n        node = { v: v };\r\n    if (!_.isUndefined(nodeValue)) {\r\n      node.value = nodeValue;\r\n    }\r\n    if (!_.isUndefined(parent)) {\r\n      node.parent = parent;\r\n    }\r\n    return node;\r\n  });\r\n}\r\n\r\nfunction writeEdges(g) {\r\n  return _.map(g.edges(), function(e) {\r\n    var edgeValue = g.edge(e),\r\n        edge = { v: e.v, w: e.w };\r\n    if (!_.isUndefined(e.name)) {\r\n      edge.name = e.name;\r\n    }\r\n    if (!_.isUndefined(edgeValue)) {\r\n      edge.value = edgeValue;\r\n    }\r\n    return edge;\r\n  });\r\n}\r\n\r\nfunction read(json) {\r\n  var g = new Graph(json.options).setGraph(json.value);\r\n  _.each(json.nodes, function(entry) {\r\n    g.setNode(entry.v, entry.value);\r\n    if (entry.parent) {\r\n      g.setParent(entry.v, entry.parent);\r\n    }\r\n  });\r\n  _.each(json.edges, function(entry) {\r\n    g.setEdge({ v: entry.v, w: entry.w, name: entry.name }, entry.value);\r\n  });\r\n  return g;\r\n}\r\n\r\n},{\"./graph\":46,\"./lodash\":49}],49:[function(require,module,exports){\r\nmodule.exports=require(10)\r\n},{\"/Users/cpettitt/projects/dagre/lib/lodash.js\":10,\"lodash\":51}],50:[function(require,module,exports){\r\nmodule.exports = '1.0.1';\r\n\r\n},{}],51:[function(require,module,exports){\r\n(function (global){\r\n/**\r\n * @license\r\n * Lo-Dash 2.4.1 (Custom Build) <http://lodash.com/>\r\n * Build: `lodash modern -o ./dist/lodash.js`\r\n * Copyright 2012-2013 The Dojo Foundation <http://dojofoundation.org/>\r\n * Based on Underscore.js 1.5.2 <http://underscorejs.org/LICENSE>\r\n * Copyright 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\r\n * Available under MIT license <http://lodash.com/license>\r\n */\r\n;(function() {\r\n\r\n  /** Used as a safe reference for `undefined` in pre ES5 environments */\r\n  var undefined;\r\n\r\n  /** Used to pool arrays and objects used internally */\r\n  var arrayPool = [],\r\n      objectPool = [];\r\n\r\n  /** Used to generate unique IDs */\r\n  var idCounter = 0;\r\n\r\n  /** Used to prefix keys to avoid issues with `__proto__` and properties on `Object.prototype` */\r\n  var keyPrefix = +new Date + '';\r\n\r\n  /** Used as the size when optimizations are enabled for large arrays */\r\n  var largeArraySize = 75;\r\n\r\n  /** Used as the max size of the `arrayPool` and `objectPool` */\r\n  var maxPoolSize = 40;\r\n\r\n  /** Used to detect and test whitespace */\r\n  var whitespace = (\r\n    // whitespace\r\n    ' \\t\\x0B\\f\\xA0\\ufeff' +\r\n\r\n    // line terminators\r\n    '\\n\\r\\u2028\\u2029' +\r\n\r\n    // unicode category \"Zs\" space separators\r\n    '\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000'\r\n  );\r\n\r\n  /** Used to match empty string literals in compiled template source */\r\n  var reEmptyStringLeading = /\\b__p \\+= '';/g,\r\n      reEmptyStringMiddle = /\\b(__p \\+=) '' \\+/g,\r\n      reEmptyStringTrailing = /(__e\\(.*?\\)|\\b__t\\)) \\+\\n'';/g;\r\n\r\n  /**\r\n   * Used to match ES6 template delimiters\r\n   * http://people.mozilla.org/~jorendorff/es6-draft.html#sec-literals-string-literals\r\n   */\r\n  var reEsTemplate = /\\$\\{([^\\\\}]*(?:\\\\.[^\\\\}]*)*)\\}/g;\r\n\r\n  /** Used to match regexp flags from their coerced string values */\r\n  var reFlags = /\\w*$/;\r\n\r\n  /** Used to detected named functions */\r\n  var reFuncName = /^\\s*function[ \\n\\r\\t]+\\w/;\r\n\r\n  /** Used to match \"interpolate\" template delimiters */\r\n  var reInterpolate = /<%=([\\s\\S]+?)%>/g;\r\n\r\n  /** Used to match leading whitespace and zeros to be removed */\r\n  var reLeadingSpacesAndZeros = RegExp('^[' + whitespace + ']*0+(?=.$)');\r\n\r\n  /** Used to ensure capturing order of template delimiters */\r\n  var reNoMatch = /($^)/;\r\n\r\n  /** Used to detect functions containing a `this` reference */\r\n  var reThis = /\\bthis\\b/;\r\n\r\n  /** Used to match unescaped characters in compiled string literals */\r\n  var reUnescapedString = /['\\n\\r\\t\\u2028\\u2029\\\\]/g;\r\n\r\n  /** Used to assign default `context` object properties */\r\n  var contextProps = [\r\n    'Array', 'Boolean', 'Date', 'Function', 'Math', 'Number', 'Object',\r\n    'RegExp', 'String', '_', 'attachEvent', 'clearTimeout', 'isFinite', 'isNaN',\r\n    'parseInt', 'setTimeout'\r\n  ];\r\n\r\n  /** Used to make template sourceURLs easier to identify */\r\n  var templateCounter = 0;\r\n\r\n  /** `Object#toString` result shortcuts */\r\n  var argsClass = '[object Arguments]',\r\n      arrayClass = '[object Array]',\r\n      boolClass = '[object Boolean]',\r\n      dateClass = '[object Date]',\r\n      funcClass = '[object Function]',\r\n      numberClass = '[object Number]',\r\n      objectClass = '[object Object]',\r\n      regexpClass = '[object RegExp]',\r\n      stringClass = '[object String]';\r\n\r\n  /** Used to identify object classifications that `_.clone` supports */\r\n  var cloneableClasses = {};\r\n  cloneableClasses[funcClass] = false;\r\n  cloneableClasses[argsClass] = cloneableClasses[arrayClass] =\r\n  cloneableClasses[boolClass] = cloneableClasses[dateClass] =\r\n  cloneableClasses[numberClass] = cloneableClasses[objectClass] =\r\n  cloneableClasses[regexpClass] = cloneableClasses[stringClass] = true;\r\n\r\n  /** Used as an internal `_.debounce` options object */\r\n  var debounceOptions = {\r\n    'leading': false,\r\n    'maxWait': 0,\r\n    'trailing': false\r\n  };\r\n\r\n  /** Used as the property descriptor for `__bindData__` */\r\n  var descriptor = {\r\n    'configurable': false,\r\n    'enumerable': false,\r\n    'value': null,\r\n    'writable': false\r\n  };\r\n\r\n  /** Used to determine if values are of the language type Object */\r\n  var objectTypes = {\r\n    'boolean': false,\r\n    'function': true,\r\n    'object': true,\r\n    'number': false,\r\n    'string': false,\r\n    'undefined': false\r\n  };\r\n\r\n  /** Used to escape characters for inclusion in compiled string literals */\r\n  var stringEscapes = {\r\n    '\\\\': '\\\\',\r\n    \"'\": \"'\",\r\n    '\\n': 'n',\r\n    '\\r': 'r',\r\n    '\\t': 't',\r\n    '\\u2028': 'u2028',\r\n    '\\u2029': 'u2029'\r\n  };\r\n\r\n  /** Used as a reference to the global object */\r\n  var root = (objectTypes[typeof window] && window) || this;\r\n\r\n  /** Detect free variable `exports` */\r\n  var freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports;\r\n\r\n  /** Detect free variable `module` */\r\n  var freeModule = objectTypes[typeof module] && module && !module.nodeType && module;\r\n\r\n  /** Detect the popular CommonJS extension `module.exports` */\r\n  var moduleExports = freeModule && freeModule.exports === freeExports && freeExports;\r\n\r\n  /** Detect free variable `global` from Node.js or Browserified code and use it as `root` */\r\n  var freeGlobal = objectTypes[typeof global] && global;\r\n  if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal)) {\r\n    root = freeGlobal;\r\n  }\r\n\r\n  /*--------------------------------------------------------------------------*/\r\n\r\n  /**\r\n   * The base implementation of `_.indexOf` without support for binary searches\r\n   * or `fromIndex` constraints.\r\n   *\r\n   * @private\r\n   * @param {Array} array The array to search.\r\n   * @param {*} value The value to search for.\r\n   * @param {number} [fromIndex=0] The index to search from.\r\n   * @returns {number} Returns the index of the matched value or `-1`.\r\n   */\r\n  function baseIndexOf(array, value, fromIndex) {\r\n    var index = (fromIndex || 0) - 1,\r\n        length = array ? array.length : 0;\r\n\r\n    while (++index < length) {\r\n      if (array[index] === value) {\r\n        return index;\r\n      }\r\n    }\r\n    return -1;\r\n  }\r\n\r\n  /**\r\n   * An implementation of `_.contains` for cache objects that mimics the return\r\n   * signature of `_.indexOf` by returning `0` if the value is found, else `-1`.\r\n   *\r\n   * @private\r\n   * @param {Object} cache The cache object to inspect.\r\n   * @param {*} value The value to search for.\r\n   * @returns {number} Returns `0` if `value` is found, else `-1`.\r\n   */\r\n  function cacheIndexOf(cache, value) {\r\n    var type = typeof value;\r\n    cache = cache.cache;\r\n\r\n    if (type == 'boolean' || value == null) {\r\n      return cache[value] ? 0 : -1;\r\n    }\r\n    if (type != 'number' && type != 'string') {\r\n      type = 'object';\r\n    }\r\n    var key = type == 'number' ? value : keyPrefix + value;\r\n    cache = (cache = cache[type]) && cache[key];\r\n\r\n    return type == 'object'\r\n      ? (cache && baseIndexOf(cache, value) > -1 ? 0 : -1)\r\n      : (cache ? 0 : -1);\r\n  }\r\n\r\n  /**\r\n   * Adds a given value to the corresponding cache object.\r\n   *\r\n   * @private\r\n   * @param {*} value The value to add to the cache.\r\n   */\r\n  function cachePush(value) {\r\n    var cache = this.cache,\r\n        type = typeof value;\r\n\r\n    if (type == 'boolean' || value == null) {\r\n      cache[value] = true;\r\n    } else {\r\n      if (type != 'number' && type != 'string') {\r\n        type = 'object';\r\n      }\r\n      var key = type == 'number' ? value : keyPrefix + value,\r\n          typeCache = cache[type] || (cache[type] = {});\r\n\r\n      if (type == 'object') {\r\n        (typeCache[key] || (typeCache[key] = [])).push(value);\r\n      } else {\r\n        typeCache[key] = true;\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Used by `_.max` and `_.min` as the default callback when a given\r\n   * collection is a string value.\r\n   *\r\n   * @private\r\n   * @param {string} value The character to inspect.\r\n   * @returns {number} Returns the code unit of given character.\r\n   */\r\n  function charAtCallback(value) {\r\n    return value.charCodeAt(0);\r\n  }\r\n\r\n  /**\r\n   * Used by `sortBy` to compare transformed `collection` elements, stable sorting\r\n   * them in ascending order.\r\n   *\r\n   * @private\r\n   * @param {Object} a The object to compare to `b`.\r\n   * @param {Object} b The object to compare to `a`.\r\n   * @returns {number} Returns the sort order indicator of `1` or `-1`.\r\n   */\r\n  function compareAscending(a, b) {\r\n    var ac = a.criteria,\r\n        bc = b.criteria,\r\n        index = -1,\r\n        length = ac.length;\r\n\r\n    while (++index < length) {\r\n      var value = ac[index],\r\n          other = bc[index];\r\n\r\n      if (value !== other) {\r\n        if (value > other || typeof value == 'undefined') {\r\n          return 1;\r\n        }\r\n        if (value < other || typeof other == 'undefined') {\r\n          return -1;\r\n        }\r\n      }\r\n    }\r\n    // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications\r\n    // that causes it, under certain circumstances, to return the same value for\r\n    // `a` and `b`. See https://github.com/jashkenas/underscore/pull/1247\r\n    //\r\n    // This also ensures a stable sort in V8 and other engines.\r\n    // See http://code.google.com/p/v8/issues/detail?id=90\r\n    return a.index - b.index;\r\n  }\r\n\r\n  /**\r\n   * Creates a cache object to optimize linear searches of large arrays.\r\n   *\r\n   * @private\r\n   * @param {Array} [array=[]] The array to search.\r\n   * @returns {null|Object} Returns the cache object or `null` if caching should not be used.\r\n   */\r\n  function createCache(array) {\r\n    var index = -1,\r\n        length = array.length,\r\n        first = array[0],\r\n        mid = array[(length / 2) | 0],\r\n        last = array[length - 1];\r\n\r\n    if (first && typeof first == 'object' &&\r\n        mid && typeof mid == 'object' && last && typeof last == 'object') {\r\n      return false;\r\n    }\r\n    var cache = getObject();\r\n    cache['false'] = cache['null'] = cache['true'] = cache['undefined'] = false;\r\n\r\n    var result = getObject();\r\n    result.array = array;\r\n    result.cache = cache;\r\n    result.push = cachePush;\r\n\r\n    while (++index < length) {\r\n      result.push(array[index]);\r\n    }\r\n    return result;\r\n  }\r\n\r\n  /**\r\n   * Used by `template` to escape characters for inclusion in compiled\r\n   * string literals.\r\n   *\r\n   * @private\r\n   * @param {string} match The matched character to escape.\r\n   * @returns {string} Returns the escaped character.\r\n   */\r\n  function escapeStringChar(match) {\r\n    return '\\\\' + stringEscapes[match];\r\n  }\r\n\r\n  /**\r\n   * Gets an array from the array pool or creates a new one if the pool is empty.\r\n   *\r\n   * @private\r\n   * @returns {Array} The array from the pool.\r\n   */\r\n  function getArray() {\r\n    return arrayPool.pop() || [];\r\n  }\r\n\r\n  /**\r\n   * Gets an object from the object pool or creates a new one if the pool is empty.\r\n   *\r\n   * @private\r\n   * @returns {Object} The object from the pool.\r\n   */\r\n  function getObject() {\r\n    return objectPool.pop() || {\r\n      'array': null,\r\n      'cache': null,\r\n      'criteria': null,\r\n      'false': false,\r\n      'index': 0,\r\n      'null': false,\r\n      'number': null,\r\n      'object': null,\r\n      'push': null,\r\n      'string': null,\r\n      'true': false,\r\n      'undefined': false,\r\n      'value': null\r\n    };\r\n  }\r\n\r\n  /**\r\n   * Releases the given array back to the array pool.\r\n   *\r\n   * @private\r\n   * @param {Array} [array] The array to release.\r\n   */\r\n  function releaseArray(array) {\r\n    array.length = 0;\r\n    if (arrayPool.length < maxPoolSize) {\r\n      arrayPool.push(array);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Releases the given object back to the object pool.\r\n   *\r\n   * @private\r\n   * @param {Object} [object] The object to release.\r\n   */\r\n  function releaseObject(object) {\r\n    var cache = object.cache;\r\n    if (cache) {\r\n      releaseObject(cache);\r\n    }\r\n    object.array = object.cache = object.criteria = object.object = object.number = object.string = object.value = null;\r\n    if (objectPool.length < maxPoolSize) {\r\n      objectPool.push(object);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Slices the `collection` from the `start` index up to, but not including,\r\n   * the `end` index.\r\n   *\r\n   * Note: This function is used instead of `Array#slice` to support node lists\r\n   * in IE < 9 and to ensure dense arrays are returned.\r\n   *\r\n   * @private\r\n   * @param {Array|Object|string} collection The collection to slice.\r\n   * @param {number} start The start index.\r\n   * @param {number} end The end index.\r\n   * @returns {Array} Returns the new array.\r\n   */\r\n  function slice(array, start, end) {\r\n    start || (start = 0);\r\n    if (typeof end == 'undefined') {\r\n      end = array ? array.length : 0;\r\n    }\r\n    var index = -1,\r\n        length = end - start || 0,\r\n        result = Array(length < 0 ? 0 : length);\r\n\r\n    while (++index < length) {\r\n      result[index] = array[start + index];\r\n    }\r\n    return result;\r\n  }\r\n\r\n  /*--------------------------------------------------------------------------*/\r\n\r\n  /**\r\n   * Create a new `lodash` function using the given context object.\r\n   *\r\n   * @static\r\n   * @memberOf _\r\n   * @category Utilities\r\n   * @param {Object} [context=root] The context object.\r\n   * @returns {Function} Returns the `lodash` function.\r\n   */\r\n  function runInContext(context) {\r\n    // Avoid issues with some ES3 environments that attempt to use values, named\r\n    // after built-in constructors like `Object`, for the creation of literals.\r\n    // ES5 clears this up by stating that literals must use built-in constructors.\r\n    // See http://es5.github.io/#x11.1.5.\r\n    context = context ? _.defaults(root.Object(), context, _.pick(root, contextProps)) : root;\r\n\r\n    /** Native constructor references */\r\n    var Array = context.Array,\r\n        Boolean = context.Boolean,\r\n        Date = context.Date,\r\n        Function = context.Function,\r\n        Math = context.Math,\r\n        Number = context.Number,\r\n        Object = context.Object,\r\n        RegExp = context.RegExp,\r\n        String = context.String,\r\n        TypeError = context.TypeError;\r\n\r\n    /**\r\n     * Used for `Array` method references.\r\n     *\r\n     * Normally `Array.prototype` would suffice, however, using an array literal\r\n     * avoids issues in Narwhal.\r\n     */\r\n    var arrayRef = [];\r\n\r\n    /** Used for native method references */\r\n    var objectProto = Object.prototype;\r\n\r\n    /** Used to restore the original `_` reference in `noConflict` */\r\n    var oldDash = context._;\r\n\r\n    /** Used to resolve the internal [[Class]] of values */\r\n    var toString = objectProto.toString;\r\n\r\n    /** Used to detect if a method is native */\r\n    var reNative = RegExp('^' +\r\n      String(toString)\r\n        .replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\r\n        .replace(/toString| for [^\\]]+/g, '.*?') + '$'\r\n    );\r\n\r\n    /** Native method shortcuts */\r\n    var ceil = Math.ceil,\r\n        clearTimeout = context.clearTimeout,\r\n        floor = Math.floor,\r\n        fnToString = Function.prototype.toString,\r\n        getPrototypeOf = isNative(getPrototypeOf = Object.getPrototypeOf) && getPrototypeOf,\r\n        hasOwnProperty = objectProto.hasOwnProperty,\r\n        push = arrayRef.push,\r\n        setTimeout = context.setTimeout,\r\n        splice = arrayRef.splice,\r\n        unshift = arrayRef.unshift;\r\n\r\n    /** Used to set meta data on functions */\r\n    var defineProperty = (function() {\r\n      // IE 8 only accepts DOM elements\r\n      try {\r\n        var o = {},\r\n            func = isNative(func = Object.defineProperty) && func,\r\n            result = func(o, o, o) && func;\r\n      } catch(e) { }\r\n      return result;\r\n    }());\r\n\r\n    /* Native method shortcuts for methods with the same name as other `lodash` methods */\r\n    var nativeCreate = isNative(nativeCreate = Object.create) && nativeCreate,\r\n        nativeIsArray = isNative(nativeIsArray = Array.isArray) && nativeIsArray,\r\n        nativeIsFinite = context.isFinite,\r\n        nativeIsNaN = context.isNaN,\r\n        nativeKeys = isNative(nativeKeys = Object.keys) && nativeKeys,\r\n        nativeMax = Math.max,\r\n        nativeMin = Math.min,\r\n        nativeParseInt = context.parseInt,\r\n        nativeRandom = Math.random;\r\n\r\n    /** Used to lookup a built-in constructor by [[Class]] */\r\n    var ctorByClass = {};\r\n    ctorByClass[arrayClass] = Array;\r\n    ctorByClass[boolClass] = Boolean;\r\n    ctorByClass[dateClass] = Date;\r\n    ctorByClass[funcClass] = Function;\r\n    ctorByClass[objectClass] = Object;\r\n    ctorByClass[numberClass] = Number;\r\n    ctorByClass[regexpClass] = RegExp;\r\n    ctorByClass[stringClass] = String;\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates a `lodash` object which wraps the given value to enable intuitive\r\n     * method chaining.\r\n     *\r\n     * In addition to Lo-Dash methods, wrappers also have the following `Array` methods:\r\n     * `concat`, `join`, `pop`, `push`, `reverse`, `shift`, `slice`, `sort`, `splice`,\r\n     * and `unshift`\r\n     *\r\n     * Chaining is supported in custom builds as long as the `value` method is\r\n     * implicitly or explicitly included in the build.\r\n     *\r\n     * The chainable wrapper functions are:\r\n     * `after`, `assign`, `bind`, `bindAll`, `bindKey`, `chain`, `compact`,\r\n     * `compose`, `concat`, `countBy`, `create`, `createCallback`, `curry`,\r\n     * `debounce`, `defaults`, `defer`, `delay`, `difference`, `filter`, `flatten`,\r\n     * `forEach`, `forEachRight`, `forIn`, `forInRight`, `forOwn`, `forOwnRight`,\r\n     * `functions`, `groupBy`, `indexBy`, `initial`, `intersection`, `invert`,\r\n     * `invoke`, `keys`, `map`, `max`, `memoize`, `merge`, `min`, `object`, `omit`,\r\n     * `once`, `pairs`, `partial`, `partialRight`, `pick`, `pluck`, `pull`, `push`,\r\n     * `range`, `reject`, `remove`, `rest`, `reverse`, `shuffle`, `slice`, `sort`,\r\n     * `sortBy`, `splice`, `tap`, `throttle`, `times`, `toArray`, `transform`,\r\n     * `union`, `uniq`, `unshift`, `unzip`, `values`, `where`, `without`, `wrap`,\r\n     * and `zip`\r\n     *\r\n     * The non-chainable wrapper functions are:\r\n     * `clone`, `cloneDeep`, `contains`, `escape`, `every`, `find`, `findIndex`,\r\n     * `findKey`, `findLast`, `findLastIndex`, `findLastKey`, `has`, `identity`,\r\n     * `indexOf`, `isArguments`, `isArray`, `isBoolean`, `isDate`, `isElement`,\r\n     * `isEmpty`, `isEqual`, `isFinite`, `isFunction`, `isNaN`, `isNull`, `isNumber`,\r\n     * `isObject`, `isPlainObject`, `isRegExp`, `isString`, `isUndefined`, `join`,\r\n     * `lastIndexOf`, `mixin`, `noConflict`, `parseInt`, `pop`, `random`, `reduce`,\r\n     * `reduceRight`, `result`, `shift`, `size`, `some`, `sortedIndex`, `runInContext`,\r\n     * `template`, `unescape`, `uniqueId`, and `value`\r\n     *\r\n     * The wrapper functions `first` and `last` return wrapped values when `n` is\r\n     * provided, otherwise they return unwrapped values.\r\n     *\r\n     * Explicit chaining can be enabled by using the `_.chain` method.\r\n     *\r\n     * @name _\r\n     * @constructor\r\n     * @category Chaining\r\n     * @param {*} value The value to wrap in a `lodash` instance.\r\n     * @returns {Object} Returns a `lodash` instance.\r\n     * @example\r\n     *\r\n     * var wrapped = _([1, 2, 3]);\r\n     *\r\n     * // returns an unwrapped value\r\n     * wrapped.reduce(function(sum, num) {\r\n     *   return sum + num;\r\n     * });\r\n     * // => 6\r\n     *\r\n     * // returns a wrapped value\r\n     * var squares = wrapped.map(function(num) {\r\n     *   return num * num;\r\n     * });\r\n     *\r\n     * _.isArray(squares);\r\n     * // => false\r\n     *\r\n     * _.isArray(squares.value());\r\n     * // => true\r\n     */\r\n    function lodash(value) {\r\n      // don't wrap if already wrapped, even if wrapped by a different `lodash` constructor\r\n      return (value && typeof value == 'object' && !isArray(value) && hasOwnProperty.call(value, '__wrapped__'))\r\n       ? value\r\n       : new lodashWrapper(value);\r\n    }\r\n\r\n    /**\r\n     * A fast path for creating `lodash` wrapper objects.\r\n     *\r\n     * @private\r\n     * @param {*} value The value to wrap in a `lodash` instance.\r\n     * @param {boolean} chainAll A flag to enable chaining for all methods\r\n     * @returns {Object} Returns a `lodash` instance.\r\n     */\r\n    function lodashWrapper(value, chainAll) {\r\n      this.__chain__ = !!chainAll;\r\n      this.__wrapped__ = value;\r\n    }\r\n    // ensure `new lodashWrapper` is an instance of `lodash`\r\n    lodashWrapper.prototype = lodash.prototype;\r\n\r\n    /**\r\n     * An object used to flag environments features.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Object\r\n     */\r\n    var support = lodash.support = {};\r\n\r\n    /**\r\n     * Detect if functions can be decompiled by `Function#toString`\r\n     * (all but PS3 and older Opera mobile browsers & avoided in Windows 8 apps).\r\n     *\r\n     * @memberOf _.support\r\n     * @type boolean\r\n     */\r\n    support.funcDecomp = !isNative(context.WinRTError) && reThis.test(runInContext);\r\n\r\n    /**\r\n     * Detect if `Function#name` is supported (all but IE).\r\n     *\r\n     * @memberOf _.support\r\n     * @type boolean\r\n     */\r\n    support.funcNames = typeof Function.name == 'string';\r\n\r\n    /**\r\n     * By default, the template delimiters used by Lo-Dash are similar to those in\r\n     * embedded Ruby (ERB). Change the following template settings to use alternative\r\n     * delimiters.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Object\r\n     */\r\n    lodash.templateSettings = {\r\n\r\n      /**\r\n       * Used to detect `data` property values to be HTML-escaped.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type RegExp\r\n       */\r\n      'escape': /<%-([\\s\\S]+?)%>/g,\r\n\r\n      /**\r\n       * Used to detect code to be evaluated.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type RegExp\r\n       */\r\n      'evaluate': /<%([\\s\\S]+?)%>/g,\r\n\r\n      /**\r\n       * Used to detect `data` property values to inject.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type RegExp\r\n       */\r\n      'interpolate': reInterpolate,\r\n\r\n      /**\r\n       * Used to reference the data object in the template text.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type string\r\n       */\r\n      'variable': '',\r\n\r\n      /**\r\n       * Used to import variables into the compiled template.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type Object\r\n       */\r\n      'imports': {\r\n\r\n        /**\r\n         * A reference to the `lodash` function.\r\n         *\r\n         * @memberOf _.templateSettings.imports\r\n         * @type Function\r\n         */\r\n        '_': lodash\r\n      }\r\n    };\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * The base implementation of `_.bind` that creates the bound function and\r\n     * sets its meta data.\r\n     *\r\n     * @private\r\n     * @param {Array} bindData The bind data array.\r\n     * @returns {Function} Returns the new bound function.\r\n     */\r\n    function baseBind(bindData) {\r\n      var func = bindData[0],\r\n          partialArgs = bindData[2],\r\n          thisArg = bindData[4];\r\n\r\n      function bound() {\r\n        // `Function#bind` spec\r\n        // http://es5.github.io/#x15.3.4.5\r\n        if (partialArgs) {\r\n          // avoid `arguments` object deoptimizations by using `slice` instead\r\n          // of `Array.prototype.slice.call` and not assigning `arguments` to a\r\n          // variable as a ternary expression\r\n          var args = slice(partialArgs);\r\n          push.apply(args, arguments);\r\n        }\r\n        // mimic the constructor's `return` behavior\r\n        // http://es5.github.io/#x13.2.2\r\n        if (this instanceof bound) {\r\n          // ensure `new bound` is an instance of `func`\r\n          var thisBinding = baseCreate(func.prototype),\r\n              result = func.apply(thisBinding, args || arguments);\r\n          return isObject(result) ? result : thisBinding;\r\n        }\r\n        return func.apply(thisArg, args || arguments);\r\n      }\r\n      setBindData(bound, bindData);\r\n      return bound;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.clone` without argument juggling or support\r\n     * for `thisArg` binding.\r\n     *\r\n     * @private\r\n     * @param {*} value The value to clone.\r\n     * @param {boolean} [isDeep=false] Specify a deep clone.\r\n     * @param {Function} [callback] The function to customize cloning values.\r\n     * @param {Array} [stackA=[]] Tracks traversed source objects.\r\n     * @param {Array} [stackB=[]] Associates clones with source counterparts.\r\n     * @returns {*} Returns the cloned value.\r\n     */\r\n    function baseClone(value, isDeep, callback, stackA, stackB) {\r\n      if (callback) {\r\n        var result = callback(value);\r\n        if (typeof result != 'undefined') {\r\n          return result;\r\n        }\r\n      }\r\n      // inspect [[Class]]\r\n      var isObj = isObject(value);\r\n      if (isObj) {\r\n        var className = toString.call(value);\r\n        if (!cloneableClasses[className]) {\r\n          return value;\r\n        }\r\n        var ctor = ctorByClass[className];\r\n        switch (className) {\r\n          case boolClass:\r\n          case dateClass:\r\n            return new ctor(+value);\r\n\r\n          case numberClass:\r\n          case stringClass:\r\n            return new ctor(value);\r\n\r\n          case regexpClass:\r\n            result = ctor(value.source, reFlags.exec(value));\r\n            result.lastIndex = value.lastIndex;\r\n            return result;\r\n        }\r\n      } else {\r\n        return value;\r\n      }\r\n      var isArr = isArray(value);\r\n      if (isDeep) {\r\n        // check for circular references and return corresponding clone\r\n        var initedStack = !stackA;\r\n        stackA || (stackA = getArray());\r\n        stackB || (stackB = getArray());\r\n\r\n        var length = stackA.length;\r\n        while (length--) {\r\n          if (stackA[length] == value) {\r\n            return stackB[length];\r\n          }\r\n        }\r\n        result = isArr ? ctor(value.length) : {};\r\n      }\r\n      else {\r\n        result = isArr ? slice(value) : assign({}, value);\r\n      }\r\n      // add array properties assigned by `RegExp#exec`\r\n      if (isArr) {\r\n        if (hasOwnProperty.call(value, 'index')) {\r\n          result.index = value.index;\r\n        }\r\n        if (hasOwnProperty.call(value, 'input')) {\r\n          result.input = value.input;\r\n        }\r\n      }\r\n      // exit for shallow clone\r\n      if (!isDeep) {\r\n        return result;\r\n      }\r\n      // add the source value to the stack of traversed objects\r\n      // and associate it with its clone\r\n      stackA.push(value);\r\n      stackB.push(result);\r\n\r\n      // recursively populate clone (susceptible to call stack limits)\r\n      (isArr ? forEach : forOwn)(value, function(objValue, key) {\r\n        result[key] = baseClone(objValue, isDeep, callback, stackA, stackB);\r\n      });\r\n\r\n      if (initedStack) {\r\n        releaseArray(stackA);\r\n        releaseArray(stackB);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.create` without support for assigning\r\n     * properties to the created object.\r\n     *\r\n     * @private\r\n     * @param {Object} prototype The object to inherit from.\r\n     * @returns {Object} Returns the new object.\r\n     */\r\n    function baseCreate(prototype, properties) {\r\n      return isObject(prototype) ? nativeCreate(prototype) : {};\r\n    }\r\n    // fallback for browsers without `Object.create`\r\n    if (!nativeCreate) {\r\n      baseCreate = (function() {\r\n        function Object() {}\r\n        return function(prototype) {\r\n          if (isObject(prototype)) {\r\n            Object.prototype = prototype;\r\n            var result = new Object;\r\n            Object.prototype = null;\r\n          }\r\n          return result || context.Object();\r\n        };\r\n      }());\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.createCallback` without support for creating\r\n     * \"_.pluck\" or \"_.where\" style callbacks.\r\n     *\r\n     * @private\r\n     * @param {*} [func=identity] The value to convert to a callback.\r\n     * @param {*} [thisArg] The `this` binding of the created callback.\r\n     * @param {number} [argCount] The number of arguments the callback accepts.\r\n     * @returns {Function} Returns a callback function.\r\n     */\r\n    function baseCreateCallback(func, thisArg, argCount) {\r\n      if (typeof func != 'function') {\r\n        return identity;\r\n      }\r\n      // exit early for no `thisArg` or already bound by `Function#bind`\r\n      if (typeof thisArg == 'undefined' || !('prototype' in func)) {\r\n        return func;\r\n      }\r\n      var bindData = func.__bindData__;\r\n      if (typeof bindData == 'undefined') {\r\n        if (support.funcNames) {\r\n          bindData = !func.name;\r\n        }\r\n        bindData = bindData || !support.funcDecomp;\r\n        if (!bindData) {\r\n          var source = fnToString.call(func);\r\n          if (!support.funcNames) {\r\n            bindData = !reFuncName.test(source);\r\n          }\r\n          if (!bindData) {\r\n            // checks if `func` references the `this` keyword and stores the result\r\n            bindData = reThis.test(source);\r\n            setBindData(func, bindData);\r\n          }\r\n        }\r\n      }\r\n      // exit early if there are no `this` references or `func` is bound\r\n      if (bindData === false || (bindData !== true && bindData[1] & 1)) {\r\n        return func;\r\n      }\r\n      switch (argCount) {\r\n        case 1: return function(value) {\r\n          return func.call(thisArg, value);\r\n        };\r\n        case 2: return function(a, b) {\r\n          return func.call(thisArg, a, b);\r\n        };\r\n        case 3: return function(value, index, collection) {\r\n          return func.call(thisArg, value, index, collection);\r\n        };\r\n        case 4: return function(accumulator, value, index, collection) {\r\n          return func.call(thisArg, accumulator, value, index, collection);\r\n        };\r\n      }\r\n      return bind(func, thisArg);\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `createWrapper` that creates the wrapper and\r\n     * sets its meta data.\r\n     *\r\n     * @private\r\n     * @param {Array} bindData The bind data array.\r\n     * @returns {Function} Returns the new function.\r\n     */\r\n    function baseCreateWrapper(bindData) {\r\n      var func = bindData[0],\r\n          bitmask = bindData[1],\r\n          partialArgs = bindData[2],\r\n          partialRightArgs = bindData[3],\r\n          thisArg = bindData[4],\r\n          arity = bindData[5];\r\n\r\n      var isBind = bitmask & 1,\r\n          isBindKey = bitmask & 2,\r\n          isCurry = bitmask & 4,\r\n          isCurryBound = bitmask & 8,\r\n          key = func;\r\n\r\n      function bound() {\r\n        var thisBinding = isBind ? thisArg : this;\r\n        if (partialArgs) {\r\n          var args = slice(partialArgs);\r\n          push.apply(args, arguments);\r\n        }\r\n        if (partialRightArgs || isCurry) {\r\n          args || (args = slice(arguments));\r\n          if (partialRightArgs) {\r\n            push.apply(args, partialRightArgs);\r\n          }\r\n          if (isCurry && args.length < arity) {\r\n            bitmask |= 16 & ~32;\r\n            return baseCreateWrapper([func, (isCurryBound ? bitmask : bitmask & ~3), args, null, thisArg, arity]);\r\n          }\r\n        }\r\n        args || (args = arguments);\r\n        if (isBindKey) {\r\n          func = thisBinding[key];\r\n        }\r\n        if (this instanceof bound) {\r\n          thisBinding = baseCreate(func.prototype);\r\n          var result = func.apply(thisBinding, args);\r\n          return isObject(result) ? result : thisBinding;\r\n        }\r\n        return func.apply(thisBinding, args);\r\n      }\r\n      setBindData(bound, bindData);\r\n      return bound;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.difference` that accepts a single array\r\n     * of values to exclude.\r\n     *\r\n     * @private\r\n     * @param {Array} array The array to process.\r\n     * @param {Array} [values] The array of values to exclude.\r\n     * @returns {Array} Returns a new array of filtered values.\r\n     */\r\n    function baseDifference(array, values) {\r\n      var index = -1,\r\n          indexOf = getIndexOf(),\r\n          length = array ? array.length : 0,\r\n          isLarge = length >= largeArraySize && indexOf === baseIndexOf,\r\n          result = [];\r\n\r\n      if (isLarge) {\r\n        var cache = createCache(values);\r\n        if (cache) {\r\n          indexOf = cacheIndexOf;\r\n          values = cache;\r\n        } else {\r\n          isLarge = false;\r\n        }\r\n      }\r\n      while (++index < length) {\r\n        var value = array[index];\r\n        if (indexOf(values, value) < 0) {\r\n          result.push(value);\r\n        }\r\n      }\r\n      if (isLarge) {\r\n        releaseObject(values);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.flatten` without support for callback\r\n     * shorthands or `thisArg` binding.\r\n     *\r\n     * @private\r\n     * @param {Array} array The array to flatten.\r\n     * @param {boolean} [isShallow=false] A flag to restrict flattening to a single level.\r\n     * @param {boolean} [isStrict=false] A flag to restrict flattening to arrays and `arguments` objects.\r\n     * @param {number} [fromIndex=0] The index to start from.\r\n     * @returns {Array} Returns a new flattened array.\r\n     */\r\n    function baseFlatten(array, isShallow, isStrict, fromIndex) {\r\n      var index = (fromIndex || 0) - 1,\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      while (++index < length) {\r\n        var value = array[index];\r\n\r\n        if (value && typeof value == 'object' && typeof value.length == 'number'\r\n            && (isArray(value) || isArguments(value))) {\r\n          // recursively flatten arrays (susceptible to call stack limits)\r\n          if (!isShallow) {\r\n            value = baseFlatten(value, isShallow, isStrict);\r\n          }\r\n          var valIndex = -1,\r\n              valLength = value.length,\r\n              resIndex = result.length;\r\n\r\n          result.length += valLength;\r\n          while (++valIndex < valLength) {\r\n            result[resIndex++] = value[valIndex];\r\n          }\r\n        } else if (!isStrict) {\r\n          result.push(value);\r\n        }\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.isEqual`, without support for `thisArg` binding,\r\n     * that allows partial \"_.where\" style comparisons.\r\n     *\r\n     * @private\r\n     * @param {*} a The value to compare.\r\n     * @param {*} b The other value to compare.\r\n     * @param {Function} [callback] The function to customize comparing values.\r\n     * @param {Function} [isWhere=false] A flag to indicate performing partial comparisons.\r\n     * @param {Array} [stackA=[]] Tracks traversed `a` objects.\r\n     * @param {Array} [stackB=[]] Tracks traversed `b` objects.\r\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\r\n     */\r\n    function baseIsEqual(a, b, callback, isWhere, stackA, stackB) {\r\n      // used to indicate that when comparing objects, `a` has at least the properties of `b`\r\n      if (callback) {\r\n        var result = callback(a, b);\r\n        if (typeof result != 'undefined') {\r\n          return !!result;\r\n        }\r\n      }\r\n      // exit early for identical values\r\n      if (a === b) {\r\n        // treat `+0` vs. `-0` as not equal\r\n        return a !== 0 || (1 / a == 1 / b);\r\n      }\r\n      var type = typeof a,\r\n          otherType = typeof b;\r\n\r\n      // exit early for unlike primitive values\r\n      if (a === a &&\r\n          !(a && objectTypes[type]) &&\r\n          !(b && objectTypes[otherType])) {\r\n        return false;\r\n      }\r\n      // exit early for `null` and `undefined` avoiding ES3's Function#call behavior\r\n      // http://es5.github.io/#x15.3.4.4\r\n      if (a == null || b == null) {\r\n        return a === b;\r\n      }\r\n      // compare [[Class]] names\r\n      var className = toString.call(a),\r\n          otherClass = toString.call(b);\r\n\r\n      if (className == argsClass) {\r\n        className = objectClass;\r\n      }\r\n      if (otherClass == argsClass) {\r\n        otherClass = objectClass;\r\n      }\r\n      if (className != otherClass) {\r\n        return false;\r\n      }\r\n      switch (className) {\r\n        case boolClass:\r\n        case dateClass:\r\n          // coerce dates and booleans to numbers, dates to milliseconds and booleans\r\n          // to `1` or `0` treating invalid dates coerced to `NaN` as not equal\r\n          return +a == +b;\r\n\r\n        case numberClass:\r\n          // treat `NaN` vs. `NaN` as equal\r\n          return (a != +a)\r\n            ? b != +b\r\n            // but treat `+0` vs. `-0` as not equal\r\n            : (a == 0 ? (1 / a == 1 / b) : a == +b);\r\n\r\n        case regexpClass:\r\n        case stringClass:\r\n          // coerce regexes to strings (http://es5.github.io/#x15.10.6.4)\r\n          // treat string primitives and their corresponding object instances as equal\r\n          return a == String(b);\r\n      }\r\n      var isArr = className == arrayClass;\r\n      if (!isArr) {\r\n        // unwrap any `lodash` wrapped values\r\n        var aWrapped = hasOwnProperty.call(a, '__wrapped__'),\r\n            bWrapped = hasOwnProperty.call(b, '__wrapped__');\r\n\r\n        if (aWrapped || bWrapped) {\r\n          return baseIsEqual(aWrapped ? a.__wrapped__ : a, bWrapped ? b.__wrapped__ : b, callback, isWhere, stackA, stackB);\r\n        }\r\n        // exit for functions and DOM nodes\r\n        if (className != objectClass) {\r\n          return false;\r\n        }\r\n        // in older versions of Opera, `arguments` objects have `Array` constructors\r\n        var ctorA = a.constructor,\r\n            ctorB = b.constructor;\r\n\r\n        // non `Object` object instances with different constructors are not equal\r\n        if (ctorA != ctorB &&\r\n              !(isFunction(ctorA) && ctorA instanceof ctorA && isFunction(ctorB) && ctorB instanceof ctorB) &&\r\n              ('constructor' in a && 'constructor' in b)\r\n            ) {\r\n          return false;\r\n        }\r\n      }\r\n      // assume cyclic structures are equal\r\n      // the algorithm for detecting cyclic structures is adapted from ES 5.1\r\n      // section 15.12.3, abstract operation `JO` (http://es5.github.io/#x15.12.3)\r\n      var initedStack = !stackA;\r\n      stackA || (stackA = getArray());\r\n      stackB || (stackB = getArray());\r\n\r\n      var length = stackA.length;\r\n      while (length--) {\r\n        if (stackA[length] == a) {\r\n          return stackB[length] == b;\r\n        }\r\n      }\r\n      var size = 0;\r\n      result = true;\r\n\r\n      // add `a` and `b` to the stack of traversed objects\r\n      stackA.push(a);\r\n      stackB.push(b);\r\n\r\n      // recursively compare objects and arrays (susceptible to call stack limits)\r\n      if (isArr) {\r\n        // compare lengths to determine if a deep comparison is necessary\r\n        length = a.length;\r\n        size = b.length;\r\n        result = size == length;\r\n\r\n        if (result || isWhere) {\r\n          // deep compare the contents, ignoring non-numeric properties\r\n          while (size--) {\r\n            var index = length,\r\n                value = b[size];\r\n\r\n            if (isWhere) {\r\n              while (index--) {\r\n                if ((result = baseIsEqual(a[index], value, callback, isWhere, stackA, stackB))) {\r\n                  break;\r\n                }\r\n              }\r\n            } else if (!(result = baseIsEqual(a[size], value, callback, isWhere, stackA, stackB))) {\r\n              break;\r\n            }\r\n          }\r\n        }\r\n      }\r\n      else {\r\n        // deep compare objects using `forIn`, instead of `forOwn`, to avoid `Object.keys`\r\n        // which, in this case, is more costly\r\n        forIn(b, function(value, key, b) {\r\n          if (hasOwnProperty.call(b, key)) {\r\n            // count the number of properties.\r\n            size++;\r\n            // deep compare each property value.\r\n            return (result = hasOwnProperty.call(a, key) && baseIsEqual(a[key], value, callback, isWhere, stackA, stackB));\r\n          }\r\n        });\r\n\r\n        if (result && !isWhere) {\r\n          // ensure both objects have the same number of properties\r\n          forIn(a, function(value, key, a) {\r\n            if (hasOwnProperty.call(a, key)) {\r\n              // `size` will be `-1` if `a` has more properties than `b`\r\n              return (result = --size > -1);\r\n            }\r\n          });\r\n        }\r\n      }\r\n      stackA.pop();\r\n      stackB.pop();\r\n\r\n      if (initedStack) {\r\n        releaseArray(stackA);\r\n        releaseArray(stackB);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.merge` without argument juggling or support\r\n     * for `thisArg` binding.\r\n     *\r\n     * @private\r\n     * @param {Object} object The destination object.\r\n     * @param {Object} source The source object.\r\n     * @param {Function} [callback] The function to customize merging properties.\r\n     * @param {Array} [stackA=[]] Tracks traversed source objects.\r\n     * @param {Array} [stackB=[]] Associates values with source counterparts.\r\n     */\r\n    function baseMerge(object, source, callback, stackA, stackB) {\r\n      (isArray(source) ? forEach : forOwn)(source, function(source, key) {\r\n        var found,\r\n            isArr,\r\n            result = source,\r\n            value = object[key];\r\n\r\n        if (source && ((isArr = isArray(source)) || isPlainObject(source))) {\r\n          // avoid merging previously merged cyclic sources\r\n          var stackLength = stackA.length;\r\n          while (stackLength--) {\r\n            if ((found = stackA[stackLength] == source)) {\r\n              value = stackB[stackLength];\r\n              break;\r\n            }\r\n          }\r\n          if (!found) {\r\n            var isShallow;\r\n            if (callback) {\r\n              result = callback(value, source);\r\n              if ((isShallow = typeof result != 'undefined')) {\r\n                value = result;\r\n              }\r\n            }\r\n            if (!isShallow) {\r\n              value = isArr\r\n                ? (isArray(value) ? value : [])\r\n                : (isPlainObject(value) ? value : {});\r\n            }\r\n            // add `source` and associated `value` to the stack of traversed objects\r\n            stackA.push(source);\r\n            stackB.push(value);\r\n\r\n            // recursively merge objects and arrays (susceptible to call stack limits)\r\n            if (!isShallow) {\r\n              baseMerge(value, source, callback, stackA, stackB);\r\n            }\r\n          }\r\n        }\r\n        else {\r\n          if (callback) {\r\n            result = callback(value, source);\r\n            if (typeof result == 'undefined') {\r\n              result = source;\r\n            }\r\n          }\r\n          if (typeof result != 'undefined') {\r\n            value = result;\r\n          }\r\n        }\r\n        object[key] = value;\r\n      });\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.random` without argument juggling or support\r\n     * for returning floating-point numbers.\r\n     *\r\n     * @private\r\n     * @param {number} min The minimum possible value.\r\n     * @param {number} max The maximum possible value.\r\n     * @returns {number} Returns a random number.\r\n     */\r\n    function baseRandom(min, max) {\r\n      return min + floor(nativeRandom() * (max - min + 1));\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.uniq` without support for callback shorthands\r\n     * or `thisArg` binding.\r\n     *\r\n     * @private\r\n     * @param {Array} array The array to process.\r\n     * @param {boolean} [isSorted=false] A flag to indicate that `array` is sorted.\r\n     * @param {Function} [callback] The function called per iteration.\r\n     * @returns {Array} Returns a duplicate-value-free array.\r\n     */\r\n    function baseUniq(array, isSorted, callback) {\r\n      var index = -1,\r\n          indexOf = getIndexOf(),\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      var isLarge = !isSorted && length >= largeArraySize && indexOf === baseIndexOf,\r\n          seen = (callback || isLarge) ? getArray() : result;\r\n\r\n      if (isLarge) {\r\n        var cache = createCache(seen);\r\n        indexOf = cacheIndexOf;\r\n        seen = cache;\r\n      }\r\n      while (++index < length) {\r\n        var value = array[index],\r\n            computed = callback ? callback(value, index, array) : value;\r\n\r\n        if (isSorted\r\n              ? !index || seen[seen.length - 1] !== computed\r\n              : indexOf(seen, computed) < 0\r\n            ) {\r\n          if (callback || isLarge) {\r\n            seen.push(computed);\r\n          }\r\n          result.push(value);\r\n        }\r\n      }\r\n      if (isLarge) {\r\n        releaseArray(seen.array);\r\n        releaseObject(seen);\r\n      } else if (callback) {\r\n        releaseArray(seen);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates a function that aggregates a collection, creating an object composed\r\n     * of keys generated from the results of running each element of the collection\r\n     * through a callback. The given `setter` function sets the keys and values\r\n     * of the composed object.\r\n     *\r\n     * @private\r\n     * @param {Function} setter The setter function.\r\n     * @returns {Function} Returns the new aggregator function.\r\n     */\r\n    function createAggregator(setter) {\r\n      return function(collection, callback, thisArg) {\r\n        var result = {};\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n        var index = -1,\r\n            length = collection ? collection.length : 0;\r\n\r\n        if (typeof length == 'number') {\r\n          while (++index < length) {\r\n            var value = collection[index];\r\n            setter(result, value, callback(value, index, collection), collection);\r\n          }\r\n        } else {\r\n          forOwn(collection, function(value, key, collection) {\r\n            setter(result, value, callback(value, key, collection), collection);\r\n          });\r\n        }\r\n        return result;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when called, either curries or invokes `func`\r\n     * with an optional `this` binding and partially applied arguments.\r\n     *\r\n     * @private\r\n     * @param {Function|string} func The function or method name to reference.\r\n     * @param {number} bitmask The bitmask of method flags to compose.\r\n     *  The bitmask may be composed of the following flags:\r\n     *  1 - `_.bind`\r\n     *  2 - `_.bindKey`\r\n     *  4 - `_.curry`\r\n     *  8 - `_.curry` (bound)\r\n     *  16 - `_.partial`\r\n     *  32 - `_.partialRight`\r\n     * @param {Array} [partialArgs] An array of arguments to prepend to those\r\n     *  provided to the new function.\r\n     * @param {Array} [partialRightArgs] An array of arguments to append to those\r\n     *  provided to the new function.\r\n     * @param {*} [thisArg] The `this` binding of `func`.\r\n     * @param {number} [arity] The arity of `func`.\r\n     * @returns {Function} Returns the new function.\r\n     */\r\n    function createWrapper(func, bitmask, partialArgs, partialRightArgs, thisArg, arity) {\r\n      var isBind = bitmask & 1,\r\n          isBindKey = bitmask & 2,\r\n          isCurry = bitmask & 4,\r\n          isCurryBound = bitmask & 8,\r\n          isPartial = bitmask & 16,\r\n          isPartialRight = bitmask & 32;\r\n\r\n      if (!isBindKey && !isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      if (isPartial && !partialArgs.length) {\r\n        bitmask &= ~16;\r\n        isPartial = partialArgs = false;\r\n      }\r\n      if (isPartialRight && !partialRightArgs.length) {\r\n        bitmask &= ~32;\r\n        isPartialRight = partialRightArgs = false;\r\n      }\r\n      var bindData = func && func.__bindData__;\r\n      if (bindData && bindData !== true) {\r\n        // clone `bindData`\r\n        bindData = slice(bindData);\r\n        if (bindData[2]) {\r\n          bindData[2] = slice(bindData[2]);\r\n        }\r\n        if (bindData[3]) {\r\n          bindData[3] = slice(bindData[3]);\r\n        }\r\n        // set `thisBinding` is not previously bound\r\n        if (isBind && !(bindData[1] & 1)) {\r\n          bindData[4] = thisArg;\r\n        }\r\n        // set if previously bound but not currently (subsequent curried functions)\r\n        if (!isBind && bindData[1] & 1) {\r\n          bitmask |= 8;\r\n        }\r\n        // set curried arity if not yet set\r\n        if (isCurry && !(bindData[1] & 4)) {\r\n          bindData[5] = arity;\r\n        }\r\n        // append partial left arguments\r\n        if (isPartial) {\r\n          push.apply(bindData[2] || (bindData[2] = []), partialArgs);\r\n        }\r\n        // append partial right arguments\r\n        if (isPartialRight) {\r\n          unshift.apply(bindData[3] || (bindData[3] = []), partialRightArgs);\r\n        }\r\n        // merge flags\r\n        bindData[1] |= bitmask;\r\n        return createWrapper.apply(null, bindData);\r\n      }\r\n      // fast path for `_.bind`\r\n      var creater = (bitmask == 1 || bitmask === 17) ? baseBind : baseCreateWrapper;\r\n      return creater([func, bitmask, partialArgs, partialRightArgs, thisArg, arity]);\r\n    }\r\n\r\n    /**\r\n     * Used by `escape` to convert characters to HTML entities.\r\n     *\r\n     * @private\r\n     * @param {string} match The matched character to escape.\r\n     * @returns {string} Returns the escaped character.\r\n     */\r\n    function escapeHtmlChar(match) {\r\n      return htmlEscapes[match];\r\n    }\r\n\r\n    /**\r\n     * Gets the appropriate \"indexOf\" function. If the `_.indexOf` method is\r\n     * customized, this method returns the custom method, otherwise it returns\r\n     * the `baseIndexOf` function.\r\n     *\r\n     * @private\r\n     * @returns {Function} Returns the \"indexOf\" function.\r\n     */\r\n    function getIndexOf() {\r\n      var result = (result = lodash.indexOf) === indexOf ? baseIndexOf : result;\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a native function.\r\n     *\r\n     * @private\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a native function, else `false`.\r\n     */\r\n    function isNative(value) {\r\n      return typeof value == 'function' && reNative.test(value);\r\n    }\r\n\r\n    /**\r\n     * Sets `this` binding data on a given function.\r\n     *\r\n     * @private\r\n     * @param {Function} func The function to set data on.\r\n     * @param {Array} value The data array to set.\r\n     */\r\n    var setBindData = !defineProperty ? noop : function(func, value) {\r\n      descriptor.value = value;\r\n      defineProperty(func, '__bindData__', descriptor);\r\n    };\r\n\r\n    /**\r\n     * A fallback implementation of `isPlainObject` which checks if a given value\r\n     * is an object created by the `Object` constructor, assuming objects created\r\n     * by the `Object` constructor have no inherited enumerable properties and that\r\n     * there are no `Object.prototype` extensions.\r\n     *\r\n     * @private\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\r\n     */\r\n    function shimIsPlainObject(value) {\r\n      var ctor,\r\n          result;\r\n\r\n      // avoid non Object objects, `arguments` objects, and DOM elements\r\n      if (!(value && toString.call(value) == objectClass) ||\r\n          (ctor = value.constructor, isFunction(ctor) && !(ctor instanceof ctor))) {\r\n        return false;\r\n      }\r\n      // In most environments an object's own properties are iterated before\r\n      // its inherited properties. If the last iterated property is an object's\r\n      // own property then there are no inherited enumerable properties.\r\n      forIn(value, function(value, key) {\r\n        result = key;\r\n      });\r\n      return typeof result == 'undefined' || hasOwnProperty.call(value, result);\r\n    }\r\n\r\n    /**\r\n     * Used by `unescape` to convert HTML entities to characters.\r\n     *\r\n     * @private\r\n     * @param {string} match The matched character to unescape.\r\n     * @returns {string} Returns the unescaped character.\r\n     */\r\n    function unescapeHtmlChar(match) {\r\n      return htmlUnescapes[match];\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Checks if `value` is an `arguments` object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is an `arguments` object, else `false`.\r\n     * @example\r\n     *\r\n     * (function() { return _.isArguments(arguments); })(1, 2, 3);\r\n     * // => true\r\n     *\r\n     * _.isArguments([1, 2, 3]);\r\n     * // => false\r\n     */\r\n    function isArguments(value) {\r\n      return value && typeof value == 'object' && typeof value.length == 'number' &&\r\n        toString.call(value) == argsClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is an array.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is an array, else `false`.\r\n     * @example\r\n     *\r\n     * (function() { return _.isArray(arguments); })();\r\n     * // => false\r\n     *\r\n     * _.isArray([1, 2, 3]);\r\n     * // => true\r\n     */\r\n    var isArray = nativeIsArray || function(value) {\r\n      return value && typeof value == 'object' && typeof value.length == 'number' &&\r\n        toString.call(value) == arrayClass || false;\r\n    };\r\n\r\n    /**\r\n     * A fallback implementation of `Object.keys` which produces an array of the\r\n     * given object's own enumerable property names.\r\n     *\r\n     * @private\r\n     * @type Function\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns an array of property names.\r\n     */\r\n    var shimKeys = function(object) {\r\n      var index, iterable = object, result = [];\r\n      if (!iterable) return result;\r\n      if (!(objectTypes[typeof object])) return result;\r\n        for (index in iterable) {\r\n          if (hasOwnProperty.call(iterable, index)) {\r\n            result.push(index);\r\n          }\r\n        }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * Creates an array composed of the own enumerable property names of an object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns an array of property names.\r\n     * @example\r\n     *\r\n     * _.keys({ 'one': 1, 'two': 2, 'three': 3 });\r\n     * // => ['one', 'two', 'three'] (property order is not guaranteed across environments)\r\n     */\r\n    var keys = !nativeKeys ? shimKeys : function(object) {\r\n      if (!isObject(object)) {\r\n        return [];\r\n      }\r\n      return nativeKeys(object);\r\n    };\r\n\r\n    /**\r\n     * Used to convert characters to HTML entities:\r\n     *\r\n     * Though the `>` character is escaped for symmetry, characters like `>` and `/`\r\n     * don't require escaping in HTML and have no special meaning unless they're part\r\n     * of a tag or an unquoted attribute value.\r\n     * http://mathiasbynens.be/notes/ambiguous-ampersands (under \"semi-related fun fact\")\r\n     */\r\n    var htmlEscapes = {\r\n      '&': '&amp;',\r\n      '<': '&lt;',\r\n      '>': '&gt;',\r\n      '\"': '&quot;',\r\n      \"'\": '&#39;'\r\n    };\r\n\r\n    /** Used to convert HTML entities to characters */\r\n    var htmlUnescapes = invert(htmlEscapes);\r\n\r\n    /** Used to match HTML entities and HTML characters */\r\n    var reEscapedHtml = RegExp('(' + keys(htmlUnescapes).join('|') + ')', 'g'),\r\n        reUnescapedHtml = RegExp('[' + keys(htmlEscapes).join('') + ']', 'g');\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Assigns own enumerable properties of source object(s) to the destination\r\n     * object. Subsequent sources will overwrite property assignments of previous\r\n     * sources. If a callback is provided it will be executed to produce the\r\n     * assigned values. The callback is bound to `thisArg` and invoked with two\r\n     * arguments; (objectValue, sourceValue).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @alias extend\r\n     * @category Objects\r\n     * @param {Object} object The destination object.\r\n     * @param {...Object} [source] The source objects.\r\n     * @param {Function} [callback] The function to customize assigning values.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the destination object.\r\n     * @example\r\n     *\r\n     * _.assign({ 'name': 'fred' }, { 'employer': 'slate' });\r\n     * // => { 'name': 'fred', 'employer': 'slate' }\r\n     *\r\n     * var defaults = _.partialRight(_.assign, function(a, b) {\r\n     *   return typeof a == 'undefined' ? b : a;\r\n     * });\r\n     *\r\n     * var object = { 'name': 'barney' };\r\n     * defaults(object, { 'name': 'fred', 'employer': 'slate' });\r\n     * // => { 'name': 'barney', 'employer': 'slate' }\r\n     */\r\n    var assign = function(object, source, guard) {\r\n      var index, iterable = object, result = iterable;\r\n      if (!iterable) return result;\r\n      var args = arguments,\r\n          argsIndex = 0,\r\n          argsLength = typeof guard == 'number' ? 2 : args.length;\r\n      if (argsLength > 3 && typeof args[argsLength - 2] == 'function') {\r\n        var callback = baseCreateCallback(args[--argsLength - 1], args[argsLength--], 2);\r\n      } else if (argsLength > 2 && typeof args[argsLength - 1] == 'function') {\r\n        callback = args[--argsLength];\r\n      }\r\n      while (++argsIndex < argsLength) {\r\n        iterable = args[argsIndex];\r\n        if (iterable && objectTypes[typeof iterable]) {\r\n        var ownIndex = -1,\r\n            ownProps = objectTypes[typeof iterable] && keys(iterable),\r\n            length = ownProps ? ownProps.length : 0;\r\n\r\n        while (++ownIndex < length) {\r\n          index = ownProps[ownIndex];\r\n          result[index] = callback ? callback(result[index], iterable[index]) : iterable[index];\r\n        }\r\n        }\r\n      }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * Creates a clone of `value`. If `isDeep` is `true` nested objects will also\r\n     * be cloned, otherwise they will be assigned by reference. If a callback\r\n     * is provided it will be executed to produce the cloned values. If the\r\n     * callback returns `undefined` cloning will be handled by the method instead.\r\n     * The callback is bound to `thisArg` and invoked with one argument; (value).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to clone.\r\n     * @param {boolean} [isDeep=false] Specify a deep clone.\r\n     * @param {Function} [callback] The function to customize cloning values.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the cloned value.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * var shallow = _.clone(characters);\r\n     * shallow[0] === characters[0];\r\n     * // => true\r\n     *\r\n     * var deep = _.clone(characters, true);\r\n     * deep[0] === characters[0];\r\n     * // => false\r\n     *\r\n     * _.mixin({\r\n     *   'clone': _.partialRight(_.clone, function(value) {\r\n     *     return _.isElement(value) ? value.cloneNode(false) : undefined;\r\n     *   })\r\n     * });\r\n     *\r\n     * var clone = _.clone(document.body);\r\n     * clone.childNodes.length;\r\n     * // => 0\r\n     */\r\n    function clone(value, isDeep, callback, thisArg) {\r\n      // allows working with \"Collections\" methods without using their `index`\r\n      // and `collection` arguments for `isDeep` and `callback`\r\n      if (typeof isDeep != 'boolean' && isDeep != null) {\r\n        thisArg = callback;\r\n        callback = isDeep;\r\n        isDeep = false;\r\n      }\r\n      return baseClone(value, isDeep, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 1));\r\n    }\r\n\r\n    /**\r\n     * Creates a deep clone of `value`. If a callback is provided it will be\r\n     * executed to produce the cloned values. If the callback returns `undefined`\r\n     * cloning will be handled by the method instead. The callback is bound to\r\n     * `thisArg` and invoked with one argument; (value).\r\n     *\r\n     * Note: This method is loosely based on the structured clone algorithm. Functions\r\n     * and DOM nodes are **not** cloned. The enumerable properties of `arguments` objects and\r\n     * objects created by constructors other than `Object` are cloned to plain `Object` objects.\r\n     * See http://www.w3.org/TR/html5/infrastructure.html#internal-structured-cloning-algorithm.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to deep clone.\r\n     * @param {Function} [callback] The function to customize cloning values.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the deep cloned value.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * var deep = _.cloneDeep(characters);\r\n     * deep[0] === characters[0];\r\n     * // => false\r\n     *\r\n     * var view = {\r\n     *   'label': 'docs',\r\n     *   'node': element\r\n     * };\r\n     *\r\n     * var clone = _.cloneDeep(view, function(value) {\r\n     *   return _.isElement(value) ? value.cloneNode(true) : undefined;\r\n     * });\r\n     *\r\n     * clone.node == view.node;\r\n     * // => false\r\n     */\r\n    function cloneDeep(value, callback, thisArg) {\r\n      return baseClone(value, true, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 1));\r\n    }\r\n\r\n    /**\r\n     * Creates an object that inherits from the given `prototype` object. If a\r\n     * `properties` object is provided its own enumerable properties are assigned\r\n     * to the created object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} prototype The object to inherit from.\r\n     * @param {Object} [properties] The properties to assign to the object.\r\n     * @returns {Object} Returns the new object.\r\n     * @example\r\n     *\r\n     * function Shape() {\r\n     *   this.x = 0;\r\n     *   this.y = 0;\r\n     * }\r\n     *\r\n     * function Circle() {\r\n     *   Shape.call(this);\r\n     * }\r\n     *\r\n     * Circle.prototype = _.create(Shape.prototype, { 'constructor': Circle });\r\n     *\r\n     * var circle = new Circle;\r\n     * circle instanceof Circle;\r\n     * // => true\r\n     *\r\n     * circle instanceof Shape;\r\n     * // => true\r\n     */\r\n    function create(prototype, properties) {\r\n      var result = baseCreate(prototype);\r\n      return properties ? assign(result, properties) : result;\r\n    }\r\n\r\n    /**\r\n     * Assigns own enumerable properties of source object(s) to the destination\r\n     * object for all destination properties that resolve to `undefined`. Once a\r\n     * property is set, additional defaults of the same property will be ignored.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Objects\r\n     * @param {Object} object The destination object.\r\n     * @param {...Object} [source] The source objects.\r\n     * @param- {Object} [guard] Allows working with `_.reduce` without using its\r\n     *  `key` and `object` arguments as sources.\r\n     * @returns {Object} Returns the destination object.\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'barney' };\r\n     * _.defaults(object, { 'name': 'fred', 'employer': 'slate' });\r\n     * // => { 'name': 'barney', 'employer': 'slate' }\r\n     */\r\n    var defaults = function(object, source, guard) {\r\n      var index, iterable = object, result = iterable;\r\n      if (!iterable) return result;\r\n      var args = arguments,\r\n          argsIndex = 0,\r\n          argsLength = typeof guard == 'number' ? 2 : args.length;\r\n      while (++argsIndex < argsLength) {\r\n        iterable = args[argsIndex];\r\n        if (iterable && objectTypes[typeof iterable]) {\r\n        var ownIndex = -1,\r\n            ownProps = objectTypes[typeof iterable] && keys(iterable),\r\n            length = ownProps ? ownProps.length : 0;\r\n\r\n        while (++ownIndex < length) {\r\n          index = ownProps[ownIndex];\r\n          if (typeof result[index] == 'undefined') result[index] = iterable[index];\r\n        }\r\n        }\r\n      }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * This method is like `_.findIndex` except that it returns the key of the\r\n     * first element that passes the callback check, instead of the element itself.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to search.\r\n     * @param {Function|Object|string} [callback=identity] The function called per\r\n     *  iteration. If a property name or object is provided it will be used to\r\n     *  create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {string|undefined} Returns the key of the found element, else `undefined`.\r\n     * @example\r\n     *\r\n     * var characters = {\r\n     *   'barney': {  'age': 36, 'blocked': false },\r\n     *   'fred': {    'age': 40, 'blocked': true },\r\n     *   'pebbles': { 'age': 1,  'blocked': false }\r\n     * };\r\n     *\r\n     * _.findKey(characters, function(chr) {\r\n     *   return chr.age < 40;\r\n     * });\r\n     * // => 'barney' (property order is not guaranteed across environments)\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.findKey(characters, { 'age': 1 });\r\n     * // => 'pebbles'\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.findKey(characters, 'blocked');\r\n     * // => 'fred'\r\n     */\r\n    function findKey(object, callback, thisArg) {\r\n      var result;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      forOwn(object, function(value, key, object) {\r\n        if (callback(value, key, object)) {\r\n          result = key;\r\n          return false;\r\n        }\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.findKey` except that it iterates over elements\r\n     * of a `collection` in the opposite order.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to search.\r\n     * @param {Function|Object|string} [callback=identity] The function called per\r\n     *  iteration. If a property name or object is provided it will be used to\r\n     *  create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {string|undefined} Returns the key of the found element, else `undefined`.\r\n     * @example\r\n     *\r\n     * var characters = {\r\n     *   'barney': {  'age': 36, 'blocked': true },\r\n     *   'fred': {    'age': 40, 'blocked': false },\r\n     *   'pebbles': { 'age': 1,  'blocked': true }\r\n     * };\r\n     *\r\n     * _.findLastKey(characters, function(chr) {\r\n     *   return chr.age < 40;\r\n     * });\r\n     * // => returns `pebbles`, assuming `_.findKey` returns `barney`\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.findLastKey(characters, { 'age': 40 });\r\n     * // => 'fred'\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.findLastKey(characters, 'blocked');\r\n     * // => 'pebbles'\r\n     */\r\n    function findLastKey(object, callback, thisArg) {\r\n      var result;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      forOwnRight(object, function(value, key, object) {\r\n        if (callback(value, key, object)) {\r\n          result = key;\r\n          return false;\r\n        }\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Iterates over own and inherited enumerable properties of an object,\r\n     * executing the callback for each property. The callback is bound to `thisArg`\r\n     * and invoked with three arguments; (value, key, object). Callbacks may exit\r\n     * iteration early by explicitly returning `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * function Shape() {\r\n     *   this.x = 0;\r\n     *   this.y = 0;\r\n     * }\r\n     *\r\n     * Shape.prototype.move = function(x, y) {\r\n     *   this.x += x;\r\n     *   this.y += y;\r\n     * };\r\n     *\r\n     * _.forIn(new Shape, function(value, key) {\r\n     *   console.log(key);\r\n     * });\r\n     * // => logs 'x', 'y', and 'move' (property order is not guaranteed across environments)\r\n     */\r\n    var forIn = function(collection, callback, thisArg) {\r\n      var index, iterable = collection, result = iterable;\r\n      if (!iterable) return result;\r\n      if (!objectTypes[typeof iterable]) return result;\r\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\r\n        for (index in iterable) {\r\n          if (callback(iterable[index], index, collection) === false) return result;\r\n        }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * This method is like `_.forIn` except that it iterates over elements\r\n     * of a `collection` in the opposite order.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * function Shape() {\r\n     *   this.x = 0;\r\n     *   this.y = 0;\r\n     * }\r\n     *\r\n     * Shape.prototype.move = function(x, y) {\r\n     *   this.x += x;\r\n     *   this.y += y;\r\n     * };\r\n     *\r\n     * _.forInRight(new Shape, function(value, key) {\r\n     *   console.log(key);\r\n     * });\r\n     * // => logs 'move', 'y', and 'x' assuming `_.forIn ` logs 'x', 'y', and 'move'\r\n     */\r\n    function forInRight(object, callback, thisArg) {\r\n      var pairs = [];\r\n\r\n      forIn(object, function(value, key) {\r\n        pairs.push(key, value);\r\n      });\r\n\r\n      var length = pairs.length;\r\n      callback = baseCreateCallback(callback, thisArg, 3);\r\n      while (length--) {\r\n        if (callback(pairs[length--], pairs[length], object) === false) {\r\n          break;\r\n        }\r\n      }\r\n      return object;\r\n    }\r\n\r\n    /**\r\n     * Iterates over own enumerable properties of an object, executing the callback\r\n     * for each property. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, key, object). Callbacks may exit iteration early by\r\n     * explicitly returning `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * _.forOwn({ '0': 'zero', '1': 'one', 'length': 2 }, function(num, key) {\r\n     *   console.log(key);\r\n     * });\r\n     * // => logs '0', '1', and 'length' (property order is not guaranteed across environments)\r\n     */\r\n    var forOwn = function(collection, callback, thisArg) {\r\n      var index, iterable = collection, result = iterable;\r\n      if (!iterable) return result;\r\n      if (!objectTypes[typeof iterable]) return result;\r\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\r\n        var ownIndex = -1,\r\n            ownProps = objectTypes[typeof iterable] && keys(iterable),\r\n            length = ownProps ? ownProps.length : 0;\r\n\r\n        while (++ownIndex < length) {\r\n          index = ownProps[ownIndex];\r\n          if (callback(iterable[index], index, collection) === false) return result;\r\n        }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * This method is like `_.forOwn` except that it iterates over elements\r\n     * of a `collection` in the opposite order.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * _.forOwnRight({ '0': 'zero', '1': 'one', 'length': 2 }, function(num, key) {\r\n     *   console.log(key);\r\n     * });\r\n     * // => logs 'length', '1', and '0' assuming `_.forOwn` logs '0', '1', and 'length'\r\n     */\r\n    function forOwnRight(object, callback, thisArg) {\r\n      var props = keys(object),\r\n          length = props.length;\r\n\r\n      callback = baseCreateCallback(callback, thisArg, 3);\r\n      while (length--) {\r\n        var key = props[length];\r\n        if (callback(object[key], key, object) === false) {\r\n          break;\r\n        }\r\n      }\r\n      return object;\r\n    }\r\n\r\n    /**\r\n     * Creates a sorted array of property names of all enumerable properties,\r\n     * own and inherited, of `object` that have function values.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias methods\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns an array of property names that have function values.\r\n     * @example\r\n     *\r\n     * _.functions(_);\r\n     * // => ['all', 'any', 'bind', 'bindAll', 'clone', 'compact', 'compose', ...]\r\n     */\r\n    function functions(object) {\r\n      var result = [];\r\n      forIn(object, function(value, key) {\r\n        if (isFunction(value)) {\r\n          result.push(key);\r\n        }\r\n      });\r\n      return result.sort();\r\n    }\r\n\r\n    /**\r\n     * Checks if the specified property name exists as a direct property of `object`,\r\n     * instead of an inherited property.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @param {string} key The name of the property to check.\r\n     * @returns {boolean} Returns `true` if key is a direct property, else `false`.\r\n     * @example\r\n     *\r\n     * _.has({ 'a': 1, 'b': 2, 'c': 3 }, 'b');\r\n     * // => true\r\n     */\r\n    function has(object, key) {\r\n      return object ? hasOwnProperty.call(object, key) : false;\r\n    }\r\n\r\n    /**\r\n     * Creates an object composed of the inverted keys and values of the given object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to invert.\r\n     * @returns {Object} Returns the created inverted object.\r\n     * @example\r\n     *\r\n     * _.invert({ 'first': 'fred', 'second': 'barney' });\r\n     * // => { 'fred': 'first', 'barney': 'second' }\r\n     */\r\n    function invert(object) {\r\n      var index = -1,\r\n          props = keys(object),\r\n          length = props.length,\r\n          result = {};\r\n\r\n      while (++index < length) {\r\n        var key = props[index];\r\n        result[object[key]] = key;\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a boolean value.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a boolean value, else `false`.\r\n     * @example\r\n     *\r\n     * _.isBoolean(null);\r\n     * // => false\r\n     */\r\n    function isBoolean(value) {\r\n      return value === true || value === false ||\r\n        value && typeof value == 'object' && toString.call(value) == boolClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a date.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a date, else `false`.\r\n     * @example\r\n     *\r\n     * _.isDate(new Date);\r\n     * // => true\r\n     */\r\n    function isDate(value) {\r\n      return value && typeof value == 'object' && toString.call(value) == dateClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a DOM element.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a DOM element, else `false`.\r\n     * @example\r\n     *\r\n     * _.isElement(document.body);\r\n     * // => true\r\n     */\r\n    function isElement(value) {\r\n      return value && value.nodeType === 1 || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is empty. Arrays, strings, or `arguments` objects with a\r\n     * length of `0` and objects with no own enumerable properties are considered\r\n     * \"empty\".\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Array|Object|string} value The value to inspect.\r\n     * @returns {boolean} Returns `true` if the `value` is empty, else `false`.\r\n     * @example\r\n     *\r\n     * _.isEmpty([1, 2, 3]);\r\n     * // => false\r\n     *\r\n     * _.isEmpty({});\r\n     * // => true\r\n     *\r\n     * _.isEmpty('');\r\n     * // => true\r\n     */\r\n    function isEmpty(value) {\r\n      var result = true;\r\n      if (!value) {\r\n        return result;\r\n      }\r\n      var className = toString.call(value),\r\n          length = value.length;\r\n\r\n      if ((className == arrayClass || className == stringClass || className == argsClass ) ||\r\n          (className == objectClass && typeof length == 'number' && isFunction(value.splice))) {\r\n        return !length;\r\n      }\r\n      forOwn(value, function() {\r\n        return (result = false);\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Performs a deep comparison between two values to determine if they are\r\n     * equivalent to each other. If a callback is provided it will be executed\r\n     * to compare values. If the callback returns `undefined` comparisons will\r\n     * be handled by the method instead. The callback is bound to `thisArg` and\r\n     * invoked with two arguments; (a, b).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} a The value to compare.\r\n     * @param {*} b The other value to compare.\r\n     * @param {Function} [callback] The function to customize comparing values.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'fred' };\r\n     * var copy = { 'name': 'fred' };\r\n     *\r\n     * object == copy;\r\n     * // => false\r\n     *\r\n     * _.isEqual(object, copy);\r\n     * // => true\r\n     *\r\n     * var words = ['hello', 'goodbye'];\r\n     * var otherWords = ['hi', 'goodbye'];\r\n     *\r\n     * _.isEqual(words, otherWords, function(a, b) {\r\n     *   var reGreet = /^(?:hello|hi)$/i,\r\n     *       aGreet = _.isString(a) && reGreet.test(a),\r\n     *       bGreet = _.isString(b) && reGreet.test(b);\r\n     *\r\n     *   return (aGreet || bGreet) ? (aGreet == bGreet) : undefined;\r\n     * });\r\n     * // => true\r\n     */\r\n    function isEqual(a, b, callback, thisArg) {\r\n      return baseIsEqual(a, b, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 2));\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is, or can be coerced to, a finite number.\r\n     *\r\n     * Note: This is not the same as native `isFinite` which will return true for\r\n     * booleans and empty strings. See http://es5.github.io/#x15.1.2.5.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is finite, else `false`.\r\n     * @example\r\n     *\r\n     * _.isFinite(-101);\r\n     * // => true\r\n     *\r\n     * _.isFinite('10');\r\n     * // => true\r\n     *\r\n     * _.isFinite(true);\r\n     * // => false\r\n     *\r\n     * _.isFinite('');\r\n     * // => false\r\n     *\r\n     * _.isFinite(Infinity);\r\n     * // => false\r\n     */\r\n    function isFinite(value) {\r\n      return nativeIsFinite(value) && !nativeIsNaN(parseFloat(value));\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a function, else `false`.\r\n     * @example\r\n     *\r\n     * _.isFunction(_);\r\n     * // => true\r\n     */\r\n    function isFunction(value) {\r\n      return typeof value == 'function';\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is the language type of Object.\r\n     * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is an object, else `false`.\r\n     * @example\r\n     *\r\n     * _.isObject({});\r\n     * // => true\r\n     *\r\n     * _.isObject([1, 2, 3]);\r\n     * // => true\r\n     *\r\n     * _.isObject(1);\r\n     * // => false\r\n     */\r\n    function isObject(value) {\r\n      // check if the value is the ECMAScript language type of Object\r\n      // http://es5.github.io/#x8\r\n      // and avoid a V8 bug\r\n      // http://code.google.com/p/v8/issues/detail?id=2291\r\n      return !!(value && objectTypes[typeof value]);\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is `NaN`.\r\n     *\r\n     * Note: This is not the same as native `isNaN` which will return `true` for\r\n     * `undefined` and other non-numeric values. See http://es5.github.io/#x15.1.2.4.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is `NaN`, else `false`.\r\n     * @example\r\n     *\r\n     * _.isNaN(NaN);\r\n     * // => true\r\n     *\r\n     * _.isNaN(new Number(NaN));\r\n     * // => true\r\n     *\r\n     * isNaN(undefined);\r\n     * // => true\r\n     *\r\n     * _.isNaN(undefined);\r\n     * // => false\r\n     */\r\n    function isNaN(value) {\r\n      // `NaN` as a primitive is the only value that is not equal to itself\r\n      // (perform the [[Class]] check first to avoid errors with some host objects in IE)\r\n      return isNumber(value) && value != +value;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is `null`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is `null`, else `false`.\r\n     * @example\r\n     *\r\n     * _.isNull(null);\r\n     * // => true\r\n     *\r\n     * _.isNull(undefined);\r\n     * // => false\r\n     */\r\n    function isNull(value) {\r\n      return value === null;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a number.\r\n     *\r\n     * Note: `NaN` is considered a number. See http://es5.github.io/#x8.5.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a number, else `false`.\r\n     * @example\r\n     *\r\n     * _.isNumber(8.4 * 5);\r\n     * // => true\r\n     */\r\n    function isNumber(value) {\r\n      return typeof value == 'number' ||\r\n        value && typeof value == 'object' && toString.call(value) == numberClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is an object created by the `Object` constructor.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\r\n     * @example\r\n     *\r\n     * function Shape() {\r\n     *   this.x = 0;\r\n     *   this.y = 0;\r\n     * }\r\n     *\r\n     * _.isPlainObject(new Shape);\r\n     * // => false\r\n     *\r\n     * _.isPlainObject([1, 2, 3]);\r\n     * // => false\r\n     *\r\n     * _.isPlainObject({ 'x': 0, 'y': 0 });\r\n     * // => true\r\n     */\r\n    var isPlainObject = !getPrototypeOf ? shimIsPlainObject : function(value) {\r\n      if (!(value && toString.call(value) == objectClass)) {\r\n        return false;\r\n      }\r\n      var valueOf = value.valueOf,\r\n          objProto = isNative(valueOf) && (objProto = getPrototypeOf(valueOf)) && getPrototypeOf(objProto);\r\n\r\n      return objProto\r\n        ? (value == objProto || getPrototypeOf(value) == objProto)\r\n        : shimIsPlainObject(value);\r\n    };\r\n\r\n    /**\r\n     * Checks if `value` is a regular expression.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a regular expression, else `false`.\r\n     * @example\r\n     *\r\n     * _.isRegExp(/fred/);\r\n     * // => true\r\n     */\r\n    function isRegExp(value) {\r\n      return value && typeof value == 'object' && toString.call(value) == regexpClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a string.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a string, else `false`.\r\n     * @example\r\n     *\r\n     * _.isString('fred');\r\n     * // => true\r\n     */\r\n    function isString(value) {\r\n      return typeof value == 'string' ||\r\n        value && typeof value == 'object' && toString.call(value) == stringClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is `undefined`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is `undefined`, else `false`.\r\n     * @example\r\n     *\r\n     * _.isUndefined(void 0);\r\n     * // => true\r\n     */\r\n    function isUndefined(value) {\r\n      return typeof value == 'undefined';\r\n    }\r\n\r\n    /**\r\n     * Creates an object with the same keys as `object` and values generated by\r\n     * running each own enumerable property of `object` through the callback.\r\n     * The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, key, object).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new object with values of the results of each `callback` execution.\r\n     * @example\r\n     *\r\n     * _.mapValues({ 'a': 1, 'b': 2, 'c': 3} , function(num) { return num * 3; });\r\n     * // => { 'a': 3, 'b': 6, 'c': 9 }\r\n     *\r\n     * var characters = {\r\n     *   'fred': { 'name': 'fred', 'age': 40 },\r\n     *   'pebbles': { 'name': 'pebbles', 'age': 1 }\r\n     * };\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.mapValues(characters, 'age');\r\n     * // => { 'fred': 40, 'pebbles': 1 }\r\n     */\r\n    function mapValues(object, callback, thisArg) {\r\n      var result = {};\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      forOwn(object, function(value, key, object) {\r\n        result[key] = callback(value, key, object);\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Recursively merges own enumerable properties of the source object(s), that\r\n     * don't resolve to `undefined` into the destination object. Subsequent sources\r\n     * will overwrite property assignments of previous sources. If a callback is\r\n     * provided it will be executed to produce the merged values of the destination\r\n     * and source properties. If the callback returns `undefined` merging will\r\n     * be handled by the method instead. The callback is bound to `thisArg` and\r\n     * invoked with two arguments; (objectValue, sourceValue).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The destination object.\r\n     * @param {...Object} [source] The source objects.\r\n     * @param {Function} [callback] The function to customize merging properties.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the destination object.\r\n     * @example\r\n     *\r\n     * var names = {\r\n     *   'characters': [\r\n     *     { 'name': 'barney' },\r\n     *     { 'name': 'fred' }\r\n     *   ]\r\n     * };\r\n     *\r\n     * var ages = {\r\n     *   'characters': [\r\n     *     { 'age': 36 },\r\n     *     { 'age': 40 }\r\n     *   ]\r\n     * };\r\n     *\r\n     * _.merge(names, ages);\r\n     * // => { 'characters': [{ 'name': 'barney', 'age': 36 }, { 'name': 'fred', 'age': 40 }] }\r\n     *\r\n     * var food = {\r\n     *   'fruits': ['apple'],\r\n     *   'vegetables': ['beet']\r\n     * };\r\n     *\r\n     * var otherFood = {\r\n     *   'fruits': ['banana'],\r\n     *   'vegetables': ['carrot']\r\n     * };\r\n     *\r\n     * _.merge(food, otherFood, function(a, b) {\r\n     *   return _.isArray(a) ? a.concat(b) : undefined;\r\n     * });\r\n     * // => { 'fruits': ['apple', 'banana'], 'vegetables': ['beet', 'carrot] }\r\n     */\r\n    function merge(object) {\r\n      var args = arguments,\r\n          length = 2;\r\n\r\n      if (!isObject(object)) {\r\n        return object;\r\n      }\r\n      // allows working with `_.reduce` and `_.reduceRight` without using\r\n      // their `index` and `collection` arguments\r\n      if (typeof args[2] != 'number') {\r\n        length = args.length;\r\n      }\r\n      if (length > 3 && typeof args[length - 2] == 'function') {\r\n        var callback = baseCreateCallback(args[--length - 1], args[length--], 2);\r\n      } else if (length > 2 && typeof args[length - 1] == 'function') {\r\n        callback = args[--length];\r\n      }\r\n      var sources = slice(arguments, 1, length),\r\n          index = -1,\r\n          stackA = getArray(),\r\n          stackB = getArray();\r\n\r\n      while (++index < length) {\r\n        baseMerge(object, sources[index], callback, stackA, stackB);\r\n      }\r\n      releaseArray(stackA);\r\n      releaseArray(stackB);\r\n      return object;\r\n    }\r\n\r\n    /**\r\n     * Creates a shallow clone of `object` excluding the specified properties.\r\n     * Property names may be specified as individual arguments or as arrays of\r\n     * property names. If a callback is provided it will be executed for each\r\n     * property of `object` omitting the properties the callback returns truey\r\n     * for. The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, key, object).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The source object.\r\n     * @param {Function|...string|string[]} [callback] The properties to omit or the\r\n     *  function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns an object without the omitted properties.\r\n     * @example\r\n     *\r\n     * _.omit({ 'name': 'fred', 'age': 40 }, 'age');\r\n     * // => { 'name': 'fred' }\r\n     *\r\n     * _.omit({ 'name': 'fred', 'age': 40 }, function(value) {\r\n     *   return typeof value == 'number';\r\n     * });\r\n     * // => { 'name': 'fred' }\r\n     */\r\n    function omit(object, callback, thisArg) {\r\n      var result = {};\r\n      if (typeof callback != 'function') {\r\n        var props = [];\r\n        forIn(object, function(value, key) {\r\n          props.push(key);\r\n        });\r\n        props = baseDifference(props, baseFlatten(arguments, true, false, 1));\r\n\r\n        var index = -1,\r\n            length = props.length;\r\n\r\n        while (++index < length) {\r\n          var key = props[index];\r\n          result[key] = object[key];\r\n        }\r\n      } else {\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        forIn(object, function(value, key, object) {\r\n          if (!callback(value, key, object)) {\r\n            result[key] = value;\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates a two dimensional array of an object's key-value pairs,\r\n     * i.e. `[[key1, value1], [key2, value2]]`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns new array of key-value pairs.\r\n     * @example\r\n     *\r\n     * _.pairs({ 'barney': 36, 'fred': 40 });\r\n     * // => [['barney', 36], ['fred', 40]] (property order is not guaranteed across environments)\r\n     */\r\n    function pairs(object) {\r\n      var index = -1,\r\n          props = keys(object),\r\n          length = props.length,\r\n          result = Array(length);\r\n\r\n      while (++index < length) {\r\n        var key = props[index];\r\n        result[index] = [key, object[key]];\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates a shallow clone of `object` composed of the specified properties.\r\n     * Property names may be specified as individual arguments or as arrays of\r\n     * property names. If a callback is provided it will be executed for each\r\n     * property of `object` picking the properties the callback returns truey\r\n     * for. The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, key, object).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The source object.\r\n     * @param {Function|...string|string[]} [callback] The function called per\r\n     *  iteration or property names to pick, specified as individual property\r\n     *  names or arrays of property names.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns an object composed of the picked properties.\r\n     * @example\r\n     *\r\n     * _.pick({ 'name': 'fred', '_userid': 'fred1' }, 'name');\r\n     * // => { 'name': 'fred' }\r\n     *\r\n     * _.pick({ 'name': 'fred', '_userid': 'fred1' }, function(value, key) {\r\n     *   return key.charAt(0) != '_';\r\n     * });\r\n     * // => { 'name': 'fred' }\r\n     */\r\n    function pick(object, callback, thisArg) {\r\n      var result = {};\r\n      if (typeof callback != 'function') {\r\n        var index = -1,\r\n            props = baseFlatten(arguments, true, false, 1),\r\n            length = isObject(object) ? props.length : 0;\r\n\r\n        while (++index < length) {\r\n          var key = props[index];\r\n          if (key in object) {\r\n            result[key] = object[key];\r\n          }\r\n        }\r\n      } else {\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        forIn(object, function(value, key, object) {\r\n          if (callback(value, key, object)) {\r\n            result[key] = value;\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * An alternative to `_.reduce` this method transforms `object` to a new\r\n     * `accumulator` object which is the result of running each of its own\r\n     * enumerable properties through a callback, with each callback execution\r\n     * potentially mutating the `accumulator` object. The callback is bound to\r\n     * `thisArg` and invoked with four arguments; (accumulator, value, key, object).\r\n     * Callbacks may exit iteration early by explicitly returning `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Array|Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [accumulator] The custom accumulator value.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the accumulated value.\r\n     * @example\r\n     *\r\n     * var squares = _.transform([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], function(result, num) {\r\n     *   num *= num;\r\n     *   if (num % 2) {\r\n     *     return result.push(num) < 3;\r\n     *   }\r\n     * });\r\n     * // => [1, 9, 25]\r\n     *\r\n     * var mapped = _.transform({ 'a': 1, 'b': 2, 'c': 3 }, function(result, num, key) {\r\n     *   result[key] = num * 3;\r\n     * });\r\n     * // => { 'a': 3, 'b': 6, 'c': 9 }\r\n     */\r\n    function transform(object, callback, accumulator, thisArg) {\r\n      var isArr = isArray(object);\r\n      if (accumulator == null) {\r\n        if (isArr) {\r\n          accumulator = [];\r\n        } else {\r\n          var ctor = object && object.constructor,\r\n              proto = ctor && ctor.prototype;\r\n\r\n          accumulator = baseCreate(proto);\r\n        }\r\n      }\r\n      if (callback) {\r\n        callback = lodash.createCallback(callback, thisArg, 4);\r\n        (isArr ? forEach : forOwn)(object, function(value, index, object) {\r\n          return callback(accumulator, value, index, object);\r\n        });\r\n      }\r\n      return accumulator;\r\n    }\r\n\r\n    /**\r\n     * Creates an array composed of the own enumerable property values of `object`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns an array of property values.\r\n     * @example\r\n     *\r\n     * _.values({ 'one': 1, 'two': 2, 'three': 3 });\r\n     * // => [1, 2, 3] (property order is not guaranteed across environments)\r\n     */\r\n    function values(object) {\r\n      var index = -1,\r\n          props = keys(object),\r\n          length = props.length,\r\n          result = Array(length);\r\n\r\n      while (++index < length) {\r\n        result[index] = object[props[index]];\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates an array of elements from the specified indexes, or keys, of the\r\n     * `collection`. Indexes may be specified as individual arguments or as arrays\r\n     * of indexes.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {...(number|number[]|string|string[])} [index] The indexes of `collection`\r\n     *   to retrieve, specified as individual indexes or arrays of indexes.\r\n     * @returns {Array} Returns a new array of elements corresponding to the\r\n     *  provided indexes.\r\n     * @example\r\n     *\r\n     * _.at(['a', 'b', 'c', 'd', 'e'], [0, 2, 4]);\r\n     * // => ['a', 'c', 'e']\r\n     *\r\n     * _.at(['fred', 'barney', 'pebbles'], 0, 2);\r\n     * // => ['fred', 'pebbles']\r\n     */\r\n    function at(collection) {\r\n      var args = arguments,\r\n          index = -1,\r\n          props = baseFlatten(args, true, false, 1),\r\n          length = (args[2] && args[2][args[1]] === collection) ? 1 : props.length,\r\n          result = Array(length);\r\n\r\n      while(++index < length) {\r\n        result[index] = collection[props[index]];\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Checks if a given value is present in a collection using strict equality\r\n     * for comparisons, i.e. `===`. If `fromIndex` is negative, it is used as the\r\n     * offset from the end of the collection.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias include\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {*} target The value to check for.\r\n     * @param {number} [fromIndex=0] The index to search from.\r\n     * @returns {boolean} Returns `true` if the `target` element is found, else `false`.\r\n     * @example\r\n     *\r\n     * _.contains([1, 2, 3], 1);\r\n     * // => true\r\n     *\r\n     * _.contains([1, 2, 3], 1, 2);\r\n     * // => false\r\n     *\r\n     * _.contains({ 'name': 'fred', 'age': 40 }, 'fred');\r\n     * // => true\r\n     *\r\n     * _.contains('pebbles', 'eb');\r\n     * // => true\r\n     */\r\n    function contains(collection, target, fromIndex) {\r\n      var index = -1,\r\n          indexOf = getIndexOf(),\r\n          length = collection ? collection.length : 0,\r\n          result = false;\r\n\r\n      fromIndex = (fromIndex < 0 ? nativeMax(0, length + fromIndex) : fromIndex) || 0;\r\n      if (isArray(collection)) {\r\n        result = indexOf(collection, target, fromIndex) > -1;\r\n      } else if (typeof length == 'number') {\r\n        result = (isString(collection) ? collection.indexOf(target, fromIndex) : indexOf(collection, target, fromIndex)) > -1;\r\n      } else {\r\n        forOwn(collection, function(value) {\r\n          if (++index >= fromIndex) {\r\n            return !(result = value === target);\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an object composed of keys generated from the results of running\r\n     * each element of `collection` through the callback. The corresponding value\r\n     * of each key is the number of times the key was returned by the callback.\r\n     * The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the composed aggregate object.\r\n     * @example\r\n     *\r\n     * _.countBy([4.3, 6.1, 6.4], function(num) { return Math.floor(num); });\r\n     * // => { '4': 1, '6': 2 }\r\n     *\r\n     * _.countBy([4.3, 6.1, 6.4], function(num) { return this.floor(num); }, Math);\r\n     * // => { '4': 1, '6': 2 }\r\n     *\r\n     * _.countBy(['one', 'two', 'three'], 'length');\r\n     * // => { '3': 2, '5': 1 }\r\n     */\r\n    var countBy = createAggregator(function(result, value, key) {\r\n      (hasOwnProperty.call(result, key) ? result[key]++ : result[key] = 1);\r\n    });\r\n\r\n    /**\r\n     * Checks if the given callback returns truey value for **all** elements of\r\n     * a collection. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias all\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {boolean} Returns `true` if all elements passed the callback check,\r\n     *  else `false`.\r\n     * @example\r\n     *\r\n     * _.every([true, 1, null, 'yes']);\r\n     * // => false\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.every(characters, 'age');\r\n     * // => true\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.every(characters, { 'age': 36 });\r\n     * // => false\r\n     */\r\n    function every(collection, callback, thisArg) {\r\n      var result = true;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          if (!(result = !!callback(collection[index], index, collection))) {\r\n            break;\r\n          }\r\n        }\r\n      } else {\r\n        forOwn(collection, function(value, index, collection) {\r\n          return (result = !!callback(value, index, collection));\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Iterates over elements of a collection, returning an array of all elements\r\n     * the callback returns truey for. The callback is bound to `thisArg` and\r\n     * invoked with three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias select\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of elements that passed the callback check.\r\n     * @example\r\n     *\r\n     * var evens = _.filter([1, 2, 3, 4, 5, 6], function(num) { return num % 2 == 0; });\r\n     * // => [2, 4, 6]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',   'age': 40, 'blocked': true }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.filter(characters, 'blocked');\r\n     * // => [{ 'name': 'fred', 'age': 40, 'blocked': true }]\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.filter(characters, { 'age': 36 });\r\n     * // => [{ 'name': 'barney', 'age': 36, 'blocked': false }]\r\n     */\r\n    function filter(collection, callback, thisArg) {\r\n      var result = [];\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          var value = collection[index];\r\n          if (callback(value, index, collection)) {\r\n            result.push(value);\r\n          }\r\n        }\r\n      } else {\r\n        forOwn(collection, function(value, index, collection) {\r\n          if (callback(value, index, collection)) {\r\n            result.push(value);\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Iterates over elements of a collection, returning the first element that\r\n     * the callback returns truey for. The callback is bound to `thisArg` and\r\n     * invoked with three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias detect, findWhere\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the found element, else `undefined`.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',    'age': 40, 'blocked': true },\r\n     *   { 'name': 'pebbles', 'age': 1,  'blocked': false }\r\n     * ];\r\n     *\r\n     * _.find(characters, function(chr) {\r\n     *   return chr.age < 40;\r\n     * });\r\n     * // => { 'name': 'barney', 'age': 36, 'blocked': false }\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.find(characters, { 'age': 1 });\r\n     * // =>  { 'name': 'pebbles', 'age': 1, 'blocked': false }\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.find(characters, 'blocked');\r\n     * // => { 'name': 'fred', 'age': 40, 'blocked': true }\r\n     */\r\n    function find(collection, callback, thisArg) {\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          var value = collection[index];\r\n          if (callback(value, index, collection)) {\r\n            return value;\r\n          }\r\n        }\r\n      } else {\r\n        var result;\r\n        forOwn(collection, function(value, index, collection) {\r\n          if (callback(value, index, collection)) {\r\n            result = value;\r\n            return false;\r\n          }\r\n        });\r\n        return result;\r\n      }\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.find` except that it iterates over elements\r\n     * of a `collection` from right to left.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the found element, else `undefined`.\r\n     * @example\r\n     *\r\n     * _.findLast([1, 2, 3, 4], function(num) {\r\n     *   return num % 2 == 1;\r\n     * });\r\n     * // => 3\r\n     */\r\n    function findLast(collection, callback, thisArg) {\r\n      var result;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      forEachRight(collection, function(value, index, collection) {\r\n        if (callback(value, index, collection)) {\r\n          result = value;\r\n          return false;\r\n        }\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Iterates over elements of a collection, executing the callback for each\r\n     * element. The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, index|key, collection). Callbacks may exit iteration early by\r\n     * explicitly returning `false`.\r\n     *\r\n     * Note: As with other \"Collections\" methods, objects with a `length` property\r\n     * are iterated like arrays. To avoid this behavior `_.forIn` or `_.forOwn`\r\n     * may be used for object iteration.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias each\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array|Object|string} Returns `collection`.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3]).forEach(function(num) { console.log(num); }).join(',');\r\n     * // => logs each number and returns '1,2,3'\r\n     *\r\n     * _.forEach({ 'one': 1, 'two': 2, 'three': 3 }, function(num) { console.log(num); });\r\n     * // => logs each number and returns the object (property order is not guaranteed across environments)\r\n     */\r\n    function forEach(collection, callback, thisArg) {\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          if (callback(collection[index], index, collection) === false) {\r\n            break;\r\n          }\r\n        }\r\n      } else {\r\n        forOwn(collection, callback);\r\n      }\r\n      return collection;\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.forEach` except that it iterates over elements\r\n     * of a `collection` from right to left.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias eachRight\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array|Object|string} Returns `collection`.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3]).forEachRight(function(num) { console.log(num); }).join(',');\r\n     * // => logs each number from right to left and returns '3,2,1'\r\n     */\r\n    function forEachRight(collection, callback, thisArg) {\r\n      var length = collection ? collection.length : 0;\r\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\r\n      if (typeof length == 'number') {\r\n        while (length--) {\r\n          if (callback(collection[length], length, collection) === false) {\r\n            break;\r\n          }\r\n        }\r\n      } else {\r\n        var props = keys(collection);\r\n        length = props.length;\r\n        forOwn(collection, function(value, key, collection) {\r\n          key = props ? props[--length] : --length;\r\n          return callback(collection[key], key, collection);\r\n        });\r\n      }\r\n      return collection;\r\n    }\r\n\r\n    /**\r\n     * Creates an object composed of keys generated from the results of running\r\n     * each element of a collection through the callback. The corresponding value\r\n     * of each key is an array of the elements responsible for generating the key.\r\n     * The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the composed aggregate object.\r\n     * @example\r\n     *\r\n     * _.groupBy([4.2, 6.1, 6.4], function(num) { return Math.floor(num); });\r\n     * // => { '4': [4.2], '6': [6.1, 6.4] }\r\n     *\r\n     * _.groupBy([4.2, 6.1, 6.4], function(num) { return this.floor(num); }, Math);\r\n     * // => { '4': [4.2], '6': [6.1, 6.4] }\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.groupBy(['one', 'two', 'three'], 'length');\r\n     * // => { '3': ['one', 'two'], '5': ['three'] }\r\n     */\r\n    var groupBy = createAggregator(function(result, value, key) {\r\n      (hasOwnProperty.call(result, key) ? result[key] : result[key] = []).push(value);\r\n    });\r\n\r\n    /**\r\n     * Creates an object composed of keys generated from the results of running\r\n     * each element of the collection through the given callback. The corresponding\r\n     * value of each key is the last element responsible for generating the key.\r\n     * The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the composed aggregate object.\r\n     * @example\r\n     *\r\n     * var keys = [\r\n     *   { 'dir': 'left', 'code': 97 },\r\n     *   { 'dir': 'right', 'code': 100 }\r\n     * ];\r\n     *\r\n     * _.indexBy(keys, 'dir');\r\n     * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }\r\n     *\r\n     * _.indexBy(keys, function(key) { return String.fromCharCode(key.code); });\r\n     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\r\n     *\r\n     * _.indexBy(characters, function(key) { this.fromCharCode(key.code); }, String);\r\n     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\r\n     */\r\n    var indexBy = createAggregator(function(result, value, key) {\r\n      result[key] = value;\r\n    });\r\n\r\n    /**\r\n     * Invokes the method named by `methodName` on each element in the `collection`\r\n     * returning an array of the results of each invoked method. Additional arguments\r\n     * will be provided to each invoked method. If `methodName` is a function it\r\n     * will be invoked for, and `this` bound to, each element in the `collection`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|string} methodName The name of the method to invoke or\r\n     *  the function invoked per iteration.\r\n     * @param {...*} [arg] Arguments to invoke the method with.\r\n     * @returns {Array} Returns a new array of the results of each invoked method.\r\n     * @example\r\n     *\r\n     * _.invoke([[5, 1, 7], [3, 2, 1]], 'sort');\r\n     * // => [[1, 5, 7], [1, 2, 3]]\r\n     *\r\n     * _.invoke([123, 456], String.prototype.split, '');\r\n     * // => [['1', '2', '3'], ['4', '5', '6']]\r\n     */\r\n    function invoke(collection, methodName) {\r\n      var args = slice(arguments, 2),\r\n          index = -1,\r\n          isFunc = typeof methodName == 'function',\r\n          length = collection ? collection.length : 0,\r\n          result = Array(typeof length == 'number' ? length : 0);\r\n\r\n      forEach(collection, function(value) {\r\n        result[++index] = (isFunc ? methodName : value[methodName]).apply(value, args);\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of values by running each element in the collection\r\n     * through the callback. The callback is bound to `thisArg` and invoked with\r\n     * three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias collect\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of the results of each `callback` execution.\r\n     * @example\r\n     *\r\n     * _.map([1, 2, 3], function(num) { return num * 3; });\r\n     * // => [3, 6, 9]\r\n     *\r\n     * _.map({ 'one': 1, 'two': 2, 'three': 3 }, function(num) { return num * 3; });\r\n     * // => [3, 6, 9] (property order is not guaranteed across environments)\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.map(characters, 'name');\r\n     * // => ['barney', 'fred']\r\n     */\r\n    function map(collection, callback, thisArg) {\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      if (typeof length == 'number') {\r\n        var result = Array(length);\r\n        while (++index < length) {\r\n          result[index] = callback(collection[index], index, collection);\r\n        }\r\n      } else {\r\n        result = [];\r\n        forOwn(collection, function(value, key, collection) {\r\n          result[++index] = callback(value, key, collection);\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Retrieves the maximum value of a collection. If the collection is empty or\r\n     * falsey `-Infinity` is returned. If a callback is provided it will be executed\r\n     * for each value in the collection to generate the criterion by which the value\r\n     * is ranked. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the maximum value.\r\n     * @example\r\n     *\r\n     * _.max([4, 2, 8, 6]);\r\n     * // => 8\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * _.max(characters, function(chr) { return chr.age; });\r\n     * // => { 'name': 'fred', 'age': 40 };\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.max(characters, 'age');\r\n     * // => { 'name': 'fred', 'age': 40 };\r\n     */\r\n    function max(collection, callback, thisArg) {\r\n      var computed = -Infinity,\r\n          result = computed;\r\n\r\n      // allows working with functions like `_.map` without using\r\n      // their `index` argument as a callback\r\n      if (typeof callback != 'function' && thisArg && thisArg[callback] === collection) {\r\n        callback = null;\r\n      }\r\n      if (callback == null && isArray(collection)) {\r\n        var index = -1,\r\n            length = collection.length;\r\n\r\n        while (++index < length) {\r\n          var value = collection[index];\r\n          if (value > result) {\r\n            result = value;\r\n          }\r\n        }\r\n      } else {\r\n        callback = (callback == null && isString(collection))\r\n          ? charAtCallback\r\n          : lodash.createCallback(callback, thisArg, 3);\r\n\r\n        forEach(collection, function(value, index, collection) {\r\n          var current = callback(value, index, collection);\r\n          if (current > computed) {\r\n            computed = current;\r\n            result = value;\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Retrieves the minimum value of a collection. If the collection is empty or\r\n     * falsey `Infinity` is returned. If a callback is provided it will be executed\r\n     * for each value in the collection to generate the criterion by which the value\r\n     * is ranked. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the minimum value.\r\n     * @example\r\n     *\r\n     * _.min([4, 2, 8, 6]);\r\n     * // => 2\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * _.min(characters, function(chr) { return chr.age; });\r\n     * // => { 'name': 'barney', 'age': 36 };\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.min(characters, 'age');\r\n     * // => { 'name': 'barney', 'age': 36 };\r\n     */\r\n    function min(collection, callback, thisArg) {\r\n      var computed = Infinity,\r\n          result = computed;\r\n\r\n      // allows working with functions like `_.map` without using\r\n      // their `index` argument as a callback\r\n      if (typeof callback != 'function' && thisArg && thisArg[callback] === collection) {\r\n        callback = null;\r\n      }\r\n      if (callback == null && isArray(collection)) {\r\n        var index = -1,\r\n            length = collection.length;\r\n\r\n        while (++index < length) {\r\n          var value = collection[index];\r\n          if (value < result) {\r\n            result = value;\r\n          }\r\n        }\r\n      } else {\r\n        callback = (callback == null && isString(collection))\r\n          ? charAtCallback\r\n          : lodash.createCallback(callback, thisArg, 3);\r\n\r\n        forEach(collection, function(value, index, collection) {\r\n          var current = callback(value, index, collection);\r\n          if (current < computed) {\r\n            computed = current;\r\n            result = value;\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Retrieves the value of a specified property from all elements in the collection.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {string} property The name of the property to pluck.\r\n     * @returns {Array} Returns a new array of property values.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * _.pluck(characters, 'name');\r\n     * // => ['barney', 'fred']\r\n     */\r\n    var pluck = map;\r\n\r\n    /**\r\n     * Reduces a collection to a value which is the accumulated result of running\r\n     * each element in the collection through the callback, where each successive\r\n     * callback execution consumes the return value of the previous execution. If\r\n     * `accumulator` is not provided the first element of the collection will be\r\n     * used as the initial `accumulator` value. The callback is bound to `thisArg`\r\n     * and invoked with four arguments; (accumulator, value, index|key, collection).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias foldl, inject\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [accumulator] Initial value of the accumulator.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the accumulated value.\r\n     * @example\r\n     *\r\n     * var sum = _.reduce([1, 2, 3], function(sum, num) {\r\n     *   return sum + num;\r\n     * });\r\n     * // => 6\r\n     *\r\n     * var mapped = _.reduce({ 'a': 1, 'b': 2, 'c': 3 }, function(result, num, key) {\r\n     *   result[key] = num * 3;\r\n     *   return result;\r\n     * }, {});\r\n     * // => { 'a': 3, 'b': 6, 'c': 9 }\r\n     */\r\n    function reduce(collection, callback, accumulator, thisArg) {\r\n      if (!collection) return accumulator;\r\n      var noaccum = arguments.length < 3;\r\n      callback = lodash.createCallback(callback, thisArg, 4);\r\n\r\n      var index = -1,\r\n          length = collection.length;\r\n\r\n      if (typeof length == 'number') {\r\n        if (noaccum) {\r\n          accumulator = collection[++index];\r\n        }\r\n        while (++index < length) {\r\n          accumulator = callback(accumulator, collection[index], index, collection);\r\n        }\r\n      } else {\r\n        forOwn(collection, function(value, index, collection) {\r\n          accumulator = noaccum\r\n            ? (noaccum = false, value)\r\n            : callback(accumulator, value, index, collection)\r\n        });\r\n      }\r\n      return accumulator;\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.reduce` except that it iterates over elements\r\n     * of a `collection` from right to left.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias foldr\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [accumulator] Initial value of the accumulator.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the accumulated value.\r\n     * @example\r\n     *\r\n     * var list = [[0, 1], [2, 3], [4, 5]];\r\n     * var flat = _.reduceRight(list, function(a, b) { return a.concat(b); }, []);\r\n     * // => [4, 5, 2, 3, 0, 1]\r\n     */\r\n    function reduceRight(collection, callback, accumulator, thisArg) {\r\n      var noaccum = arguments.length < 3;\r\n      callback = lodash.createCallback(callback, thisArg, 4);\r\n      forEachRight(collection, function(value, index, collection) {\r\n        accumulator = noaccum\r\n          ? (noaccum = false, value)\r\n          : callback(accumulator, value, index, collection);\r\n      });\r\n      return accumulator;\r\n    }\r\n\r\n    /**\r\n     * The opposite of `_.filter` this method returns the elements of a\r\n     * collection that the callback does **not** return truey for.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of elements that failed the callback check.\r\n     * @example\r\n     *\r\n     * var odds = _.reject([1, 2, 3, 4, 5, 6], function(num) { return num % 2 == 0; });\r\n     * // => [1, 3, 5]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',   'age': 40, 'blocked': true }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.reject(characters, 'blocked');\r\n     * // => [{ 'name': 'barney', 'age': 36, 'blocked': false }]\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.reject(characters, { 'age': 36 });\r\n     * // => [{ 'name': 'fred', 'age': 40, 'blocked': true }]\r\n     */\r\n    function reject(collection, callback, thisArg) {\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      return filter(collection, function(value, index, collection) {\r\n        return !callback(value, index, collection);\r\n      });\r\n    }\r\n\r\n    /**\r\n     * Retrieves a random element or `n` random elements from a collection.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to sample.\r\n     * @param {number} [n] The number of elements to sample.\r\n     * @param- {Object} [guard] Allows working with functions like `_.map`\r\n     *  without using their `index` arguments as `n`.\r\n     * @returns {Array} Returns the random sample(s) of `collection`.\r\n     * @example\r\n     *\r\n     * _.sample([1, 2, 3, 4]);\r\n     * // => 2\r\n     *\r\n     * _.sample([1, 2, 3, 4], 2);\r\n     * // => [3, 1]\r\n     */\r\n    function sample(collection, n, guard) {\r\n      if (collection && typeof collection.length != 'number') {\r\n        collection = values(collection);\r\n      }\r\n      if (n == null || guard) {\r\n        return collection ? collection[baseRandom(0, collection.length - 1)] : undefined;\r\n      }\r\n      var result = shuffle(collection);\r\n      result.length = nativeMin(nativeMax(0, n), result.length);\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of shuffled values, using a version of the Fisher-Yates\r\n     * shuffle. See http://en.wikipedia.org/wiki/Fisher-Yates_shuffle.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to shuffle.\r\n     * @returns {Array} Returns a new shuffled collection.\r\n     * @example\r\n     *\r\n     * _.shuffle([1, 2, 3, 4, 5, 6]);\r\n     * // => [4, 1, 6, 3, 5, 2]\r\n     */\r\n    function shuffle(collection) {\r\n      var index = -1,\r\n          length = collection ? collection.length : 0,\r\n          result = Array(typeof length == 'number' ? length : 0);\r\n\r\n      forEach(collection, function(value) {\r\n        var rand = baseRandom(0, ++index);\r\n        result[index] = result[rand];\r\n        result[rand] = value;\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Gets the size of the `collection` by returning `collection.length` for arrays\r\n     * and array-like objects or the number of own enumerable properties for objects.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to inspect.\r\n     * @returns {number} Returns `collection.length` or number of own enumerable properties.\r\n     * @example\r\n     *\r\n     * _.size([1, 2]);\r\n     * // => 2\r\n     *\r\n     * _.size({ 'one': 1, 'two': 2, 'three': 3 });\r\n     * // => 3\r\n     *\r\n     * _.size('pebbles');\r\n     * // => 7\r\n     */\r\n    function size(collection) {\r\n      var length = collection ? collection.length : 0;\r\n      return typeof length == 'number' ? length : keys(collection).length;\r\n    }\r\n\r\n    /**\r\n     * Checks if the callback returns a truey value for **any** element of a\r\n     * collection. The function returns as soon as it finds a passing value and\r\n     * does not iterate over the entire collection. The callback is bound to\r\n     * `thisArg` and invoked with three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias any\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {boolean} Returns `true` if any element passed the callback check,\r\n     *  else `false`.\r\n     * @example\r\n     *\r\n     * _.some([null, 0, 'yes', false], Boolean);\r\n     * // => true\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',   'age': 40, 'blocked': true }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.some(characters, 'blocked');\r\n     * // => true\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.some(characters, { 'age': 1 });\r\n     * // => false\r\n     */\r\n    function some(collection, callback, thisArg) {\r\n      var result;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          if ((result = callback(collection[index], index, collection))) {\r\n            break;\r\n          }\r\n        }\r\n      } else {\r\n        forOwn(collection, function(value, index, collection) {\r\n          return !(result = callback(value, index, collection));\r\n        });\r\n      }\r\n      return !!result;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of elements, sorted in ascending order by the results of\r\n     * running each element in a collection through the callback. This method\r\n     * performs a stable sort, that is, it will preserve the original sort order\r\n     * of equal elements. The callback is bound to `thisArg` and invoked with\r\n     * three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an array of property names is provided for `callback` the collection\r\n     * will be sorted by each property value.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Array|Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of sorted elements.\r\n     * @example\r\n     *\r\n     * _.sortBy([1, 2, 3], function(num) { return Math.sin(num); });\r\n     * // => [3, 1, 2]\r\n     *\r\n     * _.sortBy([1, 2, 3], function(num) { return this.sin(num); }, Math);\r\n     * // => [3, 1, 2]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36 },\r\n     *   { 'name': 'fred',    'age': 40 },\r\n     *   { 'name': 'barney',  'age': 26 },\r\n     *   { 'name': 'fred',    'age': 30 }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.map(_.sortBy(characters, 'age'), _.values);\r\n     * // => [['barney', 26], ['fred', 30], ['barney', 36], ['fred', 40]]\r\n     *\r\n     * // sorting by multiple properties\r\n     * _.map(_.sortBy(characters, ['name', 'age']), _.values);\r\n     * // = > [['barney', 26], ['barney', 36], ['fred', 30], ['fred', 40]]\r\n     */\r\n    function sortBy(collection, callback, thisArg) {\r\n      var index = -1,\r\n          isArr = isArray(callback),\r\n          length = collection ? collection.length : 0,\r\n          result = Array(typeof length == 'number' ? length : 0);\r\n\r\n      if (!isArr) {\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n      }\r\n      forEach(collection, function(value, key, collection) {\r\n        var object = result[++index] = getObject();\r\n        if (isArr) {\r\n          object.criteria = map(callback, function(key) { return value[key]; });\r\n        } else {\r\n          (object.criteria = getArray())[0] = callback(value, key, collection);\r\n        }\r\n        object.index = index;\r\n        object.value = value;\r\n      });\r\n\r\n      length = result.length;\r\n      result.sort(compareAscending);\r\n      while (length--) {\r\n        var object = result[length];\r\n        result[length] = object.value;\r\n        if (!isArr) {\r\n          releaseArray(object.criteria);\r\n        }\r\n        releaseObject(object);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Converts the `collection` to an array.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to convert.\r\n     * @returns {Array} Returns the new converted array.\r\n     * @example\r\n     *\r\n     * (function() { return _.toArray(arguments).slice(1); })(1, 2, 3, 4);\r\n     * // => [2, 3, 4]\r\n     */\r\n    function toArray(collection) {\r\n      if (collection && typeof collection.length == 'number') {\r\n        return slice(collection);\r\n      }\r\n      return values(collection);\r\n    }\r\n\r\n    /**\r\n     * Performs a deep comparison of each element in a `collection` to the given\r\n     * `properties` object, returning an array of all elements that have equivalent\r\n     * property values.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Object} props The object of property values to filter by.\r\n     * @returns {Array} Returns a new array of elements that have the given properties.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36, 'pets': ['hoppy'] },\r\n     *   { 'name': 'fred',   'age': 40, 'pets': ['baby puss', 'dino'] }\r\n     * ];\r\n     *\r\n     * _.where(characters, { 'age': 36 });\r\n     * // => [{ 'name': 'barney', 'age': 36, 'pets': ['hoppy'] }]\r\n     *\r\n     * _.where(characters, { 'pets': ['dino'] });\r\n     * // => [{ 'name': 'fred', 'age': 40, 'pets': ['baby puss', 'dino'] }]\r\n     */\r\n    var where = filter;\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates an array with all falsey values removed. The values `false`, `null`,\r\n     * `0`, `\"\"`, `undefined`, and `NaN` are all falsey.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to compact.\r\n     * @returns {Array} Returns a new array of filtered values.\r\n     * @example\r\n     *\r\n     * _.compact([0, 1, false, 2, '', 3]);\r\n     * // => [1, 2, 3]\r\n     */\r\n    function compact(array) {\r\n      var index = -1,\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      while (++index < length) {\r\n        var value = array[index];\r\n        if (value) {\r\n          result.push(value);\r\n        }\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an array excluding all values of the provided arrays using strict\r\n     * equality for comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to process.\r\n     * @param {...Array} [values] The arrays of values to exclude.\r\n     * @returns {Array} Returns a new array of filtered values.\r\n     * @example\r\n     *\r\n     * _.difference([1, 2, 3, 4, 5], [5, 2, 10]);\r\n     * // => [1, 3, 4]\r\n     */\r\n    function difference(array) {\r\n      return baseDifference(array, baseFlatten(arguments, true, true, 1));\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.find` except that it returns the index of the first\r\n     * element that passes the callback check, instead of the element itself.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to search.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {number} Returns the index of the found element, else `-1`.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',    'age': 40, 'blocked': true },\r\n     *   { 'name': 'pebbles', 'age': 1,  'blocked': false }\r\n     * ];\r\n     *\r\n     * _.findIndex(characters, function(chr) {\r\n     *   return chr.age < 20;\r\n     * });\r\n     * // => 2\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.findIndex(characters, { 'age': 36 });\r\n     * // => 0\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.findIndex(characters, 'blocked');\r\n     * // => 1\r\n     */\r\n    function findIndex(array, callback, thisArg) {\r\n      var index = -1,\r\n          length = array ? array.length : 0;\r\n\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      while (++index < length) {\r\n        if (callback(array[index], index, array)) {\r\n          return index;\r\n        }\r\n      }\r\n      return -1;\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.findIndex` except that it iterates over elements\r\n     * of a `collection` from right to left.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to search.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {number} Returns the index of the found element, else `-1`.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36, 'blocked': true },\r\n     *   { 'name': 'fred',    'age': 40, 'blocked': false },\r\n     *   { 'name': 'pebbles', 'age': 1,  'blocked': true }\r\n     * ];\r\n     *\r\n     * _.findLastIndex(characters, function(chr) {\r\n     *   return chr.age > 30;\r\n     * });\r\n     * // => 1\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.findLastIndex(characters, { 'age': 36 });\r\n     * // => 0\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.findLastIndex(characters, 'blocked');\r\n     * // => 2\r\n     */\r\n    function findLastIndex(array, callback, thisArg) {\r\n      var length = array ? array.length : 0;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      while (length--) {\r\n        if (callback(array[length], length, array)) {\r\n          return length;\r\n        }\r\n      }\r\n      return -1;\r\n    }\r\n\r\n    /**\r\n     * Gets the first element or first `n` elements of an array. If a callback\r\n     * is provided elements at the beginning of the array are returned as long\r\n     * as the callback returns truey. The callback is bound to `thisArg` and\r\n     * invoked with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias head, take\r\n     * @category Arrays\r\n     * @param {Array} array The array to query.\r\n     * @param {Function|Object|number|string} [callback] The function called\r\n     *  per element or the number of elements to return. If a property name or\r\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\r\n     *  style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the first element(s) of `array`.\r\n     * @example\r\n     *\r\n     * _.first([1, 2, 3]);\r\n     * // => 1\r\n     *\r\n     * _.first([1, 2, 3], 2);\r\n     * // => [1, 2]\r\n     *\r\n     * _.first([1, 2, 3], function(num) {\r\n     *   return num < 3;\r\n     * });\r\n     * // => [1, 2]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'blocked': true,  'employer': 'slate' },\r\n     *   { 'name': 'fred',    'blocked': false, 'employer': 'slate' },\r\n     *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.first(characters, 'blocked');\r\n     * // => [{ 'name': 'barney', 'blocked': true, 'employer': 'slate' }]\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.pluck(_.first(characters, { 'employer': 'slate' }), 'name');\r\n     * // => ['barney', 'fred']\r\n     */\r\n    function first(array, callback, thisArg) {\r\n      var n = 0,\r\n          length = array ? array.length : 0;\r\n\r\n      if (typeof callback != 'number' && callback != null) {\r\n        var index = -1;\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        while (++index < length && callback(array[index], index, array)) {\r\n          n++;\r\n        }\r\n      } else {\r\n        n = callback;\r\n        if (n == null || thisArg) {\r\n          return array ? array[0] : undefined;\r\n        }\r\n      }\r\n      return slice(array, 0, nativeMin(nativeMax(0, n), length));\r\n    }\r\n\r\n    /**\r\n     * Flattens a nested array (the nesting can be to any depth). If `isShallow`\r\n     * is truey, the array will only be flattened a single level. If a callback\r\n     * is provided each element of the array is passed through the callback before\r\n     * flattening. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to flatten.\r\n     * @param {boolean} [isShallow=false] A flag to restrict flattening to a single level.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new flattened array.\r\n     * @example\r\n     *\r\n     * _.flatten([1, [2], [3, [[4]]]]);\r\n     * // => [1, 2, 3, 4];\r\n     *\r\n     * _.flatten([1, [2], [3, [[4]]]], true);\r\n     * // => [1, 2, 3, [[4]]];\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 30, 'pets': ['hoppy'] },\r\n     *   { 'name': 'fred',   'age': 40, 'pets': ['baby puss', 'dino'] }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.flatten(characters, 'pets');\r\n     * // => ['hoppy', 'baby puss', 'dino']\r\n     */\r\n    function flatten(array, isShallow, callback, thisArg) {\r\n      // juggle arguments\r\n      if (typeof isShallow != 'boolean' && isShallow != null) {\r\n        thisArg = callback;\r\n        callback = (typeof isShallow != 'function' && thisArg && thisArg[isShallow] === array) ? null : isShallow;\r\n        isShallow = false;\r\n      }\r\n      if (callback != null) {\r\n        array = map(array, callback, thisArg);\r\n      }\r\n      return baseFlatten(array, isShallow);\r\n    }\r\n\r\n    /**\r\n     * Gets the index at which the first occurrence of `value` is found using\r\n     * strict equality for comparisons, i.e. `===`. If the array is already sorted\r\n     * providing `true` for `fromIndex` will run a faster binary search.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to search.\r\n     * @param {*} value The value to search for.\r\n     * @param {boolean|number} [fromIndex=0] The index to search from or `true`\r\n     *  to perform a binary search on a sorted array.\r\n     * @returns {number} Returns the index of the matched value or `-1`.\r\n     * @example\r\n     *\r\n     * _.indexOf([1, 2, 3, 1, 2, 3], 2);\r\n     * // => 1\r\n     *\r\n     * _.indexOf([1, 2, 3, 1, 2, 3], 2, 3);\r\n     * // => 4\r\n     *\r\n     * _.indexOf([1, 1, 2, 2, 3, 3], 2, true);\r\n     * // => 2\r\n     */\r\n    function indexOf(array, value, fromIndex) {\r\n      if (typeof fromIndex == 'number') {\r\n        var length = array ? array.length : 0;\r\n        fromIndex = (fromIndex < 0 ? nativeMax(0, length + fromIndex) : fromIndex || 0);\r\n      } else if (fromIndex) {\r\n        var index = sortedIndex(array, value);\r\n        return array[index] === value ? index : -1;\r\n      }\r\n      return baseIndexOf(array, value, fromIndex);\r\n    }\r\n\r\n    /**\r\n     * Gets all but the last element or last `n` elements of an array. If a\r\n     * callback is provided elements at the end of the array are excluded from\r\n     * the result as long as the callback returns truey. The callback is bound\r\n     * to `thisArg` and invoked with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to query.\r\n     * @param {Function|Object|number|string} [callback=1] The function called\r\n     *  per element or the number of elements to exclude. If a property name or\r\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\r\n     *  style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a slice of `array`.\r\n     * @example\r\n     *\r\n     * _.initial([1, 2, 3]);\r\n     * // => [1, 2]\r\n     *\r\n     * _.initial([1, 2, 3], 2);\r\n     * // => [1]\r\n     *\r\n     * _.initial([1, 2, 3], function(num) {\r\n     *   return num > 1;\r\n     * });\r\n     * // => [1]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'blocked': false, 'employer': 'slate' },\r\n     *   { 'name': 'fred',    'blocked': true,  'employer': 'slate' },\r\n     *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.initial(characters, 'blocked');\r\n     * // => [{ 'name': 'barney',  'blocked': false, 'employer': 'slate' }]\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.pluck(_.initial(characters, { 'employer': 'na' }), 'name');\r\n     * // => ['barney', 'fred']\r\n     */\r\n    function initial(array, callback, thisArg) {\r\n      var n = 0,\r\n          length = array ? array.length : 0;\r\n\r\n      if (typeof callback != 'number' && callback != null) {\r\n        var index = length;\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        while (index-- && callback(array[index], index, array)) {\r\n          n++;\r\n        }\r\n      } else {\r\n        n = (callback == null || thisArg) ? 1 : callback || n;\r\n      }\r\n      return slice(array, 0, nativeMin(nativeMax(0, length - n), length));\r\n    }\r\n\r\n    /**\r\n     * Creates an array of unique values present in all provided arrays using\r\n     * strict equality for comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {...Array} [array] The arrays to inspect.\r\n     * @returns {Array} Returns an array of shared values.\r\n     * @example\r\n     *\r\n     * _.intersection([1, 2, 3], [5, 2, 1, 4], [2, 1]);\r\n     * // => [1, 2]\r\n     */\r\n    function intersection() {\r\n      var args = [],\r\n          argsIndex = -1,\r\n          argsLength = arguments.length,\r\n          caches = getArray(),\r\n          indexOf = getIndexOf(),\r\n          trustIndexOf = indexOf === baseIndexOf,\r\n          seen = getArray();\r\n\r\n      while (++argsIndex < argsLength) {\r\n        var value = arguments[argsIndex];\r\n        if (isArray(value) || isArguments(value)) {\r\n          args.push(value);\r\n          caches.push(trustIndexOf && value.length >= largeArraySize &&\r\n            createCache(argsIndex ? args[argsIndex] : seen));\r\n        }\r\n      }\r\n      var array = args[0],\r\n          index = -1,\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      outer:\r\n      while (++index < length) {\r\n        var cache = caches[0];\r\n        value = array[index];\r\n\r\n        if ((cache ? cacheIndexOf(cache, value) : indexOf(seen, value)) < 0) {\r\n          argsIndex = argsLength;\r\n          (cache || seen).push(value);\r\n          while (--argsIndex) {\r\n            cache = caches[argsIndex];\r\n            if ((cache ? cacheIndexOf(cache, value) : indexOf(args[argsIndex], value)) < 0) {\r\n              continue outer;\r\n            }\r\n          }\r\n          result.push(value);\r\n        }\r\n      }\r\n      while (argsLength--) {\r\n        cache = caches[argsLength];\r\n        if (cache) {\r\n          releaseObject(cache);\r\n        }\r\n      }\r\n      releaseArray(caches);\r\n      releaseArray(seen);\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Gets the last element or last `n` elements of an array. If a callback is\r\n     * provided elements at the end of the array are returned as long as the\r\n     * callback returns truey. The callback is bound to `thisArg` and invoked\r\n     * with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to query.\r\n     * @param {Function|Object|number|string} [callback] The function called\r\n     *  per element or the number of elements to return. If a property name or\r\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\r\n     *  style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the last element(s) of `array`.\r\n     * @example\r\n     *\r\n     * _.last([1, 2, 3]);\r\n     * // => 3\r\n     *\r\n     * _.last([1, 2, 3], 2);\r\n     * // => [2, 3]\r\n     *\r\n     * _.last([1, 2, 3], function(num) {\r\n     *   return num > 1;\r\n     * });\r\n     * // => [2, 3]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'blocked': false, 'employer': 'slate' },\r\n     *   { 'name': 'fred',    'blocked': true,  'employer': 'slate' },\r\n     *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.pluck(_.last(characters, 'blocked'), 'name');\r\n     * // => ['fred', 'pebbles']\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.last(characters, { 'employer': 'na' });\r\n     * // => [{ 'name': 'pebbles', 'blocked': true, 'employer': 'na' }]\r\n     */\r\n    function last(array, callback, thisArg) {\r\n      var n = 0,\r\n          length = array ? array.length : 0;\r\n\r\n      if (typeof callback != 'number' && callback != null) {\r\n        var index = length;\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        while (index-- && callback(array[index], index, array)) {\r\n          n++;\r\n        }\r\n      } else {\r\n        n = callback;\r\n        if (n == null || thisArg) {\r\n          return array ? array[length - 1] : undefined;\r\n        }\r\n      }\r\n      return slice(array, nativeMax(0, length - n));\r\n    }\r\n\r\n    /**\r\n     * Gets the index at which the last occurrence of `value` is found using strict\r\n     * equality for comparisons, i.e. `===`. If `fromIndex` is negative, it is used\r\n     * as the offset from the end of the collection.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to search.\r\n     * @param {*} value The value to search for.\r\n     * @param {number} [fromIndex=array.length-1] The index to search from.\r\n     * @returns {number} Returns the index of the matched value or `-1`.\r\n     * @example\r\n     *\r\n     * _.lastIndexOf([1, 2, 3, 1, 2, 3], 2);\r\n     * // => 4\r\n     *\r\n     * _.lastIndexOf([1, 2, 3, 1, 2, 3], 2, 3);\r\n     * // => 1\r\n     */\r\n    function lastIndexOf(array, value, fromIndex) {\r\n      var index = array ? array.length : 0;\r\n      if (typeof fromIndex == 'number') {\r\n        index = (fromIndex < 0 ? nativeMax(0, index + fromIndex) : nativeMin(fromIndex, index - 1)) + 1;\r\n      }\r\n      while (index--) {\r\n        if (array[index] === value) {\r\n          return index;\r\n        }\r\n      }\r\n      return -1;\r\n    }\r\n\r\n    /**\r\n     * Removes all provided values from the given array using strict equality for\r\n     * comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to modify.\r\n     * @param {...*} [value] The values to remove.\r\n     * @returns {Array} Returns `array`.\r\n     * @example\r\n     *\r\n     * var array = [1, 2, 3, 1, 2, 3];\r\n     * _.pull(array, 2, 3);\r\n     * console.log(array);\r\n     * // => [1, 1]\r\n     */\r\n    function pull(array) {\r\n      var args = arguments,\r\n          argsIndex = 0,\r\n          argsLength = args.length,\r\n          length = array ? array.length : 0;\r\n\r\n      while (++argsIndex < argsLength) {\r\n        var index = -1,\r\n            value = args[argsIndex];\r\n        while (++index < length) {\r\n          if (array[index] === value) {\r\n            splice.call(array, index--, 1);\r\n            length--;\r\n          }\r\n        }\r\n      }\r\n      return array;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of numbers (positive and/or negative) progressing from\r\n     * `start` up to but not including `end`. If `start` is less than `stop` a\r\n     * zero-length range is created unless a negative `step` is specified.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {number} [start=0] The start of the range.\r\n     * @param {number} end The end of the range.\r\n     * @param {number} [step=1] The value to increment or decrement by.\r\n     * @returns {Array} Returns a new range array.\r\n     * @example\r\n     *\r\n     * _.range(4);\r\n     * // => [0, 1, 2, 3]\r\n     *\r\n     * _.range(1, 5);\r\n     * // => [1, 2, 3, 4]\r\n     *\r\n     * _.range(0, 20, 5);\r\n     * // => [0, 5, 10, 15]\r\n     *\r\n     * _.range(0, -4, -1);\r\n     * // => [0, -1, -2, -3]\r\n     *\r\n     * _.range(1, 4, 0);\r\n     * // => [1, 1, 1]\r\n     *\r\n     * _.range(0);\r\n     * // => []\r\n     */\r\n    function range(start, end, step) {\r\n      start = +start || 0;\r\n      step = typeof step == 'number' ? step : (+step || 1);\r\n\r\n      if (end == null) {\r\n        end = start;\r\n        start = 0;\r\n      }\r\n      // use `Array(length)` so engines like Chakra and V8 avoid slower modes\r\n      // http://youtu.be/XAqIpGU8ZZk#t=17m25s\r\n      var index = -1,\r\n          length = nativeMax(0, ceil((end - start) / (step || 1))),\r\n          result = Array(length);\r\n\r\n      while (++index < length) {\r\n        result[index] = start;\r\n        start += step;\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Removes all elements from an array that the callback returns truey for\r\n     * and returns an array of removed elements. The callback is bound to `thisArg`\r\n     * and invoked with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to modify.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of removed elements.\r\n     * @example\r\n     *\r\n     * var array = [1, 2, 3, 4, 5, 6];\r\n     * var evens = _.remove(array, function(num) { return num % 2 == 0; });\r\n     *\r\n     * console.log(array);\r\n     * // => [1, 3, 5]\r\n     *\r\n     * console.log(evens);\r\n     * // => [2, 4, 6]\r\n     */\r\n    function remove(array, callback, thisArg) {\r\n      var index = -1,\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      while (++index < length) {\r\n        var value = array[index];\r\n        if (callback(value, index, array)) {\r\n          result.push(value);\r\n          splice.call(array, index--, 1);\r\n          length--;\r\n        }\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The opposite of `_.initial` this method gets all but the first element or\r\n     * first `n` elements of an array. If a callback function is provided elements\r\n     * at the beginning of the array are excluded from the result as long as the\r\n     * callback returns truey. The callback is bound to `thisArg` and invoked\r\n     * with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias drop, tail\r\n     * @category Arrays\r\n     * @param {Array} array The array to query.\r\n     * @param {Function|Object|number|string} [callback=1] The function called\r\n     *  per element or the number of elements to exclude. If a property name or\r\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\r\n     *  style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a slice of `array`.\r\n     * @example\r\n     *\r\n     * _.rest([1, 2, 3]);\r\n     * // => [2, 3]\r\n     *\r\n     * _.rest([1, 2, 3], 2);\r\n     * // => [3]\r\n     *\r\n     * _.rest([1, 2, 3], function(num) {\r\n     *   return num < 3;\r\n     * });\r\n     * // => [3]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'blocked': true,  'employer': 'slate' },\r\n     *   { 'name': 'fred',    'blocked': false,  'employer': 'slate' },\r\n     *   { 'name': 'pebbles', 'blocked': true, 'employer': 'na' }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.pluck(_.rest(characters, 'blocked'), 'name');\r\n     * // => ['fred', 'pebbles']\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.rest(characters, { 'employer': 'slate' });\r\n     * // => [{ 'name': 'pebbles', 'blocked': true, 'employer': 'na' }]\r\n     */\r\n    function rest(array, callback, thisArg) {\r\n      if (typeof callback != 'number' && callback != null) {\r\n        var n = 0,\r\n            index = -1,\r\n            length = array ? array.length : 0;\r\n\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        while (++index < length && callback(array[index], index, array)) {\r\n          n++;\r\n        }\r\n      } else {\r\n        n = (callback == null || thisArg) ? 1 : nativeMax(0, callback);\r\n      }\r\n      return slice(array, n);\r\n    }\r\n\r\n    /**\r\n     * Uses a binary search to determine the smallest index at which a value\r\n     * should be inserted into a given sorted array in order to maintain the sort\r\n     * order of the array. If a callback is provided it will be executed for\r\n     * `value` and each element of `array` to compute their sort ranking. The\r\n     * callback is bound to `thisArg` and invoked with one argument; (value).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to inspect.\r\n     * @param {*} value The value to evaluate.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {number} Returns the index at which `value` should be inserted\r\n     *  into `array`.\r\n     * @example\r\n     *\r\n     * _.sortedIndex([20, 30, 50], 40);\r\n     * // => 2\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.sortedIndex([{ 'x': 20 }, { 'x': 30 }, { 'x': 50 }], { 'x': 40 }, 'x');\r\n     * // => 2\r\n     *\r\n     * var dict = {\r\n     *   'wordToNumber': { 'twenty': 20, 'thirty': 30, 'fourty': 40, 'fifty': 50 }\r\n     * };\r\n     *\r\n     * _.sortedIndex(['twenty', 'thirty', 'fifty'], 'fourty', function(word) {\r\n     *   return dict.wordToNumber[word];\r\n     * });\r\n     * // => 2\r\n     *\r\n     * _.sortedIndex(['twenty', 'thirty', 'fifty'], 'fourty', function(word) {\r\n     *   return this.wordToNumber[word];\r\n     * }, dict);\r\n     * // => 2\r\n     */\r\n    function sortedIndex(array, value, callback, thisArg) {\r\n      var low = 0,\r\n          high = array ? array.length : low;\r\n\r\n      // explicitly reference `identity` for better inlining in Firefox\r\n      callback = callback ? lodash.createCallback(callback, thisArg, 1) : identity;\r\n      value = callback(value);\r\n\r\n      while (low < high) {\r\n        var mid = (low + high) >>> 1;\r\n        (callback(array[mid]) < value)\r\n          ? low = mid + 1\r\n          : high = mid;\r\n      }\r\n      return low;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of unique values, in order, of the provided arrays using\r\n     * strict equality for comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {...Array} [array] The arrays to inspect.\r\n     * @returns {Array} Returns an array of combined values.\r\n     * @example\r\n     *\r\n     * _.union([1, 2, 3], [5, 2, 1, 4], [2, 1]);\r\n     * // => [1, 2, 3, 5, 4]\r\n     */\r\n    function union() {\r\n      return baseUniq(baseFlatten(arguments, true, true));\r\n    }\r\n\r\n    /**\r\n     * Creates a duplicate-value-free version of an array using strict equality\r\n     * for comparisons, i.e. `===`. If the array is sorted, providing\r\n     * `true` for `isSorted` will use a faster algorithm. If a callback is provided\r\n     * each element of `array` is passed through the callback before uniqueness\r\n     * is computed. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias unique\r\n     * @category Arrays\r\n     * @param {Array} array The array to process.\r\n     * @param {boolean} [isSorted=false] A flag to indicate that `array` is sorted.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a duplicate-value-free array.\r\n     * @example\r\n     *\r\n     * _.uniq([1, 2, 1, 3, 1]);\r\n     * // => [1, 2, 3]\r\n     *\r\n     * _.uniq([1, 1, 2, 2, 3], true);\r\n     * // => [1, 2, 3]\r\n     *\r\n     * _.uniq(['A', 'b', 'C', 'a', 'B', 'c'], function(letter) { return letter.toLowerCase(); });\r\n     * // => ['A', 'b', 'C']\r\n     *\r\n     * _.uniq([1, 2.5, 3, 1.5, 2, 3.5], function(num) { return this.floor(num); }, Math);\r\n     * // => [1, 2.5, 3]\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.uniq([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');\r\n     * // => [{ 'x': 1 }, { 'x': 2 }]\r\n     */\r\n    function uniq(array, isSorted, callback, thisArg) {\r\n      // juggle arguments\r\n      if (typeof isSorted != 'boolean' && isSorted != null) {\r\n        thisArg = callback;\r\n        callback = (typeof isSorted != 'function' && thisArg && thisArg[isSorted] === array) ? null : isSorted;\r\n        isSorted = false;\r\n      }\r\n      if (callback != null) {\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n      }\r\n      return baseUniq(array, isSorted, callback);\r\n    }\r\n\r\n    /**\r\n     * Creates an array excluding all provided values using strict equality for\r\n     * comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to filter.\r\n     * @param {...*} [value] The values to exclude.\r\n     * @returns {Array} Returns a new array of filtered values.\r\n     * @example\r\n     *\r\n     * _.without([1, 2, 1, 0, 3, 1, 4], 0, 1);\r\n     * // => [2, 3, 4]\r\n     */\r\n    function without(array) {\r\n      return baseDifference(array, slice(arguments, 1));\r\n    }\r\n\r\n    /**\r\n     * Creates an array that is the symmetric difference of the provided arrays.\r\n     * See http://en.wikipedia.org/wiki/Symmetric_difference.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {...Array} [array] The arrays to inspect.\r\n     * @returns {Array} Returns an array of values.\r\n     * @example\r\n     *\r\n     * _.xor([1, 2, 3], [5, 2, 1, 4]);\r\n     * // => [3, 5, 4]\r\n     *\r\n     * _.xor([1, 2, 5], [2, 3, 5], [3, 4, 5]);\r\n     * // => [1, 4, 5]\r\n     */\r\n    function xor() {\r\n      var index = -1,\r\n          length = arguments.length;\r\n\r\n      while (++index < length) {\r\n        var array = arguments[index];\r\n        if (isArray(array) || isArguments(array)) {\r\n          var result = result\r\n            ? baseUniq(baseDifference(result, array).concat(baseDifference(array, result)))\r\n            : array;\r\n        }\r\n      }\r\n      return result || [];\r\n    }\r\n\r\n    /**\r\n     * Creates an array of grouped elements, the first of which contains the first\r\n     * elements of the given arrays, the second of which contains the second\r\n     * elements of the given arrays, and so on.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias unzip\r\n     * @category Arrays\r\n     * @param {...Array} [array] Arrays to process.\r\n     * @returns {Array} Returns a new array of grouped elements.\r\n     * @example\r\n     *\r\n     * _.zip(['fred', 'barney'], [30, 40], [true, false]);\r\n     * // => [['fred', 30, true], ['barney', 40, false]]\r\n     */\r\n    function zip() {\r\n      var array = arguments.length > 1 ? arguments : arguments[0],\r\n          index = -1,\r\n          length = array ? max(pluck(array, 'length')) : 0,\r\n          result = Array(length < 0 ? 0 : length);\r\n\r\n      while (++index < length) {\r\n        result[index] = pluck(array, index);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an object composed from arrays of `keys` and `values`. Provide\r\n     * either a single two dimensional array, i.e. `[[key1, value1], [key2, value2]]`\r\n     * or two arrays, one of `keys` and one of corresponding `values`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias object\r\n     * @category Arrays\r\n     * @param {Array} keys The array of keys.\r\n     * @param {Array} [values=[]] The array of values.\r\n     * @returns {Object} Returns an object composed of the given keys and\r\n     *  corresponding values.\r\n     * @example\r\n     *\r\n     * _.zipObject(['fred', 'barney'], [30, 40]);\r\n     * // => { 'fred': 30, 'barney': 40 }\r\n     */\r\n    function zipObject(keys, values) {\r\n      var index = -1,\r\n          length = keys ? keys.length : 0,\r\n          result = {};\r\n\r\n      if (!values && length && !isArray(keys[0])) {\r\n        values = [];\r\n      }\r\n      while (++index < length) {\r\n        var key = keys[index];\r\n        if (values) {\r\n          result[key] = values[index];\r\n        } else if (key) {\r\n          result[key[0]] = key[1];\r\n        }\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates a function that executes `func`, with  the `this` binding and\r\n     * arguments of the created function, only after being called `n` times.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {number} n The number of times the function must be called before\r\n     *  `func` is executed.\r\n     * @param {Function} func The function to restrict.\r\n     * @returns {Function} Returns the new restricted function.\r\n     * @example\r\n     *\r\n     * var saves = ['profile', 'settings'];\r\n     *\r\n     * var done = _.after(saves.length, function() {\r\n     *   console.log('Done saving!');\r\n     * });\r\n     *\r\n     * _.forEach(saves, function(type) {\r\n     *   asyncSave({ 'type': type, 'complete': done });\r\n     * });\r\n     * // => logs 'Done saving!', after all saves have completed\r\n     */\r\n    function after(n, func) {\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      return function() {\r\n        if (--n < 1) {\r\n          return func.apply(this, arguments);\r\n        }\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when called, invokes `func` with the `this`\r\n     * binding of `thisArg` and prepends any additional `bind` arguments to those\r\n     * provided to the bound function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to bind.\r\n     * @param {*} [thisArg] The `this` binding of `func`.\r\n     * @param {...*} [arg] Arguments to be partially applied.\r\n     * @returns {Function} Returns the new bound function.\r\n     * @example\r\n     *\r\n     * var func = function(greeting) {\r\n     *   return greeting + ' ' + this.name;\r\n     * };\r\n     *\r\n     * func = _.bind(func, { 'name': 'fred' }, 'hi');\r\n     * func();\r\n     * // => 'hi fred'\r\n     */\r\n    function bind(func, thisArg) {\r\n      return arguments.length > 2\r\n        ? createWrapper(func, 17, slice(arguments, 2), null, thisArg)\r\n        : createWrapper(func, 1, null, null, thisArg);\r\n    }\r\n\r\n    /**\r\n     * Binds methods of an object to the object itself, overwriting the existing\r\n     * method. Method names may be specified as individual arguments or as arrays\r\n     * of method names. If no method names are provided all the function properties\r\n     * of `object` will be bound.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Object} object The object to bind and assign the bound methods to.\r\n     * @param {...string} [methodName] The object method names to\r\n     *  bind, specified as individual method names or arrays of method names.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * var view = {\r\n     *   'label': 'docs',\r\n     *   'onClick': function() { console.log('clicked ' + this.label); }\r\n     * };\r\n     *\r\n     * _.bindAll(view);\r\n     * jQuery('#docs').on('click', view.onClick);\r\n     * // => logs 'clicked docs', when the button is clicked\r\n     */\r\n    function bindAll(object) {\r\n      var funcs = arguments.length > 1 ? baseFlatten(arguments, true, false, 1) : functions(object),\r\n          index = -1,\r\n          length = funcs.length;\r\n\r\n      while (++index < length) {\r\n        var key = funcs[index];\r\n        object[key] = createWrapper(object[key], 1, null, null, object);\r\n      }\r\n      return object;\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when called, invokes the method at `object[key]`\r\n     * and prepends any additional `bindKey` arguments to those provided to the bound\r\n     * function. This method differs from `_.bind` by allowing bound functions to\r\n     * reference methods that will be redefined or don't yet exist.\r\n     * See http://michaux.ca/articles/lazy-function-definition-pattern.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Object} object The object the method belongs to.\r\n     * @param {string} key The key of the method.\r\n     * @param {...*} [arg] Arguments to be partially applied.\r\n     * @returns {Function} Returns the new bound function.\r\n     * @example\r\n     *\r\n     * var object = {\r\n     *   'name': 'fred',\r\n     *   'greet': function(greeting) {\r\n     *     return greeting + ' ' + this.name;\r\n     *   }\r\n     * };\r\n     *\r\n     * var func = _.bindKey(object, 'greet', 'hi');\r\n     * func();\r\n     * // => 'hi fred'\r\n     *\r\n     * object.greet = function(greeting) {\r\n     *   return greeting + 'ya ' + this.name + '!';\r\n     * };\r\n     *\r\n     * func();\r\n     * // => 'hiya fred!'\r\n     */\r\n    function bindKey(object, key) {\r\n      return arguments.length > 2\r\n        ? createWrapper(key, 19, slice(arguments, 2), null, object)\r\n        : createWrapper(key, 3, null, null, object);\r\n    }\r\n\r\n    /**\r\n     * Creates a function that is the composition of the provided functions,\r\n     * where each function consumes the return value of the function that follows.\r\n     * For example, composing the functions `f()`, `g()`, and `h()` produces `f(g(h()))`.\r\n     * Each function is executed with the `this` binding of the composed function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {...Function} [func] Functions to compose.\r\n     * @returns {Function} Returns the new composed function.\r\n     * @example\r\n     *\r\n     * var realNameMap = {\r\n     *   'pebbles': 'penelope'\r\n     * };\r\n     *\r\n     * var format = function(name) {\r\n     *   name = realNameMap[name.toLowerCase()] || name;\r\n     *   return name.charAt(0).toUpperCase() + name.slice(1).toLowerCase();\r\n     * };\r\n     *\r\n     * var greet = function(formatted) {\r\n     *   return 'Hiya ' + formatted + '!';\r\n     * };\r\n     *\r\n     * var welcome = _.compose(greet, format);\r\n     * welcome('pebbles');\r\n     * // => 'Hiya Penelope!'\r\n     */\r\n    function compose() {\r\n      var funcs = arguments,\r\n          length = funcs.length;\r\n\r\n      while (length--) {\r\n        if (!isFunction(funcs[length])) {\r\n          throw new TypeError;\r\n        }\r\n      }\r\n      return function() {\r\n        var args = arguments,\r\n            length = funcs.length;\r\n\r\n        while (length--) {\r\n          args = [funcs[length].apply(this, args)];\r\n        }\r\n        return args[0];\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Creates a function which accepts one or more arguments of `func` that when\r\n     * invoked either executes `func` returning its result, if all `func` arguments\r\n     * have been provided, or returns a function that accepts one or more of the\r\n     * remaining `func` arguments, and so on. The arity of `func` can be specified\r\n     * if `func.length` is not sufficient.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to curry.\r\n     * @param {number} [arity=func.length] The arity of `func`.\r\n     * @returns {Function} Returns the new curried function.\r\n     * @example\r\n     *\r\n     * var curried = _.curry(function(a, b, c) {\r\n     *   console.log(a + b + c);\r\n     * });\r\n     *\r\n     * curried(1)(2)(3);\r\n     * // => 6\r\n     *\r\n     * curried(1, 2)(3);\r\n     * // => 6\r\n     *\r\n     * curried(1, 2, 3);\r\n     * // => 6\r\n     */\r\n    function curry(func, arity) {\r\n      arity = typeof arity == 'number' ? arity : (+arity || func.length);\r\n      return createWrapper(func, 4, null, null, null, arity);\r\n    }\r\n\r\n    /**\r\n     * Creates a function that will delay the execution of `func` until after\r\n     * `wait` milliseconds have elapsed since the last time it was invoked.\r\n     * Provide an options object to indicate that `func` should be invoked on\r\n     * the leading and/or trailing edge of the `wait` timeout. Subsequent calls\r\n     * to the debounced function will return the result of the last `func` call.\r\n     *\r\n     * Note: If `leading` and `trailing` options are `true` `func` will be called\r\n     * on the trailing edge of the timeout only if the the debounced function is\r\n     * invoked more than once during the `wait` timeout.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to debounce.\r\n     * @param {number} wait The number of milliseconds to delay.\r\n     * @param {Object} [options] The options object.\r\n     * @param {boolean} [options.leading=false] Specify execution on the leading edge of the timeout.\r\n     * @param {number} [options.maxWait] The maximum time `func` is allowed to be delayed before it's called.\r\n     * @param {boolean} [options.trailing=true] Specify execution on the trailing edge of the timeout.\r\n     * @returns {Function} Returns the new debounced function.\r\n     * @example\r\n     *\r\n     * // avoid costly calculations while the window size is in flux\r\n     * var lazyLayout = _.debounce(calculateLayout, 150);\r\n     * jQuery(window).on('resize', lazyLayout);\r\n     *\r\n     * // execute `sendMail` when the click event is fired, debouncing subsequent calls\r\n     * jQuery('#postbox').on('click', _.debounce(sendMail, 300, {\r\n     *   'leading': true,\r\n     *   'trailing': false\r\n     * });\r\n     *\r\n     * // ensure `batchLog` is executed once after 1 second of debounced calls\r\n     * var source = new EventSource('/stream');\r\n     * source.addEventListener('message', _.debounce(batchLog, 250, {\r\n     *   'maxWait': 1000\r\n     * }, false);\r\n     */\r\n    function debounce(func, wait, options) {\r\n      var args,\r\n          maxTimeoutId,\r\n          result,\r\n          stamp,\r\n          thisArg,\r\n          timeoutId,\r\n          trailingCall,\r\n          lastCalled = 0,\r\n          maxWait = false,\r\n          trailing = true;\r\n\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      wait = nativeMax(0, wait) || 0;\r\n      if (options === true) {\r\n        var leading = true;\r\n        trailing = false;\r\n      } else if (isObject(options)) {\r\n        leading = options.leading;\r\n        maxWait = 'maxWait' in options && (nativeMax(wait, options.maxWait) || 0);\r\n        trailing = 'trailing' in options ? options.trailing : trailing;\r\n      }\r\n      var delayed = function() {\r\n        var remaining = wait - (now() - stamp);\r\n        if (remaining <= 0) {\r\n          if (maxTimeoutId) {\r\n            clearTimeout(maxTimeoutId);\r\n          }\r\n          var isCalled = trailingCall;\r\n          maxTimeoutId = timeoutId = trailingCall = undefined;\r\n          if (isCalled) {\r\n            lastCalled = now();\r\n            result = func.apply(thisArg, args);\r\n            if (!timeoutId && !maxTimeoutId) {\r\n              args = thisArg = null;\r\n            }\r\n          }\r\n        } else {\r\n          timeoutId = setTimeout(delayed, remaining);\r\n        }\r\n      };\r\n\r\n      var maxDelayed = function() {\r\n        if (timeoutId) {\r\n          clearTimeout(timeoutId);\r\n        }\r\n        maxTimeoutId = timeoutId = trailingCall = undefined;\r\n        if (trailing || (maxWait !== wait)) {\r\n          lastCalled = now();\r\n          result = func.apply(thisArg, args);\r\n          if (!timeoutId && !maxTimeoutId) {\r\n            args = thisArg = null;\r\n          }\r\n        }\r\n      };\r\n\r\n      return function() {\r\n        args = arguments;\r\n        stamp = now();\r\n        thisArg = this;\r\n        trailingCall = trailing && (timeoutId || !leading);\r\n\r\n        if (maxWait === false) {\r\n          var leadingCall = leading && !timeoutId;\r\n        } else {\r\n          if (!maxTimeoutId && !leading) {\r\n            lastCalled = stamp;\r\n          }\r\n          var remaining = maxWait - (stamp - lastCalled),\r\n              isCalled = remaining <= 0;\r\n\r\n          if (isCalled) {\r\n            if (maxTimeoutId) {\r\n              maxTimeoutId = clearTimeout(maxTimeoutId);\r\n            }\r\n            lastCalled = stamp;\r\n            result = func.apply(thisArg, args);\r\n          }\r\n          else if (!maxTimeoutId) {\r\n            maxTimeoutId = setTimeout(maxDelayed, remaining);\r\n          }\r\n        }\r\n        if (isCalled && timeoutId) {\r\n          timeoutId = clearTimeout(timeoutId);\r\n        }\r\n        else if (!timeoutId && wait !== maxWait) {\r\n          timeoutId = setTimeout(delayed, wait);\r\n        }\r\n        if (leadingCall) {\r\n          isCalled = true;\r\n          result = func.apply(thisArg, args);\r\n        }\r\n        if (isCalled && !timeoutId && !maxTimeoutId) {\r\n          args = thisArg = null;\r\n        }\r\n        return result;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Defers executing the `func` function until the current call stack has cleared.\r\n     * Additional arguments will be provided to `func` when it is invoked.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to defer.\r\n     * @param {...*} [arg] Arguments to invoke the function with.\r\n     * @returns {number} Returns the timer id.\r\n     * @example\r\n     *\r\n     * _.defer(function(text) { console.log(text); }, 'deferred');\r\n     * // logs 'deferred' after one or more milliseconds\r\n     */\r\n    function defer(func) {\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      var args = slice(arguments, 1);\r\n      return setTimeout(function() { func.apply(undefined, args); }, 1);\r\n    }\r\n\r\n    /**\r\n     * Executes the `func` function after `wait` milliseconds. Additional arguments\r\n     * will be provided to `func` when it is invoked.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to delay.\r\n     * @param {number} wait The number of milliseconds to delay execution.\r\n     * @param {...*} [arg] Arguments to invoke the function with.\r\n     * @returns {number} Returns the timer id.\r\n     * @example\r\n     *\r\n     * _.delay(function(text) { console.log(text); }, 1000, 'later');\r\n     * // => logs 'later' after one second\r\n     */\r\n    function delay(func, wait) {\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      var args = slice(arguments, 2);\r\n      return setTimeout(function() { func.apply(undefined, args); }, wait);\r\n    }\r\n\r\n    /**\r\n     * Creates a function that memoizes the result of `func`. If `resolver` is\r\n     * provided it will be used to determine the cache key for storing the result\r\n     * based on the arguments provided to the memoized function. By default, the\r\n     * first argument provided to the memoized function is used as the cache key.\r\n     * The `func` is executed with the `this` binding of the memoized function.\r\n     * The result cache is exposed as the `cache` property on the memoized function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to have its output memoized.\r\n     * @param {Function} [resolver] A function used to resolve the cache key.\r\n     * @returns {Function} Returns the new memoizing function.\r\n     * @example\r\n     *\r\n     * var fibonacci = _.memoize(function(n) {\r\n     *   return n < 2 ? n : fibonacci(n - 1) + fibonacci(n - 2);\r\n     * });\r\n     *\r\n     * fibonacci(9)\r\n     * // => 34\r\n     *\r\n     * var data = {\r\n     *   'fred': { 'name': 'fred', 'age': 40 },\r\n     *   'pebbles': { 'name': 'pebbles', 'age': 1 }\r\n     * };\r\n     *\r\n     * // modifying the result cache\r\n     * var get = _.memoize(function(name) { return data[name]; }, _.identity);\r\n     * get('pebbles');\r\n     * // => { 'name': 'pebbles', 'age': 1 }\r\n     *\r\n     * get.cache.pebbles.name = 'penelope';\r\n     * get('pebbles');\r\n     * // => { 'name': 'penelope', 'age': 1 }\r\n     */\r\n    function memoize(func, resolver) {\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      var memoized = function() {\r\n        var cache = memoized.cache,\r\n            key = resolver ? resolver.apply(this, arguments) : keyPrefix + arguments[0];\r\n\r\n        return hasOwnProperty.call(cache, key)\r\n          ? cache[key]\r\n          : (cache[key] = func.apply(this, arguments));\r\n      }\r\n      memoized.cache = {};\r\n      return memoized;\r\n    }\r\n\r\n    /**\r\n     * Creates a function that is restricted to execute `func` once. Repeat calls to\r\n     * the function will return the value of the first call. The `func` is executed\r\n     * with the `this` binding of the created function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to restrict.\r\n     * @returns {Function} Returns the new restricted function.\r\n     * @example\r\n     *\r\n     * var initialize = _.once(createApplication);\r\n     * initialize();\r\n     * initialize();\r\n     * // `initialize` executes `createApplication` once\r\n     */\r\n    function once(func) {\r\n      var ran,\r\n          result;\r\n\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      return function() {\r\n        if (ran) {\r\n          return result;\r\n        }\r\n        ran = true;\r\n        result = func.apply(this, arguments);\r\n\r\n        // clear the `func` variable so the function may be garbage collected\r\n        func = null;\r\n        return result;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when called, invokes `func` with any additional\r\n     * `partial` arguments prepended to those provided to the new function. This\r\n     * method is similar to `_.bind` except it does **not** alter the `this` binding.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to partially apply arguments to.\r\n     * @param {...*} [arg] Arguments to be partially applied.\r\n     * @returns {Function} Returns the new partially applied function.\r\n     * @example\r\n     *\r\n     * var greet = function(greeting, name) { return greeting + ' ' + name; };\r\n     * var hi = _.partial(greet, 'hi');\r\n     * hi('fred');\r\n     * // => 'hi fred'\r\n     */\r\n    function partial(func) {\r\n      return createWrapper(func, 16, slice(arguments, 1));\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.partial` except that `partial` arguments are\r\n     * appended to those provided to the new function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to partially apply arguments to.\r\n     * @param {...*} [arg] Arguments to be partially applied.\r\n     * @returns {Function} Returns the new partially applied function.\r\n     * @example\r\n     *\r\n     * var defaultsDeep = _.partialRight(_.merge, _.defaults);\r\n     *\r\n     * var options = {\r\n     *   'variable': 'data',\r\n     *   'imports': { 'jq': $ }\r\n     * };\r\n     *\r\n     * defaultsDeep(options, _.templateSettings);\r\n     *\r\n     * options.variable\r\n     * // => 'data'\r\n     *\r\n     * options.imports\r\n     * // => { '_': _, 'jq': $ }\r\n     */\r\n    function partialRight(func) {\r\n      return createWrapper(func, 32, null, slice(arguments, 1));\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when executed, will only call the `func` function\r\n     * at most once per every `wait` milliseconds. Provide an options object to\r\n     * indicate that `func` should be invoked on the leading and/or trailing edge\r\n     * of the `wait` timeout. Subsequent calls to the throttled function will\r\n     * return the result of the last `func` call.\r\n     *\r\n     * Note: If `leading` and `trailing` options are `true` `func` will be called\r\n     * on the trailing edge of the timeout only if the the throttled function is\r\n     * invoked more than once during the `wait` timeout.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to throttle.\r\n     * @param {number} wait The number of milliseconds to throttle executions to.\r\n     * @param {Object} [options] The options object.\r\n     * @param {boolean} [options.leading=true] Specify execution on the leading edge of the timeout.\r\n     * @param {boolean} [options.trailing=true] Specify execution on the trailing edge of the timeout.\r\n     * @returns {Function} Returns the new throttled function.\r\n     * @example\r\n     *\r\n     * // avoid excessively updating the position while scrolling\r\n     * var throttled = _.throttle(updatePosition, 100);\r\n     * jQuery(window).on('scroll', throttled);\r\n     *\r\n     * // execute `renewToken` when the click event is fired, but not more than once every 5 minutes\r\n     * jQuery('.interactive').on('click', _.throttle(renewToken, 300000, {\r\n     *   'trailing': false\r\n     * }));\r\n     */\r\n    function throttle(func, wait, options) {\r\n      var leading = true,\r\n          trailing = true;\r\n\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      if (options === false) {\r\n        leading = false;\r\n      } else if (isObject(options)) {\r\n        leading = 'leading' in options ? options.leading : leading;\r\n        trailing = 'trailing' in options ? options.trailing : trailing;\r\n      }\r\n      debounceOptions.leading = leading;\r\n      debounceOptions.maxWait = wait;\r\n      debounceOptions.trailing = trailing;\r\n\r\n      return debounce(func, wait, debounceOptions);\r\n    }\r\n\r\n    /**\r\n     * Creates a function that provides `value` to the wrapper function as its\r\n     * first argument. Additional arguments provided to the function are appended\r\n     * to those provided to the wrapper function. The wrapper is executed with\r\n     * the `this` binding of the created function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {*} value The value to wrap.\r\n     * @param {Function} wrapper The wrapper function.\r\n     * @returns {Function} Returns the new function.\r\n     * @example\r\n     *\r\n     * var p = _.wrap(_.escape, function(func, text) {\r\n     *   return '<p>' + func(text) + '</p>';\r\n     * });\r\n     *\r\n     * p('Fred, Wilma, & Pebbles');\r\n     * // => '<p>Fred, Wilma, &amp; Pebbles</p>'\r\n     */\r\n    function wrap(value, wrapper) {\r\n      return createWrapper(wrapper, 16, [value]);\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates a function that returns `value`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {*} value The value to return from the new function.\r\n     * @returns {Function} Returns the new function.\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'fred' };\r\n     * var getter = _.constant(object);\r\n     * getter() === object;\r\n     * // => true\r\n     */\r\n    function constant(value) {\r\n      return function() {\r\n        return value;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Produces a callback bound to an optional `thisArg`. If `func` is a property\r\n     * name the created callback will return the property value for a given element.\r\n     * If `func` is an object the created callback will return `true` for elements\r\n     * that contain the equivalent object properties, otherwise it will return `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {*} [func=identity] The value to convert to a callback.\r\n     * @param {*} [thisArg] The `this` binding of the created callback.\r\n     * @param {number} [argCount] The number of arguments the callback accepts.\r\n     * @returns {Function} Returns a callback function.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * // wrap to create custom callback shorthands\r\n     * _.createCallback = _.wrap(_.createCallback, function(func, callback, thisArg) {\r\n     *   var match = /^(.+?)__([gl]t)(.+)$/.exec(callback);\r\n     *   return !match ? func(callback, thisArg) : function(object) {\r\n     *     return match[2] == 'gt' ? object[match[1]] > match[3] : object[match[1]] < match[3];\r\n     *   };\r\n     * });\r\n     *\r\n     * _.filter(characters, 'age__gt38');\r\n     * // => [{ 'name': 'fred', 'age': 40 }]\r\n     */\r\n    function createCallback(func, thisArg, argCount) {\r\n      var type = typeof func;\r\n      if (func == null || type == 'function') {\r\n        return baseCreateCallback(func, thisArg, argCount);\r\n      }\r\n      // handle \"_.pluck\" style callback shorthands\r\n      if (type != 'object') {\r\n        return property(func);\r\n      }\r\n      var props = keys(func),\r\n          key = props[0],\r\n          a = func[key];\r\n\r\n      // handle \"_.where\" style callback shorthands\r\n      if (props.length == 1 && a === a && !isObject(a)) {\r\n        // fast path the common case of providing an object with a single\r\n        // property containing a primitive value\r\n        return function(object) {\r\n          var b = object[key];\r\n          return a === b && (a !== 0 || (1 / a == 1 / b));\r\n        };\r\n      }\r\n      return function(object) {\r\n        var length = props.length,\r\n            result = false;\r\n\r\n        while (length--) {\r\n          if (!(result = baseIsEqual(object[props[length]], func[props[length]], null, true))) {\r\n            break;\r\n          }\r\n        }\r\n        return result;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Converts the characters `&`, `<`, `>`, `\"`, and `'` in `string` to their\r\n     * corresponding HTML entities.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} string The string to escape.\r\n     * @returns {string} Returns the escaped string.\r\n     * @example\r\n     *\r\n     * _.escape('Fred, Wilma, & Pebbles');\r\n     * // => 'Fred, Wilma, &amp; Pebbles'\r\n     */\r\n    function escape(string) {\r\n      return string == null ? '' : String(string).replace(reUnescapedHtml, escapeHtmlChar);\r\n    }\r\n\r\n    /**\r\n     * This method returns the first argument provided to it.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {*} value Any value.\r\n     * @returns {*} Returns `value`.\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'fred' };\r\n     * _.identity(object) === object;\r\n     * // => true\r\n     */\r\n    function identity(value) {\r\n      return value;\r\n    }\r\n\r\n    /**\r\n     * Adds function properties of a source object to the destination object.\r\n     * If `object` is a function methods will be added to its prototype as well.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {Function|Object} [object=lodash] object The destination object.\r\n     * @param {Object} source The object of functions to add.\r\n     * @param {Object} [options] The options object.\r\n     * @param {boolean} [options.chain=true] Specify whether the functions added are chainable.\r\n     * @example\r\n     *\r\n     * function capitalize(string) {\r\n     *   return string.charAt(0).toUpperCase() + string.slice(1).toLowerCase();\r\n     * }\r\n     *\r\n     * _.mixin({ 'capitalize': capitalize });\r\n     * _.capitalize('fred');\r\n     * // => 'Fred'\r\n     *\r\n     * _('fred').capitalize().value();\r\n     * // => 'Fred'\r\n     *\r\n     * _.mixin({ 'capitalize': capitalize }, { 'chain': false });\r\n     * _('fred').capitalize();\r\n     * // => 'Fred'\r\n     */\r\n    function mixin(object, source, options) {\r\n      var chain = true,\r\n          methodNames = source && functions(source);\r\n\r\n      if (!source || (!options && !methodNames.length)) {\r\n        if (options == null) {\r\n          options = source;\r\n        }\r\n        ctor = lodashWrapper;\r\n        source = object;\r\n        object = lodash;\r\n        methodNames = functions(source);\r\n      }\r\n      if (options === false) {\r\n        chain = false;\r\n      } else if (isObject(options) && 'chain' in options) {\r\n        chain = options.chain;\r\n      }\r\n      var ctor = object,\r\n          isFunc = isFunction(ctor);\r\n\r\n      forEach(methodNames, function(methodName) {\r\n        var func = object[methodName] = source[methodName];\r\n        if (isFunc) {\r\n          ctor.prototype[methodName] = function() {\r\n            var chainAll = this.__chain__,\r\n                value = this.__wrapped__,\r\n                args = [value];\r\n\r\n            push.apply(args, arguments);\r\n            var result = func.apply(object, args);\r\n            if (chain || chainAll) {\r\n              if (value === result && isObject(result)) {\r\n                return this;\r\n              }\r\n              result = new ctor(result);\r\n              result.__chain__ = chainAll;\r\n            }\r\n            return result;\r\n          };\r\n        }\r\n      });\r\n    }\r\n\r\n    /**\r\n     * Reverts the '_' variable to its previous value and returns a reference to\r\n     * the `lodash` function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @returns {Function} Returns the `lodash` function.\r\n     * @example\r\n     *\r\n     * var lodash = _.noConflict();\r\n     */\r\n    function noConflict() {\r\n      context._ = oldDash;\r\n      return this;\r\n    }\r\n\r\n    /**\r\n     * A no-operation function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'fred' };\r\n     * _.noop(object) === undefined;\r\n     * // => true\r\n     */\r\n    function noop() {\r\n      // no operation performed\r\n    }\r\n\r\n    /**\r\n     * Gets the number of milliseconds that have elapsed since the Unix epoch\r\n     * (1 January 1970 00:00:00 UTC).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @example\r\n     *\r\n     * var stamp = _.now();\r\n     * _.defer(function() { console.log(_.now() - stamp); });\r\n     * // => logs the number of milliseconds it took for the deferred function to be called\r\n     */\r\n    var now = isNative(now = Date.now) && now || function() {\r\n      return new Date().getTime();\r\n    };\r\n\r\n    /**\r\n     * Converts the given value into an integer of the specified radix.\r\n     * If `radix` is `undefined` or `0` a `radix` of `10` is used unless the\r\n     * `value` is a hexadecimal, in which case a `radix` of `16` is used.\r\n     *\r\n     * Note: This method avoids differences in native ES3 and ES5 `parseInt`\r\n     * implementations. See http://es5.github.io/#E.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} value The value to parse.\r\n     * @param {number} [radix] The radix used to interpret the value to parse.\r\n     * @returns {number} Returns the new integer value.\r\n     * @example\r\n     *\r\n     * _.parseInt('08');\r\n     * // => 8\r\n     */\r\n    var parseInt = nativeParseInt(whitespace + '08') == 8 ? nativeParseInt : function(value, radix) {\r\n      // Firefox < 21 and Opera < 15 follow the ES3 specified implementation of `parseInt`\r\n      return nativeParseInt(isString(value) ? value.replace(reLeadingSpacesAndZeros, '') : value, radix || 0);\r\n    };\r\n\r\n    /**\r\n     * Creates a \"_.pluck\" style function, which returns the `key` value of a\r\n     * given object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} key The name of the property to retrieve.\r\n     * @returns {Function} Returns the new function.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'fred',   'age': 40 },\r\n     *   { 'name': 'barney', 'age': 36 }\r\n     * ];\r\n     *\r\n     * var getName = _.property('name');\r\n     *\r\n     * _.map(characters, getName);\r\n     * // => ['barney', 'fred']\r\n     *\r\n     * _.sortBy(characters, getName);\r\n     * // => [{ 'name': 'barney', 'age': 36 }, { 'name': 'fred',   'age': 40 }]\r\n     */\r\n    function property(key) {\r\n      return function(object) {\r\n        return object[key];\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Produces a random number between `min` and `max` (inclusive). If only one\r\n     * argument is provided a number between `0` and the given number will be\r\n     * returned. If `floating` is truey or either `min` or `max` are floats a\r\n     * floating-point number will be returned instead of an integer.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {number} [min=0] The minimum possible value.\r\n     * @param {number} [max=1] The maximum possible value.\r\n     * @param {boolean} [floating=false] Specify returning a floating-point number.\r\n     * @returns {number} Returns a random number.\r\n     * @example\r\n     *\r\n     * _.random(0, 5);\r\n     * // => an integer between 0 and 5\r\n     *\r\n     * _.random(5);\r\n     * // => also an integer between 0 and 5\r\n     *\r\n     * _.random(5, true);\r\n     * // => a floating-point number between 0 and 5\r\n     *\r\n     * _.random(1.2, 5.2);\r\n     * // => a floating-point number between 1.2 and 5.2\r\n     */\r\n    function random(min, max, floating) {\r\n      var noMin = min == null,\r\n          noMax = max == null;\r\n\r\n      if (floating == null) {\r\n        if (typeof min == 'boolean' && noMax) {\r\n          floating = min;\r\n          min = 1;\r\n        }\r\n        else if (!noMax && typeof max == 'boolean') {\r\n          floating = max;\r\n          noMax = true;\r\n        }\r\n      }\r\n      if (noMin && noMax) {\r\n        max = 1;\r\n      }\r\n      min = +min || 0;\r\n      if (noMax) {\r\n        max = min;\r\n        min = 0;\r\n      } else {\r\n        max = +max || 0;\r\n      }\r\n      if (floating || min % 1 || max % 1) {\r\n        var rand = nativeRandom();\r\n        return nativeMin(min + (rand * (max - min + parseFloat('1e-' + ((rand +'').length - 1)))), max);\r\n      }\r\n      return baseRandom(min, max);\r\n    }\r\n\r\n    /**\r\n     * Resolves the value of property `key` on `object`. If `key` is a function\r\n     * it will be invoked with the `this` binding of `object` and its result returned,\r\n     * else the property value is returned. If `object` is falsey then `undefined`\r\n     * is returned.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {Object} object The object to inspect.\r\n     * @param {string} key The name of the property to resolve.\r\n     * @returns {*} Returns the resolved value.\r\n     * @example\r\n     *\r\n     * var object = {\r\n     *   'cheese': 'crumpets',\r\n     *   'stuff': function() {\r\n     *     return 'nonsense';\r\n     *   }\r\n     * };\r\n     *\r\n     * _.result(object, 'cheese');\r\n     * // => 'crumpets'\r\n     *\r\n     * _.result(object, 'stuff');\r\n     * // => 'nonsense'\r\n     */\r\n    function result(object, key) {\r\n      if (object) {\r\n        var value = object[key];\r\n        return isFunction(value) ? object[key]() : value;\r\n      }\r\n    }\r\n\r\n    /**\r\n     * A micro-templating method that handles arbitrary delimiters, preserves\r\n     * whitespace, and correctly escapes quotes within interpolated code.\r\n     *\r\n     * Note: In the development build, `_.template` utilizes sourceURLs for easier\r\n     * debugging. See http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl\r\n     *\r\n     * For more information on precompiling templates see:\r\n     * http://lodash.com/custom-builds\r\n     *\r\n     * For more information on Chrome extension sandboxes see:\r\n     * http://developer.chrome.com/stable/extensions/sandboxingEval.html\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} text The template text.\r\n     * @param {Object} data The data object used to populate the text.\r\n     * @param {Object} [options] The options object.\r\n     * @param {RegExp} [options.escape] The \"escape\" delimiter.\r\n     * @param {RegExp} [options.evaluate] The \"evaluate\" delimiter.\r\n     * @param {Object} [options.imports] An object to import into the template as local variables.\r\n     * @param {RegExp} [options.interpolate] The \"interpolate\" delimiter.\r\n     * @param {string} [sourceURL] The sourceURL of the template's compiled source.\r\n     * @param {string} [variable] The data object variable name.\r\n     * @returns {Function|string} Returns a compiled function when no `data` object\r\n     *  is given, else it returns the interpolated text.\r\n     * @example\r\n     *\r\n     * // using the \"interpolate\" delimiter to create a compiled template\r\n     * var compiled = _.template('hello <%= name %>');\r\n     * compiled({ 'name': 'fred' });\r\n     * // => 'hello fred'\r\n     *\r\n     * // using the \"escape\" delimiter to escape HTML in data property values\r\n     * _.template('<b><%- value %></b>', { 'value': '<script>' });\r\n     * // => '<b>&lt;script&gt;</b>'\r\n     *\r\n     * // using the \"evaluate\" delimiter to generate HTML\r\n     * var list = '<% _.forEach(people, function(name) { %><li><%- name %></li><% }); %>';\r\n     * _.template(list, { 'people': ['fred', 'barney'] });\r\n     * // => '<li>fred</li><li>barney</li>'\r\n     *\r\n     * // using the ES6 delimiter as an alternative to the default \"interpolate\" delimiter\r\n     * _.template('hello ${ name }', { 'name': 'pebbles' });\r\n     * // => 'hello pebbles'\r\n     *\r\n     * // using the internal `print` function in \"evaluate\" delimiters\r\n     * _.template('<% print(\"hello \" + name); %>!', { 'name': 'barney' });\r\n     * // => 'hello barney!'\r\n     *\r\n     * // using a custom template delimiters\r\n     * _.templateSettings = {\r\n     *   'interpolate': /{{([\\s\\S]+?)}}/g\r\n     * };\r\n     *\r\n     * _.template('hello {{ name }}!', { 'name': 'mustache' });\r\n     * // => 'hello mustache!'\r\n     *\r\n     * // using the `imports` option to import jQuery\r\n     * var list = '<% jq.each(people, function(name) { %><li><%- name %></li><% }); %>';\r\n     * _.template(list, { 'people': ['fred', 'barney'] }, { 'imports': { 'jq': jQuery } });\r\n     * // => '<li>fred</li><li>barney</li>'\r\n     *\r\n     * // using the `sourceURL` option to specify a custom sourceURL for the template\r\n     * var compiled = _.template('hello <%= name %>', null, { 'sourceURL': '/basic/greeting.jst' });\r\n     * compiled(data);\r\n     * // => find the source of \"greeting.jst\" under the Sources tab or Resources panel of the web inspector\r\n     *\r\n     * // using the `variable` option to ensure a with-statement isn't used in the compiled template\r\n     * var compiled = _.template('hi <%= data.name %>!', null, { 'variable': 'data' });\r\n     * compiled.source;\r\n     * // => function(data) {\r\n     *   var __t, __p = '', __e = _.escape;\r\n     *   __p += 'hi ' + ((__t = ( data.name )) == null ? '' : __t) + '!';\r\n     *   return __p;\r\n     * }\r\n     *\r\n     * // using the `source` property to inline compiled templates for meaningful\r\n     * // line numbers in error messages and a stack trace\r\n     * fs.writeFileSync(path.join(cwd, 'jst.js'), '\\\r\n     *   var JST = {\\\r\n     *     \"main\": ' + _.template(mainText).source + '\\\r\n     *   };\\\r\n     * ');\r\n     */\r\n    function template(text, data, options) {\r\n      // based on John Resig's `tmpl` implementation\r\n      // http://ejohn.org/blog/javascript-micro-templating/\r\n      // and Laura Doktorova's doT.js\r\n      // https://github.com/olado/doT\r\n      var settings = lodash.templateSettings;\r\n      text = String(text || '');\r\n\r\n      // avoid missing dependencies when `iteratorTemplate` is not defined\r\n      options = defaults({}, options, settings);\r\n\r\n      var imports = defaults({}, options.imports, settings.imports),\r\n          importsKeys = keys(imports),\r\n          importsValues = values(imports);\r\n\r\n      var isEvaluating,\r\n          index = 0,\r\n          interpolate = options.interpolate || reNoMatch,\r\n          source = \"__p += '\";\r\n\r\n      // compile the regexp to match each delimiter\r\n      var reDelimiters = RegExp(\r\n        (options.escape || reNoMatch).source + '|' +\r\n        interpolate.source + '|' +\r\n        (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + '|' +\r\n        (options.evaluate || reNoMatch).source + '|$'\r\n      , 'g');\r\n\r\n      text.replace(reDelimiters, function(match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) {\r\n        interpolateValue || (interpolateValue = esTemplateValue);\r\n\r\n        // escape characters that cannot be included in string literals\r\n        source += text.slice(index, offset).replace(reUnescapedString, escapeStringChar);\r\n\r\n        // replace delimiters with snippets\r\n        if (escapeValue) {\r\n          source += \"' +\\n__e(\" + escapeValue + \") +\\n'\";\r\n        }\r\n        if (evaluateValue) {\r\n          isEvaluating = true;\r\n          source += \"';\\n\" + evaluateValue + \";\\n__p += '\";\r\n        }\r\n        if (interpolateValue) {\r\n          source += \"' +\\n((__t = (\" + interpolateValue + \")) == null ? '' : __t) +\\n'\";\r\n        }\r\n        index = offset + match.length;\r\n\r\n        // the JS engine embedded in Adobe products requires returning the `match`\r\n        // string in order to produce the correct `offset` value\r\n        return match;\r\n      });\r\n\r\n      source += \"';\\n\";\r\n\r\n      // if `variable` is not specified, wrap a with-statement around the generated\r\n      // code to add the data object to the top of the scope chain\r\n      var variable = options.variable,\r\n          hasVariable = variable;\r\n\r\n      if (!hasVariable) {\r\n        variable = 'obj';\r\n        source = 'with (' + variable + ') {\\n' + source + '\\n}\\n';\r\n      }\r\n      // cleanup code by stripping empty strings\r\n      source = (isEvaluating ? source.replace(reEmptyStringLeading, '') : source)\r\n        .replace(reEmptyStringMiddle, '$1')\r\n        .replace(reEmptyStringTrailing, '$1;');\r\n\r\n      // frame code as the function body\r\n      source = 'function(' + variable + ') {\\n' +\r\n        (hasVariable ? '' : variable + ' || (' + variable + ' = {});\\n') +\r\n        \"var __t, __p = '', __e = _.escape\" +\r\n        (isEvaluating\r\n          ? ', __j = Array.prototype.join;\\n' +\r\n            \"function print() { __p += __j.call(arguments, '') }\\n\"\r\n          : ';\\n'\r\n        ) +\r\n        source +\r\n        'return __p\\n}';\r\n\r\n      // Use a sourceURL for easier debugging.\r\n      // http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl\r\n      var sourceURL = '\\n/*\\n//# sourceURL=' + (options.sourceURL || '/lodash/template/source[' + (templateCounter++) + ']') + '\\n*/';\r\n\r\n      try {\r\n        var result = Function(importsKeys, 'return ' + source + sourceURL).apply(undefined, importsValues);\r\n      } catch(e) {\r\n        e.source = source;\r\n        throw e;\r\n      }\r\n      if (data) {\r\n        return result(data);\r\n      }\r\n      // provide the compiled function's source by its `toString` method, in\r\n      // supported environments, or the `source` property as a convenience for\r\n      // inlining compiled templates during the build process\r\n      result.source = source;\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Executes the callback `n` times, returning an array of the results\r\n     * of each callback execution. The callback is bound to `thisArg` and invoked\r\n     * with one argument; (index).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {number} n The number of times to execute the callback.\r\n     * @param {Function} callback The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns an array of the results of each `callback` execution.\r\n     * @example\r\n     *\r\n     * var diceRolls = _.times(3, _.partial(_.random, 1, 6));\r\n     * // => [3, 6, 4]\r\n     *\r\n     * _.times(3, function(n) { mage.castSpell(n); });\r\n     * // => calls `mage.castSpell(n)` three times, passing `n` of `0`, `1`, and `2` respectively\r\n     *\r\n     * _.times(3, function(n) { this.cast(n); }, mage);\r\n     * // => also calls `mage.castSpell(n)` three times\r\n     */\r\n    function times(n, callback, thisArg) {\r\n      n = (n = +n) > -1 ? n : 0;\r\n      var index = -1,\r\n          result = Array(n);\r\n\r\n      callback = baseCreateCallback(callback, thisArg, 1);\r\n      while (++index < n) {\r\n        result[index] = callback(index);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The inverse of `_.escape` this method converts the HTML entities\r\n     * `&amp;`, `&lt;`, `&gt;`, `&quot;`, and `&#39;` in `string` to their\r\n     * corresponding characters.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} string The string to unescape.\r\n     * @returns {string} Returns the unescaped string.\r\n     * @example\r\n     *\r\n     * _.unescape('Fred, Barney &amp; Pebbles');\r\n     * // => 'Fred, Barney & Pebbles'\r\n     */\r\n    function unescape(string) {\r\n      return string == null ? '' : String(string).replace(reEscapedHtml, unescapeHtmlChar);\r\n    }\r\n\r\n    /**\r\n     * Generates a unique ID. If `prefix` is provided the ID will be appended to it.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} [prefix] The value to prefix the ID with.\r\n     * @returns {string} Returns the unique ID.\r\n     * @example\r\n     *\r\n     * _.uniqueId('contact_');\r\n     * // => 'contact_104'\r\n     *\r\n     * _.uniqueId();\r\n     * // => '105'\r\n     */\r\n    function uniqueId(prefix) {\r\n      var id = ++idCounter;\r\n      return String(prefix == null ? '' : prefix) + id;\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates a `lodash` object that wraps the given value with explicit\r\n     * method chaining enabled.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Chaining\r\n     * @param {*} value The value to wrap.\r\n     * @returns {Object} Returns the wrapper object.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36 },\r\n     *   { 'name': 'fred',    'age': 40 },\r\n     *   { 'name': 'pebbles', 'age': 1 }\r\n     * ];\r\n     *\r\n     * var youngest = _.chain(characters)\r\n     *     .sortBy('age')\r\n     *     .map(function(chr) { return chr.name + ' is ' + chr.age; })\r\n     *     .first()\r\n     *     .value();\r\n     * // => 'pebbles is 1'\r\n     */\r\n    function chain(value) {\r\n      value = new lodashWrapper(value);\r\n      value.__chain__ = true;\r\n      return value;\r\n    }\r\n\r\n    /**\r\n     * Invokes `interceptor` with the `value` as the first argument and then\r\n     * returns `value`. The purpose of this method is to \"tap into\" a method\r\n     * chain in order to perform operations on intermediate results within\r\n     * the chain.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Chaining\r\n     * @param {*} value The value to provide to `interceptor`.\r\n     * @param {Function} interceptor The function to invoke.\r\n     * @returns {*} Returns `value`.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3, 4])\r\n     *  .tap(function(array) { array.pop(); })\r\n     *  .reverse()\r\n     *  .value();\r\n     * // => [3, 2, 1]\r\n     */\r\n    function tap(value, interceptor) {\r\n      interceptor(value);\r\n      return value;\r\n    }\r\n\r\n    /**\r\n     * Enables explicit method chaining on the wrapper object.\r\n     *\r\n     * @name chain\r\n     * @memberOf _\r\n     * @category Chaining\r\n     * @returns {*} Returns the wrapper object.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * // without explicit chaining\r\n     * _(characters).first();\r\n     * // => { 'name': 'barney', 'age': 36 }\r\n     *\r\n     * // with explicit chaining\r\n     * _(characters).chain()\r\n     *   .first()\r\n     *   .pick('age')\r\n     *   .value();\r\n     * // => { 'age': 36 }\r\n     */\r\n    function wrapperChain() {\r\n      this.__chain__ = true;\r\n      return this;\r\n    }\r\n\r\n    /**\r\n     * Produces the `toString` result of the wrapped value.\r\n     *\r\n     * @name toString\r\n     * @memberOf _\r\n     * @category Chaining\r\n     * @returns {string} Returns the string result.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3]).toString();\r\n     * // => '1,2,3'\r\n     */\r\n    function wrapperToString() {\r\n      return String(this.__wrapped__);\r\n    }\r\n\r\n    /**\r\n     * Extracts the wrapped value.\r\n     *\r\n     * @name valueOf\r\n     * @memberOf _\r\n     * @alias value\r\n     * @category Chaining\r\n     * @returns {*} Returns the wrapped value.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3]).valueOf();\r\n     * // => [1, 2, 3]\r\n     */\r\n    function wrapperValueOf() {\r\n      return this.__wrapped__;\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    // add functions that return wrapped values when chaining\r\n    lodash.after = after;\r\n    lodash.assign = assign;\r\n    lodash.at = at;\r\n    lodash.bind = bind;\r\n    lodash.bindAll = bindAll;\r\n    lodash.bindKey = bindKey;\r\n    lodash.chain = chain;\r\n    lodash.compact = compact;\r\n    lodash.compose = compose;\r\n    lodash.constant = constant;\r\n    lodash.countBy = countBy;\r\n    lodash.create = create;\r\n    lodash.createCallback = createCallback;\r\n    lodash.curry = curry;\r\n    lodash.debounce = debounce;\r\n    lodash.defaults = defaults;\r\n    lodash.defer = defer;\r\n    lodash.delay = delay;\r\n    lodash.difference = difference;\r\n    lodash.filter = filter;\r\n    lodash.flatten = flatten;\r\n    lodash.forEach = forEach;\r\n    lodash.forEachRight = forEachRight;\r\n    lodash.forIn = forIn;\r\n    lodash.forInRight = forInRight;\r\n    lodash.forOwn = forOwn;\r\n    lodash.forOwnRight = forOwnRight;\r\n    lodash.functions = functions;\r\n    lodash.groupBy = groupBy;\r\n    lodash.indexBy = indexBy;\r\n    lodash.initial = initial;\r\n    lodash.intersection = intersection;\r\n    lodash.invert = invert;\r\n    lodash.invoke = invoke;\r\n    lodash.keys = keys;\r\n    lodash.map = map;\r\n    lodash.mapValues = mapValues;\r\n    lodash.max = max;\r\n    lodash.memoize = memoize;\r\n    lodash.merge = merge;\r\n    lodash.min = min;\r\n    lodash.omit = omit;\r\n    lodash.once = once;\r\n    lodash.pairs = pairs;\r\n    lodash.partial = partial;\r\n    lodash.partialRight = partialRight;\r\n    lodash.pick = pick;\r\n    lodash.pluck = pluck;\r\n    lodash.property = property;\r\n    lodash.pull = pull;\r\n    lodash.range = range;\r\n    lodash.reject = reject;\r\n    lodash.remove = remove;\r\n    lodash.rest = rest;\r\n    lodash.shuffle = shuffle;\r\n    lodash.sortBy = sortBy;\r\n    lodash.tap = tap;\r\n    lodash.throttle = throttle;\r\n    lodash.times = times;\r\n    lodash.toArray = toArray;\r\n    lodash.transform = transform;\r\n    lodash.union = union;\r\n    lodash.uniq = uniq;\r\n    lodash.values = values;\r\n    lodash.where = where;\r\n    lodash.without = without;\r\n    lodash.wrap = wrap;\r\n    lodash.xor = xor;\r\n    lodash.zip = zip;\r\n    lodash.zipObject = zipObject;\r\n\r\n    // add aliases\r\n    lodash.collect = map;\r\n    lodash.drop = rest;\r\n    lodash.each = forEach;\r\n    lodash.eachRight = forEachRight;\r\n    lodash.extend = assign;\r\n    lodash.methods = functions;\r\n    lodash.object = zipObject;\r\n    lodash.select = filter;\r\n    lodash.tail = rest;\r\n    lodash.unique = uniq;\r\n    lodash.unzip = zip;\r\n\r\n    // add functions to `lodash.prototype`\r\n    mixin(lodash);\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    // add functions that return unwrapped values when chaining\r\n    lodash.clone = clone;\r\n    lodash.cloneDeep = cloneDeep;\r\n    lodash.contains = contains;\r\n    lodash.escape = escape;\r\n    lodash.every = every;\r\n    lodash.find = find;\r\n    lodash.findIndex = findIndex;\r\n    lodash.findKey = findKey;\r\n    lodash.findLast = findLast;\r\n    lodash.findLastIndex = findLastIndex;\r\n    lodash.findLastKey = findLastKey;\r\n    lodash.has = has;\r\n    lodash.identity = identity;\r\n    lodash.indexOf = indexOf;\r\n    lodash.isArguments = isArguments;\r\n    lodash.isArray = isArray;\r\n    lodash.isBoolean = isBoolean;\r\n    lodash.isDate = isDate;\r\n    lodash.isElement = isElement;\r\n    lodash.isEmpty = isEmpty;\r\n    lodash.isEqual = isEqual;\r\n    lodash.isFinite = isFinite;\r\n    lodash.isFunction = isFunction;\r\n    lodash.isNaN = isNaN;\r\n    lodash.isNull = isNull;\r\n    lodash.isNumber = isNumber;\r\n    lodash.isObject = isObject;\r\n    lodash.isPlainObject = isPlainObject;\r\n    lodash.isRegExp = isRegExp;\r\n    lodash.isString = isString;\r\n    lodash.isUndefined = isUndefined;\r\n    lodash.lastIndexOf = lastIndexOf;\r\n    lodash.mixin = mixin;\r\n    lodash.noConflict = noConflict;\r\n    lodash.noop = noop;\r\n    lodash.now = now;\r\n    lodash.parseInt = parseInt;\r\n    lodash.random = random;\r\n    lodash.reduce = reduce;\r\n    lodash.reduceRight = reduceRight;\r\n    lodash.result = result;\r\n    lodash.runInContext = runInContext;\r\n    lodash.size = size;\r\n    lodash.some = some;\r\n    lodash.sortedIndex = sortedIndex;\r\n    lodash.template = template;\r\n    lodash.unescape = unescape;\r\n    lodash.uniqueId = uniqueId;\r\n\r\n    // add aliases\r\n    lodash.all = every;\r\n    lodash.any = some;\r\n    lodash.detect = find;\r\n    lodash.findWhere = find;\r\n    lodash.foldl = reduce;\r\n    lodash.foldr = reduceRight;\r\n    lodash.include = contains;\r\n    lodash.inject = reduce;\r\n\r\n    mixin(function() {\r\n      var source = {}\r\n      forOwn(lodash, function(func, methodName) {\r\n        if (!lodash.prototype[methodName]) {\r\n          source[methodName] = func;\r\n        }\r\n      });\r\n      return source;\r\n    }(), false);\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    // add functions capable of returning wrapped and unwrapped values when chaining\r\n    lodash.first = first;\r\n    lodash.last = last;\r\n    lodash.sample = sample;\r\n\r\n    // add aliases\r\n    lodash.take = first;\r\n    lodash.head = first;\r\n\r\n    forOwn(lodash, function(func, methodName) {\r\n      var callbackable = methodName !== 'sample';\r\n      if (!lodash.prototype[methodName]) {\r\n        lodash.prototype[methodName]= function(n, guard) {\r\n          var chainAll = this.__chain__,\r\n              result = func(this.__wrapped__, n, guard);\r\n\r\n          return !chainAll && (n == null || (guard && !(callbackable && typeof n == 'function')))\r\n            ? result\r\n            : new lodashWrapper(result, chainAll);\r\n        };\r\n      }\r\n    });\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * The semantic version number.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type string\r\n     */\r\n    lodash.VERSION = '2.4.1';\r\n\r\n    // add \"Chaining\" functions to the wrapper\r\n    lodash.prototype.chain = wrapperChain;\r\n    lodash.prototype.toString = wrapperToString;\r\n    lodash.prototype.value = wrapperValueOf;\r\n    lodash.prototype.valueOf = wrapperValueOf;\r\n\r\n    // add `Array` functions that return unwrapped values\r\n    forEach(['join', 'pop', 'shift'], function(methodName) {\r\n      var func = arrayRef[methodName];\r\n      lodash.prototype[methodName] = function() {\r\n        var chainAll = this.__chain__,\r\n            result = func.apply(this.__wrapped__, arguments);\r\n\r\n        return chainAll\r\n          ? new lodashWrapper(result, chainAll)\r\n          : result;\r\n      };\r\n    });\r\n\r\n    // add `Array` functions that return the existing wrapped value\r\n    forEach(['push', 'reverse', 'sort', 'unshift'], function(methodName) {\r\n      var func = arrayRef[methodName];\r\n      lodash.prototype[methodName] = function() {\r\n        func.apply(this.__wrapped__, arguments);\r\n        return this;\r\n      };\r\n    });\r\n\r\n    // add `Array` functions that return new wrapped values\r\n    forEach(['concat', 'slice', 'splice'], function(methodName) {\r\n      var func = arrayRef[methodName];\r\n      lodash.prototype[methodName] = function() {\r\n        return new lodashWrapper(func.apply(this.__wrapped__, arguments), this.__chain__);\r\n      };\r\n    });\r\n\r\n    return lodash;\r\n  }\r\n\r\n  /*--------------------------------------------------------------------------*/\r\n\r\n  // expose Lo-Dash\r\n  var _ = runInContext();\r\n\r\n  // some AMD build optimizers like r.js check for condition patterns like the following:\r\n  if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {\r\n    // Expose Lo-Dash to the global object even when an AMD loader is present in\r\n    // case Lo-Dash is loaded with a RequireJS shim config.\r\n    // See http://requirejs.org/docs/api.html#config-shim\r\n    root._ = _;\r\n\r\n    // define as an anonymous module so, through path mapping, it can be\r\n    // referenced as the \"underscore\" module\r\n    define(function() {\r\n      return _;\r\n    });\r\n  }\r\n  // check for `exports` after `define` in case a build optimizer adds an `exports` object\r\n  else if (freeExports && freeModule) {\r\n    // in Node.js or RingoJS\r\n    if (moduleExports) {\r\n      (freeModule.exports = _)._ = _;\r\n    }\r\n    // in Narwhal or Rhino -require\r\n    else {\r\n      freeExports._ = _;\r\n    }\r\n  }\r\n  else {\r\n    // in a browser or Rhino\r\n    root._ = _;\r\n  }\r\n}.call(this));\r\n\r\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\r\n},{}]},{},[1])(1)\r\n});\n/**\r\n * Visualize span annotations as a tree\r\n * using Dagre.\r\n *\r\n * This should be lazy loaded!\r\n */\r\n\r\n\r\ndefine('match/treehierarchy',['lib/dagre'], function (dagre) {\r\n\r\n  const d = document;\r\n  const svgNS = \"http://www.w3.org/2000/svg\";\r\n  const _TermRE = new RegExp(\"^(?:([^\\/]+?)\\/)?([^:]+?):(.+?)$\");\r\n\r\n  // Node size\r\n  var WIDTH  = 55, HEIGHT = 20, LINEHEIGHT = 14;\r\n\r\n  // Create path for node connections \r\n  function _line (src, target) {\r\n    const x1 = src.x,\r\n          y1 = src.y,\r\n          x2 = target.x,\r\n          y2 = target.y - target.height / 2;\r\n\r\n    // c 0,0 -10,0\r\n    return 'M ' + x1 + ',' + y1 + ' ' + \r\n      'C ' + x1 + ',' + y1 + ' ' + \r\n      x2 + ',' + (y2 - (y2 - y1) / 2)  + ' ' + \r\n      x2 + ',' + y2;\r\n  };\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new tree visualization based\r\n     * on a match snippet.\r\n     */\r\n    create : function (snippet) {\r\n      return Object.create(this).\r\n        _init(snippet);\r\n    },\r\n\r\n\r\n    // Initialize the tree based on a snippet.\r\n    _init : function (snippet) {\r\n      this._next = new Number(0);\r\n      \r\n      // Create html for traversal\r\n      let html = d.createElement(\"div\");\r\n      html.innerHTML = snippet;\r\n\r\n      const g = new dagre.graphlib.Graph({\r\n        \"directed\" : true \r\n      });\r\n\r\n      g.setGraph({\r\n        \"nodesep\" : 35,\r\n        \"ranksep\" : 15,\r\n        \"marginx\" : 40,\r\n        \"marginy\" : 10\r\n      });\r\n      g.setDefaultEdgeLabel({});\r\n\r\n      this._graph = g;\r\n      \r\n      // This is a new root\r\n      this._addNode(\r\n        this._next++,\r\n        { \"class\" : \"root\" }\r\n      );\r\n      \r\n      // Parse nodes from root\r\n      this._parse(0, html.childNodes, undefined);\r\n\r\n      // Root node has only one child - remove\r\n      if (g.outEdges(0).length === 1)\r\n        g.removeNode(0);\r\n\r\n      html = undefined;\r\n      return this;\r\n    },\r\n\r\n\r\n    _c : function (tag) {\r\n      return d.createElementNS(svgNS, tag);\r\n    },\r\n    \r\n\r\n    /**\r\n     * The number of nodes in the tree.\r\n     */\r\n    nodes : function () {\r\n      return this._next;\r\n    },\r\n\r\n\r\n    // Add new node to graph\r\n    _addNode : function (id, obj) {\r\n      obj[\"width\"]  = WIDTH;\r\n      obj[\"height\"] = HEIGHT;\r\n      this._graph.setNode(id, obj)\r\n      return obj;\r\n    },\r\n    \r\n\r\n    // Add new edge to graph\r\n    _addEdge : function (src, target) {\r\n      this._graph.setEdge(src, target);\r\n    },\r\n    \r\n\r\n    // Remove foundry and layer for labels\r\n    _clean : function (title) {\r\n      return title.replace(_TermRE, \"$3\");\r\n    },\r\n\r\n    \r\n    // Parse the snippet\r\n    _parse : function (parent, children, mark) {\r\n      children.forEach(function(c) {\r\n\r\n        // Element node\r\n        if (c.nodeType == 1) {\r\n\r\n          // Get title from html\r\n          if (c.getAttribute(\"title\")) {\r\n\r\n            // Add child node\r\n            const id = this._next++;\r\n\r\n            const obj = this._addNode(id, {\r\n              \"class\" : \"middle\",\r\n              \"label\" : this._clean(c.getAttribute(\"title\"))\r\n            });\r\n            \r\n            if (mark !== undefined) {\r\n              obj.class += ' mark';\r\n            };\r\n            \r\n            this._addEdge(parent, id);\r\n\r\n            // Check for next level\r\n            if (c.hasChildNodes())\r\n              this._parse(id, c.childNodes, mark);\r\n          }\r\n\r\n          // Step further\r\n          else if (c.hasChildNodes()) {\r\n\r\n            this._parse(\r\n              parent,\r\n              c.childNodes,\r\n              c.tagName === 'MARK' ? true : mark\r\n            );\r\n          };\r\n        }\r\n\r\n        // Text node\r\n        else if (c.nodeType == 3)\r\n\r\n          if (c.nodeValue.match(/[-a-z0-9]/i)) {\r\n            \r\n            // Add child node\r\n            const id = this._next++;\r\n            this._addNode(id, {\r\n              \"class\" : \"leaf\",\r\n              \"label\" : c.nodeValue\r\n            });\r\n\r\n            this._addEdge(parent, id);\r\n          };\r\n      }, this);\r\n      return this;\r\n    },\r\n\r\n\r\n    // Dummy method to be compatible with relTree\r\n    show : function () {\r\n      return;\r\n    },\r\n\r\n\r\n    /**\r\n     * Center the viewport of the canvas\r\n     * TODO:\r\n     *   This is identical to relations\r\n     */\r\n    center : function () {\r\n      if (this._el === undefined)\r\n        return;\r\n\r\n      const treeDiv = this._el.parentNode;\r\n      const cWidth = parseFloat(window.getComputedStyle(this._el).width);\r\n      const treeWidth = parseFloat(window.getComputedStyle(treeDiv).width);\r\n\r\n      // Reposition:\r\n      if (cWidth > treeWidth) {\r\n        treeDiv.scrollLeft = (cWidth - treeWidth) / 2;\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Create svg and serialize as base64\r\n     */\r\n    toBase64 : function () {\r\n\r\n      // First clone element\r\n      const svgWrapper = d.createElement('div')\r\n      svgWrapper.innerHTML = this.element().outerHTML;\r\n\r\n      const svg = svgWrapper.firstChild;\r\n      const style = this._c('style');\r\n\r\n      svg.getElementsByTagName('defs')[0].appendChild(style);\r\n\r\n      style.innerHTML = \r\n\t      'path.edge '  +            '{ stroke: black; stroke-width: 2pt; fill: none; }' +\r\n        'g.root rect.empty,' +\r\n        'g.middle rect' +          '{ stroke: black; stroke-width: 2pt; fill: #bbb; }' +\r\n        'g.leaf > rect ' +         '{ display: none }' +\r\n        'g > text > tspan ' +      '{ text-anchor: middle; font-size: 9pt }' +\r\n        'g.leaf > text > tspan ' + '{ font-size: 10pt; overflow: visible; }';\r\n\r\n      return btoa(unescape(encodeURIComponent(svg.outerHTML)).replace(/&nbsp;/g, ' '));\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the dom element of the tree view.\r\n     */\r\n    element : function () {\r\n\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      const g = this._graph;\r\n      dagre.layout(g);\r\n      \r\n      const canvas = this._c('svg');\r\n      this._el = canvas;\r\n\r\n      canvas.appendChild(this._c('defs'));\r\n\r\n      // Create edges\r\n      const that = this;\r\n\r\n      let src, target, p;\r\n\r\n      g.edges().forEach(\r\n        function (e) {\r\n          src = g.node(e.v);\r\n          target = g.node(e.w);\r\n          p = that._c('path');\r\n          p.setAttributeNS(null, \"d\", _line(src, target));\r\n          p.classList.add('edge');\r\n          canvas.appendChild(p);\r\n        }\r\n      );\r\n      \r\n      let height = g.graph().height;\r\n\r\n      // Create nodes\r\n      g.nodes().forEach(\r\n        function (v) {\r\n          v = g.node(v);\r\n          const group = that._c('g');\r\n          group.setAttribute('class', v.class);\r\n          \r\n          // Add node box\r\n          const rect = group.appendChild(that._c('rect'));\r\n          rect.setAttribute('x', v.x - v.width / 2);\r\n          rect.setAttribute('y', v.y - v.height / 2);\r\n          rect.setAttribute('rx', 5);\r\n          rect.setAttribute('ry', 5);\r\n          rect.setAttribute('width', v.width);\r\n          rect.setAttribute('height', v.height);\r\n\r\n          if (v.class === 'root' && v.label === undefined) {\r\n            rect.setAttribute('width', v.height);\r\n            rect.setAttribute('x', v.x - v.height / 2);\r\n            rect.setAttribute('class', 'empty');\r\n          };\r\n\r\n          // Add label\r\n          if (v.label !== undefined) {\r\n            const text = group.appendChild(that._c('text'));\r\n            let y = v.y - v.height / 2;\r\n            text.setAttribute('y', y);\r\n            text.setAttribute(\r\n              'transform',\r\n              'translate(' + v.width/2 + ',' + ((v.height / 2) + 5) + ')'\r\n            );\r\n\r\n            const vLabel = v.label.replace(/&nbsp;/g, \" \")\r\n                  .replace(/&amp;/g, '&')\r\n                  .replace(/&lt;/g, '<')\r\n                  .replace(/&gt;/g, '>');\r\n            \r\n            if (v.class === \"leaf\") {\r\n              text.setAttribute('title', vLabel);\r\n\r\n              let n = 0;\r\n              let tspan;\r\n              vLabel.split(\" \").forEach(function(p) {\r\n                if (p.length === 0)\r\n                  return;\r\n\r\n                tspan = that._c('tspan');\r\n                tspan.appendChild(d.createTextNode(p));\r\n\r\n                if (n !== 0)\r\n                  tspan.setAttribute('dy', LINEHEIGHT + 'pt');\r\n                else\r\n                  n = 1;\r\n\r\n                tspan.setAttribute('x', v.x - v.width / 2);\r\n                y += LINEHEIGHT;\r\n                text.appendChild(tspan);\r\n              });\r\n\r\n              y += LINEHEIGHT;\r\n\r\n              // The text is below the canvas - readjust the height!\r\n              if (y > height)\r\n                height = y;\r\n            }\r\n            else {\r\n              const tspan = that._c('tspan');\r\n              tspan.appendChild(d.createTextNode(vLabel));\r\n              tspan.setAttribute('x', v.x - v.width / 2);\r\n              text.appendChild(tspan);\r\n            };\r\n          };\r\n          canvas.appendChild(group);\r\n        }\r\n      );\r\n\r\n      canvas.setAttribute('width', g.graph().width);\r\n      canvas.setAttribute('height', height);\r\n      return this._el;\r\n    },\r\n    \r\n    downloadLink : function () {\r\n      const a = d.createElement('a');\r\n      a.setAttribute('href-lang', 'image/svg+xml');\r\n      a.setAttribute('href', 'data:image/svg+xml;base64,' + this.toBase64());\r\n      a.setAttribute('download', 'tree.svg');\r\n      a.target = '_blank';\r\n      a.setAttribute('rel', 'noopener noreferrer');\r\n      return a;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Parse a relational tree and visualize using arcs.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('match/treearc',[], function () {\r\n\r\n  const svgNS = \"http://www.w3.org/2000/svg\";\r\n  const _TermRE = new RegExp(\"^(?:([^\\/]+?)\\/)?([^:]+?):(.+?)$\");\r\n  const d = document;\r\n\r\n  return {\r\n    create : function (snippet) {\r\n      return Object.create(this)._init(snippet);\r\n    },\r\n\r\n    // Initialize the state of the object\r\n    _init : function (snippet) {\r\n\r\n      const t = this;\r\n\r\n      // Predefine some values\r\n      t._tokens  = [];\r\n      t._arcs    = [];\r\n      t._tokenElements = [];\r\n      t._y = 0;\r\n      t._currentInFocus = undefined;\r\n\r\n      // Some configurations\r\n      t.maxArc      = 200; // maximum height of the bezier control point\r\n      t.overlapDiff = 40;  // Difference on overlaps and minimum height for self-refernces\r\n      t.arcDiff     = 15;\r\n      t.anchorDiff  = 8;\r\n      t.anchorStart = 15;\r\n      t.tokenSep    = 30;\r\n      t.xPadding    = 10;\r\n      t.yPadding    = 5;\r\n\r\n      // No snippet to process\r\n      if (snippet == undefined || snippet == null)\r\n        return t;\r\n\r\n      // Parse the snippet\r\n      const html = d.createElement(\"div\");\r\n      html.innerHTML = snippet;\r\n\r\n      // Establish temporary parsing memory\r\n      t.temp = {\r\n        target : {}, // Remember the map id => pos        \r\n        edges  : [], // Remember edge definitions\r\n        pos    : 0   // Keep track of the current token position\r\n      };\r\n\r\n      // Start parsing from root\r\n      t._parse(0, html.childNodes, undefined);\r\n\r\n      // Establish edge list\r\n      const targetMap = t.temp['target'];\r\n      const edges = t.temp['edges'];\r\n\r\n      let targetID, target, relation;\r\n      \r\n      // Iterate over edge lists\r\n      // TODO:\r\n      //   Support spans for anchors!\r\n      edges.forEach(function(edge) {\r\n\r\n        // Check the target identifier\r\n        targetID = edge.targetID;\r\n        target = targetMap[targetID];\r\n\r\n        if (target != undefined) {\r\n\r\n          // Check if the source is a span anchor\r\n          /*\r\n          var start = edge.srcStart;\r\n          if (start !== edge.srcEnd) {\r\n            start = [start, edge.srcEnd];\r\n          };\r\n          */\r\n          \r\n          // Add relation\r\n          relation = {\r\n            start : [edge.srcStart, edge.srcEnd],\r\n            end : target,\r\n            direction : 'uni',\r\n            label : edge.label\r\n          };\r\n          // console.log(relation);\r\n          this.addRel(relation);\r\n        };\r\n      }, t);\r\n\r\n      // Reset parsing memory\r\n      delete t[\"temp\"];\r\n\r\n      return this;\r\n    },\r\n\r\n    // Parse a node of the tree snippet\r\n    _parse : function (parent, children, mark) {\r\n\r\n      // Iterate over all child nodes\r\n      Array.from(children).forEach(function(c) {\r\n\r\n        // Element node\r\n        if (c.nodeType == 1) {\r\n\r\n          let xmlid, target, start, end;\r\n\r\n          // Node is an identifier\r\n          if (c.hasAttribute('xml:id')) {\r\n\r\n            // Remember that pos has this identifier\r\n            xmlid = c.getAttribute('xml:id');\r\n            // this.temp['target'][xmlid] =\r\n            start = this.temp['pos'];\r\n            end = this.temp['pos'];\r\n          }\r\n\r\n          // Node is a link\r\n          // Stricter: && c.hasAttribute('xlink:show')\r\n          else if (c.hasAttribute('xlink:href')) {\r\n\r\n            // Node is a continuation\r\n            if (c.getAttribute('xlink:show') == \"other\" &&\r\n                c.hasAttribute('data-action') &&\r\n                c.getAttribute('data-action') == \"join\"\r\n               ) {\r\n              xmlid = c.getAttribute('xlink:href').replace(/^#/, \"\");\r\n              start = this.temp['pos'];\r\n              end = this.temp['pos'];\r\n\r\n              // this.temp['target'][xmlid][1] = this.temp['pos'] -1;\r\n              // console.log(\"Here\");\r\n            }\r\n\r\n            // Node is a relation\r\n            // Stricter: c.getAttribute('xlink:show') == \"none\"\r\n            else {\r\n              let label;\r\n\r\n              // Get target id\r\n              target = c.getAttribute('xlink:href').replace(/^#/, \"\");\r\n\r\n              if (c.hasAttribute('xlink:title')) {\r\n                label = this._clean(c.getAttribute('xlink:title'));\r\n              };\r\n\r\n              // Remember the defined edge\r\n// WRONG!\r\n              var edge = {\r\n                label    : label,\r\n                srcStart : this.temp['pos'],\r\n                targetID : target\r\n              };\r\n\r\n              // TEMP: Hot-fix for root relations\r\n              if (!label.match(/--$/) && !label.match(/ROOT$/)) {\r\n                this.temp['edges'].push(edge);\r\n              };\r\n\r\n            };\r\n          };\r\n\r\n          // Go on with child nodes\r\n          if (c.hasChildNodes()) {\r\n            this._parse(0, c.childNodes, mark);\r\n          };\r\n\r\n\r\n          // The element is a defined anchor\r\n          if (xmlid !== undefined) {\r\n\r\n            // this.temp['target'][xmlid][1] = this.temp['pos'] -1;\r\n\r\n            // Element already defined\r\n            if (this.temp['target'][xmlid] !== undefined) {\r\n              const newtarget = this.temp['target'][xmlid];\r\n              end = this.temp['pos'] - 1;\r\n              newtarget[0] = start < newtarget[0] ? start : newtarget[0];\r\n              newtarget[1] = end > newtarget[1] ? end : newtarget[1];\r\n            }\r\n\r\n            // Element not yet defined\r\n            else {\r\n              end = this.temp['pos'] - 1;\r\n              this.temp['target'][xmlid] = [start, end];\r\n            };\r\n\r\n            /*\r\n            console.log('Target ' + xmlid + ' spans from ' +\r\n                        this.temp['target'][xmlid][0] +\r\n                        ' to ' +\r\n                        this.temp['target'][xmlid][1]\r\n                       );\r\n            */\r\n            xmlid = undefined;\r\n          }\r\n\r\n          // Current element describes an arc\r\n          else if (target !== undefined) {\r\n\r\n            // TODO: This does not work yet!\r\n            edge[\"srcEnd\"] = this.temp['pos'] -1;\r\n            // console.log('Here');\r\n\r\n            /*\r\n            console.log('Source spans from ' +\r\n                        edge[\"srcStart\"] +\r\n                        ' to ' +\r\n                        edge[\"srcEnd\"]\r\n                       );\r\n            */\r\n            target = undefined;\r\n          };\r\n        }\r\n\r\n        // Text node\r\n        else if (c.nodeType == 3) {\r\n\r\n          // Check, if there is a non-whitespace token\r\n          if (c.nodeValue !== undefined) {\r\n\r\n            const str = c.nodeValue.trim();\r\n\r\n            if (str !== undefined && str.length > 0) {\r\n\r\n              // Add token to token list\r\n              this.addToken(str);\r\n\r\n              // Move token position\r\n              this.temp['pos']++;\r\n            };\r\n          };\r\n        };\r\n      }, this);\r\n\r\n      // Todo: define edges here!\r\n    },\r\n\r\n    \r\n    // Remove foundry and layer for labels\r\n    _clean : function (title) {\r\n      return title.replace(_TermRE, \"$3\");\r\n    },\r\n\r\n    \r\n    // Return the number of leaf nodes\r\n    // (not necessarily part of a relation).\r\n    // Consecutive nodes that are not part of any\r\n    // relation are summarized in one node.\r\n    size : function () {\r\n      return this._tokens.length;\r\n    },\r\n\r\n    \r\n    // This is a shorthand for SVG element creation\r\n    _c : function (tag) {\r\n      return d.createElementNS(svgNS, tag);\r\n    },\r\n\r\n\r\n    // Get bounding box - with workaround for text nodes\r\n    _rect : function (node) {\r\n      if (node.tagName == \"tspan\" && !navigator.userAgent.match(/Edge/)) {\r\n        const range = d.createRange();\r\n        range.selectNode(node);\r\n        const rect = range.getBoundingClientRect();\r\n        range.detach();\r\n        return rect;\r\n      };\r\n      return node.getBoundingClientRect();\r\n    },\r\n\r\n\r\n    // Returns the center point of the requesting token\r\n    _tokenPoint : function (node) {\r\n\t    const box = this._rect(node);\r\n\t    return box.left + (box.width / 2);\r\n    },\r\n\r\n\r\n    // Draws an anchor\r\n    _drawAnchor : function (anchor) {\r\n\r\n      // Calculate the span of the first and last token, the anchor spans\r\n      const firstBox = this._rect(this._tokenElements[anchor.first]);\r\n      const lastBox  = this._rect(this._tokenElements[anchor.last]);\r\n\t\r\n      const y = this._y + (anchor.overlaps * this.anchorDiff) - this.anchorStart;\r\n      const l = this._c('path');\r\n      \r\n\t    this._arcsElement.appendChild(l);\r\n\r\n      const pathStr = \"M \" +\r\n          (firstBox.left - this.offsetLeft) +\r\n          \",\" +\r\n          y +\r\n          \" L \" +\r\n          (lastBox.right - this.offsetLeft) +\r\n          \",\" + y;\r\n\r\n      l.setAttribute(\"d\", pathStr);\r\n      l.setAttribute(\"class\", \"anchor\");\r\n      anchor.element = l;\r\n      anchor.y = y;\r\n      return l;\r\n    },\r\n    \r\n\r\n    // Create an arc with an optional label\r\n    // Potentially needs a height parameter for stacks\r\n    _drawArc : function (arc) {\r\n\r\n      const t = this;\r\n      let startPos, endPos;\r\n      let startY = this._y;\r\n      let endY = this._y;\r\n\t\r\n      if (arc.startAnchor !== undefined) {\r\n        startPos = t._tokenPoint(arc.startAnchor.element);\r\n        startY = arc.startAnchor.y;\r\n      }\r\n      else {\r\n        startPos = t._tokenPoint(t._tokenElements[arc.first]);\r\n      };\r\n\r\n      if (arc.endAnchor !== undefined) {\r\n        endPos = t._tokenPoint(arc.endAnchor.element)\r\n        endY = arc.endAnchor.y;\r\n      }\r\n      else {\r\n        endPos = t._tokenPoint(t._tokenElements[arc.last]);\r\n      };\r\n\r\n      startPos -= t.offsetLeft;\r\n      endPos -= t.offsetLeft;\r\n\r\n\t    // Special treatment for self-references\r\n      var overlaps = arc.overlaps;\r\n      if (startPos == endPos) {\r\n        startPos -= t.overlapDiff / 3;\r\n        endPos   += t.overlapDiff / 3;\r\n        overlaps += .5;\r\n      };\r\n\r\n      const g = t._c(\"g\");\r\n      g.setAttribute(\"class\", \"arc\");\r\n      const p = g.appendChild(t._c(\"path\"));\r\n      p.setAttribute('class', 'edge');\r\n      \r\n      // Attach the new arc before drawing, so computed values are available\r\n      t._arcsElement.appendChild(g);\r\n\r\n      // Create arc\r\n      let middle = Math.abs(endPos - startPos) / 2;\r\n\r\n      // TODO:\r\n      //   take the number of tokens into account!\r\n      let cHeight = t.arcDiff + (overlaps * t.overlapDiff) + (middle / 2);\r\n\r\n      // Respect the maximum height\r\n      cHeight = cHeight < t.maxArc ? cHeight : t.maxArc;\r\n\r\n      var x = Math.min(startPos, endPos);\r\n\r\n      //var controlY = (startY + endY - cHeight);\r\n      let controlY = (endY - cHeight);\r\n      \r\n      const arcE = \"M \"+ startPos + \",\" + startY +\r\n          \" C \" + startPos + \",\" + controlY +\r\n          \" \" + endPos + \",\" + controlY +\r\n          \" \" + endPos + \",\" + endY;\r\n\r\n      p.setAttribute(\"d\", arcE);\r\n\r\n      if (arc.direction !== undefined) {\r\n        p.setAttribute(\"marker-end\", \"url(#arr)\");\r\n        if (arc.direction === 'bi') {\r\n          p.setAttribute(\"marker-start\", \"url(#arr)\");\r\n        };\r\n      };\r\n\r\n      if (arc.label === undefined)\r\n        return g;\r\n      \r\n      /*\r\n       * Calculate the top point of the arc for labeling using\r\n       * de Casteljau's algorithm, see e.g.\r\n       * http://blog.sklambert.com/finding-the-control-points-of-a-bezier-curve/\r\n       * of course simplified to symmetric arcs ...\r\n       */\r\n      // Interpolate one side of the control polygon\r\n      let middleY = (((startY + controlY) / 2) + controlY) / 2;\r\n\r\n      // Create a boxed label\r\n      const label = this._c(\"g\");\r\n      label.setAttribute(\"class\", \"label\");\r\n      t._labelsElement.appendChild(label);\r\n\r\n      // Set arc reference\r\n      label.arcRef = g;\r\n\r\n      const that = t;\r\n      label.addEventListener('mouseenter', function () {\r\n        that.inFocus(this);\r\n      });\r\n\r\n      const labelE = label.appendChild(t._c(\"text\"));\r\n      labelE.setAttribute(\"x\", x + middle);\r\n      labelE.setAttribute(\"y\", middleY + 3);\r\n      labelE.setAttribute(\"text-anchor\", \"middle\");\r\n      const textNode = d.createTextNode(arc.label);\r\n      labelE.appendChild(textNode);\r\n\r\n      const labelBox   = labelE.getBBox();\r\n\r\n      /*\r\n      if (!labelBox)\r\n        console.log(\"----\");\r\n      */\r\n      \r\n      const textWidth  = labelBox.width; // labelE.getComputedTextLength();\r\n      const textHeight = labelBox.height; // labelE.getComputedTextLength();\r\n\r\n      // Add box with padding to left and right\r\n      const labelR = label.insertBefore(t._c(\"rect\"), labelE);\r\n      const boxWidth = textWidth + 2 * t.xPadding;\r\n      labelR.setAttribute(\"x\", x + middle - (boxWidth / 2));\r\n      labelR.setAttribute(\"ry\", 5);\r\n      labelR.setAttribute(\"y\", labelBox.y - t.yPadding);\r\n      labelR.setAttribute(\"width\", boxWidth);\r\n      labelR.setAttribute(\"height\", textHeight + 2 * t.yPadding);\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the svg element\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      // Create svg\r\n      const svg = this._c(\"svg\");\r\n\r\n      window.addEventListener(\"resize\", function () {\r\n        // TODO:\r\n        //   Only if text-size changed!\r\n        // TODO:\r\n        //   This is currently untested\r\n        this.show();\r\n      }.bind(this));\r\n\r\n      // Define marker arrows\r\n      const defs = svg.appendChild(this._c(\"defs\"));\r\n      const marker = defs.appendChild(this._c(\"marker\"));\r\n      marker.setAttribute(\"refX\", 9);\r\n      marker.setAttribute(\"id\", \"arr\");\r\n      marker.setAttribute(\"orient\", \"auto-start-reverse\");\r\n      marker.setAttribute(\"markerUnits\",\"userSpaceOnUse\");\r\n\r\n      const arrow = this._c(\"path\");\r\n      arrow.setAttribute(\"transform\", \"scale(0.8)\");\r\n      arrow.setAttribute(\"d\", \"M 0,-5 0,5 10,0 Z\");\r\n      marker.appendChild(arrow);\r\n\r\n      this._el = svg;\r\n      return this._el;\r\n    },\r\n\r\n\r\n    // Add a relation with a start, an end,\r\n    // a direction value and an optional label text\r\n    addRel : function (rel) {\r\n      this._arcs.push(rel);\r\n      return this;\r\n    },\r\n\r\n\r\n    // Add a token to the list (this will mostly be a word)\r\n    addToken : function(token) {\r\n      this._tokens.push(token);\r\n      return this;\r\n    },\r\n\r\n\r\n    // Move label and arc in focus\r\n    inFocus : function (element) {\r\n      let cif;\r\n\r\n      if (this._currentInFocus) {\r\n\r\n        // Already in focus\r\n        if (this._currentInFocus === element)\r\n          return;\r\n\r\n        cif = this._currentInFocus;\r\n        cif.classList.remove('infocus');\r\n        cif.arcRef.classList.remove('infocus');\r\n      };\r\n\r\n      cif = this._currentInFocus = element;\r\n      this._labelsElement.appendChild(cif);\r\n      this._arcsElement.appendChild(cif.arcRef);\r\n      cif.classList.add('infocus');\r\n      cif.arcRef.classList.add('infocus');\r\n    },\r\n    \r\n\r\n    /*\r\n     * All arcs need to be sorted before shown,\r\n     * to avoid nesting.\r\n     */\r\n    _sortArcs : function () {\r\n\r\n      // TODO:\r\n      //   Keep in mind that the arcs may have long anchors!\r\n      //   1. Iterate over all arcs\r\n      //   2. Sort all multi\r\n      let anchors = {};\r\n      \r\n      // 1. Sort by length\r\n      // 2. Tag all spans with the number of overlaps before\r\n      //    a) Iterate over all spans\r\n      //    b) check the latest preceeding overlapping span (lpos)\r\n      //       -> not found: tag with 0\r\n      //       -> found: Add +1 to the level of the (lpos)\r\n      //    c) If the new tag is smaller than the previous element,\r\n      //       reorder\r\n\r\n      // Normalize start and end\r\n      const sortedArcs = this._arcs.map(function (v) {\r\n\r\n        // Check for long anchors\r\n        if (v.start instanceof Array) {\r\n\r\n          if (v.start[0] == v.start[1]) {\r\n            v.start = v.start[0];\r\n          }\r\n\r\n          else {\r\n          \r\n            const middle = Math.ceil(Math.abs(v.start[1] - v.start[0]) / 2) + v.start[0];\r\n\r\n            // Calculate signature to avoid multiple anchors\r\n            let anchorSig = \"#\" + v.start[0] + \"_\" + v.start[1];\r\n\r\n            // Reverse signature\r\n            if (v.start[0] > v.start[1]) {\r\n              anchorSig = \"#\" + v.start[1] + \"_\" + v.start[0];\r\n            };\r\n            \r\n            // Check if the anchor already exist\r\n            let anchor = anchors[anchorSig];\r\n            if (anchor === undefined) {\r\n              anchor = {\r\n                \"first\":   v.start[0],\r\n                \"last\" :   v.start[1],\r\n                \"length\" : v.start[1] - v.start[0]\r\n              };\r\n              anchors[anchorSig] = anchor;\r\n            };\r\n\r\n            v.startAnchor = anchor;\r\n\r\n            // Add to anchors list\r\n            v.start = middle;\r\n          };\r\n        };\r\n\r\n        if (v.end instanceof Array) {\r\n\r\n          if (v.end[0] == v.end[1]) {\r\n            v.end = v.end[0];\r\n          }\r\n\r\n          else {\r\n\r\n            const middle = Math.abs(v.end[0] - v.end[1]) + v.end[0];\r\n\r\n            // Calculate signature to avoid multiple anchors\r\n            let anchorSig = \"#\" + v.end[0] + \"_\" + v.end[1];\r\n\r\n            // Reverse signature\r\n            if (v.end[0] > v.end[1]) {\r\n              anchorSig = \"#\" + v.end[1] + \"_\" + v.end[0];\r\n            };\r\n\r\n            // Check if the anchor already exist\r\n            var anchor = anchors[anchorSig];\r\n            if (anchor === undefined) {\r\n              anchor = {\r\n                \"first\":   v.end[0],\r\n                \"last\" :   v.end[1],\r\n                \"length\" : v.end[1] - v.end[0]\r\n              };\r\n              anchors[anchorSig] = anchor;\r\n            };\r\n            \r\n            v.endAnchor = anchor;\r\n\r\n            // Add to anchors list\r\n            v.end = middle;\r\n          };\r\n        };\r\n\r\n        v.first = v.start;\r\n        v.last  = v.end;\r\n\r\n        // calculate the arch length\r\n        if (v.start < v.end) {\r\n          v.length = v.end - v.start;\r\n        }\r\n\r\n        else {\r\n          v.length = v.start - v.end;\r\n        };\r\n\r\n        return v;\r\n      });\r\n\r\n      // Sort based on length\r\n      sortedArcs.sort(function (a, b) {\r\n        if (a.length < b.length)\r\n          return -1;\r\n        else\r\n          return 1;\r\n      });\r\n\r\n      // Add sorted arcs and anchors\r\n      this._sortedArcs    = lengthSort(sortedArcs, false);\r\n      this._sortedAnchors = lengthSort(Object.values(anchors), true);\r\n    },\r\n\r\n\r\n    /**\r\n     * Center the viewport of the canvas\r\n     * TODO:\r\n     *   This is identical to treehierarchy\r\n     */\r\n    center : function () {\r\n      if (this._el === undefined)\r\n       return;\r\n\r\n      const treeDiv = this._el.parentNode;\r\n\r\n      const cWidth = parseFloat(window.getComputedStyle(this._el).width);\r\n      const treeWidth = parseFloat(window.getComputedStyle(treeDiv).width);\r\n      // Reposition:\r\n      if (cWidth > treeWidth) {\r\n       var scrollValue = (cWidth - treeWidth) / 2;\r\n       treeDiv.scrollLeft = scrollValue;\r\n      };\r\n    },\r\n\r\n\r\n    // Show the element\r\n    show : function () {\r\n      const t = this;\r\n      const svg = this._el;\r\n      const height = this.maxArc;\r\n\r\n      // Delete old group\r\n      if (svg.getElementsByTagName(\"g\")[0] !== undefined) {\r\n        svg.removeChild(\r\n          svg.getElementsByTagName(\"g\")[0]\r\n        );\r\n        t._tokenElements = [];\r\n      };\r\n\r\n      const g = svg.appendChild(t._c(\"g\"));\r\n\r\n      // Draw token list\r\n      const text = g.appendChild(t._c(\"text\"));\r\n      text.setAttribute('class', 'leaf');\r\n      text.setAttribute(\"text-anchor\", \"start\");\r\n      text.setAttribute(\"y\", height);\r\n\r\n      // Calculate the start position\r\n      t._y = height - (t.anchorStart);\r\n\r\n      // Introduce some prepending whitespace (yeah - I know ...)\r\n      const ws = text.appendChild(t._c(\"tspan\"));\r\n      ws.appendChild(d.createTextNode('\\u00A0'));\r\n      ws.style.textAnchor = \"start\";\r\n      \r\n      t._tokens.forEach(function(node_i) {\r\n        // Append svg\r\n        // var x = text.appendChild(this._c(\"text\"));\r\n        const tspan = text.appendChild(this._c(\"tspan\"));\r\n        tspan.appendChild(d.createTextNode(node_i));\r\n        tspan.setAttribute(\"text-anchor\", \"middle\");\r\n        \r\n        this._tokenElements.push(tspan);\r\n\r\n        // Add whitespace!\r\n        tspan.setAttribute(\"dx\", this.tokenSep);\r\n      }, t);\r\n\r\n      // Get some global position data that may change on resize\r\n      t.offsetLeft = t._rect(g).left;\r\n\r\n      // The group of arcs\r\n      const arcs = g.appendChild(t._c(\"g\"));\r\n      t._arcsElement = arcs;\r\n      arcs.classList.add(\"arcs\");\r\n\r\n      const labels = g.appendChild(t._c(\"g\"));\r\n      t._labelsElement = labels;\r\n      labels.classList.add(\"labels\");\r\n\r\n      // Sort arcs if not sorted yet\r\n      if (t._sortedArcs === undefined)\r\n        t._sortArcs();\r\n\r\n      // 1. Draw all anchors\r\n      t._sortedAnchors.forEach(\r\n        i => t._drawAnchor(i)\r\n      );\r\n\r\n      // 2. Draw all arcs\r\n      t._sortedArcs.forEach(\r\n        i => t._drawArc(i)\r\n      );\r\n\r\n      // Resize the svg with some reasonable margins\r\n      svg.setAttribute(\"width\", t._rect(text).width + 20);\r\n      svg.setAttribute(\"height\", height + 20);\r\n      svg.setAttribute(\"class\", \"relTree\");\r\n    }\r\n  };\r\n\r\n  // Sort relations regarding their span\r\n  function lengthSort (list, inclusive) {\r\n\r\n    /*\r\n     * The \"inclusive\" flag allows to\r\n     * modify the behaviour for inclusivity check,\r\n     * e.g. if identical start or endpoints mean overlap or not.\r\n     */\r\n    \r\n    let stack = [];\r\n\r\n    // Iterate over all definitions\r\n    list.forEach(function(current) {\r\n\r\n      // Check the stack order\r\n      let overlaps = 0;\r\n      let check;\r\n      for (let j = (stack.length - 1); j >= 0; j--) {\r\n        check = stack[j];\r\n\r\n        // (a..(b..b)..a)\r\n        if (current.first <= check.first && current.last >= check.last) {\r\n          overlaps = check.overlaps + 1;\r\n          break;\r\n        }\r\n\r\n        // (a..(b..a)..b)\r\n        else if (current.first <= check.first && current.last >= check.first) {\r\n\r\n          if (inclusive || (current.first != check.first && current.last != check.first)) {\r\n            overlaps = check.overlaps + (current.length == check.length ? 0 : 1);\r\n          };\r\n        }\r\n        \r\n        // (b..(a..b)..a)\r\n        else if (current.first <= check.last && current.last >= check.last) {\r\n\r\n          if (inclusive || (current.first != check.last && current.last != check.last)) {\r\n            overlaps = check.overlaps + (current.length == check.length ? 0 : 1);\r\n          };\r\n        };\r\n      };\r\n\r\n      // Set overlaps\r\n      current.overlaps = overlaps;\r\n\r\n      stack.push(current);\r\n\r\n      // Although it is already sorted,\r\n      // the new item has to be put at the correct place\r\n      // TODO:\r\n      //   Use something like splice() instead\r\n      stack.sort(function (a,b) {\r\n        b.overlaps - a.overlaps\r\n      });\r\n    });\r\n\r\n    return stack;\r\n  };\r\n});\r\n\n\r\n\r\ndefine('view/match/relations',[\r\n  'view',\r\n  'match/treehierarchy',\r\n  'match/treearc'\r\n], function (viewClass, matchTreeHierarchyClass, matchTreeArcClass) {\r\n\r\n  const d = document;\r\n  const loc   = KorAP.Locale;\r\n  loc.DOWNLOAD = loc.DOWNLOAD || 'Download';\r\n\r\n  \r\n  return {\r\n    create : function (match,foundry,layer,type) {\r\n      return Object.create(viewClass)\r\n        ._init(['relations'])\r\n        .upgradeTo(this)\r\n        ._init(match, foundry, layer, type);\r\n    },\r\n\r\n\r\n    // Initialize relations object\r\n    _init : function (match,foundry, layer, type) {\r\n      this._match = match;\r\n      this._foundry = foundry;\r\n      this._layer = layer;\r\n      this._type = type;\r\n      return this;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Meta view element\r\n     */\r\n    show : function () {\r\n\r\n      if (this._show)\r\n        return this._show;\r\n\r\n      const matchtree = d.createElement('div');\r\n      matchtree.classList.add('matchtree', 'loading');\r\n\r\n      // Add title line\r\n      const h6 = matchtree.addE('h6');\r\n      h6.addE('span').addT(this._foundry);\r\n      h6.addE('span').addT(this._layer);      \r\n\r\n      this._tree = matchtree.addE('div');\r\n\r\n      return this._show = matchtree;\r\n    },\r\n\r\n\r\n    /**\r\n     * Do after embedding\r\n     */\r\n    afterEmbed : function () {\r\n\r\n      const foundry = this._foundry,\r\n            layer = this._layer,\r\n            type = this._type;\r\n\r\n      const that = this,\r\n            tree = this._tree,\r\n            matchtree = this._show;\r\n\r\n      // Get tree data async\r\n      this.getData(foundry, layer, type, function (treeObj) {\r\n\r\n        matchtree.classList.remove('loading');\r\n\r\n        // Something went wrong - probably log!!!\r\n\r\n        if (treeObj === null) {\r\n          tree.addT('No data available.');\r\n        }\r\n        else {\r\n          tree.appendChild(treeObj.element());\r\n          treeObj.show();\r\n\r\n          // Reposition the view to the center\r\n          // (This may in a future release be a reposition\r\n          // to move the root to the actual match)\r\n\r\n          // This is currently not supported by relations\r\n          if (type === \"spans\") {\r\n\r\n            // Download link\r\n            that.actions().add(\r\n              loc.DOWNLOAD,\r\n              {'cls':['button-icon','download']},\r\n              function (e) {\r\n                const a = treeObj.downloadLink();\r\n                d.body.appendChild(a);\r\n                a.click();\r\n                d.body.removeChild(a)\r\n              }\r\n            );\r\n          };\r\n          \r\n          treeObj.center();\r\n        };\r\n      });\r\n\r\n      matchtree.classList.remove('loading');\r\n    },\r\n\r\n    /**\r\n     * Get match object\r\n     */\r\n    match : function () {\r\n      return this._match;\r\n    },\r\n\r\n\r\n    /**\r\n     * Retrieve and parse snippet for relation\r\n     * representation\r\n     */\r\n    getData : function (foundry, layer, type, cb) {\r\n      var focus = [];\r\n\r\n      try {\r\n        // TODO: Support and cache multiple trees\r\n        KorAP.API.getMatchInfo(\r\n          this._match, {\r\n            'spans' : true,\r\n            'foundry' : foundry,\r\n            'layer' : layer\r\n          },\r\n          function (matchResponse) {\r\n            if (matchResponse === undefined) {\r\n              cb(null);\r\n              return;\r\n            };\r\n\r\n            // Get snippet from match info\r\n            if (matchResponse[\"snippet\"] !== undefined) {\r\n\r\n              // Todo: This should be cached somehow\r\n\r\n              if (type === \"spans\") {\r\n                cb(matchTreeHierarchyClass.create(matchResponse[\"snippet\"]));\r\n              }\r\n              else if (type === \"rels\") {\r\n                cb(matchTreeArcClass.create(matchResponse[\"snippet\"]));              \r\n              }\r\n\r\n              // Unknown tree type\r\n              else {\r\n                cb(null);\r\n              };\r\n            }\r\n            else {\r\n              cb(null);\r\n            };\r\n          }.bind(this)\r\n        );\r\n      }\r\n      catch (e) {\r\n        KorAP.log(0, e);\r\n        cb(null);\r\n      };\r\n    },\r\n  \r\n\r\n    // Delete circular references\r\n    onClose : function () {\r\n      this._match = undefined;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The match panel.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('panel/match',[\r\n  'panel',\r\n  'match/treeitem',\r\n  'view/match/tokentable',\r\n  'view/match/meta',\r\n  'view/match/relations',\r\n  'buttongroup/menu',\r\n], function (panelClass,treeItemClass,tableView,metaView,relationsView,buttonGroupMenuClass) {\r\n\r\n  // Override \r\n  KorAP.API.getMatchInfo = KorAP.API.getMatchInfo || function () {\r\n    KorAP.log(0, 'KorAP.API.getMatchInfo() not implemented')\r\n    return {};\r\n  };\r\n\r\n  const loc = KorAP.Locale;\r\n\r\n  loc.SHOWANNO  = loc.SHOWANNO  || 'Tokens';\r\n  loc.SHOW_META = loc.SHOW_META || 'Metadata';\r\n  loc.ADDTREE   = loc.ADDTREE   || 'Relations';\r\n\r\n  return {\r\n    create : function (match) {\r\n      return Object.create(panelClass)._init(['matchinfo']).upgradeTo(this)._init(match);\r\n    },\r\n\r\n    // Initialize match panel\r\n    _init : function (match) {\r\n\r\n      this._match = match;\r\n\r\n      const a = this.actions();\r\n\r\n      // TODO:\r\n      //   Ugly hack!\r\n      const cl = a.element().classList;\r\n      cl.remove('matchinfo');\r\n      cl.add('button-matchinfo');\r\n\r\n      // Add meta button\r\n      a.add(\r\n        loc.SHOW_META, {'cls':['metatable']}, function (e) {\r\n          this.addMeta();\r\n        }\r\n      );\r\n\r\n      // Add token annotation button\r\n      a.add(\r\n        loc.SHOWANNO, {'cls':['info']}, function (e) {\r\n          this.addTable();\r\n        }\r\n      );\r\n\r\n      // Add relations button\r\n      a.add(\r\n        loc.ADDTREE, {'cls':['tree']}, function (e) {\r\n\r\n          // Get global tree menu\r\n          if (KorAP.TreeMenu === undefined) {\r\n            KorAP.TreeMenu = buttonGroupMenuClass.create([], treeItemClass);\r\n            KorAP.TreeMenu.element().setAttribute('id', 'treeMenu');\r\n          };\r\n\r\n          const tm = KorAP.TreeMenu;\r\n\r\n          // Set panel\r\n          tm.panel(this);\r\n\r\n          // Reread list\r\n          tm.readItems(this._treeMenuList());\r\n\r\n          // Reposition and show menu\r\n          tm.show();\r\n          tm.button(this.button);\r\n          tm.focus();\r\n        }\r\n      );\r\n\r\n      // If plugins are enabled, add all buttons for the match panel\r\n      if (KorAP.Plugin) {\r\n        const matchButtons = KorAP.Plugin.buttonGroup(\"match\");\r\n        if (matchButtons) {\r\n\r\n          // Add all matchbuttons in order\r\n          matchButtons.forEach(m => a.add.apply(a, m));\r\n        };\r\n      };\r\n\r\n      return this;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Add meta view to panel\r\n     */\r\n    addMeta : function () {\r\n      const t = this;\r\n      if (t._metaView && t._metaView.shown())\r\n        return;\r\n\r\n      t._metaView = metaView.create(t._match);\r\n      t.add(t._metaView);\r\n    },\r\n\r\n    \r\n    /**\r\n     * Add table view to panel\r\n     */\r\n    addTable : function () {\r\n      const t = this;\r\n      if (t._tableView && t._tableView.shown())\r\n        return;\r\n      t._tableView = tableView.create(t._match);\r\n      t.add(t._tableView);\r\n    },\r\n\r\n\r\n    /**\r\n     * Add Tree view to panel\r\n     */\r\n    addTree : function (foundry, layer, type) {\r\n      this.add(\r\n        relationsView.create(this._match, foundry, layer, type)\r\n      );\r\n      \r\n    },\r\n\r\n\r\n    // Return tree menu list\r\n    _treeMenuList : function () {\r\n     \r\n      if (this._menuList)\r\n        return this._menuList;\r\n\r\n      // Join spans and relations\r\n      let treeLayers = []\r\n\r\n      const match = this._match;\r\n      match.getSpans().forEach(i => treeLayers.push(i));\r\n      match.getRels().forEach(i => treeLayers.push(i));\r\n\r\n      // Get spans\r\n      treeLayers = treeLayers.sort(\r\n        function (a, b) {\r\n          if (a.foundry < b.foundry) {\r\n            return -1;\r\n          }\r\n          else if (a.foundry > b.foundry) {\r\n            return 1;\r\n          }\r\n          else if (a.layer < b.layer) {\r\n            return -1;\r\n          }\r\n          else if (a.layer > b.layer) {\r\n            return 1;\r\n          };\r\n          return 0;\r\n        });\r\n      \r\n      let menuList = [];\r\n      \r\n      // Show tree views\r\n      treeLayers.forEach(\r\n        s => \r\n          // Add foundry/layer to menu list\r\n          menuList.push([\r\n            s.foundry + '/' + s.layer,\r\n            s.foundry,\r\n            s.layer,\r\n            s.type\r\n          ]));\r\n\r\n      // Create tree menu\r\n      this._menuList = menuList;\r\n      return menuList;\r\n    }   \r\n  }\r\n});\r\n\n/**\r\n * Get information on matches,\r\n * generate annotation tables and trees.\r\n *\r\n * @author Nils Diewald\r\n */\r\n/*\r\n * - Highlight (at least mark as bold) the match\r\n * - Scroll to match vertically per default\r\n * - A click on a table field and a tree node should at the field description to the fragments list.\r\n */\r\n\r\n\r\ndefine('match',[\r\n  'buttongroup',\r\n  'panel/match',\r\n\t'util'\r\n], function (buttonGroupClass,matchPanelClass) {\r\n\r\n  // Localization values\r\n  const loc   = KorAP.Locale;\r\n  loc.MINIMIZE     = loc.MINIMIZE  || 'Minimize';\r\n  \r\n  // 'corpusID', 'docID', 'textID'\r\n  const _matchTerms  = ['textSigle', 'matchID', 'available'];\r\n\r\n  const d = document;\r\n\r\n  /**\r\n   * Match object\r\n   */\r\n  return {\r\n\r\n    /**\r\n     * Create a new match object.\r\n     * Expects an element with match descriptions.\r\n     */\r\n    create : function (match) {\r\n      return Object.create(this)._init(match);\r\n    },\r\n\r\n\r\n    /**\r\n     * Initialize match.\r\n     */\r\n    _init : function (match) {\r\n      const t= this;\r\n      t._el = null;\r\n      t._initialized = false;\r\n\r\n      // No match defined\r\n      if (arguments.length < 1 ||\r\n          match === null ||\r\n          match === undefined) {\r\n        throw new Error('Missing parameters');\r\n      }\r\n\r\n      // Match defined as a node\r\n      else if (match instanceof Node) {\r\n        t._el  = match;\r\n\r\n        // Circular reference !!\r\n        match[\"_match\"] = t;\r\n\r\n        if (match.hasAttribute('data-text-sigle')) {\r\n          t.textSigle = match.getAttribute('data-text-sigle')\r\n        }\r\n        else {\r\n          t.textSigle = match.getAttribute('data-corpus-id') +\r\n            '/' +\r\n            match.getAttribute('data-doc-id') +\r\n            '/' +\r\n            match.getAttribute('data-text-id');\r\n        };\r\n\r\n        t.matchID   = match.getAttribute('data-match-id');\r\n        \r\n        // List of available annotations\r\n        t.available = match.getAttribute('data-available-info').split(' ');\r\n      }\r\n\r\n      // Match as an object\r\n      else {\r\n\r\n        // Iterate over allowed match terms\r\n        _matchTerms.forEach(function(term) {\r\n          this[term] = match[term] !== undefined ? match[term] : undefined;\r\n        }, t);\r\n      };\r\n      \r\n      t._avail = {\r\n        tokens : [],\r\n        spans  : [],\r\n        rels   : []\r\n      };\r\n\r\n      // Iterate over info layers\r\n      let layer;\r\n      t.available.forEach(function(term){\r\n\r\n        // Create info layer objects\r\n        try {\r\n          layer = require('match/infolayer').create(term);\r\n          this._avail[layer.type].push(layer);\r\n        }\r\n        catch (e) {\r\n          return;\r\n        };\r\n      }, t);\r\n      \r\n      return t;\r\n    },\r\n\r\n    /**\r\n     * Return a list of parseable tree annotations.\r\n     */\r\n    getSpans : function () {\r\n      return this._avail.spans;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return a list of parseable token annotations.\r\n     */\r\n    getTokens : function () {\r\n      return this._avail.tokens;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return a list of parseable relation annotations.\r\n     */\r\n    getRels : function () {\r\n      return this._avail.rels;\r\n    },\r\n\r\n    /**\r\n     * Initialize match\r\n     */\r\n    init : function () {\r\n      const t = this;\r\n      if (t._initialized)\r\n        return t;\r\n\r\n      // Add actions unless it's already activated\r\n      const element = t._el;\r\n\r\n      // There is an element to open\r\n      if (element === undefined || element === null)\r\n        return undefined;\r\n      \r\n      // Add meta button\r\n      const refLine = element.querySelector(\"p.ref\");\r\n\r\n      // No reference found\r\n      if (!refLine)\r\n        return undefined;\r\n\r\n      // Create panel\r\n      t.panel = matchPanelClass.create(t);\r\n\r\n      t._el.insertBefore(\r\n        t.panel.element(),\r\n        t._el.querySelector(\"p.ref\")\r\n      );\r\n\r\n      // Insert before reference line\r\n      refLine.insertBefore(\r\n        t.panel.actions().element(),\r\n        refLine.firstChild\r\n      );\r\n\r\n      t._initialized = true;\r\n      return t;\r\n    },\r\n\r\n    /**\r\n     * Open match\r\n     */\r\n    open : function () {\r\n      \r\n      // Add actions unless it's already activated\r\n      const element = this._el;\r\n\r\n      // There is an element to open\r\n      if (element === undefined || element === null)\r\n        return false;\r\n\r\n      // The element is already opened\r\n      if (element.classList.contains('active'))\r\n        return false;\r\n      \r\n      // Add active class to element\r\n      element.classList.add('active');\r\n\r\n      const btn = buttonGroupClass.create(\r\n        ['action','button-view']\r\n      );\r\n\r\n      const that = this;\r\n      btn.add(loc.MINIMIZE, {'cls':['button-icon','minimize']}, function () {\r\n        that.minimize();\r\n      });\r\n      element.appendChild(btn.element());\r\n      \r\n      if (this.init() == undefined) {\r\n        return false;\r\n      };\r\n      \r\n      return true;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Toggle match view\r\n     */\r\n    toggle : function () {\r\n      if (this._el.classList.contains('active'))\r\n        this.minimize();\r\n      else\r\n        this.open();\r\n    },\r\n\r\n\r\n    /**\r\n     * Minimize info view\r\n     */\r\n    minimize : function () {\r\n      this._el.classList.remove('active');\r\n    },\r\n\r\n    \r\n    /**\r\n     * Get match element.\r\n     */\r\n    element : function () {\r\n      return this._el; // May be null\r\n    }\r\n  };\r\n});\r\n\n// Input field for queries\r\n/*\r\n * TODO: Support alert for query problems.\r\n */\r\n\r\n\r\n\r\ndefine('hint/input',['util'], function () {\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create a new input field.\r\n     */\r\n    create : function (element) {\r\n      return Object.create(this)._init(element);\r\n    },\r\n\r\n\r\n    // Initialize new input field\r\n    _init : function (element) {\r\n      this._el = element;\r\n\r\n      this._container = document.createElement(\"div\");\r\n      this._container.setAttribute('id', 'hint');\r\n\r\n      // Create mirror for searchField\r\n      // This is important for positioning\r\n      // if ((this._mirror = document.getElementById(\"searchMirror\")) === null) {\r\n      this._mirror = document.createElement(\"div\");\r\n      const m = this._mirror;\r\n      m.classList.add('hint', 'mirror');\r\n      m.addE(\"span\");\r\n      m.appendChild(this._container);\r\n      m.style.height = \"0px\";\r\n      document.getElementsByTagName(\"body\")[0].appendChild(m);\r\n\r\n      // Update position of the mirror\r\n      const re = this.reposition.bind(this);\r\n      window.addEventListener('resize', re);\r\n      this._el.addEventListener('onfocus', re);\r\n      this.reposition();\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the mirrored input field.\r\n     */\r\n    mirror : function () {\r\n      return this._mirror;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the container element.\r\n     * This contains the hint helper / menus\r\n     * and probably an\r\n     * error message.\r\n     */\r\n    container : function () {\r\n      return this._container;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the input element the\r\n     * hint helper is attached to.\r\n     */\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the value of the input field\r\n     * the hint helper is attached to.\r\n     */\r\n    value : function () {\r\n      return this._el.value;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the value of the input field mirror.\r\n     */\r\n    mirrorValue : function () {\r\n      return this._mirror.firstChild.textContent;\r\n    },\r\n\r\n\r\n    /**\r\n     * Reset the input value\r\n     */\r\n    reset : function () {\r\n      this._el.value = \"\";\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the mirror content.\r\n     */\r\n    update : function () {\r\n      this._mirror.firstChild.textContent = this._split()[0];\r\n      this._container.style.left = this._rightPos() + 'px';\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Insert text into the mirror.\r\n     * This is a prefix of the input field's\r\n     * value.\r\n     */\r\n    insert : function (text) {\r\n      const splittedText = this._split();\r\n      const s = this._el;\r\n      s.value = splittedText[0] + text + splittedText[1];\r\n      s.selectionStart = (splittedText[0] + text).length;\r\n      s.selectionEnd = s.selectionStart;\r\n\r\n      // Maybe update?\r\n      this._mirror.firstChild.textContent = splittedText[0] + text;\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Move hinthelper to given character position\r\n     */\r\n    moveto : function (charpos) {\r\n      const e = this._el;\r\n      e.selectionStart = charpos;\r\n      e.selectionEnd = charpos;\r\n      e.focus();\r\n      return this.update();\r\n    },\r\n\r\n\r\n    /**\r\n     * Reposition the input mirror directly\r\n     * below the input box.\r\n     */\r\n    reposition : function () {\r\n      const inputClientRect = this._el.getBoundingClientRect();\r\n      const inputStyle = window.getComputedStyle(this._el, null);\r\n\r\n      const bodyClientRect = \r\n            document.getElementsByTagName('body')[0].getBoundingClientRect();\r\n\r\n      // Reset position\r\n      const mirrorStyle = this._mirror.style;\r\n      mirrorStyle.left  = parseInt(inputClientRect.left) + \"px\";\r\n      mirrorStyle.top   = parseInt(inputClientRect.bottom - bodyClientRect.top) + \"px\";\r\n      mirrorStyle.width = inputStyle.getPropertyValue(\"width\");\r\n\r\n      // These may be relevant in case of media depending css\r\n      mirrorStyle.paddingLeft     = inputStyle.getPropertyValue(\"padding-left\");\r\n      mirrorStyle.marginLeft      = inputStyle.getPropertyValue(\"margin-left\");\r\n      mirrorStyle.borderLeftWidth = inputStyle.getPropertyValue(\"border-left-width\");\r\n      mirrorStyle.borderLeftStyle = inputStyle.getPropertyValue(\"border-left-style\");\r\n      mirrorStyle.fontSize        = inputStyle.getPropertyValue(\"font-size\");\r\n      mirrorStyle.fontFamily      = inputStyle.getPropertyValue(\"font-family\");\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the context, which is the input\r\n     * field's value bounded to the\r\n     * cursor position.\r\n     */\r\n    context : function () {\r\n      return this._split()[0];\r\n    },\r\n\r\n\r\n    // Get the right position\r\n    _rightPos : function () {\r\n      const box = this._mirror.firstChild.getBoundingClientRect();\r\n      return box.right - box.left;\r\n    },\r\n\r\n\r\n    /*\r\n     * Return two substrings,\r\n     * splitted at a given position\r\n     * or at the current cursor position.\r\n     */\r\n    _split : function (start) {\r\n      const s = this._el;\r\n      const value = s.value;\r\n\r\n      // Get start from cursor position\r\n      if (arguments.length === 0)\r\n        start = s.selectionStart;\r\n\r\n      return new Array(\r\n        value.substring(0, start),\r\n        value.substring(start, value.length)\r\n      );\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * API/ skeleton/ base class for an item contained within a container.\r\n * Here we see which functions container supports for containerItems.\r\n * \r\n * @author Leo Repp\r\n */\r\n\r\n\r\n//\"use strict\";\r\n\r\ndefine('container/containeritem',{\r\n\r\n  /**\r\n   * API for an item contained within a container\r\n   */\r\n  create : function () {\r\n    return Object.create(this); //._init();\r\n  },\r\n\r\n  /**\r\n   * 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 (let prop in props) {\r\n      this[prop] = props[prop];\r\n    };\r\n    return this;\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});\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      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, 0 to length-1 = in container\r\n\r\n      \r\n      //t._el.classList.add('visible'); //Done by containermenu\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 (let prop in props) {\r\n        this[prop] = props[prop];\r\n      };\r\n      return this;\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      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    /**\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     * 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});\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 two 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\r\n        // finally show the element\r\n        t._el.classList.add('visible');\r\n        t.container()._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      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 * Intro.js v2.9.3\r\n * https://github.com/usablica/intro.js\r\n *\r\n * Copyright (C) 2017 Afshin Mehrabani (@afshinmeh)\r\n */\r\n\r\n(function(f) {\r\n    if (typeof exports === \"object\" && typeof module !== \"undefined\") {\r\n        module.exports = f();\r\n        // deprecated function\r\n        // @since 2.8.0\r\n        module.exports.introJs = function () {\r\n          console.warn('Deprecated: please use require(\"intro.js\") directly, instead of the introJs method of the function');\r\n          // introJs()\r\n          return f().apply(this, arguments);\r\n        };\r\n    } else if (typeof define === \"function\" && define.amd) {\r\n        define('lib/intro',[], f);\r\n    } else {\r\n        var g;\r\n        if (typeof window !== \"undefined\") {\r\n            g = window;\r\n        } else if (typeof global !== \"undefined\") {\r\n            g = global;\r\n        } else if (typeof self !== \"undefined\") {\r\n            g = self;\r\n        } else {\r\n            g = this;\r\n        }\r\n        g.introJs = f();\r\n    }\r\n})(function () {\r\n  //Default config/variables\r\n  var VERSION = '2.9.3';\r\n\r\n  /**\r\n   * IntroJs main class\r\n   *\r\n   * @class IntroJs\r\n   */\r\n  function IntroJs(obj) {\r\n    this._targetElement = obj;\r\n    this._introItems = [];\r\n\r\n    this._options = {\r\n      /* Next button label in tooltip box */\r\n      nextLabel: 'Next &rarr;',\r\n      /* Previous button label in tooltip box */\r\n      prevLabel: '&larr; Back',\r\n      /* Skip button label in tooltip box */\r\n      skipLabel: 'Skip',\r\n      /* Done button label in tooltip box */\r\n      doneLabel: 'Done',\r\n      /* Hide previous button in the first step? Otherwise, it will be disabled button. */\r\n      hidePrev: false,\r\n      /* Hide next button in the last step? Otherwise, it will be disabled button. */\r\n      hideNext: false,\r\n      /* Default tooltip box position */\r\n      tooltipPosition: 'bottom',\r\n      /* Next CSS class for tooltip boxes */\r\n      tooltipClass: '',\r\n      /* CSS class that is added to the helperLayer */\r\n      highlightClass: '',\r\n      /* Close introduction when pressing Escape button? */\r\n      exitOnEsc: true,\r\n      /* Close introduction when clicking on overlay layer? */\r\n      exitOnOverlayClick: true,\r\n      /* Show step numbers in introduction? */\r\n      showStepNumbers: true,\r\n      /* Let user use keyboard to navigate the tour? */\r\n      keyboardNavigation: true,\r\n      /* Show tour control buttons? */\r\n      showButtons: true,\r\n      /* Show tour bullets? */\r\n      showBullets: true,\r\n      /* Show tour progress? */\r\n      showProgress: false,\r\n      /* Scroll to highlighted element? */\r\n      scrollToElement: true,\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      /* Padding to add after scrolling when element is not in the viewport (in pixels) */\r\n      scrollPadding: 30,\r\n      /* Set the overlay opacity */\r\n      overlayOpacity: 0.8,\r\n      /* Precedence of positions, when auto is enabled */\r\n      positionPrecedence: [\"bottom\", \"top\", \"right\", \"left\"],\r\n      /* Disable an interaction with element? */\r\n      disableInteraction: false,\r\n      /* Set how much padding to be used around helper element */\r\n      helperElementPadding: 10,\r\n      /* Default hint position */\r\n      hintPosition: 'top-middle',\r\n      /* Hint button label */\r\n      hintButtonLabel: 'Got it',\r\n      /* Adding animation to hints? */\r\n      hintAnimation: true,\r\n      /* additional classes to put on the buttons */\r\n      buttonClass: \"introjs-button\"\r\n    };\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   * @param {String} group\r\n   * @returns {Boolean} Success or not?\r\n   */\r\n  function _introForElement(targetElm, group) {\r\n    var allIntroSteps = targetElm.querySelectorAll(\"*[data-intro]\"),\r\n        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);\r\n\r\n        //set the step\r\n        currentItem.step = introItems.length + 1;\r\n\r\n        //use querySelector function only when developer used CSS selector\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        //intro without element\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 = document.createElement('div');\r\n            floatingElementQuery.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.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      }.bind(this));\r\n\r\n    } else {\r\n      //use steps from data-* annotations\r\n      var elmsLength = allIntroSteps.length;\r\n      var disableInteraction;\r\n      \r\n      //if there's no element to intro\r\n      if (elmsLength < 1) {\r\n        return false;\r\n      }\r\n\r\n      _forEach(allIntroSteps, function (currentElement) {\r\n        \r\n        // PR #80\r\n        // start intro for groups of elements\r\n        if (group && (currentElement.getAttribute(\"data-intro-group\") !== group)) {\r\n          return;\r\n        }\r\n\r\n        // skip hidden elements\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 (typeof (currentElement.getAttribute('data-disable-interaction')) !== 'undefined') {\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            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      }.bind(this));\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      var nextStep = 0;\r\n\r\n      _forEach(allIntroSteps, function (currentElement) {\r\n        \r\n        // PR #80\r\n        // start intro for groups of elements\r\n        if (group && (currentElement.getAttribute(\"data-intro-group\") !== group)) {\r\n          return;\r\n        }\r\n        \r\n        if (currentElement.getAttribute('data-step') === null) {\r\n\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 (typeof (currentElement.getAttribute('data-disable-interaction')) !== 'undefined') {\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            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      }.bind(this));\r\n    }\r\n\r\n    //removing undefined/null elements\r\n    var tempIntroItems = [];\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;\r\n\r\n    //Ok, sort all items with given steps\r\n    introItems.sort(function (a, b) {\r\n      return a.step - b.step;\r\n    });\r\n\r\n    //set it to the introJs object\r\n    this._introItems = introItems;\r\n\r\n    //add overlay layer to the page\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      }\r\n      //for window resize\r\n      DOMEvent.on(window, 'resize', _onResize, this, true);\r\n    }\r\n    return false;\r\n  }\r\n\r\n  function _onResize () {\r\n    this.refresh.call(this);\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  function _onKeyDown (e) {\r\n    var code = (e.code === null) ? e.which : e.code;\r\n\r\n    // if code/e.which is null\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 === 13) {\r\n      //srcElement === ie\r\n      var target = e.target || e.srcElement;\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      }\r\n\r\n      //prevent default behaviour on hitting Enter, to prevent steps being skipped in some browsers\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      var temp = {};\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      return temp;\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  function _goToStep(step) {\r\n    //because steps starts with zero\r\n    this._currentStep = step - 2;\r\n    if (typeof (this._introItems) !== 'undefined') {\r\n      _nextStep.call(this);\r\n    }\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  function _goToStepNumber(step) {\r\n    this._currentStepNumber = step;\r\n    if (typeof (this._introItems) !== 'undefined') {\r\n      _nextStep.call(this);\r\n    }\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  function _nextStep() {\r\n    this._direction = 'forward';\r\n\r\n    if (typeof (this._currentStepNumber) !== 'undefined') {\r\n      _forEach(this._introItems, function (item, i) {\r\n        if( item.step === this._currentStepNumber ) {\r\n          this._currentStep = i - 1;\r\n          this._currentStepNumber = undefined;\r\n        }\r\n      }.bind(this));\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.element);\r\n    }\r\n\r\n    // if `onbeforechange` returned `false`, stop displaying the element\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      _exitIntro.call(this, this._targetElement);\r\n      return;\r\n    }\r\n\r\n    _showElement.call(this, nextStep);\r\n  }\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  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\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.element);\r\n    }\r\n\r\n    // if `onbeforechange` returned `false`, stop displaying the element\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  /**\r\n   * Update placement of the intro objects on the screen\r\n   * @api private\r\n   */\r\n  function _refresh() {\r\n    // re-align intros\r\n    _setHelperLayerPosition.call(this, document.querySelector('.introjs-helperLayer'));\r\n    _setHelperLayerPosition.call(this, document.querySelector('.introjs-tooltipReferenceLayer'));\r\n    _setHelperLayerPosition.call(this, document.querySelector('.introjs-disableInteraction'));\r\n\r\n    // re-align tooltip\r\n    if(this._currentStep !== undefined && this._currentStep !== null) {\r\n      var oldHelperNumberLayer = document.querySelector('.introjs-helperNumberLayer'),\r\n        oldArrowLayer        = document.querySelector('.introjs-arrow'),\r\n        oldtooltipContainer  = document.querySelector('.introjs-tooltip');\r\n      _placeTooltip.call(this, this._introItems[this._currentStep].element, oldtooltipContainer, oldArrowLayer, oldHelperNumberLayer);\r\n    }\r\n\r\n    //re-align hints\r\n    _reAlignHints.call(this);\r\n    return this;\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  function _exitIntro(targetElement, force) {\r\n    var continueExit = true;\r\n\r\n    // calling onbeforeexit callback\r\n    //\r\n    // If this callback return `false`, it would halt the process\r\n    if (this._introBeforeExitCallback !== undefined) {\r\n      continueExit = this._introBeforeExitCallback.call(this);\r\n    }\r\n\r\n    // skip this check if `force` parameter is `true`\r\n    // otherwise, if `onbeforeexit` returned `false`, don't exit the intro\r\n    if (!force && continueExit === false) return;\r\n\r\n    //remove overlay layers from the page\r\n    var overlayLayers = targetElement.querySelectorAll('.introjs-overlay');\r\n\r\n    if (overlayLayers && overlayLayers.length) {\r\n      _forEach(overlayLayers, function (overlayLayer) {\r\n        overlayLayer.style.opacity = 0;\r\n        window.setTimeout(function () {\r\n          if (this.parentNode) {\r\n            this.parentNode.removeChild(this);\r\n          }\r\n        }.bind(overlayLayer), 500);\r\n      }.bind(this));\r\n    }\r\n\r\n    //remove all helper layers\r\n    var helperLayer = targetElement.querySelector('.introjs-helperLayer');\r\n    if (helperLayer) {\r\n      helperLayer.parentNode.removeChild(helperLayer);\r\n    }\r\n\r\n    var referenceLayer = targetElement.querySelector('.introjs-tooltipReferenceLayer');\r\n    if (referenceLayer) {\r\n      referenceLayer.parentNode.removeChild(referenceLayer);\r\n    }\r\n\r\n    //remove disableInteractionLayer\r\n    var disableInteractionLayer = targetElement.querySelector('.introjs-disableInteraction');\r\n    if (disableInteractionLayer) {\r\n      disableInteractionLayer.parentNode.removeChild(disableInteractionLayer);\r\n    }\r\n\r\n    //remove intro floating element\r\n    var floatingElement = document.querySelector('.introjsFloatingElement');\r\n    if (floatingElement) {\r\n      floatingElement.parentNode.removeChild(floatingElement);\r\n    }\r\n\r\n    _removeShowElement();\r\n\r\n    //remove `introjs-fixParent` class from the elements\r\n    var fixParents = document.querySelectorAll('.introjs-fixParent');\r\n    _forEach(fixParents, function (parent) {\r\n      _removeClass(parent, /introjs-fixParent/g);\r\n    });\r\n\r\n    //clean listeners\r\n    DOMEvent.off(window, 'keydown', _onKeyDown, this, true);\r\n    DOMEvent.off(window, 'resize', _onResize, this, true);\r\n\r\n    //check if any callback is defined\r\n    if (this._introExitCallback !== undefined) {\r\n      this._introExitCallback.call(this);\r\n    }\r\n\r\n    //set the step to zero\r\n    this._currentStep = undefined;\r\n  }\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 {HTMLElement} helperNumberLayer\r\n   * @param {Boolean} hintMode\r\n   */\r\n  function _placeTooltip(targetElement, tooltipLayer, arrowLayer, helperNumberLayer, hintMode) {\r\n    var tooltipCssClass = '',\r\n        currentStepObj,\r\n        tooltipOffset,\r\n        targetOffset,\r\n        windowSize,\r\n        currentTooltipPosition;\r\n\r\n    hintMode = hintMode || false;\r\n\r\n    //reset the old style\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\r\n    arrowLayer.style.display = 'inherit';\r\n\r\n    if (typeof(helperNumberLayer) !== 'undefined' && helperNumberLayer !== null) {\r\n      helperNumberLayer.style.top  = null;\r\n      helperNumberLayer.style.left = null;\r\n    }\r\n\r\n    //prevent error when `this._currentStep` is undefined\r\n    if (!this._introItems[this._currentStep]) return;\r\n\r\n    //if we have a custom css class for each step\r\n    currentStepObj = this._introItems[this._currentStep];\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).replace(/^\\s+|\\s+$/g, '');\r\n    tooltipLayer.setAttribute('role', 'dialog');\r\n\r\n    currentTooltipPosition = this._introItems[this._currentStep].position;\r\n\r\n    // Floating is always valid, no point in calculating\r\n    if (currentTooltipPosition !== \"floating\") { \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\r\n    _addClass(tooltipLayer, 'introjs-' + currentTooltipPosition);\r\n\r\n    switch (currentTooltipPosition) {\r\n      case 'top-right-aligned':\r\n        arrowLayer.className      = 'introjs-arrow bottom-right';\r\n\r\n        var tooltipLayerStyleRight = 0;\r\n        _checkLeft(targetOffset, tooltipLayerStyleRight, tooltipOffset, tooltipLayer);\r\n        tooltipLayer.style.bottom    = (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\r\n        var tooltipLayerStyleLeftRight = targetOffset.width / 2 - tooltipOffset.width / 2;\r\n\r\n        // a fix for middle aligned hints\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        tooltipLayer.style.bottom = (targetOffset.height + 20) + 'px';\r\n        break;\r\n\r\n      case 'top-left-aligned':\r\n      // top-left-aligned is the same as the default top\r\n      case 'top':\r\n        arrowLayer.className = 'introjs-arrow bottom';\r\n\r\n        tooltipLayerStyleLeft = (hintMode) ? 0 : 15;\r\n\r\n        _checkRight(targetOffset, tooltipLayerStyleLeft, tooltipOffset, windowSize, tooltipLayer);\r\n        tooltipLayer.style.bottom = (targetOffset.height +  20) + 'px';\r\n        break;\r\n      case 'right':\r\n        tooltipLayer.style.left = (targetOffset.width + 20) + 'px';\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 = \"-\" + (tooltipOffset.height - targetOffset.height - 20) + \"px\";\r\n        } else {\r\n          arrowLayer.className = 'introjs-arrow left';\r\n        }\r\n        break;\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 = \"-\" + (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        tooltipLayer.style.right = (targetOffset.width + 20) + 'px';\r\n\r\n        break;\r\n      case 'floating':\r\n        arrowLayer.style.display = 'none';\r\n\r\n        //we have to adjust the top and left of layer manually for intro items without element\r\n        tooltipLayer.style.left   = '50%';\r\n        tooltipLayer.style.top    = '50%';\r\n        tooltipLayer.style.marginLeft = '-' + (tooltipOffset.width / 2)  + 'px';\r\n        tooltipLayer.style.marginTop  = '-' + (tooltipOffset.height / 2) + 'px';\r\n\r\n        if (typeof(helperNumberLayer) !== 'undefined' && helperNumberLayer !== null) {\r\n          helperNumberLayer.style.left = '-' + ((tooltipOffset.width / 2) + 18) + 'px';\r\n          helperNumberLayer.style.top  = '-' + ((tooltipOffset.height / 2) + 18) + 'px';\r\n        }\r\n\r\n        break;\r\n      case 'bottom-right-aligned':\r\n        arrowLayer.className      = 'introjs-arrow top-right';\r\n\r\n        tooltipLayerStyleRight = 0;\r\n        _checkLeft(targetOffset, tooltipLayerStyleRight, tooltipOffset, tooltipLayer);\r\n        tooltipLayer.style.top    = (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\r\n        tooltipLayerStyleLeftRight = targetOffset.width / 2 - tooltipOffset.width / 2;\r\n\r\n        // a fix for middle aligned hints\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        tooltipLayer.style.top = (targetOffset.height + 20) + 'px';\r\n        break;\r\n\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      default:\r\n        arrowLayer.className = 'introjs-arrow top';\r\n\r\n        tooltipLayerStyleLeft = 0;\r\n        _checkRight(targetOffset, tooltipLayerStyleLeft, tooltipOffset, windowSize, tooltipLayer);\r\n        tooltipLayer.style.top    = (targetOffset.height +  20) + 'px';\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 = (windowSize.width - tooltipOffset.width - targetOffset.left) + 'px';\r\n      return false;\r\n    }\r\n    tooltipLayer.style.left = 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 = (-targetOffset.left) + 'px';\r\n      return false;\r\n    }\r\n    tooltipLayer.style.right = tooltipLayerStyleRight + 'px';\r\n    return true;\r\n  }\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  function _determineAutoPosition(targetElement, tooltipLayer, desiredTooltipPosition) {\r\n\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();\r\n\r\n    // 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    var calculatedPosition = \"floating\";\r\n\r\n    /*\r\n    * auto determine position \r\n    */\r\n\r\n    // Check for space below\r\n    if (targetElementRect.bottom + tooltipHeight + tooltipHeight > windowSize.height) {\r\n      _removeEntry(possiblePositions, \"bottom\");\r\n    }\r\n\r\n    // Check for space above\r\n    if (targetElementRect.top - tooltipHeight < 0) {\r\n      _removeEntry(possiblePositions, \"top\");\r\n    }\r\n\r\n    // Check for space to the right\r\n    if (targetElementRect.right + tooltipWidth > windowSize.width) {\r\n      _removeEntry(possiblePositions, \"right\");\r\n    }\r\n\r\n    // Check for space to the left\r\n    if (targetElementRect.left - tooltipWidth < 0) {\r\n      _removeEntry(possiblePositions, \"left\");\r\n    }\r\n\r\n    // @var {String}  ex: 'right-aligned'\r\n    var desiredAlignment = (function (pos) {\r\n      var hyphenIndex = pos.indexOf('-');\r\n      if (hyphenIndex !== -1) {\r\n        // has alignment\r\n        return pos.substr(hyphenIndex);\r\n      }\r\n      return '';\r\n    })(desiredTooltipPosition || '');\r\n\r\n    // strip alignment from position\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 (desiredTooltipPosition !== \"auto\" &&\r\n          possiblePositions.indexOf(desiredTooltipPosition) > -1) {\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    }\r\n\r\n    // only top and bottom positions have optional alignments\r\n    if (['top', 'bottom'].indexOf(calculatedPosition) !== -1) {\r\n      calculatedPosition += _determineAutoAlignment(targetElementRect.left, tooltipWidth, windowSize, desiredAlignment);\r\n    }\r\n\r\n    return calculatedPosition;\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  function _determineAutoAlignment (offsetLeft, tooltipWidth, windowSize, desiredAlignment) {\r\n    var halfTooltipWidth = tooltipWidth / 2,\r\n      winWidth = Math.min(windowSize.width, window.screen.width),\r\n      possibleAlignments = ['-left-aligned', '-middle-aligned', '-right-aligned'],\r\n      calculatedAlignment = '';\r\n    \r\n    // valid left must be at least a tooltipWidth\r\n    // away from right side\r\n    if (winWidth - offsetLeft < tooltipWidth) {\r\n      _removeEntry(possibleAlignments, '-left-aligned');\r\n    }\r\n\r\n    // valid middle must be at least half \r\n    // width away from both sides\r\n    if (offsetLeft < halfTooltipWidth || \r\n      winWidth - offsetLeft < halfTooltipWidth) {\r\n      _removeEntry(possibleAlignments, '-middle-aligned');\r\n    }\r\n\r\n    // valid right must be at least a tooltipWidth\r\n    // width away from left side\r\n    if (offsetLeft < tooltipWidth) {\r\n      _removeEntry(possibleAlignments, '-right-aligned');\r\n    }\r\n\r\n    if (possibleAlignments.length) {\r\n      if (possibleAlignments.indexOf(desiredAlignment) !== -1) {\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  /**\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.indexOf(stringToRemove) > -1) {\r\n      stringArray.splice(stringArray.indexOf(stringToRemove), 1);\r\n    }\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  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\r\n      var currentElement  = this._introItems[this._currentStep],\r\n          elementPosition = _getOffset(currentElement.element),\r\n          widthHeightPadding = this._options.helperElementPadding;\r\n\r\n      // 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      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      }\r\n\r\n      //set new position to helper layer\r\n      helperLayer.style.cssText = 'width: ' + (elementPosition.width  + widthHeightPadding)  + 'px; ' +\r\n                                        'height:' + (elementPosition.height + widthHeightPadding)  + 'px; ' +\r\n                                        'top:'    + (elementPosition.top    - widthHeightPadding / 2)   + 'px;' +\r\n                                        'left: '  + (elementPosition.left   - widthHeightPadding / 2)   + 'px;';\r\n\r\n    }\r\n  }\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  function _disableInteraction() {\r\n    var disableInteractionLayer = document.querySelector('.introjs-disableInteraction');\r\n\r\n    if (disableInteractionLayer === null) {\r\n      disableInteractionLayer = document.createElement('div');\r\n      disableInteractionLayer.className = 'introjs-disableInteraction';\r\n      this._targetElement.appendChild(disableInteractionLayer);\r\n    }\r\n\r\n    _setHelperLayerPosition.call(this, disableInteractionLayer);\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  /**\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  function _showElement(targetElement) {\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        oldHelperLayer = document.querySelector('.introjs-helperLayer'),\r\n        oldReferenceLayer = document.querySelector('.introjs-tooltipReferenceLayer'),\r\n        highlightClass = 'introjs-helperLayer',\r\n        nextTooltipButton,\r\n        prevTooltipButton,\r\n        skipTooltipButton,\r\n        scrollParent;\r\n\r\n    //check for a current step highlight class\r\n    if (typeof (targetElement.highlightClass) === 'string') {\r\n      highlightClass += (' ' + targetElement.highlightClass);\r\n    }\r\n    //check for options highlight class\r\n    if (typeof (this._options.highlightClass) === 'string') {\r\n      highlightClass += (' ' + this._options.highlightClass);\r\n    }\r\n\r\n    if (oldHelperLayer !== null) {\r\n      var oldHelperNumberLayer = oldReferenceLayer.querySelector('.introjs-helperNumberLayer'),\r\n          oldtooltipLayer      = oldReferenceLayer.querySelector('.introjs-tooltiptext'),\r\n          oldArrowLayer        = oldReferenceLayer.querySelector('.introjs-arrow'),\r\n          oldtooltipContainer  = oldReferenceLayer.querySelector('.introjs-tooltip');\r\n          \r\n      skipTooltipButton    = oldReferenceLayer.querySelector('.introjs-skipbutton');\r\n      prevTooltipButton    = oldReferenceLayer.querySelector('.introjs-prevbutton');\r\n      nextTooltipButton    = oldReferenceLayer.querySelector('.introjs-nextbutton');\r\n\r\n      //update or reset the helper highlight class\r\n      oldHelperLayer.className = highlightClass;\r\n      //hide the tooltip\r\n      oldtooltipContainer.style.opacity = 0;\r\n      oldtooltipContainer.style.display = \"none\";\r\n\r\n      if (oldHelperNumberLayer !== null) {\r\n        var lastIntroItem = this._introItems[(targetElement.step - 2 >= 0 ? targetElement.step - 2 : 0)];\r\n\r\n        if (lastIntroItem !== null && (this._direction === 'forward' && lastIntroItem.position === 'floating') || (this._direction === 'backward' && targetElement.position === 'floating')) {\r\n          oldHelperNumberLayer.style.opacity = 0;\r\n        }\r\n      }\r\n\r\n      // scroll to element\r\n      scrollParent = _getScrollParent( targetElement.element );\r\n\r\n      if (scrollParent !== document.body) {\r\n        // target is within a scrollable element\r\n        _scrollParentToElement(scrollParent, targetElement.element);\r\n      }\r\n\r\n      // set new position to helper layer\r\n      _setHelperLayerPosition.call(self, oldHelperLayer);\r\n      _setHelperLayerPosition.call(self, oldReferenceLayer);\r\n\r\n      //remove `introjs-fixParent` class from the elements\r\n      var fixParents = document.querySelectorAll('.introjs-fixParent');\r\n      _forEach(fixParents, function (parent) {\r\n        _removeClass(parent, /introjs-fixParent/g);\r\n      });\r\n      \r\n      //remove old classes if the element still exist\r\n      _removeShowElement();\r\n\r\n      //we should wait until the CSS3 transition is competed (it's 0.3 sec) to prevent incorrect `height` and `width` calculation\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 = targetElement.step;\r\n        }\r\n        //set current tooltip text\r\n        oldtooltipLayer.innerHTML = targetElement.intro;\r\n        //set the tooltip position\r\n        oldtooltipContainer.style.display = \"block\";\r\n        _placeTooltip.call(self, targetElement.element, oldtooltipContainer, oldArrowLayer, oldHelperNumberLayer);\r\n\r\n        //change active bullet\r\n        if (self._options.showBullets) {\r\n            oldReferenceLayer.querySelector('.introjs-bullets li > a.active').className = '';\r\n            oldReferenceLayer.querySelector('.introjs-bullets li > a[data-stepnumber=\"' + targetElement.step + '\"]').className = 'active';\r\n        }\r\n        oldReferenceLayer.querySelector('.introjs-progress .introjs-progressbar').style.cssText = 'width:' + _getProgress.call(self) + '%;';\r\n        oldReferenceLayer.querySelector('.introjs-progress .introjs-progressbar').setAttribute('aria-valuenow', _getProgress.call(self));\r\n\r\n        //show the tooltip\r\n        oldtooltipContainer.style.opacity = 1;\r\n        if (oldHelperNumberLayer) oldHelperNumberLayer.style.opacity = 1;\r\n\r\n        //reset button focus\r\n        if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null && /introjs-donebutton/gi.test(skipTooltipButton.className)) {\r\n          // skip button is now \"done\" button\r\n          skipTooltipButton.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        }\r\n\r\n        // change the scroll of the window, if needed\r\n        _scrollTo.call(self, targetElement.scrollTo, targetElement, oldtooltipLayer);\r\n      }, 350);\r\n\r\n      // end of old element if-else condition\r\n    } else {\r\n      var helperLayer       = document.createElement('div'),\r\n          referenceLayer    = document.createElement('div'),\r\n          arrowLayer        = document.createElement('div'),\r\n          tooltipLayer      = document.createElement('div'),\r\n          tooltipTextLayer  = document.createElement('div'),\r\n          bulletsLayer      = document.createElement('div'),\r\n          progressLayer     = document.createElement('div'),\r\n          buttonsLayer      = document.createElement('div');\r\n\r\n      helperLayer.className = highlightClass;\r\n      referenceLayer.className = 'introjs-tooltipReferenceLayer';\r\n\r\n      // scroll to element\r\n      scrollParent = _getScrollParent( targetElement.element );\r\n\r\n      if (scrollParent !== document.body) {\r\n        // target is within a scrollable element\r\n        _scrollParentToElement(scrollParent, targetElement.element);\r\n      }\r\n\r\n      //set new position to helper layer\r\n      _setHelperLayerPosition.call(self, helperLayer);\r\n      _setHelperLayerPosition.call(self, referenceLayer);\r\n\r\n      //add helper layer to target element\r\n      this._targetElement.appendChild(helperLayer);\r\n      this._targetElement.appendChild(referenceLayer);\r\n\r\n      arrowLayer.className = 'introjs-arrow';\r\n\r\n      tooltipTextLayer.className = 'introjs-tooltiptext';\r\n      tooltipTextLayer.innerHTML = targetElement.intro;\r\n\r\n      bulletsLayer.className = 'introjs-bullets';\r\n\r\n      if (this._options.showBullets === false) {\r\n        bulletsLayer.style.display = 'none';\r\n      }\r\n\r\n      var ulContainer = document.createElement('ul');\r\n      ulContainer.setAttribute('role', 'tablist');\r\n\r\n      var anchorClick = function () {\r\n          self.goToStep(this.getAttribute('data-stepnumber'));\r\n      };\r\n\r\n      _forEach(this._introItems, function (item, i) {\r\n        var innerLi    = document.createElement('li');\r\n        var anchorLink = document.createElement('a');\r\n        \r\n        innerLi.setAttribute('role', 'presentation');\r\n        anchorLink.setAttribute('role', 'tab');\r\n\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', item.step);\r\n\r\n        innerLi.appendChild(anchorLink);\r\n        ulContainer.appendChild(innerLi);\r\n      });\r\n\r\n      bulletsLayer.appendChild(ulContainer);\r\n\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      var progressBar = document.createElement('div');\r\n      progressBar.className = 'introjs-progressbar';\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:' + _getProgress.call(this) + '%;';\r\n\r\n      progressLayer.appendChild(progressBar);\r\n\r\n      buttonsLayer.className = 'introjs-tooltipbuttons';\r\n      if (this._options.showButtons === false) {\r\n        buttonsLayer.style.display = 'none';\r\n      }\r\n\r\n      tooltipLayer.className = 'introjs-tooltip';\r\n      tooltipLayer.appendChild(tooltipTextLayer);\r\n      tooltipLayer.appendChild(bulletsLayer);\r\n      tooltipLayer.appendChild(progressLayer);\r\n\r\n      //add helper layer number\r\n      var helperNumberLayer = document.createElement('span');\r\n      if (this._options.showStepNumbers === true) {\r\n        helperNumberLayer.className = 'introjs-helperNumberLayer';\r\n        helperNumberLayer.innerHTML = targetElement.step;\r\n        referenceLayer.appendChild(helperNumberLayer);\r\n      }\r\n\r\n      tooltipLayer.appendChild(arrowLayer);\r\n      referenceLayer.appendChild(tooltipLayer);\r\n\r\n      //next button\r\n      nextTooltipButton = document.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        }\r\n      };\r\n\r\n      _setAnchorAsButton(nextTooltipButton);\r\n      nextTooltipButton.innerHTML = this._options.nextLabel;\r\n\r\n      //previous button\r\n      prevTooltipButton = document.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;\r\n\r\n      //skip button\r\n      skipTooltipButton = document.createElement('a');\r\n      skipTooltipButton.className = this._options.buttonClass + ' introjs-skipbutton ';\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 (self._introItems.length - 1 !== self._currentStep && typeof (self._introExitCallback) === 'function') {\r\n          self._introExitCallback.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      buttonsLayer.appendChild(skipTooltipButton);\r\n\r\n      //in order to prevent displaying next/previous button always\r\n      if (this._introItems.length > 1) {\r\n        buttonsLayer.appendChild(prevTooltipButton);\r\n        buttonsLayer.appendChild(nextTooltipButton);\r\n      }\r\n\r\n      tooltipLayer.appendChild(buttonsLayer);\r\n\r\n      //set proper position\r\n      _placeTooltip.call(self, targetElement.element, tooltipLayer, arrowLayer, helperNumberLayer);\r\n\r\n      // change the scroll of the window, if needed\r\n      _scrollTo.call(this, targetElement.scrollTo, targetElement, tooltipLayer);\r\n\r\n      //end of new element if-else condition\r\n    }\r\n\r\n    // removing previous disable interaction layer\r\n    var disableInteractionLayer = self._targetElement.querySelector('.introjs-disableInteraction');\r\n    if (disableInteractionLayer) {\r\n      disableInteractionLayer.parentNode.removeChild(disableInteractionLayer);\r\n    }\r\n\r\n    //disable interaction\r\n    if (targetElement.disableInteraction) {\r\n      _disableInteraction.call(self);\r\n    }\r\n\r\n    // when it's the first step of tour\r\n    if (this._currentStep === 0 && this._introItems.length > 1) {\r\n      if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null) {\r\n        skipTooltipButton.className = this._options.buttonClass + ' introjs-skipbutton';\r\n      }\r\n      if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n        nextTooltipButton.className = this._options.buttonClass + ' introjs-nextbutton';\r\n      }\r\n\r\n      if (this._options.hidePrev === true) {\r\n        if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n          prevTooltipButton.className = this._options.buttonClass + ' introjs-prevbutton introjs-hidden';\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 = this._options.buttonClass + ' introjs-prevbutton introjs-disabled';\r\n        }\r\n      }\r\n\r\n      if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null) {\r\n        skipTooltipButton.innerHTML = this._options.skipLabel;\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 skipTooltipButton !== \"undefined\" && skipTooltipButton !== null) {\r\n        skipTooltipButton.innerHTML = this._options.doneLabel;\r\n        // adding donebutton class in addition to skipbutton\r\n        _addClass(skipTooltipButton, 'introjs-donebutton');\r\n      }\r\n      if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n        prevTooltipButton.className = 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 = this._options.buttonClass + ' introjs-nextbutton introjs-hidden';\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          nextTooltipButton.className = this._options.buttonClass + ' introjs-nextbutton introjs-disabled';\r\n        }\r\n      }\r\n    } else {\r\n      // steps between start and end\r\n      if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null) {\r\n        skipTooltipButton.className = this._options.buttonClass + ' introjs-skipbutton';\r\n      }\r\n      if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n        prevTooltipButton.className = this._options.buttonClass + ' introjs-prevbutton';\r\n      }\r\n      if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n        nextTooltipButton.className = this._options.buttonClass + ' introjs-nextbutton';\r\n      }\r\n      if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null) {\r\n        skipTooltipButton.innerHTML = this._options.skipLabel;\r\n      }\r\n    }\r\n\r\n    prevTooltipButton.setAttribute('role', 'button');\r\n    nextTooltipButton.setAttribute('role', 'button');\r\n    skipTooltipButton.setAttribute('role', 'button');\r\n\r\n    //Set focus on \"next\" button, so that hitting Enter always moves you onto the next step\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   * To change the scroll of `window` after highlighting an element\r\n   *\r\n   * @api private\r\n   * @method _scrollTo\r\n   * @param {String} scrollTo\r\n   * @param {Object} targetElement\r\n   * @param {Object} tooltipLayer\r\n   */\r\n  function _scrollTo(scrollTo, targetElement, tooltipLayer) {\r\n    if (scrollTo === 'off') return;  \r\n    var rect;\r\n\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 = targetElement.element.getBoundingClientRect();\r\n    }\r\n\r\n    if (!_elementInViewport(targetElement.element)) {\r\n      var winHeight = _getWinSize().height;\r\n      var top = rect.bottom - (rect.bottom - rect.top);\r\n\r\n      // 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 || targetElement.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\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   * To remove all show element(s)\r\n   *\r\n   * @api private\r\n   * @method _removeShowElement\r\n   */\r\n  function _removeShowElement() {\r\n    var elms = document.querySelectorAll('.introjs-showElement');\r\n\r\n    _forEach(elms, function (elm) {\r\n      _removeClass(elm, /introjs-[a-zA-Z]+/g);\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  function _setShowElement(targetElement) {\r\n    var parentElm;\r\n    // we need to add this show element class to the parent of SVG elements\r\n    // because the SVG elements can't have independent z-index\r\n    if (targetElement.element instanceof SVGElement) {\r\n      parentElm = targetElement.element.parentNode;\r\n\r\n      while (targetElement.element.parentNode !== null) {\r\n        if (!parentElm.tagName || parentElm.tagName.toLowerCase() === 'body') break;\r\n\r\n        if (parentElm.tagName.toLowerCase() === 'svg') {\r\n          _addClass(parentElm, 'introjs-showElement introjs-relativePosition');\r\n        }\r\n\r\n        parentElm = parentElm.parentNode;\r\n      }\r\n    }\r\n\r\n    _addClass(targetElement.element, 'introjs-showElement');\r\n\r\n    var currentElementPosition = _getPropValue(targetElement.element, 'position');\r\n    if (currentElementPosition !== 'absolute' &&\r\n        currentElementPosition !== 'relative' &&\r\n        currentElementPosition !== 'fixed') {\r\n      //change to new intro item\r\n      _addClass(targetElement.element, 'introjs-relativePosition');\r\n    }\r\n\r\n    parentElm = targetElement.element.parentNode;\r\n    while (parentElm !== null) {\r\n      if (!parentElm.tagName || parentElm.tagName.toLowerCase() === 'body') break;\r\n\r\n      //fix The Stacking Context problem.\r\n      //More detail: https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Understanding_z_index/The_stacking_context\r\n      var zIndex = _getPropValue(parentElm, 'z-index');\r\n      var opacity = parseFloat(_getPropValue(parentElm, 'opacity'));\r\n      var transform = _getPropValue(parentElm, 'transform') || _getPropValue(parentElm, '-webkit-transform') || _getPropValue(parentElm, '-moz-transform') || _getPropValue(parentElm, '-ms-transform') || _getPropValue(parentElm, '-o-transform');\r\n      if (/[0-9]+/.test(zIndex) || opacity < 1 || (transform !== 'none' && transform !== undefined)) {\r\n        _addClass(parentElm, 'introjs-fixParent');\r\n      }\r\n\r\n      parentElm = parentElm.parentNode;\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  * 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, key) {\r\n      \r\n      // get group key\r\n      key = key || 'introjs-stamp';\r\n\r\n      // each group increments from 0\r\n      keys[key] = keys[key] || 0;\r\n\r\n      // stamp only once per object\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  * 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  var DOMEvent = (function () {\r\n    function DOMEvent () {\r\n      var events_key = 'introjs_event';\r\n      \r\n      /**\r\n      * Gets a unique ID for an event listener\r\n      *\r\n      * @param Object obj\r\n      * @param String type        event type\r\n      * @param Function listener\r\n      * @param Object context\r\n      * @return String\r\n      */\r\n      this._id = function (obj, type, listener, context) {\r\n        return type + _stamp(listener) + (context ? '_' + _stamp(context) : '');\r\n      };\r\n\r\n      /**\r\n      * Adds event listener\r\n      *\r\n      * @param Object obj\r\n      * @param String type        event type\r\n      * @param Function listener\r\n      * @param Object context\r\n      * @param Boolean useCapture\r\n      * @return null\r\n      */\r\n      this.on = function (obj, type, listener, context, useCapture) {\r\n        var id = this._id.apply(this, arguments),\r\n            handler = function (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' + 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      /**\r\n      * Removes event listener\r\n      *\r\n      * @param Object obj\r\n      * @param String type        event type\r\n      * @param Function listener\r\n      * @param Object context\r\n      * @param Boolean useCapture\r\n      * @return null\r\n      */\r\n      this.off = function (obj, type, listener, context, useCapture) {\r\n        var id = this._id.apply(this, arguments),\r\n            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' + 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  /**\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  function _addClass(element, className) {\r\n    if (element instanceof SVGElement) {\r\n      // svg\r\n      var pre = element.getAttribute('class') || '';\r\n\r\n      element.setAttribute('class', pre + ' ' + className);\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 += ' ' + className;\r\n      }\r\n    }\r\n  }\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\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   * 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 Element's property value\r\n   */\r\n  function _getPropValue (element, propName) {\r\n    var propValue = '';\r\n    if (element.currentStyle) { //IE\r\n      propValue = element.currentStyle[propName];\r\n    } else if (document.defaultView && document.defaultView.getComputedStyle) { //Others\r\n      propValue = document.defaultView.getComputedStyle(element, null).getPropertyValue(propName);\r\n    }\r\n\r\n    //Prevent exception in IE\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   * 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  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   * 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 { width: window.innerWidth, height: window.innerHeight };\r\n    } else {\r\n      var D = document.documentElement;\r\n      return { width: D.clientWidth, height: D.clientHeight };\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\r\n    return (\r\n      rect.top >= 0 &&\r\n      rect.left >= 0 &&\r\n      (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  /**\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  function _addOverlayLayer(targetElm) {\r\n    var overlayLayer = document.createElement('div'),\r\n        styleText = '',\r\n        self = this;\r\n\r\n    //set css class name\r\n    overlayLayer.className = 'introjs-overlay';\r\n\r\n    //check if the target element is body, we should calculate the size of overlay layer in a better way\r\n    if (!targetElm.tagName || targetElm.tagName.toLowerCase() === 'body') {\r\n      styleText += 'top: 0;bottom: 0; left: 0;right: 0;position: fixed;';\r\n      overlayLayer.style.cssText = styleText;\r\n    } else {\r\n      //set overlay layer position\r\n      var elementPosition = _getOffset(targetElm);\r\n      if (elementPosition) {\r\n        styleText += 'width: ' + elementPosition.width + 'px; height:' + elementPosition.height + 'px; top:' + elementPosition.top + 'px;left: ' + elementPosition.left + 'px;';\r\n        overlayLayer.style.cssText = styleText;\r\n      }\r\n    }\r\n\r\n    targetElm.appendChild(overlayLayer);\r\n\r\n    overlayLayer.onclick = function() {\r\n      if (self._options.exitOnOverlayClick === true) {\r\n        _exitIntro.call(self, targetElm);\r\n      }\r\n    };\r\n\r\n    window.setTimeout(function() {\r\n      styleText += 'opacity: ' + self._options.overlayOpacity.toString() + ';';\r\n      overlayLayer.style.cssText = styleText;\r\n    }, 10);\r\n\r\n    return true;\r\n  }\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  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  /**\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  function _populateHints(targetElm) {\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 || this._options.hintPosition;\r\n        currentItem.hintAnimation = currentItem.hintAnimation || this._options.hintAnimation;\r\n\r\n        if (currentItem.element !== null) {\r\n          this._introItems.push(currentItem);\r\n        }\r\n      }.bind(this));\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      }\r\n\r\n      //first add intro items with data-step\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 = this._options.hintAnimation;\r\n        }\r\n\r\n        this._introItems.push({\r\n          element: currentElement,\r\n          hint: currentElement.getAttribute('data-hint'),\r\n          hintPosition: currentElement.getAttribute('data-hintposition') || this._options.hintPosition,\r\n          hintAnimation: hintAnimation,\r\n          tooltipClass: currentElement.getAttribute('data-tooltipclass'),\r\n          position: currentElement.getAttribute('data-position') || this._options.tooltipPosition\r\n        });\r\n      }.bind(this));\r\n    }\r\n\r\n    _addHints.call(this);\r\n\r\n    /* \r\n    todo:\r\n    these events should be removed at some point \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  /**\r\n   * Re-aligns all hint elements\r\n   *\r\n   * @api private\r\n   * @method _reAlignHints\r\n   */\r\n  function _reAlignHints() {\r\n    _forEach(this._introItems, function (item) {\r\n      if (typeof(item.targetElement) === 'undefined') {\r\n        return;\r\n      }\r\n\r\n      _alignHintPosition.call(this, item.hintPosition, item.element, item.targetElement);\r\n    }.bind(this));\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  function _hintQuerySelectorAll(selector) {\r\n    var hintsWrapper = document.querySelector('.introjs-hints');\r\n    return (hintsWrapper) ? hintsWrapper.querySelectorAll(selector) : [];\r\n  }\r\n\r\n  /**\r\n   * Hide a hint\r\n   *\r\n   * @api private\r\n   * @method _hideHint\r\n   */\r\n  function _hideHint(stepId) {\r\n    var hint = _hintQuerySelectorAll('.introjs-hint[data-step=\"' + stepId + '\"]')[0];\r\n    \r\n    _removeHintTooltip.call(this);\r\n\r\n    if (hint) {\r\n      _addClass(hint, 'introjs-hidehint');\r\n    }\r\n\r\n    // call the callback function (if any)\r\n    if (typeof (this._hintCloseCallback) !== 'undefined') {\r\n      this._hintCloseCallback.call(this, stepId);\r\n    }\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  function _hideHints() {\r\n    var hints = _hintQuerySelectorAll('.introjs-hint');\r\n\r\n    _forEach(hints, function (hint) {\r\n      _hideHint.call(this, hint.getAttribute('data-step'));\r\n    }.bind(this));\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  function _showHints() {\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(this, hint.getAttribute('data-step'));\r\n      }.bind(this));\r\n    } else {\r\n      _populateHints.call(this, this._targetElement);\r\n    }\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  function _showHint(stepId) {\r\n    var hint = _hintQuerySelectorAll('.introjs-hint[data-step=\"' + stepId + '\"]')[0];\r\n\r\n    if (hint) {\r\n      _removeClass(hint, /introjs-hidehint/g);\r\n    }\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  function _removeHints() {\r\n    var hints = _hintQuerySelectorAll('.introjs-hint');\r\n\r\n    _forEach(hints, function (hint) {\r\n      _removeHint.call(this, hint.getAttribute('data-step'));\r\n    }.bind(this));\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  function _removeHint(stepId) {\r\n    var hint = _hintQuerySelectorAll('.introjs-hint[data-step=\"' + stepId + '\"]')[0];\r\n\r\n    if (hint) {\r\n      hint.parentNode.removeChild(hint);\r\n    }\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  function _addHints() {\r\n    var self = this;\r\n\r\n    var hintsWrapper = document.querySelector('.introjs-hints');\r\n\r\n    if (hintsWrapper === null) {\r\n      hintsWrapper = document.createElement('div');\r\n      hintsWrapper.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    var getHintClick = function (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=\"' + i + '\"]')) {\r\n        return;\r\n      }\r\n\r\n      var hint = document.createElement('a');\r\n      _setAnchorAsButton(hint);\r\n\r\n      hint.onclick = getHintClick(i);\r\n\r\n      hint.className = 'introjs-hint';\r\n\r\n      if (!item.hintAnimation) {\r\n        _addClass(hint, 'introjs-hint-no-anim');\r\n      }\r\n\r\n      // hint's position should be fixed if the target element's position is fixed\r\n      if (_isFixed(item.element)) {\r\n        _addClass(hint, 'introjs-fixedhint');\r\n      }\r\n\r\n      var hintDot = document.createElement('div');\r\n      hintDot.className = 'introjs-hint-dot';\r\n      var hintPulse = document.createElement('div');\r\n      hintPulse.className = 'introjs-hint-pulse';\r\n\r\n      hint.appendChild(hintDot);\r\n      hint.appendChild(hintPulse);\r\n      hint.setAttribute('data-step', i);\r\n\r\n      // we swap the hint element with target element\r\n      // because _setHelperLayerPosition uses `element` property\r\n      item.targetElement = item.element;\r\n      item.element = hint;\r\n\r\n      // align the hint position\r\n      _alignHintPosition.call(this, item.hintPosition, hint, item.targetElement);\r\n\r\n      hintsWrapper.appendChild(hint);\r\n    }.bind(this));\r\n\r\n    // adding the hints wrapper\r\n    document.body.appendChild(hintsWrapper);\r\n\r\n    // call the callback function (if any)\r\n    if (typeof (this._hintsAddedCallback) !== 'undefined') {\r\n      this._hintsAddedCallback.call(this);\r\n    }\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  function _alignHintPosition(position, hint, element) {\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;\r\n\r\n    // align the hint element\r\n    switch (position) {\r\n      default:\r\n      case 'top-left':\r\n        hint.style.left = offset.left + 'px';\r\n        hint.style.top = offset.top + 'px';\r\n        break;\r\n      case 'top-right':\r\n        hint.style.left = (offset.left + offset.width - iconWidth) + 'px';\r\n        hint.style.top = offset.top + 'px';\r\n        break;\r\n      case 'bottom-left':\r\n        hint.style.left = offset.left + 'px';\r\n        hint.style.top = (offset.top + offset.height - iconHeight) + 'px';\r\n        break;\r\n      case 'bottom-right':\r\n        hint.style.left = (offset.left + offset.width - iconWidth) + 'px';\r\n        hint.style.top = (offset.top + offset.height - iconHeight) + 'px';\r\n        break;\r\n      case 'middle-left':\r\n        hint.style.left = offset.left + 'px';\r\n        hint.style.top = (offset.top + (offset.height - iconHeight) / 2) + 'px';\r\n        break;\r\n      case 'middle-right':\r\n        hint.style.left = (offset.left + offset.width - iconWidth) + 'px';\r\n        hint.style.top = (offset.top + (offset.height - iconHeight) / 2) + 'px';\r\n        break;\r\n      case 'middle-middle':\r\n        hint.style.left = (offset.left + (offset.width - iconWidth) / 2) + 'px';\r\n        hint.style.top = (offset.top + (offset.height - iconHeight) / 2) + 'px';\r\n        break;\r\n      case 'bottom-middle':\r\n        hint.style.left = (offset.left + (offset.width - iconWidth) / 2) + 'px';\r\n        hint.style.top = (offset.top + offset.height - iconHeight) + 'px';\r\n        break;\r\n      case 'top-middle':\r\n        hint.style.left = (offset.left + (offset.width - iconWidth) / 2) + 'px';\r\n        hint.style.top = offset.top + 'px';\r\n        break;\r\n    }\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  function _showHintDialog(stepId) {\r\n    var hintElement = document.querySelector('.introjs-hint[data-step=\"' + stepId + '\"]');\r\n    var item = this._introItems[stepId];\r\n\r\n    // call the callback function (if any)\r\n    if (typeof (this._hintClickCallback) !== 'undefined') {\r\n      this._hintClickCallback.call(this, hintElement, item, stepId);\r\n    }\r\n\r\n    // remove all open tooltips\r\n    var removedStep = _removeHintTooltip.call(this);\r\n\r\n    // to toggle the tooltip\r\n    if (parseInt(removedStep, 10) === stepId) {\r\n      return;\r\n    }\r\n\r\n    var tooltipLayer = document.createElement('div');\r\n    var tooltipTextLayer = document.createElement('div');\r\n    var arrowLayer = document.createElement('div');\r\n    var referenceLayer = document.createElement('div');\r\n\r\n    tooltipLayer.className = 'introjs-tooltip';\r\n\r\n    tooltipLayer.onclick = function (e) {\r\n      //IE9 & Other Browsers\r\n      if (e.stopPropagation) {\r\n        e.stopPropagation();\r\n      }\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\r\n    var tooltipWrapper = document.createElement('p');\r\n    tooltipWrapper.innerHTML = item.hint;\r\n\r\n    var closeButton = document.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\r\n    tooltipTextLayer.appendChild(tooltipWrapper);\r\n    tooltipTextLayer.appendChild(closeButton);\r\n\r\n    arrowLayer.className = 'introjs-arrow';\r\n    tooltipLayer.appendChild(arrowLayer);\r\n\r\n    tooltipLayer.appendChild(tooltipTextLayer);\r\n\r\n    // set current step for _placeTooltip function\r\n    this._currentStep = hintElement.getAttribute('data-step');\r\n\r\n    // align reference layer position\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\r\n    referenceLayer.appendChild(tooltipLayer);\r\n    document.body.appendChild(referenceLayer);\r\n\r\n    //set proper position\r\n    _placeTooltip.call(this, hintElement, tooltipLayer, arrowLayer, null, true);\r\n  }\r\n\r\n  /**\r\n   * Get an element position on the page\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   * @returns Element's position info\r\n   */\r\n  function _getOffset(element) {\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    var x = element.getBoundingClientRect();\r\n    return {\r\n      top: x.top + scrollTop,\r\n      width: x.width,\r\n      height: x.height,\r\n      left: x.left + scrollLeft\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\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      if (excludeStaticParent && style.position === \"static\") {\r\n        continue;\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 Element parent\r\n  * @param Element element\r\n  * @return Null\r\n  */\r\n  function _scrollParentToElement (parent, element) {\r\n    parent.scrollTop = element.offsetTop - parent.offsetTop;\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  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  /**\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      attrname;\r\n    for (attrname in obj1) { obj3[attrname] = obj1[attrname]; }\r\n    for (attrname in obj2) { obj3[attrname] = obj2[attrname]; }\r\n    return obj3;\r\n  }\r\n\r\n  var introJs = function (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\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    }\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    introJs.instances[ _stamp(instance, 'introjs-instance') ] = instance;\r\n\r\n    return instance;\r\n  };\r\n\r\n  /**\r\n   * Current IntroJs version\r\n   *\r\n   * @property version\r\n   * @type String\r\n   */\r\n  introJs.version = VERSION;\r\n\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  introJs.instances = {};\r\n\r\n  //Prototype\r\n  introJs.fn = IntroJs.prototype = {\r\n    clone: function () {\r\n      return new IntroJs(this);\r\n    },\r\n    setOption: function(option, value) {\r\n      this._options[option] = value;\r\n      return this;\r\n    },\r\n    setOptions: function(options) {\r\n      this._options = _mergeOptions(this._options, options);\r\n      return this;\r\n    },\r\n    start: function (group) {\r\n      _introForElement.call(this, this._targetElement, group);\r\n      return this;\r\n    },\r\n    goToStep: function(step) {\r\n      _goToStep.call(this, step);\r\n      return this;\r\n    },\r\n    addStep: function(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(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(step) {\r\n      _goToStepNumber.call(this, step);\r\n\r\n      return this;\r\n    },\r\n    nextStep: function() {\r\n      _nextStep.call(this);\r\n      return this;\r\n    },\r\n    previousStep: function() {\r\n      _previousStep.call(this);\r\n      return this;\r\n    },\r\n    exit: function(force) {\r\n      _exitIntro.call(this, this._targetElement, force);\r\n      return this;\r\n    },\r\n    refresh: function() {\r\n      _refresh.call(this);\r\n      return this;\r\n    },\r\n    onbeforechange: function(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      return this;\r\n    },\r\n    onchange: function(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      return this;\r\n    },\r\n    onafterchange: function(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      return this;\r\n    },\r\n    oncomplete: function(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      return this;\r\n    },\r\n    onhintsadded: function(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      return this;\r\n    },\r\n    onhintclick: function(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      return this;\r\n    },\r\n    onhintclose: function(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      return this;\r\n    },\r\n    onexit: function(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      return this;\r\n    },\r\n    onskip: function(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      return this;\r\n    },\r\n    onbeforeexit: function(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      return this;\r\n    },\r\n    addHints: function() {\r\n      _populateHints.call(this, this._targetElement);\r\n      return this;\r\n    },\r\n    hideHint: function (stepId) {\r\n      _hideHint.call(this, stepId);\r\n      return this;\r\n    },\r\n    hideHints: function () {\r\n      _hideHints.call(this);\r\n      return this;\r\n    },\r\n    showHint: function (stepId) {\r\n      _showHint.call(this, stepId);\r\n      return this;\r\n    },\r\n    showHints: function () {\r\n      _showHints.call(this);\r\n      return this;\r\n    },\r\n    removeHints: function () {\r\n      _removeHints.call(this);\r\n      return this;\r\n    },\r\n    removeHint: function (stepId) {\r\n      _removeHint.call(this, stepId);\r\n      return this;\r\n    },\r\n    showHintDialog: function (stepId) {\r\n      _showHintDialog.call(this, stepId);\r\n      return this;\r\n    }\r\n  };\r\n\r\n  return introJs;\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, done and abort\r\n  loc.TOUR_lskip = loc.TOUR_lskip || \"Abort\";\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_welc = loc.TOUR_welc || \"<span class='tgreeting'> Welcome to our guided tour!</span>\" +\r\n  \t\t                           \"<p class='pfirstStep'> This tour should give you a quick introduction to KorAP. \" +\r\n  \t\t                           \"We lead you step by step through an example. </p>\"; \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      'skipLabel': loc.TOUR_lskip, \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.7,\r\n      'exitOnOverlayClick': false,\r\n      'disableInteraction': true,      \r\n      'hideNext': true,\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      intro.setOption('tooltipClass', 'gTstartSearch');\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          intro: loc.TOUR_welc,\r\n        },\r\n        {\r\n          element: '#q-field',\r\n          intro: loc.TOUR_sear1,\r\n          position: 'bottom'\r\n        },\r\n        {\r\n          element: '#hint',\r\n          intro: loc.TOUR_searAnnot,\r\n          position: 'bottom'\r\n        },\r\n        {\r\n          element: doe.querySelector(\"#hint > .menu.hint\"),\r\n          intro: loc.TOUR_annotAss,\r\n          position: 'bottom',\r\n          }, \r\n        {\r\n          element:'#vc-choose',\r\n          intro: loc.TOUR_vccho1,\r\n          position: \"bottom\",\r\n        },\r\n        {\r\n          element:'#vc-view',\r\n          intro: loc.TOUR_vccho2,\r\n          position: \"bottom\",\r\n        }, \r\n        {\r\n          element: doe.querySelector('.statistic'),\r\n          intro: loc.TOUR_vcStat1,\r\n          position: \"left\",\r\n        },\r\n        {\r\n          element: doe.querySelector('.stattable'),\r\n          intro: loc.TOUR_vcStat2,\r\n          position: \"bottom\",\r\n        },\r\n        {\r\n          element: doe.querySelector('#ql-field').parentNode,\r\n          intro: loc.TOUR_qlfield,\r\n          position: \"bottom\",\r\n        },  \r\n        {\r\n          element:'#glimpse',\r\n          intro: loc.TOUR_glimpse,\r\n          position: \"bottom\",\r\n        }, \r\n        {\r\n          element:'#view-tutorial',\r\n          intro: loc.TOUR_help,\r\n          position: \"bottom\",\r\n        },\r\n        {\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 (value) {\r\n      return Object.create(this)._init(value);\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      t.value = t.values[0];\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     * Get the state value\r\n     */\r\n    get : function () {\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.value == 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\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 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          // 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[\"param\"] = p; // 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    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.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\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      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   * \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  '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             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     * Initialize password toggle.\r\n     */\r\n    initCopyToClipboard(d);\r\n\r\n      \r\n    /**\r\n     * Initialize password toggle.\r\n     */\r\n    initTogglePwdVisibility(d);\r\n      \r\n    /**\r\n     * Initialize Plugin registry.\r\n     */\r\n    let pe;\r\n    if (pe = d.getElementById(\"kalamar-plugins\")) {\r\n      let url = pe.getAttribute('data-plugins');\r\n      if (url !== undefined) {\r\n        KorAP.API.getPluginList(url, function (json) {\r\n          if (json && json.length > 0) {\r\n            // Load Plugin Server first\r\n            KorAP.Plugin = pluginClass.create();\r\n\r\n            // Add services container to head\r\n            d.head.appendChild(KorAP.Plugin.element());\r\n\r\n            // Add pipe form\r\n            KorAP.Pipe = pipeClass.create();\r\n            d.getElementById(\"searchform\").appendChild(KorAP.Pipe.element());\r\n            \r\n            try {\r\n              \r\n              // Register all plugins\r\n              json.forEach(i => KorAP.Plugin.register(i));\r\n            }\r\n            catch (e) {\r\n              KorAP.log(0, e);\r\n            }\r\n          }\r\n        });\r\n      };\r\n    };\r\n      \r\n    return obj;\r\n  });\r\n  \r\n});\r\n\nwindow.KorAP = window.KorAP || {};\r\nKorAP.Locale = KorAP.Locale || {};\r\nrequire(['loc/dereko', 'init']);\r\n\ndefine(\"app/en\", function(){});\n\n}());"]}