/
domain-gfx.js.map
1 lines (1 loc) · 880 KB
/
domain-gfx.js.map
1
{"version":3,"sources":["webpack:///webpack/bootstrap 688179875566246ef485","webpack:///./node_modules/lodash-es/_root.js","webpack:///./node_modules/codemirror/lib/codemirror.js","webpack:///(webpack)/buildin/harmony-module.js","webpack:///./node_modules/lodash-es/_freeGlobal.js","webpack:///./node_modules/lodash-es/isBuffer.js","webpack:///./node_modules/lodash-es/_ListCache.js","webpack:///./node_modules/lodash-es/_Hash.js","webpack:///./node_modules/lodash-es/_MapCache.js","webpack:///./node_modules/lodash-es/_Stack.js","webpack:///./node_modules/lodash-es/_baseMerge.js","webpack:///./node_modules/lodash-es/memoize.js","webpack:///./node_modules/lodash-es/debounce.js","webpack:///./node_modules/lodash-es/_listCacheClear.js","webpack:///./node_modules/lodash-es/eq.js","webpack:///./node_modules/lodash-es/_assocIndexOf.js","webpack:///./node_modules/lodash-es/_listCacheDelete.js","webpack:///./node_modules/lodash-es/_listCacheGet.js","webpack:///./node_modules/lodash-es/_listCacheHas.js","webpack:///./node_modules/lodash-es/_listCacheSet.js","webpack:///./node_modules/lodash-es/_stackClear.js","webpack:///./node_modules/lodash-es/_stackDelete.js","webpack:///./node_modules/lodash-es/_stackGet.js","webpack:///./node_modules/lodash-es/_stackHas.js","webpack:///./node_modules/lodash-es/_Symbol.js","webpack:///./node_modules/lodash-es/_getRawTag.js","webpack:///./node_modules/lodash-es/_objectToString.js","webpack:///./node_modules/lodash-es/_baseGetTag.js","webpack:///./node_modules/lodash-es/isObject.js","webpack:///./node_modules/lodash-es/isFunction.js","webpack:///./node_modules/lodash-es/_coreJsData.js","webpack:///./node_modules/lodash-es/_isMasked.js","webpack:///./node_modules/lodash-es/_toSource.js","webpack:///./node_modules/lodash-es/_baseIsNative.js","webpack:///./node_modules/lodash-es/_getValue.js","webpack:///./node_modules/lodash-es/_getNative.js","webpack:///./node_modules/lodash-es/_Map.js","webpack:///./node_modules/lodash-es/_nativeCreate.js","webpack:///./node_modules/lodash-es/_hashClear.js","webpack:///./node_modules/lodash-es/_hashDelete.js","webpack:///./node_modules/lodash-es/_hashGet.js","webpack:///./node_modules/lodash-es/_hashHas.js","webpack:///./node_modules/lodash-es/_hashSet.js","webpack:///./node_modules/lodash-es/_mapCacheClear.js","webpack:///./node_modules/lodash-es/_isKeyable.js","webpack:///./node_modules/lodash-es/_getMapData.js","webpack:///./node_modules/lodash-es/_mapCacheDelete.js","webpack:///./node_modules/lodash-es/_mapCacheGet.js","webpack:///./node_modules/lodash-es/_mapCacheHas.js","webpack:///./node_modules/lodash-es/_mapCacheSet.js","webpack:///./node_modules/lodash-es/_stackSet.js","webpack:///./node_modules/lodash-es/_defineProperty.js","webpack:///./node_modules/lodash-es/_baseAssignValue.js","webpack:///./node_modules/lodash-es/_assignMergeValue.js","webpack:///./node_modules/lodash-es/_baseFor.js","webpack:///./node_modules/lodash-es/_createBaseFor.js","webpack:///./node_modules/lodash-es/_Uint8Array.js","webpack:///./node_modules/lodash-es/_cloneArrayBuffer.js","webpack:///./node_modules/lodash-es/_cloneTypedArray.js","webpack:///./node_modules/lodash-es/_copyArray.js","webpack:///./node_modules/lodash-es/_baseCreate.js","webpack:///./node_modules/lodash-es/_getPrototype.js","webpack:///./node_modules/lodash-es/_overArg.js","webpack:///./node_modules/lodash-es/_isPrototype.js","webpack:///./node_modules/lodash-es/_initCloneObject.js","webpack:///./node_modules/lodash-es/isObjectLike.js","webpack:///./node_modules/lodash-es/_baseIsArguments.js","webpack:///./node_modules/lodash-es/isArguments.js","webpack:///./node_modules/lodash-es/isArray.js","webpack:///./node_modules/lodash-es/isLength.js","webpack:///./node_modules/lodash-es/isArrayLike.js","webpack:///./node_modules/lodash-es/isArrayLikeObject.js","webpack:///./node_modules/lodash-es/isPlainObject.js","webpack:///./node_modules/lodash-es/_baseIsTypedArray.js","webpack:///./node_modules/lodash-es/_baseUnary.js","webpack:///./node_modules/lodash-es/isTypedArray.js","webpack:///./node_modules/lodash-es/_assignValue.js","webpack:///./node_modules/lodash-es/_copyObject.js","webpack:///./node_modules/lodash-es/_baseTimes.js","webpack:///./node_modules/lodash-es/_isIndex.js","webpack:///./node_modules/lodash-es/_arrayLikeKeys.js","webpack:///./node_modules/lodash-es/_nativeKeysIn.js","webpack:///./node_modules/lodash-es/_baseKeysIn.js","webpack:///./node_modules/lodash-es/keysIn.js","webpack:///./node_modules/lodash-es/toPlainObject.js","webpack:///./node_modules/lodash-es/_baseMergeDeep.js","webpack:///./node_modules/lodash-es/identity.js","webpack:///./node_modules/lodash-es/_apply.js","webpack:///./node_modules/lodash-es/_overRest.js","webpack:///./node_modules/lodash-es/constant.js","webpack:///./node_modules/lodash-es/_baseSetToString.js","webpack:///./node_modules/lodash-es/_shortOut.js","webpack:///./node_modules/lodash-es/_setToString.js","webpack:///./node_modules/lodash-es/_baseRest.js","webpack:///./node_modules/lodash-es/_isIterateeCall.js","webpack:///./node_modules/lodash-es/merge.js","webpack:///./node_modules/lodash-es/_createAssigner.js","webpack:///./src/utils/uniqueId.js","webpack:///./src/utils/namespace.js","webpack:///./src/utils/dataset.js","webpack:///./src/tooltip/style.js","webpack:///./src/tooltip/dataToMarkup.js","webpack:///./src/tooltip/tooltip.js","webpack:///./src/renderer/svg/svg.js","webpack:///./src/renderer/svg/utils/pathData.js","webpack:///./src/renderer/svg/entities/markup.js","webpack:///./src/renderer/svg/entities/sequence.js","webpack:///./src/renderer/svg/entities/hit.js","webpack:///./src/renderer/svg/utils/gradient.js","webpack:///./src/utils/colorContrast.js","webpack:///./src/renderer/svg/entities/domain.js","webpack:///./src/renderer/svg/entities/motif.js","webpack:///./src/renderer/svg/index.js","webpack:///./src/defaults.js","webpack:///./src/utils/sanitizer.js","webpack:///./src/index.js","webpack:///./node_modules/lodash-es/now.js","webpack:///./node_modules/lodash-es/isSymbol.js","webpack:///./node_modules/lodash-es/toNumber.js","webpack:///./demo/index.js","webpack:///./node_modules/codemirror/mode/javascript/javascript.js","webpack:///(webpack)/buildin/module.js","webpack:///(webpack)/buildin/global.js","webpack:///./node_modules/lodash-es/_cloneBuffer.js","webpack:///./node_modules/lodash-es/stubFalse.js","webpack:///./node_modules/lodash-es/_nodeUtil.js","webpack:///./demo/data.json"],"names":["__webpack_require__","moduleId","installedModules","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","configurable","enumerable","get","n","__esModule","object","property","prototype","hasOwnProperty","p","s","freeSelf","self","_typeof","root","__WEBPACK_IMPORTED_MODULE_0__freeGlobal_js__","Function","__webpack_exports__","global","factory","__WEBPACK_AMD_DEFINE_FACTORY__","undefined","__WEBPACK_AMD_DEFINE_RESULT__","this","classTest","cls","RegExp","removeChildren","e","count","childNodes","length","removeChild","firstChild","removeChildrenAndAdd","parent","appendChild","elt","tag","content","className","style","document","createElement","cssText","createTextNode","eltP","setAttribute","contains","child","nodeType","parentNode","host","activeElt","activeElement","body","shadowRoot","addClass","node","current","test","joinClasses","a","b","as","split","bind","f","args","Array","slice","arguments","apply","copyObj","obj","target","overwrite","prop","countColumn","string","end","tabSize","startIndex","startValue","search","nextTab","indexOf","array","findColumn","goal","pos","col","skipped","Math","min","spaceStr","spaceStrs","push","lst","arr","map","out","nothing","createObj","base","props","inst","create","isWordCharBasic","ch","toUpperCase","toLowerCase","nonASCIISingleCaseWordChar","isWordChar","helper","source","isEmpty","isExtendingChar","charCodeAt","extendingChars","skipExtendingChars","str","dir","charAt","findFirst","pred","from","to","midF","mid","ceil","floor","getLine","doc","first","size","Error","chunk","lines","children","sz","chunkSize","getBetween","start","line","iter","text","getLines","updateLineHeight","height","diff","lineNo","cur","no","lineAtHeight","h","outer","i$1","lh","isLine","lineNumberFor","options","String","lineNumberFormatter","firstLineNumber","Pos","sticky","cmp","equalCursorPos","copyPos","x","maxPos","minPos","clipLine","max","clipPos","last","linelen","clipToLen","clipPosArray","MarkedSpan","marker","getMarkedSpanFor","spans","span","removeMarkedSpan","r","stretchSpansOverChange","change","full","oldFirst","markedSpans","oldLast","startCh","endCh","isInsert","old","nw","inclusiveLeft","type","insertLeft","endsAfter","inclusiveRight","markedSpansBefore","startsBefore","markedSpansAfter","sameLine","offset","found","span$1","clearEmptySpans","newMarkers","gapMarkers","gap","i$2","i$3","clearWhenEmpty","splice","detachMarkedSpans","detachLine","attachMarkedSpans","attachLine","extraLeft","extraRight","compareCollapsedMarkers","lenDiff","aPos","find","bPos","fromCmp","toCmp","id","collapsedSpanAtSide","sps","sawCollapsedSpans","sp","collapsed","collapsedSpanAtStart","collapsedSpanAtEnd","conflictingCollapsedRange","lineNo$$1","visualLine","merged","visualLineNo","lineN","vis","visualLineEndNo","lastLine","lineIsHidden","widgetNode","lineIsHiddenInner","heightAtLine","lineObj","lineLength","len","found$1","findMaxLine","cm","display","maxLine","maxLineLength","maxLineChanged","getBidiPartAt","order","bidiOther","getOrder","direction","bidiOrdering","getHandlers","emitter","_handlers","noHandlers","off","removeEventListener","detachEvent","map$$1","index","concat","signal","handlers","signalDOMEvent","override","preventDefault","defaultPrevented","e_defaultPrevented","codemirrorIgnore","signalCursorActivity","cursorActivity","set","curOp","cursorActivityHandlers","hasHandler","eventMixin","ctor","on","e_preventDefault","returnValue","e_stopPropagation","stopPropagation","cancelBubble","e_stop","e_target","srcElement","e_button","which","button","mac","ctrlKey","zeroWidthElement","measure","zwspSupported","offsetHeight","offsetWidth","ie","ie_version","hasBadBidiRects","badBidiRects","txt","r0","range","getBoundingClientRect","r1","left","right","resolveMode","spec","mimeModes","getMode","mfactory","modes","modeObj","modeExtensions","exts","helperType","modeProps","prop$1","extendMode","mode","properties","copyState","state","nstate","val","innerMode","info","startState","a1","a2","highlightLine","context","forceToEnd","st","modeGen","lineClasses","runMode","loop","baseTokens","overlay","overlays","at","i_end","opaque","baseTokenPos","styles","classes","bgClass","textClass","getLineStyles","updateFrontier","getContextBefore","resetState","maxHighlightLength","result","stateAfter","save","styleClasses","highlightFrontier","modeFrontier","precise","Context","minindent","minline","lim","after","SavedContext","lookAhead","indented","findStartLine","saved","fromSaved","processLine","viewFrom","viewTo","nextLine","startAt","stream","StringStream","callBlankLine","eol","readToken","blankLine","inner","token","takeToken","asArray","tokens","Token","extractLineClasses","output","lineClass","match","flattenSpans","curStart","curStyle","addModeClass","mName","cleanUpLine","interpretTokenStyle","cache","styleToClassCacheWithMode","styleToClassCache","replace","buildLineContent","lineView","webkit","builder","pre","trailingSpace","splitSpaces","getOption","rest","addToken","buildToken","startStyle","endStyle","title","css","part","buildTokenBadBidi","allText","spanStyle","spanEndStyle","spanStartStyle","nextChange","Infinity","foundBookmarks","endStyles","j","j$1","j$2","buildCollapsedSpan","upto","tokenText","insertLineContent","externalMeasured","maps","caches","lastChild","querySelector","defaultSpecialCharPlaceholder","toString","displayText","trailingBefore","spaceBefore","special","specialChars","mustWrap","createDocumentFragment","lastIndex","exec","txt$1","tabWidth","specialCharPlaceholder","fullStyle","ignoreWidget","widget","input","needsContentAttribute","setUneditable","LineView","visualLineContinued","hidden","buildViewArray","nextPos","view","signalLater","list","operationGroup","delayedCallbacks","orphanDelayedCallbacks","setTimeout","fireOrphanDelayed","delayed","updateLineForChanges","dims","changes","built","getLineContent","replaceChild","updateLineClasses","updateLineText","updateLineGutter","alignable","next","nextSibling","insertLineWidgets","updateLineWidgets","ensureLineWrapped","zIndex","ext","background","wrap","insertBefore","updateLineBackground","wrapClass","gutter","gutterBackground","gutterClass","fixedGutter","fixedPos","gutterTotalWidth","markers","gutterMarkers","lineNumbers","wrap$1","gutterWrap","lineNumber","gutterLeft","lineNumInnerWidth","k","gutters","gutterWidth","buildLineElement","insertLineWidgetsFor","allowAbove","widgets","ws","handleMouseEvents","noHScroll","width","wrapperWidth","coverGutter","paddingLeft","position","marginLeft","positionLineWidget","above","widgetHeight","parentStyle","wrapper","clientWidth","eventInWidget","getAttribute","sizer","mover","paddingTop","lineSpace","offsetTop","paddingVert","paddingH","cachedPaddingH","window","getComputedStyle","currentStyle","data","parseInt","paddingRight","isNaN","scrollGap","scrollerGap","nativeBarWidth","displayWidth","scroller","barWidth","displayHeight","clientHeight","barHeight","mapFromLineView","before","measureChar","bias","measureCharPrepared","prepareMeasureForLine","findViewForLine","findViewIndex","getDimensions","forceUpdate","lineMeasure","updateExternalMeasurement","rect","hasHeights","prepared","varHeight","key","wrapping","lineWrapping","curWidth","heights","rects","getClientRects","abs","bottom","top","ensureLineHeights","place","nodeAndOffsetInLineMap","collapse","coverStart","coverEnd","getUsefulRect","screen","logicalXDPI","deviceXDPI","badZoomedRects","normal","fromRange","hasBadZoomedRects","scaleX","scaleY","logicalYDPI","deviceYDPI","maybeUpdateRectForZooming","rSpan","charWidth","nullRect","rtop","rbot","bot","bogus","singleCursorHeightPerLine","rbottom","measureCharInner","mStart","mEnd","clearLineMeasurementCacheFor","clearLineMeasurementCache","externalMeasure","clearCaches","cachedCharWidth","cachedTextHeight","lineNumChars","pageScrollX","chrome","android","pageXOffset","documentElement","scrollLeft","pageScrollY","marginTop","pageYOffset","scrollTop","widgetTopHeight","intoCoordSystem","includeWidgets","yOff","viewOffset","lOff","xOff","fromCoordSystem","coords","localBox","lineSpaceBox","charCoords","cursorCoords","preparedMeasure","getBidi","partPos","invert","level","other","estimateCoords","PosWithInfo","outside","xRel","coordsChar","y","widgetHeight$$1","begin","ltr","_lineNo","ref","wrappedLineExtent","closestDist","endX","dist","boxIsAfter","baseX","chAround","boxAround","box","atLeft","atStart","coordsCharInner","mergedPos","wrappedLineExtentChar","textHeight","measureText","anchor","clientLeft","offsetLeft","compensateForHScroll","estimateHeight","th","perLine","widgetsHeight","estimateLineHeights","est","estHeight","posFromMouse","liberal","forRect","space","clientX","clientY","colDiff","round","updateSelection","showSelection","prepareSelection","primary","curFragment","cursors","selFragment","selection","sel","ranges","primIndex","range$$1","empty","showCursorWhenSelecting","drawSelectionCursor","head","add","fragment","rightSide","drawForLine","fromArg","toArg","wrapX","side","extent","lineLen","iterateBidiSections","fromPos","toPos","openStart","openEnd","openRight","docLTR","leftSide","topLeft","topRight","botLeft","botRight","cmpCoords","padding","sizerWidth","sFrom","sTo","fromLine","toLine","singleVLine","leftEnd","rightStart","drawSelectionRange","cursor","cursorHeight","otherCursor","restartBlink","focused","clearInterval","blinker","cursorDiv","visibility","cursorBlinkRate","setInterval","ensureFocus","focus","onFocus","delayBlurEvent","delayingBlurEvent","onBlur","readOnly","selForContextMenu","reset","receivedFocus","rmClass","shift","updateHeightsInViewport","prevBottom","lineDiv","updateWidgetHeight","visibleLines","viewport","ensure","ensureFrom","ensureTo","alignHorizontally","alignWidgets","comp","gutterW","align","maybeUpdateLineNumberWidth","innerW","lineGutter","lineNumWidth","updateGutterSpace","calculateScrollPos","snapMargin","screentop","docBottom","atTop","atBottom","newTop","screenleft","screenw","tooWide","addToScrollTop","resolveScrollToPos","ensureCursorVisible","getCursor","scrollToPos","margin","cursorScrollMargin","scrollToCoords","scrollToCoordsRange","sPos","updateScrollTop","gecko","updateDisplaySimple","setScrollTop","startWorker","forceScroll","scrollHeight","scrollbars","setScrollLeft","isScroller","scrollWidth","measureForScrollbars","docH","viewHeight","viewWidth","barLeft","docHeight","updateScrollbars","startWidth","startHeight","updateScrollbarsInner","sizes","update","paddingBottom","heightForcer","borderBottom","scrollbarFiller","coverGutterNextToScrollbar","gutterFiller","initScrollbars","clear","scrollbarModel","scrollbarStyle","axis","startOperation","viewChanged","updateInput","typing","changeObjs","cursorActivityCalled","selectionChanged","updateMaxLine","nextOpId","op","ops","ownsGroup","pushOperation","endOperation","endCb","group","callbacks","fireCallbacksForOps","finishOperation","scrollbarsClipped","marginBottom","borderRightWidth","maybeClipScrollbars","mustUpdate","DisplayUpdate","endOperation_R1","updatedDisplay","updateDisplayIfNeeded","endOperation_W1","barMeasure","adjustWidthTo","maxScrollLeft","preparedSelection","endOperation_R2","minWidth","takeFocus","setDocumentHeight","endOperation_W2","i$4","postUpdateDisplay","wheelStartX","wheelStartY","limit","changed","endCoords","scrollPos","startTop","startLeft","scrollPosIntoView","doScroll","innerHeight","phantom","scrollNode","scrollIntoView","maybeScrollWindow","maybeHiddenMarkers","unhidden","maybeUnhiddenMarkers","finish","endOperation_finish","endOperations","runInOp","operation","methodOp","docMethodOp","regChange","lendiff","updateLineNumbers","resetView","cut","viewCuttingPoint","cut$1","cutTop","cutBot","regLineChange","oldN","newN","countDirtyView","dirty","time","highlight","highlightWorker","Date","workTime","changedLines","oldStyles","highlighted","oldCls","newCls","ischange","workDelay","editorIsHidden","force","visible","renderedView","viewportMargin","different","lastWrapHeight","wrapperHeight","lastWrapWidth","adjustView","toUpdate","selSnapshot","hasFocus","active","getSelection","anchorNode","extend","anchorOffset","focusNode","focusOffset","selectionSnapshot","updateNumbersFrom","rm","currentWheelTarget","container","updateNumber","patchDisplay","snapshot","createRange","setEnd","removeAllRanges","addRange","restoreSelection","selectionDiv","minHeight","oldDisplayWidth","reportedViewFrom","reportedViewTo","updateGutters","specs","gElt","setGuttersForLineNumbers","wheelEventDelta","dx","wheelDeltaX","dy","wheelDeltaY","detail","HORIZONTAL_AXIS","VERTICAL_AXIS","wheelDelta","wheelEventPixels","delta","wheelPixelsPerUnit","onScrollWheel","scroll","canScrollX","canScrollY","presto","pixels","wheelSamples","wheelDX","wheelDY","movedX","movedY","sample","normalizeSelection","prim","sort","prev","inv","Range","Selection","simpleSelection","changeEnd","adjustForChange","computeSelAfterChange","offsetPos","loadMode","modeOption","resetModeState","isWholeLineUpdate","wholeLineUpdateBefore","updateDoc","estimateHeight$$1","spansFor","updateLine","linesFor","Line","firstLine","lastText","lastSpans","nlines","insert","remove","added","added$1","added$2","linkedDocs","sharedHistOnly","propagate","skip","sharedHist","linked","rel","shared","attachDoc","setDirectionClass","History","startGen","done","undone","undoDepth","lastModTime","lastSelTime","lastOp","lastSelOp","lastOrigin","lastSelOrigin","generation","maxGeneration","historyChangeFromChange","histChange","attachLocalSpans","clearSelectionEvents","pop","addChangeToHistory","selAfter","opId","hist","history","origin","historyEventDelay","lastChangeEvent","pushSelectionToHistory","addSelectionToHistory","somethingSelected","selectionEventCanBeMerged","clearRedo","dest","equals","existing","removeClearedSpans","explicitlyCleared","mergeOldSpans","getOldSpans","stretched","oldCur","stretchCur","copyHistoryArray","events","newGroup","instantiateSel","copy","event","deepCopy","newChanges","Number","extendRange","posBefore","extendSelection","setSelection","extendSelections","heads","replaceOneSelection","setSimpleSelection","setSelectionReplaceHistory","setSelectionNoUndo","NaN","this$1","filterSelectionChange","setSelectionInner","skipAtomicInSelection","reCheckSelection","mayClear","newAnchor","skipAtomic","newHead","skipAtomicInner","oldPos","atomic","near","movePos","far","cantEdit","selectAll","sel_dontScroll","filterChange","canceled","cancel","makeChange","ignoreReadOnly","suppressEdits","sawReadOnlySpans","mark","parts","mk","newParts","dfrom","dto","removeReadOnlyRanges","makeChangeInner","makeChangeSingleDoc","rebased","rebaseHist","makeChangeFromHistory","allowSelectionOnly","antiChanges","filter","returned","v","shiftDoc","distance","removed","recomputeMaxLength","checkWidthStart","retreatFrontier","changesHandler","changeHandler","makeChangeSingleDocInEditor","replaceRange","code","assign","splitLines","rebaseHistSelSingle","rebaseHistArray","sub","ok","copied","changeLine","handle","changeType","LeafChunk","BranchChunk","adjustScrollWhenAboveVisible","markText","cloneNode","isParent","SharedTextMarker","markTextShared","TextMarker","replacedWith","addToHistory","curLine","addMarkedSpan","clearOnEnter","clearHistory","nextMarkerId","findSharedMarkers","findMarks","detachSharedMarkers","subMarker","onDrop","clearDragCursor","lastDrop","files","dataTransfer","isReadOnly","FileReader","File","read","loadFile","file","allowDropFileTypes","reader","onload","join","lineSeparator","readAsText","draggingText","text$1","getData","selected","listSelections","replaceSelection","dragCursor","forEachCodeMirror","getElementsByClassName","byClass","CodeMirror","ensureGlobalHandlers","globalsRegistered","resizeTimer","onResize","registerGlobalHandlers","setSize","normalizeKeyName","alt","ctrl","cmd","mod","normalizeKeyMap","keymap","keyname","value","keys","lookupKey","getKeyMap","fallthrough","isModifierKey","keyNames","keyCode","addModifierNames","noShift","altKey","flipCtrlCmd","metaKey","shiftKey","keyName","altGraphKey","keyMap","deleteNearSelection","compute","kill","toKill","replaced","moveCharLogically","moveLogically","endOfLine","visually","prep","targetTop","lineStart","visual","lineEnd","visualLineEnd","lineStartSmart","firstNonWS","inWS","doHandleBinding","bound","dropShift","commands","ensurePolled","prevShift","Pass","dispatchKey","seq","keySeq","stopSeq","keyMaps","extraKeys","lookupKeyForEditor","handleKeyBinding","motion","onKeyDown","handled","lastStoppedKey","hasCopyEvent","up","showCrossHair","onKeyUp","onKeyPress","charCode","fromCharCode","handleCharBinding","onMouseDown","activeTouch","supportsTouch","draggable","clickInGutter","repeat","now","lastDoubleClick","compare","lastClick","PastClick","clickRepeat","selectingText","handleMappedButton","contained","behavior","option","unit","chromeOS","addNew","moveOnDrag","configureMouse","dragDrop","dragAndDrop","moved","dragEnd","mouseMove","dragStart","e2","leftButtonStartDrag","extendTo","lastPos","startCol","posCol","leftPos","startSel","ourIndex","oldRange","ourRange","rangeForUnit","ranges$1","anchorLine","boundary","headIndex","usePart","bidiSimplify","sel_mouse","curCount","counter","editorSize","move","leftButtonSelect","leftButtonDown","captureRightClick","onContextMenu","findWordAt","gutterEvent","prevent","mX","mY","touches","lineBox","g","contextMenuInGutter","themeChanged","theme","guttersChanged","dragDropChanged","Init","funcs","dragFunctions","toggle","enter","over","leave","drop","wrappingChanged","CodeMirror$1","defaults","Doc","inputStyles","inputStyle","mobile","init","pasteIncoming","cutIncoming","Delayed","autofocus","finishTouch","touchFinished","prevTouch","farAway","touch","word","radiusX","radiusY","isMouseLikeTouchEvent","clearTimeout","pageX","pageY","frag","onDragOver","setData","effectAllowed","setDragImage","safari","img","src","_top","onDragStart","inp","getField","registerEventHandlers","opt","optionHandlers","finishInit","initHooks","textRendering","indentLine","how","aggressive","indent","curSpace","indentation","curSpaceString","indentUnit","indentString","indentWithTabs","pos$1","setLastCopied","newLastCopied","lastCopied","applyTextInput","inserted","deleted","paste","textLines","splitLinesAuto","multiPaste","pasteLinesPerSelection","lineWise","changeEvent","triggerElectric","handlePaste","pasted","clipboardData","disableInput","electricChars","smartIndent","getModeAt","electricInput","copyableRanges","lineRange","getRange","disableBrowserMagic","field","spellcheck","hiddenTextarea","te","div","ios","border","findPosH","moveOnce","boundToLine","bidi","mv","getWrappedLineExtent","moveInStorageOrder","searchInVisualLine","getRes","res","nextCh","moveVisually","findNextLine","origDir","sawType","getHelper","hitSide","findPosV","pageSize","moveAmount","posToDOM","badPos","bad","domToPos","lineNode","textNode","topNode","curNode","nodeValue","textContent","previousSibling","dist$1","locateNodeInLineView","userAgent","navigator","platform","ie_upto10","ie_11up","edge","documentMode","qtwebkit","vendor","mac_geMountainLion","windows","presto_version","endNode","setStart","createTextRange","moveToElementText","moveEnd","moveStart","selectInput","select","selectionStart","selectionEnd","_e","ms","sel_move","charType","lowTypes","arabicTypes","BidiSpan","bidiRE","isNeutral","isStrong","countsAsLeft","countsAsNum","outerType","types","type$1","prev$1","type$2","type$3","i$5","cur$1","type$4","i$6","end$1","replace$1","i$7","nstart","unshift","reverse","addEventListener","attachEvent","nl","rt","hasSelection","ownerDocument","parentElement","compareEndPoints","oncopy","lineOracle","lastColumnPos","lastColumnValue","sol","peek","eat","eatWhile","eatSpace","skipToEnd","skipTo","backUp","column","pattern","consume","caseInsensitive","cased","substr","hideFirstChars","oracle","baseToken","maxLookAhead","NativeScrollbars","vert","horiz","checkedZeroWidth","needsH","needsV","sWidth","totalHeight","totalWidth","zeroWidthHack","disableHoriz","enableZeroWidthBar","disableVert","w","pointerEvents","bar","delay","maybeDisable","elementFromPoint","NullScrollbars","native","null","here","there","removeInner","insertInner","iterN","oldHeight","remaining","leaf","maybeSpill","me","sibling","myIndex","used","LineWidget","oldH","withOp","dHeight","nextDocId","lineSep","cleanGeneration","constructor","getValue","setValue","getLineHandle","getLineNumber","getLineHandleVisualStart","lineCount","setCursor","extendSelectionsBy","setSelections","addSelection","getSelections","dup","replaceSelections","newSel","hint","oldPrev","newPrev","computeReplacedSel","undo","redo","undoSelection","redoSelection","setExtending","getExtending","historySize","markClean","changeGeneration","forceSplit","isClean","gen","getHistory","setHistory","histData","setGutterMarker","gutterID","clearGutter","lineInfo","addLineClass","where","removeLineClass","addLineWidget","insertAt","aboveVisible","removeLineWidget","setBookmark","realOpts","findMarksAt","getAllMarks","posFromIndex","sepSize","indexFromPos","copyHistory","linkedDoc","mFrom","mTo","subMark","copySharedMarkers","unlinkDoc","splitIds","iterLinkedDocs","getEditor","setDirection","directionChanged","eachLine","3","8","9","13","16","17","18","19","20","27","32","33","34","35","36","37","38","39","40","44","45","46","59","61","91","92","93","106","107","109","110","111","127","173","186","187","188","189","190","191","192","219","220","221","222","63232","63233","63234","63235","63272","63273","63275","63276","63277","63302","basic","Left","Right","Up","Down","End","Home","PageUp","PageDown","Delete","Backspace","Shift-Backspace","Tab","Shift-Tab","Enter","Insert","Esc","pcDefault","Ctrl-A","Ctrl-D","Ctrl-Z","Shift-Ctrl-Z","Ctrl-Y","Ctrl-Home","Ctrl-End","Ctrl-Up","Ctrl-Down","Ctrl-Left","Ctrl-Right","Alt-Left","Alt-Right","Ctrl-Backspace","Ctrl-Delete","Ctrl-S","Ctrl-F","Ctrl-G","Shift-Ctrl-G","Shift-Ctrl-F","Shift-Ctrl-R","Ctrl-[","Ctrl-]","Ctrl-U","Shift-Ctrl-U","Alt-U","emacsy","Ctrl-B","Ctrl-P","Ctrl-N","Alt-F","Alt-B","Ctrl-E","Ctrl-V","Shift-Ctrl-V","Ctrl-H","Alt-D","Alt-Backspace","Ctrl-K","Ctrl-T","Ctrl-O","macDefault","Cmd-A","Cmd-D","Cmd-Z","Shift-Cmd-Z","Cmd-Y","Cmd-Home","Cmd-Up","Cmd-End","Cmd-Down","Cmd-Left","Cmd-Right","Ctrl-Alt-Backspace","Alt-Delete","Cmd-S","Cmd-F","Cmd-G","Shift-Cmd-G","Cmd-Alt-F","Shift-Cmd-Alt-F","Cmd-[","Cmd-]","Cmd-Backspace","Cmd-Delete","Cmd-U","Shift-Cmd-U","singleSelection","killLine","deleteLine","delLineLeft","delWrappedLineLeft","delWrappedLineRight","rightPos","goDocStart","goDocEnd","goLineStart","goLineStartSmart","goLineEnd","goLineRight","goLineLeft","goLineLeftSmart","goLineUp","moveV","goLineDown","goPageUp","goPageDown","goCharLeft","moveH","goCharRight","goColumnLeft","goColumnRight","goWordLeft","goGroupRight","goGroupLeft","goWordRight","delCharBefore","deleteH","delCharAfter","delWordBefore","delWordAfter","delGroupBefore","delGroupAfter","indentAuto","indentSelection","indentMore","indentLess","insertTab","insertSoftTab","spaces","defaultTab","execCommand","transposeChars","newlineAndIndent","sels","openLine","toggleOverwrite","defineInitHook","ContentEditableInput","lastAnchorNode","lastAnchorOffset","lastFocusNode","lastFocusOffset","polling","composing","gracePeriod","readDOMTimeout","onCopyCut","lineWiseCopyCut","clearData","kludge","hadFocus","showPrimarySelection","updateFromDOM","readFromDOMSoon","forceCompositionEnd","showMultipleSelections","curAnchor","curFocus","rng","rangeCount","getRangeAt","startGracePeriod","rememberSelection","selectionInEditor","commonAncestorContainer","blur","poll","pollSelection","pollInterval","scan","isInGutter","triggerOnKeyDown","pollContent","fromIndex","fromNode","toNode","toIndex","newText","close","closing","addText","walk","cmText","markerID","recognizeMarker","isBlock","nodeName","domTextBetween","oldText","cutFront","cutEnd","oldTop","maxCutFront","newBot","oldBot","maxCutEnd","chFrom","chTo","contentEditable","readOnlyChanged","resetPosition","TextareaInput","prevInput","pollingFast","prepareCopyCut","textarea","fastPoll","moveInputWithCursor","headPos","wrapOff","lineOff","teTop","teLeft","drawn","contextMenuPending","slowPoll","missed","same","prepareSelectAllHack","extval","rehide","oldWrapperCSS","oldCSS","detectingSelectAll","resetSelectionOnContextMenu","wrapperBox","oldScrollY","scrollY","scrollTo","mouseup","disabled","deflt","notOnInit","defineOption","newBreaks","refresh","getInputField","detach","attach","integer","tabIndex","defineOptions","helpers","setOption","getDoc","addKeyMap","removeKeyMap","addOverlay","score","priority","insertSorted","modeSpec","removeOverlay","newRanges","getTokenAt","getLineTokens","getTokenTypeAt","getHelpers","help","_global","getStateAfter","defaultTextHeight","defaultCharWidth","getViewport","addWidget","vspace","hspace","triggerOnKeyPress","triggerOnKeyUp","triggerOnMouseDown","amount","rtlMoveVisually","goalColumn","goals","startChar","check","getScrollInfo","scrollToRange","interpret","swapDoc","getWrapperElement","getScrollerElement","getGutterElement","registerHelper","registerGlobalHelper","predicate","addEditorMethods","dontDelegate","method","contenteditable","defineMode","dependencies","defineMIME","mime","defineExtension","func","defineDocExtension","fromTextArea","tabindex","placeholder","realSubmit","form","leaveSubmitMethodAlone","submit","wrappedSubmit","getTextArea","toTextArea","cmpPos","addLegacyProps","version","originalModule","webpackPolyfill","freeGlobal","freeExports","freeModule","Buffer","__WEBPACK_IMPORTED_MODULE_0__root_js__","isBuffer","__WEBPACK_IMPORTED_MODULE_1__stubFalse_js__","ListCache","entries","entry","Hash","MapCache","Stack","__data__","_ListCache","baseMerge","srcIndex","customizer","stack","_baseFor","srcValue","lodash_es_isObject","_Stack","_baseMergeDeep","newValue","_assignMergeValue","lodash_es_keysIn","memoize","resolver","TypeError","FUNC_ERROR_TEXT","memoized","has","Cache","_MapCache","debounce","wait","invokeFunc","lastArgs","thisArg","lastThis","lastInvokeTime","shouldInvoke","timeSinceLastCall","lastCallTime","maxing","maxWait","timerExpired","lodash_es_now","trailingEdge","timerId","nativeMin","remainingWait","trailing","debounced","isInvoking","leading","leadingEdge","debounce_FUNC_ERROR_TEXT","lodash_es_toNumber","debounce_nativeMax","flush","_listCacheClear","lodash_es_eq","_assocIndexOf","_listCacheDelete","_listCacheGet","_listCacheHas","_listCacheSet","_stackClear","_stackDelete","_stackGet","_stackHas","lodash_es__Symbol","_root","Symbol","objectProto","_getRawTag_hasOwnProperty","nativeObjectToString","symToStringTag","toStringTag","_getRawTag","isOwn","unmasked","_objectToString_nativeObjectToString","_objectToString","nullTag","undefinedTag","_baseGetTag_symToStringTag","_baseGetTag","asyncTag","funcTag","genTag","proxyTag","lodash_es_isFunction","_coreJsData","maskSrcKey","uid","IE_PROTO","_isMasked","funcToString","_toSource","reIsHostCtor","_baseIsNative_funcProto","_baseIsNative_objectProto","_baseIsNative_funcToString","_baseIsNative_hasOwnProperty","reIsNative","_baseIsNative","_getValue","_getNative","_Map","_nativeCreate","_hashClear","_hashDelete","HASH_UNDEFINED","_hashGet_hasOwnProperty","_hashGet","_hashHas_hasOwnProperty","_hashHas","_hashSet_HASH_UNDEFINED","_hashSet","_Hash","_mapCacheClear","hash","_isKeyable","_isKeyable__typeof","_getMapData","_mapCacheDelete","_mapCacheGet","_mapCacheHas","_mapCacheSet","LARGE_ARRAY_SIZE","_stackSet","pairs","_defineProperty","_baseAssignValue","writable","fromRight","iteratee","keysFunc","iterable","_createBaseFor","_Uint8Array","Uint8Array","_cloneArrayBuffer","arrayBuffer","byteLength","_cloneTypedArray","typedArray","isDeep","buffer","byteOffset","_copyArray","objectCreate","_baseCreate","proto","_getPrototype","transform","arg","_overArg","getPrototypeOf","_isPrototype_objectProto","_isPrototype","Ctor","_initCloneObject","lodash_es_isObjectLike","isObjectLike__typeof","argsTag","_baseIsArguments","isArguments_objectProto","isArguments_hasOwnProperty","propertyIsEnumerable","lodash_es_isArguments","lodash_es_isArray","isArray","MAX_SAFE_INTEGER","lodash_es_isLength","lodash_es_isArrayLike","lodash_es_isArrayLikeObject","objectTag","isPlainObject_funcProto","isPlainObject_objectProto","isPlainObject_funcToString","isPlainObject_hasOwnProperty","objectCtorString","lodash_es_isPlainObject","typedArrayTags","_baseIsTypedArray","_baseUnary","nodeIsTypedArray","_nodeUtil","isTypedArray","lodash_es_isTypedArray","_assignValue_hasOwnProperty","_assignValue","objValue","_copyObject","isNew","_baseTimes","_isIndex_MAX_SAFE_INTEGER","reIsUint","_isIndex","_arrayLikeKeys_hasOwnProperty","_arrayLikeKeys","inherited","isArr","isArg","isBuff","isType","skipIndexes","_nativeKeysIn","_baseKeysIn_hasOwnProperty","_baseKeysIn","isProto","lodash_es_toPlainObject","mergeFunc","stacked","isCommon","isTyped","_cloneBuffer","_baseMerge","lodash_es_identity","_apply","nativeMax","_overRest","otherArgs","lodash_es_constant","_baseSetToString","HOT_COUNT","HOT_SPAN","nativeNow","_setToString","lastCalled","stamp","_shortOut","_baseRest","_isIterateeCall","_isIterateeCall__typeof","lodash_es_merge","assigner","sources","guard","_createAssigner","uniqueId","namespace","dataset","element","_ref","acceptedMargin","stylesheet","dataToMarkup","_data","metadata","mainTitle","identifier","accession","subTitle","description","database","targetStart","tStart","tstart","targetEnd","tEnd","tend","queryStart","qStart","qstart","queryEnd","qEnd","qend","coordinates","aliStart","aliEnd","color","tooltip_getEntityBBox","getEntityBBox","findBestTooltipPosition","entityBBox","tooltipBBox","innerWidth","buildTooltipContent","html","el","classList","innerHTML","tooltip_TooltipManager","TooltipManager","_this","_classCallCheck","_promoteTarget","canvas","_promoted","_container","willChange","_demoteTarget","_ref2","relatedTarget","_replaceTooltipContent","_current","firstElementChild","_hide","_visible","_display","_ref3","_handleMouseOver","_currentData","_handleMouseOut","relatedData","cont","curr","_this2","promote","demote","tooltipManager","tooltip","_svg","attributes","_len","_key","createElementNS","_iteratorNormalCompletion","_didIteratorError","_iteratorError","_step","_iterator","iterator","err","return","_iteratorNormalCompletion2","_didIteratorError2","_iteratorError2","_step2","_iterator2","Node","svg_svg","circle","defs","linearGradient","svg_mask","path","rectangle","stop","svg_text","svg_filter","feGaussianBlur","feSpecularLighting","fePointLight","feComposite","_class","startPosition","pathData__classCallCheck","verticalLine","entities_markup","residueWidth","v_align","vAlign","_ref2$level","lineColor","headColor","headStyle","isOnTop","pathData","horizontalLine","fill","stroke","markup_buildDiamondHead","cx","cy","markup_buildCircleHead","markup_buildArrowHead","markup_buildPointerHead","markup_buildLineHead","markup_buildSquareHead","buildHead","sequence","_ref$position","rx","ry","entities_hit","utils_gradient","colors","smoothGradient","gradientId","gradientElement","x1","x2","y1","y2","_toConsumableArray","_colors","step","stop-color","lodash_es_memoize","opacity","re","colorContrast","_getRGB","_window$getComputedSt","backgroundColor","_window$getComputedSt2","_slicedToArray","getRGB","domain_line","domain_horizontalLine","domain_verticalLine","arc","xAxisRotate","largeArcFlag","sweepFlag","entities_domain","spotlight","addToRefs","textColor","gradient","_envelope","maskId","maskElement","domain_envelope","gradientObj","textElement","domain_height","text-anchor","font-size","font-family","mask","topBottomLength","radius","domainEnd","domainStart","domain_domain","entities_motif","addToDefs","basicAttributes","motif__extends","_gradientMaker","svg_connectData","entity","always","querySelectorAll","SvgRenderer","_ref$spotlight","svg__classCallCheck","_addToDefs","_defs","drawMarkup","previousNestedMarkups","isFinite","availableLevels","Set","previous","delete","svg__slicedToArray","_canvas","drawSequence","drawHit","drawRegion","region","_spotlight","textToFit","getBBox","drawMotif","filterUnits","in","stdDeviation","surfaceScale","specularConstant","specularExponent","lighting-color","z","in2","operator","viewBox","image","headSize","square","diamond","arrow","pointer","sequenceEndPadding","increment","lollipopToLollipop","bridgeToBridge","bridgeToLollipop","largeJaggedSteps","fontSize","markup","motif","env","labelPadding","residue","scale","weight","baseUrl","imageMap","labels","tips","tipStyle","newCanvas","keyNumbers","colour","falseString","utils_sanitizer","sanitizer","rawKey","rawValue","item","sanitizer__typeof","isHidden","_ref$display","src_DomainGFX","DomainGFX","_ref2$data","_ref2$params","params","src__classCallCheck","_draw","markups","nestedMarkups","needsTooltips","_renderer","_params","hits","hit","_iteratorNormalCompletion3","_didIteratorError3","_iteratorError3","_step3","_iterator3","regions","_iteratorNormalCompletion4","_didIteratorError4","_iteratorError4","_step4","_iterator4","motifs","_detach","attachToCanvas","_createCanvas","renderer_svg","_computeWidth","_computeHeight","_parent","_ref3$length","_ref4$image","_ref4","prevCanvas","dispatchEvent","CustomEvent","_","symbolTag","lodash_es_isSymbol","isSymbol__typeof","NAN","reTrim","reIsBadHex","reIsBinary","reIsOctal","freeParseInt","valueOf","isBinary","lodash_es_debounce","textArea","visu","invalid","dg","demo_updateView","JSON","parse","console","error","stringify","data_default","demo_cm","codemirror_default","__WEBPACK_AMD_DEFINE_ARRAY__","config","parserConfig","ret","tp","tokenBase","tokenize","quote","escaped","jsonldMode","isJsonldKeyword","tokenString","tokenComment","expressionAllowed","inSet","readRegexp","tokenQuasi","isOperatorChar","lexical","wordRE","lastType","keywords","kw","maybeEnd","findFatArrow","fatArrowAt","isTS","depth","sawSomething","bracket","brackets","JSLexical","inScope","varname","localVars","vars","pass","cc","register","inList","marked","globalVars","pushcontext","defaultVars","popcontext","pushlex","lex","poplex","expect","wanted","exp","statement","vardef","parenExpr","maybeexpression","block","maybeelse","functiondef","forspec","typeexpr","maybelabel","expression","funarg","afterExport","afterImport","expressionInner","expressionNoComma","noComma","arrowBodyNoComma","arrowBody","commasep","maybeop","maybeoperatorNoComma","maybeoperatorComma","atomicTypes","classExpression","arrayLiteral","contCommasep","objprop","quasi","maybeTypeArgs","maybeTarget","expr","continueQuasi","getterSetter","afterprop","what","sep","proceed","maybetype","afterType","typeprop","typearg","maybeReturnType","maybeAssign","vardefCont","proppattern","_type","forspec1","forspec2","formaybeinof","forspec3","classNameAfter","classBody","classfield","maybeFrom","exportField","importSpec","maybeMoreImports","maybeAs","statementIndent","jsonld","jsonMode","json","typescript","wordCharacters","A","B","C","D","atom","jsKeywords","if","while","with","else","do","try","finally","break","continue","new","void","throw","debugger","var","const","let","function","catch","for","switch","case","default","typeof","instanceof","true","false","class","super","yield","export","import","extends","await","tsKeywords","interface","implements","enum","public","private","protected","abstract","readonly","number","boolean","any","attr","variable","regexp","jsonld-keyword","basecolumn","parseJS","textAfter","firstChar","isContinuedStatement","doubleIndentSwitch","blockCommentStart","blockCommentEnd","blockCommentContinue","lineComment","fold","closeBrackets","skipExpression","deprecate","paths","eval","allocUnsafe","freeProcess","process","nodeUtil","binding","modelStart","modelEnd","href","modelLength","scoreName","lineColour","organism","taxid"],"mappings":"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","file":"domain-gfx.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 5);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 688179875566246ef485","import freeGlobal from './_freeGlobal.js';\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nexport default root;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/_root.js","// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: http://codemirror.net/LICENSE\n\n// This is CodeMirror (http://codemirror.net), a code editor\n// implemented in JavaScript on top of the browser's DOM.\n//\n// You can find some technical background for some of the code below\n// at http://marijnhaverbeke.nl/blog/#cm-internals .\n\n(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n\ttypeof define === 'function' && define.amd ? define(factory) :\n\t(global.CodeMirror = factory());\n}(this, (function () { 'use strict';\n\n// Kludges for bugs and behavior differences that can't be feature\n// detected are enabled based on userAgent etc sniffing.\nvar userAgent = navigator.userAgent;\nvar platform = navigator.platform;\n\nvar gecko = /gecko\\/\\d/i.test(userAgent);\nvar ie_upto10 = /MSIE \\d/.test(userAgent);\nvar ie_11up = /Trident\\/(?:[7-9]|\\d{2,})\\..*rv:(\\d+)/.exec(userAgent);\nvar edge = /Edge\\/(\\d+)/.exec(userAgent);\nvar ie = ie_upto10 || ie_11up || edge;\nvar ie_version = ie && (ie_upto10 ? document.documentMode || 6 : +(edge || ie_11up)[1]);\nvar webkit = !edge && /WebKit\\//.test(userAgent);\nvar qtwebkit = webkit && /Qt\\/\\d+\\.\\d+/.test(userAgent);\nvar chrome = !edge && /Chrome\\//.test(userAgent);\nvar presto = /Opera\\//.test(userAgent);\nvar safari = /Apple Computer/.test(navigator.vendor);\nvar mac_geMountainLion = /Mac OS X 1\\d\\D([8-9]|\\d\\d)\\D/.test(userAgent);\nvar phantom = /PhantomJS/.test(userAgent);\n\nvar ios = !edge && /AppleWebKit/.test(userAgent) && /Mobile\\/\\w+/.test(userAgent);\nvar android = /Android/.test(userAgent);\n// This is woefully incomplete. Suggestions for alternative methods welcome.\nvar mobile = ios || android || /webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(userAgent);\nvar mac = ios || /Mac/.test(platform);\nvar chromeOS = /\\bCrOS\\b/.test(userAgent);\nvar windows = /win/i.test(platform);\n\nvar presto_version = presto && userAgent.match(/Version\\/(\\d*\\.\\d*)/);\nif (presto_version) { presto_version = Number(presto_version[1]); }\nif (presto_version && presto_version >= 15) { presto = false; webkit = true; }\n// Some browsers use the wrong event properties to signal cmd/ctrl on OS X\nvar flipCtrlCmd = mac && (qtwebkit || presto && (presto_version == null || presto_version < 12.11));\nvar captureRightClick = gecko || (ie && ie_version >= 9);\n\nfunction classTest(cls) { return new RegExp(\"(^|\\\\s)\" + cls + \"(?:$|\\\\s)\\\\s*\") }\n\nvar rmClass = function(node, cls) {\n var current = node.className;\n var match = classTest(cls).exec(current);\n if (match) {\n var after = current.slice(match.index + match[0].length);\n node.className = current.slice(0, match.index) + (after ? match[1] + after : \"\");\n }\n};\n\nfunction removeChildren(e) {\n for (var count = e.childNodes.length; count > 0; --count)\n { e.removeChild(e.firstChild); }\n return e\n}\n\nfunction removeChildrenAndAdd(parent, e) {\n return removeChildren(parent).appendChild(e)\n}\n\nfunction elt(tag, content, className, style) {\n var e = document.createElement(tag);\n if (className) { e.className = className; }\n if (style) { e.style.cssText = style; }\n if (typeof content == \"string\") { e.appendChild(document.createTextNode(content)); }\n else if (content) { for (var i = 0; i < content.length; ++i) { e.appendChild(content[i]); } }\n return e\n}\n// wrapper for elt, which removes the elt from the accessibility tree\nfunction eltP(tag, content, className, style) {\n var e = elt(tag, content, className, style);\n e.setAttribute(\"role\", \"presentation\");\n return e\n}\n\nvar range;\nif (document.createRange) { range = function(node, start, end, endNode) {\n var r = document.createRange();\n r.setEnd(endNode || node, end);\n r.setStart(node, start);\n return r\n}; }\nelse { range = function(node, start, end) {\n var r = document.body.createTextRange();\n try { r.moveToElementText(node.parentNode); }\n catch(e) { return r }\n r.collapse(true);\n r.moveEnd(\"character\", end);\n r.moveStart(\"character\", start);\n return r\n}; }\n\nfunction contains(parent, child) {\n if (child.nodeType == 3) // Android browser always returns false when child is a textnode\n { child = child.parentNode; }\n if (parent.contains)\n { return parent.contains(child) }\n do {\n if (child.nodeType == 11) { child = child.host; }\n if (child == parent) { return true }\n } while (child = child.parentNode)\n}\n\nfunction activeElt() {\n // IE and Edge may throw an \"Unspecified Error\" when accessing document.activeElement.\n // IE < 10 will throw when accessed while the page is loading or in an iframe.\n // IE > 9 and Edge will throw when accessed in an iframe if document.body is unavailable.\n var activeElement;\n try {\n activeElement = document.activeElement;\n } catch(e) {\n activeElement = document.body || null;\n }\n while (activeElement && activeElement.shadowRoot && activeElement.shadowRoot.activeElement)\n { activeElement = activeElement.shadowRoot.activeElement; }\n return activeElement\n}\n\nfunction addClass(node, cls) {\n var current = node.className;\n if (!classTest(cls).test(current)) { node.className += (current ? \" \" : \"\") + cls; }\n}\nfunction joinClasses(a, b) {\n var as = a.split(\" \");\n for (var i = 0; i < as.length; i++)\n { if (as[i] && !classTest(as[i]).test(b)) { b += \" \" + as[i]; } }\n return b\n}\n\nvar selectInput = function(node) { node.select(); };\nif (ios) // Mobile Safari apparently has a bug where select() is broken.\n { selectInput = function(node) { node.selectionStart = 0; node.selectionEnd = node.value.length; }; }\nelse if (ie) // Suppress mysterious IE10 errors\n { selectInput = function(node) { try { node.select(); } catch(_e) {} }; }\n\nfunction bind(f) {\n var args = Array.prototype.slice.call(arguments, 1);\n return function(){return f.apply(null, args)}\n}\n\nfunction copyObj(obj, target, overwrite) {\n if (!target) { target = {}; }\n for (var prop in obj)\n { if (obj.hasOwnProperty(prop) && (overwrite !== false || !target.hasOwnProperty(prop)))\n { target[prop] = obj[prop]; } }\n return target\n}\n\n// Counts the column offset in a string, taking tabs into account.\n// Used mostly to find indentation.\nfunction countColumn(string, end, tabSize, startIndex, startValue) {\n if (end == null) {\n end = string.search(/[^\\s\\u00a0]/);\n if (end == -1) { end = string.length; }\n }\n for (var i = startIndex || 0, n = startValue || 0;;) {\n var nextTab = string.indexOf(\"\\t\", i);\n if (nextTab < 0 || nextTab >= end)\n { return n + (end - i) }\n n += nextTab - i;\n n += tabSize - (n % tabSize);\n i = nextTab + 1;\n }\n}\n\nvar Delayed = function() {this.id = null;};\nDelayed.prototype.set = function (ms, f) {\n clearTimeout(this.id);\n this.id = setTimeout(f, ms);\n};\n\nfunction indexOf(array, elt) {\n for (var i = 0; i < array.length; ++i)\n { if (array[i] == elt) { return i } }\n return -1\n}\n\n// Number of pixels added to scroller and sizer to hide scrollbar\nvar scrollerGap = 30;\n\n// Returned or thrown by various protocols to signal 'I'm not\n// handling this'.\nvar Pass = {toString: function(){return \"CodeMirror.Pass\"}};\n\n// Reused option objects for setSelection & friends\nvar sel_dontScroll = {scroll: false};\nvar sel_mouse = {origin: \"*mouse\"};\nvar sel_move = {origin: \"+move\"};\n\n// The inverse of countColumn -- find the offset that corresponds to\n// a particular column.\nfunction findColumn(string, goal, tabSize) {\n for (var pos = 0, col = 0;;) {\n var nextTab = string.indexOf(\"\\t\", pos);\n if (nextTab == -1) { nextTab = string.length; }\n var skipped = nextTab - pos;\n if (nextTab == string.length || col + skipped >= goal)\n { return pos + Math.min(skipped, goal - col) }\n col += nextTab - pos;\n col += tabSize - (col % tabSize);\n pos = nextTab + 1;\n if (col >= goal) { return pos }\n }\n}\n\nvar spaceStrs = [\"\"];\nfunction spaceStr(n) {\n while (spaceStrs.length <= n)\n { spaceStrs.push(lst(spaceStrs) + \" \"); }\n return spaceStrs[n]\n}\n\nfunction lst(arr) { return arr[arr.length-1] }\n\nfunction map(array, f) {\n var out = [];\n for (var i = 0; i < array.length; i++) { out[i] = f(array[i], i); }\n return out\n}\n\nfunction insertSorted(array, value, score) {\n var pos = 0, priority = score(value);\n while (pos < array.length && score(array[pos]) <= priority) { pos++; }\n array.splice(pos, 0, value);\n}\n\nfunction nothing() {}\n\nfunction createObj(base, props) {\n var inst;\n if (Object.create) {\n inst = Object.create(base);\n } else {\n nothing.prototype = base;\n inst = new nothing();\n }\n if (props) { copyObj(props, inst); }\n return inst\n}\n\nvar nonASCIISingleCaseWordChar = /[\\u00df\\u0587\\u0590-\\u05f4\\u0600-\\u06ff\\u3040-\\u309f\\u30a0-\\u30ff\\u3400-\\u4db5\\u4e00-\\u9fcc\\uac00-\\ud7af]/;\nfunction isWordCharBasic(ch) {\n return /\\w/.test(ch) || ch > \"\\x80\" &&\n (ch.toUpperCase() != ch.toLowerCase() || nonASCIISingleCaseWordChar.test(ch))\n}\nfunction isWordChar(ch, helper) {\n if (!helper) { return isWordCharBasic(ch) }\n if (helper.source.indexOf(\"\\\\w\") > -1 && isWordCharBasic(ch)) { return true }\n return helper.test(ch)\n}\n\nfunction isEmpty(obj) {\n for (var n in obj) { if (obj.hasOwnProperty(n) && obj[n]) { return false } }\n return true\n}\n\n// Extending unicode characters. A series of a non-extending char +\n// any number of extending chars is treated as a single unit as far\n// as editing and measuring is concerned. This is not fully correct,\n// since some scripts/fonts/browsers also treat other configurations\n// of code points as a group.\nvar extendingChars = /[\\u0300-\\u036f\\u0483-\\u0489\\u0591-\\u05bd\\u05bf\\u05c1\\u05c2\\u05c4\\u05c5\\u05c7\\u0610-\\u061a\\u064b-\\u065e\\u0670\\u06d6-\\u06dc\\u06de-\\u06e4\\u06e7\\u06e8\\u06ea-\\u06ed\\u0711\\u0730-\\u074a\\u07a6-\\u07b0\\u07eb-\\u07f3\\u0816-\\u0819\\u081b-\\u0823\\u0825-\\u0827\\u0829-\\u082d\\u0900-\\u0902\\u093c\\u0941-\\u0948\\u094d\\u0951-\\u0955\\u0962\\u0963\\u0981\\u09bc\\u09be\\u09c1-\\u09c4\\u09cd\\u09d7\\u09e2\\u09e3\\u0a01\\u0a02\\u0a3c\\u0a41\\u0a42\\u0a47\\u0a48\\u0a4b-\\u0a4d\\u0a51\\u0a70\\u0a71\\u0a75\\u0a81\\u0a82\\u0abc\\u0ac1-\\u0ac5\\u0ac7\\u0ac8\\u0acd\\u0ae2\\u0ae3\\u0b01\\u0b3c\\u0b3e\\u0b3f\\u0b41-\\u0b44\\u0b4d\\u0b56\\u0b57\\u0b62\\u0b63\\u0b82\\u0bbe\\u0bc0\\u0bcd\\u0bd7\\u0c3e-\\u0c40\\u0c46-\\u0c48\\u0c4a-\\u0c4d\\u0c55\\u0c56\\u0c62\\u0c63\\u0cbc\\u0cbf\\u0cc2\\u0cc6\\u0ccc\\u0ccd\\u0cd5\\u0cd6\\u0ce2\\u0ce3\\u0d3e\\u0d41-\\u0d44\\u0d4d\\u0d57\\u0d62\\u0d63\\u0dca\\u0dcf\\u0dd2-\\u0dd4\\u0dd6\\u0ddf\\u0e31\\u0e34-\\u0e3a\\u0e47-\\u0e4e\\u0eb1\\u0eb4-\\u0eb9\\u0ebb\\u0ebc\\u0ec8-\\u0ecd\\u0f18\\u0f19\\u0f35\\u0f37\\u0f39\\u0f71-\\u0f7e\\u0f80-\\u0f84\\u0f86\\u0f87\\u0f90-\\u0f97\\u0f99-\\u0fbc\\u0fc6\\u102d-\\u1030\\u1032-\\u1037\\u1039\\u103a\\u103d\\u103e\\u1058\\u1059\\u105e-\\u1060\\u1071-\\u1074\\u1082\\u1085\\u1086\\u108d\\u109d\\u135f\\u1712-\\u1714\\u1732-\\u1734\\u1752\\u1753\\u1772\\u1773\\u17b7-\\u17bd\\u17c6\\u17c9-\\u17d3\\u17dd\\u180b-\\u180d\\u18a9\\u1920-\\u1922\\u1927\\u1928\\u1932\\u1939-\\u193b\\u1a17\\u1a18\\u1a56\\u1a58-\\u1a5e\\u1a60\\u1a62\\u1a65-\\u1a6c\\u1a73-\\u1a7c\\u1a7f\\u1b00-\\u1b03\\u1b34\\u1b36-\\u1b3a\\u1b3c\\u1b42\\u1b6b-\\u1b73\\u1b80\\u1b81\\u1ba2-\\u1ba5\\u1ba8\\u1ba9\\u1c2c-\\u1c33\\u1c36\\u1c37\\u1cd0-\\u1cd2\\u1cd4-\\u1ce0\\u1ce2-\\u1ce8\\u1ced\\u1dc0-\\u1de6\\u1dfd-\\u1dff\\u200c\\u200d\\u20d0-\\u20f0\\u2cef-\\u2cf1\\u2de0-\\u2dff\\u302a-\\u302f\\u3099\\u309a\\ua66f-\\ua672\\ua67c\\ua67d\\ua6f0\\ua6f1\\ua802\\ua806\\ua80b\\ua825\\ua826\\ua8c4\\ua8e0-\\ua8f1\\ua926-\\ua92d\\ua947-\\ua951\\ua980-\\ua982\\ua9b3\\ua9b6-\\ua9b9\\ua9bc\\uaa29-\\uaa2e\\uaa31\\uaa32\\uaa35\\uaa36\\uaa43\\uaa4c\\uaab0\\uaab2-\\uaab4\\uaab7\\uaab8\\uaabe\\uaabf\\uaac1\\uabe5\\uabe8\\uabed\\udc00-\\udfff\\ufb1e\\ufe00-\\ufe0f\\ufe20-\\ufe26\\uff9e\\uff9f]/;\nfunction isExtendingChar(ch) { return ch.charCodeAt(0) >= 768 && extendingChars.test(ch) }\n\n// Returns a number from the range [`0`; `str.length`] unless `pos` is outside that range.\nfunction skipExtendingChars(str, pos, dir) {\n while ((dir < 0 ? pos > 0 : pos < str.length) && isExtendingChar(str.charAt(pos))) { pos += dir; }\n return pos\n}\n\n// Returns the value from the range [`from`; `to`] that satisfies\n// `pred` and is closest to `from`. Assumes that at least `to`\n// satisfies `pred`. Supports `from` being greater than `to`.\nfunction findFirst(pred, from, to) {\n // At any point we are certain `to` satisfies `pred`, don't know\n // whether `from` does.\n var dir = from > to ? -1 : 1;\n for (;;) {\n if (from == to) { return from }\n var midF = (from + to) / 2, mid = dir < 0 ? Math.ceil(midF) : Math.floor(midF);\n if (mid == from) { return pred(mid) ? from : to }\n if (pred(mid)) { to = mid; }\n else { from = mid + dir; }\n }\n}\n\n// The display handles the DOM integration, both for input reading\n// and content drawing. It holds references to DOM nodes and\n// display-related state.\n\nfunction Display(place, doc, input) {\n var d = this;\n this.input = input;\n\n // Covers bottom-right square when both scrollbars are present.\n d.scrollbarFiller = elt(\"div\", null, \"CodeMirror-scrollbar-filler\");\n d.scrollbarFiller.setAttribute(\"cm-not-content\", \"true\");\n // Covers bottom of gutter when coverGutterNextToScrollbar is on\n // and h scrollbar is present.\n d.gutterFiller = elt(\"div\", null, \"CodeMirror-gutter-filler\");\n d.gutterFiller.setAttribute(\"cm-not-content\", \"true\");\n // Will contain the actual code, positioned to cover the viewport.\n d.lineDiv = eltP(\"div\", null, \"CodeMirror-code\");\n // Elements are added to these to represent selection and cursors.\n d.selectionDiv = elt(\"div\", null, null, \"position: relative; z-index: 1\");\n d.cursorDiv = elt(\"div\", null, \"CodeMirror-cursors\");\n // A visibility: hidden element used to find the size of things.\n d.measure = elt(\"div\", null, \"CodeMirror-measure\");\n // When lines outside of the viewport are measured, they are drawn in this.\n d.lineMeasure = elt(\"div\", null, \"CodeMirror-measure\");\n // Wraps everything that needs to exist inside the vertically-padded coordinate system\n d.lineSpace = eltP(\"div\", [d.measure, d.lineMeasure, d.selectionDiv, d.cursorDiv, d.lineDiv],\n null, \"position: relative; outline: none\");\n var lines = eltP(\"div\", [d.lineSpace], \"CodeMirror-lines\");\n // Moved around its parent to cover visible view.\n d.mover = elt(\"div\", [lines], null, \"position: relative\");\n // Set to the height of the document, allowing scrolling.\n d.sizer = elt(\"div\", [d.mover], \"CodeMirror-sizer\");\n d.sizerWidth = null;\n // Behavior of elts with overflow: auto and padding is\n // inconsistent across browsers. This is used to ensure the\n // scrollable area is big enough.\n d.heightForcer = elt(\"div\", null, null, \"position: absolute; height: \" + scrollerGap + \"px; width: 1px;\");\n // Will contain the gutters, if any.\n d.gutters = elt(\"div\", null, \"CodeMirror-gutters\");\n d.lineGutter = null;\n // Actual scrollable element.\n d.scroller = elt(\"div\", [d.sizer, d.heightForcer, d.gutters], \"CodeMirror-scroll\");\n d.scroller.setAttribute(\"tabIndex\", \"-1\");\n // The element in which the editor lives.\n d.wrapper = elt(\"div\", [d.scrollbarFiller, d.gutterFiller, d.scroller], \"CodeMirror\");\n\n // Work around IE7 z-index bug (not perfect, hence IE7 not really being supported)\n if (ie && ie_version < 8) { d.gutters.style.zIndex = -1; d.scroller.style.paddingRight = 0; }\n if (!webkit && !(gecko && mobile)) { d.scroller.draggable = true; }\n\n if (place) {\n if (place.appendChild) { place.appendChild(d.wrapper); }\n else { place(d.wrapper); }\n }\n\n // Current rendered range (may be bigger than the view window).\n d.viewFrom = d.viewTo = doc.first;\n d.reportedViewFrom = d.reportedViewTo = doc.first;\n // Information about the rendered lines.\n d.view = [];\n d.renderedView = null;\n // Holds info about a single rendered line when it was rendered\n // for measurement, while not in view.\n d.externalMeasured = null;\n // Empty space (in pixels) above the view\n d.viewOffset = 0;\n d.lastWrapHeight = d.lastWrapWidth = 0;\n d.updateLineNumbers = null;\n\n d.nativeBarWidth = d.barHeight = d.barWidth = 0;\n d.scrollbarsClipped = false;\n\n // Used to only resize the line number gutter when necessary (when\n // the amount of lines crosses a boundary that makes its width change)\n d.lineNumWidth = d.lineNumInnerWidth = d.lineNumChars = null;\n // Set to true when a non-horizontal-scrolling line widget is\n // added. As an optimization, line widget aligning is skipped when\n // this is false.\n d.alignWidgets = false;\n\n d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = null;\n\n // Tracks the maximum line length so that the horizontal scrollbar\n // can be kept static when scrolling.\n d.maxLine = null;\n d.maxLineLength = 0;\n d.maxLineChanged = false;\n\n // Used for measuring wheel scrolling granularity\n d.wheelDX = d.wheelDY = d.wheelStartX = d.wheelStartY = null;\n\n // True when shift is held down.\n d.shift = false;\n\n // Used to track whether anything happened since the context menu\n // was opened.\n d.selForContextMenu = null;\n\n d.activeTouch = null;\n\n input.init(d);\n}\n\n// Find the line object corresponding to the given line number.\nfunction getLine(doc, n) {\n n -= doc.first;\n if (n < 0 || n >= doc.size) { throw new Error(\"There is no line \" + (n + doc.first) + \" in the document.\") }\n var chunk = doc;\n while (!chunk.lines) {\n for (var i = 0;; ++i) {\n var child = chunk.children[i], sz = child.chunkSize();\n if (n < sz) { chunk = child; break }\n n -= sz;\n }\n }\n return chunk.lines[n]\n}\n\n// Get the part of a document between two positions, as an array of\n// strings.\nfunction getBetween(doc, start, end) {\n var out = [], n = start.line;\n doc.iter(start.line, end.line + 1, function (line) {\n var text = line.text;\n if (n == end.line) { text = text.slice(0, end.ch); }\n if (n == start.line) { text = text.slice(start.ch); }\n out.push(text);\n ++n;\n });\n return out\n}\n// Get the lines between from and to, as array of strings.\nfunction getLines(doc, from, to) {\n var out = [];\n doc.iter(from, to, function (line) { out.push(line.text); }); // iter aborts when callback returns truthy value\n return out\n}\n\n// Update the height of a line, propagating the height change\n// upwards to parent nodes.\nfunction updateLineHeight(line, height) {\n var diff = height - line.height;\n if (diff) { for (var n = line; n; n = n.parent) { n.height += diff; } }\n}\n\n// Given a line object, find its line number by walking up through\n// its parent links.\nfunction lineNo(line) {\n if (line.parent == null) { return null }\n var cur = line.parent, no = indexOf(cur.lines, line);\n for (var chunk = cur.parent; chunk; cur = chunk, chunk = chunk.parent) {\n for (var i = 0;; ++i) {\n if (chunk.children[i] == cur) { break }\n no += chunk.children[i].chunkSize();\n }\n }\n return no + cur.first\n}\n\n// Find the line at the given vertical position, using the height\n// information in the document tree.\nfunction lineAtHeight(chunk, h) {\n var n = chunk.first;\n outer: do {\n for (var i$1 = 0; i$1 < chunk.children.length; ++i$1) {\n var child = chunk.children[i$1], ch = child.height;\n if (h < ch) { chunk = child; continue outer }\n h -= ch;\n n += child.chunkSize();\n }\n return n\n } while (!chunk.lines)\n var i = 0;\n for (; i < chunk.lines.length; ++i) {\n var line = chunk.lines[i], lh = line.height;\n if (h < lh) { break }\n h -= lh;\n }\n return n + i\n}\n\nfunction isLine(doc, l) {return l >= doc.first && l < doc.first + doc.size}\n\nfunction lineNumberFor(options, i) {\n return String(options.lineNumberFormatter(i + options.firstLineNumber))\n}\n\n// A Pos instance represents a position within the text.\nfunction Pos(line, ch, sticky) {\n if ( sticky === void 0 ) sticky = null;\n\n if (!(this instanceof Pos)) { return new Pos(line, ch, sticky) }\n this.line = line;\n this.ch = ch;\n this.sticky = sticky;\n}\n\n// Compare two positions, return 0 if they are the same, a negative\n// number when a is less, and a positive number otherwise.\nfunction cmp(a, b) { return a.line - b.line || a.ch - b.ch }\n\nfunction equalCursorPos(a, b) { return a.sticky == b.sticky && cmp(a, b) == 0 }\n\nfunction copyPos(x) {return Pos(x.line, x.ch)}\nfunction maxPos(a, b) { return cmp(a, b) < 0 ? b : a }\nfunction minPos(a, b) { return cmp(a, b) < 0 ? a : b }\n\n// Most of the external API clips given positions to make sure they\n// actually exist within the document.\nfunction clipLine(doc, n) {return Math.max(doc.first, Math.min(n, doc.first + doc.size - 1))}\nfunction clipPos(doc, pos) {\n if (pos.line < doc.first) { return Pos(doc.first, 0) }\n var last = doc.first + doc.size - 1;\n if (pos.line > last) { return Pos(last, getLine(doc, last).text.length) }\n return clipToLen(pos, getLine(doc, pos.line).text.length)\n}\nfunction clipToLen(pos, linelen) {\n var ch = pos.ch;\n if (ch == null || ch > linelen) { return Pos(pos.line, linelen) }\n else if (ch < 0) { return Pos(pos.line, 0) }\n else { return pos }\n}\nfunction clipPosArray(doc, array) {\n var out = [];\n for (var i = 0; i < array.length; i++) { out[i] = clipPos(doc, array[i]); }\n return out\n}\n\n// Optimize some code when these features are not used.\nvar sawReadOnlySpans = false;\nvar sawCollapsedSpans = false;\n\nfunction seeReadOnlySpans() {\n sawReadOnlySpans = true;\n}\n\nfunction seeCollapsedSpans() {\n sawCollapsedSpans = true;\n}\n\n// TEXTMARKER SPANS\n\nfunction MarkedSpan(marker, from, to) {\n this.marker = marker;\n this.from = from; this.to = to;\n}\n\n// Search an array of spans for a span matching the given marker.\nfunction getMarkedSpanFor(spans, marker) {\n if (spans) { for (var i = 0; i < spans.length; ++i) {\n var span = spans[i];\n if (span.marker == marker) { return span }\n } }\n}\n// Remove a span from an array, returning undefined if no spans are\n// left (we don't store arrays for lines without spans).\nfunction removeMarkedSpan(spans, span) {\n var r;\n for (var i = 0; i < spans.length; ++i)\n { if (spans[i] != span) { (r || (r = [])).push(spans[i]); } }\n return r\n}\n// Add a span to a line.\nfunction addMarkedSpan(line, span) {\n line.markedSpans = line.markedSpans ? line.markedSpans.concat([span]) : [span];\n span.marker.attachLine(line);\n}\n\n// Used for the algorithm that adjusts markers for a change in the\n// document. These functions cut an array of spans at a given\n// character position, returning an array of remaining chunks (or\n// undefined if nothing remains).\nfunction markedSpansBefore(old, startCh, isInsert) {\n var nw;\n if (old) { for (var i = 0; i < old.length; ++i) {\n var span = old[i], marker = span.marker;\n var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= startCh : span.from < startCh);\n if (startsBefore || span.from == startCh && marker.type == \"bookmark\" && (!isInsert || !span.marker.insertLeft)) {\n var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= startCh : span.to > startCh);(nw || (nw = [])).push(new MarkedSpan(marker, span.from, endsAfter ? null : span.to));\n }\n } }\n return nw\n}\nfunction markedSpansAfter(old, endCh, isInsert) {\n var nw;\n if (old) { for (var i = 0; i < old.length; ++i) {\n var span = old[i], marker = span.marker;\n var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= endCh : span.to > endCh);\n if (endsAfter || span.from == endCh && marker.type == \"bookmark\" && (!isInsert || span.marker.insertLeft)) {\n var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= endCh : span.from < endCh);(nw || (nw = [])).push(new MarkedSpan(marker, startsBefore ? null : span.from - endCh,\n span.to == null ? null : span.to - endCh));\n }\n } }\n return nw\n}\n\n// Given a change object, compute the new set of marker spans that\n// cover the line in which the change took place. Removes spans\n// entirely within the change, reconnects spans belonging to the\n// same marker that appear on both sides of the change, and cuts off\n// spans partially within the change. Returns an array of span\n// arrays with one element for each line in (after) the change.\nfunction stretchSpansOverChange(doc, change) {\n if (change.full) { return null }\n var oldFirst = isLine(doc, change.from.line) && getLine(doc, change.from.line).markedSpans;\n var oldLast = isLine(doc, change.to.line) && getLine(doc, change.to.line).markedSpans;\n if (!oldFirst && !oldLast) { return null }\n\n var startCh = change.from.ch, endCh = change.to.ch, isInsert = cmp(change.from, change.to) == 0;\n // Get the spans that 'stick out' on both sides\n var first = markedSpansBefore(oldFirst, startCh, isInsert);\n var last = markedSpansAfter(oldLast, endCh, isInsert);\n\n // Next, merge those two ends\n var sameLine = change.text.length == 1, offset = lst(change.text).length + (sameLine ? startCh : 0);\n if (first) {\n // Fix up .to properties of first\n for (var i = 0; i < first.length; ++i) {\n var span = first[i];\n if (span.to == null) {\n var found = getMarkedSpanFor(last, span.marker);\n if (!found) { span.to = startCh; }\n else if (sameLine) { span.to = found.to == null ? null : found.to + offset; }\n }\n }\n }\n if (last) {\n // Fix up .from in last (or move them into first in case of sameLine)\n for (var i$1 = 0; i$1 < last.length; ++i$1) {\n var span$1 = last[i$1];\n if (span$1.to != null) { span$1.to += offset; }\n if (span$1.from == null) {\n var found$1 = getMarkedSpanFor(first, span$1.marker);\n if (!found$1) {\n span$1.from = offset;\n if (sameLine) { (first || (first = [])).push(span$1); }\n }\n } else {\n span$1.from += offset;\n if (sameLine) { (first || (first = [])).push(span$1); }\n }\n }\n }\n // Make sure we didn't create any zero-length spans\n if (first) { first = clearEmptySpans(first); }\n if (last && last != first) { last = clearEmptySpans(last); }\n\n var newMarkers = [first];\n if (!sameLine) {\n // Fill gap with whole-line-spans\n var gap = change.text.length - 2, gapMarkers;\n if (gap > 0 && first)\n { for (var i$2 = 0; i$2 < first.length; ++i$2)\n { if (first[i$2].to == null)\n { (gapMarkers || (gapMarkers = [])).push(new MarkedSpan(first[i$2].marker, null, null)); } } }\n for (var i$3 = 0; i$3 < gap; ++i$3)\n { newMarkers.push(gapMarkers); }\n newMarkers.push(last);\n }\n return newMarkers\n}\n\n// Remove spans that are empty and don't have a clearWhenEmpty\n// option of false.\nfunction clearEmptySpans(spans) {\n for (var i = 0; i < spans.length; ++i) {\n var span = spans[i];\n if (span.from != null && span.from == span.to && span.marker.clearWhenEmpty !== false)\n { spans.splice(i--, 1); }\n }\n if (!spans.length) { return null }\n return spans\n}\n\n// Used to 'clip' out readOnly ranges when making a change.\nfunction removeReadOnlyRanges(doc, from, to) {\n var markers = null;\n doc.iter(from.line, to.line + 1, function (line) {\n if (line.markedSpans) { for (var i = 0; i < line.markedSpans.length; ++i) {\n var mark = line.markedSpans[i].marker;\n if (mark.readOnly && (!markers || indexOf(markers, mark) == -1))\n { (markers || (markers = [])).push(mark); }\n } }\n });\n if (!markers) { return null }\n var parts = [{from: from, to: to}];\n for (var i = 0; i < markers.length; ++i) {\n var mk = markers[i], m = mk.find(0);\n for (var j = 0; j < parts.length; ++j) {\n var p = parts[j];\n if (cmp(p.to, m.from) < 0 || cmp(p.from, m.to) > 0) { continue }\n var newParts = [j, 1], dfrom = cmp(p.from, m.from), dto = cmp(p.to, m.to);\n if (dfrom < 0 || !mk.inclusiveLeft && !dfrom)\n { newParts.push({from: p.from, to: m.from}); }\n if (dto > 0 || !mk.inclusiveRight && !dto)\n { newParts.push({from: m.to, to: p.to}); }\n parts.splice.apply(parts, newParts);\n j += newParts.length - 3;\n }\n }\n return parts\n}\n\n// Connect or disconnect spans from a line.\nfunction detachMarkedSpans(line) {\n var spans = line.markedSpans;\n if (!spans) { return }\n for (var i = 0; i < spans.length; ++i)\n { spans[i].marker.detachLine(line); }\n line.markedSpans = null;\n}\nfunction attachMarkedSpans(line, spans) {\n if (!spans) { return }\n for (var i = 0; i < spans.length; ++i)\n { spans[i].marker.attachLine(line); }\n line.markedSpans = spans;\n}\n\n// Helpers used when computing which overlapping collapsed span\n// counts as the larger one.\nfunction extraLeft(marker) { return marker.inclusiveLeft ? -1 : 0 }\nfunction extraRight(marker) { return marker.inclusiveRight ? 1 : 0 }\n\n// Returns a number indicating which of two overlapping collapsed\n// spans is larger (and thus includes the other). Falls back to\n// comparing ids when the spans cover exactly the same range.\nfunction compareCollapsedMarkers(a, b) {\n var lenDiff = a.lines.length - b.lines.length;\n if (lenDiff != 0) { return lenDiff }\n var aPos = a.find(), bPos = b.find();\n var fromCmp = cmp(aPos.from, bPos.from) || extraLeft(a) - extraLeft(b);\n if (fromCmp) { return -fromCmp }\n var toCmp = cmp(aPos.to, bPos.to) || extraRight(a) - extraRight(b);\n if (toCmp) { return toCmp }\n return b.id - a.id\n}\n\n// Find out whether a line ends or starts in a collapsed span. If\n// so, return the marker for that span.\nfunction collapsedSpanAtSide(line, start) {\n var sps = sawCollapsedSpans && line.markedSpans, found;\n if (sps) { for (var sp = (void 0), i = 0; i < sps.length; ++i) {\n sp = sps[i];\n if (sp.marker.collapsed && (start ? sp.from : sp.to) == null &&\n (!found || compareCollapsedMarkers(found, sp.marker) < 0))\n { found = sp.marker; }\n } }\n return found\n}\nfunction collapsedSpanAtStart(line) { return collapsedSpanAtSide(line, true) }\nfunction collapsedSpanAtEnd(line) { return collapsedSpanAtSide(line, false) }\n\n// Test whether there exists a collapsed span that partially\n// overlaps (covers the start or end, but not both) of a new span.\n// Such overlap is not allowed.\nfunction conflictingCollapsedRange(doc, lineNo$$1, from, to, marker) {\n var line = getLine(doc, lineNo$$1);\n var sps = sawCollapsedSpans && line.markedSpans;\n if (sps) { for (var i = 0; i < sps.length; ++i) {\n var sp = sps[i];\n if (!sp.marker.collapsed) { continue }\n var found = sp.marker.find(0);\n var fromCmp = cmp(found.from, from) || extraLeft(sp.marker) - extraLeft(marker);\n var toCmp = cmp(found.to, to) || extraRight(sp.marker) - extraRight(marker);\n if (fromCmp >= 0 && toCmp <= 0 || fromCmp <= 0 && toCmp >= 0) { continue }\n if (fromCmp <= 0 && (sp.marker.inclusiveRight && marker.inclusiveLeft ? cmp(found.to, from) >= 0 : cmp(found.to, from) > 0) ||\n fromCmp >= 0 && (sp.marker.inclusiveRight && marker.inclusiveLeft ? cmp(found.from, to) <= 0 : cmp(found.from, to) < 0))\n { return true }\n } }\n}\n\n// A visual line is a line as drawn on the screen. Folding, for\n// example, can cause multiple logical lines to appear on the same\n// visual line. This finds the start of the visual line that the\n// given line is part of (usually that is the line itself).\nfunction visualLine(line) {\n var merged;\n while (merged = collapsedSpanAtStart(line))\n { line = merged.find(-1, true).line; }\n return line\n}\n\nfunction visualLineEnd(line) {\n var merged;\n while (merged = collapsedSpanAtEnd(line))\n { line = merged.find(1, true).line; }\n return line\n}\n\n// Returns an array of logical lines that continue the visual line\n// started by the argument, or undefined if there are no such lines.\nfunction visualLineContinued(line) {\n var merged, lines;\n while (merged = collapsedSpanAtEnd(line)) {\n line = merged.find(1, true).line\n ;(lines || (lines = [])).push(line);\n }\n return lines\n}\n\n// Get the line number of the start of the visual line that the\n// given line number is part of.\nfunction visualLineNo(doc, lineN) {\n var line = getLine(doc, lineN), vis = visualLine(line);\n if (line == vis) { return lineN }\n return lineNo(vis)\n}\n\n// Get the line number of the start of the next visual line after\n// the given line.\nfunction visualLineEndNo(doc, lineN) {\n if (lineN > doc.lastLine()) { return lineN }\n var line = getLine(doc, lineN), merged;\n if (!lineIsHidden(doc, line)) { return lineN }\n while (merged = collapsedSpanAtEnd(line))\n { line = merged.find(1, true).line; }\n return lineNo(line) + 1\n}\n\n// Compute whether a line is hidden. Lines count as hidden when they\n// are part of a visual line that starts with another line, or when\n// they are entirely covered by collapsed, non-widget span.\nfunction lineIsHidden(doc, line) {\n var sps = sawCollapsedSpans && line.markedSpans;\n if (sps) { for (var sp = (void 0), i = 0; i < sps.length; ++i) {\n sp = sps[i];\n if (!sp.marker.collapsed) { continue }\n if (sp.from == null) { return true }\n if (sp.marker.widgetNode) { continue }\n if (sp.from == 0 && sp.marker.inclusiveLeft && lineIsHiddenInner(doc, line, sp))\n { return true }\n } }\n}\nfunction lineIsHiddenInner(doc, line, span) {\n if (span.to == null) {\n var end = span.marker.find(1, true);\n return lineIsHiddenInner(doc, end.line, getMarkedSpanFor(end.line.markedSpans, span.marker))\n }\n if (span.marker.inclusiveRight && span.to == line.text.length)\n { return true }\n for (var sp = (void 0), i = 0; i < line.markedSpans.length; ++i) {\n sp = line.markedSpans[i];\n if (sp.marker.collapsed && !sp.marker.widgetNode && sp.from == span.to &&\n (sp.to == null || sp.to != span.from) &&\n (sp.marker.inclusiveLeft || span.marker.inclusiveRight) &&\n lineIsHiddenInner(doc, line, sp)) { return true }\n }\n}\n\n// Find the height above the given line.\nfunction heightAtLine(lineObj) {\n lineObj = visualLine(lineObj);\n\n var h = 0, chunk = lineObj.parent;\n for (var i = 0; i < chunk.lines.length; ++i) {\n var line = chunk.lines[i];\n if (line == lineObj) { break }\n else { h += line.height; }\n }\n for (var p = chunk.parent; p; chunk = p, p = chunk.parent) {\n for (var i$1 = 0; i$1 < p.children.length; ++i$1) {\n var cur = p.children[i$1];\n if (cur == chunk) { break }\n else { h += cur.height; }\n }\n }\n return h\n}\n\n// Compute the character length of a line, taking into account\n// collapsed ranges (see markText) that might hide parts, and join\n// other lines onto it.\nfunction lineLength(line) {\n if (line.height == 0) { return 0 }\n var len = line.text.length, merged, cur = line;\n while (merged = collapsedSpanAtStart(cur)) {\n var found = merged.find(0, true);\n cur = found.from.line;\n len += found.from.ch - found.to.ch;\n }\n cur = line;\n while (merged = collapsedSpanAtEnd(cur)) {\n var found$1 = merged.find(0, true);\n len -= cur.text.length - found$1.from.ch;\n cur = found$1.to.line;\n len += cur.text.length - found$1.to.ch;\n }\n return len\n}\n\n// Find the longest line in the document.\nfunction findMaxLine(cm) {\n var d = cm.display, doc = cm.doc;\n d.maxLine = getLine(doc, doc.first);\n d.maxLineLength = lineLength(d.maxLine);\n d.maxLineChanged = true;\n doc.iter(function (line) {\n var len = lineLength(line);\n if (len > d.maxLineLength) {\n d.maxLineLength = len;\n d.maxLine = line;\n }\n });\n}\n\n// BIDI HELPERS\n\nfunction iterateBidiSections(order, from, to, f) {\n if (!order) { return f(from, to, \"ltr\", 0) }\n var found = false;\n for (var i = 0; i < order.length; ++i) {\n var part = order[i];\n if (part.from < to && part.to > from || from == to && part.to == from) {\n f(Math.max(part.from, from), Math.min(part.to, to), part.level == 1 ? \"rtl\" : \"ltr\", i);\n found = true;\n }\n }\n if (!found) { f(from, to, \"ltr\"); }\n}\n\nvar bidiOther = null;\nfunction getBidiPartAt(order, ch, sticky) {\n var found;\n bidiOther = null;\n for (var i = 0; i < order.length; ++i) {\n var cur = order[i];\n if (cur.from < ch && cur.to > ch) { return i }\n if (cur.to == ch) {\n if (cur.from != cur.to && sticky == \"before\") { found = i; }\n else { bidiOther = i; }\n }\n if (cur.from == ch) {\n if (cur.from != cur.to && sticky != \"before\") { found = i; }\n else { bidiOther = i; }\n }\n }\n return found != null ? found : bidiOther\n}\n\n// Bidirectional ordering algorithm\n// See http://unicode.org/reports/tr9/tr9-13.html for the algorithm\n// that this (partially) implements.\n\n// One-char codes used for character types:\n// L (L): Left-to-Right\n// R (R): Right-to-Left\n// r (AL): Right-to-Left Arabic\n// 1 (EN): European Number\n// + (ES): European Number Separator\n// % (ET): European Number Terminator\n// n (AN): Arabic Number\n// , (CS): Common Number Separator\n// m (NSM): Non-Spacing Mark\n// b (BN): Boundary Neutral\n// s (B): Paragraph Separator\n// t (S): Segment Separator\n// w (WS): Whitespace\n// N (ON): Other Neutrals\n\n// Returns null if characters are ordered as they appear\n// (left-to-right), or an array of sections ({from, to, level}\n// objects) in the order in which they occur visually.\nvar bidiOrdering = (function() {\n // Character types for codepoints 0 to 0xff\n var lowTypes = \"bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN\";\n // Character types for codepoints 0x600 to 0x6f9\n var arabicTypes = \"nnnnnnNNr%%r,rNNmmmmmmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmmmnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmnNmmmmmmrrmmNmmmmrr1111111111\";\n function charType(code) {\n if (code <= 0xf7) { return lowTypes.charAt(code) }\n else if (0x590 <= code && code <= 0x5f4) { return \"R\" }\n else if (0x600 <= code && code <= 0x6f9) { return arabicTypes.charAt(code - 0x600) }\n else if (0x6ee <= code && code <= 0x8ac) { return \"r\" }\n else if (0x2000 <= code && code <= 0x200b) { return \"w\" }\n else if (code == 0x200c) { return \"b\" }\n else { return \"L\" }\n }\n\n var bidiRE = /[\\u0590-\\u05f4\\u0600-\\u06ff\\u0700-\\u08ac]/;\n var isNeutral = /[stwN]/, isStrong = /[LRr]/, countsAsLeft = /[Lb1n]/, countsAsNum = /[1n]/;\n\n function BidiSpan(level, from, to) {\n this.level = level;\n this.from = from; this.to = to;\n }\n\n return function(str, direction) {\n var outerType = direction == \"ltr\" ? \"L\" : \"R\";\n\n if (str.length == 0 || direction == \"ltr\" && !bidiRE.test(str)) { return false }\n var len = str.length, types = [];\n for (var i = 0; i < len; ++i)\n { types.push(charType(str.charCodeAt(i))); }\n\n // W1. Examine each non-spacing mark (NSM) in the level run, and\n // change the type of the NSM to the type of the previous\n // character. If the NSM is at the start of the level run, it will\n // get the type of sor.\n for (var i$1 = 0, prev = outerType; i$1 < len; ++i$1) {\n var type = types[i$1];\n if (type == \"m\") { types[i$1] = prev; }\n else { prev = type; }\n }\n\n // W2. Search backwards from each instance of a European number\n // until the first strong type (R, L, AL, or sor) is found. If an\n // AL is found, change the type of the European number to Arabic\n // number.\n // W3. Change all ALs to R.\n for (var i$2 = 0, cur = outerType; i$2 < len; ++i$2) {\n var type$1 = types[i$2];\n if (type$1 == \"1\" && cur == \"r\") { types[i$2] = \"n\"; }\n else if (isStrong.test(type$1)) { cur = type$1; if (type$1 == \"r\") { types[i$2] = \"R\"; } }\n }\n\n // W4. A single European separator between two European numbers\n // changes to a European number. A single common separator between\n // two numbers of the same type changes to that type.\n for (var i$3 = 1, prev$1 = types[0]; i$3 < len - 1; ++i$3) {\n var type$2 = types[i$3];\n if (type$2 == \"+\" && prev$1 == \"1\" && types[i$3+1] == \"1\") { types[i$3] = \"1\"; }\n else if (type$2 == \",\" && prev$1 == types[i$3+1] &&\n (prev$1 == \"1\" || prev$1 == \"n\")) { types[i$3] = prev$1; }\n prev$1 = type$2;\n }\n\n // W5. A sequence of European terminators adjacent to European\n // numbers changes to all European numbers.\n // W6. Otherwise, separators and terminators change to Other\n // Neutral.\n for (var i$4 = 0; i$4 < len; ++i$4) {\n var type$3 = types[i$4];\n if (type$3 == \",\") { types[i$4] = \"N\"; }\n else if (type$3 == \"%\") {\n var end = (void 0);\n for (end = i$4 + 1; end < len && types[end] == \"%\"; ++end) {}\n var replace = (i$4 && types[i$4-1] == \"!\") || (end < len && types[end] == \"1\") ? \"1\" : \"N\";\n for (var j = i$4; j < end; ++j) { types[j] = replace; }\n i$4 = end - 1;\n }\n }\n\n // W7. Search backwards from each instance of a European number\n // until the first strong type (R, L, or sor) is found. If an L is\n // found, then change the type of the European number to L.\n for (var i$5 = 0, cur$1 = outerType; i$5 < len; ++i$5) {\n var type$4 = types[i$5];\n if (cur$1 == \"L\" && type$4 == \"1\") { types[i$5] = \"L\"; }\n else if (isStrong.test(type$4)) { cur$1 = type$4; }\n }\n\n // N1. A sequence of neutrals takes the direction of the\n // surrounding strong text if the text on both sides has the same\n // direction. European and Arabic numbers act as if they were R in\n // terms of their influence on neutrals. Start-of-level-run (sor)\n // and end-of-level-run (eor) are used at level run boundaries.\n // N2. Any remaining neutrals take the embedding direction.\n for (var i$6 = 0; i$6 < len; ++i$6) {\n if (isNeutral.test(types[i$6])) {\n var end$1 = (void 0);\n for (end$1 = i$6 + 1; end$1 < len && isNeutral.test(types[end$1]); ++end$1) {}\n var before = (i$6 ? types[i$6-1] : outerType) == \"L\";\n var after = (end$1 < len ? types[end$1] : outerType) == \"L\";\n var replace$1 = before == after ? (before ? \"L\" : \"R\") : outerType;\n for (var j$1 = i$6; j$1 < end$1; ++j$1) { types[j$1] = replace$1; }\n i$6 = end$1 - 1;\n }\n }\n\n // Here we depart from the documented algorithm, in order to avoid\n // building up an actual levels array. Since there are only three\n // levels (0, 1, 2) in an implementation that doesn't take\n // explicit embedding into account, we can build up the order on\n // the fly, without following the level-based algorithm.\n var order = [], m;\n for (var i$7 = 0; i$7 < len;) {\n if (countsAsLeft.test(types[i$7])) {\n var start = i$7;\n for (++i$7; i$7 < len && countsAsLeft.test(types[i$7]); ++i$7) {}\n order.push(new BidiSpan(0, start, i$7));\n } else {\n var pos = i$7, at = order.length;\n for (++i$7; i$7 < len && types[i$7] != \"L\"; ++i$7) {}\n for (var j$2 = pos; j$2 < i$7;) {\n if (countsAsNum.test(types[j$2])) {\n if (pos < j$2) { order.splice(at, 0, new BidiSpan(1, pos, j$2)); }\n var nstart = j$2;\n for (++j$2; j$2 < i$7 && countsAsNum.test(types[j$2]); ++j$2) {}\n order.splice(at, 0, new BidiSpan(2, nstart, j$2));\n pos = j$2;\n } else { ++j$2; }\n }\n if (pos < i$7) { order.splice(at, 0, new BidiSpan(1, pos, i$7)); }\n }\n }\n if (direction == \"ltr\") {\n if (order[0].level == 1 && (m = str.match(/^\\s+/))) {\n order[0].from = m[0].length;\n order.unshift(new BidiSpan(0, 0, m[0].length));\n }\n if (lst(order).level == 1 && (m = str.match(/\\s+$/))) {\n lst(order).to -= m[0].length;\n order.push(new BidiSpan(0, len - m[0].length, len));\n }\n }\n\n return direction == \"rtl\" ? order.reverse() : order\n }\n})();\n\n// Get the bidi ordering for the given line (and cache it). Returns\n// false for lines that are fully left-to-right, and an array of\n// BidiSpan objects otherwise.\nfunction getOrder(line, direction) {\n var order = line.order;\n if (order == null) { order = line.order = bidiOrdering(line.text, direction); }\n return order\n}\n\n// EVENT HANDLING\n\n// Lightweight event framework. on/off also work on DOM nodes,\n// registering native DOM handlers.\n\nvar noHandlers = [];\n\nvar on = function(emitter, type, f) {\n if (emitter.addEventListener) {\n emitter.addEventListener(type, f, false);\n } else if (emitter.attachEvent) {\n emitter.attachEvent(\"on\" + type, f);\n } else {\n var map$$1 = emitter._handlers || (emitter._handlers = {});\n map$$1[type] = (map$$1[type] || noHandlers).concat(f);\n }\n};\n\nfunction getHandlers(emitter, type) {\n return emitter._handlers && emitter._handlers[type] || noHandlers\n}\n\nfunction off(emitter, type, f) {\n if (emitter.removeEventListener) {\n emitter.removeEventListener(type, f, false);\n } else if (emitter.detachEvent) {\n emitter.detachEvent(\"on\" + type, f);\n } else {\n var map$$1 = emitter._handlers, arr = map$$1 && map$$1[type];\n if (arr) {\n var index = indexOf(arr, f);\n if (index > -1)\n { map$$1[type] = arr.slice(0, index).concat(arr.slice(index + 1)); }\n }\n }\n}\n\nfunction signal(emitter, type /*, values...*/) {\n var handlers = getHandlers(emitter, type);\n if (!handlers.length) { return }\n var args = Array.prototype.slice.call(arguments, 2);\n for (var i = 0; i < handlers.length; ++i) { handlers[i].apply(null, args); }\n}\n\n// The DOM events that CodeMirror handles can be overridden by\n// registering a (non-DOM) handler on the editor for the event name,\n// and preventDefault-ing the event in that handler.\nfunction signalDOMEvent(cm, e, override) {\n if (typeof e == \"string\")\n { e = {type: e, preventDefault: function() { this.defaultPrevented = true; }}; }\n signal(cm, override || e.type, cm, e);\n return e_defaultPrevented(e) || e.codemirrorIgnore\n}\n\nfunction signalCursorActivity(cm) {\n var arr = cm._handlers && cm._handlers.cursorActivity;\n if (!arr) { return }\n var set = cm.curOp.cursorActivityHandlers || (cm.curOp.cursorActivityHandlers = []);\n for (var i = 0; i < arr.length; ++i) { if (indexOf(set, arr[i]) == -1)\n { set.push(arr[i]); } }\n}\n\nfunction hasHandler(emitter, type) {\n return getHandlers(emitter, type).length > 0\n}\n\n// Add on and off methods to a constructor's prototype, to make\n// registering events on such objects more convenient.\nfunction eventMixin(ctor) {\n ctor.prototype.on = function(type, f) {on(this, type, f);};\n ctor.prototype.off = function(type, f) {off(this, type, f);};\n}\n\n// Due to the fact that we still support jurassic IE versions, some\n// compatibility wrappers are needed.\n\nfunction e_preventDefault(e) {\n if (e.preventDefault) { e.preventDefault(); }\n else { e.returnValue = false; }\n}\nfunction e_stopPropagation(e) {\n if (e.stopPropagation) { e.stopPropagation(); }\n else { e.cancelBubble = true; }\n}\nfunction e_defaultPrevented(e) {\n return e.defaultPrevented != null ? e.defaultPrevented : e.returnValue == false\n}\nfunction e_stop(e) {e_preventDefault(e); e_stopPropagation(e);}\n\nfunction e_target(e) {return e.target || e.srcElement}\nfunction e_button(e) {\n var b = e.which;\n if (b == null) {\n if (e.button & 1) { b = 1; }\n else if (e.button & 2) { b = 3; }\n else if (e.button & 4) { b = 2; }\n }\n if (mac && e.ctrlKey && b == 1) { b = 3; }\n return b\n}\n\n// Detect drag-and-drop\nvar dragAndDrop = function() {\n // There is *some* kind of drag-and-drop support in IE6-8, but I\n // couldn't get it to work yet.\n if (ie && ie_version < 9) { return false }\n var div = elt('div');\n return \"draggable\" in div || \"dragDrop\" in div\n}();\n\nvar zwspSupported;\nfunction zeroWidthElement(measure) {\n if (zwspSupported == null) {\n var test = elt(\"span\", \"\\u200b\");\n removeChildrenAndAdd(measure, elt(\"span\", [test, document.createTextNode(\"x\")]));\n if (measure.firstChild.offsetHeight != 0)\n { zwspSupported = test.offsetWidth <= 1 && test.offsetHeight > 2 && !(ie && ie_version < 8); }\n }\n var node = zwspSupported ? elt(\"span\", \"\\u200b\") :\n elt(\"span\", \"\\u00a0\", null, \"display: inline-block; width: 1px; margin-right: -1px\");\n node.setAttribute(\"cm-text\", \"\");\n return node\n}\n\n// Feature-detect IE's crummy client rect reporting for bidi text\nvar badBidiRects;\nfunction hasBadBidiRects(measure) {\n if (badBidiRects != null) { return badBidiRects }\n var txt = removeChildrenAndAdd(measure, document.createTextNode(\"A\\u062eA\"));\n var r0 = range(txt, 0, 1).getBoundingClientRect();\n var r1 = range(txt, 1, 2).getBoundingClientRect();\n removeChildren(measure);\n if (!r0 || r0.left == r0.right) { return false } // Safari returns null in some cases (#2780)\n return badBidiRects = (r1.right - r0.right < 3)\n}\n\n// See if \"\".split is the broken IE version, if so, provide an\n// alternative way to split lines.\nvar splitLinesAuto = \"\\n\\nb\".split(/\\n/).length != 3 ? function (string) {\n var pos = 0, result = [], l = string.length;\n while (pos <= l) {\n var nl = string.indexOf(\"\\n\", pos);\n if (nl == -1) { nl = string.length; }\n var line = string.slice(pos, string.charAt(nl - 1) == \"\\r\" ? nl - 1 : nl);\n var rt = line.indexOf(\"\\r\");\n if (rt != -1) {\n result.push(line.slice(0, rt));\n pos += rt + 1;\n } else {\n result.push(line);\n pos = nl + 1;\n }\n }\n return result\n} : function (string) { return string.split(/\\r\\n?|\\n/); };\n\nvar hasSelection = window.getSelection ? function (te) {\n try { return te.selectionStart != te.selectionEnd }\n catch(e) { return false }\n} : function (te) {\n var range$$1;\n try {range$$1 = te.ownerDocument.selection.createRange();}\n catch(e) {}\n if (!range$$1 || range$$1.parentElement() != te) { return false }\n return range$$1.compareEndPoints(\"StartToEnd\", range$$1) != 0\n};\n\nvar hasCopyEvent = (function () {\n var e = elt(\"div\");\n if (\"oncopy\" in e) { return true }\n e.setAttribute(\"oncopy\", \"return;\");\n return typeof e.oncopy == \"function\"\n})();\n\nvar badZoomedRects = null;\nfunction hasBadZoomedRects(measure) {\n if (badZoomedRects != null) { return badZoomedRects }\n var node = removeChildrenAndAdd(measure, elt(\"span\", \"x\"));\n var normal = node.getBoundingClientRect();\n var fromRange = range(node, 0, 1).getBoundingClientRect();\n return badZoomedRects = Math.abs(normal.left - fromRange.left) > 1\n}\n\n// Known modes, by name and by MIME\nvar modes = {};\nvar mimeModes = {};\n\n// Extra arguments are stored as the mode's dependencies, which is\n// used by (legacy) mechanisms like loadmode.js to automatically\n// load a mode. (Preferred mechanism is the require/define calls.)\nfunction defineMode(name, mode) {\n if (arguments.length > 2)\n { mode.dependencies = Array.prototype.slice.call(arguments, 2); }\n modes[name] = mode;\n}\n\nfunction defineMIME(mime, spec) {\n mimeModes[mime] = spec;\n}\n\n// Given a MIME type, a {name, ...options} config object, or a name\n// string, return a mode config object.\nfunction resolveMode(spec) {\n if (typeof spec == \"string\" && mimeModes.hasOwnProperty(spec)) {\n spec = mimeModes[spec];\n } else if (spec && typeof spec.name == \"string\" && mimeModes.hasOwnProperty(spec.name)) {\n var found = mimeModes[spec.name];\n if (typeof found == \"string\") { found = {name: found}; }\n spec = createObj(found, spec);\n spec.name = found.name;\n } else if (typeof spec == \"string\" && /^[\\w\\-]+\\/[\\w\\-]+\\+xml$/.test(spec)) {\n return resolveMode(\"application/xml\")\n } else if (typeof spec == \"string\" && /^[\\w\\-]+\\/[\\w\\-]+\\+json$/.test(spec)) {\n return resolveMode(\"application/json\")\n }\n if (typeof spec == \"string\") { return {name: spec} }\n else { return spec || {name: \"null\"} }\n}\n\n// Given a mode spec (anything that resolveMode accepts), find and\n// initialize an actual mode object.\nfunction getMode(options, spec) {\n spec = resolveMode(spec);\n var mfactory = modes[spec.name];\n if (!mfactory) { return getMode(options, \"text/plain\") }\n var modeObj = mfactory(options, spec);\n if (modeExtensions.hasOwnProperty(spec.name)) {\n var exts = modeExtensions[spec.name];\n for (var prop in exts) {\n if (!exts.hasOwnProperty(prop)) { continue }\n if (modeObj.hasOwnProperty(prop)) { modeObj[\"_\" + prop] = modeObj[prop]; }\n modeObj[prop] = exts[prop];\n }\n }\n modeObj.name = spec.name;\n if (spec.helperType) { modeObj.helperType = spec.helperType; }\n if (spec.modeProps) { for (var prop$1 in spec.modeProps)\n { modeObj[prop$1] = spec.modeProps[prop$1]; } }\n\n return modeObj\n}\n\n// This can be used to attach properties to mode objects from\n// outside the actual mode definition.\nvar modeExtensions = {};\nfunction extendMode(mode, properties) {\n var exts = modeExtensions.hasOwnProperty(mode) ? modeExtensions[mode] : (modeExtensions[mode] = {});\n copyObj(properties, exts);\n}\n\nfunction copyState(mode, state) {\n if (state === true) { return state }\n if (mode.copyState) { return mode.copyState(state) }\n var nstate = {};\n for (var n in state) {\n var val = state[n];\n if (val instanceof Array) { val = val.concat([]); }\n nstate[n] = val;\n }\n return nstate\n}\n\n// Given a mode and a state (for that mode), find the inner mode and\n// state at the position that the state refers to.\nfunction innerMode(mode, state) {\n var info;\n while (mode.innerMode) {\n info = mode.innerMode(state);\n if (!info || info.mode == mode) { break }\n state = info.state;\n mode = info.mode;\n }\n return info || {mode: mode, state: state}\n}\n\nfunction startState(mode, a1, a2) {\n return mode.startState ? mode.startState(a1, a2) : true\n}\n\n// STRING STREAM\n\n// Fed to the mode parsers, provides helper functions to make\n// parsers more succinct.\n\nvar StringStream = function(string, tabSize, lineOracle) {\n this.pos = this.start = 0;\n this.string = string;\n this.tabSize = tabSize || 8;\n this.lastColumnPos = this.lastColumnValue = 0;\n this.lineStart = 0;\n this.lineOracle = lineOracle;\n};\n\nStringStream.prototype.eol = function () {return this.pos >= this.string.length};\nStringStream.prototype.sol = function () {return this.pos == this.lineStart};\nStringStream.prototype.peek = function () {return this.string.charAt(this.pos) || undefined};\nStringStream.prototype.next = function () {\n if (this.pos < this.string.length)\n { return this.string.charAt(this.pos++) }\n};\nStringStream.prototype.eat = function (match) {\n var ch = this.string.charAt(this.pos);\n var ok;\n if (typeof match == \"string\") { ok = ch == match; }\n else { ok = ch && (match.test ? match.test(ch) : match(ch)); }\n if (ok) {++this.pos; return ch}\n};\nStringStream.prototype.eatWhile = function (match) {\n var start = this.pos;\n while (this.eat(match)){}\n return this.pos > start\n};\nStringStream.prototype.eatSpace = function () {\n var this$1 = this;\n\n var start = this.pos;\n while (/[\\s\\u00a0]/.test(this.string.charAt(this.pos))) { ++this$1.pos; }\n return this.pos > start\n};\nStringStream.prototype.skipToEnd = function () {this.pos = this.string.length;};\nStringStream.prototype.skipTo = function (ch) {\n var found = this.string.indexOf(ch, this.pos);\n if (found > -1) {this.pos = found; return true}\n};\nStringStream.prototype.backUp = function (n) {this.pos -= n;};\nStringStream.prototype.column = function () {\n if (this.lastColumnPos < this.start) {\n this.lastColumnValue = countColumn(this.string, this.start, this.tabSize, this.lastColumnPos, this.lastColumnValue);\n this.lastColumnPos = this.start;\n }\n return this.lastColumnValue - (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0)\n};\nStringStream.prototype.indentation = function () {\n return countColumn(this.string, null, this.tabSize) -\n (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0)\n};\nStringStream.prototype.match = function (pattern, consume, caseInsensitive) {\n if (typeof pattern == \"string\") {\n var cased = function (str) { return caseInsensitive ? str.toLowerCase() : str; };\n var substr = this.string.substr(this.pos, pattern.length);\n if (cased(substr) == cased(pattern)) {\n if (consume !== false) { this.pos += pattern.length; }\n return true\n }\n } else {\n var match = this.string.slice(this.pos).match(pattern);\n if (match && match.index > 0) { return null }\n if (match && consume !== false) { this.pos += match[0].length; }\n return match\n }\n};\nStringStream.prototype.current = function (){return this.string.slice(this.start, this.pos)};\nStringStream.prototype.hideFirstChars = function (n, inner) {\n this.lineStart += n;\n try { return inner() }\n finally { this.lineStart -= n; }\n};\nStringStream.prototype.lookAhead = function (n) {\n var oracle = this.lineOracle;\n return oracle && oracle.lookAhead(n)\n};\nStringStream.prototype.baseToken = function () {\n var oracle = this.lineOracle;\n return oracle && oracle.baseToken(this.pos)\n};\n\nvar SavedContext = function(state, lookAhead) {\n this.state = state;\n this.lookAhead = lookAhead;\n};\n\nvar Context = function(doc, state, line, lookAhead) {\n this.state = state;\n this.doc = doc;\n this.line = line;\n this.maxLookAhead = lookAhead || 0;\n this.baseTokens = null;\n this.baseTokenPos = 1;\n};\n\nContext.prototype.lookAhead = function (n) {\n var line = this.doc.getLine(this.line + n);\n if (line != null && n > this.maxLookAhead) { this.maxLookAhead = n; }\n return line\n};\n\nContext.prototype.baseToken = function (n) {\n var this$1 = this;\n\n if (!this.baseTokens) { return null }\n while (this.baseTokens[this.baseTokenPos] <= n)\n { this$1.baseTokenPos += 2; }\n var type = this.baseTokens[this.baseTokenPos + 1];\n return {type: type && type.replace(/( |^)overlay .*/, \"\"),\n size: this.baseTokens[this.baseTokenPos] - n}\n};\n\nContext.prototype.nextLine = function () {\n this.line++;\n if (this.maxLookAhead > 0) { this.maxLookAhead--; }\n};\n\nContext.fromSaved = function (doc, saved, line) {\n if (saved instanceof SavedContext)\n { return new Context(doc, copyState(doc.mode, saved.state), line, saved.lookAhead) }\n else\n { return new Context(doc, copyState(doc.mode, saved), line) }\n};\n\nContext.prototype.save = function (copy) {\n var state = copy !== false ? copyState(this.doc.mode, this.state) : this.state;\n return this.maxLookAhead > 0 ? new SavedContext(state, this.maxLookAhead) : state\n};\n\n\n// Compute a style array (an array starting with a mode generation\n// -- for invalidation -- followed by pairs of end positions and\n// style strings), which is used to highlight the tokens on the\n// line.\nfunction highlightLine(cm, line, context, forceToEnd) {\n // A styles array always starts with a number identifying the\n // mode/overlays that it is based on (for easy invalidation).\n var st = [cm.state.modeGen], lineClasses = {};\n // Compute the base array of styles\n runMode(cm, line.text, cm.doc.mode, context, function (end, style) { return st.push(end, style); },\n lineClasses, forceToEnd);\n var state = context.state;\n\n // Run overlays, adjust style array.\n var loop = function ( o ) {\n context.baseTokens = st;\n var overlay = cm.state.overlays[o], i = 1, at = 0;\n context.state = true;\n runMode(cm, line.text, overlay.mode, context, function (end, style) {\n var start = i;\n // Ensure there's a token end at the current position, and that i points at it\n while (at < end) {\n var i_end = st[i];\n if (i_end > end)\n { st.splice(i, 1, end, st[i+1], i_end); }\n i += 2;\n at = Math.min(end, i_end);\n }\n if (!style) { return }\n if (overlay.opaque) {\n st.splice(start, i - start, end, \"overlay \" + style);\n i = start + 2;\n } else {\n for (; start < i; start += 2) {\n var cur = st[start+1];\n st[start+1] = (cur ? cur + \" \" : \"\") + \"overlay \" + style;\n }\n }\n }, lineClasses);\n context.state = state;\n context.baseTokens = null;\n context.baseTokenPos = 1;\n };\n\n for (var o = 0; o < cm.state.overlays.length; ++o) loop( o );\n\n return {styles: st, classes: lineClasses.bgClass || lineClasses.textClass ? lineClasses : null}\n}\n\nfunction getLineStyles(cm, line, updateFrontier) {\n if (!line.styles || line.styles[0] != cm.state.modeGen) {\n var context = getContextBefore(cm, lineNo(line));\n var resetState = line.text.length > cm.options.maxHighlightLength && copyState(cm.doc.mode, context.state);\n var result = highlightLine(cm, line, context);\n if (resetState) { context.state = resetState; }\n line.stateAfter = context.save(!resetState);\n line.styles = result.styles;\n if (result.classes) { line.styleClasses = result.classes; }\n else if (line.styleClasses) { line.styleClasses = null; }\n if (updateFrontier === cm.doc.highlightFrontier)\n { cm.doc.modeFrontier = Math.max(cm.doc.modeFrontier, ++cm.doc.highlightFrontier); }\n }\n return line.styles\n}\n\nfunction getContextBefore(cm, n, precise) {\n var doc = cm.doc, display = cm.display;\n if (!doc.mode.startState) { return new Context(doc, true, n) }\n var start = findStartLine(cm, n, precise);\n var saved = start > doc.first && getLine(doc, start - 1).stateAfter;\n var context = saved ? Context.fromSaved(doc, saved, start) : new Context(doc, startState(doc.mode), start);\n\n doc.iter(start, n, function (line) {\n processLine(cm, line.text, context);\n var pos = context.line;\n line.stateAfter = pos == n - 1 || pos % 5 == 0 || pos >= display.viewFrom && pos < display.viewTo ? context.save() : null;\n context.nextLine();\n });\n if (precise) { doc.modeFrontier = context.line; }\n return context\n}\n\n// Lightweight form of highlight -- proceed over this line and\n// update state, but don't save a style array. Used for lines that\n// aren't currently visible.\nfunction processLine(cm, text, context, startAt) {\n var mode = cm.doc.mode;\n var stream = new StringStream(text, cm.options.tabSize, context);\n stream.start = stream.pos = startAt || 0;\n if (text == \"\") { callBlankLine(mode, context.state); }\n while (!stream.eol()) {\n readToken(mode, stream, context.state);\n stream.start = stream.pos;\n }\n}\n\nfunction callBlankLine(mode, state) {\n if (mode.blankLine) { return mode.blankLine(state) }\n if (!mode.innerMode) { return }\n var inner = innerMode(mode, state);\n if (inner.mode.blankLine) { return inner.mode.blankLine(inner.state) }\n}\n\nfunction readToken(mode, stream, state, inner) {\n for (var i = 0; i < 10; i++) {\n if (inner) { inner[0] = innerMode(mode, state).mode; }\n var style = mode.token(stream, state);\n if (stream.pos > stream.start) { return style }\n }\n throw new Error(\"Mode \" + mode.name + \" failed to advance stream.\")\n}\n\nvar Token = function(stream, type, state) {\n this.start = stream.start; this.end = stream.pos;\n this.string = stream.current();\n this.type = type || null;\n this.state = state;\n};\n\n// Utility for getTokenAt and getLineTokens\nfunction takeToken(cm, pos, precise, asArray) {\n var doc = cm.doc, mode = doc.mode, style;\n pos = clipPos(doc, pos);\n var line = getLine(doc, pos.line), context = getContextBefore(cm, pos.line, precise);\n var stream = new StringStream(line.text, cm.options.tabSize, context), tokens;\n if (asArray) { tokens = []; }\n while ((asArray || stream.pos < pos.ch) && !stream.eol()) {\n stream.start = stream.pos;\n style = readToken(mode, stream, context.state);\n if (asArray) { tokens.push(new Token(stream, style, copyState(doc.mode, context.state))); }\n }\n return asArray ? tokens : new Token(stream, style, context.state)\n}\n\nfunction extractLineClasses(type, output) {\n if (type) { for (;;) {\n var lineClass = type.match(/(?:^|\\s+)line-(background-)?(\\S+)/);\n if (!lineClass) { break }\n type = type.slice(0, lineClass.index) + type.slice(lineClass.index + lineClass[0].length);\n var prop = lineClass[1] ? \"bgClass\" : \"textClass\";\n if (output[prop] == null)\n { output[prop] = lineClass[2]; }\n else if (!(new RegExp(\"(?:^|\\s)\" + lineClass[2] + \"(?:$|\\s)\")).test(output[prop]))\n { output[prop] += \" \" + lineClass[2]; }\n } }\n return type\n}\n\n// Run the given mode's parser over a line, calling f for each token.\nfunction runMode(cm, text, mode, context, f, lineClasses, forceToEnd) {\n var flattenSpans = mode.flattenSpans;\n if (flattenSpans == null) { flattenSpans = cm.options.flattenSpans; }\n var curStart = 0, curStyle = null;\n var stream = new StringStream(text, cm.options.tabSize, context), style;\n var inner = cm.options.addModeClass && [null];\n if (text == \"\") { extractLineClasses(callBlankLine(mode, context.state), lineClasses); }\n while (!stream.eol()) {\n if (stream.pos > cm.options.maxHighlightLength) {\n flattenSpans = false;\n if (forceToEnd) { processLine(cm, text, context, stream.pos); }\n stream.pos = text.length;\n style = null;\n } else {\n style = extractLineClasses(readToken(mode, stream, context.state, inner), lineClasses);\n }\n if (inner) {\n var mName = inner[0].name;\n if (mName) { style = \"m-\" + (style ? mName + \" \" + style : mName); }\n }\n if (!flattenSpans || curStyle != style) {\n while (curStart < stream.start) {\n curStart = Math.min(stream.start, curStart + 5000);\n f(curStart, curStyle);\n }\n curStyle = style;\n }\n stream.start = stream.pos;\n }\n while (curStart < stream.pos) {\n // Webkit seems to refuse to render text nodes longer than 57444\n // characters, and returns inaccurate measurements in nodes\n // starting around 5000 chars.\n var pos = Math.min(stream.pos, curStart + 5000);\n f(pos, curStyle);\n curStart = pos;\n }\n}\n\n// Finds the line to start with when starting a parse. Tries to\n// find a line with a stateAfter, so that it can start with a\n// valid state. If that fails, it returns the line with the\n// smallest indentation, which tends to need the least context to\n// parse correctly.\nfunction findStartLine(cm, n, precise) {\n var minindent, minline, doc = cm.doc;\n var lim = precise ? -1 : n - (cm.doc.mode.innerMode ? 1000 : 100);\n for (var search = n; search > lim; --search) {\n if (search <= doc.first) { return doc.first }\n var line = getLine(doc, search - 1), after = line.stateAfter;\n if (after && (!precise || search + (after instanceof SavedContext ? after.lookAhead : 0) <= doc.modeFrontier))\n { return search }\n var indented = countColumn(line.text, null, cm.options.tabSize);\n if (minline == null || minindent > indented) {\n minline = search - 1;\n minindent = indented;\n }\n }\n return minline\n}\n\nfunction retreatFrontier(doc, n) {\n doc.modeFrontier = Math.min(doc.modeFrontier, n);\n if (doc.highlightFrontier < n - 10) { return }\n var start = doc.first;\n for (var line = n - 1; line > start; line--) {\n var saved = getLine(doc, line).stateAfter;\n // change is on 3\n // state on line 1 looked ahead 2 -- so saw 3\n // test 1 + 2 < 3 should cover this\n if (saved && (!(saved instanceof SavedContext) || line + saved.lookAhead < n)) {\n start = line + 1;\n break\n }\n }\n doc.highlightFrontier = Math.min(doc.highlightFrontier, start);\n}\n\n// LINE DATA STRUCTURE\n\n// Line objects. These hold state related to a line, including\n// highlighting info (the styles array).\nvar Line = function(text, markedSpans, estimateHeight) {\n this.text = text;\n attachMarkedSpans(this, markedSpans);\n this.height = estimateHeight ? estimateHeight(this) : 1;\n};\n\nLine.prototype.lineNo = function () { return lineNo(this) };\neventMixin(Line);\n\n// Change the content (text, markers) of a line. Automatically\n// invalidates cached information and tries to re-estimate the\n// line's height.\nfunction updateLine(line, text, markedSpans, estimateHeight) {\n line.text = text;\n if (line.stateAfter) { line.stateAfter = null; }\n if (line.styles) { line.styles = null; }\n if (line.order != null) { line.order = null; }\n detachMarkedSpans(line);\n attachMarkedSpans(line, markedSpans);\n var estHeight = estimateHeight ? estimateHeight(line) : 1;\n if (estHeight != line.height) { updateLineHeight(line, estHeight); }\n}\n\n// Detach a line from the document tree and its markers.\nfunction cleanUpLine(line) {\n line.parent = null;\n detachMarkedSpans(line);\n}\n\n// Convert a style as returned by a mode (either null, or a string\n// containing one or more styles) to a CSS style. This is cached,\n// and also looks for line-wide styles.\nvar styleToClassCache = {};\nvar styleToClassCacheWithMode = {};\nfunction interpretTokenStyle(style, options) {\n if (!style || /^\\s*$/.test(style)) { return null }\n var cache = options.addModeClass ? styleToClassCacheWithMode : styleToClassCache;\n return cache[style] ||\n (cache[style] = style.replace(/\\S+/g, \"cm-$&\"))\n}\n\n// Render the DOM representation of the text of a line. Also builds\n// up a 'line map', which points at the DOM nodes that represent\n// specific stretches of text, and is used by the measuring code.\n// The returned object contains the DOM node, this map, and\n// information about line-wide styles that were set by the mode.\nfunction buildLineContent(cm, lineView) {\n // The padding-right forces the element to have a 'border', which\n // is needed on Webkit to be able to get line-level bounding\n // rectangles for it (in measureChar).\n var content = eltP(\"span\", null, null, webkit ? \"padding-right: .1px\" : null);\n var builder = {pre: eltP(\"pre\", [content], \"CodeMirror-line\"), content: content,\n col: 0, pos: 0, cm: cm,\n trailingSpace: false,\n splitSpaces: (ie || webkit) && cm.getOption(\"lineWrapping\")};\n lineView.measure = {};\n\n // Iterate over the logical lines that make up this visual line.\n for (var i = 0; i <= (lineView.rest ? lineView.rest.length : 0); i++) {\n var line = i ? lineView.rest[i - 1] : lineView.line, order = (void 0);\n builder.pos = 0;\n builder.addToken = buildToken;\n // Optionally wire in some hacks into the token-rendering\n // algorithm, to deal with browser quirks.\n if (hasBadBidiRects(cm.display.measure) && (order = getOrder(line, cm.doc.direction)))\n { builder.addToken = buildTokenBadBidi(builder.addToken, order); }\n builder.map = [];\n var allowFrontierUpdate = lineView != cm.display.externalMeasured && lineNo(line);\n insertLineContent(line, builder, getLineStyles(cm, line, allowFrontierUpdate));\n if (line.styleClasses) {\n if (line.styleClasses.bgClass)\n { builder.bgClass = joinClasses(line.styleClasses.bgClass, builder.bgClass || \"\"); }\n if (line.styleClasses.textClass)\n { builder.textClass = joinClasses(line.styleClasses.textClass, builder.textClass || \"\"); }\n }\n\n // Ensure at least a single node is present, for measuring.\n if (builder.map.length == 0)\n { builder.map.push(0, 0, builder.content.appendChild(zeroWidthElement(cm.display.measure))); }\n\n // Store the map and a cache object for the current logical line\n if (i == 0) {\n lineView.measure.map = builder.map;\n lineView.measure.cache = {};\n } else {\n (lineView.measure.maps || (lineView.measure.maps = [])).push(builder.map)\n ;(lineView.measure.caches || (lineView.measure.caches = [])).push({});\n }\n }\n\n // See issue #2901\n if (webkit) {\n var last = builder.content.lastChild;\n if (/\\bcm-tab\\b/.test(last.className) || (last.querySelector && last.querySelector(\".cm-tab\")))\n { builder.content.className = \"cm-tab-wrap-hack\"; }\n }\n\n signal(cm, \"renderLine\", cm, lineView.line, builder.pre);\n if (builder.pre.className)\n { builder.textClass = joinClasses(builder.pre.className, builder.textClass || \"\"); }\n\n return builder\n}\n\nfunction defaultSpecialCharPlaceholder(ch) {\n var token = elt(\"span\", \"\\u2022\", \"cm-invalidchar\");\n token.title = \"\\\\u\" + ch.charCodeAt(0).toString(16);\n token.setAttribute(\"aria-label\", token.title);\n return token\n}\n\n// Build up the DOM representation for a single token, and add it to\n// the line map. Takes care to render special characters separately.\nfunction buildToken(builder, text, style, startStyle, endStyle, title, css) {\n if (!text) { return }\n var displayText = builder.splitSpaces ? splitSpaces(text, builder.trailingSpace) : text;\n var special = builder.cm.state.specialChars, mustWrap = false;\n var content;\n if (!special.test(text)) {\n builder.col += text.length;\n content = document.createTextNode(displayText);\n builder.map.push(builder.pos, builder.pos + text.length, content);\n if (ie && ie_version < 9) { mustWrap = true; }\n builder.pos += text.length;\n } else {\n content = document.createDocumentFragment();\n var pos = 0;\n while (true) {\n special.lastIndex = pos;\n var m = special.exec(text);\n var skipped = m ? m.index - pos : text.length - pos;\n if (skipped) {\n var txt = document.createTextNode(displayText.slice(pos, pos + skipped));\n if (ie && ie_version < 9) { content.appendChild(elt(\"span\", [txt])); }\n else { content.appendChild(txt); }\n builder.map.push(builder.pos, builder.pos + skipped, txt);\n builder.col += skipped;\n builder.pos += skipped;\n }\n if (!m) { break }\n pos += skipped + 1;\n var txt$1 = (void 0);\n if (m[0] == \"\\t\") {\n var tabSize = builder.cm.options.tabSize, tabWidth = tabSize - builder.col % tabSize;\n txt$1 = content.appendChild(elt(\"span\", spaceStr(tabWidth), \"cm-tab\"));\n txt$1.setAttribute(\"role\", \"presentation\");\n txt$1.setAttribute(\"cm-text\", \"\\t\");\n builder.col += tabWidth;\n } else if (m[0] == \"\\r\" || m[0] == \"\\n\") {\n txt$1 = content.appendChild(elt(\"span\", m[0] == \"\\r\" ? \"\\u240d\" : \"\\u2424\", \"cm-invalidchar\"));\n txt$1.setAttribute(\"cm-text\", m[0]);\n builder.col += 1;\n } else {\n txt$1 = builder.cm.options.specialCharPlaceholder(m[0]);\n txt$1.setAttribute(\"cm-text\", m[0]);\n if (ie && ie_version < 9) { content.appendChild(elt(\"span\", [txt$1])); }\n else { content.appendChild(txt$1); }\n builder.col += 1;\n }\n builder.map.push(builder.pos, builder.pos + 1, txt$1);\n builder.pos++;\n }\n }\n builder.trailingSpace = displayText.charCodeAt(text.length - 1) == 32;\n if (style || startStyle || endStyle || mustWrap || css) {\n var fullStyle = style || \"\";\n if (startStyle) { fullStyle += startStyle; }\n if (endStyle) { fullStyle += endStyle; }\n var token = elt(\"span\", [content], fullStyle, css);\n if (title) { token.title = title; }\n return builder.content.appendChild(token)\n }\n builder.content.appendChild(content);\n}\n\nfunction splitSpaces(text, trailingBefore) {\n if (text.length > 1 && !/ /.test(text)) { return text }\n var spaceBefore = trailingBefore, result = \"\";\n for (var i = 0; i < text.length; i++) {\n var ch = text.charAt(i);\n if (ch == \" \" && spaceBefore && (i == text.length - 1 || text.charCodeAt(i + 1) == 32))\n { ch = \"\\u00a0\"; }\n result += ch;\n spaceBefore = ch == \" \";\n }\n return result\n}\n\n// Work around nonsense dimensions being reported for stretches of\n// right-to-left text.\nfunction buildTokenBadBidi(inner, order) {\n return function (builder, text, style, startStyle, endStyle, title, css) {\n style = style ? style + \" cm-force-border\" : \"cm-force-border\";\n var start = builder.pos, end = start + text.length;\n for (;;) {\n // Find the part that overlaps with the start of this text\n var part = (void 0);\n for (var i = 0; i < order.length; i++) {\n part = order[i];\n if (part.to > start && part.from <= start) { break }\n }\n if (part.to >= end) { return inner(builder, text, style, startStyle, endStyle, title, css) }\n inner(builder, text.slice(0, part.to - start), style, startStyle, null, title, css);\n startStyle = null;\n text = text.slice(part.to - start);\n start = part.to;\n }\n }\n}\n\nfunction buildCollapsedSpan(builder, size, marker, ignoreWidget) {\n var widget = !ignoreWidget && marker.widgetNode;\n if (widget) { builder.map.push(builder.pos, builder.pos + size, widget); }\n if (!ignoreWidget && builder.cm.display.input.needsContentAttribute) {\n if (!widget)\n { widget = builder.content.appendChild(document.createElement(\"span\")); }\n widget.setAttribute(\"cm-marker\", marker.id);\n }\n if (widget) {\n builder.cm.display.input.setUneditable(widget);\n builder.content.appendChild(widget);\n }\n builder.pos += size;\n builder.trailingSpace = false;\n}\n\n// Outputs a number of spans to make up a line, taking highlighting\n// and marked text into account.\nfunction insertLineContent(line, builder, styles) {\n var spans = line.markedSpans, allText = line.text, at = 0;\n if (!spans) {\n for (var i$1 = 1; i$1 < styles.length; i$1+=2)\n { builder.addToken(builder, allText.slice(at, at = styles[i$1]), interpretTokenStyle(styles[i$1+1], builder.cm.options)); }\n return\n }\n\n var len = allText.length, pos = 0, i = 1, text = \"\", style, css;\n var nextChange = 0, spanStyle, spanEndStyle, spanStartStyle, title, collapsed;\n for (;;) {\n if (nextChange == pos) { // Update current marker set\n spanStyle = spanEndStyle = spanStartStyle = title = css = \"\";\n collapsed = null; nextChange = Infinity;\n var foundBookmarks = [], endStyles = (void 0);\n for (var j = 0; j < spans.length; ++j) {\n var sp = spans[j], m = sp.marker;\n if (m.type == \"bookmark\" && sp.from == pos && m.widgetNode) {\n foundBookmarks.push(m);\n } else if (sp.from <= pos && (sp.to == null || sp.to > pos || m.collapsed && sp.to == pos && sp.from == pos)) {\n if (sp.to != null && sp.to != pos && nextChange > sp.to) {\n nextChange = sp.to;\n spanEndStyle = \"\";\n }\n if (m.className) { spanStyle += \" \" + m.className; }\n if (m.css) { css = (css ? css + \";\" : \"\") + m.css; }\n if (m.startStyle && sp.from == pos) { spanStartStyle += \" \" + m.startStyle; }\n if (m.endStyle && sp.to == nextChange) { (endStyles || (endStyles = [])).push(m.endStyle, sp.to); }\n if (m.title && !title) { title = m.title; }\n if (m.collapsed && (!collapsed || compareCollapsedMarkers(collapsed.marker, m) < 0))\n { collapsed = sp; }\n } else if (sp.from > pos && nextChange > sp.from) {\n nextChange = sp.from;\n }\n }\n if (endStyles) { for (var j$1 = 0; j$1 < endStyles.length; j$1 += 2)\n { if (endStyles[j$1 + 1] == nextChange) { spanEndStyle += \" \" + endStyles[j$1]; } } }\n\n if (!collapsed || collapsed.from == pos) { for (var j$2 = 0; j$2 < foundBookmarks.length; ++j$2)\n { buildCollapsedSpan(builder, 0, foundBookmarks[j$2]); } }\n if (collapsed && (collapsed.from || 0) == pos) {\n buildCollapsedSpan(builder, (collapsed.to == null ? len + 1 : collapsed.to) - pos,\n collapsed.marker, collapsed.from == null);\n if (collapsed.to == null) { return }\n if (collapsed.to == pos) { collapsed = false; }\n }\n }\n if (pos >= len) { break }\n\n var upto = Math.min(len, nextChange);\n while (true) {\n if (text) {\n var end = pos + text.length;\n if (!collapsed) {\n var tokenText = end > upto ? text.slice(0, upto - pos) : text;\n builder.addToken(builder, tokenText, style ? style + spanStyle : spanStyle,\n spanStartStyle, pos + tokenText.length == nextChange ? spanEndStyle : \"\", title, css);\n }\n if (end >= upto) {text = text.slice(upto - pos); pos = upto; break}\n pos = end;\n spanStartStyle = \"\";\n }\n text = allText.slice(at, at = styles[i++]);\n style = interpretTokenStyle(styles[i++], builder.cm.options);\n }\n }\n}\n\n\n// These objects are used to represent the visible (currently drawn)\n// part of the document. A LineView may correspond to multiple\n// logical lines, if those are connected by collapsed ranges.\nfunction LineView(doc, line, lineN) {\n // The starting line\n this.line = line;\n // Continuing lines, if any\n this.rest = visualLineContinued(line);\n // Number of logical lines in this visual line\n this.size = this.rest ? lineNo(lst(this.rest)) - lineN + 1 : 1;\n this.node = this.text = null;\n this.hidden = lineIsHidden(doc, line);\n}\n\n// Create a range of LineView objects for the given lines.\nfunction buildViewArray(cm, from, to) {\n var array = [], nextPos;\n for (var pos = from; pos < to; pos = nextPos) {\n var view = new LineView(cm.doc, getLine(cm.doc, pos), pos);\n nextPos = pos + view.size;\n array.push(view);\n }\n return array\n}\n\nvar operationGroup = null;\n\nfunction pushOperation(op) {\n if (operationGroup) {\n operationGroup.ops.push(op);\n } else {\n op.ownsGroup = operationGroup = {\n ops: [op],\n delayedCallbacks: []\n };\n }\n}\n\nfunction fireCallbacksForOps(group) {\n // Calls delayed callbacks and cursorActivity handlers until no\n // new ones appear\n var callbacks = group.delayedCallbacks, i = 0;\n do {\n for (; i < callbacks.length; i++)\n { callbacks[i].call(null); }\n for (var j = 0; j < group.ops.length; j++) {\n var op = group.ops[j];\n if (op.cursorActivityHandlers)\n { while (op.cursorActivityCalled < op.cursorActivityHandlers.length)\n { op.cursorActivityHandlers[op.cursorActivityCalled++].call(null, op.cm); } }\n }\n } while (i < callbacks.length)\n}\n\nfunction finishOperation(op, endCb) {\n var group = op.ownsGroup;\n if (!group) { return }\n\n try { fireCallbacksForOps(group); }\n finally {\n operationGroup = null;\n endCb(group);\n }\n}\n\nvar orphanDelayedCallbacks = null;\n\n// Often, we want to signal events at a point where we are in the\n// middle of some work, but don't want the handler to start calling\n// other methods on the editor, which might be in an inconsistent\n// state or simply not expect any other events to happen.\n// signalLater looks whether there are any handlers, and schedules\n// them to be executed when the last operation ends, or, if no\n// operation is active, when a timeout fires.\nfunction signalLater(emitter, type /*, values...*/) {\n var arr = getHandlers(emitter, type);\n if (!arr.length) { return }\n var args = Array.prototype.slice.call(arguments, 2), list;\n if (operationGroup) {\n list = operationGroup.delayedCallbacks;\n } else if (orphanDelayedCallbacks) {\n list = orphanDelayedCallbacks;\n } else {\n list = orphanDelayedCallbacks = [];\n setTimeout(fireOrphanDelayed, 0);\n }\n var loop = function ( i ) {\n list.push(function () { return arr[i].apply(null, args); });\n };\n\n for (var i = 0; i < arr.length; ++i)\n loop( i );\n}\n\nfunction fireOrphanDelayed() {\n var delayed = orphanDelayedCallbacks;\n orphanDelayedCallbacks = null;\n for (var i = 0; i < delayed.length; ++i) { delayed[i](); }\n}\n\n// When an aspect of a line changes, a string is added to\n// lineView.changes. This updates the relevant part of the line's\n// DOM structure.\nfunction updateLineForChanges(cm, lineView, lineN, dims) {\n for (var j = 0; j < lineView.changes.length; j++) {\n var type = lineView.changes[j];\n if (type == \"text\") { updateLineText(cm, lineView); }\n else if (type == \"gutter\") { updateLineGutter(cm, lineView, lineN, dims); }\n else if (type == \"class\") { updateLineClasses(cm, lineView); }\n else if (type == \"widget\") { updateLineWidgets(cm, lineView, dims); }\n }\n lineView.changes = null;\n}\n\n// Lines with gutter elements, widgets or a background class need to\n// be wrapped, and have the extra elements added to the wrapper div\nfunction ensureLineWrapped(lineView) {\n if (lineView.node == lineView.text) {\n lineView.node = elt(\"div\", null, null, \"position: relative\");\n if (lineView.text.parentNode)\n { lineView.text.parentNode.replaceChild(lineView.node, lineView.text); }\n lineView.node.appendChild(lineView.text);\n if (ie && ie_version < 8) { lineView.node.style.zIndex = 2; }\n }\n return lineView.node\n}\n\nfunction updateLineBackground(cm, lineView) {\n var cls = lineView.bgClass ? lineView.bgClass + \" \" + (lineView.line.bgClass || \"\") : lineView.line.bgClass;\n if (cls) { cls += \" CodeMirror-linebackground\"; }\n if (lineView.background) {\n if (cls) { lineView.background.className = cls; }\n else { lineView.background.parentNode.removeChild(lineView.background); lineView.background = null; }\n } else if (cls) {\n var wrap = ensureLineWrapped(lineView);\n lineView.background = wrap.insertBefore(elt(\"div\", null, cls), wrap.firstChild);\n cm.display.input.setUneditable(lineView.background);\n }\n}\n\n// Wrapper around buildLineContent which will reuse the structure\n// in display.externalMeasured when possible.\nfunction getLineContent(cm, lineView) {\n var ext = cm.display.externalMeasured;\n if (ext && ext.line == lineView.line) {\n cm.display.externalMeasured = null;\n lineView.measure = ext.measure;\n return ext.built\n }\n return buildLineContent(cm, lineView)\n}\n\n// Redraw the line's text. Interacts with the background and text\n// classes because the mode may output tokens that influence these\n// classes.\nfunction updateLineText(cm, lineView) {\n var cls = lineView.text.className;\n var built = getLineContent(cm, lineView);\n if (lineView.text == lineView.node) { lineView.node = built.pre; }\n lineView.text.parentNode.replaceChild(built.pre, lineView.text);\n lineView.text = built.pre;\n if (built.bgClass != lineView.bgClass || built.textClass != lineView.textClass) {\n lineView.bgClass = built.bgClass;\n lineView.textClass = built.textClass;\n updateLineClasses(cm, lineView);\n } else if (cls) {\n lineView.text.className = cls;\n }\n}\n\nfunction updateLineClasses(cm, lineView) {\n updateLineBackground(cm, lineView);\n if (lineView.line.wrapClass)\n { ensureLineWrapped(lineView).className = lineView.line.wrapClass; }\n else if (lineView.node != lineView.text)\n { lineView.node.className = \"\"; }\n var textClass = lineView.textClass ? lineView.textClass + \" \" + (lineView.line.textClass || \"\") : lineView.line.textClass;\n lineView.text.className = textClass || \"\";\n}\n\nfunction updateLineGutter(cm, lineView, lineN, dims) {\n if (lineView.gutter) {\n lineView.node.removeChild(lineView.gutter);\n lineView.gutter = null;\n }\n if (lineView.gutterBackground) {\n lineView.node.removeChild(lineView.gutterBackground);\n lineView.gutterBackground = null;\n }\n if (lineView.line.gutterClass) {\n var wrap = ensureLineWrapped(lineView);\n lineView.gutterBackground = elt(\"div\", null, \"CodeMirror-gutter-background \" + lineView.line.gutterClass,\n (\"left: \" + (cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) + \"px; width: \" + (dims.gutterTotalWidth) + \"px\"));\n cm.display.input.setUneditable(lineView.gutterBackground);\n wrap.insertBefore(lineView.gutterBackground, lineView.text);\n }\n var markers = lineView.line.gutterMarkers;\n if (cm.options.lineNumbers || markers) {\n var wrap$1 = ensureLineWrapped(lineView);\n var gutterWrap = lineView.gutter = elt(\"div\", null, \"CodeMirror-gutter-wrapper\", (\"left: \" + (cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) + \"px\"));\n cm.display.input.setUneditable(gutterWrap);\n wrap$1.insertBefore(gutterWrap, lineView.text);\n if (lineView.line.gutterClass)\n { gutterWrap.className += \" \" + lineView.line.gutterClass; }\n if (cm.options.lineNumbers && (!markers || !markers[\"CodeMirror-linenumbers\"]))\n { lineView.lineNumber = gutterWrap.appendChild(\n elt(\"div\", lineNumberFor(cm.options, lineN),\n \"CodeMirror-linenumber CodeMirror-gutter-elt\",\n (\"left: \" + (dims.gutterLeft[\"CodeMirror-linenumbers\"]) + \"px; width: \" + (cm.display.lineNumInnerWidth) + \"px\"))); }\n if (markers) { for (var k = 0; k < cm.options.gutters.length; ++k) {\n var id = cm.options.gutters[k], found = markers.hasOwnProperty(id) && markers[id];\n if (found)\n { gutterWrap.appendChild(elt(\"div\", [found], \"CodeMirror-gutter-elt\",\n (\"left: \" + (dims.gutterLeft[id]) + \"px; width: \" + (dims.gutterWidth[id]) + \"px\"))); }\n } }\n }\n}\n\nfunction updateLineWidgets(cm, lineView, dims) {\n if (lineView.alignable) { lineView.alignable = null; }\n for (var node = lineView.node.firstChild, next = (void 0); node; node = next) {\n next = node.nextSibling;\n if (node.className == \"CodeMirror-linewidget\")\n { lineView.node.removeChild(node); }\n }\n insertLineWidgets(cm, lineView, dims);\n}\n\n// Build a line's DOM representation from scratch\nfunction buildLineElement(cm, lineView, lineN, dims) {\n var built = getLineContent(cm, lineView);\n lineView.text = lineView.node = built.pre;\n if (built.bgClass) { lineView.bgClass = built.bgClass; }\n if (built.textClass) { lineView.textClass = built.textClass; }\n\n updateLineClasses(cm, lineView);\n updateLineGutter(cm, lineView, lineN, dims);\n insertLineWidgets(cm, lineView, dims);\n return lineView.node\n}\n\n// A lineView may contain multiple logical lines (when merged by\n// collapsed spans). The widgets for all of them need to be drawn.\nfunction insertLineWidgets(cm, lineView, dims) {\n insertLineWidgetsFor(cm, lineView.line, lineView, dims, true);\n if (lineView.rest) { for (var i = 0; i < lineView.rest.length; i++)\n { insertLineWidgetsFor(cm, lineView.rest[i], lineView, dims, false); } }\n}\n\nfunction insertLineWidgetsFor(cm, line, lineView, dims, allowAbove) {\n if (!line.widgets) { return }\n var wrap = ensureLineWrapped(lineView);\n for (var i = 0, ws = line.widgets; i < ws.length; ++i) {\n var widget = ws[i], node = elt(\"div\", [widget.node], \"CodeMirror-linewidget\");\n if (!widget.handleMouseEvents) { node.setAttribute(\"cm-ignore-events\", \"true\"); }\n positionLineWidget(widget, node, lineView, dims);\n cm.display.input.setUneditable(node);\n if (allowAbove && widget.above)\n { wrap.insertBefore(node, lineView.gutter || lineView.text); }\n else\n { wrap.appendChild(node); }\n signalLater(widget, \"redraw\");\n }\n}\n\nfunction positionLineWidget(widget, node, lineView, dims) {\n if (widget.noHScroll) {\n (lineView.alignable || (lineView.alignable = [])).push(node);\n var width = dims.wrapperWidth;\n node.style.left = dims.fixedPos + \"px\";\n if (!widget.coverGutter) {\n width -= dims.gutterTotalWidth;\n node.style.paddingLeft = dims.gutterTotalWidth + \"px\";\n }\n node.style.width = width + \"px\";\n }\n if (widget.coverGutter) {\n node.style.zIndex = 5;\n node.style.position = \"relative\";\n if (!widget.noHScroll) { node.style.marginLeft = -dims.gutterTotalWidth + \"px\"; }\n }\n}\n\nfunction widgetHeight(widget) {\n if (widget.height != null) { return widget.height }\n var cm = widget.doc.cm;\n if (!cm) { return 0 }\n if (!contains(document.body, widget.node)) {\n var parentStyle = \"position: relative;\";\n if (widget.coverGutter)\n { parentStyle += \"margin-left: -\" + cm.display.gutters.offsetWidth + \"px;\"; }\n if (widget.noHScroll)\n { parentStyle += \"width: \" + cm.display.wrapper.clientWidth + \"px;\"; }\n removeChildrenAndAdd(cm.display.measure, elt(\"div\", [widget.node], null, parentStyle));\n }\n return widget.height = widget.node.parentNode.offsetHeight\n}\n\n// Return true when the given mouse event happened in a widget\nfunction eventInWidget(display, e) {\n for (var n = e_target(e); n != display.wrapper; n = n.parentNode) {\n if (!n || (n.nodeType == 1 && n.getAttribute(\"cm-ignore-events\") == \"true\") ||\n (n.parentNode == display.sizer && n != display.mover))\n { return true }\n }\n}\n\n// POSITION MEASUREMENT\n\nfunction paddingTop(display) {return display.lineSpace.offsetTop}\nfunction paddingVert(display) {return display.mover.offsetHeight - display.lineSpace.offsetHeight}\nfunction paddingH(display) {\n if (display.cachedPaddingH) { return display.cachedPaddingH }\n var e = removeChildrenAndAdd(display.measure, elt(\"pre\", \"x\"));\n var style = window.getComputedStyle ? window.getComputedStyle(e) : e.currentStyle;\n var data = {left: parseInt(style.paddingLeft), right: parseInt(style.paddingRight)};\n if (!isNaN(data.left) && !isNaN(data.right)) { display.cachedPaddingH = data; }\n return data\n}\n\nfunction scrollGap(cm) { return scrollerGap - cm.display.nativeBarWidth }\nfunction displayWidth(cm) {\n return cm.display.scroller.clientWidth - scrollGap(cm) - cm.display.barWidth\n}\nfunction displayHeight(cm) {\n return cm.display.scroller.clientHeight - scrollGap(cm) - cm.display.barHeight\n}\n\n// Ensure the lineView.wrapping.heights array is populated. This is\n// an array of bottom offsets for the lines that make up a drawn\n// line. When lineWrapping is on, there might be more than one\n// height.\nfunction ensureLineHeights(cm, lineView, rect) {\n var wrapping = cm.options.lineWrapping;\n var curWidth = wrapping && displayWidth(cm);\n if (!lineView.measure.heights || wrapping && lineView.measure.width != curWidth) {\n var heights = lineView.measure.heights = [];\n if (wrapping) {\n lineView.measure.width = curWidth;\n var rects = lineView.text.firstChild.getClientRects();\n for (var i = 0; i < rects.length - 1; i++) {\n var cur = rects[i], next = rects[i + 1];\n if (Math.abs(cur.bottom - next.bottom) > 2)\n { heights.push((cur.bottom + next.top) / 2 - rect.top); }\n }\n }\n heights.push(rect.bottom - rect.top);\n }\n}\n\n// Find a line map (mapping character offsets to text nodes) and a\n// measurement cache for the given line number. (A line view might\n// contain multiple lines when collapsed ranges are present.)\nfunction mapFromLineView(lineView, line, lineN) {\n if (lineView.line == line)\n { return {map: lineView.measure.map, cache: lineView.measure.cache} }\n for (var i = 0; i < lineView.rest.length; i++)\n { if (lineView.rest[i] == line)\n { return {map: lineView.measure.maps[i], cache: lineView.measure.caches[i]} } }\n for (var i$1 = 0; i$1 < lineView.rest.length; i$1++)\n { if (lineNo(lineView.rest[i$1]) > lineN)\n { return {map: lineView.measure.maps[i$1], cache: lineView.measure.caches[i$1], before: true} } }\n}\n\n// Render a line into the hidden node display.externalMeasured. Used\n// when measurement is needed for a line that's not in the viewport.\nfunction updateExternalMeasurement(cm, line) {\n line = visualLine(line);\n var lineN = lineNo(line);\n var view = cm.display.externalMeasured = new LineView(cm.doc, line, lineN);\n view.lineN = lineN;\n var built = view.built = buildLineContent(cm, view);\n view.text = built.pre;\n removeChildrenAndAdd(cm.display.lineMeasure, built.pre);\n return view\n}\n\n// Get a {top, bottom, left, right} box (in line-local coordinates)\n// for a given character.\nfunction measureChar(cm, line, ch, bias) {\n return measureCharPrepared(cm, prepareMeasureForLine(cm, line), ch, bias)\n}\n\n// Find a line view that corresponds to the given line number.\nfunction findViewForLine(cm, lineN) {\n if (lineN >= cm.display.viewFrom && lineN < cm.display.viewTo)\n { return cm.display.view[findViewIndex(cm, lineN)] }\n var ext = cm.display.externalMeasured;\n if (ext && lineN >= ext.lineN && lineN < ext.lineN + ext.size)\n { return ext }\n}\n\n// Measurement can be split in two steps, the set-up work that\n// applies to the whole line, and the measurement of the actual\n// character. Functions like coordsChar, that need to do a lot of\n// measurements in a row, can thus ensure that the set-up work is\n// only done once.\nfunction prepareMeasureForLine(cm, line) {\n var lineN = lineNo(line);\n var view = findViewForLine(cm, lineN);\n if (view && !view.text) {\n view = null;\n } else if (view && view.changes) {\n updateLineForChanges(cm, view, lineN, getDimensions(cm));\n cm.curOp.forceUpdate = true;\n }\n if (!view)\n { view = updateExternalMeasurement(cm, line); }\n\n var info = mapFromLineView(view, line, lineN);\n return {\n line: line, view: view, rect: null,\n map: info.map, cache: info.cache, before: info.before,\n hasHeights: false\n }\n}\n\n// Given a prepared measurement object, measures the position of an\n// actual character (or fetches it from the cache).\nfunction measureCharPrepared(cm, prepared, ch, bias, varHeight) {\n if (prepared.before) { ch = -1; }\n var key = ch + (bias || \"\"), found;\n if (prepared.cache.hasOwnProperty(key)) {\n found = prepared.cache[key];\n } else {\n if (!prepared.rect)\n { prepared.rect = prepared.view.text.getBoundingClientRect(); }\n if (!prepared.hasHeights) {\n ensureLineHeights(cm, prepared.view, prepared.rect);\n prepared.hasHeights = true;\n }\n found = measureCharInner(cm, prepared, ch, bias);\n if (!found.bogus) { prepared.cache[key] = found; }\n }\n return {left: found.left, right: found.right,\n top: varHeight ? found.rtop : found.top,\n bottom: varHeight ? found.rbottom : found.bottom}\n}\n\nvar nullRect = {left: 0, right: 0, top: 0, bottom: 0};\n\nfunction nodeAndOffsetInLineMap(map$$1, ch, bias) {\n var node, start, end, collapse, mStart, mEnd;\n // First, search the line map for the text node corresponding to,\n // or closest to, the target character.\n for (var i = 0; i < map$$1.length; i += 3) {\n mStart = map$$1[i];\n mEnd = map$$1[i + 1];\n if (ch < mStart) {\n start = 0; end = 1;\n collapse = \"left\";\n } else if (ch < mEnd) {\n start = ch - mStart;\n end = start + 1;\n } else if (i == map$$1.length - 3 || ch == mEnd && map$$1[i + 3] > ch) {\n end = mEnd - mStart;\n start = end - 1;\n if (ch >= mEnd) { collapse = \"right\"; }\n }\n if (start != null) {\n node = map$$1[i + 2];\n if (mStart == mEnd && bias == (node.insertLeft ? \"left\" : \"right\"))\n { collapse = bias; }\n if (bias == \"left\" && start == 0)\n { while (i && map$$1[i - 2] == map$$1[i - 3] && map$$1[i - 1].insertLeft) {\n node = map$$1[(i -= 3) + 2];\n collapse = \"left\";\n } }\n if (bias == \"right\" && start == mEnd - mStart)\n { while (i < map$$1.length - 3 && map$$1[i + 3] == map$$1[i + 4] && !map$$1[i + 5].insertLeft) {\n node = map$$1[(i += 3) + 2];\n collapse = \"right\";\n } }\n break\n }\n }\n return {node: node, start: start, end: end, collapse: collapse, coverStart: mStart, coverEnd: mEnd}\n}\n\nfunction getUsefulRect(rects, bias) {\n var rect = nullRect;\n if (bias == \"left\") { for (var i = 0; i < rects.length; i++) {\n if ((rect = rects[i]).left != rect.right) { break }\n } } else { for (var i$1 = rects.length - 1; i$1 >= 0; i$1--) {\n if ((rect = rects[i$1]).left != rect.right) { break }\n } }\n return rect\n}\n\nfunction measureCharInner(cm, prepared, ch, bias) {\n var place = nodeAndOffsetInLineMap(prepared.map, ch, bias);\n var node = place.node, start = place.start, end = place.end, collapse = place.collapse;\n\n var rect;\n if (node.nodeType == 3) { // If it is a text node, use a range to retrieve the coordinates.\n for (var i$1 = 0; i$1 < 4; i$1++) { // Retry a maximum of 4 times when nonsense rectangles are returned\n while (start && isExtendingChar(prepared.line.text.charAt(place.coverStart + start))) { --start; }\n while (place.coverStart + end < place.coverEnd && isExtendingChar(prepared.line.text.charAt(place.coverStart + end))) { ++end; }\n if (ie && ie_version < 9 && start == 0 && end == place.coverEnd - place.coverStart)\n { rect = node.parentNode.getBoundingClientRect(); }\n else\n { rect = getUsefulRect(range(node, start, end).getClientRects(), bias); }\n if (rect.left || rect.right || start == 0) { break }\n end = start;\n start = start - 1;\n collapse = \"right\";\n }\n if (ie && ie_version < 11) { rect = maybeUpdateRectForZooming(cm.display.measure, rect); }\n } else { // If it is a widget, simply get the box for the whole widget.\n if (start > 0) { collapse = bias = \"right\"; }\n var rects;\n if (cm.options.lineWrapping && (rects = node.getClientRects()).length > 1)\n { rect = rects[bias == \"right\" ? rects.length - 1 : 0]; }\n else\n { rect = node.getBoundingClientRect(); }\n }\n if (ie && ie_version < 9 && !start && (!rect || !rect.left && !rect.right)) {\n var rSpan = node.parentNode.getClientRects()[0];\n if (rSpan)\n { rect = {left: rSpan.left, right: rSpan.left + charWidth(cm.display), top: rSpan.top, bottom: rSpan.bottom}; }\n else\n { rect = nullRect; }\n }\n\n var rtop = rect.top - prepared.rect.top, rbot = rect.bottom - prepared.rect.top;\n var mid = (rtop + rbot) / 2;\n var heights = prepared.view.measure.heights;\n var i = 0;\n for (; i < heights.length - 1; i++)\n { if (mid < heights[i]) { break } }\n var top = i ? heights[i - 1] : 0, bot = heights[i];\n var result = {left: (collapse == \"right\" ? rect.right : rect.left) - prepared.rect.left,\n right: (collapse == \"left\" ? rect.left : rect.right) - prepared.rect.left,\n top: top, bottom: bot};\n if (!rect.left && !rect.right) { result.bogus = true; }\n if (!cm.options.singleCursorHeightPerLine) { result.rtop = rtop; result.rbottom = rbot; }\n\n return result\n}\n\n// Work around problem with bounding client rects on ranges being\n// returned incorrectly when zoomed on IE10 and below.\nfunction maybeUpdateRectForZooming(measure, rect) {\n if (!window.screen || screen.logicalXDPI == null ||\n screen.logicalXDPI == screen.deviceXDPI || !hasBadZoomedRects(measure))\n { return rect }\n var scaleX = screen.logicalXDPI / screen.deviceXDPI;\n var scaleY = screen.logicalYDPI / screen.deviceYDPI;\n return {left: rect.left * scaleX, right: rect.right * scaleX,\n top: rect.top * scaleY, bottom: rect.bottom * scaleY}\n}\n\nfunction clearLineMeasurementCacheFor(lineView) {\n if (lineView.measure) {\n lineView.measure.cache = {};\n lineView.measure.heights = null;\n if (lineView.rest) { for (var i = 0; i < lineView.rest.length; i++)\n { lineView.measure.caches[i] = {}; } }\n }\n}\n\nfunction clearLineMeasurementCache(cm) {\n cm.display.externalMeasure = null;\n removeChildren(cm.display.lineMeasure);\n for (var i = 0; i < cm.display.view.length; i++)\n { clearLineMeasurementCacheFor(cm.display.view[i]); }\n}\n\nfunction clearCaches(cm) {\n clearLineMeasurementCache(cm);\n cm.display.cachedCharWidth = cm.display.cachedTextHeight = cm.display.cachedPaddingH = null;\n if (!cm.options.lineWrapping) { cm.display.maxLineChanged = true; }\n cm.display.lineNumChars = null;\n}\n\nfunction pageScrollX() {\n // Work around https://bugs.chromium.org/p/chromium/issues/detail?id=489206\n // which causes page_Offset and bounding client rects to use\n // different reference viewports and invalidate our calculations.\n if (chrome && android) { return -(document.body.getBoundingClientRect().left - parseInt(getComputedStyle(document.body).marginLeft)) }\n return window.pageXOffset || (document.documentElement || document.body).scrollLeft\n}\nfunction pageScrollY() {\n if (chrome && android) { return -(document.body.getBoundingClientRect().top - parseInt(getComputedStyle(document.body).marginTop)) }\n return window.pageYOffset || (document.documentElement || document.body).scrollTop\n}\n\nfunction widgetTopHeight(lineObj) {\n var height = 0;\n if (lineObj.widgets) { for (var i = 0; i < lineObj.widgets.length; ++i) { if (lineObj.widgets[i].above)\n { height += widgetHeight(lineObj.widgets[i]); } } }\n return height\n}\n\n// Converts a {top, bottom, left, right} box from line-local\n// coordinates into another coordinate system. Context may be one of\n// \"line\", \"div\" (display.lineDiv), \"local\"./null (editor), \"window\",\n// or \"page\".\nfunction intoCoordSystem(cm, lineObj, rect, context, includeWidgets) {\n if (!includeWidgets) {\n var height = widgetTopHeight(lineObj);\n rect.top += height; rect.bottom += height;\n }\n if (context == \"line\") { return rect }\n if (!context) { context = \"local\"; }\n var yOff = heightAtLine(lineObj);\n if (context == \"local\") { yOff += paddingTop(cm.display); }\n else { yOff -= cm.display.viewOffset; }\n if (context == \"page\" || context == \"window\") {\n var lOff = cm.display.lineSpace.getBoundingClientRect();\n yOff += lOff.top + (context == \"window\" ? 0 : pageScrollY());\n var xOff = lOff.left + (context == \"window\" ? 0 : pageScrollX());\n rect.left += xOff; rect.right += xOff;\n }\n rect.top += yOff; rect.bottom += yOff;\n return rect\n}\n\n// Coverts a box from \"div\" coords to another coordinate system.\n// Context may be \"window\", \"page\", \"div\", or \"local\"./null.\nfunction fromCoordSystem(cm, coords, context) {\n if (context == \"div\") { return coords }\n var left = coords.left, top = coords.top;\n // First move into \"page\" coordinate system\n if (context == \"page\") {\n left -= pageScrollX();\n top -= pageScrollY();\n } else if (context == \"local\" || !context) {\n var localBox = cm.display.sizer.getBoundingClientRect();\n left += localBox.left;\n top += localBox.top;\n }\n\n var lineSpaceBox = cm.display.lineSpace.getBoundingClientRect();\n return {left: left - lineSpaceBox.left, top: top - lineSpaceBox.top}\n}\n\nfunction charCoords(cm, pos, context, lineObj, bias) {\n if (!lineObj) { lineObj = getLine(cm.doc, pos.line); }\n return intoCoordSystem(cm, lineObj, measureChar(cm, lineObj, pos.ch, bias), context)\n}\n\n// Returns a box for a given cursor position, which may have an\n// 'other' property containing the position of the secondary cursor\n// on a bidi boundary.\n// A cursor Pos(line, char, \"before\") is on the same visual line as `char - 1`\n// and after `char - 1` in writing order of `char - 1`\n// A cursor Pos(line, char, \"after\") is on the same visual line as `char`\n// and before `char` in writing order of `char`\n// Examples (upper-case letters are RTL, lower-case are LTR):\n// Pos(0, 1, ...)\n// before after\n// ab a|b a|b\n// aB a|B aB|\n// Ab |Ab A|b\n// AB B|A B|A\n// Every position after the last character on a line is considered to stick\n// to the last character on the line.\nfunction cursorCoords(cm, pos, context, lineObj, preparedMeasure, varHeight) {\n lineObj = lineObj || getLine(cm.doc, pos.line);\n if (!preparedMeasure) { preparedMeasure = prepareMeasureForLine(cm, lineObj); }\n function get(ch, right) {\n var m = measureCharPrepared(cm, preparedMeasure, ch, right ? \"right\" : \"left\", varHeight);\n if (right) { m.left = m.right; } else { m.right = m.left; }\n return intoCoordSystem(cm, lineObj, m, context)\n }\n var order = getOrder(lineObj, cm.doc.direction), ch = pos.ch, sticky = pos.sticky;\n if (ch >= lineObj.text.length) {\n ch = lineObj.text.length;\n sticky = \"before\";\n } else if (ch <= 0) {\n ch = 0;\n sticky = \"after\";\n }\n if (!order) { return get(sticky == \"before\" ? ch - 1 : ch, sticky == \"before\") }\n\n function getBidi(ch, partPos, invert) {\n var part = order[partPos], right = part.level == 1;\n return get(invert ? ch - 1 : ch, right != invert)\n }\n var partPos = getBidiPartAt(order, ch, sticky);\n var other = bidiOther;\n var val = getBidi(ch, partPos, sticky == \"before\");\n if (other != null) { val.other = getBidi(ch, other, sticky != \"before\"); }\n return val\n}\n\n// Used to cheaply estimate the coordinates for a position. Used for\n// intermediate scroll updates.\nfunction estimateCoords(cm, pos) {\n var left = 0;\n pos = clipPos(cm.doc, pos);\n if (!cm.options.lineWrapping) { left = charWidth(cm.display) * pos.ch; }\n var lineObj = getLine(cm.doc, pos.line);\n var top = heightAtLine(lineObj) + paddingTop(cm.display);\n return {left: left, right: left, top: top, bottom: top + lineObj.height}\n}\n\n// Positions returned by coordsChar contain some extra information.\n// xRel is the relative x position of the input coordinates compared\n// to the found position (so xRel > 0 means the coordinates are to\n// the right of the character position, for example). When outside\n// is true, that means the coordinates lie outside the line's\n// vertical range.\nfunction PosWithInfo(line, ch, sticky, outside, xRel) {\n var pos = Pos(line, ch, sticky);\n pos.xRel = xRel;\n if (outside) { pos.outside = true; }\n return pos\n}\n\n// Compute the character position closest to the given coordinates.\n// Input must be lineSpace-local (\"div\" coordinate system).\nfunction coordsChar(cm, x, y) {\n var doc = cm.doc;\n y += cm.display.viewOffset;\n if (y < 0) { return PosWithInfo(doc.first, 0, null, true, -1) }\n var lineN = lineAtHeight(doc, y), last = doc.first + doc.size - 1;\n if (lineN > last)\n { return PosWithInfo(doc.first + doc.size - 1, getLine(doc, last).text.length, null, true, 1) }\n if (x < 0) { x = 0; }\n\n var lineObj = getLine(doc, lineN);\n for (;;) {\n var found = coordsCharInner(cm, lineObj, lineN, x, y);\n var merged = collapsedSpanAtEnd(lineObj);\n var mergedPos = merged && merged.find(0, true);\n if (merged && (found.ch > mergedPos.from.ch || found.ch == mergedPos.from.ch && found.xRel > 0))\n { lineN = lineNo(lineObj = mergedPos.to.line); }\n else\n { return found }\n }\n}\n\nfunction wrappedLineExtent(cm, lineObj, preparedMeasure, y) {\n y -= widgetTopHeight(lineObj);\n var end = lineObj.text.length;\n var begin = findFirst(function (ch) { return measureCharPrepared(cm, preparedMeasure, ch - 1).bottom <= y; }, end, 0);\n end = findFirst(function (ch) { return measureCharPrepared(cm, preparedMeasure, ch).top > y; }, begin, end);\n return {begin: begin, end: end}\n}\n\nfunction wrappedLineExtentChar(cm, lineObj, preparedMeasure, target) {\n if (!preparedMeasure) { preparedMeasure = prepareMeasureForLine(cm, lineObj); }\n var targetTop = intoCoordSystem(cm, lineObj, measureCharPrepared(cm, preparedMeasure, target), \"line\").top;\n return wrappedLineExtent(cm, lineObj, preparedMeasure, targetTop)\n}\n\n// Returns true if the given side of a box is after the given\n// coordinates, in top-to-bottom, left-to-right order.\nfunction boxIsAfter(box, x, y, left) {\n return box.bottom <= y ? false : box.top > y ? true : (left ? box.left : box.right) > x\n}\n\nfunction coordsCharInner(cm, lineObj, lineNo$$1, x, y) {\n // Move y into line-local coordinate space\n y -= heightAtLine(lineObj);\n var preparedMeasure = prepareMeasureForLine(cm, lineObj);\n // When directly calling `measureCharPrepared`, we have to adjust\n // for the widgets at this line.\n var widgetHeight$$1 = widgetTopHeight(lineObj);\n var begin = 0, end = lineObj.text.length, ltr = true;\n\n var order = getOrder(lineObj, cm.doc.direction);\n // If the line isn't plain left-to-right text, first figure out\n // which bidi section the coordinates fall into.\n if (order) {\n var part = (cm.options.lineWrapping ? coordsBidiPartWrapped : coordsBidiPart)\n (cm, lineObj, lineNo$$1, preparedMeasure, order, x, y);\n ltr = part.level != 1;\n // The awkward -1 offsets are needed because findFirst (called\n // on these below) will treat its first bound as inclusive,\n // second as exclusive, but we want to actually address the\n // characters in the part's range\n begin = ltr ? part.from : part.to - 1;\n end = ltr ? part.to : part.from - 1;\n }\n\n // A binary search to find the first character whose bounding box\n // starts after the coordinates. If we run across any whose box wrap\n // the coordinates, store that.\n var chAround = null, boxAround = null;\n var ch = findFirst(function (ch) {\n var box = measureCharPrepared(cm, preparedMeasure, ch);\n box.top += widgetHeight$$1; box.bottom += widgetHeight$$1;\n if (!boxIsAfter(box, x, y, false)) { return false }\n if (box.top <= y && box.left <= x) {\n chAround = ch;\n boxAround = box;\n }\n return true\n }, begin, end);\n\n var baseX, sticky, outside = false;\n // If a box around the coordinates was found, use that\n if (boxAround) {\n // Distinguish coordinates nearer to the left or right side of the box\n var atLeft = x - boxAround.left < boxAround.right - x, atStart = atLeft == ltr;\n ch = chAround + (atStart ? 0 : 1);\n sticky = atStart ? \"after\" : \"before\";\n baseX = atLeft ? boxAround.left : boxAround.right;\n } else {\n // (Adjust for extended bound, if necessary.)\n if (!ltr && (ch == end || ch == begin)) { ch++; }\n // To determine which side to associate with, get the box to the\n // left of the character and compare it's vertical position to the\n // coordinates\n sticky = ch == 0 ? \"after\" : ch == lineObj.text.length ? \"before\" :\n (measureCharPrepared(cm, preparedMeasure, ch - (ltr ? 1 : 0)).bottom + widgetHeight$$1 <= y) == ltr ?\n \"after\" : \"before\";\n // Now get accurate coordinates for this place, in order to get a\n // base X position\n var coords = cursorCoords(cm, Pos(lineNo$$1, ch, sticky), \"line\", lineObj, preparedMeasure);\n baseX = coords.left;\n outside = y < coords.top || y >= coords.bottom;\n }\n\n ch = skipExtendingChars(lineObj.text, ch, 1);\n return PosWithInfo(lineNo$$1, ch, sticky, outside, x - baseX)\n}\n\nfunction coordsBidiPart(cm, lineObj, lineNo$$1, preparedMeasure, order, x, y) {\n // Bidi parts are sorted left-to-right, and in a non-line-wrapping\n // situation, we can take this ordering to correspond to the visual\n // ordering. This finds the first part whose end is after the given\n // coordinates.\n var index = findFirst(function (i) {\n var part = order[i], ltr = part.level != 1;\n return boxIsAfter(cursorCoords(cm, Pos(lineNo$$1, ltr ? part.to : part.from, ltr ? \"before\" : \"after\"),\n \"line\", lineObj, preparedMeasure), x, y, true)\n }, 0, order.length - 1);\n var part = order[index];\n // If this isn't the first part, the part's start is also after\n // the coordinates, and the coordinates aren't on the same line as\n // that start, move one part back.\n if (index > 0) {\n var ltr = part.level != 1;\n var start = cursorCoords(cm, Pos(lineNo$$1, ltr ? part.from : part.to, ltr ? \"after\" : \"before\"),\n \"line\", lineObj, preparedMeasure);\n if (boxIsAfter(start, x, y, true) && start.top > y)\n { part = order[index - 1]; }\n }\n return part\n}\n\nfunction coordsBidiPartWrapped(cm, lineObj, _lineNo, preparedMeasure, order, x, y) {\n // In a wrapped line, rtl text on wrapping boundaries can do things\n // that don't correspond to the ordering in our `order` array at\n // all, so a binary search doesn't work, and we want to return a\n // part that only spans one line so that the binary search in\n // coordsCharInner is safe. As such, we first find the extent of the\n // wrapped line, and then do a flat search in which we discard any\n // spans that aren't on the line.\n var ref = wrappedLineExtent(cm, lineObj, preparedMeasure, y);\n var begin = ref.begin;\n var end = ref.end;\n if (/\\s/.test(lineObj.text.charAt(end - 1))) { end--; }\n var part = null, closestDist = null;\n for (var i = 0; i < order.length; i++) {\n var p = order[i];\n if (p.from >= end || p.to <= begin) { continue }\n var ltr = p.level != 1;\n var endX = measureCharPrepared(cm, preparedMeasure, ltr ? Math.min(end, p.to) - 1 : Math.max(begin, p.from)).right;\n // Weigh against spans ending before this, so that they are only\n // picked if nothing ends after\n var dist = endX < x ? x - endX + 1e9 : endX - x;\n if (!part || closestDist > dist) {\n part = p;\n closestDist = dist;\n }\n }\n if (!part) { part = order[order.length - 1]; }\n // Clip the part to the wrapped line.\n if (part.from < begin) { part = {from: begin, to: part.to, level: part.level}; }\n if (part.to > end) { part = {from: part.from, to: end, level: part.level}; }\n return part\n}\n\nvar measureText;\n// Compute the default text height.\nfunction textHeight(display) {\n if (display.cachedTextHeight != null) { return display.cachedTextHeight }\n if (measureText == null) {\n measureText = elt(\"pre\");\n // Measure a bunch of lines, for browsers that compute\n // fractional heights.\n for (var i = 0; i < 49; ++i) {\n measureText.appendChild(document.createTextNode(\"x\"));\n measureText.appendChild(elt(\"br\"));\n }\n measureText.appendChild(document.createTextNode(\"x\"));\n }\n removeChildrenAndAdd(display.measure, measureText);\n var height = measureText.offsetHeight / 50;\n if (height > 3) { display.cachedTextHeight = height; }\n removeChildren(display.measure);\n return height || 1\n}\n\n// Compute the default character width.\nfunction charWidth(display) {\n if (display.cachedCharWidth != null) { return display.cachedCharWidth }\n var anchor = elt(\"span\", \"xxxxxxxxxx\");\n var pre = elt(\"pre\", [anchor]);\n removeChildrenAndAdd(display.measure, pre);\n var rect = anchor.getBoundingClientRect(), width = (rect.right - rect.left) / 10;\n if (width > 2) { display.cachedCharWidth = width; }\n return width || 10\n}\n\n// Do a bulk-read of the DOM positions and sizes needed to draw the\n// view, so that we don't interleave reading and writing to the DOM.\nfunction getDimensions(cm) {\n var d = cm.display, left = {}, width = {};\n var gutterLeft = d.gutters.clientLeft;\n for (var n = d.gutters.firstChild, i = 0; n; n = n.nextSibling, ++i) {\n left[cm.options.gutters[i]] = n.offsetLeft + n.clientLeft + gutterLeft;\n width[cm.options.gutters[i]] = n.clientWidth;\n }\n return {fixedPos: compensateForHScroll(d),\n gutterTotalWidth: d.gutters.offsetWidth,\n gutterLeft: left,\n gutterWidth: width,\n wrapperWidth: d.wrapper.clientWidth}\n}\n\n// Computes display.scroller.scrollLeft + display.gutters.offsetWidth,\n// but using getBoundingClientRect to get a sub-pixel-accurate\n// result.\nfunction compensateForHScroll(display) {\n return display.scroller.getBoundingClientRect().left - display.sizer.getBoundingClientRect().left\n}\n\n// Returns a function that estimates the height of a line, to use as\n// first approximation until the line becomes visible (and is thus\n// properly measurable).\nfunction estimateHeight(cm) {\n var th = textHeight(cm.display), wrapping = cm.options.lineWrapping;\n var perLine = wrapping && Math.max(5, cm.display.scroller.clientWidth / charWidth(cm.display) - 3);\n return function (line) {\n if (lineIsHidden(cm.doc, line)) { return 0 }\n\n var widgetsHeight = 0;\n if (line.widgets) { for (var i = 0; i < line.widgets.length; i++) {\n if (line.widgets[i].height) { widgetsHeight += line.widgets[i].height; }\n } }\n\n if (wrapping)\n { return widgetsHeight + (Math.ceil(line.text.length / perLine) || 1) * th }\n else\n { return widgetsHeight + th }\n }\n}\n\nfunction estimateLineHeights(cm) {\n var doc = cm.doc, est = estimateHeight(cm);\n doc.iter(function (line) {\n var estHeight = est(line);\n if (estHeight != line.height) { updateLineHeight(line, estHeight); }\n });\n}\n\n// Given a mouse event, find the corresponding position. If liberal\n// is false, it checks whether a gutter or scrollbar was clicked,\n// and returns null if it was. forRect is used by rectangular\n// selections, and tries to estimate a character position even for\n// coordinates beyond the right of the text.\nfunction posFromMouse(cm, e, liberal, forRect) {\n var display = cm.display;\n if (!liberal && e_target(e).getAttribute(\"cm-not-content\") == \"true\") { return null }\n\n var x, y, space = display.lineSpace.getBoundingClientRect();\n // Fails unpredictably on IE[67] when mouse is dragged around quickly.\n try { x = e.clientX - space.left; y = e.clientY - space.top; }\n catch (e) { return null }\n var coords = coordsChar(cm, x, y), line;\n if (forRect && coords.xRel == 1 && (line = getLine(cm.doc, coords.line).text).length == coords.ch) {\n var colDiff = countColumn(line, line.length, cm.options.tabSize) - line.length;\n coords = Pos(coords.line, Math.max(0, Math.round((x - paddingH(cm.display).left) / charWidth(cm.display)) - colDiff));\n }\n return coords\n}\n\n// Find the view element corresponding to a given line. Return null\n// when the line isn't visible.\nfunction findViewIndex(cm, n) {\n if (n >= cm.display.viewTo) { return null }\n n -= cm.display.viewFrom;\n if (n < 0) { return null }\n var view = cm.display.view;\n for (var i = 0; i < view.length; i++) {\n n -= view[i].size;\n if (n < 0) { return i }\n }\n}\n\nfunction updateSelection(cm) {\n cm.display.input.showSelection(cm.display.input.prepareSelection());\n}\n\nfunction prepareSelection(cm, primary) {\n if ( primary === void 0 ) primary = true;\n\n var doc = cm.doc, result = {};\n var curFragment = result.cursors = document.createDocumentFragment();\n var selFragment = result.selection = document.createDocumentFragment();\n\n for (var i = 0; i < doc.sel.ranges.length; i++) {\n if (!primary && i == doc.sel.primIndex) { continue }\n var range$$1 = doc.sel.ranges[i];\n if (range$$1.from().line >= cm.display.viewTo || range$$1.to().line < cm.display.viewFrom) { continue }\n var collapsed = range$$1.empty();\n if (collapsed || cm.options.showCursorWhenSelecting)\n { drawSelectionCursor(cm, range$$1.head, curFragment); }\n if (!collapsed)\n { drawSelectionRange(cm, range$$1, selFragment); }\n }\n return result\n}\n\n// Draws a cursor for the given range\nfunction drawSelectionCursor(cm, head, output) {\n var pos = cursorCoords(cm, head, \"div\", null, null, !cm.options.singleCursorHeightPerLine);\n\n var cursor = output.appendChild(elt(\"div\", \"\\u00a0\", \"CodeMirror-cursor\"));\n cursor.style.left = pos.left + \"px\";\n cursor.style.top = pos.top + \"px\";\n cursor.style.height = Math.max(0, pos.bottom - pos.top) * cm.options.cursorHeight + \"px\";\n\n if (pos.other) {\n // Secondary cursor, shown when on a 'jump' in bi-directional text\n var otherCursor = output.appendChild(elt(\"div\", \"\\u00a0\", \"CodeMirror-cursor CodeMirror-secondarycursor\"));\n otherCursor.style.display = \"\";\n otherCursor.style.left = pos.other.left + \"px\";\n otherCursor.style.top = pos.other.top + \"px\";\n otherCursor.style.height = (pos.other.bottom - pos.other.top) * .85 + \"px\";\n }\n}\n\nfunction cmpCoords(a, b) { return a.top - b.top || a.left - b.left }\n\n// Draws the given range as a highlighted selection\nfunction drawSelectionRange(cm, range$$1, output) {\n var display = cm.display, doc = cm.doc;\n var fragment = document.createDocumentFragment();\n var padding = paddingH(cm.display), leftSide = padding.left;\n var rightSide = Math.max(display.sizerWidth, displayWidth(cm) - display.sizer.offsetLeft) - padding.right;\n var docLTR = doc.direction == \"ltr\";\n\n function add(left, top, width, bottom) {\n if (top < 0) { top = 0; }\n top = Math.round(top);\n bottom = Math.round(bottom);\n fragment.appendChild(elt(\"div\", null, \"CodeMirror-selected\", (\"position: absolute; left: \" + left + \"px;\\n top: \" + top + \"px; width: \" + (width == null ? rightSide - left : width) + \"px;\\n height: \" + (bottom - top) + \"px\")));\n }\n\n function drawForLine(line, fromArg, toArg) {\n var lineObj = getLine(doc, line);\n var lineLen = lineObj.text.length;\n var start, end;\n function coords(ch, bias) {\n return charCoords(cm, Pos(line, ch), \"div\", lineObj, bias)\n }\n\n function wrapX(pos, dir, side) {\n var extent = wrappedLineExtentChar(cm, lineObj, null, pos);\n var prop = (dir == \"ltr\") == (side == \"after\") ? \"left\" : \"right\";\n var ch = side == \"after\" ? extent.begin : extent.end - (/\\s/.test(lineObj.text.charAt(extent.end - 1)) ? 2 : 1);\n return coords(ch, prop)[prop]\n }\n\n var order = getOrder(lineObj, doc.direction);\n iterateBidiSections(order, fromArg || 0, toArg == null ? lineLen : toArg, function (from, to, dir, i) {\n var ltr = dir == \"ltr\";\n var fromPos = coords(from, ltr ? \"left\" : \"right\");\n var toPos = coords(to - 1, ltr ? \"right\" : \"left\");\n\n var openStart = fromArg == null && from == 0, openEnd = toArg == null && to == lineLen;\n var first = i == 0, last = !order || i == order.length - 1;\n if (toPos.top - fromPos.top <= 3) { // Single line\n var openLeft = (docLTR ? openStart : openEnd) && first;\n var openRight = (docLTR ? openEnd : openStart) && last;\n var left = openLeft ? leftSide : (ltr ? fromPos : toPos).left;\n var right = openRight ? rightSide : (ltr ? toPos : fromPos).right;\n add(left, fromPos.top, right - left, fromPos.bottom);\n } else { // Multiple lines\n var topLeft, topRight, botLeft, botRight;\n if (ltr) {\n topLeft = docLTR && openStart && first ? leftSide : fromPos.left;\n topRight = docLTR ? rightSide : wrapX(from, dir, \"before\");\n botLeft = docLTR ? leftSide : wrapX(to, dir, \"after\");\n botRight = docLTR && openEnd && last ? rightSide : toPos.right;\n } else {\n topLeft = !docLTR ? leftSide : wrapX(from, dir, \"before\");\n topRight = !docLTR && openStart && first ? rightSide : fromPos.right;\n botLeft = !docLTR && openEnd && last ? leftSide : toPos.left;\n botRight = !docLTR ? rightSide : wrapX(to, dir, \"after\");\n }\n add(topLeft, fromPos.top, topRight - topLeft, fromPos.bottom);\n if (fromPos.bottom < toPos.top) { add(leftSide, fromPos.bottom, null, toPos.top); }\n add(botLeft, toPos.top, botRight - botLeft, toPos.bottom);\n }\n\n if (!start || cmpCoords(fromPos, start) < 0) { start = fromPos; }\n if (cmpCoords(toPos, start) < 0) { start = toPos; }\n if (!end || cmpCoords(fromPos, end) < 0) { end = fromPos; }\n if (cmpCoords(toPos, end) < 0) { end = toPos; }\n });\n return {start: start, end: end}\n }\n\n var sFrom = range$$1.from(), sTo = range$$1.to();\n if (sFrom.line == sTo.line) {\n drawForLine(sFrom.line, sFrom.ch, sTo.ch);\n } else {\n var fromLine = getLine(doc, sFrom.line), toLine = getLine(doc, sTo.line);\n var singleVLine = visualLine(fromLine) == visualLine(toLine);\n var leftEnd = drawForLine(sFrom.line, sFrom.ch, singleVLine ? fromLine.text.length + 1 : null).end;\n var rightStart = drawForLine(sTo.line, singleVLine ? 0 : null, sTo.ch).start;\n if (singleVLine) {\n if (leftEnd.top < rightStart.top - 2) {\n add(leftEnd.right, leftEnd.top, null, leftEnd.bottom);\n add(leftSide, rightStart.top, rightStart.left, rightStart.bottom);\n } else {\n add(leftEnd.right, leftEnd.top, rightStart.left - leftEnd.right, leftEnd.bottom);\n }\n }\n if (leftEnd.bottom < rightStart.top)\n { add(leftSide, leftEnd.bottom, null, rightStart.top); }\n }\n\n output.appendChild(fragment);\n}\n\n// Cursor-blinking\nfunction restartBlink(cm) {\n if (!cm.state.focused) { return }\n var display = cm.display;\n clearInterval(display.blinker);\n var on = true;\n display.cursorDiv.style.visibility = \"\";\n if (cm.options.cursorBlinkRate > 0)\n { display.blinker = setInterval(function () { return display.cursorDiv.style.visibility = (on = !on) ? \"\" : \"hidden\"; },\n cm.options.cursorBlinkRate); }\n else if (cm.options.cursorBlinkRate < 0)\n { display.cursorDiv.style.visibility = \"hidden\"; }\n}\n\nfunction ensureFocus(cm) {\n if (!cm.state.focused) { cm.display.input.focus(); onFocus(cm); }\n}\n\nfunction delayBlurEvent(cm) {\n cm.state.delayingBlurEvent = true;\n setTimeout(function () { if (cm.state.delayingBlurEvent) {\n cm.state.delayingBlurEvent = false;\n onBlur(cm);\n } }, 100);\n}\n\nfunction onFocus(cm, e) {\n if (cm.state.delayingBlurEvent) { cm.state.delayingBlurEvent = false; }\n\n if (cm.options.readOnly == \"nocursor\") { return }\n if (!cm.state.focused) {\n signal(cm, \"focus\", cm, e);\n cm.state.focused = true;\n addClass(cm.display.wrapper, \"CodeMirror-focused\");\n // This test prevents this from firing when a context\n // menu is closed (since the input reset would kill the\n // select-all detection hack)\n if (!cm.curOp && cm.display.selForContextMenu != cm.doc.sel) {\n cm.display.input.reset();\n if (webkit) { setTimeout(function () { return cm.display.input.reset(true); }, 20); } // Issue #1730\n }\n cm.display.input.receivedFocus();\n }\n restartBlink(cm);\n}\nfunction onBlur(cm, e) {\n if (cm.state.delayingBlurEvent) { return }\n\n if (cm.state.focused) {\n signal(cm, \"blur\", cm, e);\n cm.state.focused = false;\n rmClass(cm.display.wrapper, \"CodeMirror-focused\");\n }\n clearInterval(cm.display.blinker);\n setTimeout(function () { if (!cm.state.focused) { cm.display.shift = false; } }, 150);\n}\n\n// Read the actual heights of the rendered lines, and update their\n// stored heights to match.\nfunction updateHeightsInViewport(cm) {\n var display = cm.display;\n var prevBottom = display.lineDiv.offsetTop;\n for (var i = 0; i < display.view.length; i++) {\n var cur = display.view[i], height = (void 0);\n if (cur.hidden) { continue }\n if (ie && ie_version < 8) {\n var bot = cur.node.offsetTop + cur.node.offsetHeight;\n height = bot - prevBottom;\n prevBottom = bot;\n } else {\n var box = cur.node.getBoundingClientRect();\n height = box.bottom - box.top;\n }\n var diff = cur.line.height - height;\n if (height < 2) { height = textHeight(display); }\n if (diff > .005 || diff < -.005) {\n updateLineHeight(cur.line, height);\n updateWidgetHeight(cur.line);\n if (cur.rest) { for (var j = 0; j < cur.rest.length; j++)\n { updateWidgetHeight(cur.rest[j]); } }\n }\n }\n}\n\n// Read and store the height of line widgets associated with the\n// given line.\nfunction updateWidgetHeight(line) {\n if (line.widgets) { for (var i = 0; i < line.widgets.length; ++i)\n { line.widgets[i].height = line.widgets[i].node.parentNode.offsetHeight; } }\n}\n\n// Compute the lines that are visible in a given viewport (defaults\n// the the current scroll position). viewport may contain top,\n// height, and ensure (see op.scrollToPos) properties.\nfunction visibleLines(display, doc, viewport) {\n var top = viewport && viewport.top != null ? Math.max(0, viewport.top) : display.scroller.scrollTop;\n top = Math.floor(top - paddingTop(display));\n var bottom = viewport && viewport.bottom != null ? viewport.bottom : top + display.wrapper.clientHeight;\n\n var from = lineAtHeight(doc, top), to = lineAtHeight(doc, bottom);\n // Ensure is a {from: {line, ch}, to: {line, ch}} object, and\n // forces those lines into the viewport (if possible).\n if (viewport && viewport.ensure) {\n var ensureFrom = viewport.ensure.from.line, ensureTo = viewport.ensure.to.line;\n if (ensureFrom < from) {\n from = ensureFrom;\n to = lineAtHeight(doc, heightAtLine(getLine(doc, ensureFrom)) + display.wrapper.clientHeight);\n } else if (Math.min(ensureTo, doc.lastLine()) >= to) {\n from = lineAtHeight(doc, heightAtLine(getLine(doc, ensureTo)) - display.wrapper.clientHeight);\n to = ensureTo;\n }\n }\n return {from: from, to: Math.max(to, from + 1)}\n}\n\n// Re-align line numbers and gutter marks to compensate for\n// horizontal scrolling.\nfunction alignHorizontally(cm) {\n var display = cm.display, view = display.view;\n if (!display.alignWidgets && (!display.gutters.firstChild || !cm.options.fixedGutter)) { return }\n var comp = compensateForHScroll(display) - display.scroller.scrollLeft + cm.doc.scrollLeft;\n var gutterW = display.gutters.offsetWidth, left = comp + \"px\";\n for (var i = 0; i < view.length; i++) { if (!view[i].hidden) {\n if (cm.options.fixedGutter) {\n if (view[i].gutter)\n { view[i].gutter.style.left = left; }\n if (view[i].gutterBackground)\n { view[i].gutterBackground.style.left = left; }\n }\n var align = view[i].alignable;\n if (align) { for (var j = 0; j < align.length; j++)\n { align[j].style.left = left; } }\n } }\n if (cm.options.fixedGutter)\n { display.gutters.style.left = (comp + gutterW) + \"px\"; }\n}\n\n// Used to ensure that the line number gutter is still the right\n// size for the current document size. Returns true when an update\n// is needed.\nfunction maybeUpdateLineNumberWidth(cm) {\n if (!cm.options.lineNumbers) { return false }\n var doc = cm.doc, last = lineNumberFor(cm.options, doc.first + doc.size - 1), display = cm.display;\n if (last.length != display.lineNumChars) {\n var test = display.measure.appendChild(elt(\"div\", [elt(\"div\", last)],\n \"CodeMirror-linenumber CodeMirror-gutter-elt\"));\n var innerW = test.firstChild.offsetWidth, padding = test.offsetWidth - innerW;\n display.lineGutter.style.width = \"\";\n display.lineNumInnerWidth = Math.max(innerW, display.lineGutter.offsetWidth - padding) + 1;\n display.lineNumWidth = display.lineNumInnerWidth + padding;\n display.lineNumChars = display.lineNumInnerWidth ? last.length : -1;\n display.lineGutter.style.width = display.lineNumWidth + \"px\";\n updateGutterSpace(cm);\n return true\n }\n return false\n}\n\n// SCROLLING THINGS INTO VIEW\n\n// If an editor sits on the top or bottom of the window, partially\n// scrolled out of view, this ensures that the cursor is visible.\nfunction maybeScrollWindow(cm, rect) {\n if (signalDOMEvent(cm, \"scrollCursorIntoView\")) { return }\n\n var display = cm.display, box = display.sizer.getBoundingClientRect(), doScroll = null;\n if (rect.top + box.top < 0) { doScroll = true; }\n else if (rect.bottom + box.top > (window.innerHeight || document.documentElement.clientHeight)) { doScroll = false; }\n if (doScroll != null && !phantom) {\n var scrollNode = elt(\"div\", \"\\u200b\", null, (\"position: absolute;\\n top: \" + (rect.top - display.viewOffset - paddingTop(cm.display)) + \"px;\\n height: \" + (rect.bottom - rect.top + scrollGap(cm) + display.barHeight) + \"px;\\n left: \" + (rect.left) + \"px; width: \" + (Math.max(2, rect.right - rect.left)) + \"px;\"));\n cm.display.lineSpace.appendChild(scrollNode);\n scrollNode.scrollIntoView(doScroll);\n cm.display.lineSpace.removeChild(scrollNode);\n }\n}\n\n// Scroll a given position into view (immediately), verifying that\n// it actually became visible (as line heights are accurately\n// measured, the position of something may 'drift' during drawing).\nfunction scrollPosIntoView(cm, pos, end, margin) {\n if (margin == null) { margin = 0; }\n var rect;\n if (!cm.options.lineWrapping && pos == end) {\n // Set pos and end to the cursor positions around the character pos sticks to\n // If pos.sticky == \"before\", that is around pos.ch - 1, otherwise around pos.ch\n // If pos == Pos(_, 0, \"before\"), pos and end are unchanged\n pos = pos.ch ? Pos(pos.line, pos.sticky == \"before\" ? pos.ch - 1 : pos.ch, \"after\") : pos;\n end = pos.sticky == \"before\" ? Pos(pos.line, pos.ch + 1, \"before\") : pos;\n }\n for (var limit = 0; limit < 5; limit++) {\n var changed = false;\n var coords = cursorCoords(cm, pos);\n var endCoords = !end || end == pos ? coords : cursorCoords(cm, end);\n rect = {left: Math.min(coords.left, endCoords.left),\n top: Math.min(coords.top, endCoords.top) - margin,\n right: Math.max(coords.left, endCoords.left),\n bottom: Math.max(coords.bottom, endCoords.bottom) + margin};\n var scrollPos = calculateScrollPos(cm, rect);\n var startTop = cm.doc.scrollTop, startLeft = cm.doc.scrollLeft;\n if (scrollPos.scrollTop != null) {\n updateScrollTop(cm, scrollPos.scrollTop);\n if (Math.abs(cm.doc.scrollTop - startTop) > 1) { changed = true; }\n }\n if (scrollPos.scrollLeft != null) {\n setScrollLeft(cm, scrollPos.scrollLeft);\n if (Math.abs(cm.doc.scrollLeft - startLeft) > 1) { changed = true; }\n }\n if (!changed) { break }\n }\n return rect\n}\n\n// Scroll a given set of coordinates into view (immediately).\nfunction scrollIntoView(cm, rect) {\n var scrollPos = calculateScrollPos(cm, rect);\n if (scrollPos.scrollTop != null) { updateScrollTop(cm, scrollPos.scrollTop); }\n if (scrollPos.scrollLeft != null) { setScrollLeft(cm, scrollPos.scrollLeft); }\n}\n\n// Calculate a new scroll position needed to scroll the given\n// rectangle into view. Returns an object with scrollTop and\n// scrollLeft properties. When these are undefined, the\n// vertical/horizontal position does not need to be adjusted.\nfunction calculateScrollPos(cm, rect) {\n var display = cm.display, snapMargin = textHeight(cm.display);\n if (rect.top < 0) { rect.top = 0; }\n var screentop = cm.curOp && cm.curOp.scrollTop != null ? cm.curOp.scrollTop : display.scroller.scrollTop;\n var screen = displayHeight(cm), result = {};\n if (rect.bottom - rect.top > screen) { rect.bottom = rect.top + screen; }\n var docBottom = cm.doc.height + paddingVert(display);\n var atTop = rect.top < snapMargin, atBottom = rect.bottom > docBottom - snapMargin;\n if (rect.top < screentop) {\n result.scrollTop = atTop ? 0 : rect.top;\n } else if (rect.bottom > screentop + screen) {\n var newTop = Math.min(rect.top, (atBottom ? docBottom : rect.bottom) - screen);\n if (newTop != screentop) { result.scrollTop = newTop; }\n }\n\n var screenleft = cm.curOp && cm.curOp.scrollLeft != null ? cm.curOp.scrollLeft : display.scroller.scrollLeft;\n var screenw = displayWidth(cm) - (cm.options.fixedGutter ? display.gutters.offsetWidth : 0);\n var tooWide = rect.right - rect.left > screenw;\n if (tooWide) { rect.right = rect.left + screenw; }\n if (rect.left < 10)\n { result.scrollLeft = 0; }\n else if (rect.left < screenleft)\n { result.scrollLeft = Math.max(0, rect.left - (tooWide ? 0 : 10)); }\n else if (rect.right > screenw + screenleft - 3)\n { result.scrollLeft = rect.right + (tooWide ? 0 : 10) - screenw; }\n return result\n}\n\n// Store a relative adjustment to the scroll position in the current\n// operation (to be applied when the operation finishes).\nfunction addToScrollTop(cm, top) {\n if (top == null) { return }\n resolveScrollToPos(cm);\n cm.curOp.scrollTop = (cm.curOp.scrollTop == null ? cm.doc.scrollTop : cm.curOp.scrollTop) + top;\n}\n\n// Make sure that at the end of the operation the current cursor is\n// shown.\nfunction ensureCursorVisible(cm) {\n resolveScrollToPos(cm);\n var cur = cm.getCursor();\n cm.curOp.scrollToPos = {from: cur, to: cur, margin: cm.options.cursorScrollMargin};\n}\n\nfunction scrollToCoords(cm, x, y) {\n if (x != null || y != null) { resolveScrollToPos(cm); }\n if (x != null) { cm.curOp.scrollLeft = x; }\n if (y != null) { cm.curOp.scrollTop = y; }\n}\n\nfunction scrollToRange(cm, range$$1) {\n resolveScrollToPos(cm);\n cm.curOp.scrollToPos = range$$1;\n}\n\n// When an operation has its scrollToPos property set, and another\n// scroll action is applied before the end of the operation, this\n// 'simulates' scrolling that position into view in a cheap way, so\n// that the effect of intermediate scroll commands is not ignored.\nfunction resolveScrollToPos(cm) {\n var range$$1 = cm.curOp.scrollToPos;\n if (range$$1) {\n cm.curOp.scrollToPos = null;\n var from = estimateCoords(cm, range$$1.from), to = estimateCoords(cm, range$$1.to);\n scrollToCoordsRange(cm, from, to, range$$1.margin);\n }\n}\n\nfunction scrollToCoordsRange(cm, from, to, margin) {\n var sPos = calculateScrollPos(cm, {\n left: Math.min(from.left, to.left),\n top: Math.min(from.top, to.top) - margin,\n right: Math.max(from.right, to.right),\n bottom: Math.max(from.bottom, to.bottom) + margin\n });\n scrollToCoords(cm, sPos.scrollLeft, sPos.scrollTop);\n}\n\n// Sync the scrollable area and scrollbars, ensure the viewport\n// covers the visible area.\nfunction updateScrollTop(cm, val) {\n if (Math.abs(cm.doc.scrollTop - val) < 2) { return }\n if (!gecko) { updateDisplaySimple(cm, {top: val}); }\n setScrollTop(cm, val, true);\n if (gecko) { updateDisplaySimple(cm); }\n startWorker(cm, 100);\n}\n\nfunction setScrollTop(cm, val, forceScroll) {\n val = Math.min(cm.display.scroller.scrollHeight - cm.display.scroller.clientHeight, val);\n if (cm.display.scroller.scrollTop == val && !forceScroll) { return }\n cm.doc.scrollTop = val;\n cm.display.scrollbars.setScrollTop(val);\n if (cm.display.scroller.scrollTop != val) { cm.display.scroller.scrollTop = val; }\n}\n\n// Sync scroller and scrollbar, ensure the gutter elements are\n// aligned.\nfunction setScrollLeft(cm, val, isScroller, forceScroll) {\n val = Math.min(val, cm.display.scroller.scrollWidth - cm.display.scroller.clientWidth);\n if ((isScroller ? val == cm.doc.scrollLeft : Math.abs(cm.doc.scrollLeft - val) < 2) && !forceScroll) { return }\n cm.doc.scrollLeft = val;\n alignHorizontally(cm);\n if (cm.display.scroller.scrollLeft != val) { cm.display.scroller.scrollLeft = val; }\n cm.display.scrollbars.setScrollLeft(val);\n}\n\n// SCROLLBARS\n\n// Prepare DOM reads needed to update the scrollbars. Done in one\n// shot to minimize update/measure roundtrips.\nfunction measureForScrollbars(cm) {\n var d = cm.display, gutterW = d.gutters.offsetWidth;\n var docH = Math.round(cm.doc.height + paddingVert(cm.display));\n return {\n clientHeight: d.scroller.clientHeight,\n viewHeight: d.wrapper.clientHeight,\n scrollWidth: d.scroller.scrollWidth, clientWidth: d.scroller.clientWidth,\n viewWidth: d.wrapper.clientWidth,\n barLeft: cm.options.fixedGutter ? gutterW : 0,\n docHeight: docH,\n scrollHeight: docH + scrollGap(cm) + d.barHeight,\n nativeBarWidth: d.nativeBarWidth,\n gutterWidth: gutterW\n }\n}\n\nvar NativeScrollbars = function(place, scroll, cm) {\n this.cm = cm;\n var vert = this.vert = elt(\"div\", [elt(\"div\", null, null, \"min-width: 1px\")], \"CodeMirror-vscrollbar\");\n var horiz = this.horiz = elt(\"div\", [elt(\"div\", null, null, \"height: 100%; min-height: 1px\")], \"CodeMirror-hscrollbar\");\n place(vert); place(horiz);\n\n on(vert, \"scroll\", function () {\n if (vert.clientHeight) { scroll(vert.scrollTop, \"vertical\"); }\n });\n on(horiz, \"scroll\", function () {\n if (horiz.clientWidth) { scroll(horiz.scrollLeft, \"horizontal\"); }\n });\n\n this.checkedZeroWidth = false;\n // Need to set a minimum width to see the scrollbar on IE7 (but must not set it on IE8).\n if (ie && ie_version < 8) { this.horiz.style.minHeight = this.vert.style.minWidth = \"18px\"; }\n};\n\nNativeScrollbars.prototype.update = function (measure) {\n var needsH = measure.scrollWidth > measure.clientWidth + 1;\n var needsV = measure.scrollHeight > measure.clientHeight + 1;\n var sWidth = measure.nativeBarWidth;\n\n if (needsV) {\n this.vert.style.display = \"block\";\n this.vert.style.bottom = needsH ? sWidth + \"px\" : \"0\";\n var totalHeight = measure.viewHeight - (needsH ? sWidth : 0);\n // A bug in IE8 can cause this value to be negative, so guard it.\n this.vert.firstChild.style.height =\n Math.max(0, measure.scrollHeight - measure.clientHeight + totalHeight) + \"px\";\n } else {\n this.vert.style.display = \"\";\n this.vert.firstChild.style.height = \"0\";\n }\n\n if (needsH) {\n this.horiz.style.display = \"block\";\n this.horiz.style.right = needsV ? sWidth + \"px\" : \"0\";\n this.horiz.style.left = measure.barLeft + \"px\";\n var totalWidth = measure.viewWidth - measure.barLeft - (needsV ? sWidth : 0);\n this.horiz.firstChild.style.width =\n Math.max(0, measure.scrollWidth - measure.clientWidth + totalWidth) + \"px\";\n } else {\n this.horiz.style.display = \"\";\n this.horiz.firstChild.style.width = \"0\";\n }\n\n if (!this.checkedZeroWidth && measure.clientHeight > 0) {\n if (sWidth == 0) { this.zeroWidthHack(); }\n this.checkedZeroWidth = true;\n }\n\n return {right: needsV ? sWidth : 0, bottom: needsH ? sWidth : 0}\n};\n\nNativeScrollbars.prototype.setScrollLeft = function (pos) {\n if (this.horiz.scrollLeft != pos) { this.horiz.scrollLeft = pos; }\n if (this.disableHoriz) { this.enableZeroWidthBar(this.horiz, this.disableHoriz, \"horiz\"); }\n};\n\nNativeScrollbars.prototype.setScrollTop = function (pos) {\n if (this.vert.scrollTop != pos) { this.vert.scrollTop = pos; }\n if (this.disableVert) { this.enableZeroWidthBar(this.vert, this.disableVert, \"vert\"); }\n};\n\nNativeScrollbars.prototype.zeroWidthHack = function () {\n var w = mac && !mac_geMountainLion ? \"12px\" : \"18px\";\n this.horiz.style.height = this.vert.style.width = w;\n this.horiz.style.pointerEvents = this.vert.style.pointerEvents = \"none\";\n this.disableHoriz = new Delayed;\n this.disableVert = new Delayed;\n};\n\nNativeScrollbars.prototype.enableZeroWidthBar = function (bar, delay, type) {\n bar.style.pointerEvents = \"auto\";\n function maybeDisable() {\n // To find out whether the scrollbar is still visible, we\n // check whether the element under the pixel in the bottom\n // right corner of the scrollbar box is the scrollbar box\n // itself (when the bar is still visible) or its filler child\n // (when the bar is hidden). If it is still visible, we keep\n // it enabled, if it's hidden, we disable pointer events.\n var box = bar.getBoundingClientRect();\n var elt$$1 = type == \"vert\" ? document.elementFromPoint(box.right - 1, (box.top + box.bottom) / 2)\n : document.elementFromPoint((box.right + box.left) / 2, box.bottom - 1);\n if (elt$$1 != bar) { bar.style.pointerEvents = \"none\"; }\n else { delay.set(1000, maybeDisable); }\n }\n delay.set(1000, maybeDisable);\n};\n\nNativeScrollbars.prototype.clear = function () {\n var parent = this.horiz.parentNode;\n parent.removeChild(this.horiz);\n parent.removeChild(this.vert);\n};\n\nvar NullScrollbars = function () {};\n\nNullScrollbars.prototype.update = function () { return {bottom: 0, right: 0} };\nNullScrollbars.prototype.setScrollLeft = function () {};\nNullScrollbars.prototype.setScrollTop = function () {};\nNullScrollbars.prototype.clear = function () {};\n\nfunction updateScrollbars(cm, measure) {\n if (!measure) { measure = measureForScrollbars(cm); }\n var startWidth = cm.display.barWidth, startHeight = cm.display.barHeight;\n updateScrollbarsInner(cm, measure);\n for (var i = 0; i < 4 && startWidth != cm.display.barWidth || startHeight != cm.display.barHeight; i++) {\n if (startWidth != cm.display.barWidth && cm.options.lineWrapping)\n { updateHeightsInViewport(cm); }\n updateScrollbarsInner(cm, measureForScrollbars(cm));\n startWidth = cm.display.barWidth; startHeight = cm.display.barHeight;\n }\n}\n\n// Re-synchronize the fake scrollbars with the actual size of the\n// content.\nfunction updateScrollbarsInner(cm, measure) {\n var d = cm.display;\n var sizes = d.scrollbars.update(measure);\n\n d.sizer.style.paddingRight = (d.barWidth = sizes.right) + \"px\";\n d.sizer.style.paddingBottom = (d.barHeight = sizes.bottom) + \"px\";\n d.heightForcer.style.borderBottom = sizes.bottom + \"px solid transparent\";\n\n if (sizes.right && sizes.bottom) {\n d.scrollbarFiller.style.display = \"block\";\n d.scrollbarFiller.style.height = sizes.bottom + \"px\";\n d.scrollbarFiller.style.width = sizes.right + \"px\";\n } else { d.scrollbarFiller.style.display = \"\"; }\n if (sizes.bottom && cm.options.coverGutterNextToScrollbar && cm.options.fixedGutter) {\n d.gutterFiller.style.display = \"block\";\n d.gutterFiller.style.height = sizes.bottom + \"px\";\n d.gutterFiller.style.width = measure.gutterWidth + \"px\";\n } else { d.gutterFiller.style.display = \"\"; }\n}\n\nvar scrollbarModel = {\"native\": NativeScrollbars, \"null\": NullScrollbars};\n\nfunction initScrollbars(cm) {\n if (cm.display.scrollbars) {\n cm.display.scrollbars.clear();\n if (cm.display.scrollbars.addClass)\n { rmClass(cm.display.wrapper, cm.display.scrollbars.addClass); }\n }\n\n cm.display.scrollbars = new scrollbarModel[cm.options.scrollbarStyle](function (node) {\n cm.display.wrapper.insertBefore(node, cm.display.scrollbarFiller);\n // Prevent clicks in the scrollbars from killing focus\n on(node, \"mousedown\", function () {\n if (cm.state.focused) { setTimeout(function () { return cm.display.input.focus(); }, 0); }\n });\n node.setAttribute(\"cm-not-content\", \"true\");\n }, function (pos, axis) {\n if (axis == \"horizontal\") { setScrollLeft(cm, pos); }\n else { updateScrollTop(cm, pos); }\n }, cm);\n if (cm.display.scrollbars.addClass)\n { addClass(cm.display.wrapper, cm.display.scrollbars.addClass); }\n}\n\n// Operations are used to wrap a series of changes to the editor\n// state in such a way that each change won't have to update the\n// cursor and display (which would be awkward, slow, and\n// error-prone). Instead, display updates are batched and then all\n// combined and executed at once.\n\nvar nextOpId = 0;\n// Start a new operation.\nfunction startOperation(cm) {\n cm.curOp = {\n cm: cm,\n viewChanged: false, // Flag that indicates that lines might need to be redrawn\n startHeight: cm.doc.height, // Used to detect need to update scrollbar\n forceUpdate: false, // Used to force a redraw\n updateInput: null, // Whether to reset the input textarea\n typing: false, // Whether this reset should be careful to leave existing text (for compositing)\n changeObjs: null, // Accumulated changes, for firing change events\n cursorActivityHandlers: null, // Set of handlers to fire cursorActivity on\n cursorActivityCalled: 0, // Tracks which cursorActivity handlers have been called already\n selectionChanged: false, // Whether the selection needs to be redrawn\n updateMaxLine: false, // Set when the widest line needs to be determined anew\n scrollLeft: null, scrollTop: null, // Intermediate scroll position, not pushed to DOM yet\n scrollToPos: null, // Used to scroll to a specific position\n focus: false,\n id: ++nextOpId // Unique ID\n };\n pushOperation(cm.curOp);\n}\n\n// Finish an operation, updating the display and signalling delayed events\nfunction endOperation(cm) {\n var op = cm.curOp;\n finishOperation(op, function (group) {\n for (var i = 0; i < group.ops.length; i++)\n { group.ops[i].cm.curOp = null; }\n endOperations(group);\n });\n}\n\n// The DOM updates done when an operation finishes are batched so\n// that the minimum number of relayouts are required.\nfunction endOperations(group) {\n var ops = group.ops;\n for (var i = 0; i < ops.length; i++) // Read DOM\n { endOperation_R1(ops[i]); }\n for (var i$1 = 0; i$1 < ops.length; i$1++) // Write DOM (maybe)\n { endOperation_W1(ops[i$1]); }\n for (var i$2 = 0; i$2 < ops.length; i$2++) // Read DOM\n { endOperation_R2(ops[i$2]); }\n for (var i$3 = 0; i$3 < ops.length; i$3++) // Write DOM (maybe)\n { endOperation_W2(ops[i$3]); }\n for (var i$4 = 0; i$4 < ops.length; i$4++) // Read DOM\n { endOperation_finish(ops[i$4]); }\n}\n\nfunction endOperation_R1(op) {\n var cm = op.cm, display = cm.display;\n maybeClipScrollbars(cm);\n if (op.updateMaxLine) { findMaxLine(cm); }\n\n op.mustUpdate = op.viewChanged || op.forceUpdate || op.scrollTop != null ||\n op.scrollToPos && (op.scrollToPos.from.line < display.viewFrom ||\n op.scrollToPos.to.line >= display.viewTo) ||\n display.maxLineChanged && cm.options.lineWrapping;\n op.update = op.mustUpdate &&\n new DisplayUpdate(cm, op.mustUpdate && {top: op.scrollTop, ensure: op.scrollToPos}, op.forceUpdate);\n}\n\nfunction endOperation_W1(op) {\n op.updatedDisplay = op.mustUpdate && updateDisplayIfNeeded(op.cm, op.update);\n}\n\nfunction endOperation_R2(op) {\n var cm = op.cm, display = cm.display;\n if (op.updatedDisplay) { updateHeightsInViewport(cm); }\n\n op.barMeasure = measureForScrollbars(cm);\n\n // If the max line changed since it was last measured, measure it,\n // and ensure the document's width matches it.\n // updateDisplay_W2 will use these properties to do the actual resizing\n if (display.maxLineChanged && !cm.options.lineWrapping) {\n op.adjustWidthTo = measureChar(cm, display.maxLine, display.maxLine.text.length).left + 3;\n cm.display.sizerWidth = op.adjustWidthTo;\n op.barMeasure.scrollWidth =\n Math.max(display.scroller.clientWidth, display.sizer.offsetLeft + op.adjustWidthTo + scrollGap(cm) + cm.display.barWidth);\n op.maxScrollLeft = Math.max(0, display.sizer.offsetLeft + op.adjustWidthTo - displayWidth(cm));\n }\n\n if (op.updatedDisplay || op.selectionChanged)\n { op.preparedSelection = display.input.prepareSelection(); }\n}\n\nfunction endOperation_W2(op) {\n var cm = op.cm;\n\n if (op.adjustWidthTo != null) {\n cm.display.sizer.style.minWidth = op.adjustWidthTo + \"px\";\n if (op.maxScrollLeft < cm.doc.scrollLeft)\n { setScrollLeft(cm, Math.min(cm.display.scroller.scrollLeft, op.maxScrollLeft), true); }\n cm.display.maxLineChanged = false;\n }\n\n var takeFocus = op.focus && op.focus == activeElt();\n if (op.preparedSelection)\n { cm.display.input.showSelection(op.preparedSelection, takeFocus); }\n if (op.updatedDisplay || op.startHeight != cm.doc.height)\n { updateScrollbars(cm, op.barMeasure); }\n if (op.updatedDisplay)\n { setDocumentHeight(cm, op.barMeasure); }\n\n if (op.selectionChanged) { restartBlink(cm); }\n\n if (cm.state.focused && op.updateInput)\n { cm.display.input.reset(op.typing); }\n if (takeFocus) { ensureFocus(op.cm); }\n}\n\nfunction endOperation_finish(op) {\n var cm = op.cm, display = cm.display, doc = cm.doc;\n\n if (op.updatedDisplay) { postUpdateDisplay(cm, op.update); }\n\n // Abort mouse wheel delta measurement, when scrolling explicitly\n if (display.wheelStartX != null && (op.scrollTop != null || op.scrollLeft != null || op.scrollToPos))\n { display.wheelStartX = display.wheelStartY = null; }\n\n // Propagate the scroll position to the actual DOM scroller\n if (op.scrollTop != null) { setScrollTop(cm, op.scrollTop, op.forceScroll); }\n\n if (op.scrollLeft != null) { setScrollLeft(cm, op.scrollLeft, true, true); }\n // If we need to scroll a specific position into view, do so.\n if (op.scrollToPos) {\n var rect = scrollPosIntoView(cm, clipPos(doc, op.scrollToPos.from),\n clipPos(doc, op.scrollToPos.to), op.scrollToPos.margin);\n maybeScrollWindow(cm, rect);\n }\n\n // Fire events for markers that are hidden/unidden by editing or\n // undoing\n var hidden = op.maybeHiddenMarkers, unhidden = op.maybeUnhiddenMarkers;\n if (hidden) { for (var i = 0; i < hidden.length; ++i)\n { if (!hidden[i].lines.length) { signal(hidden[i], \"hide\"); } } }\n if (unhidden) { for (var i$1 = 0; i$1 < unhidden.length; ++i$1)\n { if (unhidden[i$1].lines.length) { signal(unhidden[i$1], \"unhide\"); } } }\n\n if (display.wrapper.offsetHeight)\n { doc.scrollTop = cm.display.scroller.scrollTop; }\n\n // Fire change events, and delayed event handlers\n if (op.changeObjs)\n { signal(cm, \"changes\", cm, op.changeObjs); }\n if (op.update)\n { op.update.finish(); }\n}\n\n// Run the given function in an operation\nfunction runInOp(cm, f) {\n if (cm.curOp) { return f() }\n startOperation(cm);\n try { return f() }\n finally { endOperation(cm); }\n}\n// Wraps a function in an operation. Returns the wrapped function.\nfunction operation(cm, f) {\n return function() {\n if (cm.curOp) { return f.apply(cm, arguments) }\n startOperation(cm);\n try { return f.apply(cm, arguments) }\n finally { endOperation(cm); }\n }\n}\n// Used to add methods to editor and doc instances, wrapping them in\n// operations.\nfunction methodOp(f) {\n return function() {\n if (this.curOp) { return f.apply(this, arguments) }\n startOperation(this);\n try { return f.apply(this, arguments) }\n finally { endOperation(this); }\n }\n}\nfunction docMethodOp(f) {\n return function() {\n var cm = this.cm;\n if (!cm || cm.curOp) { return f.apply(this, arguments) }\n startOperation(cm);\n try { return f.apply(this, arguments) }\n finally { endOperation(cm); }\n }\n}\n\n// Updates the display.view data structure for a given change to the\n// document. From and to are in pre-change coordinates. Lendiff is\n// the amount of lines added or subtracted by the change. This is\n// used for changes that span multiple lines, or change the way\n// lines are divided into visual lines. regLineChange (below)\n// registers single-line changes.\nfunction regChange(cm, from, to, lendiff) {\n if (from == null) { from = cm.doc.first; }\n if (to == null) { to = cm.doc.first + cm.doc.size; }\n if (!lendiff) { lendiff = 0; }\n\n var display = cm.display;\n if (lendiff && to < display.viewTo &&\n (display.updateLineNumbers == null || display.updateLineNumbers > from))\n { display.updateLineNumbers = from; }\n\n cm.curOp.viewChanged = true;\n\n if (from >= display.viewTo) { // Change after\n if (sawCollapsedSpans && visualLineNo(cm.doc, from) < display.viewTo)\n { resetView(cm); }\n } else if (to <= display.viewFrom) { // Change before\n if (sawCollapsedSpans && visualLineEndNo(cm.doc, to + lendiff) > display.viewFrom) {\n resetView(cm);\n } else {\n display.viewFrom += lendiff;\n display.viewTo += lendiff;\n }\n } else if (from <= display.viewFrom && to >= display.viewTo) { // Full overlap\n resetView(cm);\n } else if (from <= display.viewFrom) { // Top overlap\n var cut = viewCuttingPoint(cm, to, to + lendiff, 1);\n if (cut) {\n display.view = display.view.slice(cut.index);\n display.viewFrom = cut.lineN;\n display.viewTo += lendiff;\n } else {\n resetView(cm);\n }\n } else if (to >= display.viewTo) { // Bottom overlap\n var cut$1 = viewCuttingPoint(cm, from, from, -1);\n if (cut$1) {\n display.view = display.view.slice(0, cut$1.index);\n display.viewTo = cut$1.lineN;\n } else {\n resetView(cm);\n }\n } else { // Gap in the middle\n var cutTop = viewCuttingPoint(cm, from, from, -1);\n var cutBot = viewCuttingPoint(cm, to, to + lendiff, 1);\n if (cutTop && cutBot) {\n display.view = display.view.slice(0, cutTop.index)\n .concat(buildViewArray(cm, cutTop.lineN, cutBot.lineN))\n .concat(display.view.slice(cutBot.index));\n display.viewTo += lendiff;\n } else {\n resetView(cm);\n }\n }\n\n var ext = display.externalMeasured;\n if (ext) {\n if (to < ext.lineN)\n { ext.lineN += lendiff; }\n else if (from < ext.lineN + ext.size)\n { display.externalMeasured = null; }\n }\n}\n\n// Register a change to a single line. Type must be one of \"text\",\n// \"gutter\", \"class\", \"widget\"\nfunction regLineChange(cm, line, type) {\n cm.curOp.viewChanged = true;\n var display = cm.display, ext = cm.display.externalMeasured;\n if (ext && line >= ext.lineN && line < ext.lineN + ext.size)\n { display.externalMeasured = null; }\n\n if (line < display.viewFrom || line >= display.viewTo) { return }\n var lineView = display.view[findViewIndex(cm, line)];\n if (lineView.node == null) { return }\n var arr = lineView.changes || (lineView.changes = []);\n if (indexOf(arr, type) == -1) { arr.push(type); }\n}\n\n// Clear the view.\nfunction resetView(cm) {\n cm.display.viewFrom = cm.display.viewTo = cm.doc.first;\n cm.display.view = [];\n cm.display.viewOffset = 0;\n}\n\nfunction viewCuttingPoint(cm, oldN, newN, dir) {\n var index = findViewIndex(cm, oldN), diff, view = cm.display.view;\n if (!sawCollapsedSpans || newN == cm.doc.first + cm.doc.size)\n { return {index: index, lineN: newN} }\n var n = cm.display.viewFrom;\n for (var i = 0; i < index; i++)\n { n += view[i].size; }\n if (n != oldN) {\n if (dir > 0) {\n if (index == view.length - 1) { return null }\n diff = (n + view[index].size) - oldN;\n index++;\n } else {\n diff = n - oldN;\n }\n oldN += diff; newN += diff;\n }\n while (visualLineNo(cm.doc, newN) != newN) {\n if (index == (dir < 0 ? 0 : view.length - 1)) { return null }\n newN += dir * view[index - (dir < 0 ? 1 : 0)].size;\n index += dir;\n }\n return {index: index, lineN: newN}\n}\n\n// Force the view to cover a given range, adding empty view element\n// or clipping off existing ones as needed.\nfunction adjustView(cm, from, to) {\n var display = cm.display, view = display.view;\n if (view.length == 0 || from >= display.viewTo || to <= display.viewFrom) {\n display.view = buildViewArray(cm, from, to);\n display.viewFrom = from;\n } else {\n if (display.viewFrom > from)\n { display.view = buildViewArray(cm, from, display.viewFrom).concat(display.view); }\n else if (display.viewFrom < from)\n { display.view = display.view.slice(findViewIndex(cm, from)); }\n display.viewFrom = from;\n if (display.viewTo < to)\n { display.view = display.view.concat(buildViewArray(cm, display.viewTo, to)); }\n else if (display.viewTo > to)\n { display.view = display.view.slice(0, findViewIndex(cm, to)); }\n }\n display.viewTo = to;\n}\n\n// Count the number of lines in the view whose DOM representation is\n// out of date (or nonexistent).\nfunction countDirtyView(cm) {\n var view = cm.display.view, dirty = 0;\n for (var i = 0; i < view.length; i++) {\n var lineView = view[i];\n if (!lineView.hidden && (!lineView.node || lineView.changes)) { ++dirty; }\n }\n return dirty\n}\n\n// HIGHLIGHT WORKER\n\nfunction startWorker(cm, time) {\n if (cm.doc.highlightFrontier < cm.display.viewTo)\n { cm.state.highlight.set(time, bind(highlightWorker, cm)); }\n}\n\nfunction highlightWorker(cm) {\n var doc = cm.doc;\n if (doc.highlightFrontier >= cm.display.viewTo) { return }\n var end = +new Date + cm.options.workTime;\n var context = getContextBefore(cm, doc.highlightFrontier);\n var changedLines = [];\n\n doc.iter(context.line, Math.min(doc.first + doc.size, cm.display.viewTo + 500), function (line) {\n if (context.line >= cm.display.viewFrom) { // Visible\n var oldStyles = line.styles;\n var resetState = line.text.length > cm.options.maxHighlightLength ? copyState(doc.mode, context.state) : null;\n var highlighted = highlightLine(cm, line, context, true);\n if (resetState) { context.state = resetState; }\n line.styles = highlighted.styles;\n var oldCls = line.styleClasses, newCls = highlighted.classes;\n if (newCls) { line.styleClasses = newCls; }\n else if (oldCls) { line.styleClasses = null; }\n var ischange = !oldStyles || oldStyles.length != line.styles.length ||\n oldCls != newCls && (!oldCls || !newCls || oldCls.bgClass != newCls.bgClass || oldCls.textClass != newCls.textClass);\n for (var i = 0; !ischange && i < oldStyles.length; ++i) { ischange = oldStyles[i] != line.styles[i]; }\n if (ischange) { changedLines.push(context.line); }\n line.stateAfter = context.save();\n context.nextLine();\n } else {\n if (line.text.length <= cm.options.maxHighlightLength)\n { processLine(cm, line.text, context); }\n line.stateAfter = context.line % 5 == 0 ? context.save() : null;\n context.nextLine();\n }\n if (+new Date > end) {\n startWorker(cm, cm.options.workDelay);\n return true\n }\n });\n doc.highlightFrontier = context.line;\n doc.modeFrontier = Math.max(doc.modeFrontier, context.line);\n if (changedLines.length) { runInOp(cm, function () {\n for (var i = 0; i < changedLines.length; i++)\n { regLineChange(cm, changedLines[i], \"text\"); }\n }); }\n}\n\n// DISPLAY DRAWING\n\nvar DisplayUpdate = function(cm, viewport, force) {\n var display = cm.display;\n\n this.viewport = viewport;\n // Store some values that we'll need later (but don't want to force a relayout for)\n this.visible = visibleLines(display, cm.doc, viewport);\n this.editorIsHidden = !display.wrapper.offsetWidth;\n this.wrapperHeight = display.wrapper.clientHeight;\n this.wrapperWidth = display.wrapper.clientWidth;\n this.oldDisplayWidth = displayWidth(cm);\n this.force = force;\n this.dims = getDimensions(cm);\n this.events = [];\n};\n\nDisplayUpdate.prototype.signal = function (emitter, type) {\n if (hasHandler(emitter, type))\n { this.events.push(arguments); }\n};\nDisplayUpdate.prototype.finish = function () {\n var this$1 = this;\n\n for (var i = 0; i < this.events.length; i++)\n { signal.apply(null, this$1.events[i]); }\n};\n\nfunction maybeClipScrollbars(cm) {\n var display = cm.display;\n if (!display.scrollbarsClipped && display.scroller.offsetWidth) {\n display.nativeBarWidth = display.scroller.offsetWidth - display.scroller.clientWidth;\n display.heightForcer.style.height = scrollGap(cm) + \"px\";\n display.sizer.style.marginBottom = -display.nativeBarWidth + \"px\";\n display.sizer.style.borderRightWidth = scrollGap(cm) + \"px\";\n display.scrollbarsClipped = true;\n }\n}\n\nfunction selectionSnapshot(cm) {\n if (cm.hasFocus()) { return null }\n var active = activeElt();\n if (!active || !contains(cm.display.lineDiv, active)) { return null }\n var result = {activeElt: active};\n if (window.getSelection) {\n var sel = window.getSelection();\n if (sel.anchorNode && sel.extend && contains(cm.display.lineDiv, sel.anchorNode)) {\n result.anchorNode = sel.anchorNode;\n result.anchorOffset = sel.anchorOffset;\n result.focusNode = sel.focusNode;\n result.focusOffset = sel.focusOffset;\n }\n }\n return result\n}\n\nfunction restoreSelection(snapshot) {\n if (!snapshot || !snapshot.activeElt || snapshot.activeElt == activeElt()) { return }\n snapshot.activeElt.focus();\n if (snapshot.anchorNode && contains(document.body, snapshot.anchorNode) && contains(document.body, snapshot.focusNode)) {\n var sel = window.getSelection(), range$$1 = document.createRange();\n range$$1.setEnd(snapshot.anchorNode, snapshot.anchorOffset);\n range$$1.collapse(false);\n sel.removeAllRanges();\n sel.addRange(range$$1);\n sel.extend(snapshot.focusNode, snapshot.focusOffset);\n }\n}\n\n// Does the actual updating of the line display. Bails out\n// (returning false) when there is nothing to be done and forced is\n// false.\nfunction updateDisplayIfNeeded(cm, update) {\n var display = cm.display, doc = cm.doc;\n\n if (update.editorIsHidden) {\n resetView(cm);\n return false\n }\n\n // Bail out if the visible area is already rendered and nothing changed.\n if (!update.force &&\n update.visible.from >= display.viewFrom && update.visible.to <= display.viewTo &&\n (display.updateLineNumbers == null || display.updateLineNumbers >= display.viewTo) &&\n display.renderedView == display.view && countDirtyView(cm) == 0)\n { return false }\n\n if (maybeUpdateLineNumberWidth(cm)) {\n resetView(cm);\n update.dims = getDimensions(cm);\n }\n\n // Compute a suitable new viewport (from & to)\n var end = doc.first + doc.size;\n var from = Math.max(update.visible.from - cm.options.viewportMargin, doc.first);\n var to = Math.min(end, update.visible.to + cm.options.viewportMargin);\n if (display.viewFrom < from && from - display.viewFrom < 20) { from = Math.max(doc.first, display.viewFrom); }\n if (display.viewTo > to && display.viewTo - to < 20) { to = Math.min(end, display.viewTo); }\n if (sawCollapsedSpans) {\n from = visualLineNo(cm.doc, from);\n to = visualLineEndNo(cm.doc, to);\n }\n\n var different = from != display.viewFrom || to != display.viewTo ||\n display.lastWrapHeight != update.wrapperHeight || display.lastWrapWidth != update.wrapperWidth;\n adjustView(cm, from, to);\n\n display.viewOffset = heightAtLine(getLine(cm.doc, display.viewFrom));\n // Position the mover div to align with the current scroll position\n cm.display.mover.style.top = display.viewOffset + \"px\";\n\n var toUpdate = countDirtyView(cm);\n if (!different && toUpdate == 0 && !update.force && display.renderedView == display.view &&\n (display.updateLineNumbers == null || display.updateLineNumbers >= display.viewTo))\n { return false }\n\n // For big changes, we hide the enclosing element during the\n // update, since that speeds up the operations on most browsers.\n var selSnapshot = selectionSnapshot(cm);\n if (toUpdate > 4) { display.lineDiv.style.display = \"none\"; }\n patchDisplay(cm, display.updateLineNumbers, update.dims);\n if (toUpdate > 4) { display.lineDiv.style.display = \"\"; }\n display.renderedView = display.view;\n // There might have been a widget with a focused element that got\n // hidden or updated, if so re-focus it.\n restoreSelection(selSnapshot);\n\n // Prevent selection and cursors from interfering with the scroll\n // width and height.\n removeChildren(display.cursorDiv);\n removeChildren(display.selectionDiv);\n display.gutters.style.height = display.sizer.style.minHeight = 0;\n\n if (different) {\n display.lastWrapHeight = update.wrapperHeight;\n display.lastWrapWidth = update.wrapperWidth;\n startWorker(cm, 400);\n }\n\n display.updateLineNumbers = null;\n\n return true\n}\n\nfunction postUpdateDisplay(cm, update) {\n var viewport = update.viewport;\n\n for (var first = true;; first = false) {\n if (!first || !cm.options.lineWrapping || update.oldDisplayWidth == displayWidth(cm)) {\n // Clip forced viewport to actual scrollable area.\n if (viewport && viewport.top != null)\n { viewport = {top: Math.min(cm.doc.height + paddingVert(cm.display) - displayHeight(cm), viewport.top)}; }\n // Updated line heights might result in the drawn area not\n // actually covering the viewport. Keep looping until it does.\n update.visible = visibleLines(cm.display, cm.doc, viewport);\n if (update.visible.from >= cm.display.viewFrom && update.visible.to <= cm.display.viewTo)\n { break }\n }\n if (!updateDisplayIfNeeded(cm, update)) { break }\n updateHeightsInViewport(cm);\n var barMeasure = measureForScrollbars(cm);\n updateSelection(cm);\n updateScrollbars(cm, barMeasure);\n setDocumentHeight(cm, barMeasure);\n update.force = false;\n }\n\n update.signal(cm, \"update\", cm);\n if (cm.display.viewFrom != cm.display.reportedViewFrom || cm.display.viewTo != cm.display.reportedViewTo) {\n update.signal(cm, \"viewportChange\", cm, cm.display.viewFrom, cm.display.viewTo);\n cm.display.reportedViewFrom = cm.display.viewFrom; cm.display.reportedViewTo = cm.display.viewTo;\n }\n}\n\nfunction updateDisplaySimple(cm, viewport) {\n var update = new DisplayUpdate(cm, viewport);\n if (updateDisplayIfNeeded(cm, update)) {\n updateHeightsInViewport(cm);\n postUpdateDisplay(cm, update);\n var barMeasure = measureForScrollbars(cm);\n updateSelection(cm);\n updateScrollbars(cm, barMeasure);\n setDocumentHeight(cm, barMeasure);\n update.finish();\n }\n}\n\n// Sync the actual display DOM structure with display.view, removing\n// nodes for lines that are no longer in view, and creating the ones\n// that are not there yet, and updating the ones that are out of\n// date.\nfunction patchDisplay(cm, updateNumbersFrom, dims) {\n var display = cm.display, lineNumbers = cm.options.lineNumbers;\n var container = display.lineDiv, cur = container.firstChild;\n\n function rm(node) {\n var next = node.nextSibling;\n // Works around a throw-scroll bug in OS X Webkit\n if (webkit && mac && cm.display.currentWheelTarget == node)\n { node.style.display = \"none\"; }\n else\n { node.parentNode.removeChild(node); }\n return next\n }\n\n var view = display.view, lineN = display.viewFrom;\n // Loop over the elements in the view, syncing cur (the DOM nodes\n // in display.lineDiv) with the view as we go.\n for (var i = 0; i < view.length; i++) {\n var lineView = view[i];\n if (lineView.hidden) {\n } else if (!lineView.node || lineView.node.parentNode != container) { // Not drawn yet\n var node = buildLineElement(cm, lineView, lineN, dims);\n container.insertBefore(node, cur);\n } else { // Already drawn\n while (cur != lineView.node) { cur = rm(cur); }\n var updateNumber = lineNumbers && updateNumbersFrom != null &&\n updateNumbersFrom <= lineN && lineView.lineNumber;\n if (lineView.changes) {\n if (indexOf(lineView.changes, \"gutter\") > -1) { updateNumber = false; }\n updateLineForChanges(cm, lineView, lineN, dims);\n }\n if (updateNumber) {\n removeChildren(lineView.lineNumber);\n lineView.lineNumber.appendChild(document.createTextNode(lineNumberFor(cm.options, lineN)));\n }\n cur = lineView.node.nextSibling;\n }\n lineN += lineView.size;\n }\n while (cur) { cur = rm(cur); }\n}\n\nfunction updateGutterSpace(cm) {\n var width = cm.display.gutters.offsetWidth;\n cm.display.sizer.style.marginLeft = width + \"px\";\n}\n\nfunction setDocumentHeight(cm, measure) {\n cm.display.sizer.style.minHeight = measure.docHeight + \"px\";\n cm.display.heightForcer.style.top = measure.docHeight + \"px\";\n cm.display.gutters.style.height = (measure.docHeight + cm.display.barHeight + scrollGap(cm)) + \"px\";\n}\n\n// Rebuild the gutter elements, ensure the margin to the left of the\n// code matches their width.\nfunction updateGutters(cm) {\n var gutters = cm.display.gutters, specs = cm.options.gutters;\n removeChildren(gutters);\n var i = 0;\n for (; i < specs.length; ++i) {\n var gutterClass = specs[i];\n var gElt = gutters.appendChild(elt(\"div\", null, \"CodeMirror-gutter \" + gutterClass));\n if (gutterClass == \"CodeMirror-linenumbers\") {\n cm.display.lineGutter = gElt;\n gElt.style.width = (cm.display.lineNumWidth || 1) + \"px\";\n }\n }\n gutters.style.display = i ? \"\" : \"none\";\n updateGutterSpace(cm);\n}\n\n// Make sure the gutters options contains the element\n// \"CodeMirror-linenumbers\" when the lineNumbers option is true.\nfunction setGuttersForLineNumbers(options) {\n var found = indexOf(options.gutters, \"CodeMirror-linenumbers\");\n if (found == -1 && options.lineNumbers) {\n options.gutters = options.gutters.concat([\"CodeMirror-linenumbers\"]);\n } else if (found > -1 && !options.lineNumbers) {\n options.gutters = options.gutters.slice(0);\n options.gutters.splice(found, 1);\n }\n}\n\n// Since the delta values reported on mouse wheel events are\n// unstandardized between browsers and even browser versions, and\n// generally horribly unpredictable, this code starts by measuring\n// the scroll effect that the first few mouse wheel events have,\n// and, from that, detects the way it can convert deltas to pixel\n// offsets afterwards.\n//\n// The reason we want to know the amount a wheel event will scroll\n// is that it gives us a chance to update the display before the\n// actual scrolling happens, reducing flickering.\n\nvar wheelSamples = 0;\nvar wheelPixelsPerUnit = null;\n// Fill in a browser-detected starting value on browsers where we\n// know one. These don't have to be accurate -- the result of them\n// being wrong would just be a slight flicker on the first wheel\n// scroll (if it is large enough).\nif (ie) { wheelPixelsPerUnit = -.53; }\nelse if (gecko) { wheelPixelsPerUnit = 15; }\nelse if (chrome) { wheelPixelsPerUnit = -.7; }\nelse if (safari) { wheelPixelsPerUnit = -1/3; }\n\nfunction wheelEventDelta(e) {\n var dx = e.wheelDeltaX, dy = e.wheelDeltaY;\n if (dx == null && e.detail && e.axis == e.HORIZONTAL_AXIS) { dx = e.detail; }\n if (dy == null && e.detail && e.axis == e.VERTICAL_AXIS) { dy = e.detail; }\n else if (dy == null) { dy = e.wheelDelta; }\n return {x: dx, y: dy}\n}\nfunction wheelEventPixels(e) {\n var delta = wheelEventDelta(e);\n delta.x *= wheelPixelsPerUnit;\n delta.y *= wheelPixelsPerUnit;\n return delta\n}\n\nfunction onScrollWheel(cm, e) {\n var delta = wheelEventDelta(e), dx = delta.x, dy = delta.y;\n\n var display = cm.display, scroll = display.scroller;\n // Quit if there's nothing to scroll here\n var canScrollX = scroll.scrollWidth > scroll.clientWidth;\n var canScrollY = scroll.scrollHeight > scroll.clientHeight;\n if (!(dx && canScrollX || dy && canScrollY)) { return }\n\n // Webkit browsers on OS X abort momentum scrolls when the target\n // of the scroll event is removed from the scrollable element.\n // This hack (see related code in patchDisplay) makes sure the\n // element is kept around.\n if (dy && mac && webkit) {\n outer: for (var cur = e.target, view = display.view; cur != scroll; cur = cur.parentNode) {\n for (var i = 0; i < view.length; i++) {\n if (view[i].node == cur) {\n cm.display.currentWheelTarget = cur;\n break outer\n }\n }\n }\n }\n\n // On some browsers, horizontal scrolling will cause redraws to\n // happen before the gutter has been realigned, causing it to\n // wriggle around in a most unseemly way. When we have an\n // estimated pixels/delta value, we just handle horizontal\n // scrolling entirely here. It'll be slightly off from native, but\n // better than glitching out.\n if (dx && !gecko && !presto && wheelPixelsPerUnit != null) {\n if (dy && canScrollY)\n { updateScrollTop(cm, Math.max(0, scroll.scrollTop + dy * wheelPixelsPerUnit)); }\n setScrollLeft(cm, Math.max(0, scroll.scrollLeft + dx * wheelPixelsPerUnit));\n // Only prevent default scrolling if vertical scrolling is\n // actually possible. Otherwise, it causes vertical scroll\n // jitter on OSX trackpads when deltaX is small and deltaY\n // is large (issue #3579)\n if (!dy || (dy && canScrollY))\n { e_preventDefault(e); }\n display.wheelStartX = null; // Abort measurement, if in progress\n return\n }\n\n // 'Project' the visible viewport to cover the area that is being\n // scrolled into view (if we know enough to estimate it).\n if (dy && wheelPixelsPerUnit != null) {\n var pixels = dy * wheelPixelsPerUnit;\n var top = cm.doc.scrollTop, bot = top + display.wrapper.clientHeight;\n if (pixels < 0) { top = Math.max(0, top + pixels - 50); }\n else { bot = Math.min(cm.doc.height, bot + pixels + 50); }\n updateDisplaySimple(cm, {top: top, bottom: bot});\n }\n\n if (wheelSamples < 20) {\n if (display.wheelStartX == null) {\n display.wheelStartX = scroll.scrollLeft; display.wheelStartY = scroll.scrollTop;\n display.wheelDX = dx; display.wheelDY = dy;\n setTimeout(function () {\n if (display.wheelStartX == null) { return }\n var movedX = scroll.scrollLeft - display.wheelStartX;\n var movedY = scroll.scrollTop - display.wheelStartY;\n var sample = (movedY && display.wheelDY && movedY / display.wheelDY) ||\n (movedX && display.wheelDX && movedX / display.wheelDX);\n display.wheelStartX = display.wheelStartY = null;\n if (!sample) { return }\n wheelPixelsPerUnit = (wheelPixelsPerUnit * wheelSamples + sample) / (wheelSamples + 1);\n ++wheelSamples;\n }, 200);\n } else {\n display.wheelDX += dx; display.wheelDY += dy;\n }\n }\n}\n\n// Selection objects are immutable. A new one is created every time\n// the selection changes. A selection is one or more non-overlapping\n// (and non-touching) ranges, sorted, and an integer that indicates\n// which one is the primary selection (the one that's scrolled into\n// view, that getCursor returns, etc).\nvar Selection = function(ranges, primIndex) {\n this.ranges = ranges;\n this.primIndex = primIndex;\n};\n\nSelection.prototype.primary = function () { return this.ranges[this.primIndex] };\n\nSelection.prototype.equals = function (other) {\n var this$1 = this;\n\n if (other == this) { return true }\n if (other.primIndex != this.primIndex || other.ranges.length != this.ranges.length) { return false }\n for (var i = 0; i < this.ranges.length; i++) {\n var here = this$1.ranges[i], there = other.ranges[i];\n if (!equalCursorPos(here.anchor, there.anchor) || !equalCursorPos(here.head, there.head)) { return false }\n }\n return true\n};\n\nSelection.prototype.deepCopy = function () {\n var this$1 = this;\n\n var out = [];\n for (var i = 0; i < this.ranges.length; i++)\n { out[i] = new Range(copyPos(this$1.ranges[i].anchor), copyPos(this$1.ranges[i].head)); }\n return new Selection(out, this.primIndex)\n};\n\nSelection.prototype.somethingSelected = function () {\n var this$1 = this;\n\n for (var i = 0; i < this.ranges.length; i++)\n { if (!this$1.ranges[i].empty()) { return true } }\n return false\n};\n\nSelection.prototype.contains = function (pos, end) {\n var this$1 = this;\n\n if (!end) { end = pos; }\n for (var i = 0; i < this.ranges.length; i++) {\n var range = this$1.ranges[i];\n if (cmp(end, range.from()) >= 0 && cmp(pos, range.to()) <= 0)\n { return i }\n }\n return -1\n};\n\nvar Range = function(anchor, head) {\n this.anchor = anchor; this.head = head;\n};\n\nRange.prototype.from = function () { return minPos(this.anchor, this.head) };\nRange.prototype.to = function () { return maxPos(this.anchor, this.head) };\nRange.prototype.empty = function () { return this.head.line == this.anchor.line && this.head.ch == this.anchor.ch };\n\n// Take an unsorted, potentially overlapping set of ranges, and\n// build a selection out of it. 'Consumes' ranges array (modifying\n// it).\nfunction normalizeSelection(ranges, primIndex) {\n var prim = ranges[primIndex];\n ranges.sort(function (a, b) { return cmp(a.from(), b.from()); });\n primIndex = indexOf(ranges, prim);\n for (var i = 1; i < ranges.length; i++) {\n var cur = ranges[i], prev = ranges[i - 1];\n if (cmp(prev.to(), cur.from()) >= 0) {\n var from = minPos(prev.from(), cur.from()), to = maxPos(prev.to(), cur.to());\n var inv = prev.empty() ? cur.from() == cur.head : prev.from() == prev.head;\n if (i <= primIndex) { --primIndex; }\n ranges.splice(--i, 2, new Range(inv ? to : from, inv ? from : to));\n }\n }\n return new Selection(ranges, primIndex)\n}\n\nfunction simpleSelection(anchor, head) {\n return new Selection([new Range(anchor, head || anchor)], 0)\n}\n\n// Compute the position of the end of a change (its 'to' property\n// refers to the pre-change end).\nfunction changeEnd(change) {\n if (!change.text) { return change.to }\n return Pos(change.from.line + change.text.length - 1,\n lst(change.text).length + (change.text.length == 1 ? change.from.ch : 0))\n}\n\n// Adjust a position to refer to the post-change position of the\n// same text, or the end of the change if the change covers it.\nfunction adjustForChange(pos, change) {\n if (cmp(pos, change.from) < 0) { return pos }\n if (cmp(pos, change.to) <= 0) { return changeEnd(change) }\n\n var line = pos.line + change.text.length - (change.to.line - change.from.line) - 1, ch = pos.ch;\n if (pos.line == change.to.line) { ch += changeEnd(change).ch - change.to.ch; }\n return Pos(line, ch)\n}\n\nfunction computeSelAfterChange(doc, change) {\n var out = [];\n for (var i = 0; i < doc.sel.ranges.length; i++) {\n var range = doc.sel.ranges[i];\n out.push(new Range(adjustForChange(range.anchor, change),\n adjustForChange(range.head, change)));\n }\n return normalizeSelection(out, doc.sel.primIndex)\n}\n\nfunction offsetPos(pos, old, nw) {\n if (pos.line == old.line)\n { return Pos(nw.line, pos.ch - old.ch + nw.ch) }\n else\n { return Pos(nw.line + (pos.line - old.line), pos.ch) }\n}\n\n// Used by replaceSelections to allow moving the selection to the\n// start or around the replaced test. Hint may be \"start\" or \"around\".\nfunction computeReplacedSel(doc, changes, hint) {\n var out = [];\n var oldPrev = Pos(doc.first, 0), newPrev = oldPrev;\n for (var i = 0; i < changes.length; i++) {\n var change = changes[i];\n var from = offsetPos(change.from, oldPrev, newPrev);\n var to = offsetPos(changeEnd(change), oldPrev, newPrev);\n oldPrev = change.to;\n newPrev = to;\n if (hint == \"around\") {\n var range = doc.sel.ranges[i], inv = cmp(range.head, range.anchor) < 0;\n out[i] = new Range(inv ? to : from, inv ? from : to);\n } else {\n out[i] = new Range(from, from);\n }\n }\n return new Selection(out, doc.sel.primIndex)\n}\n\n// Used to get the editor into a consistent state again when options change.\n\nfunction loadMode(cm) {\n cm.doc.mode = getMode(cm.options, cm.doc.modeOption);\n resetModeState(cm);\n}\n\nfunction resetModeState(cm) {\n cm.doc.iter(function (line) {\n if (line.stateAfter) { line.stateAfter = null; }\n if (line.styles) { line.styles = null; }\n });\n cm.doc.modeFrontier = cm.doc.highlightFrontier = cm.doc.first;\n startWorker(cm, 100);\n cm.state.modeGen++;\n if (cm.curOp) { regChange(cm); }\n}\n\n// DOCUMENT DATA STRUCTURE\n\n// By default, updates that start and end at the beginning of a line\n// are treated specially, in order to make the association of line\n// widgets and marker elements with the text behave more intuitive.\nfunction isWholeLineUpdate(doc, change) {\n return change.from.ch == 0 && change.to.ch == 0 && lst(change.text) == \"\" &&\n (!doc.cm || doc.cm.options.wholeLineUpdateBefore)\n}\n\n// Perform a change on the document data structure.\nfunction updateDoc(doc, change, markedSpans, estimateHeight$$1) {\n function spansFor(n) {return markedSpans ? markedSpans[n] : null}\n function update(line, text, spans) {\n updateLine(line, text, spans, estimateHeight$$1);\n signalLater(line, \"change\", line, change);\n }\n function linesFor(start, end) {\n var result = [];\n for (var i = start; i < end; ++i)\n { result.push(new Line(text[i], spansFor(i), estimateHeight$$1)); }\n return result\n }\n\n var from = change.from, to = change.to, text = change.text;\n var firstLine = getLine(doc, from.line), lastLine = getLine(doc, to.line);\n var lastText = lst(text), lastSpans = spansFor(text.length - 1), nlines = to.line - from.line;\n\n // Adjust the line structure\n if (change.full) {\n doc.insert(0, linesFor(0, text.length));\n doc.remove(text.length, doc.size - text.length);\n } else if (isWholeLineUpdate(doc, change)) {\n // This is a whole-line replace. Treated specially to make\n // sure line objects move the way they are supposed to.\n var added = linesFor(0, text.length - 1);\n update(lastLine, lastLine.text, lastSpans);\n if (nlines) { doc.remove(from.line, nlines); }\n if (added.length) { doc.insert(from.line, added); }\n } else if (firstLine == lastLine) {\n if (text.length == 1) {\n update(firstLine, firstLine.text.slice(0, from.ch) + lastText + firstLine.text.slice(to.ch), lastSpans);\n } else {\n var added$1 = linesFor(1, text.length - 1);\n added$1.push(new Line(lastText + firstLine.text.slice(to.ch), lastSpans, estimateHeight$$1));\n update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0));\n doc.insert(from.line + 1, added$1);\n }\n } else if (text.length == 1) {\n update(firstLine, firstLine.text.slice(0, from.ch) + text[0] + lastLine.text.slice(to.ch), spansFor(0));\n doc.remove(from.line + 1, nlines);\n } else {\n update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0));\n update(lastLine, lastText + lastLine.text.slice(to.ch), lastSpans);\n var added$2 = linesFor(1, text.length - 1);\n if (nlines > 1) { doc.remove(from.line + 1, nlines - 1); }\n doc.insert(from.line + 1, added$2);\n }\n\n signalLater(doc, \"change\", doc, change);\n}\n\n// Call f for all linked documents.\nfunction linkedDocs(doc, f, sharedHistOnly) {\n function propagate(doc, skip, sharedHist) {\n if (doc.linked) { for (var i = 0; i < doc.linked.length; ++i) {\n var rel = doc.linked[i];\n if (rel.doc == skip) { continue }\n var shared = sharedHist && rel.sharedHist;\n if (sharedHistOnly && !shared) { continue }\n f(rel.doc, shared);\n propagate(rel.doc, doc, shared);\n } }\n }\n propagate(doc, null, true);\n}\n\n// Attach a document to an editor.\nfunction attachDoc(cm, doc) {\n if (doc.cm) { throw new Error(\"This document is already in use.\") }\n cm.doc = doc;\n doc.cm = cm;\n estimateLineHeights(cm);\n loadMode(cm);\n setDirectionClass(cm);\n if (!cm.options.lineWrapping) { findMaxLine(cm); }\n cm.options.mode = doc.modeOption;\n regChange(cm);\n}\n\nfunction setDirectionClass(cm) {\n (cm.doc.direction == \"rtl\" ? addClass : rmClass)(cm.display.lineDiv, \"CodeMirror-rtl\");\n}\n\nfunction directionChanged(cm) {\n runInOp(cm, function () {\n setDirectionClass(cm);\n regChange(cm);\n });\n}\n\nfunction History(startGen) {\n // Arrays of change events and selections. Doing something adds an\n // event to done and clears undo. Undoing moves events from done\n // to undone, redoing moves them in the other direction.\n this.done = []; this.undone = [];\n this.undoDepth = Infinity;\n // Used to track when changes can be merged into a single undo\n // event\n this.lastModTime = this.lastSelTime = 0;\n this.lastOp = this.lastSelOp = null;\n this.lastOrigin = this.lastSelOrigin = null;\n // Used by the isClean() method\n this.generation = this.maxGeneration = startGen || 1;\n}\n\n// Create a history change event from an updateDoc-style change\n// object.\nfunction historyChangeFromChange(doc, change) {\n var histChange = {from: copyPos(change.from), to: changeEnd(change), text: getBetween(doc, change.from, change.to)};\n attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1);\n linkedDocs(doc, function (doc) { return attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1); }, true);\n return histChange\n}\n\n// Pop all selection events off the end of a history array. Stop at\n// a change event.\nfunction clearSelectionEvents(array) {\n while (array.length) {\n var last = lst(array);\n if (last.ranges) { array.pop(); }\n else { break }\n }\n}\n\n// Find the top change event in the history. Pop off selection\n// events that are in the way.\nfunction lastChangeEvent(hist, force) {\n if (force) {\n clearSelectionEvents(hist.done);\n return lst(hist.done)\n } else if (hist.done.length && !lst(hist.done).ranges) {\n return lst(hist.done)\n } else if (hist.done.length > 1 && !hist.done[hist.done.length - 2].ranges) {\n hist.done.pop();\n return lst(hist.done)\n }\n}\n\n// Register a change in the history. Merges changes that are within\n// a single operation, or are close together with an origin that\n// allows merging (starting with \"+\") into a single event.\nfunction addChangeToHistory(doc, change, selAfter, opId) {\n var hist = doc.history;\n hist.undone.length = 0;\n var time = +new Date, cur;\n var last;\n\n if ((hist.lastOp == opId ||\n hist.lastOrigin == change.origin && change.origin &&\n ((change.origin.charAt(0) == \"+\" && doc.cm && hist.lastModTime > time - doc.cm.options.historyEventDelay) ||\n change.origin.charAt(0) == \"*\")) &&\n (cur = lastChangeEvent(hist, hist.lastOp == opId))) {\n // Merge this change into the last event\n last = lst(cur.changes);\n if (cmp(change.from, change.to) == 0 && cmp(change.from, last.to) == 0) {\n // Optimized case for simple insertion -- don't want to add\n // new changesets for every character typed\n last.to = changeEnd(change);\n } else {\n // Add new sub-event\n cur.changes.push(historyChangeFromChange(doc, change));\n }\n } else {\n // Can not be merged, start a new event.\n var before = lst(hist.done);\n if (!before || !before.ranges)\n { pushSelectionToHistory(doc.sel, hist.done); }\n cur = {changes: [historyChangeFromChange(doc, change)],\n generation: hist.generation};\n hist.done.push(cur);\n while (hist.done.length > hist.undoDepth) {\n hist.done.shift();\n if (!hist.done[0].ranges) { hist.done.shift(); }\n }\n }\n hist.done.push(selAfter);\n hist.generation = ++hist.maxGeneration;\n hist.lastModTime = hist.lastSelTime = time;\n hist.lastOp = hist.lastSelOp = opId;\n hist.lastOrigin = hist.lastSelOrigin = change.origin;\n\n if (!last) { signal(doc, \"historyAdded\"); }\n}\n\nfunction selectionEventCanBeMerged(doc, origin, prev, sel) {\n var ch = origin.charAt(0);\n return ch == \"*\" ||\n ch == \"+\" &&\n prev.ranges.length == sel.ranges.length &&\n prev.somethingSelected() == sel.somethingSelected() &&\n new Date - doc.history.lastSelTime <= (doc.cm ? doc.cm.options.historyEventDelay : 500)\n}\n\n// Called whenever the selection changes, sets the new selection as\n// the pending selection in the history, and pushes the old pending\n// selection into the 'done' array when it was significantly\n// different (in number of selected ranges, emptiness, or time).\nfunction addSelectionToHistory(doc, sel, opId, options) {\n var hist = doc.history, origin = options && options.origin;\n\n // A new event is started when the previous origin does not match\n // the current, or the origins don't allow matching. Origins\n // starting with * are always merged, those starting with + are\n // merged when similar and close together in time.\n if (opId == hist.lastSelOp ||\n (origin && hist.lastSelOrigin == origin &&\n (hist.lastModTime == hist.lastSelTime && hist.lastOrigin == origin ||\n selectionEventCanBeMerged(doc, origin, lst(hist.done), sel))))\n { hist.done[hist.done.length - 1] = sel; }\n else\n { pushSelectionToHistory(sel, hist.done); }\n\n hist.lastSelTime = +new Date;\n hist.lastSelOrigin = origin;\n hist.lastSelOp = opId;\n if (options && options.clearRedo !== false)\n { clearSelectionEvents(hist.undone); }\n}\n\nfunction pushSelectionToHistory(sel, dest) {\n var top = lst(dest);\n if (!(top && top.ranges && top.equals(sel)))\n { dest.push(sel); }\n}\n\n// Used to store marked span information in the history.\nfunction attachLocalSpans(doc, change, from, to) {\n var existing = change[\"spans_\" + doc.id], n = 0;\n doc.iter(Math.max(doc.first, from), Math.min(doc.first + doc.size, to), function (line) {\n if (line.markedSpans)\n { (existing || (existing = change[\"spans_\" + doc.id] = {}))[n] = line.markedSpans; }\n ++n;\n });\n}\n\n// When un/re-doing restores text containing marked spans, those\n// that have been explicitly cleared should not be restored.\nfunction removeClearedSpans(spans) {\n if (!spans) { return null }\n var out;\n for (var i = 0; i < spans.length; ++i) {\n if (spans[i].marker.explicitlyCleared) { if (!out) { out = spans.slice(0, i); } }\n else if (out) { out.push(spans[i]); }\n }\n return !out ? spans : out.length ? out : null\n}\n\n// Retrieve and filter the old marked spans stored in a change event.\nfunction getOldSpans(doc, change) {\n var found = change[\"spans_\" + doc.id];\n if (!found) { return null }\n var nw = [];\n for (var i = 0; i < change.text.length; ++i)\n { nw.push(removeClearedSpans(found[i])); }\n return nw\n}\n\n// Used for un/re-doing changes from the history. Combines the\n// result of computing the existing spans with the set of spans that\n// existed in the history (so that deleting around a span and then\n// undoing brings back the span).\nfunction mergeOldSpans(doc, change) {\n var old = getOldSpans(doc, change);\n var stretched = stretchSpansOverChange(doc, change);\n if (!old) { return stretched }\n if (!stretched) { return old }\n\n for (var i = 0; i < old.length; ++i) {\n var oldCur = old[i], stretchCur = stretched[i];\n if (oldCur && stretchCur) {\n spans: for (var j = 0; j < stretchCur.length; ++j) {\n var span = stretchCur[j];\n for (var k = 0; k < oldCur.length; ++k)\n { if (oldCur[k].marker == span.marker) { continue spans } }\n oldCur.push(span);\n }\n } else if (stretchCur) {\n old[i] = stretchCur;\n }\n }\n return old\n}\n\n// Used both to provide a JSON-safe object in .getHistory, and, when\n// detaching a document, to split the history in two\nfunction copyHistoryArray(events, newGroup, instantiateSel) {\n var copy = [];\n for (var i = 0; i < events.length; ++i) {\n var event = events[i];\n if (event.ranges) {\n copy.push(instantiateSel ? Selection.prototype.deepCopy.call(event) : event);\n continue\n }\n var changes = event.changes, newChanges = [];\n copy.push({changes: newChanges});\n for (var j = 0; j < changes.length; ++j) {\n var change = changes[j], m = (void 0);\n newChanges.push({from: change.from, to: change.to, text: change.text});\n if (newGroup) { for (var prop in change) { if (m = prop.match(/^spans_(\\d+)$/)) {\n if (indexOf(newGroup, Number(m[1])) > -1) {\n lst(newChanges)[prop] = change[prop];\n delete change[prop];\n }\n } } }\n }\n }\n return copy\n}\n\n// The 'scroll' parameter given to many of these indicated whether\n// the new cursor position should be scrolled into view after\n// modifying the selection.\n\n// If shift is held or the extend flag is set, extends a range to\n// include a given position (and optionally a second position).\n// Otherwise, simply returns the range between the given positions.\n// Used for cursor motion and such.\nfunction extendRange(range, head, other, extend) {\n if (extend) {\n var anchor = range.anchor;\n if (other) {\n var posBefore = cmp(head, anchor) < 0;\n if (posBefore != (cmp(other, anchor) < 0)) {\n anchor = head;\n head = other;\n } else if (posBefore != (cmp(head, other) < 0)) {\n head = other;\n }\n }\n return new Range(anchor, head)\n } else {\n return new Range(other || head, head)\n }\n}\n\n// Extend the primary selection range, discard the rest.\nfunction extendSelection(doc, head, other, options, extend) {\n if (extend == null) { extend = doc.cm && (doc.cm.display.shift || doc.extend); }\n setSelection(doc, new Selection([extendRange(doc.sel.primary(), head, other, extend)], 0), options);\n}\n\n// Extend all selections (pos is an array of selections with length\n// equal the number of selections)\nfunction extendSelections(doc, heads, options) {\n var out = [];\n var extend = doc.cm && (doc.cm.display.shift || doc.extend);\n for (var i = 0; i < doc.sel.ranges.length; i++)\n { out[i] = extendRange(doc.sel.ranges[i], heads[i], null, extend); }\n var newSel = normalizeSelection(out, doc.sel.primIndex);\n setSelection(doc, newSel, options);\n}\n\n// Updates a single range in the selection.\nfunction replaceOneSelection(doc, i, range, options) {\n var ranges = doc.sel.ranges.slice(0);\n ranges[i] = range;\n setSelection(doc, normalizeSelection(ranges, doc.sel.primIndex), options);\n}\n\n// Reset the selection to a single range.\nfunction setSimpleSelection(doc, anchor, head, options) {\n setSelection(doc, simpleSelection(anchor, head), options);\n}\n\n// Give beforeSelectionChange handlers a change to influence a\n// selection update.\nfunction filterSelectionChange(doc, sel, options) {\n var obj = {\n ranges: sel.ranges,\n update: function(ranges) {\n var this$1 = this;\n\n this.ranges = [];\n for (var i = 0; i < ranges.length; i++)\n { this$1.ranges[i] = new Range(clipPos(doc, ranges[i].anchor),\n clipPos(doc, ranges[i].head)); }\n },\n origin: options && options.origin\n };\n signal(doc, \"beforeSelectionChange\", doc, obj);\n if (doc.cm) { signal(doc.cm, \"beforeSelectionChange\", doc.cm, obj); }\n if (obj.ranges != sel.ranges) { return normalizeSelection(obj.ranges, obj.ranges.length - 1) }\n else { return sel }\n}\n\nfunction setSelectionReplaceHistory(doc, sel, options) {\n var done = doc.history.done, last = lst(done);\n if (last && last.ranges) {\n done[done.length - 1] = sel;\n setSelectionNoUndo(doc, sel, options);\n } else {\n setSelection(doc, sel, options);\n }\n}\n\n// Set a new selection.\nfunction setSelection(doc, sel, options) {\n setSelectionNoUndo(doc, sel, options);\n addSelectionToHistory(doc, doc.sel, doc.cm ? doc.cm.curOp.id : NaN, options);\n}\n\nfunction setSelectionNoUndo(doc, sel, options) {\n if (hasHandler(doc, \"beforeSelectionChange\") || doc.cm && hasHandler(doc.cm, \"beforeSelectionChange\"))\n { sel = filterSelectionChange(doc, sel, options); }\n\n var bias = options && options.bias ||\n (cmp(sel.primary().head, doc.sel.primary().head) < 0 ? -1 : 1);\n setSelectionInner(doc, skipAtomicInSelection(doc, sel, bias, true));\n\n if (!(options && options.scroll === false) && doc.cm)\n { ensureCursorVisible(doc.cm); }\n}\n\nfunction setSelectionInner(doc, sel) {\n if (sel.equals(doc.sel)) { return }\n\n doc.sel = sel;\n\n if (doc.cm) {\n doc.cm.curOp.updateInput = doc.cm.curOp.selectionChanged = true;\n signalCursorActivity(doc.cm);\n }\n signalLater(doc, \"cursorActivity\", doc);\n}\n\n// Verify that the selection does not partially select any atomic\n// marked ranges.\nfunction reCheckSelection(doc) {\n setSelectionInner(doc, skipAtomicInSelection(doc, doc.sel, null, false));\n}\n\n// Return a selection that does not partially select any atomic\n// ranges.\nfunction skipAtomicInSelection(doc, sel, bias, mayClear) {\n var out;\n for (var i = 0; i < sel.ranges.length; i++) {\n var range = sel.ranges[i];\n var old = sel.ranges.length == doc.sel.ranges.length && doc.sel.ranges[i];\n var newAnchor = skipAtomic(doc, range.anchor, old && old.anchor, bias, mayClear);\n var newHead = skipAtomic(doc, range.head, old && old.head, bias, mayClear);\n if (out || newAnchor != range.anchor || newHead != range.head) {\n if (!out) { out = sel.ranges.slice(0, i); }\n out[i] = new Range(newAnchor, newHead);\n }\n }\n return out ? normalizeSelection(out, sel.primIndex) : sel\n}\n\nfunction skipAtomicInner(doc, pos, oldPos, dir, mayClear) {\n var line = getLine(doc, pos.line);\n if (line.markedSpans) { for (var i = 0; i < line.markedSpans.length; ++i) {\n var sp = line.markedSpans[i], m = sp.marker;\n if ((sp.from == null || (m.inclusiveLeft ? sp.from <= pos.ch : sp.from < pos.ch)) &&\n (sp.to == null || (m.inclusiveRight ? sp.to >= pos.ch : sp.to > pos.ch))) {\n if (mayClear) {\n signal(m, \"beforeCursorEnter\");\n if (m.explicitlyCleared) {\n if (!line.markedSpans) { break }\n else {--i; continue}\n }\n }\n if (!m.atomic) { continue }\n\n if (oldPos) {\n var near = m.find(dir < 0 ? 1 : -1), diff = (void 0);\n if (dir < 0 ? m.inclusiveRight : m.inclusiveLeft)\n { near = movePos(doc, near, -dir, near && near.line == pos.line ? line : null); }\n if (near && near.line == pos.line && (diff = cmp(near, oldPos)) && (dir < 0 ? diff < 0 : diff > 0))\n { return skipAtomicInner(doc, near, pos, dir, mayClear) }\n }\n\n var far = m.find(dir < 0 ? -1 : 1);\n if (dir < 0 ? m.inclusiveLeft : m.inclusiveRight)\n { far = movePos(doc, far, dir, far.line == pos.line ? line : null); }\n return far ? skipAtomicInner(doc, far, pos, dir, mayClear) : null\n }\n } }\n return pos\n}\n\n// Ensure a given position is not inside an atomic range.\nfunction skipAtomic(doc, pos, oldPos, bias, mayClear) {\n var dir = bias || 1;\n var found = skipAtomicInner(doc, pos, oldPos, dir, mayClear) ||\n (!mayClear && skipAtomicInner(doc, pos, oldPos, dir, true)) ||\n skipAtomicInner(doc, pos, oldPos, -dir, mayClear) ||\n (!mayClear && skipAtomicInner(doc, pos, oldPos, -dir, true));\n if (!found) {\n doc.cantEdit = true;\n return Pos(doc.first, 0)\n }\n return found\n}\n\nfunction movePos(doc, pos, dir, line) {\n if (dir < 0 && pos.ch == 0) {\n if (pos.line > doc.first) { return clipPos(doc, Pos(pos.line - 1)) }\n else { return null }\n } else if (dir > 0 && pos.ch == (line || getLine(doc, pos.line)).text.length) {\n if (pos.line < doc.first + doc.size - 1) { return Pos(pos.line + 1, 0) }\n else { return null }\n } else {\n return new Pos(pos.line, pos.ch + dir)\n }\n}\n\nfunction selectAll(cm) {\n cm.setSelection(Pos(cm.firstLine(), 0), Pos(cm.lastLine()), sel_dontScroll);\n}\n\n// UPDATING\n\n// Allow \"beforeChange\" event handlers to influence a change\nfunction filterChange(doc, change, update) {\n var obj = {\n canceled: false,\n from: change.from,\n to: change.to,\n text: change.text,\n origin: change.origin,\n cancel: function () { return obj.canceled = true; }\n };\n if (update) { obj.update = function (from, to, text, origin) {\n if (from) { obj.from = clipPos(doc, from); }\n if (to) { obj.to = clipPos(doc, to); }\n if (text) { obj.text = text; }\n if (origin !== undefined) { obj.origin = origin; }\n }; }\n signal(doc, \"beforeChange\", doc, obj);\n if (doc.cm) { signal(doc.cm, \"beforeChange\", doc.cm, obj); }\n\n if (obj.canceled) { return null }\n return {from: obj.from, to: obj.to, text: obj.text, origin: obj.origin}\n}\n\n// Apply a change to a document, and add it to the document's\n// history, and propagating it to all linked documents.\nfunction makeChange(doc, change, ignoreReadOnly) {\n if (doc.cm) {\n if (!doc.cm.curOp) { return operation(doc.cm, makeChange)(doc, change, ignoreReadOnly) }\n if (doc.cm.state.suppressEdits) { return }\n }\n\n if (hasHandler(doc, \"beforeChange\") || doc.cm && hasHandler(doc.cm, \"beforeChange\")) {\n change = filterChange(doc, change, true);\n if (!change) { return }\n }\n\n // Possibly split or suppress the update based on the presence\n // of read-only spans in its range.\n var split = sawReadOnlySpans && !ignoreReadOnly && removeReadOnlyRanges(doc, change.from, change.to);\n if (split) {\n for (var i = split.length - 1; i >= 0; --i)\n { makeChangeInner(doc, {from: split[i].from, to: split[i].to, text: i ? [\"\"] : change.text, origin: change.origin}); }\n } else {\n makeChangeInner(doc, change);\n }\n}\n\nfunction makeChangeInner(doc, change) {\n if (change.text.length == 1 && change.text[0] == \"\" && cmp(change.from, change.to) == 0) { return }\n var selAfter = computeSelAfterChange(doc, change);\n addChangeToHistory(doc, change, selAfter, doc.cm ? doc.cm.curOp.id : NaN);\n\n makeChangeSingleDoc(doc, change, selAfter, stretchSpansOverChange(doc, change));\n var rebased = [];\n\n linkedDocs(doc, function (doc, sharedHist) {\n if (!sharedHist && indexOf(rebased, doc.history) == -1) {\n rebaseHist(doc.history, change);\n rebased.push(doc.history);\n }\n makeChangeSingleDoc(doc, change, null, stretchSpansOverChange(doc, change));\n });\n}\n\n// Revert a change stored in a document's history.\nfunction makeChangeFromHistory(doc, type, allowSelectionOnly) {\n if (doc.cm && doc.cm.state.suppressEdits && !allowSelectionOnly) { return }\n\n var hist = doc.history, event, selAfter = doc.sel;\n var source = type == \"undo\" ? hist.done : hist.undone, dest = type == \"undo\" ? hist.undone : hist.done;\n\n // Verify that there is a useable event (so that ctrl-z won't\n // needlessly clear selection events)\n var i = 0;\n for (; i < source.length; i++) {\n event = source[i];\n if (allowSelectionOnly ? event.ranges && !event.equals(doc.sel) : !event.ranges)\n { break }\n }\n if (i == source.length) { return }\n hist.lastOrigin = hist.lastSelOrigin = null;\n\n for (;;) {\n event = source.pop();\n if (event.ranges) {\n pushSelectionToHistory(event, dest);\n if (allowSelectionOnly && !event.equals(doc.sel)) {\n setSelection(doc, event, {clearRedo: false});\n return\n }\n selAfter = event;\n }\n else { break }\n }\n\n // Build up a reverse change object to add to the opposite history\n // stack (redo when undoing, and vice versa).\n var antiChanges = [];\n pushSelectionToHistory(selAfter, dest);\n dest.push({changes: antiChanges, generation: hist.generation});\n hist.generation = event.generation || ++hist.maxGeneration;\n\n var filter = hasHandler(doc, \"beforeChange\") || doc.cm && hasHandler(doc.cm, \"beforeChange\");\n\n var loop = function ( i ) {\n var change = event.changes[i];\n change.origin = type;\n if (filter && !filterChange(doc, change, false)) {\n source.length = 0;\n return {}\n }\n\n antiChanges.push(historyChangeFromChange(doc, change));\n\n var after = i ? computeSelAfterChange(doc, change) : lst(source);\n makeChangeSingleDoc(doc, change, after, mergeOldSpans(doc, change));\n if (!i && doc.cm) { doc.cm.scrollIntoView({from: change.from, to: changeEnd(change)}); }\n var rebased = [];\n\n // Propagate to the linked documents\n linkedDocs(doc, function (doc, sharedHist) {\n if (!sharedHist && indexOf(rebased, doc.history) == -1) {\n rebaseHist(doc.history, change);\n rebased.push(doc.history);\n }\n makeChangeSingleDoc(doc, change, null, mergeOldSpans(doc, change));\n });\n };\n\n for (var i$1 = event.changes.length - 1; i$1 >= 0; --i$1) {\n var returned = loop( i$1 );\n\n if ( returned ) return returned.v;\n }\n}\n\n// Sub-views need their line numbers shifted when text is added\n// above or below them in the parent document.\nfunction shiftDoc(doc, distance) {\n if (distance == 0) { return }\n doc.first += distance;\n doc.sel = new Selection(map(doc.sel.ranges, function (range) { return new Range(\n Pos(range.anchor.line + distance, range.anchor.ch),\n Pos(range.head.line + distance, range.head.ch)\n ); }), doc.sel.primIndex);\n if (doc.cm) {\n regChange(doc.cm, doc.first, doc.first - distance, distance);\n for (var d = doc.cm.display, l = d.viewFrom; l < d.viewTo; l++)\n { regLineChange(doc.cm, l, \"gutter\"); }\n }\n}\n\n// More lower-level change function, handling only a single document\n// (not linked ones).\nfunction makeChangeSingleDoc(doc, change, selAfter, spans) {\n if (doc.cm && !doc.cm.curOp)\n { return operation(doc.cm, makeChangeSingleDoc)(doc, change, selAfter, spans) }\n\n if (change.to.line < doc.first) {\n shiftDoc(doc, change.text.length - 1 - (change.to.line - change.from.line));\n return\n }\n if (change.from.line > doc.lastLine()) { return }\n\n // Clip the change to the size of this doc\n if (change.from.line < doc.first) {\n var shift = change.text.length - 1 - (doc.first - change.from.line);\n shiftDoc(doc, shift);\n change = {from: Pos(doc.first, 0), to: Pos(change.to.line + shift, change.to.ch),\n text: [lst(change.text)], origin: change.origin};\n }\n var last = doc.lastLine();\n if (change.to.line > last) {\n change = {from: change.from, to: Pos(last, getLine(doc, last).text.length),\n text: [change.text[0]], origin: change.origin};\n }\n\n change.removed = getBetween(doc, change.from, change.to);\n\n if (!selAfter) { selAfter = computeSelAfterChange(doc, change); }\n if (doc.cm) { makeChangeSingleDocInEditor(doc.cm, change, spans); }\n else { updateDoc(doc, change, spans); }\n setSelectionNoUndo(doc, selAfter, sel_dontScroll);\n}\n\n// Handle the interaction of a change to a document with the editor\n// that this document is part of.\nfunction makeChangeSingleDocInEditor(cm, change, spans) {\n var doc = cm.doc, display = cm.display, from = change.from, to = change.to;\n\n var recomputeMaxLength = false, checkWidthStart = from.line;\n if (!cm.options.lineWrapping) {\n checkWidthStart = lineNo(visualLine(getLine(doc, from.line)));\n doc.iter(checkWidthStart, to.line + 1, function (line) {\n if (line == display.maxLine) {\n recomputeMaxLength = true;\n return true\n }\n });\n }\n\n if (doc.sel.contains(change.from, change.to) > -1)\n { signalCursorActivity(cm); }\n\n updateDoc(doc, change, spans, estimateHeight(cm));\n\n if (!cm.options.lineWrapping) {\n doc.iter(checkWidthStart, from.line + change.text.length, function (line) {\n var len = lineLength(line);\n if (len > display.maxLineLength) {\n display.maxLine = line;\n display.maxLineLength = len;\n display.maxLineChanged = true;\n recomputeMaxLength = false;\n }\n });\n if (recomputeMaxLength) { cm.curOp.updateMaxLine = true; }\n }\n\n retreatFrontier(doc, from.line);\n startWorker(cm, 400);\n\n var lendiff = change.text.length - (to.line - from.line) - 1;\n // Remember that these lines changed, for updating the display\n if (change.full)\n { regChange(cm); }\n else if (from.line == to.line && change.text.length == 1 && !isWholeLineUpdate(cm.doc, change))\n { regLineChange(cm, from.line, \"text\"); }\n else\n { regChange(cm, from.line, to.line + 1, lendiff); }\n\n var changesHandler = hasHandler(cm, \"changes\"), changeHandler = hasHandler(cm, \"change\");\n if (changeHandler || changesHandler) {\n var obj = {\n from: from, to: to,\n text: change.text,\n removed: change.removed,\n origin: change.origin\n };\n if (changeHandler) { signalLater(cm, \"change\", cm, obj); }\n if (changesHandler) { (cm.curOp.changeObjs || (cm.curOp.changeObjs = [])).push(obj); }\n }\n cm.display.selForContextMenu = null;\n}\n\nfunction replaceRange(doc, code, from, to, origin) {\n if (!to) { to = from; }\n if (cmp(to, from) < 0) { var assign;\n (assign = [to, from], from = assign[0], to = assign[1], assign); }\n if (typeof code == \"string\") { code = doc.splitLines(code); }\n makeChange(doc, {from: from, to: to, text: code, origin: origin});\n}\n\n// Rebasing/resetting history to deal with externally-sourced changes\n\nfunction rebaseHistSelSingle(pos, from, to, diff) {\n if (to < pos.line) {\n pos.line += diff;\n } else if (from < pos.line) {\n pos.line = from;\n pos.ch = 0;\n }\n}\n\n// Tries to rebase an array of history events given a change in the\n// document. If the change touches the same lines as the event, the\n// event, and everything 'behind' it, is discarded. If the change is\n// before the event, the event's positions are updated. Uses a\n// copy-on-write scheme for the positions, to avoid having to\n// reallocate them all on every rebase, but also avoid problems with\n// shared position objects being unsafely updated.\nfunction rebaseHistArray(array, from, to, diff) {\n for (var i = 0; i < array.length; ++i) {\n var sub = array[i], ok = true;\n if (sub.ranges) {\n if (!sub.copied) { sub = array[i] = sub.deepCopy(); sub.copied = true; }\n for (var j = 0; j < sub.ranges.length; j++) {\n rebaseHistSelSingle(sub.ranges[j].anchor, from, to, diff);\n rebaseHistSelSingle(sub.ranges[j].head, from, to, diff);\n }\n continue\n }\n for (var j$1 = 0; j$1 < sub.changes.length; ++j$1) {\n var cur = sub.changes[j$1];\n if (to < cur.from.line) {\n cur.from = Pos(cur.from.line + diff, cur.from.ch);\n cur.to = Pos(cur.to.line + diff, cur.to.ch);\n } else if (from <= cur.to.line) {\n ok = false;\n break\n }\n }\n if (!ok) {\n array.splice(0, i + 1);\n i = 0;\n }\n }\n}\n\nfunction rebaseHist(hist, change) {\n var from = change.from.line, to = change.to.line, diff = change.text.length - (to - from) - 1;\n rebaseHistArray(hist.done, from, to, diff);\n rebaseHistArray(hist.undone, from, to, diff);\n}\n\n// Utility for applying a change to a line by handle or number,\n// returning the number and optionally registering the line as\n// changed.\nfunction changeLine(doc, handle, changeType, op) {\n var no = handle, line = handle;\n if (typeof handle == \"number\") { line = getLine(doc, clipLine(doc, handle)); }\n else { no = lineNo(handle); }\n if (no == null) { return null }\n if (op(line, no) && doc.cm) { regLineChange(doc.cm, no, changeType); }\n return line\n}\n\n// The document is represented as a BTree consisting of leaves, with\n// chunk of lines in them, and branches, with up to ten leaves or\n// other branch nodes below them. The top node is always a branch\n// node, and is the document object itself (meaning it has\n// additional methods and properties).\n//\n// All nodes have parent links. The tree is used both to go from\n// line numbers to line objects, and to go from objects to numbers.\n// It also indexes by height, and is used to convert between height\n// and line object, and to find the total height of the document.\n//\n// See also http://marijnhaverbeke.nl/blog/codemirror-line-tree.html\n\nfunction LeafChunk(lines) {\n var this$1 = this;\n\n this.lines = lines;\n this.parent = null;\n var height = 0;\n for (var i = 0; i < lines.length; ++i) {\n lines[i].parent = this$1;\n height += lines[i].height;\n }\n this.height = height;\n}\n\nLeafChunk.prototype = {\n chunkSize: function chunkSize() { return this.lines.length },\n\n // Remove the n lines at offset 'at'.\n removeInner: function removeInner(at, n) {\n var this$1 = this;\n\n for (var i = at, e = at + n; i < e; ++i) {\n var line = this$1.lines[i];\n this$1.height -= line.height;\n cleanUpLine(line);\n signalLater(line, \"delete\");\n }\n this.lines.splice(at, n);\n },\n\n // Helper used to collapse a small branch into a single leaf.\n collapse: function collapse(lines) {\n lines.push.apply(lines, this.lines);\n },\n\n // Insert the given array of lines at offset 'at', count them as\n // having the given height.\n insertInner: function insertInner(at, lines, height) {\n var this$1 = this;\n\n this.height += height;\n this.lines = this.lines.slice(0, at).concat(lines).concat(this.lines.slice(at));\n for (var i = 0; i < lines.length; ++i) { lines[i].parent = this$1; }\n },\n\n // Used to iterate over a part of the tree.\n iterN: function iterN(at, n, op) {\n var this$1 = this;\n\n for (var e = at + n; at < e; ++at)\n { if (op(this$1.lines[at])) { return true } }\n }\n};\n\nfunction BranchChunk(children) {\n var this$1 = this;\n\n this.children = children;\n var size = 0, height = 0;\n for (var i = 0; i < children.length; ++i) {\n var ch = children[i];\n size += ch.chunkSize(); height += ch.height;\n ch.parent = this$1;\n }\n this.size = size;\n this.height = height;\n this.parent = null;\n}\n\nBranchChunk.prototype = {\n chunkSize: function chunkSize() { return this.size },\n\n removeInner: function removeInner(at, n) {\n var this$1 = this;\n\n this.size -= n;\n for (var i = 0; i < this.children.length; ++i) {\n var child = this$1.children[i], sz = child.chunkSize();\n if (at < sz) {\n var rm = Math.min(n, sz - at), oldHeight = child.height;\n child.removeInner(at, rm);\n this$1.height -= oldHeight - child.height;\n if (sz == rm) { this$1.children.splice(i--, 1); child.parent = null; }\n if ((n -= rm) == 0) { break }\n at = 0;\n } else { at -= sz; }\n }\n // If the result is smaller than 25 lines, ensure that it is a\n // single leaf node.\n if (this.size - n < 25 &&\n (this.children.length > 1 || !(this.children[0] instanceof LeafChunk))) {\n var lines = [];\n this.collapse(lines);\n this.children = [new LeafChunk(lines)];\n this.children[0].parent = this;\n }\n },\n\n collapse: function collapse(lines) {\n var this$1 = this;\n\n for (var i = 0; i < this.children.length; ++i) { this$1.children[i].collapse(lines); }\n },\n\n insertInner: function insertInner(at, lines, height) {\n var this$1 = this;\n\n this.size += lines.length;\n this.height += height;\n for (var i = 0; i < this.children.length; ++i) {\n var child = this$1.children[i], sz = child.chunkSize();\n if (at <= sz) {\n child.insertInner(at, lines, height);\n if (child.lines && child.lines.length > 50) {\n // To avoid memory thrashing when child.lines is huge (e.g. first view of a large file), it's never spliced.\n // Instead, small slices are taken. They're taken in order because sequential memory accesses are fastest.\n var remaining = child.lines.length % 25 + 25;\n for (var pos = remaining; pos < child.lines.length;) {\n var leaf = new LeafChunk(child.lines.slice(pos, pos += 25));\n child.height -= leaf.height;\n this$1.children.splice(++i, 0, leaf);\n leaf.parent = this$1;\n }\n child.lines = child.lines.slice(0, remaining);\n this$1.maybeSpill();\n }\n break\n }\n at -= sz;\n }\n },\n\n // When a node has grown, check whether it should be split.\n maybeSpill: function maybeSpill() {\n if (this.children.length <= 10) { return }\n var me = this;\n do {\n var spilled = me.children.splice(me.children.length - 5, 5);\n var sibling = new BranchChunk(spilled);\n if (!me.parent) { // Become the parent node\n var copy = new BranchChunk(me.children);\n copy.parent = me;\n me.children = [copy, sibling];\n me = copy;\n } else {\n me.size -= sibling.size;\n me.height -= sibling.height;\n var myIndex = indexOf(me.parent.children, me);\n me.parent.children.splice(myIndex + 1, 0, sibling);\n }\n sibling.parent = me.parent;\n } while (me.children.length > 10)\n me.parent.maybeSpill();\n },\n\n iterN: function iterN(at, n, op) {\n var this$1 = this;\n\n for (var i = 0; i < this.children.length; ++i) {\n var child = this$1.children[i], sz = child.chunkSize();\n if (at < sz) {\n var used = Math.min(n, sz - at);\n if (child.iterN(at, used, op)) { return true }\n if ((n -= used) == 0) { break }\n at = 0;\n } else { at -= sz; }\n }\n }\n};\n\n// Line widgets are block elements displayed above or below a line.\n\nvar LineWidget = function(doc, node, options) {\n var this$1 = this;\n\n if (options) { for (var opt in options) { if (options.hasOwnProperty(opt))\n { this$1[opt] = options[opt]; } } }\n this.doc = doc;\n this.node = node;\n};\n\nLineWidget.prototype.clear = function () {\n var this$1 = this;\n\n var cm = this.doc.cm, ws = this.line.widgets, line = this.line, no = lineNo(line);\n if (no == null || !ws) { return }\n for (var i = 0; i < ws.length; ++i) { if (ws[i] == this$1) { ws.splice(i--, 1); } }\n if (!ws.length) { line.widgets = null; }\n var height = widgetHeight(this);\n updateLineHeight(line, Math.max(0, line.height - height));\n if (cm) {\n runInOp(cm, function () {\n adjustScrollWhenAboveVisible(cm, line, -height);\n regLineChange(cm, no, \"widget\");\n });\n signalLater(cm, \"lineWidgetCleared\", cm, this, no);\n }\n};\n\nLineWidget.prototype.changed = function () {\n var this$1 = this;\n\n var oldH = this.height, cm = this.doc.cm, line = this.line;\n this.height = null;\n var diff = widgetHeight(this) - oldH;\n if (!diff) { return }\n updateLineHeight(line, line.height + diff);\n if (cm) {\n runInOp(cm, function () {\n cm.curOp.forceUpdate = true;\n adjustScrollWhenAboveVisible(cm, line, diff);\n signalLater(cm, \"lineWidgetChanged\", cm, this$1, lineNo(line));\n });\n }\n};\neventMixin(LineWidget);\n\nfunction adjustScrollWhenAboveVisible(cm, line, diff) {\n if (heightAtLine(line) < ((cm.curOp && cm.curOp.scrollTop) || cm.doc.scrollTop))\n { addToScrollTop(cm, diff); }\n}\n\nfunction addLineWidget(doc, handle, node, options) {\n var widget = new LineWidget(doc, node, options);\n var cm = doc.cm;\n if (cm && widget.noHScroll) { cm.display.alignWidgets = true; }\n changeLine(doc, handle, \"widget\", function (line) {\n var widgets = line.widgets || (line.widgets = []);\n if (widget.insertAt == null) { widgets.push(widget); }\n else { widgets.splice(Math.min(widgets.length - 1, Math.max(0, widget.insertAt)), 0, widget); }\n widget.line = line;\n if (cm && !lineIsHidden(doc, line)) {\n var aboveVisible = heightAtLine(line) < doc.scrollTop;\n updateLineHeight(line, line.height + widgetHeight(widget));\n if (aboveVisible) { addToScrollTop(cm, widget.height); }\n cm.curOp.forceUpdate = true;\n }\n return true\n });\n signalLater(cm, \"lineWidgetAdded\", cm, widget, typeof handle == \"number\" ? handle : lineNo(handle));\n return widget\n}\n\n// TEXTMARKERS\n\n// Created with markText and setBookmark methods. A TextMarker is a\n// handle that can be used to clear or find a marked position in the\n// document. Line objects hold arrays (markedSpans) containing\n// {from, to, marker} object pointing to such marker objects, and\n// indicating that such a marker is present on that line. Multiple\n// lines may point to the same marker when it spans across lines.\n// The spans will have null for their from/to properties when the\n// marker continues beyond the start/end of the line. Markers have\n// links back to the lines they currently touch.\n\n// Collapsed markers have unique ids, in order to be able to order\n// them, which is needed for uniquely determining an outer marker\n// when they overlap (they may nest, but not partially overlap).\nvar nextMarkerId = 0;\n\nvar TextMarker = function(doc, type) {\n this.lines = [];\n this.type = type;\n this.doc = doc;\n this.id = ++nextMarkerId;\n};\n\n// Clear the marker.\nTextMarker.prototype.clear = function () {\n var this$1 = this;\n\n if (this.explicitlyCleared) { return }\n var cm = this.doc.cm, withOp = cm && !cm.curOp;\n if (withOp) { startOperation(cm); }\n if (hasHandler(this, \"clear\")) {\n var found = this.find();\n if (found) { signalLater(this, \"clear\", found.from, found.to); }\n }\n var min = null, max = null;\n for (var i = 0; i < this.lines.length; ++i) {\n var line = this$1.lines[i];\n var span = getMarkedSpanFor(line.markedSpans, this$1);\n if (cm && !this$1.collapsed) { regLineChange(cm, lineNo(line), \"text\"); }\n else if (cm) {\n if (span.to != null) { max = lineNo(line); }\n if (span.from != null) { min = lineNo(line); }\n }\n line.markedSpans = removeMarkedSpan(line.markedSpans, span);\n if (span.from == null && this$1.collapsed && !lineIsHidden(this$1.doc, line) && cm)\n { updateLineHeight(line, textHeight(cm.display)); }\n }\n if (cm && this.collapsed && !cm.options.lineWrapping) { for (var i$1 = 0; i$1 < this.lines.length; ++i$1) {\n var visual = visualLine(this$1.lines[i$1]), len = lineLength(visual);\n if (len > cm.display.maxLineLength) {\n cm.display.maxLine = visual;\n cm.display.maxLineLength = len;\n cm.display.maxLineChanged = true;\n }\n } }\n\n if (min != null && cm && this.collapsed) { regChange(cm, min, max + 1); }\n this.lines.length = 0;\n this.explicitlyCleared = true;\n if (this.atomic && this.doc.cantEdit) {\n this.doc.cantEdit = false;\n if (cm) { reCheckSelection(cm.doc); }\n }\n if (cm) { signalLater(cm, \"markerCleared\", cm, this, min, max); }\n if (withOp) { endOperation(cm); }\n if (this.parent) { this.parent.clear(); }\n};\n\n// Find the position of the marker in the document. Returns a {from,\n// to} object by default. Side can be passed to get a specific side\n// -- 0 (both), -1 (left), or 1 (right). When lineObj is true, the\n// Pos objects returned contain a line object, rather than a line\n// number (used to prevent looking up the same line twice).\nTextMarker.prototype.find = function (side, lineObj) {\n var this$1 = this;\n\n if (side == null && this.type == \"bookmark\") { side = 1; }\n var from, to;\n for (var i = 0; i < this.lines.length; ++i) {\n var line = this$1.lines[i];\n var span = getMarkedSpanFor(line.markedSpans, this$1);\n if (span.from != null) {\n from = Pos(lineObj ? line : lineNo(line), span.from);\n if (side == -1) { return from }\n }\n if (span.to != null) {\n to = Pos(lineObj ? line : lineNo(line), span.to);\n if (side == 1) { return to }\n }\n }\n return from && {from: from, to: to}\n};\n\n// Signals that the marker's widget changed, and surrounding layout\n// should be recomputed.\nTextMarker.prototype.changed = function () {\n var this$1 = this;\n\n var pos = this.find(-1, true), widget = this, cm = this.doc.cm;\n if (!pos || !cm) { return }\n runInOp(cm, function () {\n var line = pos.line, lineN = lineNo(pos.line);\n var view = findViewForLine(cm, lineN);\n if (view) {\n clearLineMeasurementCacheFor(view);\n cm.curOp.selectionChanged = cm.curOp.forceUpdate = true;\n }\n cm.curOp.updateMaxLine = true;\n if (!lineIsHidden(widget.doc, line) && widget.height != null) {\n var oldHeight = widget.height;\n widget.height = null;\n var dHeight = widgetHeight(widget) - oldHeight;\n if (dHeight)\n { updateLineHeight(line, line.height + dHeight); }\n }\n signalLater(cm, \"markerChanged\", cm, this$1);\n });\n};\n\nTextMarker.prototype.attachLine = function (line) {\n if (!this.lines.length && this.doc.cm) {\n var op = this.doc.cm.curOp;\n if (!op.maybeHiddenMarkers || indexOf(op.maybeHiddenMarkers, this) == -1)\n { (op.maybeUnhiddenMarkers || (op.maybeUnhiddenMarkers = [])).push(this); }\n }\n this.lines.push(line);\n};\n\nTextMarker.prototype.detachLine = function (line) {\n this.lines.splice(indexOf(this.lines, line), 1);\n if (!this.lines.length && this.doc.cm) {\n var op = this.doc.cm.curOp;(op.maybeHiddenMarkers || (op.maybeHiddenMarkers = [])).push(this);\n }\n};\neventMixin(TextMarker);\n\n// Create a marker, wire it up to the right lines, and\nfunction markText(doc, from, to, options, type) {\n // Shared markers (across linked documents) are handled separately\n // (markTextShared will call out to this again, once per\n // document).\n if (options && options.shared) { return markTextShared(doc, from, to, options, type) }\n // Ensure we are in an operation.\n if (doc.cm && !doc.cm.curOp) { return operation(doc.cm, markText)(doc, from, to, options, type) }\n\n var marker = new TextMarker(doc, type), diff = cmp(from, to);\n if (options) { copyObj(options, marker, false); }\n // Don't connect empty markers unless clearWhenEmpty is false\n if (diff > 0 || diff == 0 && marker.clearWhenEmpty !== false)\n { return marker }\n if (marker.replacedWith) {\n // Showing up as a widget implies collapsed (widget replaces text)\n marker.collapsed = true;\n marker.widgetNode = eltP(\"span\", [marker.replacedWith], \"CodeMirror-widget\");\n if (!options.handleMouseEvents) { marker.widgetNode.setAttribute(\"cm-ignore-events\", \"true\"); }\n if (options.insertLeft) { marker.widgetNode.insertLeft = true; }\n }\n if (marker.collapsed) {\n if (conflictingCollapsedRange(doc, from.line, from, to, marker) ||\n from.line != to.line && conflictingCollapsedRange(doc, to.line, from, to, marker))\n { throw new Error(\"Inserting collapsed marker partially overlapping an existing one\") }\n seeCollapsedSpans();\n }\n\n if (marker.addToHistory)\n { addChangeToHistory(doc, {from: from, to: to, origin: \"markText\"}, doc.sel, NaN); }\n\n var curLine = from.line, cm = doc.cm, updateMaxLine;\n doc.iter(curLine, to.line + 1, function (line) {\n if (cm && marker.collapsed && !cm.options.lineWrapping && visualLine(line) == cm.display.maxLine)\n { updateMaxLine = true; }\n if (marker.collapsed && curLine != from.line) { updateLineHeight(line, 0); }\n addMarkedSpan(line, new MarkedSpan(marker,\n curLine == from.line ? from.ch : null,\n curLine == to.line ? to.ch : null));\n ++curLine;\n });\n // lineIsHidden depends on the presence of the spans, so needs a second pass\n if (marker.collapsed) { doc.iter(from.line, to.line + 1, function (line) {\n if (lineIsHidden(doc, line)) { updateLineHeight(line, 0); }\n }); }\n\n if (marker.clearOnEnter) { on(marker, \"beforeCursorEnter\", function () { return marker.clear(); }); }\n\n if (marker.readOnly) {\n seeReadOnlySpans();\n if (doc.history.done.length || doc.history.undone.length)\n { doc.clearHistory(); }\n }\n if (marker.collapsed) {\n marker.id = ++nextMarkerId;\n marker.atomic = true;\n }\n if (cm) {\n // Sync editor state\n if (updateMaxLine) { cm.curOp.updateMaxLine = true; }\n if (marker.collapsed)\n { regChange(cm, from.line, to.line + 1); }\n else if (marker.className || marker.title || marker.startStyle || marker.endStyle || marker.css)\n { for (var i = from.line; i <= to.line; i++) { regLineChange(cm, i, \"text\"); } }\n if (marker.atomic) { reCheckSelection(cm.doc); }\n signalLater(cm, \"markerAdded\", cm, marker);\n }\n return marker\n}\n\n// SHARED TEXTMARKERS\n\n// A shared marker spans multiple linked documents. It is\n// implemented as a meta-marker-object controlling multiple normal\n// markers.\nvar SharedTextMarker = function(markers, primary) {\n var this$1 = this;\n\n this.markers = markers;\n this.primary = primary;\n for (var i = 0; i < markers.length; ++i)\n { markers[i].parent = this$1; }\n};\n\nSharedTextMarker.prototype.clear = function () {\n var this$1 = this;\n\n if (this.explicitlyCleared) { return }\n this.explicitlyCleared = true;\n for (var i = 0; i < this.markers.length; ++i)\n { this$1.markers[i].clear(); }\n signalLater(this, \"clear\");\n};\n\nSharedTextMarker.prototype.find = function (side, lineObj) {\n return this.primary.find(side, lineObj)\n};\neventMixin(SharedTextMarker);\n\nfunction markTextShared(doc, from, to, options, type) {\n options = copyObj(options);\n options.shared = false;\n var markers = [markText(doc, from, to, options, type)], primary = markers[0];\n var widget = options.widgetNode;\n linkedDocs(doc, function (doc) {\n if (widget) { options.widgetNode = widget.cloneNode(true); }\n markers.push(markText(doc, clipPos(doc, from), clipPos(doc, to), options, type));\n for (var i = 0; i < doc.linked.length; ++i)\n { if (doc.linked[i].isParent) { return } }\n primary = lst(markers);\n });\n return new SharedTextMarker(markers, primary)\n}\n\nfunction findSharedMarkers(doc) {\n return doc.findMarks(Pos(doc.first, 0), doc.clipPos(Pos(doc.lastLine())), function (m) { return m.parent; })\n}\n\nfunction copySharedMarkers(doc, markers) {\n for (var i = 0; i < markers.length; i++) {\n var marker = markers[i], pos = marker.find();\n var mFrom = doc.clipPos(pos.from), mTo = doc.clipPos(pos.to);\n if (cmp(mFrom, mTo)) {\n var subMark = markText(doc, mFrom, mTo, marker.primary, marker.primary.type);\n marker.markers.push(subMark);\n subMark.parent = marker;\n }\n }\n}\n\nfunction detachSharedMarkers(markers) {\n var loop = function ( i ) {\n var marker = markers[i], linked = [marker.primary.doc];\n linkedDocs(marker.primary.doc, function (d) { return linked.push(d); });\n for (var j = 0; j < marker.markers.length; j++) {\n var subMarker = marker.markers[j];\n if (indexOf(linked, subMarker.doc) == -1) {\n subMarker.parent = null;\n marker.markers.splice(j--, 1);\n }\n }\n };\n\n for (var i = 0; i < markers.length; i++) loop( i );\n}\n\nvar nextDocId = 0;\nvar Doc = function(text, mode, firstLine, lineSep, direction) {\n if (!(this instanceof Doc)) { return new Doc(text, mode, firstLine, lineSep, direction) }\n if (firstLine == null) { firstLine = 0; }\n\n BranchChunk.call(this, [new LeafChunk([new Line(\"\", null)])]);\n this.first = firstLine;\n this.scrollTop = this.scrollLeft = 0;\n this.cantEdit = false;\n this.cleanGeneration = 1;\n this.modeFrontier = this.highlightFrontier = firstLine;\n var start = Pos(firstLine, 0);\n this.sel = simpleSelection(start);\n this.history = new History(null);\n this.id = ++nextDocId;\n this.modeOption = mode;\n this.lineSep = lineSep;\n this.direction = (direction == \"rtl\") ? \"rtl\" : \"ltr\";\n this.extend = false;\n\n if (typeof text == \"string\") { text = this.splitLines(text); }\n updateDoc(this, {from: start, to: start, text: text});\n setSelection(this, simpleSelection(start), sel_dontScroll);\n};\n\nDoc.prototype = createObj(BranchChunk.prototype, {\n constructor: Doc,\n // Iterate over the document. Supports two forms -- with only one\n // argument, it calls that for each line in the document. With\n // three, it iterates over the range given by the first two (with\n // the second being non-inclusive).\n iter: function(from, to, op) {\n if (op) { this.iterN(from - this.first, to - from, op); }\n else { this.iterN(this.first, this.first + this.size, from); }\n },\n\n // Non-public interface for adding and removing lines.\n insert: function(at, lines) {\n var height = 0;\n for (var i = 0; i < lines.length; ++i) { height += lines[i].height; }\n this.insertInner(at - this.first, lines, height);\n },\n remove: function(at, n) { this.removeInner(at - this.first, n); },\n\n // From here, the methods are part of the public interface. Most\n // are also available from CodeMirror (editor) instances.\n\n getValue: function(lineSep) {\n var lines = getLines(this, this.first, this.first + this.size);\n if (lineSep === false) { return lines }\n return lines.join(lineSep || this.lineSeparator())\n },\n setValue: docMethodOp(function(code) {\n var top = Pos(this.first, 0), last = this.first + this.size - 1;\n makeChange(this, {from: top, to: Pos(last, getLine(this, last).text.length),\n text: this.splitLines(code), origin: \"setValue\", full: true}, true);\n if (this.cm) { scrollToCoords(this.cm, 0, 0); }\n setSelection(this, simpleSelection(top), sel_dontScroll);\n }),\n replaceRange: function(code, from, to, origin) {\n from = clipPos(this, from);\n to = to ? clipPos(this, to) : from;\n replaceRange(this, code, from, to, origin);\n },\n getRange: function(from, to, lineSep) {\n var lines = getBetween(this, clipPos(this, from), clipPos(this, to));\n if (lineSep === false) { return lines }\n return lines.join(lineSep || this.lineSeparator())\n },\n\n getLine: function(line) {var l = this.getLineHandle(line); return l && l.text},\n\n getLineHandle: function(line) {if (isLine(this, line)) { return getLine(this, line) }},\n getLineNumber: function(line) {return lineNo(line)},\n\n getLineHandleVisualStart: function(line) {\n if (typeof line == \"number\") { line = getLine(this, line); }\n return visualLine(line)\n },\n\n lineCount: function() {return this.size},\n firstLine: function() {return this.first},\n lastLine: function() {return this.first + this.size - 1},\n\n clipPos: function(pos) {return clipPos(this, pos)},\n\n getCursor: function(start) {\n var range$$1 = this.sel.primary(), pos;\n if (start == null || start == \"head\") { pos = range$$1.head; }\n else if (start == \"anchor\") { pos = range$$1.anchor; }\n else if (start == \"end\" || start == \"to\" || start === false) { pos = range$$1.to(); }\n else { pos = range$$1.from(); }\n return pos\n },\n listSelections: function() { return this.sel.ranges },\n somethingSelected: function() {return this.sel.somethingSelected()},\n\n setCursor: docMethodOp(function(line, ch, options) {\n setSimpleSelection(this, clipPos(this, typeof line == \"number\" ? Pos(line, ch || 0) : line), null, options);\n }),\n setSelection: docMethodOp(function(anchor, head, options) {\n setSimpleSelection(this, clipPos(this, anchor), clipPos(this, head || anchor), options);\n }),\n extendSelection: docMethodOp(function(head, other, options) {\n extendSelection(this, clipPos(this, head), other && clipPos(this, other), options);\n }),\n extendSelections: docMethodOp(function(heads, options) {\n extendSelections(this, clipPosArray(this, heads), options);\n }),\n extendSelectionsBy: docMethodOp(function(f, options) {\n var heads = map(this.sel.ranges, f);\n extendSelections(this, clipPosArray(this, heads), options);\n }),\n setSelections: docMethodOp(function(ranges, primary, options) {\n var this$1 = this;\n\n if (!ranges.length) { return }\n var out = [];\n for (var i = 0; i < ranges.length; i++)\n { out[i] = new Range(clipPos(this$1, ranges[i].anchor),\n clipPos(this$1, ranges[i].head)); }\n if (primary == null) { primary = Math.min(ranges.length - 1, this.sel.primIndex); }\n setSelection(this, normalizeSelection(out, primary), options);\n }),\n addSelection: docMethodOp(function(anchor, head, options) {\n var ranges = this.sel.ranges.slice(0);\n ranges.push(new Range(clipPos(this, anchor), clipPos(this, head || anchor)));\n setSelection(this, normalizeSelection(ranges, ranges.length - 1), options);\n }),\n\n getSelection: function(lineSep) {\n var this$1 = this;\n\n var ranges = this.sel.ranges, lines;\n for (var i = 0; i < ranges.length; i++) {\n var sel = getBetween(this$1, ranges[i].from(), ranges[i].to());\n lines = lines ? lines.concat(sel) : sel;\n }\n if (lineSep === false) { return lines }\n else { return lines.join(lineSep || this.lineSeparator()) }\n },\n getSelections: function(lineSep) {\n var this$1 = this;\n\n var parts = [], ranges = this.sel.ranges;\n for (var i = 0; i < ranges.length; i++) {\n var sel = getBetween(this$1, ranges[i].from(), ranges[i].to());\n if (lineSep !== false) { sel = sel.join(lineSep || this$1.lineSeparator()); }\n parts[i] = sel;\n }\n return parts\n },\n replaceSelection: function(code, collapse, origin) {\n var dup = [];\n for (var i = 0; i < this.sel.ranges.length; i++)\n { dup[i] = code; }\n this.replaceSelections(dup, collapse, origin || \"+input\");\n },\n replaceSelections: docMethodOp(function(code, collapse, origin) {\n var this$1 = this;\n\n var changes = [], sel = this.sel;\n for (var i = 0; i < sel.ranges.length; i++) {\n var range$$1 = sel.ranges[i];\n changes[i] = {from: range$$1.from(), to: range$$1.to(), text: this$1.splitLines(code[i]), origin: origin};\n }\n var newSel = collapse && collapse != \"end\" && computeReplacedSel(this, changes, collapse);\n for (var i$1 = changes.length - 1; i$1 >= 0; i$1--)\n { makeChange(this$1, changes[i$1]); }\n if (newSel) { setSelectionReplaceHistory(this, newSel); }\n else if (this.cm) { ensureCursorVisible(this.cm); }\n }),\n undo: docMethodOp(function() {makeChangeFromHistory(this, \"undo\");}),\n redo: docMethodOp(function() {makeChangeFromHistory(this, \"redo\");}),\n undoSelection: docMethodOp(function() {makeChangeFromHistory(this, \"undo\", true);}),\n redoSelection: docMethodOp(function() {makeChangeFromHistory(this, \"redo\", true);}),\n\n setExtending: function(val) {this.extend = val;},\n getExtending: function() {return this.extend},\n\n historySize: function() {\n var hist = this.history, done = 0, undone = 0;\n for (var i = 0; i < hist.done.length; i++) { if (!hist.done[i].ranges) { ++done; } }\n for (var i$1 = 0; i$1 < hist.undone.length; i$1++) { if (!hist.undone[i$1].ranges) { ++undone; } }\n return {undo: done, redo: undone}\n },\n clearHistory: function() {this.history = new History(this.history.maxGeneration);},\n\n markClean: function() {\n this.cleanGeneration = this.changeGeneration(true);\n },\n changeGeneration: function(forceSplit) {\n if (forceSplit)\n { this.history.lastOp = this.history.lastSelOp = this.history.lastOrigin = null; }\n return this.history.generation\n },\n isClean: function (gen) {\n return this.history.generation == (gen || this.cleanGeneration)\n },\n\n getHistory: function() {\n return {done: copyHistoryArray(this.history.done),\n undone: copyHistoryArray(this.history.undone)}\n },\n setHistory: function(histData) {\n var hist = this.history = new History(this.history.maxGeneration);\n hist.done = copyHistoryArray(histData.done.slice(0), null, true);\n hist.undone = copyHistoryArray(histData.undone.slice(0), null, true);\n },\n\n setGutterMarker: docMethodOp(function(line, gutterID, value) {\n return changeLine(this, line, \"gutter\", function (line) {\n var markers = line.gutterMarkers || (line.gutterMarkers = {});\n markers[gutterID] = value;\n if (!value && isEmpty(markers)) { line.gutterMarkers = null; }\n return true\n })\n }),\n\n clearGutter: docMethodOp(function(gutterID) {\n var this$1 = this;\n\n this.iter(function (line) {\n if (line.gutterMarkers && line.gutterMarkers[gutterID]) {\n changeLine(this$1, line, \"gutter\", function () {\n line.gutterMarkers[gutterID] = null;\n if (isEmpty(line.gutterMarkers)) { line.gutterMarkers = null; }\n return true\n });\n }\n });\n }),\n\n lineInfo: function(line) {\n var n;\n if (typeof line == \"number\") {\n if (!isLine(this, line)) { return null }\n n = line;\n line = getLine(this, line);\n if (!line) { return null }\n } else {\n n = lineNo(line);\n if (n == null) { return null }\n }\n return {line: n, handle: line, text: line.text, gutterMarkers: line.gutterMarkers,\n textClass: line.textClass, bgClass: line.bgClass, wrapClass: line.wrapClass,\n widgets: line.widgets}\n },\n\n addLineClass: docMethodOp(function(handle, where, cls) {\n return changeLine(this, handle, where == \"gutter\" ? \"gutter\" : \"class\", function (line) {\n var prop = where == \"text\" ? \"textClass\"\n : where == \"background\" ? \"bgClass\"\n : where == \"gutter\" ? \"gutterClass\" : \"wrapClass\";\n if (!line[prop]) { line[prop] = cls; }\n else if (classTest(cls).test(line[prop])) { return false }\n else { line[prop] += \" \" + cls; }\n return true\n })\n }),\n removeLineClass: docMethodOp(function(handle, where, cls) {\n return changeLine(this, handle, where == \"gutter\" ? \"gutter\" : \"class\", function (line) {\n var prop = where == \"text\" ? \"textClass\"\n : where == \"background\" ? \"bgClass\"\n : where == \"gutter\" ? \"gutterClass\" : \"wrapClass\";\n var cur = line[prop];\n if (!cur) { return false }\n else if (cls == null) { line[prop] = null; }\n else {\n var found = cur.match(classTest(cls));\n if (!found) { return false }\n var end = found.index + found[0].length;\n line[prop] = cur.slice(0, found.index) + (!found.index || end == cur.length ? \"\" : \" \") + cur.slice(end) || null;\n }\n return true\n })\n }),\n\n addLineWidget: docMethodOp(function(handle, node, options) {\n return addLineWidget(this, handle, node, options)\n }),\n removeLineWidget: function(widget) { widget.clear(); },\n\n markText: function(from, to, options) {\n return markText(this, clipPos(this, from), clipPos(this, to), options, options && options.type || \"range\")\n },\n setBookmark: function(pos, options) {\n var realOpts = {replacedWith: options && (options.nodeType == null ? options.widget : options),\n insertLeft: options && options.insertLeft,\n clearWhenEmpty: false, shared: options && options.shared,\n handleMouseEvents: options && options.handleMouseEvents};\n pos = clipPos(this, pos);\n return markText(this, pos, pos, realOpts, \"bookmark\")\n },\n findMarksAt: function(pos) {\n pos = clipPos(this, pos);\n var markers = [], spans = getLine(this, pos.line).markedSpans;\n if (spans) { for (var i = 0; i < spans.length; ++i) {\n var span = spans[i];\n if ((span.from == null || span.from <= pos.ch) &&\n (span.to == null || span.to >= pos.ch))\n { markers.push(span.marker.parent || span.marker); }\n } }\n return markers\n },\n findMarks: function(from, to, filter) {\n from = clipPos(this, from); to = clipPos(this, to);\n var found = [], lineNo$$1 = from.line;\n this.iter(from.line, to.line + 1, function (line) {\n var spans = line.markedSpans;\n if (spans) { for (var i = 0; i < spans.length; i++) {\n var span = spans[i];\n if (!(span.to != null && lineNo$$1 == from.line && from.ch >= span.to ||\n span.from == null && lineNo$$1 != from.line ||\n span.from != null && lineNo$$1 == to.line && span.from >= to.ch) &&\n (!filter || filter(span.marker)))\n { found.push(span.marker.parent || span.marker); }\n } }\n ++lineNo$$1;\n });\n return found\n },\n getAllMarks: function() {\n var markers = [];\n this.iter(function (line) {\n var sps = line.markedSpans;\n if (sps) { for (var i = 0; i < sps.length; ++i)\n { if (sps[i].from != null) { markers.push(sps[i].marker); } } }\n });\n return markers\n },\n\n posFromIndex: function(off) {\n var ch, lineNo$$1 = this.first, sepSize = this.lineSeparator().length;\n this.iter(function (line) {\n var sz = line.text.length + sepSize;\n if (sz > off) { ch = off; return true }\n off -= sz;\n ++lineNo$$1;\n });\n return clipPos(this, Pos(lineNo$$1, ch))\n },\n indexFromPos: function (coords) {\n coords = clipPos(this, coords);\n var index = coords.ch;\n if (coords.line < this.first || coords.ch < 0) { return 0 }\n var sepSize = this.lineSeparator().length;\n this.iter(this.first, coords.line, function (line) { // iter aborts when callback returns a truthy value\n index += line.text.length + sepSize;\n });\n return index\n },\n\n copy: function(copyHistory) {\n var doc = new Doc(getLines(this, this.first, this.first + this.size),\n this.modeOption, this.first, this.lineSep, this.direction);\n doc.scrollTop = this.scrollTop; doc.scrollLeft = this.scrollLeft;\n doc.sel = this.sel;\n doc.extend = false;\n if (copyHistory) {\n doc.history.undoDepth = this.history.undoDepth;\n doc.setHistory(this.getHistory());\n }\n return doc\n },\n\n linkedDoc: function(options) {\n if (!options) { options = {}; }\n var from = this.first, to = this.first + this.size;\n if (options.from != null && options.from > from) { from = options.from; }\n if (options.to != null && options.to < to) { to = options.to; }\n var copy = new Doc(getLines(this, from, to), options.mode || this.modeOption, from, this.lineSep, this.direction);\n if (options.sharedHist) { copy.history = this.history\n ; }(this.linked || (this.linked = [])).push({doc: copy, sharedHist: options.sharedHist});\n copy.linked = [{doc: this, isParent: true, sharedHist: options.sharedHist}];\n copySharedMarkers(copy, findSharedMarkers(this));\n return copy\n },\n unlinkDoc: function(other) {\n var this$1 = this;\n\n if (other instanceof CodeMirror$1) { other = other.doc; }\n if (this.linked) { for (var i = 0; i < this.linked.length; ++i) {\n var link = this$1.linked[i];\n if (link.doc != other) { continue }\n this$1.linked.splice(i, 1);\n other.unlinkDoc(this$1);\n detachSharedMarkers(findSharedMarkers(this$1));\n break\n } }\n // If the histories were shared, split them again\n if (other.history == this.history) {\n var splitIds = [other.id];\n linkedDocs(other, function (doc) { return splitIds.push(doc.id); }, true);\n other.history = new History(null);\n other.history.done = copyHistoryArray(this.history.done, splitIds);\n other.history.undone = copyHistoryArray(this.history.undone, splitIds);\n }\n },\n iterLinkedDocs: function(f) {linkedDocs(this, f);},\n\n getMode: function() {return this.mode},\n getEditor: function() {return this.cm},\n\n splitLines: function(str) {\n if (this.lineSep) { return str.split(this.lineSep) }\n return splitLinesAuto(str)\n },\n lineSeparator: function() { return this.lineSep || \"\\n\" },\n\n setDirection: docMethodOp(function (dir) {\n if (dir != \"rtl\") { dir = \"ltr\"; }\n if (dir == this.direction) { return }\n this.direction = dir;\n this.iter(function (line) { return line.order = null; });\n if (this.cm) { directionChanged(this.cm); }\n })\n});\n\n// Public alias.\nDoc.prototype.eachLine = Doc.prototype.iter;\n\n// Kludge to work around strange IE behavior where it'll sometimes\n// re-fire a series of drag-related events right after the drop (#1551)\nvar lastDrop = 0;\n\nfunction onDrop(e) {\n var cm = this;\n clearDragCursor(cm);\n if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e))\n { return }\n e_preventDefault(e);\n if (ie) { lastDrop = +new Date; }\n var pos = posFromMouse(cm, e, true), files = e.dataTransfer.files;\n if (!pos || cm.isReadOnly()) { return }\n // Might be a file drop, in which case we simply extract the text\n // and insert it.\n if (files && files.length && window.FileReader && window.File) {\n var n = files.length, text = Array(n), read = 0;\n var loadFile = function (file, i) {\n if (cm.options.allowDropFileTypes &&\n indexOf(cm.options.allowDropFileTypes, file.type) == -1)\n { return }\n\n var reader = new FileReader;\n reader.onload = operation(cm, function () {\n var content = reader.result;\n if (/[\\x00-\\x08\\x0e-\\x1f]{2}/.test(content)) { content = \"\"; }\n text[i] = content;\n if (++read == n) {\n pos = clipPos(cm.doc, pos);\n var change = {from: pos, to: pos,\n text: cm.doc.splitLines(text.join(cm.doc.lineSeparator())),\n origin: \"paste\"};\n makeChange(cm.doc, change);\n setSelectionReplaceHistory(cm.doc, simpleSelection(pos, changeEnd(change)));\n }\n });\n reader.readAsText(file);\n };\n for (var i = 0; i < n; ++i) { loadFile(files[i], i); }\n } else { // Normal drop\n // Don't do a replace if the drop happened inside of the selected text.\n if (cm.state.draggingText && cm.doc.sel.contains(pos) > -1) {\n cm.state.draggingText(e);\n // Ensure the editor is re-focused\n setTimeout(function () { return cm.display.input.focus(); }, 20);\n return\n }\n try {\n var text$1 = e.dataTransfer.getData(\"Text\");\n if (text$1) {\n var selected;\n if (cm.state.draggingText && !cm.state.draggingText.copy)\n { selected = cm.listSelections(); }\n setSelectionNoUndo(cm.doc, simpleSelection(pos, pos));\n if (selected) { for (var i$1 = 0; i$1 < selected.length; ++i$1)\n { replaceRange(cm.doc, \"\", selected[i$1].anchor, selected[i$1].head, \"drag\"); } }\n cm.replaceSelection(text$1, \"around\", \"paste\");\n cm.display.input.focus();\n }\n }\n catch(e){}\n }\n}\n\nfunction onDragStart(cm, e) {\n if (ie && (!cm.state.draggingText || +new Date - lastDrop < 100)) { e_stop(e); return }\n if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e)) { return }\n\n e.dataTransfer.setData(\"Text\", cm.getSelection());\n e.dataTransfer.effectAllowed = \"copyMove\";\n\n // Use dummy image instead of default browsers image.\n // Recent Safari (~6.0.2) have a tendency to segfault when this happens, so we don't do it there.\n if (e.dataTransfer.setDragImage && !safari) {\n var img = elt(\"img\", null, null, \"position: fixed; left: 0; top: 0;\");\n img.src = \"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\";\n if (presto) {\n img.width = img.height = 1;\n cm.display.wrapper.appendChild(img);\n // Force a relayout, or Opera won't use our image for some obscure reason\n img._top = img.offsetTop;\n }\n e.dataTransfer.setDragImage(img, 0, 0);\n if (presto) { img.parentNode.removeChild(img); }\n }\n}\n\nfunction onDragOver(cm, e) {\n var pos = posFromMouse(cm, e);\n if (!pos) { return }\n var frag = document.createDocumentFragment();\n drawSelectionCursor(cm, pos, frag);\n if (!cm.display.dragCursor) {\n cm.display.dragCursor = elt(\"div\", null, \"CodeMirror-cursors CodeMirror-dragcursors\");\n cm.display.lineSpace.insertBefore(cm.display.dragCursor, cm.display.cursorDiv);\n }\n removeChildrenAndAdd(cm.display.dragCursor, frag);\n}\n\nfunction clearDragCursor(cm) {\n if (cm.display.dragCursor) {\n cm.display.lineSpace.removeChild(cm.display.dragCursor);\n cm.display.dragCursor = null;\n }\n}\n\n// These must be handled carefully, because naively registering a\n// handler for each editor will cause the editors to never be\n// garbage collected.\n\nfunction forEachCodeMirror(f) {\n if (!document.getElementsByClassName) { return }\n var byClass = document.getElementsByClassName(\"CodeMirror\");\n for (var i = 0; i < byClass.length; i++) {\n var cm = byClass[i].CodeMirror;\n if (cm) { f(cm); }\n }\n}\n\nvar globalsRegistered = false;\nfunction ensureGlobalHandlers() {\n if (globalsRegistered) { return }\n registerGlobalHandlers();\n globalsRegistered = true;\n}\nfunction registerGlobalHandlers() {\n // When the window resizes, we need to refresh active editors.\n var resizeTimer;\n on(window, \"resize\", function () {\n if (resizeTimer == null) { resizeTimer = setTimeout(function () {\n resizeTimer = null;\n forEachCodeMirror(onResize);\n }, 100); }\n });\n // When the window loses focus, we want to show the editor as blurred\n on(window, \"blur\", function () { return forEachCodeMirror(onBlur); });\n}\n// Called when the window resizes\nfunction onResize(cm) {\n var d = cm.display;\n if (d.lastWrapHeight == d.wrapper.clientHeight && d.lastWrapWidth == d.wrapper.clientWidth)\n { return }\n // Might be a text scaling operation, clear size caches.\n d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = null;\n d.scrollbarsClipped = false;\n cm.setSize();\n}\n\nvar keyNames = {\n 3: \"Enter\", 8: \"Backspace\", 9: \"Tab\", 13: \"Enter\", 16: \"Shift\", 17: \"Ctrl\", 18: \"Alt\",\n 19: \"Pause\", 20: \"CapsLock\", 27: \"Esc\", 32: \"Space\", 33: \"PageUp\", 34: \"PageDown\", 35: \"End\",\n 36: \"Home\", 37: \"Left\", 38: \"Up\", 39: \"Right\", 40: \"Down\", 44: \"PrintScrn\", 45: \"Insert\",\n 46: \"Delete\", 59: \";\", 61: \"=\", 91: \"Mod\", 92: \"Mod\", 93: \"Mod\",\n 106: \"*\", 107: \"=\", 109: \"-\", 110: \".\", 111: \"/\", 127: \"Delete\",\n 173: \"-\", 186: \";\", 187: \"=\", 188: \",\", 189: \"-\", 190: \".\", 191: \"/\", 192: \"`\", 219: \"[\", 220: \"\\\\\",\n 221: \"]\", 222: \"'\", 63232: \"Up\", 63233: \"Down\", 63234: \"Left\", 63235: \"Right\", 63272: \"Delete\",\n 63273: \"Home\", 63275: \"End\", 63276: \"PageUp\", 63277: \"PageDown\", 63302: \"Insert\"\n};\n\n// Number keys\nfor (var i = 0; i < 10; i++) { keyNames[i + 48] = keyNames[i + 96] = String(i); }\n// Alphabetic keys\nfor (var i$1 = 65; i$1 <= 90; i$1++) { keyNames[i$1] = String.fromCharCode(i$1); }\n// Function keys\nfor (var i$2 = 1; i$2 <= 12; i$2++) { keyNames[i$2 + 111] = keyNames[i$2 + 63235] = \"F\" + i$2; }\n\nvar keyMap = {};\n\nkeyMap.basic = {\n \"Left\": \"goCharLeft\", \"Right\": \"goCharRight\", \"Up\": \"goLineUp\", \"Down\": \"goLineDown\",\n \"End\": \"goLineEnd\", \"Home\": \"goLineStartSmart\", \"PageUp\": \"goPageUp\", \"PageDown\": \"goPageDown\",\n \"Delete\": \"delCharAfter\", \"Backspace\": \"delCharBefore\", \"Shift-Backspace\": \"delCharBefore\",\n \"Tab\": \"defaultTab\", \"Shift-Tab\": \"indentAuto\",\n \"Enter\": \"newlineAndIndent\", \"Insert\": \"toggleOverwrite\",\n \"Esc\": \"singleSelection\"\n};\n// Note that the save and find-related commands aren't defined by\n// default. User code or addons can define them. Unknown commands\n// are simply ignored.\nkeyMap.pcDefault = {\n \"Ctrl-A\": \"selectAll\", \"Ctrl-D\": \"deleteLine\", \"Ctrl-Z\": \"undo\", \"Shift-Ctrl-Z\": \"redo\", \"Ctrl-Y\": \"redo\",\n \"Ctrl-Home\": \"goDocStart\", \"Ctrl-End\": \"goDocEnd\", \"Ctrl-Up\": \"goLineUp\", \"Ctrl-Down\": \"goLineDown\",\n \"Ctrl-Left\": \"goGroupLeft\", \"Ctrl-Right\": \"goGroupRight\", \"Alt-Left\": \"goLineStart\", \"Alt-Right\": \"goLineEnd\",\n \"Ctrl-Backspace\": \"delGroupBefore\", \"Ctrl-Delete\": \"delGroupAfter\", \"Ctrl-S\": \"save\", \"Ctrl-F\": \"find\",\n \"Ctrl-G\": \"findNext\", \"Shift-Ctrl-G\": \"findPrev\", \"Shift-Ctrl-F\": \"replace\", \"Shift-Ctrl-R\": \"replaceAll\",\n \"Ctrl-[\": \"indentLess\", \"Ctrl-]\": \"indentMore\",\n \"Ctrl-U\": \"undoSelection\", \"Shift-Ctrl-U\": \"redoSelection\", \"Alt-U\": \"redoSelection\",\n fallthrough: \"basic\"\n};\n// Very basic readline/emacs-style bindings, which are standard on Mac.\nkeyMap.emacsy = {\n \"Ctrl-F\": \"goCharRight\", \"Ctrl-B\": \"goCharLeft\", \"Ctrl-P\": \"goLineUp\", \"Ctrl-N\": \"goLineDown\",\n \"Alt-F\": \"goWordRight\", \"Alt-B\": \"goWordLeft\", \"Ctrl-A\": \"goLineStart\", \"Ctrl-E\": \"goLineEnd\",\n \"Ctrl-V\": \"goPageDown\", \"Shift-Ctrl-V\": \"goPageUp\", \"Ctrl-D\": \"delCharAfter\", \"Ctrl-H\": \"delCharBefore\",\n \"Alt-D\": \"delWordAfter\", \"Alt-Backspace\": \"delWordBefore\", \"Ctrl-K\": \"killLine\", \"Ctrl-T\": \"transposeChars\",\n \"Ctrl-O\": \"openLine\"\n};\nkeyMap.macDefault = {\n \"Cmd-A\": \"selectAll\", \"Cmd-D\": \"deleteLine\", \"Cmd-Z\": \"undo\", \"Shift-Cmd-Z\": \"redo\", \"Cmd-Y\": \"redo\",\n \"Cmd-Home\": \"goDocStart\", \"Cmd-Up\": \"goDocStart\", \"Cmd-End\": \"goDocEnd\", \"Cmd-Down\": \"goDocEnd\", \"Alt-Left\": \"goGroupLeft\",\n \"Alt-Right\": \"goGroupRight\", \"Cmd-Left\": \"goLineLeft\", \"Cmd-Right\": \"goLineRight\", \"Alt-Backspace\": \"delGroupBefore\",\n \"Ctrl-Alt-Backspace\": \"delGroupAfter\", \"Alt-Delete\": \"delGroupAfter\", \"Cmd-S\": \"save\", \"Cmd-F\": \"find\",\n \"Cmd-G\": \"findNext\", \"Shift-Cmd-G\": \"findPrev\", \"Cmd-Alt-F\": \"replace\", \"Shift-Cmd-Alt-F\": \"replaceAll\",\n \"Cmd-[\": \"indentLess\", \"Cmd-]\": \"indentMore\", \"Cmd-Backspace\": \"delWrappedLineLeft\", \"Cmd-Delete\": \"delWrappedLineRight\",\n \"Cmd-U\": \"undoSelection\", \"Shift-Cmd-U\": \"redoSelection\", \"Ctrl-Up\": \"goDocStart\", \"Ctrl-Down\": \"goDocEnd\",\n fallthrough: [\"basic\", \"emacsy\"]\n};\nkeyMap[\"default\"] = mac ? keyMap.macDefault : keyMap.pcDefault;\n\n// KEYMAP DISPATCH\n\nfunction normalizeKeyName(name) {\n var parts = name.split(/-(?!$)/);\n name = parts[parts.length - 1];\n var alt, ctrl, shift, cmd;\n for (var i = 0; i < parts.length - 1; i++) {\n var mod = parts[i];\n if (/^(cmd|meta|m)$/i.test(mod)) { cmd = true; }\n else if (/^a(lt)?$/i.test(mod)) { alt = true; }\n else if (/^(c|ctrl|control)$/i.test(mod)) { ctrl = true; }\n else if (/^s(hift)?$/i.test(mod)) { shift = true; }\n else { throw new Error(\"Unrecognized modifier name: \" + mod) }\n }\n if (alt) { name = \"Alt-\" + name; }\n if (ctrl) { name = \"Ctrl-\" + name; }\n if (cmd) { name = \"Cmd-\" + name; }\n if (shift) { name = \"Shift-\" + name; }\n return name\n}\n\n// This is a kludge to keep keymaps mostly working as raw objects\n// (backwards compatibility) while at the same time support features\n// like normalization and multi-stroke key bindings. It compiles a\n// new normalized keymap, and then updates the old object to reflect\n// this.\nfunction normalizeKeyMap(keymap) {\n var copy = {};\n for (var keyname in keymap) { if (keymap.hasOwnProperty(keyname)) {\n var value = keymap[keyname];\n if (/^(name|fallthrough|(de|at)tach)$/.test(keyname)) { continue }\n if (value == \"...\") { delete keymap[keyname]; continue }\n\n var keys = map(keyname.split(\" \"), normalizeKeyName);\n for (var i = 0; i < keys.length; i++) {\n var val = (void 0), name = (void 0);\n if (i == keys.length - 1) {\n name = keys.join(\" \");\n val = value;\n } else {\n name = keys.slice(0, i + 1).join(\" \");\n val = \"...\";\n }\n var prev = copy[name];\n if (!prev) { copy[name] = val; }\n else if (prev != val) { throw new Error(\"Inconsistent bindings for \" + name) }\n }\n delete keymap[keyname];\n } }\n for (var prop in copy) { keymap[prop] = copy[prop]; }\n return keymap\n}\n\nfunction lookupKey(key, map$$1, handle, context) {\n map$$1 = getKeyMap(map$$1);\n var found = map$$1.call ? map$$1.call(key, context) : map$$1[key];\n if (found === false) { return \"nothing\" }\n if (found === \"...\") { return \"multi\" }\n if (found != null && handle(found)) { return \"handled\" }\n\n if (map$$1.fallthrough) {\n if (Object.prototype.toString.call(map$$1.fallthrough) != \"[object Array]\")\n { return lookupKey(key, map$$1.fallthrough, handle, context) }\n for (var i = 0; i < map$$1.fallthrough.length; i++) {\n var result = lookupKey(key, map$$1.fallthrough[i], handle, context);\n if (result) { return result }\n }\n }\n}\n\n// Modifier key presses don't count as 'real' key presses for the\n// purpose of keymap fallthrough.\nfunction isModifierKey(value) {\n var name = typeof value == \"string\" ? value : keyNames[value.keyCode];\n return name == \"Ctrl\" || name == \"Alt\" || name == \"Shift\" || name == \"Mod\"\n}\n\nfunction addModifierNames(name, event, noShift) {\n var base = name;\n if (event.altKey && base != \"Alt\") { name = \"Alt-\" + name; }\n if ((flipCtrlCmd ? event.metaKey : event.ctrlKey) && base != \"Ctrl\") { name = \"Ctrl-\" + name; }\n if ((flipCtrlCmd ? event.ctrlKey : event.metaKey) && base != \"Cmd\") { name = \"Cmd-\" + name; }\n if (!noShift && event.shiftKey && base != \"Shift\") { name = \"Shift-\" + name; }\n return name\n}\n\n// Look up the name of a key as indicated by an event object.\nfunction keyName(event, noShift) {\n if (presto && event.keyCode == 34 && event[\"char\"]) { return false }\n var name = keyNames[event.keyCode];\n if (name == null || event.altGraphKey) { return false }\n return addModifierNames(name, event, noShift)\n}\n\nfunction getKeyMap(val) {\n return typeof val == \"string\" ? keyMap[val] : val\n}\n\n// Helper for deleting text near the selection(s), used to implement\n// backspace, delete, and similar functionality.\nfunction deleteNearSelection(cm, compute) {\n var ranges = cm.doc.sel.ranges, kill = [];\n // Build up a set of ranges to kill first, merging overlapping\n // ranges.\n for (var i = 0; i < ranges.length; i++) {\n var toKill = compute(ranges[i]);\n while (kill.length && cmp(toKill.from, lst(kill).to) <= 0) {\n var replaced = kill.pop();\n if (cmp(replaced.from, toKill.from) < 0) {\n toKill.from = replaced.from;\n break\n }\n }\n kill.push(toKill);\n }\n // Next, remove those actual ranges.\n runInOp(cm, function () {\n for (var i = kill.length - 1; i >= 0; i--)\n { replaceRange(cm.doc, \"\", kill[i].from, kill[i].to, \"+delete\"); }\n ensureCursorVisible(cm);\n });\n}\n\nfunction moveCharLogically(line, ch, dir) {\n var target = skipExtendingChars(line.text, ch + dir, dir);\n return target < 0 || target > line.text.length ? null : target\n}\n\nfunction moveLogically(line, start, dir) {\n var ch = moveCharLogically(line, start.ch, dir);\n return ch == null ? null : new Pos(start.line, ch, dir < 0 ? \"after\" : \"before\")\n}\n\nfunction endOfLine(visually, cm, lineObj, lineNo, dir) {\n if (visually) {\n var order = getOrder(lineObj, cm.doc.direction);\n if (order) {\n var part = dir < 0 ? lst(order) : order[0];\n var moveInStorageOrder = (dir < 0) == (part.level == 1);\n var sticky = moveInStorageOrder ? \"after\" : \"before\";\n var ch;\n // With a wrapped rtl chunk (possibly spanning multiple bidi parts),\n // it could be that the last bidi part is not on the last visual line,\n // since visual lines contain content order-consecutive chunks.\n // Thus, in rtl, we are looking for the first (content-order) character\n // in the rtl chunk that is on the last line (that is, the same line\n // as the last (content-order) character).\n if (part.level > 0 || cm.doc.direction == \"rtl\") {\n var prep = prepareMeasureForLine(cm, lineObj);\n ch = dir < 0 ? lineObj.text.length - 1 : 0;\n var targetTop = measureCharPrepared(cm, prep, ch).top;\n ch = findFirst(function (ch) { return measureCharPrepared(cm, prep, ch).top == targetTop; }, (dir < 0) == (part.level == 1) ? part.from : part.to - 1, ch);\n if (sticky == \"before\") { ch = moveCharLogically(lineObj, ch, 1); }\n } else { ch = dir < 0 ? part.to : part.from; }\n return new Pos(lineNo, ch, sticky)\n }\n }\n return new Pos(lineNo, dir < 0 ? lineObj.text.length : 0, dir < 0 ? \"before\" : \"after\")\n}\n\nfunction moveVisually(cm, line, start, dir) {\n var bidi = getOrder(line, cm.doc.direction);\n if (!bidi) { return moveLogically(line, start, dir) }\n if (start.ch >= line.text.length) {\n start.ch = line.text.length;\n start.sticky = \"before\";\n } else if (start.ch <= 0) {\n start.ch = 0;\n start.sticky = \"after\";\n }\n var partPos = getBidiPartAt(bidi, start.ch, start.sticky), part = bidi[partPos];\n if (cm.doc.direction == \"ltr\" && part.level % 2 == 0 && (dir > 0 ? part.to > start.ch : part.from < start.ch)) {\n // Case 1: We move within an ltr part in an ltr editor. Even with wrapped lines,\n // nothing interesting happens.\n return moveLogically(line, start, dir)\n }\n\n var mv = function (pos, dir) { return moveCharLogically(line, pos instanceof Pos ? pos.ch : pos, dir); };\n var prep;\n var getWrappedLineExtent = function (ch) {\n if (!cm.options.lineWrapping) { return {begin: 0, end: line.text.length} }\n prep = prep || prepareMeasureForLine(cm, line);\n return wrappedLineExtentChar(cm, line, prep, ch)\n };\n var wrappedLineExtent = getWrappedLineExtent(start.sticky == \"before\" ? mv(start, -1) : start.ch);\n\n if (cm.doc.direction == \"rtl\" || part.level == 1) {\n var moveInStorageOrder = (part.level == 1) == (dir < 0);\n var ch = mv(start, moveInStorageOrder ? 1 : -1);\n if (ch != null && (!moveInStorageOrder ? ch >= part.from && ch >= wrappedLineExtent.begin : ch <= part.to && ch <= wrappedLineExtent.end)) {\n // Case 2: We move within an rtl part or in an rtl editor on the same visual line\n var sticky = moveInStorageOrder ? \"before\" : \"after\";\n return new Pos(start.line, ch, sticky)\n }\n }\n\n // Case 3: Could not move within this bidi part in this visual line, so leave\n // the current bidi part\n\n var searchInVisualLine = function (partPos, dir, wrappedLineExtent) {\n var getRes = function (ch, moveInStorageOrder) { return moveInStorageOrder\n ? new Pos(start.line, mv(ch, 1), \"before\")\n : new Pos(start.line, ch, \"after\"); };\n\n for (; partPos >= 0 && partPos < bidi.length; partPos += dir) {\n var part = bidi[partPos];\n var moveInStorageOrder = (dir > 0) == (part.level != 1);\n var ch = moveInStorageOrder ? wrappedLineExtent.begin : mv(wrappedLineExtent.end, -1);\n if (part.from <= ch && ch < part.to) { return getRes(ch, moveInStorageOrder) }\n ch = moveInStorageOrder ? part.from : mv(part.to, -1);\n if (wrappedLineExtent.begin <= ch && ch < wrappedLineExtent.end) { return getRes(ch, moveInStorageOrder) }\n }\n };\n\n // Case 3a: Look for other bidi parts on the same visual line\n var res = searchInVisualLine(partPos + dir, dir, wrappedLineExtent);\n if (res) { return res }\n\n // Case 3b: Look for other bidi parts on the next visual line\n var nextCh = dir > 0 ? wrappedLineExtent.end : mv(wrappedLineExtent.begin, -1);\n if (nextCh != null && !(dir > 0 && nextCh == line.text.length)) {\n res = searchInVisualLine(dir > 0 ? 0 : bidi.length - 1, dir, getWrappedLineExtent(nextCh));\n if (res) { return res }\n }\n\n // Case 4: Nowhere to move\n return null\n}\n\n// Commands are parameter-less actions that can be performed on an\n// editor, mostly used for keybindings.\nvar commands = {\n selectAll: selectAll,\n singleSelection: function (cm) { return cm.setSelection(cm.getCursor(\"anchor\"), cm.getCursor(\"head\"), sel_dontScroll); },\n killLine: function (cm) { return deleteNearSelection(cm, function (range) {\n if (range.empty()) {\n var len = getLine(cm.doc, range.head.line).text.length;\n if (range.head.ch == len && range.head.line < cm.lastLine())\n { return {from: range.head, to: Pos(range.head.line + 1, 0)} }\n else\n { return {from: range.head, to: Pos(range.head.line, len)} }\n } else {\n return {from: range.from(), to: range.to()}\n }\n }); },\n deleteLine: function (cm) { return deleteNearSelection(cm, function (range) { return ({\n from: Pos(range.from().line, 0),\n to: clipPos(cm.doc, Pos(range.to().line + 1, 0))\n }); }); },\n delLineLeft: function (cm) { return deleteNearSelection(cm, function (range) { return ({\n from: Pos(range.from().line, 0), to: range.from()\n }); }); },\n delWrappedLineLeft: function (cm) { return deleteNearSelection(cm, function (range) {\n var top = cm.charCoords(range.head, \"div\").top + 5;\n var leftPos = cm.coordsChar({left: 0, top: top}, \"div\");\n return {from: leftPos, to: range.from()}\n }); },\n delWrappedLineRight: function (cm) { return deleteNearSelection(cm, function (range) {\n var top = cm.charCoords(range.head, \"div\").top + 5;\n var rightPos = cm.coordsChar({left: cm.display.lineDiv.offsetWidth + 100, top: top}, \"div\");\n return {from: range.from(), to: rightPos }\n }); },\n undo: function (cm) { return cm.undo(); },\n redo: function (cm) { return cm.redo(); },\n undoSelection: function (cm) { return cm.undoSelection(); },\n redoSelection: function (cm) { return cm.redoSelection(); },\n goDocStart: function (cm) { return cm.extendSelection(Pos(cm.firstLine(), 0)); },\n goDocEnd: function (cm) { return cm.extendSelection(Pos(cm.lastLine())); },\n goLineStart: function (cm) { return cm.extendSelectionsBy(function (range) { return lineStart(cm, range.head.line); },\n {origin: \"+move\", bias: 1}\n ); },\n goLineStartSmart: function (cm) { return cm.extendSelectionsBy(function (range) { return lineStartSmart(cm, range.head); },\n {origin: \"+move\", bias: 1}\n ); },\n goLineEnd: function (cm) { return cm.extendSelectionsBy(function (range) { return lineEnd(cm, range.head.line); },\n {origin: \"+move\", bias: -1}\n ); },\n goLineRight: function (cm) { return cm.extendSelectionsBy(function (range) {\n var top = cm.cursorCoords(range.head, \"div\").top + 5;\n return cm.coordsChar({left: cm.display.lineDiv.offsetWidth + 100, top: top}, \"div\")\n }, sel_move); },\n goLineLeft: function (cm) { return cm.extendSelectionsBy(function (range) {\n var top = cm.cursorCoords(range.head, \"div\").top + 5;\n return cm.coordsChar({left: 0, top: top}, \"div\")\n }, sel_move); },\n goLineLeftSmart: function (cm) { return cm.extendSelectionsBy(function (range) {\n var top = cm.cursorCoords(range.head, \"div\").top + 5;\n var pos = cm.coordsChar({left: 0, top: top}, \"div\");\n if (pos.ch < cm.getLine(pos.line).search(/\\S/)) { return lineStartSmart(cm, range.head) }\n return pos\n }, sel_move); },\n goLineUp: function (cm) { return cm.moveV(-1, \"line\"); },\n goLineDown: function (cm) { return cm.moveV(1, \"line\"); },\n goPageUp: function (cm) { return cm.moveV(-1, \"page\"); },\n goPageDown: function (cm) { return cm.moveV(1, \"page\"); },\n goCharLeft: function (cm) { return cm.moveH(-1, \"char\"); },\n goCharRight: function (cm) { return cm.moveH(1, \"char\"); },\n goColumnLeft: function (cm) { return cm.moveH(-1, \"column\"); },\n goColumnRight: function (cm) { return cm.moveH(1, \"column\"); },\n goWordLeft: function (cm) { return cm.moveH(-1, \"word\"); },\n goGroupRight: function (cm) { return cm.moveH(1, \"group\"); },\n goGroupLeft: function (cm) { return cm.moveH(-1, \"group\"); },\n goWordRight: function (cm) { return cm.moveH(1, \"word\"); },\n delCharBefore: function (cm) { return cm.deleteH(-1, \"char\"); },\n delCharAfter: function (cm) { return cm.deleteH(1, \"char\"); },\n delWordBefore: function (cm) { return cm.deleteH(-1, \"word\"); },\n delWordAfter: function (cm) { return cm.deleteH(1, \"word\"); },\n delGroupBefore: function (cm) { return cm.deleteH(-1, \"group\"); },\n delGroupAfter: function (cm) { return cm.deleteH(1, \"group\"); },\n indentAuto: function (cm) { return cm.indentSelection(\"smart\"); },\n indentMore: function (cm) { return cm.indentSelection(\"add\"); },\n indentLess: function (cm) { return cm.indentSelection(\"subtract\"); },\n insertTab: function (cm) { return cm.replaceSelection(\"\\t\"); },\n insertSoftTab: function (cm) {\n var spaces = [], ranges = cm.listSelections(), tabSize = cm.options.tabSize;\n for (var i = 0; i < ranges.length; i++) {\n var pos = ranges[i].from();\n var col = countColumn(cm.getLine(pos.line), pos.ch, tabSize);\n spaces.push(spaceStr(tabSize - col % tabSize));\n }\n cm.replaceSelections(spaces);\n },\n defaultTab: function (cm) {\n if (cm.somethingSelected()) { cm.indentSelection(\"add\"); }\n else { cm.execCommand(\"insertTab\"); }\n },\n // Swap the two chars left and right of each selection's head.\n // Move cursor behind the two swapped characters afterwards.\n //\n // Doesn't consider line feeds a character.\n // Doesn't scan more than one line above to find a character.\n // Doesn't do anything on an empty line.\n // Doesn't do anything with non-empty selections.\n transposeChars: function (cm) { return runInOp(cm, function () {\n var ranges = cm.listSelections(), newSel = [];\n for (var i = 0; i < ranges.length; i++) {\n if (!ranges[i].empty()) { continue }\n var cur = ranges[i].head, line = getLine(cm.doc, cur.line).text;\n if (line) {\n if (cur.ch == line.length) { cur = new Pos(cur.line, cur.ch - 1); }\n if (cur.ch > 0) {\n cur = new Pos(cur.line, cur.ch + 1);\n cm.replaceRange(line.charAt(cur.ch - 1) + line.charAt(cur.ch - 2),\n Pos(cur.line, cur.ch - 2), cur, \"+transpose\");\n } else if (cur.line > cm.doc.first) {\n var prev = getLine(cm.doc, cur.line - 1).text;\n if (prev) {\n cur = new Pos(cur.line, 1);\n cm.replaceRange(line.charAt(0) + cm.doc.lineSeparator() +\n prev.charAt(prev.length - 1),\n Pos(cur.line - 1, prev.length - 1), cur, \"+transpose\");\n }\n }\n }\n newSel.push(new Range(cur, cur));\n }\n cm.setSelections(newSel);\n }); },\n newlineAndIndent: function (cm) { return runInOp(cm, function () {\n var sels = cm.listSelections();\n for (var i = sels.length - 1; i >= 0; i--)\n { cm.replaceRange(cm.doc.lineSeparator(), sels[i].anchor, sels[i].head, \"+input\"); }\n sels = cm.listSelections();\n for (var i$1 = 0; i$1 < sels.length; i$1++)\n { cm.indentLine(sels[i$1].from().line, null, true); }\n ensureCursorVisible(cm);\n }); },\n openLine: function (cm) { return cm.replaceSelection(\"\\n\", \"start\"); },\n toggleOverwrite: function (cm) { return cm.toggleOverwrite(); }\n};\n\n\nfunction lineStart(cm, lineN) {\n var line = getLine(cm.doc, lineN);\n var visual = visualLine(line);\n if (visual != line) { lineN = lineNo(visual); }\n return endOfLine(true, cm, visual, lineN, 1)\n}\nfunction lineEnd(cm, lineN) {\n var line = getLine(cm.doc, lineN);\n var visual = visualLineEnd(line);\n if (visual != line) { lineN = lineNo(visual); }\n return endOfLine(true, cm, line, lineN, -1)\n}\nfunction lineStartSmart(cm, pos) {\n var start = lineStart(cm, pos.line);\n var line = getLine(cm.doc, start.line);\n var order = getOrder(line, cm.doc.direction);\n if (!order || order[0].level == 0) {\n var firstNonWS = Math.max(0, line.text.search(/\\S/));\n var inWS = pos.line == start.line && pos.ch <= firstNonWS && pos.ch;\n return Pos(start.line, inWS ? 0 : firstNonWS, start.sticky)\n }\n return start\n}\n\n// Run a handler that was bound to a key.\nfunction doHandleBinding(cm, bound, dropShift) {\n if (typeof bound == \"string\") {\n bound = commands[bound];\n if (!bound) { return false }\n }\n // Ensure previous input has been read, so that the handler sees a\n // consistent view of the document\n cm.display.input.ensurePolled();\n var prevShift = cm.display.shift, done = false;\n try {\n if (cm.isReadOnly()) { cm.state.suppressEdits = true; }\n if (dropShift) { cm.display.shift = false; }\n done = bound(cm) != Pass;\n } finally {\n cm.display.shift = prevShift;\n cm.state.suppressEdits = false;\n }\n return done\n}\n\nfunction lookupKeyForEditor(cm, name, handle) {\n for (var i = 0; i < cm.state.keyMaps.length; i++) {\n var result = lookupKey(name, cm.state.keyMaps[i], handle, cm);\n if (result) { return result }\n }\n return (cm.options.extraKeys && lookupKey(name, cm.options.extraKeys, handle, cm))\n || lookupKey(name, cm.options.keyMap, handle, cm)\n}\n\n// Note that, despite the name, this function is also used to check\n// for bound mouse clicks.\n\nvar stopSeq = new Delayed;\nfunction dispatchKey(cm, name, e, handle) {\n var seq = cm.state.keySeq;\n if (seq) {\n if (isModifierKey(name)) { return \"handled\" }\n stopSeq.set(50, function () {\n if (cm.state.keySeq == seq) {\n cm.state.keySeq = null;\n cm.display.input.reset();\n }\n });\n name = seq + \" \" + name;\n }\n var result = lookupKeyForEditor(cm, name, handle);\n\n if (result == \"multi\")\n { cm.state.keySeq = name; }\n if (result == \"handled\")\n { signalLater(cm, \"keyHandled\", cm, name, e); }\n\n if (result == \"handled\" || result == \"multi\") {\n e_preventDefault(e);\n restartBlink(cm);\n }\n\n if (seq && !result && /\\'$/.test(name)) {\n e_preventDefault(e);\n return true\n }\n return !!result\n}\n\n// Handle a key from the keydown event.\nfunction handleKeyBinding(cm, e) {\n var name = keyName(e, true);\n if (!name) { return false }\n\n if (e.shiftKey && !cm.state.keySeq) {\n // First try to resolve full name (including 'Shift-'). Failing\n // that, see if there is a cursor-motion command (starting with\n // 'go') bound to the keyname without 'Shift-'.\n return dispatchKey(cm, \"Shift-\" + name, e, function (b) { return doHandleBinding(cm, b, true); })\n || dispatchKey(cm, name, e, function (b) {\n if (typeof b == \"string\" ? /^go[A-Z]/.test(b) : b.motion)\n { return doHandleBinding(cm, b) }\n })\n } else {\n return dispatchKey(cm, name, e, function (b) { return doHandleBinding(cm, b); })\n }\n}\n\n// Handle a key from the keypress event\nfunction handleCharBinding(cm, e, ch) {\n return dispatchKey(cm, \"'\" + ch + \"'\", e, function (b) { return doHandleBinding(cm, b, true); })\n}\n\nvar lastStoppedKey = null;\nfunction onKeyDown(e) {\n var cm = this;\n cm.curOp.focus = activeElt();\n if (signalDOMEvent(cm, e)) { return }\n // IE does strange things with escape.\n if (ie && ie_version < 11 && e.keyCode == 27) { e.returnValue = false; }\n var code = e.keyCode;\n cm.display.shift = code == 16 || e.shiftKey;\n var handled = handleKeyBinding(cm, e);\n if (presto) {\n lastStoppedKey = handled ? code : null;\n // Opera has no cut event... we try to at least catch the key combo\n if (!handled && code == 88 && !hasCopyEvent && (mac ? e.metaKey : e.ctrlKey))\n { cm.replaceSelection(\"\", null, \"cut\"); }\n }\n\n // Turn mouse into crosshair when Alt is held on Mac.\n if (code == 18 && !/\\bCodeMirror-crosshair\\b/.test(cm.display.lineDiv.className))\n { showCrossHair(cm); }\n}\n\nfunction showCrossHair(cm) {\n var lineDiv = cm.display.lineDiv;\n addClass(lineDiv, \"CodeMirror-crosshair\");\n\n function up(e) {\n if (e.keyCode == 18 || !e.altKey) {\n rmClass(lineDiv, \"CodeMirror-crosshair\");\n off(document, \"keyup\", up);\n off(document, \"mouseover\", up);\n }\n }\n on(document, \"keyup\", up);\n on(document, \"mouseover\", up);\n}\n\nfunction onKeyUp(e) {\n if (e.keyCode == 16) { this.doc.sel.shift = false; }\n signalDOMEvent(this, e);\n}\n\nfunction onKeyPress(e) {\n var cm = this;\n if (eventInWidget(cm.display, e) || signalDOMEvent(cm, e) || e.ctrlKey && !e.altKey || mac && e.metaKey) { return }\n var keyCode = e.keyCode, charCode = e.charCode;\n if (presto && keyCode == lastStoppedKey) {lastStoppedKey = null; e_preventDefault(e); return}\n if ((presto && (!e.which || e.which < 10)) && handleKeyBinding(cm, e)) { return }\n var ch = String.fromCharCode(charCode == null ? keyCode : charCode);\n // Some browsers fire keypress events for backspace\n if (ch == \"\\x08\") { return }\n if (handleCharBinding(cm, e, ch)) { return }\n cm.display.input.onKeyPress(e);\n}\n\nvar DOUBLECLICK_DELAY = 400;\n\nvar PastClick = function(time, pos, button) {\n this.time = time;\n this.pos = pos;\n this.button = button;\n};\n\nPastClick.prototype.compare = function (time, pos, button) {\n return this.time + DOUBLECLICK_DELAY > time &&\n cmp(pos, this.pos) == 0 && button == this.button\n};\n\nvar lastClick;\nvar lastDoubleClick;\nfunction clickRepeat(pos, button) {\n var now = +new Date;\n if (lastDoubleClick && lastDoubleClick.compare(now, pos, button)) {\n lastClick = lastDoubleClick = null;\n return \"triple\"\n } else if (lastClick && lastClick.compare(now, pos, button)) {\n lastDoubleClick = new PastClick(now, pos, button);\n lastClick = null;\n return \"double\"\n } else {\n lastClick = new PastClick(now, pos, button);\n lastDoubleClick = null;\n return \"single\"\n }\n}\n\n// A mouse down can be a single click, double click, triple click,\n// start of selection drag, start of text drag, new cursor\n// (ctrl-click), rectangle drag (alt-drag), or xwin\n// middle-click-paste. Or it might be a click on something we should\n// not interfere with, such as a scrollbar or widget.\nfunction onMouseDown(e) {\n var cm = this, display = cm.display;\n if (signalDOMEvent(cm, e) || display.activeTouch && display.input.supportsTouch()) { return }\n display.input.ensurePolled();\n display.shift = e.shiftKey;\n\n if (eventInWidget(display, e)) {\n if (!webkit) {\n // Briefly turn off draggability, to allow widgets to do\n // normal dragging things.\n display.scroller.draggable = false;\n setTimeout(function () { return display.scroller.draggable = true; }, 100);\n }\n return\n }\n if (clickInGutter(cm, e)) { return }\n var pos = posFromMouse(cm, e), button = e_button(e), repeat = pos ? clickRepeat(pos, button) : \"single\";\n window.focus();\n\n // #3261: make sure, that we're not starting a second selection\n if (button == 1 && cm.state.selectingText)\n { cm.state.selectingText(e); }\n\n if (pos && handleMappedButton(cm, button, pos, repeat, e)) { return }\n\n if (button == 1) {\n if (pos) { leftButtonDown(cm, pos, repeat, e); }\n else if (e_target(e) == display.scroller) { e_preventDefault(e); }\n } else if (button == 2) {\n if (pos) { extendSelection(cm.doc, pos); }\n setTimeout(function () { return display.input.focus(); }, 20);\n } else if (button == 3) {\n if (captureRightClick) { onContextMenu(cm, e); }\n else { delayBlurEvent(cm); }\n }\n}\n\nfunction handleMappedButton(cm, button, pos, repeat, event) {\n var name = \"Click\";\n if (repeat == \"double\") { name = \"Double\" + name; }\n else if (repeat == \"triple\") { name = \"Triple\" + name; }\n name = (button == 1 ? \"Left\" : button == 2 ? \"Middle\" : \"Right\") + name;\n\n return dispatchKey(cm, addModifierNames(name, event), event, function (bound) {\n if (typeof bound == \"string\") { bound = commands[bound]; }\n if (!bound) { return false }\n var done = false;\n try {\n if (cm.isReadOnly()) { cm.state.suppressEdits = true; }\n done = bound(cm, pos) != Pass;\n } finally {\n cm.state.suppressEdits = false;\n }\n return done\n })\n}\n\nfunction configureMouse(cm, repeat, event) {\n var option = cm.getOption(\"configureMouse\");\n var value = option ? option(cm, repeat, event) : {};\n if (value.unit == null) {\n var rect = chromeOS ? event.shiftKey && event.metaKey : event.altKey;\n value.unit = rect ? \"rectangle\" : repeat == \"single\" ? \"char\" : repeat == \"double\" ? \"word\" : \"line\";\n }\n if (value.extend == null || cm.doc.extend) { value.extend = cm.doc.extend || event.shiftKey; }\n if (value.addNew == null) { value.addNew = mac ? event.metaKey : event.ctrlKey; }\n if (value.moveOnDrag == null) { value.moveOnDrag = !(mac ? event.altKey : event.ctrlKey); }\n return value\n}\n\nfunction leftButtonDown(cm, pos, repeat, event) {\n if (ie) { setTimeout(bind(ensureFocus, cm), 0); }\n else { cm.curOp.focus = activeElt(); }\n\n var behavior = configureMouse(cm, repeat, event);\n\n var sel = cm.doc.sel, contained;\n if (cm.options.dragDrop && dragAndDrop && !cm.isReadOnly() &&\n repeat == \"single\" && (contained = sel.contains(pos)) > -1 &&\n (cmp((contained = sel.ranges[contained]).from(), pos) < 0 || pos.xRel > 0) &&\n (cmp(contained.to(), pos) > 0 || pos.xRel < 0))\n { leftButtonStartDrag(cm, event, pos, behavior); }\n else\n { leftButtonSelect(cm, event, pos, behavior); }\n}\n\n// Start a text drag. When it ends, see if any dragging actually\n// happen, and treat as a click if it didn't.\nfunction leftButtonStartDrag(cm, event, pos, behavior) {\n var display = cm.display, moved = false;\n var dragEnd = operation(cm, function (e) {\n if (webkit) { display.scroller.draggable = false; }\n cm.state.draggingText = false;\n off(document, \"mouseup\", dragEnd);\n off(document, \"mousemove\", mouseMove);\n off(display.scroller, \"dragstart\", dragStart);\n off(display.scroller, \"drop\", dragEnd);\n if (!moved) {\n e_preventDefault(e);\n if (!behavior.addNew)\n { extendSelection(cm.doc, pos, null, null, behavior.extend); }\n // Work around unexplainable focus problem in IE9 (#2127) and Chrome (#3081)\n if (webkit || ie && ie_version == 9)\n { setTimeout(function () {document.body.focus(); display.input.focus();}, 20); }\n else\n { display.input.focus(); }\n }\n });\n var mouseMove = function(e2) {\n moved = moved || Math.abs(event.clientX - e2.clientX) + Math.abs(event.clientY - e2.clientY) >= 10;\n };\n var dragStart = function () { return moved = true; };\n // Let the drag handler handle this.\n if (webkit) { display.scroller.draggable = true; }\n cm.state.draggingText = dragEnd;\n dragEnd.copy = !behavior.moveOnDrag;\n // IE's approach to draggable\n if (display.scroller.dragDrop) { display.scroller.dragDrop(); }\n on(document, \"mouseup\", dragEnd);\n on(document, \"mousemove\", mouseMove);\n on(display.scroller, \"dragstart\", dragStart);\n on(display.scroller, \"drop\", dragEnd);\n\n delayBlurEvent(cm);\n setTimeout(function () { return display.input.focus(); }, 20);\n}\n\nfunction rangeForUnit(cm, pos, unit) {\n if (unit == \"char\") { return new Range(pos, pos) }\n if (unit == \"word\") { return cm.findWordAt(pos) }\n if (unit == \"line\") { return new Range(Pos(pos.line, 0), clipPos(cm.doc, Pos(pos.line + 1, 0))) }\n var result = unit(cm, pos);\n return new Range(result.from, result.to)\n}\n\n// Normal selection, as opposed to text dragging.\nfunction leftButtonSelect(cm, event, start, behavior) {\n var display = cm.display, doc = cm.doc;\n e_preventDefault(event);\n\n var ourRange, ourIndex, startSel = doc.sel, ranges = startSel.ranges;\n if (behavior.addNew && !behavior.extend) {\n ourIndex = doc.sel.contains(start);\n if (ourIndex > -1)\n { ourRange = ranges[ourIndex]; }\n else\n { ourRange = new Range(start, start); }\n } else {\n ourRange = doc.sel.primary();\n ourIndex = doc.sel.primIndex;\n }\n\n if (behavior.unit == \"rectangle\") {\n if (!behavior.addNew) { ourRange = new Range(start, start); }\n start = posFromMouse(cm, event, true, true);\n ourIndex = -1;\n } else {\n var range$$1 = rangeForUnit(cm, start, behavior.unit);\n if (behavior.extend)\n { ourRange = extendRange(ourRange, range$$1.anchor, range$$1.head, behavior.extend); }\n else\n { ourRange = range$$1; }\n }\n\n if (!behavior.addNew) {\n ourIndex = 0;\n setSelection(doc, new Selection([ourRange], 0), sel_mouse);\n startSel = doc.sel;\n } else if (ourIndex == -1) {\n ourIndex = ranges.length;\n setSelection(doc, normalizeSelection(ranges.concat([ourRange]), ourIndex),\n {scroll: false, origin: \"*mouse\"});\n } else if (ranges.length > 1 && ranges[ourIndex].empty() && behavior.unit == \"char\" && !behavior.extend) {\n setSelection(doc, normalizeSelection(ranges.slice(0, ourIndex).concat(ranges.slice(ourIndex + 1)), 0),\n {scroll: false, origin: \"*mouse\"});\n startSel = doc.sel;\n } else {\n replaceOneSelection(doc, ourIndex, ourRange, sel_mouse);\n }\n\n var lastPos = start;\n function extendTo(pos) {\n if (cmp(lastPos, pos) == 0) { return }\n lastPos = pos;\n\n if (behavior.unit == \"rectangle\") {\n var ranges = [], tabSize = cm.options.tabSize;\n var startCol = countColumn(getLine(doc, start.line).text, start.ch, tabSize);\n var posCol = countColumn(getLine(doc, pos.line).text, pos.ch, tabSize);\n var left = Math.min(startCol, posCol), right = Math.max(startCol, posCol);\n for (var line = Math.min(start.line, pos.line), end = Math.min(cm.lastLine(), Math.max(start.line, pos.line));\n line <= end; line++) {\n var text = getLine(doc, line).text, leftPos = findColumn(text, left, tabSize);\n if (left == right)\n { ranges.push(new Range(Pos(line, leftPos), Pos(line, leftPos))); }\n else if (text.length > leftPos)\n { ranges.push(new Range(Pos(line, leftPos), Pos(line, findColumn(text, right, tabSize)))); }\n }\n if (!ranges.length) { ranges.push(new Range(start, start)); }\n setSelection(doc, normalizeSelection(startSel.ranges.slice(0, ourIndex).concat(ranges), ourIndex),\n {origin: \"*mouse\", scroll: false});\n cm.scrollIntoView(pos);\n } else {\n var oldRange = ourRange;\n var range$$1 = rangeForUnit(cm, pos, behavior.unit);\n var anchor = oldRange.anchor, head;\n if (cmp(range$$1.anchor, anchor) > 0) {\n head = range$$1.head;\n anchor = minPos(oldRange.from(), range$$1.anchor);\n } else {\n head = range$$1.anchor;\n anchor = maxPos(oldRange.to(), range$$1.head);\n }\n var ranges$1 = startSel.ranges.slice(0);\n ranges$1[ourIndex] = bidiSimplify(cm, new Range(clipPos(doc, anchor), head));\n setSelection(doc, normalizeSelection(ranges$1, ourIndex), sel_mouse);\n }\n }\n\n var editorSize = display.wrapper.getBoundingClientRect();\n // Used to ensure timeout re-tries don't fire when another extend\n // happened in the meantime (clearTimeout isn't reliable -- at\n // least on Chrome, the timeouts still happen even when cleared,\n // if the clear happens after their scheduled firing time).\n var counter = 0;\n\n function extend(e) {\n var curCount = ++counter;\n var cur = posFromMouse(cm, e, true, behavior.unit == \"rectangle\");\n if (!cur) { return }\n if (cmp(cur, lastPos) != 0) {\n cm.curOp.focus = activeElt();\n extendTo(cur);\n var visible = visibleLines(display, doc);\n if (cur.line >= visible.to || cur.line < visible.from)\n { setTimeout(operation(cm, function () {if (counter == curCount) { extend(e); }}), 150); }\n } else {\n var outside = e.clientY < editorSize.top ? -20 : e.clientY > editorSize.bottom ? 20 : 0;\n if (outside) { setTimeout(operation(cm, function () {\n if (counter != curCount) { return }\n display.scroller.scrollTop += outside;\n extend(e);\n }), 50); }\n }\n }\n\n function done(e) {\n cm.state.selectingText = false;\n counter = Infinity;\n e_preventDefault(e);\n display.input.focus();\n off(document, \"mousemove\", move);\n off(document, \"mouseup\", up);\n doc.history.lastSelOrigin = null;\n }\n\n var move = operation(cm, function (e) {\n if (!e_button(e)) { done(e); }\n else { extend(e); }\n });\n var up = operation(cm, done);\n cm.state.selectingText = up;\n on(document, \"mousemove\", move);\n on(document, \"mouseup\", up);\n}\n\n// Used when mouse-selecting to adjust the anchor to the proper side\n// of a bidi jump depending on the visual position of the head.\nfunction bidiSimplify(cm, range$$1) {\n var anchor = range$$1.anchor;\n var head = range$$1.head;\n var anchorLine = getLine(cm.doc, anchor.line);\n if (cmp(anchor, head) == 0 && anchor.sticky == head.sticky) { return range$$1 }\n var order = getOrder(anchorLine);\n if (!order) { return range$$1 }\n var index = getBidiPartAt(order, anchor.ch, anchor.sticky), part = order[index];\n if (part.from != anchor.ch && part.to != anchor.ch) { return range$$1 }\n var boundary = index + ((part.from == anchor.ch) == (part.level != 1) ? 0 : 1);\n if (boundary == 0 || boundary == order.length) { return range$$1 }\n\n // Compute the relative visual position of the head compared to the\n // anchor (<0 is to the left, >0 to the right)\n var leftSide;\n if (head.line != anchor.line) {\n leftSide = (head.line - anchor.line) * (cm.doc.direction == \"ltr\" ? 1 : -1) > 0;\n } else {\n var headIndex = getBidiPartAt(order, head.ch, head.sticky);\n var dir = headIndex - index || (head.ch - anchor.ch) * (part.level == 1 ? -1 : 1);\n if (headIndex == boundary - 1 || headIndex == boundary)\n { leftSide = dir < 0; }\n else\n { leftSide = dir > 0; }\n }\n\n var usePart = order[boundary + (leftSide ? -1 : 0)];\n var from = leftSide == (usePart.level == 1);\n var ch = from ? usePart.from : usePart.to, sticky = from ? \"after\" : \"before\";\n return anchor.ch == ch && anchor.sticky == sticky ? range$$1 : new Range(new Pos(anchor.line, ch, sticky), head)\n}\n\n\n// Determines whether an event happened in the gutter, and fires the\n// handlers for the corresponding event.\nfunction gutterEvent(cm, e, type, prevent) {\n var mX, mY;\n if (e.touches) {\n mX = e.touches[0].clientX;\n mY = e.touches[0].clientY;\n } else {\n try { mX = e.clientX; mY = e.clientY; }\n catch(e) { return false }\n }\n if (mX >= Math.floor(cm.display.gutters.getBoundingClientRect().right)) { return false }\n if (prevent) { e_preventDefault(e); }\n\n var display = cm.display;\n var lineBox = display.lineDiv.getBoundingClientRect();\n\n if (mY > lineBox.bottom || !hasHandler(cm, type)) { return e_defaultPrevented(e) }\n mY -= lineBox.top - display.viewOffset;\n\n for (var i = 0; i < cm.options.gutters.length; ++i) {\n var g = display.gutters.childNodes[i];\n if (g && g.getBoundingClientRect().right >= mX) {\n var line = lineAtHeight(cm.doc, mY);\n var gutter = cm.options.gutters[i];\n signal(cm, type, cm, line, gutter, e);\n return e_defaultPrevented(e)\n }\n }\n}\n\nfunction clickInGutter(cm, e) {\n return gutterEvent(cm, e, \"gutterClick\", true)\n}\n\n// CONTEXT MENU HANDLING\n\n// To make the context menu work, we need to briefly unhide the\n// textarea (making it as unobtrusive as possible) to let the\n// right-click take effect on it.\nfunction onContextMenu(cm, e) {\n if (eventInWidget(cm.display, e) || contextMenuInGutter(cm, e)) { return }\n if (signalDOMEvent(cm, e, \"contextmenu\")) { return }\n cm.display.input.onContextMenu(e);\n}\n\nfunction contextMenuInGutter(cm, e) {\n if (!hasHandler(cm, \"gutterContextMenu\")) { return false }\n return gutterEvent(cm, e, \"gutterContextMenu\", false)\n}\n\nfunction themeChanged(cm) {\n cm.display.wrapper.className = cm.display.wrapper.className.replace(/\\s*cm-s-\\S+/g, \"\") +\n cm.options.theme.replace(/(^|\\s)\\s*/g, \" cm-s-\");\n clearCaches(cm);\n}\n\nvar Init = {toString: function(){return \"CodeMirror.Init\"}};\n\nvar defaults = {};\nvar optionHandlers = {};\n\nfunction defineOptions(CodeMirror) {\n var optionHandlers = CodeMirror.optionHandlers;\n\n function option(name, deflt, handle, notOnInit) {\n CodeMirror.defaults[name] = deflt;\n if (handle) { optionHandlers[name] =\n notOnInit ? function (cm, val, old) {if (old != Init) { handle(cm, val, old); }} : handle; }\n }\n\n CodeMirror.defineOption = option;\n\n // Passed to option handlers when there is no old value.\n CodeMirror.Init = Init;\n\n // These two are, on init, called from the constructor because they\n // have to be initialized before the editor can start at all.\n option(\"value\", \"\", function (cm, val) { return cm.setValue(val); }, true);\n option(\"mode\", null, function (cm, val) {\n cm.doc.modeOption = val;\n loadMode(cm);\n }, true);\n\n option(\"indentUnit\", 2, loadMode, true);\n option(\"indentWithTabs\", false);\n option(\"smartIndent\", true);\n option(\"tabSize\", 4, function (cm) {\n resetModeState(cm);\n clearCaches(cm);\n regChange(cm);\n }, true);\n option(\"lineSeparator\", null, function (cm, val) {\n cm.doc.lineSep = val;\n if (!val) { return }\n var newBreaks = [], lineNo = cm.doc.first;\n cm.doc.iter(function (line) {\n for (var pos = 0;;) {\n var found = line.text.indexOf(val, pos);\n if (found == -1) { break }\n pos = found + val.length;\n newBreaks.push(Pos(lineNo, found));\n }\n lineNo++;\n });\n for (var i = newBreaks.length - 1; i >= 0; i--)\n { replaceRange(cm.doc, val, newBreaks[i], Pos(newBreaks[i].line, newBreaks[i].ch + val.length)); }\n });\n option(\"specialChars\", /[\\u0000-\\u001f\\u007f-\\u009f\\u00ad\\u061c\\u200b-\\u200f\\u2028\\u2029\\ufeff]/g, function (cm, val, old) {\n cm.state.specialChars = new RegExp(val.source + (val.test(\"\\t\") ? \"\" : \"|\\t\"), \"g\");\n if (old != Init) { cm.refresh(); }\n });\n option(\"specialCharPlaceholder\", defaultSpecialCharPlaceholder, function (cm) { return cm.refresh(); }, true);\n option(\"electricChars\", true);\n option(\"inputStyle\", mobile ? \"contenteditable\" : \"textarea\", function () {\n throw new Error(\"inputStyle can not (yet) be changed in a running editor\") // FIXME\n }, true);\n option(\"spellcheck\", false, function (cm, val) { return cm.getInputField().spellcheck = val; }, true);\n option(\"rtlMoveVisually\", !windows);\n option(\"wholeLineUpdateBefore\", true);\n\n option(\"theme\", \"default\", function (cm) {\n themeChanged(cm);\n guttersChanged(cm);\n }, true);\n option(\"keyMap\", \"default\", function (cm, val, old) {\n var next = getKeyMap(val);\n var prev = old != Init && getKeyMap(old);\n if (prev && prev.detach) { prev.detach(cm, next); }\n if (next.attach) { next.attach(cm, prev || null); }\n });\n option(\"extraKeys\", null);\n option(\"configureMouse\", null);\n\n option(\"lineWrapping\", false, wrappingChanged, true);\n option(\"gutters\", [], function (cm) {\n setGuttersForLineNumbers(cm.options);\n guttersChanged(cm);\n }, true);\n option(\"fixedGutter\", true, function (cm, val) {\n cm.display.gutters.style.left = val ? compensateForHScroll(cm.display) + \"px\" : \"0\";\n cm.refresh();\n }, true);\n option(\"coverGutterNextToScrollbar\", false, function (cm) { return updateScrollbars(cm); }, true);\n option(\"scrollbarStyle\", \"native\", function (cm) {\n initScrollbars(cm);\n updateScrollbars(cm);\n cm.display.scrollbars.setScrollTop(cm.doc.scrollTop);\n cm.display.scrollbars.setScrollLeft(cm.doc.scrollLeft);\n }, true);\n option(\"lineNumbers\", false, function (cm) {\n setGuttersForLineNumbers(cm.options);\n guttersChanged(cm);\n }, true);\n option(\"firstLineNumber\", 1, guttersChanged, true);\n option(\"lineNumberFormatter\", function (integer) { return integer; }, guttersChanged, true);\n option(\"showCursorWhenSelecting\", false, updateSelection, true);\n\n option(\"resetSelectionOnContextMenu\", true);\n option(\"lineWiseCopyCut\", true);\n option(\"pasteLinesPerSelection\", true);\n\n option(\"readOnly\", false, function (cm, val) {\n if (val == \"nocursor\") {\n onBlur(cm);\n cm.display.input.blur();\n }\n cm.display.input.readOnlyChanged(val);\n });\n option(\"disableInput\", false, function (cm, val) {if (!val) { cm.display.input.reset(); }}, true);\n option(\"dragDrop\", true, dragDropChanged);\n option(\"allowDropFileTypes\", null);\n\n option(\"cursorBlinkRate\", 530);\n option(\"cursorScrollMargin\", 0);\n option(\"cursorHeight\", 1, updateSelection, true);\n option(\"singleCursorHeightPerLine\", true, updateSelection, true);\n option(\"workTime\", 100);\n option(\"workDelay\", 100);\n option(\"flattenSpans\", true, resetModeState, true);\n option(\"addModeClass\", false, resetModeState, true);\n option(\"pollInterval\", 100);\n option(\"undoDepth\", 200, function (cm, val) { return cm.doc.history.undoDepth = val; });\n option(\"historyEventDelay\", 1250);\n option(\"viewportMargin\", 10, function (cm) { return cm.refresh(); }, true);\n option(\"maxHighlightLength\", 10000, resetModeState, true);\n option(\"moveInputWithCursor\", true, function (cm, val) {\n if (!val) { cm.display.input.resetPosition(); }\n });\n\n option(\"tabindex\", null, function (cm, val) { return cm.display.input.getField().tabIndex = val || \"\"; });\n option(\"autofocus\", null);\n option(\"direction\", \"ltr\", function (cm, val) { return cm.doc.setDirection(val); }, true);\n}\n\nfunction guttersChanged(cm) {\n updateGutters(cm);\n regChange(cm);\n alignHorizontally(cm);\n}\n\nfunction dragDropChanged(cm, value, old) {\n var wasOn = old && old != Init;\n if (!value != !wasOn) {\n var funcs = cm.display.dragFunctions;\n var toggle = value ? on : off;\n toggle(cm.display.scroller, \"dragstart\", funcs.start);\n toggle(cm.display.scroller, \"dragenter\", funcs.enter);\n toggle(cm.display.scroller, \"dragover\", funcs.over);\n toggle(cm.display.scroller, \"dragleave\", funcs.leave);\n toggle(cm.display.scroller, \"drop\", funcs.drop);\n }\n}\n\nfunction wrappingChanged(cm) {\n if (cm.options.lineWrapping) {\n addClass(cm.display.wrapper, \"CodeMirror-wrap\");\n cm.display.sizer.style.minWidth = \"\";\n cm.display.sizerWidth = null;\n } else {\n rmClass(cm.display.wrapper, \"CodeMirror-wrap\");\n findMaxLine(cm);\n }\n estimateLineHeights(cm);\n regChange(cm);\n clearCaches(cm);\n setTimeout(function () { return updateScrollbars(cm); }, 100);\n}\n\n// A CodeMirror instance represents an editor. This is the object\n// that user code is usually dealing with.\n\nfunction CodeMirror$1(place, options) {\n var this$1 = this;\n\n if (!(this instanceof CodeMirror$1)) { return new CodeMirror$1(place, options) }\n\n this.options = options = options ? copyObj(options) : {};\n // Determine effective options based on given values and defaults.\n copyObj(defaults, options, false);\n setGuttersForLineNumbers(options);\n\n var doc = options.value;\n if (typeof doc == \"string\") { doc = new Doc(doc, options.mode, null, options.lineSeparator, options.direction); }\n this.doc = doc;\n\n var input = new CodeMirror$1.inputStyles[options.inputStyle](this);\n var display = this.display = new Display(place, doc, input);\n display.wrapper.CodeMirror = this;\n updateGutters(this);\n themeChanged(this);\n if (options.lineWrapping)\n { this.display.wrapper.className += \" CodeMirror-wrap\"; }\n initScrollbars(this);\n\n this.state = {\n keyMaps: [], // stores maps added by addKeyMap\n overlays: [], // highlighting overlays, as added by addOverlay\n modeGen: 0, // bumped when mode/overlay changes, used to invalidate highlighting info\n overwrite: false,\n delayingBlurEvent: false,\n focused: false,\n suppressEdits: false, // used to disable editing during key handlers when in readOnly mode\n pasteIncoming: false, cutIncoming: false, // help recognize paste/cut edits in input.poll\n selectingText: false,\n draggingText: false,\n highlight: new Delayed(), // stores highlight worker timeout\n keySeq: null, // Unfinished key sequence\n specialChars: null\n };\n\n if (options.autofocus && !mobile) { display.input.focus(); }\n\n // Override magic textarea content restore that IE sometimes does\n // on our hidden textarea on reload\n if (ie && ie_version < 11) { setTimeout(function () { return this$1.display.input.reset(true); }, 20); }\n\n registerEventHandlers(this);\n ensureGlobalHandlers();\n\n startOperation(this);\n this.curOp.forceUpdate = true;\n attachDoc(this, doc);\n\n if ((options.autofocus && !mobile) || this.hasFocus())\n { setTimeout(bind(onFocus, this), 20); }\n else\n { onBlur(this); }\n\n for (var opt in optionHandlers) { if (optionHandlers.hasOwnProperty(opt))\n { optionHandlers[opt](this$1, options[opt], Init); } }\n maybeUpdateLineNumberWidth(this);\n if (options.finishInit) { options.finishInit(this); }\n for (var i = 0; i < initHooks.length; ++i) { initHooks[i](this$1); }\n endOperation(this);\n // Suppress optimizelegibility in Webkit, since it breaks text\n // measuring on line wrapping boundaries.\n if (webkit && options.lineWrapping &&\n getComputedStyle(display.lineDiv).textRendering == \"optimizelegibility\")\n { display.lineDiv.style.textRendering = \"auto\"; }\n}\n\n// The default configuration options.\nCodeMirror$1.defaults = defaults;\n// Functions to run when options are changed.\nCodeMirror$1.optionHandlers = optionHandlers;\n\n// Attach the necessary event handlers when initializing the editor\nfunction registerEventHandlers(cm) {\n var d = cm.display;\n on(d.scroller, \"mousedown\", operation(cm, onMouseDown));\n // Older IE's will not fire a second mousedown for a double click\n if (ie && ie_version < 11)\n { on(d.scroller, \"dblclick\", operation(cm, function (e) {\n if (signalDOMEvent(cm, e)) { return }\n var pos = posFromMouse(cm, e);\n if (!pos || clickInGutter(cm, e) || eventInWidget(cm.display, e)) { return }\n e_preventDefault(e);\n var word = cm.findWordAt(pos);\n extendSelection(cm.doc, word.anchor, word.head);\n })); }\n else\n { on(d.scroller, \"dblclick\", function (e) { return signalDOMEvent(cm, e) || e_preventDefault(e); }); }\n // Some browsers fire contextmenu *after* opening the menu, at\n // which point we can't mess with it anymore. Context menu is\n // handled in onMouseDown for these browsers.\n if (!captureRightClick) { on(d.scroller, \"contextmenu\", function (e) { return onContextMenu(cm, e); }); }\n\n // Used to suppress mouse event handling when a touch happens\n var touchFinished, prevTouch = {end: 0};\n function finishTouch() {\n if (d.activeTouch) {\n touchFinished = setTimeout(function () { return d.activeTouch = null; }, 1000);\n prevTouch = d.activeTouch;\n prevTouch.end = +new Date;\n }\n }\n function isMouseLikeTouchEvent(e) {\n if (e.touches.length != 1) { return false }\n var touch = e.touches[0];\n return touch.radiusX <= 1 && touch.radiusY <= 1\n }\n function farAway(touch, other) {\n if (other.left == null) { return true }\n var dx = other.left - touch.left, dy = other.top - touch.top;\n return dx * dx + dy * dy > 20 * 20\n }\n on(d.scroller, \"touchstart\", function (e) {\n if (!signalDOMEvent(cm, e) && !isMouseLikeTouchEvent(e) && !clickInGutter(cm, e)) {\n d.input.ensurePolled();\n clearTimeout(touchFinished);\n var now = +new Date;\n d.activeTouch = {start: now, moved: false,\n prev: now - prevTouch.end <= 300 ? prevTouch : null};\n if (e.touches.length == 1) {\n d.activeTouch.left = e.touches[0].pageX;\n d.activeTouch.top = e.touches[0].pageY;\n }\n }\n });\n on(d.scroller, \"touchmove\", function () {\n if (d.activeTouch) { d.activeTouch.moved = true; }\n });\n on(d.scroller, \"touchend\", function (e) {\n var touch = d.activeTouch;\n if (touch && !eventInWidget(d, e) && touch.left != null &&\n !touch.moved && new Date - touch.start < 300) {\n var pos = cm.coordsChar(d.activeTouch, \"page\"), range;\n if (!touch.prev || farAway(touch, touch.prev)) // Single tap\n { range = new Range(pos, pos); }\n else if (!touch.prev.prev || farAway(touch, touch.prev.prev)) // Double tap\n { range = cm.findWordAt(pos); }\n else // Triple tap\n { range = new Range(Pos(pos.line, 0), clipPos(cm.doc, Pos(pos.line + 1, 0))); }\n cm.setSelection(range.anchor, range.head);\n cm.focus();\n e_preventDefault(e);\n }\n finishTouch();\n });\n on(d.scroller, \"touchcancel\", finishTouch);\n\n // Sync scrolling between fake scrollbars and real scrollable\n // area, ensure viewport is updated when scrolling.\n on(d.scroller, \"scroll\", function () {\n if (d.scroller.clientHeight) {\n updateScrollTop(cm, d.scroller.scrollTop);\n setScrollLeft(cm, d.scroller.scrollLeft, true);\n signal(cm, \"scroll\", cm);\n }\n });\n\n // Listen to wheel events in order to try and update the viewport on time.\n on(d.scroller, \"mousewheel\", function (e) { return onScrollWheel(cm, e); });\n on(d.scroller, \"DOMMouseScroll\", function (e) { return onScrollWheel(cm, e); });\n\n // Prevent wrapper from ever scrolling\n on(d.wrapper, \"scroll\", function () { return d.wrapper.scrollTop = d.wrapper.scrollLeft = 0; });\n\n d.dragFunctions = {\n enter: function (e) {if (!signalDOMEvent(cm, e)) { e_stop(e); }},\n over: function (e) {if (!signalDOMEvent(cm, e)) { onDragOver(cm, e); e_stop(e); }},\n start: function (e) { return onDragStart(cm, e); },\n drop: operation(cm, onDrop),\n leave: function (e) {if (!signalDOMEvent(cm, e)) { clearDragCursor(cm); }}\n };\n\n var inp = d.input.getField();\n on(inp, \"keyup\", function (e) { return onKeyUp.call(cm, e); });\n on(inp, \"keydown\", operation(cm, onKeyDown));\n on(inp, \"keypress\", operation(cm, onKeyPress));\n on(inp, \"focus\", function (e) { return onFocus(cm, e); });\n on(inp, \"blur\", function (e) { return onBlur(cm, e); });\n}\n\nvar initHooks = [];\nCodeMirror$1.defineInitHook = function (f) { return initHooks.push(f); };\n\n// Indent the given line. The how parameter can be \"smart\",\n// \"add\"/null, \"subtract\", or \"prev\". When aggressive is false\n// (typically set to true for forced single-line indents), empty\n// lines are not indented, and places where the mode returns Pass\n// are left alone.\nfunction indentLine(cm, n, how, aggressive) {\n var doc = cm.doc, state;\n if (how == null) { how = \"add\"; }\n if (how == \"smart\") {\n // Fall back to \"prev\" when the mode doesn't have an indentation\n // method.\n if (!doc.mode.indent) { how = \"prev\"; }\n else { state = getContextBefore(cm, n).state; }\n }\n\n var tabSize = cm.options.tabSize;\n var line = getLine(doc, n), curSpace = countColumn(line.text, null, tabSize);\n if (line.stateAfter) { line.stateAfter = null; }\n var curSpaceString = line.text.match(/^\\s*/)[0], indentation;\n if (!aggressive && !/\\S/.test(line.text)) {\n indentation = 0;\n how = \"not\";\n } else if (how == \"smart\") {\n indentation = doc.mode.indent(state, line.text.slice(curSpaceString.length), line.text);\n if (indentation == Pass || indentation > 150) {\n if (!aggressive) { return }\n how = \"prev\";\n }\n }\n if (how == \"prev\") {\n if (n > doc.first) { indentation = countColumn(getLine(doc, n-1).text, null, tabSize); }\n else { indentation = 0; }\n } else if (how == \"add\") {\n indentation = curSpace + cm.options.indentUnit;\n } else if (how == \"subtract\") {\n indentation = curSpace - cm.options.indentUnit;\n } else if (typeof how == \"number\") {\n indentation = curSpace + how;\n }\n indentation = Math.max(0, indentation);\n\n var indentString = \"\", pos = 0;\n if (cm.options.indentWithTabs)\n { for (var i = Math.floor(indentation / tabSize); i; --i) {pos += tabSize; indentString += \"\\t\";} }\n if (pos < indentation) { indentString += spaceStr(indentation - pos); }\n\n if (indentString != curSpaceString) {\n replaceRange(doc, indentString, Pos(n, 0), Pos(n, curSpaceString.length), \"+input\");\n line.stateAfter = null;\n return true\n } else {\n // Ensure that, if the cursor was in the whitespace at the start\n // of the line, it is moved to the end of that space.\n for (var i$1 = 0; i$1 < doc.sel.ranges.length; i$1++) {\n var range = doc.sel.ranges[i$1];\n if (range.head.line == n && range.head.ch < curSpaceString.length) {\n var pos$1 = Pos(n, curSpaceString.length);\n replaceOneSelection(doc, i$1, new Range(pos$1, pos$1));\n break\n }\n }\n }\n}\n\n// This will be set to a {lineWise: bool, text: [string]} object, so\n// that, when pasting, we know what kind of selections the copied\n// text was made out of.\nvar lastCopied = null;\n\nfunction setLastCopied(newLastCopied) {\n lastCopied = newLastCopied;\n}\n\nfunction applyTextInput(cm, inserted, deleted, sel, origin) {\n var doc = cm.doc;\n cm.display.shift = false;\n if (!sel) { sel = doc.sel; }\n\n var paste = cm.state.pasteIncoming || origin == \"paste\";\n var textLines = splitLinesAuto(inserted), multiPaste = null;\n // When pasing N lines into N selections, insert one line per selection\n if (paste && sel.ranges.length > 1) {\n if (lastCopied && lastCopied.text.join(\"\\n\") == inserted) {\n if (sel.ranges.length % lastCopied.text.length == 0) {\n multiPaste = [];\n for (var i = 0; i < lastCopied.text.length; i++)\n { multiPaste.push(doc.splitLines(lastCopied.text[i])); }\n }\n } else if (textLines.length == sel.ranges.length && cm.options.pasteLinesPerSelection) {\n multiPaste = map(textLines, function (l) { return [l]; });\n }\n }\n\n var updateInput;\n // Normal behavior is to insert the new text into every selection\n for (var i$1 = sel.ranges.length - 1; i$1 >= 0; i$1--) {\n var range$$1 = sel.ranges[i$1];\n var from = range$$1.from(), to = range$$1.to();\n if (range$$1.empty()) {\n if (deleted && deleted > 0) // Handle deletion\n { from = Pos(from.line, from.ch - deleted); }\n else if (cm.state.overwrite && !paste) // Handle overwrite\n { to = Pos(to.line, Math.min(getLine(doc, to.line).text.length, to.ch + lst(textLines).length)); }\n else if (lastCopied && lastCopied.lineWise && lastCopied.text.join(\"\\n\") == inserted)\n { from = to = Pos(from.line, 0); }\n }\n updateInput = cm.curOp.updateInput;\n var changeEvent = {from: from, to: to, text: multiPaste ? multiPaste[i$1 % multiPaste.length] : textLines,\n origin: origin || (paste ? \"paste\" : cm.state.cutIncoming ? \"cut\" : \"+input\")};\n makeChange(cm.doc, changeEvent);\n signalLater(cm, \"inputRead\", cm, changeEvent);\n }\n if (inserted && !paste)\n { triggerElectric(cm, inserted); }\n\n ensureCursorVisible(cm);\n cm.curOp.updateInput = updateInput;\n cm.curOp.typing = true;\n cm.state.pasteIncoming = cm.state.cutIncoming = false;\n}\n\nfunction handlePaste(e, cm) {\n var pasted = e.clipboardData && e.clipboardData.getData(\"Text\");\n if (pasted) {\n e.preventDefault();\n if (!cm.isReadOnly() && !cm.options.disableInput)\n { runInOp(cm, function () { return applyTextInput(cm, pasted, 0, null, \"paste\"); }); }\n return true\n }\n}\n\nfunction triggerElectric(cm, inserted) {\n // When an 'electric' character is inserted, immediately trigger a reindent\n if (!cm.options.electricChars || !cm.options.smartIndent) { return }\n var sel = cm.doc.sel;\n\n for (var i = sel.ranges.length - 1; i >= 0; i--) {\n var range$$1 = sel.ranges[i];\n if (range$$1.head.ch > 100 || (i && sel.ranges[i - 1].head.line == range$$1.head.line)) { continue }\n var mode = cm.getModeAt(range$$1.head);\n var indented = false;\n if (mode.electricChars) {\n for (var j = 0; j < mode.electricChars.length; j++)\n { if (inserted.indexOf(mode.electricChars.charAt(j)) > -1) {\n indented = indentLine(cm, range$$1.head.line, \"smart\");\n break\n } }\n } else if (mode.electricInput) {\n if (mode.electricInput.test(getLine(cm.doc, range$$1.head.line).text.slice(0, range$$1.head.ch)))\n { indented = indentLine(cm, range$$1.head.line, \"smart\"); }\n }\n if (indented) { signalLater(cm, \"electricInput\", cm, range$$1.head.line); }\n }\n}\n\nfunction copyableRanges(cm) {\n var text = [], ranges = [];\n for (var i = 0; i < cm.doc.sel.ranges.length; i++) {\n var line = cm.doc.sel.ranges[i].head.line;\n var lineRange = {anchor: Pos(line, 0), head: Pos(line + 1, 0)};\n ranges.push(lineRange);\n text.push(cm.getRange(lineRange.anchor, lineRange.head));\n }\n return {text: text, ranges: ranges}\n}\n\nfunction disableBrowserMagic(field, spellcheck) {\n field.setAttribute(\"autocorrect\", \"off\");\n field.setAttribute(\"autocapitalize\", \"off\");\n field.setAttribute(\"spellcheck\", !!spellcheck);\n}\n\nfunction hiddenTextarea() {\n var te = elt(\"textarea\", null, null, \"position: absolute; bottom: -1em; padding: 0; width: 1px; height: 1em; outline: none\");\n var div = elt(\"div\", [te], null, \"overflow: hidden; position: relative; width: 3px; height: 0px;\");\n // The textarea is kept positioned near the cursor to prevent the\n // fact that it'll be scrolled into view on input from scrolling\n // our fake cursor out of view. On webkit, when wrap=off, paste is\n // very slow. So make the area wide instead.\n if (webkit) { te.style.width = \"1000px\"; }\n else { te.setAttribute(\"wrap\", \"off\"); }\n // If border: 0; -- iOS fails to open keyboard (issue #1287)\n if (ios) { te.style.border = \"1px solid black\"; }\n disableBrowserMagic(te);\n return div\n}\n\n// The publicly visible API. Note that methodOp(f) means\n// 'wrap f in an operation, performed on its `this` parameter'.\n\n// This is not the complete set of editor methods. Most of the\n// methods defined on the Doc type are also injected into\n// CodeMirror.prototype, for backwards compatibility and\n// convenience.\n\nvar addEditorMethods = function(CodeMirror) {\n var optionHandlers = CodeMirror.optionHandlers;\n\n var helpers = CodeMirror.helpers = {};\n\n CodeMirror.prototype = {\n constructor: CodeMirror,\n focus: function(){window.focus(); this.display.input.focus();},\n\n setOption: function(option, value) {\n var options = this.options, old = options[option];\n if (options[option] == value && option != \"mode\") { return }\n options[option] = value;\n if (optionHandlers.hasOwnProperty(option))\n { operation(this, optionHandlers[option])(this, value, old); }\n signal(this, \"optionChange\", this, option);\n },\n\n getOption: function(option) {return this.options[option]},\n getDoc: function() {return this.doc},\n\n addKeyMap: function(map$$1, bottom) {\n this.state.keyMaps[bottom ? \"push\" : \"unshift\"](getKeyMap(map$$1));\n },\n removeKeyMap: function(map$$1) {\n var maps = this.state.keyMaps;\n for (var i = 0; i < maps.length; ++i)\n { if (maps[i] == map$$1 || maps[i].name == map$$1) {\n maps.splice(i, 1);\n return true\n } }\n },\n\n addOverlay: methodOp(function(spec, options) {\n var mode = spec.token ? spec : CodeMirror.getMode(this.options, spec);\n if (mode.startState) { throw new Error(\"Overlays may not be stateful.\") }\n insertSorted(this.state.overlays,\n {mode: mode, modeSpec: spec, opaque: options && options.opaque,\n priority: (options && options.priority) || 0},\n function (overlay) { return overlay.priority; });\n this.state.modeGen++;\n regChange(this);\n }),\n removeOverlay: methodOp(function(spec) {\n var this$1 = this;\n\n var overlays = this.state.overlays;\n for (var i = 0; i < overlays.length; ++i) {\n var cur = overlays[i].modeSpec;\n if (cur == spec || typeof spec == \"string\" && cur.name == spec) {\n overlays.splice(i, 1);\n this$1.state.modeGen++;\n regChange(this$1);\n return\n }\n }\n }),\n\n indentLine: methodOp(function(n, dir, aggressive) {\n if (typeof dir != \"string\" && typeof dir != \"number\") {\n if (dir == null) { dir = this.options.smartIndent ? \"smart\" : \"prev\"; }\n else { dir = dir ? \"add\" : \"subtract\"; }\n }\n if (isLine(this.doc, n)) { indentLine(this, n, dir, aggressive); }\n }),\n indentSelection: methodOp(function(how) {\n var this$1 = this;\n\n var ranges = this.doc.sel.ranges, end = -1;\n for (var i = 0; i < ranges.length; i++) {\n var range$$1 = ranges[i];\n if (!range$$1.empty()) {\n var from = range$$1.from(), to = range$$1.to();\n var start = Math.max(end, from.line);\n end = Math.min(this$1.lastLine(), to.line - (to.ch ? 0 : 1)) + 1;\n for (var j = start; j < end; ++j)\n { indentLine(this$1, j, how); }\n var newRanges = this$1.doc.sel.ranges;\n if (from.ch == 0 && ranges.length == newRanges.length && newRanges[i].from().ch > 0)\n { replaceOneSelection(this$1.doc, i, new Range(from, newRanges[i].to()), sel_dontScroll); }\n } else if (range$$1.head.line > end) {\n indentLine(this$1, range$$1.head.line, how, true);\n end = range$$1.head.line;\n if (i == this$1.doc.sel.primIndex) { ensureCursorVisible(this$1); }\n }\n }\n }),\n\n // Fetch the parser token for a given character. Useful for hacks\n // that want to inspect the mode state (say, for completion).\n getTokenAt: function(pos, precise) {\n return takeToken(this, pos, precise)\n },\n\n getLineTokens: function(line, precise) {\n return takeToken(this, Pos(line), precise, true)\n },\n\n getTokenTypeAt: function(pos) {\n pos = clipPos(this.doc, pos);\n var styles = getLineStyles(this, getLine(this.doc, pos.line));\n var before = 0, after = (styles.length - 1) / 2, ch = pos.ch;\n var type;\n if (ch == 0) { type = styles[2]; }\n else { for (;;) {\n var mid = (before + after) >> 1;\n if ((mid ? styles[mid * 2 - 1] : 0) >= ch) { after = mid; }\n else if (styles[mid * 2 + 1] < ch) { before = mid + 1; }\n else { type = styles[mid * 2 + 2]; break }\n } }\n var cut = type ? type.indexOf(\"overlay \") : -1;\n return cut < 0 ? type : cut == 0 ? null : type.slice(0, cut - 1)\n },\n\n getModeAt: function(pos) {\n var mode = this.doc.mode;\n if (!mode.innerMode) { return mode }\n return CodeMirror.innerMode(mode, this.getTokenAt(pos).state).mode\n },\n\n getHelper: function(pos, type) {\n return this.getHelpers(pos, type)[0]\n },\n\n getHelpers: function(pos, type) {\n var this$1 = this;\n\n var found = [];\n if (!helpers.hasOwnProperty(type)) { return found }\n var help = helpers[type], mode = this.getModeAt(pos);\n if (typeof mode[type] == \"string\") {\n if (help[mode[type]]) { found.push(help[mode[type]]); }\n } else if (mode[type]) {\n for (var i = 0; i < mode[type].length; i++) {\n var val = help[mode[type][i]];\n if (val) { found.push(val); }\n }\n } else if (mode.helperType && help[mode.helperType]) {\n found.push(help[mode.helperType]);\n } else if (help[mode.name]) {\n found.push(help[mode.name]);\n }\n for (var i$1 = 0; i$1 < help._global.length; i$1++) {\n var cur = help._global[i$1];\n if (cur.pred(mode, this$1) && indexOf(found, cur.val) == -1)\n { found.push(cur.val); }\n }\n return found\n },\n\n getStateAfter: function(line, precise) {\n var doc = this.doc;\n line = clipLine(doc, line == null ? doc.first + doc.size - 1: line);\n return getContextBefore(this, line + 1, precise).state\n },\n\n cursorCoords: function(start, mode) {\n var pos, range$$1 = this.doc.sel.primary();\n if (start == null) { pos = range$$1.head; }\n else if (typeof start == \"object\") { pos = clipPos(this.doc, start); }\n else { pos = start ? range$$1.from() : range$$1.to(); }\n return cursorCoords(this, pos, mode || \"page\")\n },\n\n charCoords: function(pos, mode) {\n return charCoords(this, clipPos(this.doc, pos), mode || \"page\")\n },\n\n coordsChar: function(coords, mode) {\n coords = fromCoordSystem(this, coords, mode || \"page\");\n return coordsChar(this, coords.left, coords.top)\n },\n\n lineAtHeight: function(height, mode) {\n height = fromCoordSystem(this, {top: height, left: 0}, mode || \"page\").top;\n return lineAtHeight(this.doc, height + this.display.viewOffset)\n },\n heightAtLine: function(line, mode, includeWidgets) {\n var end = false, lineObj;\n if (typeof line == \"number\") {\n var last = this.doc.first + this.doc.size - 1;\n if (line < this.doc.first) { line = this.doc.first; }\n else if (line > last) { line = last; end = true; }\n lineObj = getLine(this.doc, line);\n } else {\n lineObj = line;\n }\n return intoCoordSystem(this, lineObj, {top: 0, left: 0}, mode || \"page\", includeWidgets || end).top +\n (end ? this.doc.height - heightAtLine(lineObj) : 0)\n },\n\n defaultTextHeight: function() { return textHeight(this.display) },\n defaultCharWidth: function() { return charWidth(this.display) },\n\n getViewport: function() { return {from: this.display.viewFrom, to: this.display.viewTo}},\n\n addWidget: function(pos, node, scroll, vert, horiz) {\n var display = this.display;\n pos = cursorCoords(this, clipPos(this.doc, pos));\n var top = pos.bottom, left = pos.left;\n node.style.position = \"absolute\";\n node.setAttribute(\"cm-ignore-events\", \"true\");\n this.display.input.setUneditable(node);\n display.sizer.appendChild(node);\n if (vert == \"over\") {\n top = pos.top;\n } else if (vert == \"above\" || vert == \"near\") {\n var vspace = Math.max(display.wrapper.clientHeight, this.doc.height),\n hspace = Math.max(display.sizer.clientWidth, display.lineSpace.clientWidth);\n // Default to positioning above (if specified and possible); otherwise default to positioning below\n if ((vert == 'above' || pos.bottom + node.offsetHeight > vspace) && pos.top > node.offsetHeight)\n { top = pos.top - node.offsetHeight; }\n else if (pos.bottom + node.offsetHeight <= vspace)\n { top = pos.bottom; }\n if (left + node.offsetWidth > hspace)\n { left = hspace - node.offsetWidth; }\n }\n node.style.top = top + \"px\";\n node.style.left = node.style.right = \"\";\n if (horiz == \"right\") {\n left = display.sizer.clientWidth - node.offsetWidth;\n node.style.right = \"0px\";\n } else {\n if (horiz == \"left\") { left = 0; }\n else if (horiz == \"middle\") { left = (display.sizer.clientWidth - node.offsetWidth) / 2; }\n node.style.left = left + \"px\";\n }\n if (scroll)\n { scrollIntoView(this, {left: left, top: top, right: left + node.offsetWidth, bottom: top + node.offsetHeight}); }\n },\n\n triggerOnKeyDown: methodOp(onKeyDown),\n triggerOnKeyPress: methodOp(onKeyPress),\n triggerOnKeyUp: onKeyUp,\n triggerOnMouseDown: methodOp(onMouseDown),\n\n execCommand: function(cmd) {\n if (commands.hasOwnProperty(cmd))\n { return commands[cmd].call(null, this) }\n },\n\n triggerElectric: methodOp(function(text) { triggerElectric(this, text); }),\n\n findPosH: function(from, amount, unit, visually) {\n var this$1 = this;\n\n var dir = 1;\n if (amount < 0) { dir = -1; amount = -amount; }\n var cur = clipPos(this.doc, from);\n for (var i = 0; i < amount; ++i) {\n cur = findPosH(this$1.doc, cur, dir, unit, visually);\n if (cur.hitSide) { break }\n }\n return cur\n },\n\n moveH: methodOp(function(dir, unit) {\n var this$1 = this;\n\n this.extendSelectionsBy(function (range$$1) {\n if (this$1.display.shift || this$1.doc.extend || range$$1.empty())\n { return findPosH(this$1.doc, range$$1.head, dir, unit, this$1.options.rtlMoveVisually) }\n else\n { return dir < 0 ? range$$1.from() : range$$1.to() }\n }, sel_move);\n }),\n\n deleteH: methodOp(function(dir, unit) {\n var sel = this.doc.sel, doc = this.doc;\n if (sel.somethingSelected())\n { doc.replaceSelection(\"\", null, \"+delete\"); }\n else\n { deleteNearSelection(this, function (range$$1) {\n var other = findPosH(doc, range$$1.head, dir, unit, false);\n return dir < 0 ? {from: other, to: range$$1.head} : {from: range$$1.head, to: other}\n }); }\n }),\n\n findPosV: function(from, amount, unit, goalColumn) {\n var this$1 = this;\n\n var dir = 1, x = goalColumn;\n if (amount < 0) { dir = -1; amount = -amount; }\n var cur = clipPos(this.doc, from);\n for (var i = 0; i < amount; ++i) {\n var coords = cursorCoords(this$1, cur, \"div\");\n if (x == null) { x = coords.left; }\n else { coords.left = x; }\n cur = findPosV(this$1, coords, dir, unit);\n if (cur.hitSide) { break }\n }\n return cur\n },\n\n moveV: methodOp(function(dir, unit) {\n var this$1 = this;\n\n var doc = this.doc, goals = [];\n var collapse = !this.display.shift && !doc.extend && doc.sel.somethingSelected();\n doc.extendSelectionsBy(function (range$$1) {\n if (collapse)\n { return dir < 0 ? range$$1.from() : range$$1.to() }\n var headPos = cursorCoords(this$1, range$$1.head, \"div\");\n if (range$$1.goalColumn != null) { headPos.left = range$$1.goalColumn; }\n goals.push(headPos.left);\n var pos = findPosV(this$1, headPos, dir, unit);\n if (unit == \"page\" && range$$1 == doc.sel.primary())\n { addToScrollTop(this$1, charCoords(this$1, pos, \"div\").top - headPos.top); }\n return pos\n }, sel_move);\n if (goals.length) { for (var i = 0; i < doc.sel.ranges.length; i++)\n { doc.sel.ranges[i].goalColumn = goals[i]; } }\n }),\n\n // Find the word at the given position (as returned by coordsChar).\n findWordAt: function(pos) {\n var doc = this.doc, line = getLine(doc, pos.line).text;\n var start = pos.ch, end = pos.ch;\n if (line) {\n var helper = this.getHelper(pos, \"wordChars\");\n if ((pos.sticky == \"before\" || end == line.length) && start) { --start; } else { ++end; }\n var startChar = line.charAt(start);\n var check = isWordChar(startChar, helper)\n ? function (ch) { return isWordChar(ch, helper); }\n : /\\s/.test(startChar) ? function (ch) { return /\\s/.test(ch); }\n : function (ch) { return (!/\\s/.test(ch) && !isWordChar(ch)); };\n while (start > 0 && check(line.charAt(start - 1))) { --start; }\n while (end < line.length && check(line.charAt(end))) { ++end; }\n }\n return new Range(Pos(pos.line, start), Pos(pos.line, end))\n },\n\n toggleOverwrite: function(value) {\n if (value != null && value == this.state.overwrite) { return }\n if (this.state.overwrite = !this.state.overwrite)\n { addClass(this.display.cursorDiv, \"CodeMirror-overwrite\"); }\n else\n { rmClass(this.display.cursorDiv, \"CodeMirror-overwrite\"); }\n\n signal(this, \"overwriteToggle\", this, this.state.overwrite);\n },\n hasFocus: function() { return this.display.input.getField() == activeElt() },\n isReadOnly: function() { return !!(this.options.readOnly || this.doc.cantEdit) },\n\n scrollTo: methodOp(function (x, y) { scrollToCoords(this, x, y); }),\n getScrollInfo: function() {\n var scroller = this.display.scroller;\n return {left: scroller.scrollLeft, top: scroller.scrollTop,\n height: scroller.scrollHeight - scrollGap(this) - this.display.barHeight,\n width: scroller.scrollWidth - scrollGap(this) - this.display.barWidth,\n clientHeight: displayHeight(this), clientWidth: displayWidth(this)}\n },\n\n scrollIntoView: methodOp(function(range$$1, margin) {\n if (range$$1 == null) {\n range$$1 = {from: this.doc.sel.primary().head, to: null};\n if (margin == null) { margin = this.options.cursorScrollMargin; }\n } else if (typeof range$$1 == \"number\") {\n range$$1 = {from: Pos(range$$1, 0), to: null};\n } else if (range$$1.from == null) {\n range$$1 = {from: range$$1, to: null};\n }\n if (!range$$1.to) { range$$1.to = range$$1.from; }\n range$$1.margin = margin || 0;\n\n if (range$$1.from.line != null) {\n scrollToRange(this, range$$1);\n } else {\n scrollToCoordsRange(this, range$$1.from, range$$1.to, range$$1.margin);\n }\n }),\n\n setSize: methodOp(function(width, height) {\n var this$1 = this;\n\n var interpret = function (val) { return typeof val == \"number\" || /^\\d+$/.test(String(val)) ? val + \"px\" : val; };\n if (width != null) { this.display.wrapper.style.width = interpret(width); }\n if (height != null) { this.display.wrapper.style.height = interpret(height); }\n if (this.options.lineWrapping) { clearLineMeasurementCache(this); }\n var lineNo$$1 = this.display.viewFrom;\n this.doc.iter(lineNo$$1, this.display.viewTo, function (line) {\n if (line.widgets) { for (var i = 0; i < line.widgets.length; i++)\n { if (line.widgets[i].noHScroll) { regLineChange(this$1, lineNo$$1, \"widget\"); break } } }\n ++lineNo$$1;\n });\n this.curOp.forceUpdate = true;\n signal(this, \"refresh\", this);\n }),\n\n operation: function(f){return runInOp(this, f)},\n startOperation: function(){return startOperation(this)},\n endOperation: function(){return endOperation(this)},\n\n refresh: methodOp(function() {\n var oldHeight = this.display.cachedTextHeight;\n regChange(this);\n this.curOp.forceUpdate = true;\n clearCaches(this);\n scrollToCoords(this, this.doc.scrollLeft, this.doc.scrollTop);\n updateGutterSpace(this);\n if (oldHeight == null || Math.abs(oldHeight - textHeight(this.display)) > .5)\n { estimateLineHeights(this); }\n signal(this, \"refresh\", this);\n }),\n\n swapDoc: methodOp(function(doc) {\n var old = this.doc;\n old.cm = null;\n attachDoc(this, doc);\n clearCaches(this);\n this.display.input.reset();\n scrollToCoords(this, doc.scrollLeft, doc.scrollTop);\n this.curOp.forceScroll = true;\n signalLater(this, \"swapDoc\", this, old);\n return old\n }),\n\n getInputField: function(){return this.display.input.getField()},\n getWrapperElement: function(){return this.display.wrapper},\n getScrollerElement: function(){return this.display.scroller},\n getGutterElement: function(){return this.display.gutters}\n };\n eventMixin(CodeMirror);\n\n CodeMirror.registerHelper = function(type, name, value) {\n if (!helpers.hasOwnProperty(type)) { helpers[type] = CodeMirror[type] = {_global: []}; }\n helpers[type][name] = value;\n };\n CodeMirror.registerGlobalHelper = function(type, name, predicate, value) {\n CodeMirror.registerHelper(type, name, value);\n helpers[type]._global.push({pred: predicate, val: value});\n };\n};\n\n// Used for horizontal relative motion. Dir is -1 or 1 (left or\n// right), unit can be \"char\", \"column\" (like char, but doesn't\n// cross line boundaries), \"word\" (across next word), or \"group\" (to\n// the start of next group of word or non-word-non-whitespace\n// chars). The visually param controls whether, in right-to-left\n// text, direction 1 means to move towards the next index in the\n// string, or towards the character to the right of the current\n// position. The resulting position will have a hitSide=true\n// property if it reached the end of the document.\nfunction findPosH(doc, pos, dir, unit, visually) {\n var oldPos = pos;\n var origDir = dir;\n var lineObj = getLine(doc, pos.line);\n function findNextLine() {\n var l = pos.line + dir;\n if (l < doc.first || l >= doc.first + doc.size) { return false }\n pos = new Pos(l, pos.ch, pos.sticky);\n return lineObj = getLine(doc, l)\n }\n function moveOnce(boundToLine) {\n var next;\n if (visually) {\n next = moveVisually(doc.cm, lineObj, pos, dir);\n } else {\n next = moveLogically(lineObj, pos, dir);\n }\n if (next == null) {\n if (!boundToLine && findNextLine())\n { pos = endOfLine(visually, doc.cm, lineObj, pos.line, dir); }\n else\n { return false }\n } else {\n pos = next;\n }\n return true\n }\n\n if (unit == \"char\") {\n moveOnce();\n } else if (unit == \"column\") {\n moveOnce(true);\n } else if (unit == \"word\" || unit == \"group\") {\n var sawType = null, group = unit == \"group\";\n var helper = doc.cm && doc.cm.getHelper(pos, \"wordChars\");\n for (var first = true;; first = false) {\n if (dir < 0 && !moveOnce(!first)) { break }\n var cur = lineObj.text.charAt(pos.ch) || \"\\n\";\n var type = isWordChar(cur, helper) ? \"w\"\n : group && cur == \"\\n\" ? \"n\"\n : !group || /\\s/.test(cur) ? null\n : \"p\";\n if (group && !first && !type) { type = \"s\"; }\n if (sawType && sawType != type) {\n if (dir < 0) {dir = 1; moveOnce(); pos.sticky = \"after\";}\n break\n }\n\n if (type) { sawType = type; }\n if (dir > 0 && !moveOnce(!first)) { break }\n }\n }\n var result = skipAtomic(doc, pos, oldPos, origDir, true);\n if (equalCursorPos(oldPos, result)) { result.hitSide = true; }\n return result\n}\n\n// For relative vertical movement. Dir may be -1 or 1. Unit can be\n// \"page\" or \"line\". The resulting position will have a hitSide=true\n// property if it reached the end of the document.\nfunction findPosV(cm, pos, dir, unit) {\n var doc = cm.doc, x = pos.left, y;\n if (unit == \"page\") {\n var pageSize = Math.min(cm.display.wrapper.clientHeight, window.innerHeight || document.documentElement.clientHeight);\n var moveAmount = Math.max(pageSize - .5 * textHeight(cm.display), 3);\n y = (dir > 0 ? pos.bottom : pos.top) + dir * moveAmount;\n\n } else if (unit == \"line\") {\n y = dir > 0 ? pos.bottom + 3 : pos.top - 3;\n }\n var target;\n for (;;) {\n target = coordsChar(cm, x, y);\n if (!target.outside) { break }\n if (dir < 0 ? y <= 0 : y >= doc.height) { target.hitSide = true; break }\n y += dir * 5;\n }\n return target\n}\n\n// CONTENTEDITABLE INPUT STYLE\n\nvar ContentEditableInput = function(cm) {\n this.cm = cm;\n this.lastAnchorNode = this.lastAnchorOffset = this.lastFocusNode = this.lastFocusOffset = null;\n this.polling = new Delayed();\n this.composing = null;\n this.gracePeriod = false;\n this.readDOMTimeout = null;\n};\n\nContentEditableInput.prototype.init = function (display) {\n var this$1 = this;\n\n var input = this, cm = input.cm;\n var div = input.div = display.lineDiv;\n disableBrowserMagic(div, cm.options.spellcheck);\n\n on(div, \"paste\", function (e) {\n if (signalDOMEvent(cm, e) || handlePaste(e, cm)) { return }\n // IE doesn't fire input events, so we schedule a read for the pasted content in this way\n if (ie_version <= 11) { setTimeout(operation(cm, function () { return this$1.updateFromDOM(); }), 20); }\n });\n\n on(div, \"compositionstart\", function (e) {\n this$1.composing = {data: e.data, done: false};\n });\n on(div, \"compositionupdate\", function (e) {\n if (!this$1.composing) { this$1.composing = {data: e.data, done: false}; }\n });\n on(div, \"compositionend\", function (e) {\n if (this$1.composing) {\n if (e.data != this$1.composing.data) { this$1.readFromDOMSoon(); }\n this$1.composing.done = true;\n }\n });\n\n on(div, \"touchstart\", function () { return input.forceCompositionEnd(); });\n\n on(div, \"input\", function () {\n if (!this$1.composing) { this$1.readFromDOMSoon(); }\n });\n\n function onCopyCut(e) {\n if (signalDOMEvent(cm, e)) { return }\n if (cm.somethingSelected()) {\n setLastCopied({lineWise: false, text: cm.getSelections()});\n if (e.type == \"cut\") { cm.replaceSelection(\"\", null, \"cut\"); }\n } else if (!cm.options.lineWiseCopyCut) {\n return\n } else {\n var ranges = copyableRanges(cm);\n setLastCopied({lineWise: true, text: ranges.text});\n if (e.type == \"cut\") {\n cm.operation(function () {\n cm.setSelections(ranges.ranges, 0, sel_dontScroll);\n cm.replaceSelection(\"\", null, \"cut\");\n });\n }\n }\n if (e.clipboardData) {\n e.clipboardData.clearData();\n var content = lastCopied.text.join(\"\\n\");\n // iOS exposes the clipboard API, but seems to discard content inserted into it\n e.clipboardData.setData(\"Text\", content);\n if (e.clipboardData.getData(\"Text\") == content) {\n e.preventDefault();\n return\n }\n }\n // Old-fashioned briefly-focus-a-textarea hack\n var kludge = hiddenTextarea(), te = kludge.firstChild;\n cm.display.lineSpace.insertBefore(kludge, cm.display.lineSpace.firstChild);\n te.value = lastCopied.text.join(\"\\n\");\n var hadFocus = document.activeElement;\n selectInput(te);\n setTimeout(function () {\n cm.display.lineSpace.removeChild(kludge);\n hadFocus.focus();\n if (hadFocus == div) { input.showPrimarySelection(); }\n }, 50);\n }\n on(div, \"copy\", onCopyCut);\n on(div, \"cut\", onCopyCut);\n};\n\nContentEditableInput.prototype.prepareSelection = function () {\n var result = prepareSelection(this.cm, false);\n result.focus = this.cm.state.focused;\n return result\n};\n\nContentEditableInput.prototype.showSelection = function (info, takeFocus) {\n if (!info || !this.cm.display.view.length) { return }\n if (info.focus || takeFocus) { this.showPrimarySelection(); }\n this.showMultipleSelections(info);\n};\n\nContentEditableInput.prototype.showPrimarySelection = function () {\n var sel = window.getSelection(), cm = this.cm, prim = cm.doc.sel.primary();\n var from = prim.from(), to = prim.to();\n\n if (cm.display.viewTo == cm.display.viewFrom || from.line >= cm.display.viewTo || to.line < cm.display.viewFrom) {\n sel.removeAllRanges();\n return\n }\n\n var curAnchor = domToPos(cm, sel.anchorNode, sel.anchorOffset);\n var curFocus = domToPos(cm, sel.focusNode, sel.focusOffset);\n if (curAnchor && !curAnchor.bad && curFocus && !curFocus.bad &&\n cmp(minPos(curAnchor, curFocus), from) == 0 &&\n cmp(maxPos(curAnchor, curFocus), to) == 0)\n { return }\n\n var view = cm.display.view;\n var start = (from.line >= cm.display.viewFrom && posToDOM(cm, from)) ||\n {node: view[0].measure.map[2], offset: 0};\n var end = to.line < cm.display.viewTo && posToDOM(cm, to);\n if (!end) {\n var measure = view[view.length - 1].measure;\n var map$$1 = measure.maps ? measure.maps[measure.maps.length - 1] : measure.map;\n end = {node: map$$1[map$$1.length - 1], offset: map$$1[map$$1.length - 2] - map$$1[map$$1.length - 3]};\n }\n\n if (!start || !end) {\n sel.removeAllRanges();\n return\n }\n\n var old = sel.rangeCount && sel.getRangeAt(0), rng;\n try { rng = range(start.node, start.offset, end.offset, end.node); }\n catch(e) {} // Our model of the DOM might be outdated, in which case the range we try to set can be impossible\n if (rng) {\n if (!gecko && cm.state.focused) {\n sel.collapse(start.node, start.offset);\n if (!rng.collapsed) {\n sel.removeAllRanges();\n sel.addRange(rng);\n }\n } else {\n sel.removeAllRanges();\n sel.addRange(rng);\n }\n if (old && sel.anchorNode == null) { sel.addRange(old); }\n else if (gecko) { this.startGracePeriod(); }\n }\n this.rememberSelection();\n};\n\nContentEditableInput.prototype.startGracePeriod = function () {\n var this$1 = this;\n\n clearTimeout(this.gracePeriod);\n this.gracePeriod = setTimeout(function () {\n this$1.gracePeriod = false;\n if (this$1.selectionChanged())\n { this$1.cm.operation(function () { return this$1.cm.curOp.selectionChanged = true; }); }\n }, 20);\n};\n\nContentEditableInput.prototype.showMultipleSelections = function (info) {\n removeChildrenAndAdd(this.cm.display.cursorDiv, info.cursors);\n removeChildrenAndAdd(this.cm.display.selectionDiv, info.selection);\n};\n\nContentEditableInput.prototype.rememberSelection = function () {\n var sel = window.getSelection();\n this.lastAnchorNode = sel.anchorNode; this.lastAnchorOffset = sel.anchorOffset;\n this.lastFocusNode = sel.focusNode; this.lastFocusOffset = sel.focusOffset;\n};\n\nContentEditableInput.prototype.selectionInEditor = function () {\n var sel = window.getSelection();\n if (!sel.rangeCount) { return false }\n var node = sel.getRangeAt(0).commonAncestorContainer;\n return contains(this.div, node)\n};\n\nContentEditableInput.prototype.focus = function () {\n if (this.cm.options.readOnly != \"nocursor\") {\n if (!this.selectionInEditor())\n { this.showSelection(this.prepareSelection(), true); }\n this.div.focus();\n }\n};\nContentEditableInput.prototype.blur = function () { this.div.blur(); };\nContentEditableInput.prototype.getField = function () { return this.div };\n\nContentEditableInput.prototype.supportsTouch = function () { return true };\n\nContentEditableInput.prototype.receivedFocus = function () {\n var input = this;\n if (this.selectionInEditor())\n { this.pollSelection(); }\n else\n { runInOp(this.cm, function () { return input.cm.curOp.selectionChanged = true; }); }\n\n function poll() {\n if (input.cm.state.focused) {\n input.pollSelection();\n input.polling.set(input.cm.options.pollInterval, poll);\n }\n }\n this.polling.set(this.cm.options.pollInterval, poll);\n};\n\nContentEditableInput.prototype.selectionChanged = function () {\n var sel = window.getSelection();\n return sel.anchorNode != this.lastAnchorNode || sel.anchorOffset != this.lastAnchorOffset ||\n sel.focusNode != this.lastFocusNode || sel.focusOffset != this.lastFocusOffset\n};\n\nContentEditableInput.prototype.pollSelection = function () {\n if (this.readDOMTimeout != null || this.gracePeriod || !this.selectionChanged()) { return }\n var sel = window.getSelection(), cm = this.cm;\n // On Android Chrome (version 56, at least), backspacing into an\n // uneditable block element will put the cursor in that element,\n // and then, because it's not editable, hide the virtual keyboard.\n // Because Android doesn't allow us to actually detect backspace\n // presses in a sane way, this code checks for when that happens\n // and simulates a backspace press in this case.\n if (android && chrome && this.cm.options.gutters.length && isInGutter(sel.anchorNode)) {\n this.cm.triggerOnKeyDown({type: \"keydown\", keyCode: 8, preventDefault: Math.abs});\n this.blur();\n this.focus();\n return\n }\n if (this.composing) { return }\n this.rememberSelection();\n var anchor = domToPos(cm, sel.anchorNode, sel.anchorOffset);\n var head = domToPos(cm, sel.focusNode, sel.focusOffset);\n if (anchor && head) { runInOp(cm, function () {\n setSelection(cm.doc, simpleSelection(anchor, head), sel_dontScroll);\n if (anchor.bad || head.bad) { cm.curOp.selectionChanged = true; }\n }); }\n};\n\nContentEditableInput.prototype.pollContent = function () {\n if (this.readDOMTimeout != null) {\n clearTimeout(this.readDOMTimeout);\n this.readDOMTimeout = null;\n }\n\n var cm = this.cm, display = cm.display, sel = cm.doc.sel.primary();\n var from = sel.from(), to = sel.to();\n if (from.ch == 0 && from.line > cm.firstLine())\n { from = Pos(from.line - 1, getLine(cm.doc, from.line - 1).length); }\n if (to.ch == getLine(cm.doc, to.line).text.length && to.line < cm.lastLine())\n { to = Pos(to.line + 1, 0); }\n if (from.line < display.viewFrom || to.line > display.viewTo - 1) { return false }\n\n var fromIndex, fromLine, fromNode;\n if (from.line == display.viewFrom || (fromIndex = findViewIndex(cm, from.line)) == 0) {\n fromLine = lineNo(display.view[0].line);\n fromNode = display.view[0].node;\n } else {\n fromLine = lineNo(display.view[fromIndex].line);\n fromNode = display.view[fromIndex - 1].node.nextSibling;\n }\n var toIndex = findViewIndex(cm, to.line);\n var toLine, toNode;\n if (toIndex == display.view.length - 1) {\n toLine = display.viewTo - 1;\n toNode = display.lineDiv.lastChild;\n } else {\n toLine = lineNo(display.view[toIndex + 1].line) - 1;\n toNode = display.view[toIndex + 1].node.previousSibling;\n }\n\n if (!fromNode) { return false }\n var newText = cm.doc.splitLines(domTextBetween(cm, fromNode, toNode, fromLine, toLine));\n var oldText = getBetween(cm.doc, Pos(fromLine, 0), Pos(toLine, getLine(cm.doc, toLine).text.length));\n while (newText.length > 1 && oldText.length > 1) {\n if (lst(newText) == lst(oldText)) { newText.pop(); oldText.pop(); toLine--; }\n else if (newText[0] == oldText[0]) { newText.shift(); oldText.shift(); fromLine++; }\n else { break }\n }\n\n var cutFront = 0, cutEnd = 0;\n var newTop = newText[0], oldTop = oldText[0], maxCutFront = Math.min(newTop.length, oldTop.length);\n while (cutFront < maxCutFront && newTop.charCodeAt(cutFront) == oldTop.charCodeAt(cutFront))\n { ++cutFront; }\n var newBot = lst(newText), oldBot = lst(oldText);\n var maxCutEnd = Math.min(newBot.length - (newText.length == 1 ? cutFront : 0),\n oldBot.length - (oldText.length == 1 ? cutFront : 0));\n while (cutEnd < maxCutEnd &&\n newBot.charCodeAt(newBot.length - cutEnd - 1) == oldBot.charCodeAt(oldBot.length - cutEnd - 1))\n { ++cutEnd; }\n // Try to move start of change to start of selection if ambiguous\n if (newText.length == 1 && oldText.length == 1 && fromLine == from.line) {\n while (cutFront && cutFront > from.ch &&\n newBot.charCodeAt(newBot.length - cutEnd - 1) == oldBot.charCodeAt(oldBot.length - cutEnd - 1)) {\n cutFront--;\n cutEnd++;\n }\n }\n\n newText[newText.length - 1] = newBot.slice(0, newBot.length - cutEnd).replace(/^\\u200b+/, \"\");\n newText[0] = newText[0].slice(cutFront).replace(/\\u200b+$/, \"\");\n\n var chFrom = Pos(fromLine, cutFront);\n var chTo = Pos(toLine, oldText.length ? lst(oldText).length - cutEnd : 0);\n if (newText.length > 1 || newText[0] || cmp(chFrom, chTo)) {\n replaceRange(cm.doc, newText, chFrom, chTo, \"+input\");\n return true\n }\n};\n\nContentEditableInput.prototype.ensurePolled = function () {\n this.forceCompositionEnd();\n};\nContentEditableInput.prototype.reset = function () {\n this.forceCompositionEnd();\n};\nContentEditableInput.prototype.forceCompositionEnd = function () {\n if (!this.composing) { return }\n clearTimeout(this.readDOMTimeout);\n this.composing = null;\n this.updateFromDOM();\n this.div.blur();\n this.div.focus();\n};\nContentEditableInput.prototype.readFromDOMSoon = function () {\n var this$1 = this;\n\n if (this.readDOMTimeout != null) { return }\n this.readDOMTimeout = setTimeout(function () {\n this$1.readDOMTimeout = null;\n if (this$1.composing) {\n if (this$1.composing.done) { this$1.composing = null; }\n else { return }\n }\n this$1.updateFromDOM();\n }, 80);\n};\n\nContentEditableInput.prototype.updateFromDOM = function () {\n var this$1 = this;\n\n if (this.cm.isReadOnly() || !this.pollContent())\n { runInOp(this.cm, function () { return regChange(this$1.cm); }); }\n};\n\nContentEditableInput.prototype.setUneditable = function (node) {\n node.contentEditable = \"false\";\n};\n\nContentEditableInput.prototype.onKeyPress = function (e) {\n if (e.charCode == 0) { return }\n e.preventDefault();\n if (!this.cm.isReadOnly())\n { operation(this.cm, applyTextInput)(this.cm, String.fromCharCode(e.charCode == null ? e.keyCode : e.charCode), 0); }\n};\n\nContentEditableInput.prototype.readOnlyChanged = function (val) {\n this.div.contentEditable = String(val != \"nocursor\");\n};\n\nContentEditableInput.prototype.onContextMenu = function () {};\nContentEditableInput.prototype.resetPosition = function () {};\n\nContentEditableInput.prototype.needsContentAttribute = true;\n\nfunction posToDOM(cm, pos) {\n var view = findViewForLine(cm, pos.line);\n if (!view || view.hidden) { return null }\n var line = getLine(cm.doc, pos.line);\n var info = mapFromLineView(view, line, pos.line);\n\n var order = getOrder(line, cm.doc.direction), side = \"left\";\n if (order) {\n var partPos = getBidiPartAt(order, pos.ch);\n side = partPos % 2 ? \"right\" : \"left\";\n }\n var result = nodeAndOffsetInLineMap(info.map, pos.ch, side);\n result.offset = result.collapse == \"right\" ? result.end : result.start;\n return result\n}\n\nfunction isInGutter(node) {\n for (var scan = node; scan; scan = scan.parentNode)\n { if (/CodeMirror-gutter-wrapper/.test(scan.className)) { return true } }\n return false\n}\n\nfunction badPos(pos, bad) { if (bad) { pos.bad = true; } return pos }\n\nfunction domTextBetween(cm, from, to, fromLine, toLine) {\n var text = \"\", closing = false, lineSep = cm.doc.lineSeparator();\n function recognizeMarker(id) { return function (marker) { return marker.id == id; } }\n function close() {\n if (closing) {\n text += lineSep;\n closing = false;\n }\n }\n function addText(str) {\n if (str) {\n close();\n text += str;\n }\n }\n function walk(node) {\n if (node.nodeType == 1) {\n var cmText = node.getAttribute(\"cm-text\");\n if (cmText != null) {\n addText(cmText || node.textContent.replace(/\\u200b/g, \"\"));\n return\n }\n var markerID = node.getAttribute(\"cm-marker\"), range$$1;\n if (markerID) {\n var found = cm.findMarks(Pos(fromLine, 0), Pos(toLine + 1, 0), recognizeMarker(+markerID));\n if (found.length && (range$$1 = found[0].find(0)))\n { addText(getBetween(cm.doc, range$$1.from, range$$1.to).join(lineSep)); }\n return\n }\n if (node.getAttribute(\"contenteditable\") == \"false\") { return }\n var isBlock = /^(pre|div|p)$/i.test(node.nodeName);\n if (isBlock) { close(); }\n for (var i = 0; i < node.childNodes.length; i++)\n { walk(node.childNodes[i]); }\n if (isBlock) { closing = true; }\n } else if (node.nodeType == 3) {\n addText(node.nodeValue);\n }\n }\n for (;;) {\n walk(from);\n if (from == to) { break }\n from = from.nextSibling;\n }\n return text\n}\n\nfunction domToPos(cm, node, offset) {\n var lineNode;\n if (node == cm.display.lineDiv) {\n lineNode = cm.display.lineDiv.childNodes[offset];\n if (!lineNode) { return badPos(cm.clipPos(Pos(cm.display.viewTo - 1)), true) }\n node = null; offset = 0;\n } else {\n for (lineNode = node;; lineNode = lineNode.parentNode) {\n if (!lineNode || lineNode == cm.display.lineDiv) { return null }\n if (lineNode.parentNode && lineNode.parentNode == cm.display.lineDiv) { break }\n }\n }\n for (var i = 0; i < cm.display.view.length; i++) {\n var lineView = cm.display.view[i];\n if (lineView.node == lineNode)\n { return locateNodeInLineView(lineView, node, offset) }\n }\n}\n\nfunction locateNodeInLineView(lineView, node, offset) {\n var wrapper = lineView.text.firstChild, bad = false;\n if (!node || !contains(wrapper, node)) { return badPos(Pos(lineNo(lineView.line), 0), true) }\n if (node == wrapper) {\n bad = true;\n node = wrapper.childNodes[offset];\n offset = 0;\n if (!node) {\n var line = lineView.rest ? lst(lineView.rest) : lineView.line;\n return badPos(Pos(lineNo(line), line.text.length), bad)\n }\n }\n\n var textNode = node.nodeType == 3 ? node : null, topNode = node;\n if (!textNode && node.childNodes.length == 1 && node.firstChild.nodeType == 3) {\n textNode = node.firstChild;\n if (offset) { offset = textNode.nodeValue.length; }\n }\n while (topNode.parentNode != wrapper) { topNode = topNode.parentNode; }\n var measure = lineView.measure, maps = measure.maps;\n\n function find(textNode, topNode, offset) {\n for (var i = -1; i < (maps ? maps.length : 0); i++) {\n var map$$1 = i < 0 ? measure.map : maps[i];\n for (var j = 0; j < map$$1.length; j += 3) {\n var curNode = map$$1[j + 2];\n if (curNode == textNode || curNode == topNode) {\n var line = lineNo(i < 0 ? lineView.line : lineView.rest[i]);\n var ch = map$$1[j] + offset;\n if (offset < 0 || curNode != textNode) { ch = map$$1[j + (offset ? 1 : 0)]; }\n return Pos(line, ch)\n }\n }\n }\n }\n var found = find(textNode, topNode, offset);\n if (found) { return badPos(found, bad) }\n\n // FIXME this is all really shaky. might handle the few cases it needs to handle, but likely to cause problems\n for (var after = topNode.nextSibling, dist = textNode ? textNode.nodeValue.length - offset : 0; after; after = after.nextSibling) {\n found = find(after, after.firstChild, 0);\n if (found)\n { return badPos(Pos(found.line, found.ch - dist), bad) }\n else\n { dist += after.textContent.length; }\n }\n for (var before = topNode.previousSibling, dist$1 = offset; before; before = before.previousSibling) {\n found = find(before, before.firstChild, -1);\n if (found)\n { return badPos(Pos(found.line, found.ch + dist$1), bad) }\n else\n { dist$1 += before.textContent.length; }\n }\n}\n\n// TEXTAREA INPUT STYLE\n\nvar TextareaInput = function(cm) {\n this.cm = cm;\n // See input.poll and input.reset\n this.prevInput = \"\";\n\n // Flag that indicates whether we expect input to appear real soon\n // now (after some event like 'keypress' or 'input') and are\n // polling intensively.\n this.pollingFast = false;\n // Self-resetting timeout for the poller\n this.polling = new Delayed();\n // Used to work around IE issue with selection being forgotten when focus moves away from textarea\n this.hasSelection = false;\n this.composing = null;\n};\n\nTextareaInput.prototype.init = function (display) {\n var this$1 = this;\n\n var input = this, cm = this.cm;\n\n // Wraps and hides input textarea\n var div = this.wrapper = hiddenTextarea();\n // The semihidden textarea that is focused when the editor is\n // focused, and receives input.\n var te = this.textarea = div.firstChild;\n display.wrapper.insertBefore(div, display.wrapper.firstChild);\n\n // Needed to hide big blue blinking cursor on Mobile Safari (doesn't seem to work in iOS 8 anymore)\n if (ios) { te.style.width = \"0px\"; }\n\n on(te, \"input\", function () {\n if (ie && ie_version >= 9 && this$1.hasSelection) { this$1.hasSelection = null; }\n input.poll();\n });\n\n on(te, \"paste\", function (e) {\n if (signalDOMEvent(cm, e) || handlePaste(e, cm)) { return }\n\n cm.state.pasteIncoming = true;\n input.fastPoll();\n });\n\n function prepareCopyCut(e) {\n if (signalDOMEvent(cm, e)) { return }\n if (cm.somethingSelected()) {\n setLastCopied({lineWise: false, text: cm.getSelections()});\n } else if (!cm.options.lineWiseCopyCut) {\n return\n } else {\n var ranges = copyableRanges(cm);\n setLastCopied({lineWise: true, text: ranges.text});\n if (e.type == \"cut\") {\n cm.setSelections(ranges.ranges, null, sel_dontScroll);\n } else {\n input.prevInput = \"\";\n te.value = ranges.text.join(\"\\n\");\n selectInput(te);\n }\n }\n if (e.type == \"cut\") { cm.state.cutIncoming = true; }\n }\n on(te, \"cut\", prepareCopyCut);\n on(te, \"copy\", prepareCopyCut);\n\n on(display.scroller, \"paste\", function (e) {\n if (eventInWidget(display, e) || signalDOMEvent(cm, e)) { return }\n cm.state.pasteIncoming = true;\n input.focus();\n });\n\n // Prevent normal selection in the editor (we handle our own)\n on(display.lineSpace, \"selectstart\", function (e) {\n if (!eventInWidget(display, e)) { e_preventDefault(e); }\n });\n\n on(te, \"compositionstart\", function () {\n var start = cm.getCursor(\"from\");\n if (input.composing) { input.composing.range.clear(); }\n input.composing = {\n start: start,\n range: cm.markText(start, cm.getCursor(\"to\"), {className: \"CodeMirror-composing\"})\n };\n });\n on(te, \"compositionend\", function () {\n if (input.composing) {\n input.poll();\n input.composing.range.clear();\n input.composing = null;\n }\n });\n};\n\nTextareaInput.prototype.prepareSelection = function () {\n // Redraw the selection and/or cursor\n var cm = this.cm, display = cm.display, doc = cm.doc;\n var result = prepareSelection(cm);\n\n // Move the hidden textarea near the cursor to prevent scrolling artifacts\n if (cm.options.moveInputWithCursor) {\n var headPos = cursorCoords(cm, doc.sel.primary().head, \"div\");\n var wrapOff = display.wrapper.getBoundingClientRect(), lineOff = display.lineDiv.getBoundingClientRect();\n result.teTop = Math.max(0, Math.min(display.wrapper.clientHeight - 10,\n headPos.top + lineOff.top - wrapOff.top));\n result.teLeft = Math.max(0, Math.min(display.wrapper.clientWidth - 10,\n headPos.left + lineOff.left - wrapOff.left));\n }\n\n return result\n};\n\nTextareaInput.prototype.showSelection = function (drawn) {\n var cm = this.cm, display = cm.display;\n removeChildrenAndAdd(display.cursorDiv, drawn.cursors);\n removeChildrenAndAdd(display.selectionDiv, drawn.selection);\n if (drawn.teTop != null) {\n this.wrapper.style.top = drawn.teTop + \"px\";\n this.wrapper.style.left = drawn.teLeft + \"px\";\n }\n};\n\n// Reset the input to correspond to the selection (or to be empty,\n// when not typing and nothing is selected)\nTextareaInput.prototype.reset = function (typing) {\n if (this.contextMenuPending || this.composing) { return }\n var cm = this.cm;\n if (cm.somethingSelected()) {\n this.prevInput = \"\";\n var content = cm.getSelection();\n this.textarea.value = content;\n if (cm.state.focused) { selectInput(this.textarea); }\n if (ie && ie_version >= 9) { this.hasSelection = content; }\n } else if (!typing) {\n this.prevInput = this.textarea.value = \"\";\n if (ie && ie_version >= 9) { this.hasSelection = null; }\n }\n};\n\nTextareaInput.prototype.getField = function () { return this.textarea };\n\nTextareaInput.prototype.supportsTouch = function () { return false };\n\nTextareaInput.prototype.focus = function () {\n if (this.cm.options.readOnly != \"nocursor\" && (!mobile || activeElt() != this.textarea)) {\n try { this.textarea.focus(); }\n catch (e) {} // IE8 will throw if the textarea is display: none or not in DOM\n }\n};\n\nTextareaInput.prototype.blur = function () { this.textarea.blur(); };\n\nTextareaInput.prototype.resetPosition = function () {\n this.wrapper.style.top = this.wrapper.style.left = 0;\n};\n\nTextareaInput.prototype.receivedFocus = function () { this.slowPoll(); };\n\n// Poll for input changes, using the normal rate of polling. This\n// runs as long as the editor is focused.\nTextareaInput.prototype.slowPoll = function () {\n var this$1 = this;\n\n if (this.pollingFast) { return }\n this.polling.set(this.cm.options.pollInterval, function () {\n this$1.poll();\n if (this$1.cm.state.focused) { this$1.slowPoll(); }\n });\n};\n\n// When an event has just come in that is likely to add or change\n// something in the input textarea, we poll faster, to ensure that\n// the change appears on the screen quickly.\nTextareaInput.prototype.fastPoll = function () {\n var missed = false, input = this;\n input.pollingFast = true;\n function p() {\n var changed = input.poll();\n if (!changed && !missed) {missed = true; input.polling.set(60, p);}\n else {input.pollingFast = false; input.slowPoll();}\n }\n input.polling.set(20, p);\n};\n\n// Read input from the textarea, and update the document to match.\n// When something is selected, it is present in the textarea, and\n// selected (unless it is huge, in which case a placeholder is\n// used). When nothing is selected, the cursor sits after previously\n// seen text (can be empty), which is stored in prevInput (we must\n// not reset the textarea when typing, because that breaks IME).\nTextareaInput.prototype.poll = function () {\n var this$1 = this;\n\n var cm = this.cm, input = this.textarea, prevInput = this.prevInput;\n // Since this is called a *lot*, try to bail out as cheaply as\n // possible when it is clear that nothing happened. hasSelection\n // will be the case when there is a lot of text in the textarea,\n // in which case reading its value would be expensive.\n if (this.contextMenuPending || !cm.state.focused ||\n (hasSelection(input) && !prevInput && !this.composing) ||\n cm.isReadOnly() || cm.options.disableInput || cm.state.keySeq)\n { return false }\n\n var text = input.value;\n // If nothing changed, bail.\n if (text == prevInput && !cm.somethingSelected()) { return false }\n // Work around nonsensical selection resetting in IE9/10, and\n // inexplicable appearance of private area unicode characters on\n // some key combos in Mac (#2689).\n if (ie && ie_version >= 9 && this.hasSelection === text ||\n mac && /[\\uf700-\\uf7ff]/.test(text)) {\n cm.display.input.reset();\n return false\n }\n\n if (cm.doc.sel == cm.display.selForContextMenu) {\n var first = text.charCodeAt(0);\n if (first == 0x200b && !prevInput) { prevInput = \"\\u200b\"; }\n if (first == 0x21da) { this.reset(); return this.cm.execCommand(\"undo\") }\n }\n // Find the part of the input that is actually new\n var same = 0, l = Math.min(prevInput.length, text.length);\n while (same < l && prevInput.charCodeAt(same) == text.charCodeAt(same)) { ++same; }\n\n runInOp(cm, function () {\n applyTextInput(cm, text.slice(same), prevInput.length - same,\n null, this$1.composing ? \"*compose\" : null);\n\n // Don't leave long text in the textarea, since it makes further polling slow\n if (text.length > 1000 || text.indexOf(\"\\n\") > -1) { input.value = this$1.prevInput = \"\"; }\n else { this$1.prevInput = text; }\n\n if (this$1.composing) {\n this$1.composing.range.clear();\n this$1.composing.range = cm.markText(this$1.composing.start, cm.getCursor(\"to\"),\n {className: \"CodeMirror-composing\"});\n }\n });\n return true\n};\n\nTextareaInput.prototype.ensurePolled = function () {\n if (this.pollingFast && this.poll()) { this.pollingFast = false; }\n};\n\nTextareaInput.prototype.onKeyPress = function () {\n if (ie && ie_version >= 9) { this.hasSelection = null; }\n this.fastPoll();\n};\n\nTextareaInput.prototype.onContextMenu = function (e) {\n var input = this, cm = input.cm, display = cm.display, te = input.textarea;\n var pos = posFromMouse(cm, e), scrollPos = display.scroller.scrollTop;\n if (!pos || presto) { return } // Opera is difficult.\n\n // Reset the current text selection only if the click is done outside of the selection\n // and 'resetSelectionOnContextMenu' option is true.\n var reset = cm.options.resetSelectionOnContextMenu;\n if (reset && cm.doc.sel.contains(pos) == -1)\n { operation(cm, setSelection)(cm.doc, simpleSelection(pos), sel_dontScroll); }\n\n var oldCSS = te.style.cssText, oldWrapperCSS = input.wrapper.style.cssText;\n input.wrapper.style.cssText = \"position: absolute\";\n var wrapperBox = input.wrapper.getBoundingClientRect();\n te.style.cssText = \"position: absolute; width: 30px; height: 30px;\\n top: \" + (e.clientY - wrapperBox.top - 5) + \"px; left: \" + (e.clientX - wrapperBox.left - 5) + \"px;\\n z-index: 1000; background: \" + (ie ? \"rgba(255, 255, 255, .05)\" : \"transparent\") + \";\\n outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);\";\n var oldScrollY;\n if (webkit) { oldScrollY = window.scrollY; } // Work around Chrome issue (#2712)\n display.input.focus();\n if (webkit) { window.scrollTo(null, oldScrollY); }\n display.input.reset();\n // Adds \"Select all\" to context menu in FF\n if (!cm.somethingSelected()) { te.value = input.prevInput = \" \"; }\n input.contextMenuPending = true;\n display.selForContextMenu = cm.doc.sel;\n clearTimeout(display.detectingSelectAll);\n\n // Select-all will be greyed out if there's nothing to select, so\n // this adds a zero-width space so that we can later check whether\n // it got selected.\n function prepareSelectAllHack() {\n if (te.selectionStart != null) {\n var selected = cm.somethingSelected();\n var extval = \"\\u200b\" + (selected ? te.value : \"\");\n te.value = \"\\u21da\"; // Used to catch context-menu undo\n te.value = extval;\n input.prevInput = selected ? \"\" : \"\\u200b\";\n te.selectionStart = 1; te.selectionEnd = extval.length;\n // Re-set this, in case some other handler touched the\n // selection in the meantime.\n display.selForContextMenu = cm.doc.sel;\n }\n }\n function rehide() {\n input.contextMenuPending = false;\n input.wrapper.style.cssText = oldWrapperCSS;\n te.style.cssText = oldCSS;\n if (ie && ie_version < 9) { display.scrollbars.setScrollTop(display.scroller.scrollTop = scrollPos); }\n\n // Try to detect the user choosing select-all\n if (te.selectionStart != null) {\n if (!ie || (ie && ie_version < 9)) { prepareSelectAllHack(); }\n var i = 0, poll = function () {\n if (display.selForContextMenu == cm.doc.sel && te.selectionStart == 0 &&\n te.selectionEnd > 0 && input.prevInput == \"\\u200b\") {\n operation(cm, selectAll)(cm);\n } else if (i++ < 10) {\n display.detectingSelectAll = setTimeout(poll, 500);\n } else {\n display.selForContextMenu = null;\n display.input.reset();\n }\n };\n display.detectingSelectAll = setTimeout(poll, 200);\n }\n }\n\n if (ie && ie_version >= 9) { prepareSelectAllHack(); }\n if (captureRightClick) {\n e_stop(e);\n var mouseup = function () {\n off(window, \"mouseup\", mouseup);\n setTimeout(rehide, 20);\n };\n on(window, \"mouseup\", mouseup);\n } else {\n setTimeout(rehide, 50);\n }\n};\n\nTextareaInput.prototype.readOnlyChanged = function (val) {\n if (!val) { this.reset(); }\n this.textarea.disabled = val == \"nocursor\";\n};\n\nTextareaInput.prototype.setUneditable = function () {};\n\nTextareaInput.prototype.needsContentAttribute = false;\n\nfunction fromTextArea(textarea, options) {\n options = options ? copyObj(options) : {};\n options.value = textarea.value;\n if (!options.tabindex && textarea.tabIndex)\n { options.tabindex = textarea.tabIndex; }\n if (!options.placeholder && textarea.placeholder)\n { options.placeholder = textarea.placeholder; }\n // Set autofocus to true if this textarea is focused, or if it has\n // autofocus and no other element is focused.\n if (options.autofocus == null) {\n var hasFocus = activeElt();\n options.autofocus = hasFocus == textarea ||\n textarea.getAttribute(\"autofocus\") != null && hasFocus == document.body;\n }\n\n function save() {textarea.value = cm.getValue();}\n\n var realSubmit;\n if (textarea.form) {\n on(textarea.form, \"submit\", save);\n // Deplorable hack to make the submit method do the right thing.\n if (!options.leaveSubmitMethodAlone) {\n var form = textarea.form;\n realSubmit = form.submit;\n try {\n var wrappedSubmit = form.submit = function () {\n save();\n form.submit = realSubmit;\n form.submit();\n form.submit = wrappedSubmit;\n };\n } catch(e) {}\n }\n }\n\n options.finishInit = function (cm) {\n cm.save = save;\n cm.getTextArea = function () { return textarea; };\n cm.toTextArea = function () {\n cm.toTextArea = isNaN; // Prevent this from being ran twice\n save();\n textarea.parentNode.removeChild(cm.getWrapperElement());\n textarea.style.display = \"\";\n if (textarea.form) {\n off(textarea.form, \"submit\", save);\n if (typeof textarea.form.submit == \"function\")\n { textarea.form.submit = realSubmit; }\n }\n };\n };\n\n textarea.style.display = \"none\";\n var cm = CodeMirror$1(function (node) { return textarea.parentNode.insertBefore(node, textarea.nextSibling); },\n options);\n return cm\n}\n\nfunction addLegacyProps(CodeMirror) {\n CodeMirror.off = off;\n CodeMirror.on = on;\n CodeMirror.wheelEventPixels = wheelEventPixels;\n CodeMirror.Doc = Doc;\n CodeMirror.splitLines = splitLinesAuto;\n CodeMirror.countColumn = countColumn;\n CodeMirror.findColumn = findColumn;\n CodeMirror.isWordChar = isWordCharBasic;\n CodeMirror.Pass = Pass;\n CodeMirror.signal = signal;\n CodeMirror.Line = Line;\n CodeMirror.changeEnd = changeEnd;\n CodeMirror.scrollbarModel = scrollbarModel;\n CodeMirror.Pos = Pos;\n CodeMirror.cmpPos = cmp;\n CodeMirror.modes = modes;\n CodeMirror.mimeModes = mimeModes;\n CodeMirror.resolveMode = resolveMode;\n CodeMirror.getMode = getMode;\n CodeMirror.modeExtensions = modeExtensions;\n CodeMirror.extendMode = extendMode;\n CodeMirror.copyState = copyState;\n CodeMirror.startState = startState;\n CodeMirror.innerMode = innerMode;\n CodeMirror.commands = commands;\n CodeMirror.keyMap = keyMap;\n CodeMirror.keyName = keyName;\n CodeMirror.isModifierKey = isModifierKey;\n CodeMirror.lookupKey = lookupKey;\n CodeMirror.normalizeKeyMap = normalizeKeyMap;\n CodeMirror.StringStream = StringStream;\n CodeMirror.SharedTextMarker = SharedTextMarker;\n CodeMirror.TextMarker = TextMarker;\n CodeMirror.LineWidget = LineWidget;\n CodeMirror.e_preventDefault = e_preventDefault;\n CodeMirror.e_stopPropagation = e_stopPropagation;\n CodeMirror.e_stop = e_stop;\n CodeMirror.addClass = addClass;\n CodeMirror.contains = contains;\n CodeMirror.rmClass = rmClass;\n CodeMirror.keyNames = keyNames;\n}\n\n// EDITOR CONSTRUCTOR\n\ndefineOptions(CodeMirror$1);\n\naddEditorMethods(CodeMirror$1);\n\n// Set up methods on CodeMirror's prototype to redirect to the editor's document.\nvar dontDelegate = \"iter insert remove copy getEditor constructor\".split(\" \");\nfor (var prop in Doc.prototype) { if (Doc.prototype.hasOwnProperty(prop) && indexOf(dontDelegate, prop) < 0)\n { CodeMirror$1.prototype[prop] = (function(method) {\n return function() {return method.apply(this.doc, arguments)}\n })(Doc.prototype[prop]); } }\n\neventMixin(Doc);\n\n// INPUT HANDLING\n\nCodeMirror$1.inputStyles = {\"textarea\": TextareaInput, \"contenteditable\": ContentEditableInput};\n\n// MODE DEFINITION AND QUERYING\n\n// Extra arguments are stored as the mode's dependencies, which is\n// used by (legacy) mechanisms like loadmode.js to automatically\n// load a mode. (Preferred mechanism is the require/define calls.)\nCodeMirror$1.defineMode = function(name/*, mode, …*/) {\n if (!CodeMirror$1.defaults.mode && name != \"null\") { CodeMirror$1.defaults.mode = name; }\n defineMode.apply(this, arguments);\n};\n\nCodeMirror$1.defineMIME = defineMIME;\n\n// Minimal default mode.\nCodeMirror$1.defineMode(\"null\", function () { return ({token: function (stream) { return stream.skipToEnd(); }}); });\nCodeMirror$1.defineMIME(\"text/plain\", \"null\");\n\n// EXTENSIONS\n\nCodeMirror$1.defineExtension = function (name, func) {\n CodeMirror$1.prototype[name] = func;\n};\nCodeMirror$1.defineDocExtension = function (name, func) {\n Doc.prototype[name] = func;\n};\n\nCodeMirror$1.fromTextArea = fromTextArea;\n\naddLegacyProps(CodeMirror$1);\n\nCodeMirror$1.version = \"5.31.0\";\n\nreturn CodeMirror$1;\n\n})));\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/codemirror/lib/codemirror.js","module.exports = function(originalModule) {\n\tif(!originalModule.webpackPolyfill) {\n\t\tvar module = Object.create(originalModule);\n\t\t// module.parent = undefined by default\n\t\tif(!module.children) module.children = [];\n\t\tObject.defineProperty(module, \"loaded\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.l;\n\t\t\t}\n\t\t});\n\t\tObject.defineProperty(module, \"id\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.i;\n\t\t\t}\n\t\t});\n\t\tObject.defineProperty(module, \"exports\", {\n\t\t\tenumerable: true,\n\t\t});\n\t\tmodule.webpackPolyfill = 1;\n\t}\n\treturn module;\n};\n\n\n\n// WEBPACK FOOTER //\n// (webpack)/buildin/harmony-module.js","/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nexport default freeGlobal;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/_freeGlobal.js","import root from './_root.js';\nimport stubFalse from './stubFalse.js';\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined;\n\n/**\n * Checks if `value` is a buffer.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n * @example\n *\n * _.isBuffer(new Buffer(2));\n * // => true\n *\n * _.isBuffer(new Uint8Array(2));\n * // => false\n */\nvar isBuffer = nativeIsBuffer || stubFalse;\n\nexport default isBuffer;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/isBuffer.js","import listCacheClear from './_listCacheClear.js';\nimport listCacheDelete from './_listCacheDelete.js';\nimport listCacheGet from './_listCacheGet.js';\nimport listCacheHas from './_listCacheHas.js';\nimport listCacheSet from './_listCacheSet.js';\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `ListCache`.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\nexport default ListCache;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/_ListCache.js","import hashClear from './_hashClear.js';\nimport hashDelete from './_hashDelete.js';\nimport hashGet from './_hashGet.js';\nimport hashHas from './_hashHas.js';\nimport hashSet from './_hashSet.js';\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `Hash`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\nexport default Hash;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/_Hash.js","import mapCacheClear from './_mapCacheClear.js';\nimport mapCacheDelete from './_mapCacheDelete.js';\nimport mapCacheGet from './_mapCacheGet.js';\nimport mapCacheHas from './_mapCacheHas.js';\nimport mapCacheSet from './_mapCacheSet.js';\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `MapCache`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\nexport default MapCache;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/_MapCache.js","import ListCache from './_ListCache.js';\nimport stackClear from './_stackClear.js';\nimport stackDelete from './_stackDelete.js';\nimport stackGet from './_stackGet.js';\nimport stackHas from './_stackHas.js';\nimport stackSet from './_stackSet.js';\n\n/**\n * Creates a stack cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Stack(entries) {\n var data = this.__data__ = new ListCache(entries);\n this.size = data.size;\n}\n\n// Add methods to `Stack`.\nStack.prototype.clear = stackClear;\nStack.prototype['delete'] = stackDelete;\nStack.prototype.get = stackGet;\nStack.prototype.has = stackHas;\nStack.prototype.set = stackSet;\n\nexport default Stack;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/_Stack.js","import Stack from './_Stack.js';\nimport assignMergeValue from './_assignMergeValue.js';\nimport baseFor from './_baseFor.js';\nimport baseMergeDeep from './_baseMergeDeep.js';\nimport isObject from './isObject.js';\nimport keysIn from './keysIn.js';\n\n/**\n * The base implementation of `_.merge` without support for multiple sources.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @param {number} srcIndex The index of `source`.\n * @param {Function} [customizer] The function to customize merged values.\n * @param {Object} [stack] Tracks traversed source values and their merged\n * counterparts.\n */\nfunction baseMerge(object, source, srcIndex, customizer, stack) {\n if (object === source) {\n return;\n }\n baseFor(source, function(srcValue, key) {\n if (isObject(srcValue)) {\n stack || (stack = new Stack);\n baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack);\n }\n else {\n var newValue = customizer\n ? customizer(object[key], srcValue, (key + ''), object, source, stack)\n : undefined;\n\n if (newValue === undefined) {\n newValue = srcValue;\n }\n assignMergeValue(object, key, newValue);\n }\n }, keysIn);\n}\n\nexport default baseMerge;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/_baseMerge.js","import MapCache from './_MapCache.js';\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a function that memoizes the result of `func`. If `resolver` is\n * provided, it determines the cache key for storing the result based on the\n * arguments provided to the memoized function. By default, the first argument\n * provided to the memoized function is used as the map cache key. The `func`\n * is invoked with the `this` binding of the memoized function.\n *\n * **Note:** The cache is exposed as the `cache` property on the memoized\n * function. Its creation may be customized by replacing the `_.memoize.Cache`\n * constructor with one whose instances implement the\n * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n * method interface of `clear`, `delete`, `get`, `has`, and `set`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to have its output memoized.\n * @param {Function} [resolver] The function to resolve the cache key.\n * @returns {Function} Returns the new memoized function.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n * var other = { 'c': 3, 'd': 4 };\n *\n * var values = _.memoize(_.values);\n * values(object);\n * // => [1, 2]\n *\n * values(other);\n * // => [3, 4]\n *\n * object.a = 2;\n * values(object);\n * // => [1, 2]\n *\n * // Modify the result cache.\n * values.cache.set(object, ['a', 'b']);\n * values(object);\n * // => ['a', 'b']\n *\n * // Replace `_.memoize.Cache`.\n * _.memoize.Cache = WeakMap;\n */\nfunction memoize(func, resolver) {\n if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n var memoized = function() {\n var args = arguments,\n key = resolver ? resolver.apply(this, args) : args[0],\n cache = memoized.cache;\n\n if (cache.has(key)) {\n return cache.get(key);\n }\n var result = func.apply(this, args);\n memoized.cache = cache.set(key, result) || cache;\n return result;\n };\n memoized.cache = new (memoize.Cache || MapCache);\n return memoized;\n}\n\n// Expose `MapCache`.\nmemoize.Cache = MapCache;\n\nexport default memoize;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/memoize.js","import isObject from './isObject.js';\nimport now from './now.js';\nimport toNumber from './toNumber.js';\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max,\n nativeMin = Math.min;\n\n/**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed `func` invocations and a `flush` method to immediately invoke them.\n * Provide `options` to indicate whether `func` should be invoked on the\n * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n * with the last arguments provided to the debounced function. Subsequent\n * calls to the debounced function return the result of the last `func`\n * invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the debounced function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.debounce` and `_.throttle`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=false]\n * Specify invoking on the leading edge of the timeout.\n * @param {number} [options.maxWait]\n * The maximum time `func` is allowed to be delayed before it's invoked.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n * 'leading': true,\n * 'trailing': false\n * }));\n *\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\nfunction debounce(func, wait, options) {\n var lastArgs,\n lastThis,\n maxWait,\n result,\n timerId,\n lastCallTime,\n lastInvokeTime = 0,\n leading = false,\n maxing = false,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n wait = toNumber(wait) || 0;\n if (isObject(options)) {\n leading = !!options.leading;\n maxing = 'maxWait' in options;\n maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n\n function invokeFunc(time) {\n var args = lastArgs,\n thisArg = lastThis;\n\n lastArgs = lastThis = undefined;\n lastInvokeTime = time;\n result = func.apply(thisArg, args);\n return result;\n }\n\n function leadingEdge(time) {\n // Reset any `maxWait` timer.\n lastInvokeTime = time;\n // Start the timer for the trailing edge.\n timerId = setTimeout(timerExpired, wait);\n // Invoke the leading edge.\n return leading ? invokeFunc(time) : result;\n }\n\n function remainingWait(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime,\n result = wait - timeSinceLastCall;\n\n return maxing ? nativeMin(result, maxWait - timeSinceLastInvoke) : result;\n }\n\n function shouldInvoke(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime;\n\n // Either this is the first call, activity has stopped and we're at the\n // trailing edge, the system time has gone backwards and we're treating\n // it as the trailing edge, or we've hit the `maxWait` limit.\n return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n }\n\n function timerExpired() {\n var time = now();\n if (shouldInvoke(time)) {\n return trailingEdge(time);\n }\n // Restart the timer.\n timerId = setTimeout(timerExpired, remainingWait(time));\n }\n\n function trailingEdge(time) {\n timerId = undefined;\n\n // Only invoke if we have `lastArgs` which means `func` has been\n // debounced at least once.\n if (trailing && lastArgs) {\n return invokeFunc(time);\n }\n lastArgs = lastThis = undefined;\n return result;\n }\n\n function cancel() {\n if (timerId !== undefined) {\n clearTimeout(timerId);\n }\n lastInvokeTime = 0;\n lastArgs = lastCallTime = lastThis = timerId = undefined;\n }\n\n function flush() {\n return timerId === undefined ? result : trailingEdge(now());\n }\n\n function debounced() {\n var time = now(),\n isInvoking = shouldInvoke(time);\n\n lastArgs = arguments;\n lastThis = this;\n lastCallTime = time;\n\n if (isInvoking) {\n if (timerId === undefined) {\n return leadingEdge(lastCallTime);\n }\n if (maxing) {\n // Handle invocations in a tight loop.\n timerId = setTimeout(timerExpired, wait);\n return invokeFunc(lastCallTime);\n }\n }\n if (timerId === undefined) {\n timerId = setTimeout(timerExpired, wait);\n }\n return result;\n }\n debounced.cancel = cancel;\n debounced.flush = flush;\n return debounced;\n}\n\nexport default debounce;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/debounce.js","/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n this.__data__ = [];\n this.size = 0;\n}\n\nexport default listCacheClear;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/_listCacheClear.js","/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n return value === other || (value !== value && other !== other);\n}\n\nexport default eq;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/eq.js","import eq from './eq.js';\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n var length = array.length;\n while (length--) {\n if (eq(array[length][0], key)) {\n return length;\n }\n }\n return -1;\n}\n\nexport default assocIndexOf;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/_assocIndexOf.js","import assocIndexOf from './_assocIndexOf.js';\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype;\n\n/** Built-in value references. */\nvar splice = arrayProto.splice;\n\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction listCacheDelete(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n return false;\n }\n var lastIndex = data.length - 1;\n if (index == lastIndex) {\n data.pop();\n } else {\n splice.call(data, index, 1);\n }\n --this.size;\n return true;\n}\n\nexport default listCacheDelete;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/_listCacheDelete.js","import assocIndexOf from './_assocIndexOf.js';\n\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n return index < 0 ? undefined : data[index][1];\n}\n\nexport default listCacheGet;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/_listCacheGet.js","import assocIndexOf from './_assocIndexOf.js';\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n return assocIndexOf(this.__data__, key) > -1;\n}\n\nexport default listCacheHas;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/_listCacheHas.js","import assocIndexOf from './_assocIndexOf.js';\n\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n ++this.size;\n data.push([key, value]);\n } else {\n data[index][1] = value;\n }\n return this;\n}\n\nexport default listCacheSet;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/_listCacheSet.js","import ListCache from './_ListCache.js';\n\n/**\n * Removes all key-value entries from the stack.\n *\n * @private\n * @name clear\n * @memberOf Stack\n */\nfunction stackClear() {\n this.__data__ = new ListCache;\n this.size = 0;\n}\n\nexport default stackClear;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/_stackClear.js","/**\n * Removes `key` and its value from the stack.\n *\n * @private\n * @name delete\n * @memberOf Stack\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction stackDelete(key) {\n var data = this.__data__,\n result = data['delete'](key);\n\n this.size = data.size;\n return result;\n}\n\nexport default stackDelete;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/_stackDelete.js","/**\n * Gets the stack value for `key`.\n *\n * @private\n * @name get\n * @memberOf Stack\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction stackGet(key) {\n return this.__data__.get(key);\n}\n\nexport default stackGet;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/_stackGet.js","/**\n * Checks if a stack value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Stack\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction stackHas(key) {\n return this.__data__.has(key);\n}\n\nexport default stackHas;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/_stackHas.js","import root from './_root.js';\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nexport default Symbol;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/_Symbol.js","import Symbol from './_Symbol.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n}\n\nexport default getRawTag;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/_getRawTag.js","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n return nativeObjectToString.call(value);\n}\n\nexport default objectToString;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/_objectToString.js","import Symbol from './_Symbol.js';\nimport getRawTag from './_getRawTag.js';\nimport objectToString from './_objectToString.js';\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n}\n\nexport default baseGetTag;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/_baseGetTag.js","/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n}\n\nexport default isObject;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/isObject.js","import baseGetTag from './_baseGetTag.js';\nimport isObject from './isObject.js';\n\n/** `Object#toString` result references. */\nvar asyncTag = '[object AsyncFunction]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n proxyTag = '[object Proxy]';\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n if (!isObject(value)) {\n return false;\n }\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 9 which returns 'object' for typed arrays and other constructors.\n var tag = baseGetTag(value);\n return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n}\n\nexport default isFunction;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/isFunction.js","import root from './_root.js';\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\nexport default coreJsData;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/_coreJsData.js","import coreJsData from './_coreJsData.js';\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n return !!maskSrcKey && (maskSrcKey in func);\n}\n\nexport default isMasked;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/_isMasked.js","/** Used for built-in method references. */\nvar funcProto = Function.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n if (func != null) {\n try {\n return funcToString.call(func);\n } catch (e) {}\n try {\n return (func + '');\n } catch (e) {}\n }\n return '';\n}\n\nexport default toSource;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/_toSource.js","import isFunction from './isFunction.js';\nimport isMasked from './_isMasked.js';\nimport isObject from './isObject.js';\nimport toSource from './_toSource.js';\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n */\nfunction baseIsNative(value) {\n if (!isObject(value) || isMasked(value)) {\n return false;\n }\n var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n return pattern.test(toSource(value));\n}\n\nexport default baseIsNative;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/_baseIsNative.js","/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n return object == null ? undefined : object[key];\n}\n\nexport default getValue;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/_getValue.js","import baseIsNative from './_baseIsNative.js';\nimport getValue from './_getValue.js';\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n var value = getValue(object, key);\n return baseIsNative(value) ? value : undefined;\n}\n\nexport default getNative;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/_getNative.js","import getNative from './_getNative.js';\nimport root from './_root.js';\n\n/* Built-in method references that are verified to be native. */\nvar Map = getNative(root, 'Map');\n\nexport default Map;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/_Map.js","import getNative from './_getNative.js';\n\n/* Built-in method references that are verified to be native. */\nvar nativeCreate = getNative(Object, 'create');\n\nexport default nativeCreate;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/_nativeCreate.js","import nativeCreate from './_nativeCreate.js';\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\n this.size = 0;\n}\n\nexport default hashClear;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/_hashClear.js","/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n var result = this.has(key) && delete this.__data__[key];\n this.size -= result ? 1 : 0;\n return result;\n}\n\nexport default hashDelete;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/_hashDelete.js","import nativeCreate from './_nativeCreate.js';\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n var data = this.__data__;\n if (nativeCreate) {\n var result = data[key];\n return result === HASH_UNDEFINED ? undefined : result;\n }\n return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\nexport default hashGet;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/_hashGet.js","import nativeCreate from './_nativeCreate.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction hashHas(key) {\n var data = this.__data__;\n return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n}\n\nexport default hashHas;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/_hashHas.js","import nativeCreate from './_nativeCreate.js';\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n var data = this.__data__;\n this.size += this.has(key) ? 0 : 1;\n data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n return this;\n}\n\nexport default hashSet;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/_hashSet.js","import Hash from './_Hash.js';\nimport ListCache from './_ListCache.js';\nimport Map from './_Map.js';\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n this.size = 0;\n this.__data__ = {\n 'hash': new Hash,\n 'map': new (Map || ListCache),\n 'string': new Hash\n };\n}\n\nexport default mapCacheClear;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/_mapCacheClear.js","/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n var type = typeof value;\n return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n ? (value !== '__proto__')\n : (value === null);\n}\n\nexport default isKeyable;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/_isKeyable.js","import isKeyable from './_isKeyable.js';\n\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n var data = map.__data__;\n return isKeyable(key)\n ? data[typeof key == 'string' ? 'string' : 'hash']\n : data.map;\n}\n\nexport default getMapData;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/_getMapData.js","import getMapData from './_getMapData.js';\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n var result = getMapData(this, key)['delete'](key);\n this.size -= result ? 1 : 0;\n return result;\n}\n\nexport default mapCacheDelete;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/_mapCacheDelete.js","import getMapData from './_getMapData.js';\n\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n return getMapData(this, key).get(key);\n}\n\nexport default mapCacheGet;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/_mapCacheGet.js","import getMapData from './_getMapData.js';\n\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction mapCacheHas(key) {\n return getMapData(this, key).has(key);\n}\n\nexport default mapCacheHas;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/_mapCacheHas.js","import getMapData from './_getMapData.js';\n\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n var data = getMapData(this, key),\n size = data.size;\n\n data.set(key, value);\n this.size += data.size == size ? 0 : 1;\n return this;\n}\n\nexport default mapCacheSet;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/_mapCacheSet.js","import ListCache from './_ListCache.js';\nimport Map from './_Map.js';\nimport MapCache from './_MapCache.js';\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * Sets the stack `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Stack\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the stack cache instance.\n */\nfunction stackSet(key, value) {\n var data = this.__data__;\n if (data instanceof ListCache) {\n var pairs = data.__data__;\n if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n pairs.push([key, value]);\n this.size = ++data.size;\n return this;\n }\n data = this.__data__ = new MapCache(pairs);\n }\n data.set(key, value);\n this.size = data.size;\n return this;\n}\n\nexport default stackSet;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/_stackSet.js","import getNative from './_getNative.js';\n\nvar defineProperty = (function() {\n try {\n var func = getNative(Object, 'defineProperty');\n func({}, '', {});\n return func;\n } catch (e) {}\n}());\n\nexport default defineProperty;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/_defineProperty.js","import defineProperty from './_defineProperty.js';\n\n/**\n * The base implementation of `assignValue` and `assignMergeValue` without\n * value checks.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction baseAssignValue(object, key, value) {\n if (key == '__proto__' && defineProperty) {\n defineProperty(object, key, {\n 'configurable': true,\n 'enumerable': true,\n 'value': value,\n 'writable': true\n });\n } else {\n object[key] = value;\n }\n}\n\nexport default baseAssignValue;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/_baseAssignValue.js","import baseAssignValue from './_baseAssignValue.js';\nimport eq from './eq.js';\n\n/**\n * This function is like `assignValue` except that it doesn't assign\n * `undefined` values.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction assignMergeValue(object, key, value) {\n if ((value !== undefined && !eq(object[key], value)) ||\n (value === undefined && !(key in object))) {\n baseAssignValue(object, key, value);\n }\n}\n\nexport default assignMergeValue;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/_assignMergeValue.js","import createBaseFor from './_createBaseFor.js';\n\n/**\n * The base implementation of `baseForOwn` which iterates over `object`\n * properties returned by `keysFunc` and invokes `iteratee` for each property.\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @returns {Object} Returns `object`.\n */\nvar baseFor = createBaseFor();\n\nexport default baseFor;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/_baseFor.js","/**\n * Creates a base function for methods like `_.forIn` and `_.forOwn`.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseFor(fromRight) {\n return function(object, iteratee, keysFunc) {\n var index = -1,\n iterable = Object(object),\n props = keysFunc(object),\n length = props.length;\n\n while (length--) {\n var key = props[fromRight ? length : ++index];\n if (iteratee(iterable[key], key, iterable) === false) {\n break;\n }\n }\n return object;\n };\n}\n\nexport default createBaseFor;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/_createBaseFor.js","import root from './_root.js';\n\n/** Built-in value references. */\nvar Uint8Array = root.Uint8Array;\n\nexport default Uint8Array;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/_Uint8Array.js","import Uint8Array from './_Uint8Array.js';\n\n/**\n * Creates a clone of `arrayBuffer`.\n *\n * @private\n * @param {ArrayBuffer} arrayBuffer The array buffer to clone.\n * @returns {ArrayBuffer} Returns the cloned array buffer.\n */\nfunction cloneArrayBuffer(arrayBuffer) {\n var result = new arrayBuffer.constructor(arrayBuffer.byteLength);\n new Uint8Array(result).set(new Uint8Array(arrayBuffer));\n return result;\n}\n\nexport default cloneArrayBuffer;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/_cloneArrayBuffer.js","import cloneArrayBuffer from './_cloneArrayBuffer.js';\n\n/**\n * Creates a clone of `typedArray`.\n *\n * @private\n * @param {Object} typedArray The typed array to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned typed array.\n */\nfunction cloneTypedArray(typedArray, isDeep) {\n var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;\n return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);\n}\n\nexport default cloneTypedArray;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/_cloneTypedArray.js","/**\n * Copies the values of `source` to `array`.\n *\n * @private\n * @param {Array} source The array to copy values from.\n * @param {Array} [array=[]] The array to copy values to.\n * @returns {Array} Returns `array`.\n */\nfunction copyArray(source, array) {\n var index = -1,\n length = source.length;\n\n array || (array = Array(length));\n while (++index < length) {\n array[index] = source[index];\n }\n return array;\n}\n\nexport default copyArray;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/_copyArray.js","import isObject from './isObject.js';\n\n/** Built-in value references. */\nvar objectCreate = Object.create;\n\n/**\n * The base implementation of `_.create` without support for assigning\n * properties to the created object.\n *\n * @private\n * @param {Object} proto The object to inherit from.\n * @returns {Object} Returns the new object.\n */\nvar baseCreate = (function() {\n function object() {}\n return function(proto) {\n if (!isObject(proto)) {\n return {};\n }\n if (objectCreate) {\n return objectCreate(proto);\n }\n object.prototype = proto;\n var result = new object;\n object.prototype = undefined;\n return result;\n };\n}());\n\nexport default baseCreate;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/_baseCreate.js","import overArg from './_overArg.js';\n\n/** Built-in value references. */\nvar getPrototype = overArg(Object.getPrototypeOf, Object);\n\nexport default getPrototype;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/_getPrototype.js","/**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\nfunction overArg(func, transform) {\n return function(arg) {\n return func(transform(arg));\n };\n}\n\nexport default overArg;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/_overArg.js","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\nfunction isPrototype(value) {\n var Ctor = value && value.constructor,\n proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n return value === proto;\n}\n\nexport default isPrototype;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/_isPrototype.js","import baseCreate from './_baseCreate.js';\nimport getPrototype from './_getPrototype.js';\nimport isPrototype from './_isPrototype.js';\n\n/**\n * Initializes an object clone.\n *\n * @private\n * @param {Object} object The object to clone.\n * @returns {Object} Returns the initialized clone.\n */\nfunction initCloneObject(object) {\n return (typeof object.constructor == 'function' && !isPrototype(object))\n ? baseCreate(getPrototype(object))\n : {};\n}\n\nexport default initCloneObject;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/_initCloneObject.js","/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return value != null && typeof value == 'object';\n}\n\nexport default isObjectLike;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/isObjectLike.js","import baseGetTag from './_baseGetTag.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]';\n\n/**\n * The base implementation of `_.isArguments`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n */\nfunction baseIsArguments(value) {\n return isObjectLike(value) && baseGetTag(value) == argsTag;\n}\n\nexport default baseIsArguments;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/_baseIsArguments.js","import baseIsArguments from './_baseIsArguments.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n * else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nvar isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n !propertyIsEnumerable.call(value, 'callee');\n};\n\nexport default isArguments;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/isArguments.js","/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\nexport default isArray;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/isArray.js","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n return typeof value == 'number' &&\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\nexport default isLength;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/isLength.js","import isFunction from './isFunction.js';\nimport isLength from './isLength.js';\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\n}\n\nexport default isArrayLike;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/isArrayLike.js","import isArrayLike from './isArrayLike.js';\nimport isObjectLike from './isObjectLike.js';\n\n/**\n * This method is like `_.isArrayLike` except that it also checks if `value`\n * is an object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array-like object,\n * else `false`.\n * @example\n *\n * _.isArrayLikeObject([1, 2, 3]);\n * // => true\n *\n * _.isArrayLikeObject(document.body.children);\n * // => true\n *\n * _.isArrayLikeObject('abc');\n * // => false\n *\n * _.isArrayLikeObject(_.noop);\n * // => false\n */\nfunction isArrayLikeObject(value) {\n return isObjectLike(value) && isArrayLike(value);\n}\n\nexport default isArrayLikeObject;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/isArrayLikeObject.js","import baseGetTag from './_baseGetTag.js';\nimport getPrototype from './_getPrototype.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar objectTag = '[object Object]';\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to infer the `Object` constructor. */\nvar objectCtorString = funcToString.call(Object);\n\n/**\n * Checks if `value` is a plain object, that is, an object created by the\n * `Object` constructor or one with a `[[Prototype]]` of `null`.\n *\n * @static\n * @memberOf _\n * @since 0.8.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * }\n *\n * _.isPlainObject(new Foo);\n * // => false\n *\n * _.isPlainObject([1, 2, 3]);\n * // => false\n *\n * _.isPlainObject({ 'x': 0, 'y': 0 });\n * // => true\n *\n * _.isPlainObject(Object.create(null));\n * // => true\n */\nfunction isPlainObject(value) {\n if (!isObjectLike(value) || baseGetTag(value) != objectTag) {\n return false;\n }\n var proto = getPrototype(value);\n if (proto === null) {\n return true;\n }\n var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;\n return typeof Ctor == 'function' && Ctor instanceof Ctor &&\n funcToString.call(Ctor) == objectCtorString;\n}\n\nexport default isPlainObject;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/isPlainObject.js","import baseGetTag from './_baseGetTag.js';\nimport isLength from './isLength.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n objectTag = '[object Object]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values of typed arrays. */\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\ntypedArrayTags[errorTag] = typedArrayTags[funcTag] =\ntypedArrayTags[mapTag] = typedArrayTags[numberTag] =\ntypedArrayTags[objectTag] = typedArrayTags[regexpTag] =\ntypedArrayTags[setTag] = typedArrayTags[stringTag] =\ntypedArrayTags[weakMapTag] = false;\n\n/**\n * The base implementation of `_.isTypedArray` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n */\nfunction baseIsTypedArray(value) {\n return isObjectLike(value) &&\n isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n}\n\nexport default baseIsTypedArray;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/_baseIsTypedArray.js","/**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\nfunction baseUnary(func) {\n return function(value) {\n return func(value);\n };\n}\n\nexport default baseUnary;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/_baseUnary.js","import baseIsTypedArray from './_baseIsTypedArray.js';\nimport baseUnary from './_baseUnary.js';\nimport nodeUtil from './_nodeUtil.js';\n\n/* Node.js helper references. */\nvar nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n/**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\nvar isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\nexport default isTypedArray;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/isTypedArray.js","import baseAssignValue from './_baseAssignValue.js';\nimport eq from './eq.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Assigns `value` to `key` of `object` if the existing value is not equivalent\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction assignValue(object, key, value) {\n var objValue = object[key];\n if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\n (value === undefined && !(key in object))) {\n baseAssignValue(object, key, value);\n }\n}\n\nexport default assignValue;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/_assignValue.js","import assignValue from './_assignValue.js';\nimport baseAssignValue from './_baseAssignValue.js';\n\n/**\n * Copies properties of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy properties from.\n * @param {Array} props The property identifiers to copy.\n * @param {Object} [object={}] The object to copy properties to.\n * @param {Function} [customizer] The function to customize copied values.\n * @returns {Object} Returns `object`.\n */\nfunction copyObject(source, props, object, customizer) {\n var isNew = !object;\n object || (object = {});\n\n var index = -1,\n length = props.length;\n\n while (++index < length) {\n var key = props[index];\n\n var newValue = customizer\n ? customizer(object[key], source[key], key, object, source)\n : undefined;\n\n if (newValue === undefined) {\n newValue = source[key];\n }\n if (isNew) {\n baseAssignValue(object, key, newValue);\n } else {\n assignValue(object, key, newValue);\n }\n }\n return object;\n}\n\nexport default copyObject;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/_copyObject.js","/**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n var index = -1,\n result = Array(n);\n\n while (++index < n) {\n result[index] = iteratee(index);\n }\n return result;\n}\n\nexport default baseTimes;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/_baseTimes.js","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n length = length == null ? MAX_SAFE_INTEGER : length;\n return !!length &&\n (typeof value == 'number' || reIsUint.test(value)) &&\n (value > -1 && value % 1 == 0 && value < length);\n}\n\nexport default isIndex;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/_isIndex.js","import baseTimes from './_baseTimes.js';\nimport isArguments from './isArguments.js';\nimport isArray from './isArray.js';\nimport isBuffer from './isBuffer.js';\nimport isIndex from './_isIndex.js';\nimport isTypedArray from './isTypedArray.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Creates an array of the enumerable property names of the array-like `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */\nfunction arrayLikeKeys(value, inherited) {\n var isArr = isArray(value),\n isArg = !isArr && isArguments(value),\n isBuff = !isArr && !isArg && isBuffer(value),\n isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n skipIndexes = isArr || isArg || isBuff || isType,\n result = skipIndexes ? baseTimes(value.length, String) : [],\n length = result.length;\n\n for (var key in value) {\n if ((inherited || hasOwnProperty.call(value, key)) &&\n !(skipIndexes && (\n // Safari 9 has enumerable `arguments.length` in strict mode.\n key == 'length' ||\n // Node.js 0.10 has enumerable non-index properties on buffers.\n (isBuff && (key == 'offset' || key == 'parent')) ||\n // PhantomJS 2 has enumerable non-index properties on typed arrays.\n (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\n // Skip index properties.\n isIndex(key, length)\n ))) {\n result.push(key);\n }\n }\n return result;\n}\n\nexport default arrayLikeKeys;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/_arrayLikeKeys.js","/**\n * This function is like\n * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * except that it includes inherited enumerable properties.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction nativeKeysIn(object) {\n var result = [];\n if (object != null) {\n for (var key in Object(object)) {\n result.push(key);\n }\n }\n return result;\n}\n\nexport default nativeKeysIn;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/_nativeKeysIn.js","import isObject from './isObject.js';\nimport isPrototype from './_isPrototype.js';\nimport nativeKeysIn from './_nativeKeysIn.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeysIn(object) {\n if (!isObject(object)) {\n return nativeKeysIn(object);\n }\n var isProto = isPrototype(object),\n result = [];\n\n for (var key in object) {\n if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\n result.push(key);\n }\n }\n return result;\n}\n\nexport default baseKeysIn;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/_baseKeysIn.js","import arrayLikeKeys from './_arrayLikeKeys.js';\nimport baseKeysIn from './_baseKeysIn.js';\nimport isArrayLike from './isArrayLike.js';\n\n/**\n * Creates an array of the own and inherited enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keysIn(new Foo);\n * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n */\nfunction keysIn(object) {\n return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);\n}\n\nexport default keysIn;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/keysIn.js","import copyObject from './_copyObject.js';\nimport keysIn from './keysIn.js';\n\n/**\n * Converts `value` to a plain object flattening inherited enumerable string\n * keyed properties of `value` to own properties of the plain object.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {Object} Returns the converted plain object.\n * @example\n *\n * function Foo() {\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.assign({ 'a': 1 }, new Foo);\n * // => { 'a': 1, 'b': 2 }\n *\n * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));\n * // => { 'a': 1, 'b': 2, 'c': 3 }\n */\nfunction toPlainObject(value) {\n return copyObject(value, keysIn(value));\n}\n\nexport default toPlainObject;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/toPlainObject.js","import assignMergeValue from './_assignMergeValue.js';\nimport cloneBuffer from './_cloneBuffer.js';\nimport cloneTypedArray from './_cloneTypedArray.js';\nimport copyArray from './_copyArray.js';\nimport initCloneObject from './_initCloneObject.js';\nimport isArguments from './isArguments.js';\nimport isArray from './isArray.js';\nimport isArrayLikeObject from './isArrayLikeObject.js';\nimport isBuffer from './isBuffer.js';\nimport isFunction from './isFunction.js';\nimport isObject from './isObject.js';\nimport isPlainObject from './isPlainObject.js';\nimport isTypedArray from './isTypedArray.js';\nimport toPlainObject from './toPlainObject.js';\n\n/**\n * A specialized version of `baseMerge` for arrays and objects which performs\n * deep merges and tracks traversed objects enabling objects with circular\n * references to be merged.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @param {string} key The key of the value to merge.\n * @param {number} srcIndex The index of `source`.\n * @param {Function} mergeFunc The function to merge values.\n * @param {Function} [customizer] The function to customize assigned values.\n * @param {Object} [stack] Tracks traversed source values and their merged\n * counterparts.\n */\nfunction baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) {\n var objValue = object[key],\n srcValue = source[key],\n stacked = stack.get(srcValue);\n\n if (stacked) {\n assignMergeValue(object, key, stacked);\n return;\n }\n var newValue = customizer\n ? customizer(objValue, srcValue, (key + ''), object, source, stack)\n : undefined;\n\n var isCommon = newValue === undefined;\n\n if (isCommon) {\n var isArr = isArray(srcValue),\n isBuff = !isArr && isBuffer(srcValue),\n isTyped = !isArr && !isBuff && isTypedArray(srcValue);\n\n newValue = srcValue;\n if (isArr || isBuff || isTyped) {\n if (isArray(objValue)) {\n newValue = objValue;\n }\n else if (isArrayLikeObject(objValue)) {\n newValue = copyArray(objValue);\n }\n else if (isBuff) {\n isCommon = false;\n newValue = cloneBuffer(srcValue, true);\n }\n else if (isTyped) {\n isCommon = false;\n newValue = cloneTypedArray(srcValue, true);\n }\n else {\n newValue = [];\n }\n }\n else if (isPlainObject(srcValue) || isArguments(srcValue)) {\n newValue = objValue;\n if (isArguments(objValue)) {\n newValue = toPlainObject(objValue);\n }\n else if (!isObject(objValue) || (srcIndex && isFunction(objValue))) {\n newValue = initCloneObject(srcValue);\n }\n }\n else {\n isCommon = false;\n }\n }\n if (isCommon) {\n // Recursively merge objects and arrays (susceptible to call stack limits).\n stack.set(srcValue, newValue);\n mergeFunc(newValue, srcValue, srcIndex, customizer, stack);\n stack['delete'](srcValue);\n }\n assignMergeValue(object, key, newValue);\n}\n\nexport default baseMergeDeep;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/_baseMergeDeep.js","/**\n * This method returns the first argument it receives.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'a': 1 };\n *\n * console.log(_.identity(object) === object);\n * // => true\n */\nfunction identity(value) {\n return value;\n}\n\nexport default identity;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/identity.js","/**\n * A faster alternative to `Function#apply`, this function invokes `func`\n * with the `this` binding of `thisArg` and the arguments of `args`.\n *\n * @private\n * @param {Function} func The function to invoke.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {Array} args The arguments to invoke `func` with.\n * @returns {*} Returns the result of `func`.\n */\nfunction apply(func, thisArg, args) {\n switch (args.length) {\n case 0: return func.call(thisArg);\n case 1: return func.call(thisArg, args[0]);\n case 2: return func.call(thisArg, args[0], args[1]);\n case 3: return func.call(thisArg, args[0], args[1], args[2]);\n }\n return func.apply(thisArg, args);\n}\n\nexport default apply;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/_apply.js","import apply from './_apply.js';\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * A specialized version of `baseRest` which transforms the rest array.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @param {Function} transform The rest array transform.\n * @returns {Function} Returns the new function.\n */\nfunction overRest(func, start, transform) {\n start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\n return function() {\n var args = arguments,\n index = -1,\n length = nativeMax(args.length - start, 0),\n array = Array(length);\n\n while (++index < length) {\n array[index] = args[start + index];\n }\n index = -1;\n var otherArgs = Array(start + 1);\n while (++index < start) {\n otherArgs[index] = args[index];\n }\n otherArgs[start] = transform(array);\n return apply(func, this, otherArgs);\n };\n}\n\nexport default overRest;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/_overRest.js","/**\n * Creates a function that returns `value`.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {*} value The value to return from the new function.\n * @returns {Function} Returns the new constant function.\n * @example\n *\n * var objects = _.times(2, _.constant({ 'a': 1 }));\n *\n * console.log(objects);\n * // => [{ 'a': 1 }, { 'a': 1 }]\n *\n * console.log(objects[0] === objects[1]);\n * // => true\n */\nfunction constant(value) {\n return function() {\n return value;\n };\n}\n\nexport default constant;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/constant.js","import constant from './constant.js';\nimport defineProperty from './_defineProperty.js';\nimport identity from './identity.js';\n\n/**\n * The base implementation of `setToString` without support for hot loop shorting.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar baseSetToString = !defineProperty ? identity : function(func, string) {\n return defineProperty(func, 'toString', {\n 'configurable': true,\n 'enumerable': false,\n 'value': constant(string),\n 'writable': true\n });\n};\n\nexport default baseSetToString;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/_baseSetToString.js","/** Used to detect hot functions by number of calls within a span of milliseconds. */\nvar HOT_COUNT = 800,\n HOT_SPAN = 16;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeNow = Date.now;\n\n/**\n * Creates a function that'll short out and invoke `identity` instead\n * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`\n * milliseconds.\n *\n * @private\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new shortable function.\n */\nfunction shortOut(func) {\n var count = 0,\n lastCalled = 0;\n\n return function() {\n var stamp = nativeNow(),\n remaining = HOT_SPAN - (stamp - lastCalled);\n\n lastCalled = stamp;\n if (remaining > 0) {\n if (++count >= HOT_COUNT) {\n return arguments[0];\n }\n } else {\n count = 0;\n }\n return func.apply(undefined, arguments);\n };\n}\n\nexport default shortOut;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/_shortOut.js","import baseSetToString from './_baseSetToString.js';\nimport shortOut from './_shortOut.js';\n\n/**\n * Sets the `toString` method of `func` to return `string`.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar setToString = shortOut(baseSetToString);\n\nexport default setToString;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/_setToString.js","import identity from './identity.js';\nimport overRest from './_overRest.js';\nimport setToString from './_setToString.js';\n\n/**\n * The base implementation of `_.rest` which doesn't validate or coerce arguments.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n */\nfunction baseRest(func, start) {\n return setToString(overRest(func, start, identity), func + '');\n}\n\nexport default baseRest;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/_baseRest.js","import eq from './eq.js';\nimport isArrayLike from './isArrayLike.js';\nimport isIndex from './_isIndex.js';\nimport isObject from './isObject.js';\n\n/**\n * Checks if the given arguments are from an iteratee call.\n *\n * @private\n * @param {*} value The potential iteratee value argument.\n * @param {*} index The potential iteratee index or key argument.\n * @param {*} object The potential iteratee object argument.\n * @returns {boolean} Returns `true` if the arguments are from an iteratee call,\n * else `false`.\n */\nfunction isIterateeCall(value, index, object) {\n if (!isObject(object)) {\n return false;\n }\n var type = typeof index;\n if (type == 'number'\n ? (isArrayLike(object) && isIndex(index, object.length))\n : (type == 'string' && index in object)\n ) {\n return eq(object[index], value);\n }\n return false;\n}\n\nexport default isIterateeCall;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/_isIterateeCall.js","import baseMerge from './_baseMerge.js';\nimport createAssigner from './_createAssigner.js';\n\n/**\n * This method is like `_.assign` except that it recursively merges own and\n * inherited enumerable string keyed properties of source objects into the\n * destination object. Source properties that resolve to `undefined` are\n * skipped if a destination value exists. Array and plain object properties\n * are merged recursively. Other objects and value types are overridden by\n * assignment. Source objects are applied from left to right. Subsequent\n * sources overwrite property assignments of previous sources.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 0.5.0\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var object = {\n * 'a': [{ 'b': 2 }, { 'd': 4 }]\n * };\n *\n * var other = {\n * 'a': [{ 'c': 3 }, { 'e': 5 }]\n * };\n *\n * _.merge(object, other);\n * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }\n */\nvar merge = createAssigner(function(object, source, srcIndex) {\n baseMerge(object, source, srcIndex);\n});\n\nexport default merge;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/merge.js","import baseRest from './_baseRest.js';\nimport isIterateeCall from './_isIterateeCall.js';\n\n/**\n * Creates a function like `_.assign`.\n *\n * @private\n * @param {Function} assigner The function to assign values.\n * @returns {Function} Returns the new assigner function.\n */\nfunction createAssigner(assigner) {\n return baseRest(function(object, sources) {\n var index = -1,\n length = sources.length,\n customizer = length > 1 ? sources[length - 1] : undefined,\n guard = length > 2 ? sources[2] : undefined;\n\n customizer = (assigner.length > 3 && typeof customizer == 'function')\n ? (length--, customizer)\n : undefined;\n\n if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n customizer = length < 3 ? undefined : customizer;\n length = 1;\n }\n object = Object(object);\n while (++index < length) {\n var source = sources[index];\n if (source) {\n assigner(object, source, index, customizer);\n }\n }\n return object;\n });\n}\n\nexport default createAssigner;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/_createAssigner.js","// @flow\nlet id = 0;\n\nexport default () => `domain-gfx-id-${++id}`;\n\n\n\n// WEBPACK FOOTER //\n// ./src/utils/uniqueId.js","// @flow\nimport uniqueId from './uniqueId';\n\nconst supportsSymbol = window && window.Symbol;\n\nexport default supportsSymbol ? Symbol('lib namespace') : `_${uniqueId()}`;\n\n\n\n// WEBPACK FOOTER //\n// ./src/utils/namespace.js","export default (element) => {\n return {\n set (key, value) {\n element.setAttribute(`data-${key}`, value);\n },\n get (key) {\n return element.getAttribute(`data-${key}`);\n }\n };\n};\n\n\n\n// WEBPACK FOOTER //\n// ./src/utils/dataset.js","// @flow\nexport default (\n {className, acceptedMargin}\n /*: {className: string, acceptedMargin: number} */\n) => {\n const stylesheet = document.createElement('style');\n stylesheet.textContent = `\n.${className} {\n padding-bottom: ${acceptedMargin}px;\n font-family: Sans-Serif;\n}\n.${className}.hidden {\n pointer-events: none;\n display: block;\n opacity: 0;\n transform: translate(-999px, -999px);\n transform: translate(200vw, 200vh);\n}\n.${className}___container {\n border-style: solid;\n border-color: #dedede;\n border-width: 1px 2px 2px 1px;\n border-radius: 0.2em;\n background-color: #fff;\n margin-bottom: ${acceptedMargin}px;\n}\n.${className} thead {\n background-color: #dedede;\n}\n.${className} td:first-of-type {\n font-weight: bold;\n}\n.${className} th {\n text-align: left;\n}\n.${className} .coordinates {\n display: -webkit-inline-box;\n display: -ms-inline-flexbox;\n display: inline-flex;\n -webkit-box-align: center;\n -ms-flex-align: center;\n align-items: center;\n}\n.${className} .domain {\n margin: 0 0.5em;\n display: -webkit-inline-box;\n display: -ms-inline-flexbox;\n display: inline-flex;\n -webkit-box-align: center;\n -ms-flex-align: center;\n align-items: center;\n height: 0.5em;\n background-color: black;\n}\n.${className} .alignment {\n display: inline-block;\n margin-left: 0;\n height: 1em;\n border-radius: 0.2em;\n background-color: grey;\n}`;\n return stylesheet;\n};\n\n\n\n// WEBPACK FOOTER //\n// ./src/tooltip/style.js","// @flow\nexport default (data/*: Object */) => {\n // flatten data, metadata overwrites duplicated\n const _data = {...data, ...(data.metadata || {})};\n // shortcuts and preprocess\n const mainTitle = _data.identifier || _data.type || _data.accession || '';\n const subTitle = _data.accession || '';\n const description = _data.description;\n const source = _data.database || _data.source;\n const position = _data.start;\n const targetStart = _data.targetStart || _data.tStart || _data.tstart;\n const targetEnd = _data.targetEnd || _data.tEnd || _data.tend;\n const queryStart = _data.queryStart || _data.qStart || _data.qstart;\n const queryEnd = _data.queryEnd || _data.qEnd || _data.qend;\n let coordinates;\n if (_data.end) {\n const length = _data.end - _data.start;\n const aliStart = _data.aliStart || _data.start;\n const aliEnd = _data.aliEnd || _data.end;\n let offset = 0;\n if (aliStart - _data.start > 0) {\n offset = (aliStart - _data.start) / length * 100;\n }\n coordinates = `\n ${_data.start}<span style=\"width: 100px;\" class=\"domain\">\n <span class=\"alignment\" style=\"\n width: ${(aliEnd - aliStart) * 100 / length}px;\n margin-left: ${offset}px;\n background-color: ${_data.color};\n \"></span>\n </span>${_data.end}\n `;\n }\n // render to string\n return `\n <table>\n <thead>\n <tr>\n <th colspan=\"2\">\n ${mainTitle || (targetStart && 'Match coordinates')}\n ${(subTitle && subTitle !== mainTitle) ? ` (${subTitle})` : ''}\n </th>\n </tr>\n </thead>\n <tbody>\n ${description ? `\n <tr>\n <td>Description:</td>\n <td>${description}</td>\n </tr>\n ` : ''}\n ${coordinates ? `\n <tr>\n <td>Coordinates:</td>\n <td class=\"coordinates\">${coordinates}</td>\n </tr>\n ` : ''}\n ${(!coordinates && position) ? `\n <tr>\n <td>Position:</td>\n <td>${position}</td>\n </tr>\n ` : ''}\n ${source ? `\n <tr>\n <td>Source:</td>\n <td>${source}</td>\n </tr>\n ` : ''}\n ${targetStart ? `\n <tr>\n <td>Target:</td>\n <td>${targetStart}${targetEnd ? ` - ${targetEnd}` : ''}</td>\n </tr>\n ` : ''}\n ${queryStart ? `\n <tr>\n <td>Query:</td>\n <td>${queryStart}${queryEnd ? ` - ${queryEnd}` : ''}</td>\n </tr>\n ` : ''}\n </tbody>\n </table>\n `;\n};\n\n\n\n// WEBPACK FOOTER //\n// ./src/tooltip/dataToMarkup.js","import ns from '../utils/namespace';\nimport dataset from '../utils/dataset';\nimport getStyleSheet from './style';\nimport dataToMarkup from './dataToMarkup';\n\nconst acceptedMargin = 5;\nconst className = 'domain_gfx__tooltip';\n\nconst getEntityBBox = target => {\n if (!target) throw new Error('No entity found in the whole tree');\n if (!dataset(target).get('entity')) {\n return getEntityBBox(target.parentNode);\n }\n return target.getBoundingClientRect();\n};\n\nconst findBestTooltipPosition = (\n entityBBox/*: Object */,\n tooltipBBox/*: Object */\n) => {\n let x = entityBBox.left + (entityBBox.width / 2) - (tooltipBBox.width / 2);\n if (x < 0) {\n x = 0;// prevent left overflow\n } else {\n x = Math.min(x, window.innerWidth - tooltipBBox.width);// right overflow\n }\n const y = entityBBox.top - tooltipBBox.height;\n // Rounding, otherwise will be blurred if not pixel aligned\n return {x: Math.round(x), y: Math.round(y)};\n};\n\nconst buildTooltipContent = (html/*: string */) => {\n const el = document.createElement('div');\n el.classList.add(`${className}___container`);\n el.innerHTML = html;\n return el;\n};\n\nclass TooltipManager {\n /* ::\n _current: HTMLElement;\n _container: HTMLElement;\n _promoted: boolean;\n _currentData: ?Object;\n */\n constructor () {\n // If no DOM, no need to do anything\n if (!window) return;\n // container\n const cont = document.createElement('div');\n cont.classList.add(className);\n cont.classList.add('hidden');\n cont.style.position = 'fixed';\n cont.style.left = '0';\n cont.style.top = '0';\n // cont.style.border = '1px solid rgba(0, 0, 255, 0.2)';\n // current node in container\n const curr = buildTooltipContent('<p>placeholder</p>');\n cont.appendChild(curr);\n // attach to instance\n this._current = curr;\n this._container = cont;\n // append to DOM\n if (!document.body) throw new Error('No body in document');\n document.body.appendChild(cont);\n this._promoted = false;\n // CSS\n if (!document.head) throw new Error('No head in document');\n document.head.appendChild(getStyleSheet({className, acceptedMargin}));\n // add event listener to the tooltip itself\n cont.addEventListener('mouseleave', e => {\n const relatedData = e.relatedTarget[ns];\n if (relatedData === this._currentData) return;// enter part of same entity\n this._currentData = relatedData || null;\n if (relatedData) {\n // switch tooltip content\n this._replaceTooltipContent(relatedData);\n this._display(findBestTooltipPosition(\n getEntityBBox(e.relatedTarget),\n this._container.getBoundingClientRect()\n ));\n } else {\n // hide tooltip\n this._hide();\n }\n });\n }\n\n // promote to own graphic accelerated layer\n _promoteTarget = canvas => ({target}/*: {target: Element}*/) => {\n if (target !== canvas || this._promoted) return;\n this._container.style.willChange = 'transform';\n };\n\n // demote from own graphic accelerated layer\n _demoteTarget = canvas => (\n {target, relatedTarget}/*: {target: Element, relatedTarget: Element}*/\n ) => {\n if (target !== canvas || !this._promoted) return;\n if (relatedTarget && relatedTarget === this._container) return;\n this._container.style.willChange = '';\n };\n\n _replaceTooltipContent = data => {\n this._current = buildTooltipContent(dataToMarkup(data));\n this._container.replaceChild(\n this._current,\n this._container.firstElementChild\n );\n };\n\n _hide = () => {\n this._container.classList.add('hidden');\n this._visible = false;\n };\n\n _display = ({x, y}) => {\n this._container.style.transform = (\n `translate(${x}px, ${y + acceptedMargin}px)`\n );\n this._container.classList.remove('hidden');\n };\n\n _handleMouseOver = (e/*: MouseEvent */) => {\n const data = e.target[ns];\n if (this._currentData === data || !(this._currentData || data)) return;\n this._currentData = data;\n this._replaceTooltipContent(data);\n this._display(findBestTooltipPosition(\n getEntityBBox(e.target),\n this._container.getBoundingClientRect()\n ));\n };\n\n _handleMouseOut = (e/*: MouseEvent */) => {\n const data = e.target[ns];\n if (!data) return;\n if (e.relatedTarget === this._container) return;\n const relatedData = e.relatedTarget[ns];\n if (relatedData === this._currentData) return;// enter part of same entity\n this._currentData = relatedData || null;\n if (relatedData) {\n // switch tooltip content\n this._replaceTooltipContent(relatedData);\n this._display(findBestTooltipPosition(\n getEntityBBox(e.relatedTarget),\n this._container.getBoundingClientRect()\n ));\n } else {\n // hide tooltip\n this._hide();\n }\n };\n\n attachToCanvas (canvas/*: Element */) {\n const promote = this._promoteTarget(canvas);\n const demote = this._demoteTarget(canvas);\n canvas.addEventListener('mouseenter', promote);\n canvas.addEventListener('mouseleave', demote);\n canvas.addEventListener('mouseover', this._handleMouseOver);\n canvas.addEventListener('mousemove', this._handleMouseOver);// not a typo\n canvas.addEventListener('mouseout', this._handleMouseOut);\n return () => {\n canvas.removeEventListener('mouseenter', promote);\n canvas.removeEventListener('mouseleave', demote);\n canvas.removeEventListener('mouseover', this._handleMouseOver);\n canvas.removeEventListener('mousemove', this._handleMouseOver);\n canvas.removeEventListener('mouseout', this._handleMouseOut);\n };\n }\n}\n\nlet tooltipManager;\n\nexport default () => {\n if (!tooltipManager) {\n tooltipManager = new TooltipManager();\n }\n return tooltipManager;\n};\n\n\n\n// WEBPACK FOOTER //\n// ./src/tooltip/tooltip.js","// @flow\nconst svgNamespace = 'http://www.w3.org/2000/svg';\n\n/*::\n type Attributes = {[key: string]: ?(number | string)};\n type Child = Node | string | null;\n*/\n\nconst _svg = (name/*: string */) => (\n attributes/*: ?Attributes */,\n ...children/*: Array<Child> */\n)/*: Element */ => {\n // Create element\n const element = document.createElementNS(svgNamespace, name);\n // Set attributes\n const keys = Object.keys(attributes || {});\n for (const key of keys) {\n const value = attributes[key];\n if (value || value === 0) {\n element.setAttribute(key, String(value));\n }\n }\n // Add children\n for (const child of children) {\n if (!child) continue;\n element.appendChild(\n child instanceof Node ? child : document.createTextNode(child)\n );\n }\n return element;\n};\n\nexport default _svg;\n\nexport const svg = _svg('svg');\n\nexport const circle = _svg('circle');\n\nexport const defs = _svg('defs');\n\nexport const linearGradient = _svg(`linearGradient`);\n\nexport const group = _svg('g');\n\nexport const mask = _svg('mask');\n\nexport const path = _svg('path');\n\nexport const rectangle = _svg('rect');\n\nexport const stop = _svg('stop');\n\nexport const text = _svg('text');\n\nexport const filter = _svg('filter');\n\nexport const feGaussianBlur = _svg('feGaussianBlur');\n\nexport const feSpecularLighting = _svg('feSpecularLighting');\n\nexport const fePointLight = _svg('fePointLight');\n\nexport const feComposite = _svg('feComposite');\n\n\n\n// WEBPACK FOOTER //\n// ./src/renderer/svg/svg.js","// @flow export\nexport default class {\n /*::\n _data: string;\n */\n constructor (startPosition/*: string */ = 'm0,0') {\n this._data = startPosition;\n }\n\n add (data/*: string */ = '') {\n this._data += data;\n return this;\n }\n\n finish (close/*: boolean */) {\n if (close) {\n this._data += 'z';\n }\n return this._data;\n }\n\n close () {\n return this.finish(true);\n }\n};\n\n\n\n// WEBPACK FOOTER //\n// ./src/renderer/svg/utils/pathData.js","import PathData from '../utils/pathData';\nimport {path, group, rectangle, circle} from '../svg';\n\nconst line = (x = 0, y = 0) => {\n if (x === 0) return `v${y}`;\n if (y === 0) return `h${x}`;\n return `l${x},${y}`;\n};\n\nconst offset = 8;\n\nconst horizontalLine = length => line(length, 0);\nconst verticalLine = length => line(0, length);\n\nconst buildSquareHead = (color, isOnTop) => {\n return rectangle({\n x: -1.5, y: isOnTop ? (-offset - 1.5) : (offset - 1.5),\n width: 3, height: 3,\n fill: color\n });\n};\nconst buildDiamondHead = (color, isOnTop) => {\n let d = new PathData(`m0,${isOnTop ? (-offset - 2) : (offset - 2)}`)\n .add(line(2, 2))\n .add(line(-2, 2))\n .add(line(-2, -2))\n .close();\n return path({d, fill: color});\n};\nconst buildCircleHead = (color, isOnTop) => {\n return circle({cx: 0, cy: isOnTop ? -offset : offset, r: 1.5, fill: color});\n};\nconst buildArrowHead = (color, isOnTop) => {\n let d;\n if (isOnTop) {\n d = new PathData(`m-2,${-(offset - 2)}`)\n .add(line(2, -2))\n .add(line(2, 2))\n .finish();\n } else {\n d = new PathData(`m-2,${offset - 2}`)\n .add(line(2, 2))\n .add(line(2, -2))\n .finish();\n }\n return path({stroke: color, fill: 'none', d});\n};\nconst buildPointerHead = (color, isOnTop) => {\n const sequenceSize = 5;\n let d;\n if (isOnTop) {\n d = new PathData(`m-2,${-((sequenceSize / 2) + 2)}`)\n .add(line(2, 2))\n .add(line(2, -2))\n .finish();\n } else {\n d = new PathData(`m-2,${(sequenceSize / 2) + 2}`)\n .add(line(2, -2))\n .add(line(2, 2))\n .finish();\n }\n return path({stroke: color, fill: 'none', d});\n};\nconst buildLineHead = (color, isOnTop) => {\n return path({\n stroke: color,\n d: new PathData(`m0,${((isOnTop ? -1 : 1) * offset) - 1.5}`)\n .add(verticalLine(3))\n .finish(),\n });\n};\n\nconst buildHead = ({style, color, isOnTop}) => {\n switch (style) {\n case 'diamond':\n return buildDiamondHead(color, isOnTop);\n case 'circle':\n return buildCircleHead(color, isOnTop);\n case 'arrow':\n return buildArrowHead(color, isOnTop);\n case 'pointer':\n return buildPointerHead(color, isOnTop);\n case 'line':\n return buildLineHead(color, isOnTop);\n case 'square':\n default:\n return buildSquareHead(color, isOnTop);\n }\n};\n\nexport default (\n {\n start, end, v_align, vAlign, level = 0,\n lineColor, headColor, color,\n headStyle\n },\n residueWidth\n) => {\n // eslint-disable-next-line camelcase\n const isOnTop = /top/i.test(v_align || vAlign);\n let d = new PathData()\n .add(verticalLine(((1.5 * level) + offset) * (isOnTop ? -1 : 1)));\n if (end) {\n d = d\n .add(horizontalLine((end - start) * residueWidth))\n .add(verticalLine(((1.5 * level) + offset) * (isOnTop ? 1 : -1)));\n }\n d = d.finish();\n return group(\n null,\n path({\n d, fill: 'none',\n // if lineColor is defined, use that\n // if it has a end, it is nested, so the color is the line's color\n // otherwise just default to black\n stroke: lineColor || (end && color) || 'black'\n }),\n !end && buildHead({\n // if headColor is defined, use that\n // if it has no end, it is not nested, so the color is the head's color\n // otherwise just default to black\n color: headColor || (!end && color) || 'black',\n style: headStyle,\n isOnTop,\n })\n );\n};\n\n\n\n// WEBPACK FOOTER //\n// ./src/renderer/svg/entities/markup.js","// @flow\nimport {rectangle} from '../svg';\n\nexport default (\n {position: {x, y}, length: width, height, color}\n /*: {\n position: {x: number, y: number},\n length: number,\n height: number,\n color: ?string,\n } */\n) => (\n rectangle({\n x, y, width, height,\n fill: color || '#d8d8d8',\n rx: height / 2, ry: height / 2\n })\n);\n\n\n\n// WEBPACK FOOTER //\n// ./src/renderer/svg/entities/sequence.js","// @flow\nimport {rectangle} from '../svg';\n\nexport default (\n {position: {x, y}, length: width, height, color}\n /*: {\n position: {x: number, y: number},\n length: number,\n height: number,\n color: ?string,\n } */\n) => (\n rectangle({\n x, y, width, height,\n fill: color || 'black',\n })\n);\n\n\n\n// WEBPACK FOOTER //\n// ./src/renderer/svg/entities/hit.js","// @flow\nimport uniqueId from '../../../utils/uniqueId';\nimport {linearGradient, stop} from '../svg';\n\nconst smoothStops = (colors/*: Array<string>*/) => {\n let _colors = colors;\n // If only one color provided in the array\n if (_colors.length === 1) {\n _colors[1] = _colors[0];\n }\n const {length} = _colors;// length\n const step = 100 / (length - 1);// step\n return _colors.map((color, i) => stop({\n offset: `${i * step}%`,\n 'stop-color': color,\n }));\n};\nconst bandStops = (colors/*: Array<string>*/) => {\n const output = [];\n const {length} = colors;// length\n const step = 100 / length;// step\n for (let i = 0; i < length; i++) {\n output.push(\n stop({offset: `${i * step}%`, 'stop-color': colors[i]})\n );\n output.push(\n stop({offset: `${(i * step) + step}%`, 'stop-color': colors[i]})\n );\n }\n return output;\n};\n\nexport default (colors/*: Array<string>*/, smoothGradient/*: ?boolean */) => {\n const gradientId = uniqueId();\n return {\n gradientId,\n gradientElement: linearGradient(\n {id: gradientId, x1: 0, x2: 0, y1: 0, y2: 1},\n ...(smoothGradient ? smoothStops : bandStops)(colors)\n ),\n };\n};\n\n\n\n// WEBPACK FOOTER //\n// ./src/renderer/svg/utils/gradient.js","// @flow\nimport memoize from 'lodash-es/memoize';\n\nlet p;\nif (window && document && window.getComputedStyle) {\n p = document.createElement('p');\n p.style.opacity = '0';\n}\n\nconst re = /rgba?\\((\\d+), (\\d+), (\\d+)/;\nconst getRGB = (color/*: string */) => {\n if (!(p && document.body)) return {r: 255, g: 255, b: 255};\n p.style.background = color;\n document.body.appendChild(p);\n const [, r, g, b] = window.getComputedStyle(p).backgroundColor.match(re);\n if (document.body) document.body.removeChild(p);\n return {r: +r, g: +g, b: +b};\n};\n\n// convert to yiq space to get best contrast\nexport default memoize((color/*: string */) => {\n if (!p) return 'black';\n const {r, g, b} = getRGB(color);\n const yiq = ((r * 299) + (g * 587) + (b * 114)) / 1000;\n return yiq >= 128 ? 'black' : 'white';\n});\n\n\n\n// WEBPACK FOOTER //\n// ./src/utils/colorContrast.js","// @flow\nimport PathData from '../utils/pathData';\nimport {path, rectangle, group, mask, text as textEl} from '../svg';\nimport gradientMaker from '../utils/gradient';\nimport bestContrast from '../../../utils/colorContrast';\nimport uniqueId from '../../../utils/uniqueId';\nimport dataset from '../../../utils/dataset';\n\nconst height = 10;\nconst radius = height / 2;\n\nconst line = (x = 0, y = 0) => {\n if (x === 0) return `v${y}`;\n if (y === 0) return `h${x}`;\n return `l${x},${y}`;\n};\n\nconst horizontalLine = length => line(length, 0);\nconst verticalLine = length => line(0, length);\n\nconst arc = (rx, ry, xAxisRotate, largeArcFlag, sweepFlag, x, y) => (\n `A${rx},${ry},${xAxisRotate},${largeArcFlag},${sweepFlag},${x},${y}`\n);\n\nconst domainEnd = (endStyle/*: string */, topBottomLength/*: number */) => {\n switch (endStyle.toLowerCase()) {\n case 'jagged':\n return (\n horizontalLine(radius) + line(-radius / 2, radius / 2) +\n line(radius / 2, radius / 2) + line(-radius / 2, radius / 2) +\n line(radius / 2, radius / 2) + horizontalLine(-radius)\n );\n case 'arrow':\n return line(radius, radius) + line(-radius, radius);\n case 'curved':\n return arc(radius, radius, 0, 0, 1, topBottomLength + radius, height);\n case 'straight':\n default:\n return (\n horizontalLine(radius) + verticalLine(height) + horizontalLine(-radius)\n );\n }\n};\nconst domainStart = (startStyle/*: string */) => {\n switch (startStyle.toLowerCase()) {\n case 'jagged':\n return (\n horizontalLine(-radius) + line(radius / 2, -radius / 2) +\n line(-radius / 2, -radius / 2) + line(radius / 2, -radius / 2) +\n line(-radius / 2, -radius / 2) + horizontalLine(radius)\n );\n case 'arrow':\n return line(-radius, -radius) + line(radius, -radius);\n case 'curved':\n return arc(radius, radius, 0, 0, 1, radius, 0);\n case 'straight':\n default:\n return (\n horizontalLine(-radius) + verticalLine(-height) + horizontalLine(radius)\n );\n }\n};\n\nconst domainTopLine = (length/*: number */) => horizontalLine(length);\nconst domainBottomLine = (length/*: number */) => horizontalLine(-length);\n\nconst domain = ({\n start, end, startStyle, endStyle, fill,\n residueWidth, mask, filter,\n}/*: {\n start: number,\n end: number,\n startStyle: ?string,\n endStyle: ?string,\n fill: string,\n residueWidth: number,\n mask: string,\n filter: ?string,\n} */) => {\n const length = (end - start) * residueWidth;\n const topBottomLength = length - (2 * radius);\n const d = new PathData(`m${radius},0`)\n .add(domainTopLine(topBottomLength))\n .add(domainEnd(endStyle || '', topBottomLength))\n .add(domainBottomLine(topBottomLength))\n .add(domainStart(startStyle || ''))\n .close();\n return path({d, fill, mask, filter});\n};\n\nconst envelope = ({start, aliStart, aliEnd, end, residueWidth}) => {\n const maskId = uniqueId();\n return {\n maskId,\n maskElement: mask(\n {\n id: maskId, x: 0, y: 0,\n width: (end - start) * residueWidth, height,\n fill: '#fff',\n },\n // beginning (partially covered)\n rectangle({\n x: 0,\n y: 0,\n width: (aliStart - start) * residueWidth,\n height,\n opacity: 0.6,\n }),\n // middle (completely uncovered)\n rectangle({\n x: (aliStart - start) * residueWidth,\n y: 0,\n width: (aliEnd - aliStart) * residueWidth,\n height,\n opacity: 1,\n }),\n // end (partially covered)\n rectangle({\n x: (aliEnd - start) * residueWidth,\n y: 0,\n width: (end - aliEnd) * residueWidth,\n height,\n opacity: 0.6,\n })\n )\n };\n};\n\nexport default (\n {\n start, aliStart, aliEnd, end, startStyle, endStyle,\n color, text, textColor, gradient,\n }\n /*: {\n start: number,\n aliStart: ?number,\n aliEnd: ?number,\n end: number,\n startStyle: ?string,\n endStyle: ?string,\n color: string | Array<string>,\n text: ?string,\n textColor: ?string,\n gradient: ?boolean,\n } */,\n residueWidth/*: number */,\n spotlight/*: ?string */,\n addToRefs/*: function */\n) => {\n const {maskId, maskElement} = envelope(\n {\n start, aliStart: aliStart || start,\n aliEnd: aliEnd || end, end,\n residueWidth,\n }\n );\n addToRefs(maskElement);\n let fill = color;\n let gradientObj = {};\n if (Array.isArray(fill)) {\n gradientObj = gradientMaker(fill, gradient);\n addToRefs(gradientObj.gradientElement);\n fill = `url(#${gradientObj.gradientId})`;\n }\n const textElement = textEl(\n {\n x: ((end - start) * residueWidth) / 2, y: height * 0.75 + 0.5,\n 'text-anchor': 'middle',\n 'font-size': 7.5,\n 'font-family': 'Sans-Serif',\n fill: textColor || bestContrast(Array.isArray(color) ? color[0] : color),\n opacity: 0,\n },\n text || ''\n );\n dataset(textElement).set('maxwidth', (end - start) * residueWidth);\n return group(\n null,\n domain({\n start, end, startStyle, endStyle, residueWidth,\n fill: fill, mask: `url(#${maskId})`,\n filter: spotlight && `url(#${spotlight})`,\n }),\n text ? textElement : null\n );\n};\n\n\n\n// WEBPACK FOOTER //\n// ./src/renderer/svg/entities/domain.js","// @flow\nimport {rectangle} from '../svg';\nimport gradientMaker from '../utils/gradient';\n\nconst motifOpacity = 0.5;\n\nexport default (\n {position: {x, y}, length: width, height, color, gradient}\n /*: {\n position: {x: number, y: number},\n length: number,\n height: number,\n color: ?Array<string> | string,\n gradient: ?boolean,\n } */,\n addToDefs/*: function */\n) => {\n const basicAttributes = {x, y, width, height, opacity: motifOpacity};\n if (!Array.isArray(color)) {\n return rectangle({...basicAttributes, fill: color || 'gray'});\n }\n const {gradientId, gradientElement} = gradientMaker(color, gradient);\n addToDefs(gradientElement);\n return rectangle({...basicAttributes, fill: `url(#${gradientId})`});\n};\n\n\n\n// WEBPACK FOOTER //\n// ./src/renderer/svg/entities/motif.js","import {\n svg, group, defs,\n filter, feGaussianBlur, feSpecularLighting, fePointLight, feComposite\n} from './svg';\nimport markup from './entities/markup';\nimport sequence from './entities/sequence';\nimport hit from './entities/hit';\nimport domain from './entities/domain';\nimport motif from './entities/motif';\nimport ns from '../../utils/namespace';\nimport dataset from '../../utils/dataset';\nimport uniqueId from '../../utils/uniqueId';\n\nconst connectData = (entity, data, always = false) => {\n if (!(window && (data.tooltip || data.metadata || always))) return;\n for (const element of entity.querySelectorAll(':not(g)')) {\n element[ns] = data;\n }\n};\n\nexport default class SvgRenderer {\n constructor ({width, height, spotlight = true}) {\n this._spotlight = spotlight && uniqueId();\n this._defs = defs(\n null,\n this._spotlight && filter(\n {\n id: this._spotlight, filterUnits: 'objectBoundingBox',\n x: -0.1, y: -0.1, width: 5, height: 5\n },\n feGaussianBlur(\n {in: 'SourceAlpha', stdDeviation: 1, result: 'alpha_blur'}\n ),\n feSpecularLighting(\n {\n in: 'alpha_blur', surfaceScale: 5, specularConstant: 1.5,\n specularExponent: 12, 'lighting-color': '#ddd', result: 'light'\n },\n fePointLight({x: -100, y: -200, z: 100})\n ),\n feComposite({in: 'SourceGraphic', in2: 'light', operator: 'out'})\n )\n );\n this._canvas = svg(\n {width, height, viewBox: `0 0 ${width} ${height}`},\n this._defs\n );\n this._canvas.style.width = `${width * 2}px`;\n this._canvas.style.height = `${height * 2}px`;\n }\n\n get canvas () {\n return this._canvas;\n }\n\n _addToDefs = element => this._defs.appendChild(element);\n\n drawMarkup = (m, residueWidth, previousNestedMarkups) => {\n if (m.end && !Number.isFinite(m.level)) {\n const availableLevels = new Set([0, 1, -1]);\n for (const previous of previousNestedMarkups) {\n if (m.start < previous.end) {\n availableLevels.delete(previous.level);\n }\n }\n const [level] = availableLevels;\n m.level = level || 0;\n }\n const g = group(\n {transform: `translate(${m.start * residueWidth}, 10)`},\n markup(m, residueWidth)\n );\n dataset(g).set('entity', 'markup');\n connectData(g, m);\n this._canvas.appendChild(g);\n };\n\n drawSequence = length => {\n const g = group(\n {transform: 'translate(0 10)'},\n sequence({\n position: {x: 0, y: -2.5},\n length,\n height: 5,\n color: '#d8d8d8',\n })\n );\n dataset(g).set('entity', 'sequence');\n this._canvas.appendChild(g);\n };\n\n drawHit = (h, residueWidth) => {\n const g = group(\n {transform: `translate(${h.tstart * residueWidth}, 16)`},\n hit({\n position: {x: 0, y: 0},\n length: (h.tend - h.tstart) * residueWidth,\n height: 2,\n color: h.color,\n })\n );\n dataset(g).set('entity', 'hit');\n connectData(g, h, true);\n this._canvas.appendChild(g);\n };\n\n drawRegion = (region, residueWidth) => {\n const g = group(\n {transform: `translate(${region.start * residueWidth}, 5)`},\n domain(region, residueWidth, this._spotlight, this._addToDefs)\n );\n dataset(g).set('entity', 'region');\n connectData(g, region);\n this._canvas.appendChild(g);\n const textToFit = g.querySelector('[data-maxwidth]');\n if (!textToFit) return;\n if (textToFit.getBBox().width <= +(dataset(textToFit).get('maxwidth') - 0)) {\n textToFit.setAttribute('opacity', 1);\n } else {\n textToFit.parentElement && textToFit.parentElement.removeChild(textToFit);\n }\n };\n\n drawMotif = (m, residueWidth) => {\n const g = group(\n {transform: `translate(${m.start * residueWidth}, 6)`},\n motif({\n position: {x: 0, y: 0},\n length: (m.end - m.start) * residueWidth,\n height: 8,\n color: m.color,\n gradient: m.gradient,\n }, this._addToDefs)\n );\n dataset(g).set('entity', 'motif');\n connectData(g, m);\n this._canvas.appendChild(g);\n };\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/renderer/svg/index.js","export default () => ({\n image: {\n headSize: {\n circle: 3,\n square: 5,\n diamond: 4,\n arrow: 3,\n pointer: 3,\n line: 3,\n },\n sequenceEndPadding: 2,\n offset: {\n x: 0,\n y: 0,\n },\n increment: {\n lollipopToLollipop: 7,\n bridgeToBridge: 2,\n bridgeToLollipop: 5,\n },\n largeJaggedSteps: 6,\n fontSize: '10px',\n height: {\n markup: 20,\n region: 20,\n motif: 14,\n },\n opacity: {\n motif: 0.6,\n env: 0.6,\n },\n labelPadding: 3,\n width: {\n residue: 0.5,\n },\n scale: {\n x: 1,\n y: 1,\n },\n highlight: {\n weight: 1,\n color: '#000',\n },\n },\n options: {\n baseUrl: '',\n imageMap: true,\n labels: true,\n tips: true,\n tipStyle: 'pfam',\n newCanvas: true,\n },\n});\n\n\n\n// WEBPACK FOOTER //\n// ./src/defaults.js","// @flow\nconst keyNumbers = new Set([\n 'start',\n 'end',\n 'aliStart',\n 'aliEnd',\n 'modelStart',\n 'modelEnd',\n 'length',\n 'level',\n 'tStart',\n 'tEnd',\n 'qStart',\n 'qEnd',\n 'tstart',\n 'tend',\n 'qstart',\n 'qend',\n]);\nconst colour = /(^.*colo)u(r.*$)/i;\nconst falseString = /^f(alse)?$/i;\n\nconst sanitizer = (data /*: Object */) => {\n const output = {};\n for (const rawKey of Object.keys(data)) {\n const rawValue = data[rawKey];\n let [key, value] = [rawKey, rawValue];\n // process numbers\n if (keyNumbers.has(key)) {\n value = +value;\n if (isNaN(value)) {\n throw new Error(\n `expected key ${rawKey} to be a number, not ${String(rawValue)})`\n );\n }\n }\n // process British spelling\n if (colour.test(key)) {\n key = key.replace(colour, '$1$2');\n }\n // process booleans\n if (key === 'display') {\n if (typeof value === 'string') {\n value = !falseString.test(value);\n } else {\n value = !!value;\n }\n }\n if (value) {\n // recursive sanitization, if need be\n if (Array.isArray(value)) {\n value = value.map(item => {\n if (!item || typeof item !== 'object') return item;\n return sanitizer(item);\n });\n } else if (typeof value === 'object') {\n value = sanitizer(value);\n }\n }\n output[key] = value;\n }\n return output;\n};\n\nexport default sanitizer;\n\n\n\n// WEBPACK FOOTER //\n// ./src/utils/sanitizer.js","import merge from 'lodash-es/merge';\n\nimport getTooltipManager from './tooltip/tooltip';\nimport SvgRenderer from './renderer/svg';\nimport getDefaults from './defaults';\nimport sanitize from './utils/sanitizer';\n\nconst isHidden = ({hidden, display = true}) => hidden || !display;\n\nexport default class DomainGFX {\n constructor ({data = {}, parent, params = {}} = {}) {\n this._data = sanitize(data);\n this._parent = parent;\n this._params = merge({}, getDefaults(), params);\n this._canvas = this._createCanvas();\n this._parent.appendChild(this._canvas);\n this._draw();\n }\n\n _computeWidth ({length = 0}, {image: {width, sequenceEndPadding}}) {\n return length * width.residue + sequenceEndPadding;\n }\n\n _computeHeight () {\n return 20;\n }\n\n _draw = () => {\n // draw markups\n const markups = (this._data.markups || [])\n .sort((a, b) => a.start - b.start);\n const nestedMarkups = [];\n let needsTooltips = false;\n for (const markup of markups) {\n if (isHidden(markup)) continue;\n this._renderer.drawMarkup(\n markup,\n this._params.image.width.residue,\n nestedMarkups\n );\n needsTooltips |= !!(markup.tooltip || markup.metadata);\n if (markup.end) nestedMarkups.push(markup);\n }\n // draw sequence\n this._renderer.drawSequence(\n this._data.length * this._params.image.width.residue\n );\n // draw hits\n for (const hit of this._data.hits || []) {\n if (isHidden(hit)) continue;\n this._renderer.drawHit(hit, this._params.image.width.residue);\n needsTooltips = true;\n }\n // draw regions\n for (const region of this._data.regions || []) {\n if (isHidden(region)) continue;\n this._renderer.drawRegion(region, this._params.image.width.residue);\n needsTooltips |= !!(region.tooltip || region.metadata);\n }\n // draw motifs\n for (const motif of this._data.motifs || []) {\n if (isHidden(motif)) continue;\n this._renderer.drawMotif(motif, this._params.image.width.residue);\n needsTooltips |= !!(motif.tooltip || motif.metadata);\n }\n // connect tooltip logic\n if (needsTooltips) {\n this._detach = (\n getTooltipManager().attachToCanvas(this._renderer.canvas)\n );\n }\n };\n\n _createCanvas = () => {\n this._renderer = new SvgRenderer({\n width: this._computeWidth(this._data, this._params),\n height: this._computeHeight(),\n });\n return this._renderer.canvas;\n };\n\n get data () {\n return this._data;\n }\n\n set data (value) {\n this._data = sanitize(value);\n const prevCanvas = this._canvas;\n this._canvas = this._createCanvas();\n this._parent.replaceChild(this._canvas, prevCanvas);\n this._draw();\n return this._data;\n }\n\n delete = () => {\n // unsubscribe to mouse events\n if (this._detach) {\n this._detach();\n this._detach = null;\n }\n // clean-up logic\n this._parent.removeChild(this._canvas);\n // remove references to DOM\n this._canvas = this._parent = null;\n }\n}\n\ntry {\n // Dispatches event on document when library has loaded\n // This way user can wait for async load, and when event fires, call the lib\n document.dispatchEvent(new CustomEvent('domainGfxReady', {detail: DomainGFX}));\n} catch (_) {\n // unsupported browser, you should hook to this script's load event\n // e.g.: <script onload=\"functionUsingDomainGfx();\">\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/index.js","import root from './_root.js';\n\n/**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n * console.log(_.now() - stamp);\n * }, _.now());\n * // => Logs the number of milliseconds it took for the deferred invocation.\n */\nvar now = function() {\n return root.Date.now();\n};\n\nexport default now;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/now.js","import baseGetTag from './_baseGetTag.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && baseGetTag(value) == symbolTag);\n}\n\nexport default isSymbol;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/isSymbol.js","import isObject from './isObject.js';\nimport isSymbol from './isSymbol.js';\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** Used to match leading and trailing whitespace. */\nvar reTrim = /^\\s+|\\s+$/g;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = value.replace(reTrim, '');\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nexport default toNumber;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/toNumber.js","import CodeMirror from 'codemirror';\nimport 'codemirror/mode/javascript/javascript';\n\nimport DomainGfx from '../src/index.js';\nimport debounce from 'lodash-es/debounce';\n\nimport data from './data.json';\n\nconst textArea = document.querySelector('.data textarea');\nconst visu = document.querySelector('.visu');\nconst invalid = document.querySelector('.invalid');\n\n// Domain graphics\nlet dg;\n\n// Render function\nconst updateView = cm => {\n const text = cm.getValue();\n let data;\n try {\n data = JSON.parse(text);\n } catch (err) {\n invalid.classList.remove('hidden');\n // eslint-disable-next-line no-console\n console.error(err);\n return;\n }\n if (dg) {\n dg.data = data;\n } else {\n dg = new DomainGfx({ parent: visu, data });\n }\n invalid.classList.add('hidden');\n};\n\n// CodeMirror logic\ntextArea.value = JSON.stringify(data, null, 2);\nconst cm = CodeMirror.fromTextArea(textArea, { lineNumbers: true });\ncm.on('change', debounce(updateView, 1000));\n\n// Kicks off first render\nupdateView(cm);\n\n\n\n// WEBPACK FOOTER //\n// ./demo/index.js","// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: http://codemirror.net/LICENSE\n\n(function(mod) {\n if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n mod(require(\"../../lib/codemirror\"));\n else if (typeof define == \"function\" && define.amd) // AMD\n define([\"../../lib/codemirror\"], mod);\n else // Plain browser env\n mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"javascript\", function(config, parserConfig) {\n var indentUnit = config.indentUnit;\n var statementIndent = parserConfig.statementIndent;\n var jsonldMode = parserConfig.jsonld;\n var jsonMode = parserConfig.json || jsonldMode;\n var isTS = parserConfig.typescript;\n var wordRE = parserConfig.wordCharacters || /[\\w$\\xa1-\\uffff]/;\n\n // Tokenizer\n\n var keywords = function(){\n function kw(type) {return {type: type, style: \"keyword\"};}\n var A = kw(\"keyword a\"), B = kw(\"keyword b\"), C = kw(\"keyword c\"), D = kw(\"keyword d\");\n var operator = kw(\"operator\"), atom = {type: \"atom\", style: \"atom\"};\n\n var jsKeywords = {\n \"if\": kw(\"if\"), \"while\": A, \"with\": A, \"else\": B, \"do\": B, \"try\": B, \"finally\": B,\n \"return\": D, \"break\": D, \"continue\": D, \"new\": kw(\"new\"), \"delete\": C, \"void\": C, \"throw\": C,\n \"debugger\": kw(\"debugger\"), \"var\": kw(\"var\"), \"const\": kw(\"var\"), \"let\": kw(\"var\"),\n \"function\": kw(\"function\"), \"catch\": kw(\"catch\"),\n \"for\": kw(\"for\"), \"switch\": kw(\"switch\"), \"case\": kw(\"case\"), \"default\": kw(\"default\"),\n \"in\": operator, \"typeof\": operator, \"instanceof\": operator,\n \"true\": atom, \"false\": atom, \"null\": atom, \"undefined\": atom, \"NaN\": atom, \"Infinity\": atom,\n \"this\": kw(\"this\"), \"class\": kw(\"class\"), \"super\": kw(\"atom\"),\n \"yield\": C, \"export\": kw(\"export\"), \"import\": kw(\"import\"), \"extends\": C,\n \"await\": C\n };\n\n // Extend the 'normal' keywords with the TypeScript language extensions\n if (isTS) {\n var type = {type: \"variable\", style: \"type\"};\n var tsKeywords = {\n // object-like things\n \"interface\": kw(\"class\"),\n \"implements\": C,\n \"namespace\": C,\n \"module\": kw(\"module\"),\n \"enum\": kw(\"module\"),\n\n // scope modifiers\n \"public\": kw(\"modifier\"),\n \"private\": kw(\"modifier\"),\n \"protected\": kw(\"modifier\"),\n \"abstract\": kw(\"modifier\"),\n \"readonly\": kw(\"modifier\"),\n\n // types\n \"string\": type, \"number\": type, \"boolean\": type, \"any\": type\n };\n\n for (var attr in tsKeywords) {\n jsKeywords[attr] = tsKeywords[attr];\n }\n }\n\n return jsKeywords;\n }();\n\n var isOperatorChar = /[+\\-*&%=<>!?|~^@]/;\n var isJsonldKeyword = /^@(context|id|value|language|type|container|list|set|reverse|index|base|vocab|graph)\"/;\n\n function readRegexp(stream) {\n var escaped = false, next, inSet = false;\n while ((next = stream.next()) != null) {\n if (!escaped) {\n if (next == \"/\" && !inSet) return;\n if (next == \"[\") inSet = true;\n else if (inSet && next == \"]\") inSet = false;\n }\n escaped = !escaped && next == \"\\\\\";\n }\n }\n\n // Used as scratch variables to communicate multiple values without\n // consing up tons of objects.\n var type, content;\n function ret(tp, style, cont) {\n type = tp; content = cont;\n return style;\n }\n function tokenBase(stream, state) {\n var ch = stream.next();\n if (ch == '\"' || ch == \"'\") {\n state.tokenize = tokenString(ch);\n return state.tokenize(stream, state);\n } else if (ch == \".\" && stream.match(/^\\d+(?:[eE][+\\-]?\\d+)?/)) {\n return ret(\"number\", \"number\");\n } else if (ch == \".\" && stream.match(\"..\")) {\n return ret(\"spread\", \"meta\");\n } else if (/[\\[\\]{}\\(\\),;\\:\\.]/.test(ch)) {\n return ret(ch);\n } else if (ch == \"=\" && stream.eat(\">\")) {\n return ret(\"=>\", \"operator\");\n } else if (ch == \"0\" && stream.eat(/x/i)) {\n stream.eatWhile(/[\\da-f]/i);\n return ret(\"number\", \"number\");\n } else if (ch == \"0\" && stream.eat(/o/i)) {\n stream.eatWhile(/[0-7]/i);\n return ret(\"number\", \"number\");\n } else if (ch == \"0\" && stream.eat(/b/i)) {\n stream.eatWhile(/[01]/i);\n return ret(\"number\", \"number\");\n } else if (/\\d/.test(ch)) {\n stream.match(/^\\d*(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?/);\n return ret(\"number\", \"number\");\n } else if (ch == \"/\") {\n if (stream.eat(\"*\")) {\n state.tokenize = tokenComment;\n return tokenComment(stream, state);\n } else if (stream.eat(\"/\")) {\n stream.skipToEnd();\n return ret(\"comment\", \"comment\");\n } else if (expressionAllowed(stream, state, 1)) {\n readRegexp(stream);\n stream.match(/^\\b(([gimyu])(?![gimyu]*\\2))+\\b/);\n return ret(\"regexp\", \"string-2\");\n } else {\n stream.eat(\"=\");\n return ret(\"operator\", \"operator\", stream.current());\n }\n } else if (ch == \"`\") {\n state.tokenize = tokenQuasi;\n return tokenQuasi(stream, state);\n } else if (ch == \"#\") {\n stream.skipToEnd();\n return ret(\"error\", \"error\");\n } else if (isOperatorChar.test(ch)) {\n if (ch != \">\" || !state.lexical || state.lexical.type != \">\") {\n if (stream.eat(\"=\")) {\n if (ch == \"!\" || ch == \"=\") stream.eat(\"=\")\n } else if (/[<>*+\\-]/.test(ch)) {\n stream.eat(ch)\n if (ch == \">\") stream.eat(ch)\n }\n }\n return ret(\"operator\", \"operator\", stream.current());\n } else if (wordRE.test(ch)) {\n stream.eatWhile(wordRE);\n var word = stream.current()\n if (state.lastType != \".\") {\n if (keywords.propertyIsEnumerable(word)) {\n var kw = keywords[word]\n return ret(kw.type, kw.style, word)\n }\n if (word == \"async\" && stream.match(/^\\s*[\\(\\w]/, false))\n return ret(\"async\", \"keyword\", word)\n }\n return ret(\"variable\", \"variable\", word)\n }\n }\n\n function tokenString(quote) {\n return function(stream, state) {\n var escaped = false, next;\n if (jsonldMode && stream.peek() == \"@\" && stream.match(isJsonldKeyword)){\n state.tokenize = tokenBase;\n return ret(\"jsonld-keyword\", \"meta\");\n }\n while ((next = stream.next()) != null) {\n if (next == quote && !escaped) break;\n escaped = !escaped && next == \"\\\\\";\n }\n if (!escaped) state.tokenize = tokenBase;\n return ret(\"string\", \"string\");\n };\n }\n\n function tokenComment(stream, state) {\n var maybeEnd = false, ch;\n while (ch = stream.next()) {\n if (ch == \"/\" && maybeEnd) {\n state.tokenize = tokenBase;\n break;\n }\n maybeEnd = (ch == \"*\");\n }\n return ret(\"comment\", \"comment\");\n }\n\n function tokenQuasi(stream, state) {\n var escaped = false, next;\n while ((next = stream.next()) != null) {\n if (!escaped && (next == \"`\" || next == \"$\" && stream.eat(\"{\"))) {\n state.tokenize = tokenBase;\n break;\n }\n escaped = !escaped && next == \"\\\\\";\n }\n return ret(\"quasi\", \"string-2\", stream.current());\n }\n\n var brackets = \"([{}])\";\n // This is a crude lookahead trick to try and notice that we're\n // parsing the argument patterns for a fat-arrow function before we\n // actually hit the arrow token. It only works if the arrow is on\n // the same line as the arguments and there's no strange noise\n // (comments) in between. Fallback is to only notice when we hit the\n // arrow, and not declare the arguments as locals for the arrow\n // body.\n function findFatArrow(stream, state) {\n if (state.fatArrowAt) state.fatArrowAt = null;\n var arrow = stream.string.indexOf(\"=>\", stream.start);\n if (arrow < 0) return;\n\n if (isTS) { // Try to skip TypeScript return type declarations after the arguments\n var m = /:\\s*(?:\\w+(?:<[^>]*>|\\[\\])?|\\{[^}]*\\})\\s*$/.exec(stream.string.slice(stream.start, arrow))\n if (m) arrow = m.index\n }\n\n var depth = 0, sawSomething = false;\n for (var pos = arrow - 1; pos >= 0; --pos) {\n var ch = stream.string.charAt(pos);\n var bracket = brackets.indexOf(ch);\n if (bracket >= 0 && bracket < 3) {\n if (!depth) { ++pos; break; }\n if (--depth == 0) { if (ch == \"(\") sawSomething = true; break; }\n } else if (bracket >= 3 && bracket < 6) {\n ++depth;\n } else if (wordRE.test(ch)) {\n sawSomething = true;\n } else if (/[\"'\\/]/.test(ch)) {\n return;\n } else if (sawSomething && !depth) {\n ++pos;\n break;\n }\n }\n if (sawSomething && !depth) state.fatArrowAt = pos;\n }\n\n // Parser\n\n var atomicTypes = {\"atom\": true, \"number\": true, \"variable\": true, \"string\": true, \"regexp\": true, \"this\": true, \"jsonld-keyword\": true};\n\n function JSLexical(indented, column, type, align, prev, info) {\n this.indented = indented;\n this.column = column;\n this.type = type;\n this.prev = prev;\n this.info = info;\n if (align != null) this.align = align;\n }\n\n function inScope(state, varname) {\n for (var v = state.localVars; v; v = v.next)\n if (v.name == varname) return true;\n for (var cx = state.context; cx; cx = cx.prev) {\n for (var v = cx.vars; v; v = v.next)\n if (v.name == varname) return true;\n }\n }\n\n function parseJS(state, style, type, content, stream) {\n var cc = state.cc;\n // Communicate our context to the combinators.\n // (Less wasteful than consing up a hundred closures on every call.)\n cx.state = state; cx.stream = stream; cx.marked = null, cx.cc = cc; cx.style = style;\n\n if (!state.lexical.hasOwnProperty(\"align\"))\n state.lexical.align = true;\n\n while(true) {\n var combinator = cc.length ? cc.pop() : jsonMode ? expression : statement;\n if (combinator(type, content)) {\n while(cc.length && cc[cc.length - 1].lex)\n cc.pop()();\n if (cx.marked) return cx.marked;\n if (type == \"variable\" && inScope(state, content)) return \"variable-2\";\n return style;\n }\n }\n }\n\n // Combinator utils\n\n var cx = {state: null, column: null, marked: null, cc: null};\n function pass() {\n for (var i = arguments.length - 1; i >= 0; i--) cx.cc.push(arguments[i]);\n }\n function cont() {\n pass.apply(null, arguments);\n return true;\n }\n function register(varname) {\n function inList(list) {\n for (var v = list; v; v = v.next)\n if (v.name == varname) return true;\n return false;\n }\n var state = cx.state;\n cx.marked = \"def\";\n if (state.context) {\n if (inList(state.localVars)) return;\n state.localVars = {name: varname, next: state.localVars};\n } else {\n if (inList(state.globalVars)) return;\n if (parserConfig.globalVars)\n state.globalVars = {name: varname, next: state.globalVars};\n }\n }\n\n // Combinators\n\n var defaultVars = {name: \"this\", next: {name: \"arguments\"}};\n function pushcontext() {\n cx.state.context = {prev: cx.state.context, vars: cx.state.localVars};\n cx.state.localVars = defaultVars;\n }\n function popcontext() {\n cx.state.localVars = cx.state.context.vars;\n cx.state.context = cx.state.context.prev;\n }\n function pushlex(type, info) {\n var result = function() {\n var state = cx.state, indent = state.indented;\n if (state.lexical.type == \"stat\") indent = state.lexical.indented;\n else for (var outer = state.lexical; outer && outer.type == \")\" && outer.align; outer = outer.prev)\n indent = outer.indented;\n state.lexical = new JSLexical(indent, cx.stream.column(), type, null, state.lexical, info);\n };\n result.lex = true;\n return result;\n }\n function poplex() {\n var state = cx.state;\n if (state.lexical.prev) {\n if (state.lexical.type == \")\")\n state.indented = state.lexical.indented;\n state.lexical = state.lexical.prev;\n }\n }\n poplex.lex = true;\n\n function expect(wanted) {\n function exp(type) {\n if (type == wanted) return cont();\n else if (wanted == \";\") return pass();\n else return cont(exp);\n };\n return exp;\n }\n\n function statement(type, value) {\n if (type == \"var\") return cont(pushlex(\"vardef\", value.length), vardef, expect(\";\"), poplex);\n if (type == \"keyword a\") return cont(pushlex(\"form\"), parenExpr, statement, poplex);\n if (type == \"keyword b\") return cont(pushlex(\"form\"), statement, poplex);\n if (type == \"keyword d\") return cx.stream.match(/^\\s*$/, false) ? cont() : cont(pushlex(\"stat\"), maybeexpression, expect(\";\"), poplex);\n if (type == \"debugger\") return cont(expect(\";\"));\n if (type == \"{\") return cont(pushlex(\"}\"), block, poplex);\n if (type == \";\") return cont();\n if (type == \"if\") {\n if (cx.state.lexical.info == \"else\" && cx.state.cc[cx.state.cc.length - 1] == poplex)\n cx.state.cc.pop()();\n return cont(pushlex(\"form\"), parenExpr, statement, poplex, maybeelse);\n }\n if (type == \"function\") return cont(functiondef);\n if (type == \"for\") return cont(pushlex(\"form\"), forspec, statement, poplex);\n if (type == \"variable\") {\n if (isTS && value == \"type\") {\n cx.marked = \"keyword\"\n return cont(typeexpr, expect(\"operator\"), typeexpr, expect(\";\"));\n } if (isTS && value == \"declare\") {\n cx.marked = \"keyword\"\n return cont(statement)\n } else {\n return cont(pushlex(\"stat\"), maybelabel);\n }\n }\n if (type == \"switch\") return cont(pushlex(\"form\"), parenExpr, expect(\"{\"), pushlex(\"}\", \"switch\"),\n block, poplex, poplex);\n if (type == \"case\") return cont(expression, expect(\":\"));\n if (type == \"default\") return cont(expect(\":\"));\n if (type == \"catch\") return cont(pushlex(\"form\"), pushcontext, expect(\"(\"), funarg, expect(\")\"),\n statement, poplex, popcontext);\n if (type == \"class\") return cont(pushlex(\"form\"), className, poplex);\n if (type == \"export\") return cont(pushlex(\"stat\"), afterExport, poplex);\n if (type == \"import\") return cont(pushlex(\"stat\"), afterImport, poplex);\n if (type == \"module\") return cont(pushlex(\"form\"), pattern, expect(\"{\"), pushlex(\"}\"), block, poplex, poplex)\n if (type == \"async\") return cont(statement)\n if (value == \"@\") return cont(expression, statement)\n return pass(pushlex(\"stat\"), expression, expect(\";\"), poplex);\n }\n function expression(type) {\n return expressionInner(type, false);\n }\n function expressionNoComma(type) {\n return expressionInner(type, true);\n }\n function parenExpr(type) {\n if (type != \"(\") return pass()\n return cont(pushlex(\")\"), expression, expect(\")\"), poplex)\n }\n function expressionInner(type, noComma) {\n if (cx.state.fatArrowAt == cx.stream.start) {\n var body = noComma ? arrowBodyNoComma : arrowBody;\n if (type == \"(\") return cont(pushcontext, pushlex(\")\"), commasep(funarg, \")\"), poplex, expect(\"=>\"), body, popcontext);\n else if (type == \"variable\") return pass(pushcontext, pattern, expect(\"=>\"), body, popcontext);\n }\n\n var maybeop = noComma ? maybeoperatorNoComma : maybeoperatorComma;\n if (atomicTypes.hasOwnProperty(type)) return cont(maybeop);\n if (type == \"function\") return cont(functiondef, maybeop);\n if (type == \"class\") return cont(pushlex(\"form\"), classExpression, poplex);\n if (type == \"keyword c\" || type == \"async\") return cont(noComma ? expressionNoComma : expression);\n if (type == \"(\") return cont(pushlex(\")\"), maybeexpression, expect(\")\"), poplex, maybeop);\n if (type == \"operator\" || type == \"spread\") return cont(noComma ? expressionNoComma : expression);\n if (type == \"[\") return cont(pushlex(\"]\"), arrayLiteral, poplex, maybeop);\n if (type == \"{\") return contCommasep(objprop, \"}\", null, maybeop);\n if (type == \"quasi\") return pass(quasi, maybeop);\n if (type == \"new\") return cont(maybeTarget(noComma));\n return cont();\n }\n function maybeexpression(type) {\n if (type.match(/[;\\}\\)\\],]/)) return pass();\n return pass(expression);\n }\n\n function maybeoperatorComma(type, value) {\n if (type == \",\") return cont(expression);\n return maybeoperatorNoComma(type, value, false);\n }\n function maybeoperatorNoComma(type, value, noComma) {\n var me = noComma == false ? maybeoperatorComma : maybeoperatorNoComma;\n var expr = noComma == false ? expression : expressionNoComma;\n if (type == \"=>\") return cont(pushcontext, noComma ? arrowBodyNoComma : arrowBody, popcontext);\n if (type == \"operator\") {\n if (/\\+\\+|--/.test(value) || isTS && value == \"!\") return cont(me);\n if (value == \"?\") return cont(expression, expect(\":\"), expr);\n return cont(expr);\n }\n if (type == \"quasi\") { return pass(quasi, me); }\n if (type == \";\") return;\n if (type == \"(\") return contCommasep(expressionNoComma, \")\", \"call\", me);\n if (type == \".\") return cont(property, me);\n if (type == \"[\") return cont(pushlex(\"]\"), maybeexpression, expect(\"]\"), poplex, me);\n if (isTS && value == \"as\") { cx.marked = \"keyword\"; return cont(typeexpr, me) }\n if (type == \"regexp\") {\n cx.state.lastType = cx.marked = \"operator\"\n cx.stream.backUp(cx.stream.pos - cx.stream.start - 1)\n return cont(expr)\n }\n }\n function quasi(type, value) {\n if (type != \"quasi\") return pass();\n if (value.slice(value.length - 2) != \"${\") return cont(quasi);\n return cont(expression, continueQuasi);\n }\n function continueQuasi(type) {\n if (type == \"}\") {\n cx.marked = \"string-2\";\n cx.state.tokenize = tokenQuasi;\n return cont(quasi);\n }\n }\n function arrowBody(type) {\n findFatArrow(cx.stream, cx.state);\n return pass(type == \"{\" ? statement : expression);\n }\n function arrowBodyNoComma(type) {\n findFatArrow(cx.stream, cx.state);\n return pass(type == \"{\" ? statement : expressionNoComma);\n }\n function maybeTarget(noComma) {\n return function(type) {\n if (type == \".\") return cont(noComma ? targetNoComma : target);\n else if (type == \"variable\" && isTS) return cont(maybeTypeArgs, noComma ? maybeoperatorNoComma : maybeoperatorComma)\n else return pass(noComma ? expressionNoComma : expression);\n };\n }\n function target(_, value) {\n if (value == \"target\") { cx.marked = \"keyword\"; return cont(maybeoperatorComma); }\n }\n function targetNoComma(_, value) {\n if (value == \"target\") { cx.marked = \"keyword\"; return cont(maybeoperatorNoComma); }\n }\n function maybelabel(type) {\n if (type == \":\") return cont(poplex, statement);\n return pass(maybeoperatorComma, expect(\";\"), poplex);\n }\n function property(type) {\n if (type == \"variable\") {cx.marked = \"property\"; return cont();}\n }\n function objprop(type, value) {\n if (type == \"async\") {\n cx.marked = \"property\";\n return cont(objprop);\n } else if (type == \"variable\" || cx.style == \"keyword\") {\n cx.marked = \"property\";\n if (value == \"get\" || value == \"set\") return cont(getterSetter);\n var m // Work around fat-arrow-detection complication for detecting typescript typed arrow params\n if (isTS && cx.state.fatArrowAt == cx.stream.start && (m = cx.stream.match(/^\\s*:\\s*/, false)))\n cx.state.fatArrowAt = cx.stream.pos + m[0].length\n return cont(afterprop);\n } else if (type == \"number\" || type == \"string\") {\n cx.marked = jsonldMode ? \"property\" : (cx.style + \" property\");\n return cont(afterprop);\n } else if (type == \"jsonld-keyword\") {\n return cont(afterprop);\n } else if (type == \"modifier\") {\n return cont(objprop)\n } else if (type == \"[\") {\n return cont(expression, expect(\"]\"), afterprop);\n } else if (type == \"spread\") {\n return cont(expressionNoComma, afterprop);\n } else if (value == \"*\") {\n cx.marked = \"keyword\";\n return cont(objprop);\n } else if (type == \":\") {\n return pass(afterprop)\n }\n }\n function getterSetter(type) {\n if (type != \"variable\") return pass(afterprop);\n cx.marked = \"property\";\n return cont(functiondef);\n }\n function afterprop(type) {\n if (type == \":\") return cont(expressionNoComma);\n if (type == \"(\") return pass(functiondef);\n }\n function commasep(what, end, sep) {\n function proceed(type, value) {\n if (sep ? sep.indexOf(type) > -1 : type == \",\") {\n var lex = cx.state.lexical;\n if (lex.info == \"call\") lex.pos = (lex.pos || 0) + 1;\n return cont(function(type, value) {\n if (type == end || value == end) return pass()\n return pass(what)\n }, proceed);\n }\n if (type == end || value == end) return cont();\n return cont(expect(end));\n }\n return function(type, value) {\n if (type == end || value == end) return cont();\n return pass(what, proceed);\n };\n }\n function contCommasep(what, end, info) {\n for (var i = 3; i < arguments.length; i++)\n cx.cc.push(arguments[i]);\n return cont(pushlex(end, info), commasep(what, end), poplex);\n }\n function block(type) {\n if (type == \"}\") return cont();\n return pass(statement, block);\n }\n function maybetype(type, value) {\n if (isTS) {\n if (type == \":\") return cont(typeexpr);\n if (value == \"?\") return cont(maybetype);\n }\n }\n function typeexpr(type, value) {\n if (type == \"variable\" || value == \"void\") {\n if (value == \"keyof\") {\n cx.marked = \"keyword\"\n return cont(typeexpr)\n } else {\n cx.marked = \"type\"\n return cont(afterType)\n }\n }\n if (type == \"string\" || type == \"number\" || type == \"atom\") return cont(afterType);\n if (type == \"[\") return cont(pushlex(\"]\"), commasep(typeexpr, \"]\", \",\"), poplex, afterType)\n if (type == \"{\") return cont(pushlex(\"}\"), commasep(typeprop, \"}\", \",;\"), poplex, afterType)\n if (type == \"(\") return cont(commasep(typearg, \")\"), maybeReturnType)\n }\n function maybeReturnType(type) {\n if (type == \"=>\") return cont(typeexpr)\n }\n function typeprop(type, value) {\n if (type == \"variable\" || cx.style == \"keyword\") {\n cx.marked = \"property\"\n return cont(typeprop)\n } else if (value == \"?\") {\n return cont(typeprop)\n } else if (type == \":\") {\n return cont(typeexpr)\n } else if (type == \"[\") {\n return cont(expression, maybetype, expect(\"]\"), typeprop)\n }\n }\n function typearg(type) {\n if (type == \"variable\") return cont(typearg)\n else if (type == \":\") return cont(typeexpr)\n }\n function afterType(type, value) {\n if (value == \"<\") return cont(pushlex(\">\"), commasep(typeexpr, \">\"), poplex, afterType)\n if (value == \"|\" || type == \".\") return cont(typeexpr)\n if (type == \"[\") return cont(expect(\"]\"), afterType)\n if (value == \"extends\") return cont(typeexpr)\n }\n function maybeTypeArgs(_, value) {\n if (value == \"<\") return cont(pushlex(\">\"), commasep(typeexpr, \">\"), poplex, afterType)\n }\n function vardef() {\n return pass(pattern, maybetype, maybeAssign, vardefCont);\n }\n function pattern(type, value) {\n if (type == \"modifier\") return cont(pattern)\n if (type == \"variable\") { register(value); return cont(); }\n if (type == \"spread\") return cont(pattern);\n if (type == \"[\") return contCommasep(pattern, \"]\");\n if (type == \"{\") return contCommasep(proppattern, \"}\");\n }\n function proppattern(type, value) {\n if (type == \"variable\" && !cx.stream.match(/^\\s*:/, false)) {\n register(value);\n return cont(maybeAssign);\n }\n if (type == \"variable\") cx.marked = \"property\";\n if (type == \"spread\") return cont(pattern);\n if (type == \"}\") return pass();\n return cont(expect(\":\"), pattern, maybeAssign);\n }\n function maybeAssign(_type, value) {\n if (value == \"=\") return cont(expressionNoComma);\n }\n function vardefCont(type) {\n if (type == \",\") return cont(vardef);\n }\n function maybeelse(type, value) {\n if (type == \"keyword b\" && value == \"else\") return cont(pushlex(\"form\", \"else\"), statement, poplex);\n }\n function forspec(type) {\n if (type == \"(\") return cont(pushlex(\")\"), forspec1, expect(\")\"), poplex);\n }\n function forspec1(type) {\n if (type == \"var\") return cont(vardef, expect(\";\"), forspec2);\n if (type == \";\") return cont(forspec2);\n if (type == \"variable\") return cont(formaybeinof);\n return pass(expression, expect(\";\"), forspec2);\n }\n function formaybeinof(_type, value) {\n if (value == \"in\" || value == \"of\") { cx.marked = \"keyword\"; return cont(expression); }\n return cont(maybeoperatorComma, forspec2);\n }\n function forspec2(type, value) {\n if (type == \";\") return cont(forspec3);\n if (value == \"in\" || value == \"of\") { cx.marked = \"keyword\"; return cont(expression); }\n return pass(expression, expect(\";\"), forspec3);\n }\n function forspec3(type) {\n if (type != \")\") cont(expression);\n }\n function functiondef(type, value) {\n if (value == \"*\") {cx.marked = \"keyword\"; return cont(functiondef);}\n if (type == \"variable\") {register(value); return cont(functiondef);}\n if (type == \"(\") return cont(pushcontext, pushlex(\")\"), commasep(funarg, \")\"), poplex, maybetype, statement, popcontext);\n if (isTS && value == \"<\") return cont(pushlex(\">\"), commasep(typeexpr, \">\"), poplex, functiondef)\n }\n function funarg(type, value) {\n if (value == \"@\") cont(expression, funarg)\n if (type == \"spread\" || type == \"modifier\") return cont(funarg);\n return pass(pattern, maybetype, maybeAssign);\n }\n function classExpression(type, value) {\n // Class expressions may have an optional name.\n if (type == \"variable\") return className(type, value);\n return classNameAfter(type, value);\n }\n function className(type, value) {\n if (type == \"variable\") {register(value); return cont(classNameAfter);}\n }\n function classNameAfter(type, value) {\n if (value == \"<\") return cont(pushlex(\">\"), commasep(typeexpr, \">\"), poplex, classNameAfter)\n if (value == \"extends\" || value == \"implements\" || (isTS && type == \",\"))\n return cont(isTS ? typeexpr : expression, classNameAfter);\n if (type == \"{\") return cont(pushlex(\"}\"), classBody, poplex);\n }\n function classBody(type, value) {\n if (type == \"modifier\" || type == \"async\" ||\n (type == \"variable\" &&\n (value == \"static\" || value == \"get\" || value == \"set\") &&\n cx.stream.match(/^\\s+[\\w$\\xa1-\\uffff]/, false))) {\n cx.marked = \"keyword\";\n return cont(classBody);\n }\n if (type == \"variable\" || cx.style == \"keyword\") {\n cx.marked = \"property\";\n return cont(isTS ? classfield : functiondef, classBody);\n }\n if (type == \"[\")\n return cont(expression, expect(\"]\"), isTS ? classfield : functiondef, classBody)\n if (value == \"*\") {\n cx.marked = \"keyword\";\n return cont(classBody);\n }\n if (type == \";\") return cont(classBody);\n if (type == \"}\") return cont();\n if (value == \"@\") return cont(expression, classBody)\n }\n function classfield(type, value) {\n if (value == \"?\") return cont(classfield)\n if (type == \":\") return cont(typeexpr, maybeAssign)\n if (value == \"=\") return cont(expressionNoComma)\n return pass(functiondef)\n }\n function afterExport(type, value) {\n if (value == \"*\") { cx.marked = \"keyword\"; return cont(maybeFrom, expect(\";\")); }\n if (value == \"default\") { cx.marked = \"keyword\"; return cont(expression, expect(\";\")); }\n if (type == \"{\") return cont(commasep(exportField, \"}\"), maybeFrom, expect(\";\"));\n return pass(statement);\n }\n function exportField(type, value) {\n if (value == \"as\") { cx.marked = \"keyword\"; return cont(expect(\"variable\")); }\n if (type == \"variable\") return pass(expressionNoComma, exportField);\n }\n function afterImport(type) {\n if (type == \"string\") return cont();\n return pass(importSpec, maybeMoreImports, maybeFrom);\n }\n function importSpec(type, value) {\n if (type == \"{\") return contCommasep(importSpec, \"}\");\n if (type == \"variable\") register(value);\n if (value == \"*\") cx.marked = \"keyword\";\n return cont(maybeAs);\n }\n function maybeMoreImports(type) {\n if (type == \",\") return cont(importSpec, maybeMoreImports)\n }\n function maybeAs(_type, value) {\n if (value == \"as\") { cx.marked = \"keyword\"; return cont(importSpec); }\n }\n function maybeFrom(_type, value) {\n if (value == \"from\") { cx.marked = \"keyword\"; return cont(expression); }\n }\n function arrayLiteral(type) {\n if (type == \"]\") return cont();\n return pass(commasep(expressionNoComma, \"]\"));\n }\n\n function isContinuedStatement(state, textAfter) {\n return state.lastType == \"operator\" || state.lastType == \",\" ||\n isOperatorChar.test(textAfter.charAt(0)) ||\n /[,.]/.test(textAfter.charAt(0));\n }\n\n function expressionAllowed(stream, state, backUp) {\n return state.tokenize == tokenBase &&\n /^(?:operator|sof|keyword [bcd]|case|new|export|default|spread|[\\[{}\\(,;:]|=>)$/.test(state.lastType) ||\n (state.lastType == \"quasi\" && /\\{\\s*$/.test(stream.string.slice(0, stream.pos - (backUp || 0))))\n }\n\n // Interface\n\n return {\n startState: function(basecolumn) {\n var state = {\n tokenize: tokenBase,\n lastType: \"sof\",\n cc: [],\n lexical: new JSLexical((basecolumn || 0) - indentUnit, 0, \"block\", false),\n localVars: parserConfig.localVars,\n context: parserConfig.localVars && {vars: parserConfig.localVars},\n indented: basecolumn || 0\n };\n if (parserConfig.globalVars && typeof parserConfig.globalVars == \"object\")\n state.globalVars = parserConfig.globalVars;\n return state;\n },\n\n token: function(stream, state) {\n if (stream.sol()) {\n if (!state.lexical.hasOwnProperty(\"align\"))\n state.lexical.align = false;\n state.indented = stream.indentation();\n findFatArrow(stream, state);\n }\n if (state.tokenize != tokenComment && stream.eatSpace()) return null;\n var style = state.tokenize(stream, state);\n if (type == \"comment\") return style;\n state.lastType = type == \"operator\" && (content == \"++\" || content == \"--\") ? \"incdec\" : type;\n return parseJS(state, style, type, content, stream);\n },\n\n indent: function(state, textAfter) {\n if (state.tokenize == tokenComment) return CodeMirror.Pass;\n if (state.tokenize != tokenBase) return 0;\n var firstChar = textAfter && textAfter.charAt(0), lexical = state.lexical, top\n // Kludge to prevent 'maybelse' from blocking lexical scope pops\n if (!/^\\s*else\\b/.test(textAfter)) for (var i = state.cc.length - 1; i >= 0; --i) {\n var c = state.cc[i];\n if (c == poplex) lexical = lexical.prev;\n else if (c != maybeelse) break;\n }\n while ((lexical.type == \"stat\" || lexical.type == \"form\") &&\n (firstChar == \"}\" || ((top = state.cc[state.cc.length - 1]) &&\n (top == maybeoperatorComma || top == maybeoperatorNoComma) &&\n !/^[,\\.=+\\-*:?[\\(]/.test(textAfter))))\n lexical = lexical.prev;\n if (statementIndent && lexical.type == \")\" && lexical.prev.type == \"stat\")\n lexical = lexical.prev;\n var type = lexical.type, closing = firstChar == type;\n\n if (type == \"vardef\") return lexical.indented + (state.lastType == \"operator\" || state.lastType == \",\" ? lexical.info + 1 : 0);\n else if (type == \"form\" && firstChar == \"{\") return lexical.indented;\n else if (type == \"form\") return lexical.indented + indentUnit;\n else if (type == \"stat\")\n return lexical.indented + (isContinuedStatement(state, textAfter) ? statementIndent || indentUnit : 0);\n else if (lexical.info == \"switch\" && !closing && parserConfig.doubleIndentSwitch != false)\n return lexical.indented + (/^(?:case|default)\\b/.test(textAfter) ? indentUnit : 2 * indentUnit);\n else if (lexical.align) return lexical.column + (closing ? 0 : 1);\n else return lexical.indented + (closing ? 0 : indentUnit);\n },\n\n electricInput: /^\\s*(?:case .*?:|default:|\\{|\\})$/,\n blockCommentStart: jsonMode ? null : \"/*\",\n blockCommentEnd: jsonMode ? null : \"*/\",\n blockCommentContinue: jsonMode ? null : \" * \",\n lineComment: jsonMode ? null : \"//\",\n fold: \"brace\",\n closeBrackets: \"()[]{}''\\\"\\\"``\",\n\n helperType: jsonMode ? \"json\" : \"javascript\",\n jsonldMode: jsonldMode,\n jsonMode: jsonMode,\n\n expressionAllowed: expressionAllowed,\n\n skipExpression: function(state) {\n var top = state.cc[state.cc.length - 1]\n if (top == expression || top == expressionNoComma) state.cc.pop()\n }\n };\n});\n\nCodeMirror.registerHelper(\"wordChars\", \"javascript\", /[\\w$]/);\n\nCodeMirror.defineMIME(\"text/javascript\", \"javascript\");\nCodeMirror.defineMIME(\"text/ecmascript\", \"javascript\");\nCodeMirror.defineMIME(\"application/javascript\", \"javascript\");\nCodeMirror.defineMIME(\"application/x-javascript\", \"javascript\");\nCodeMirror.defineMIME(\"application/ecmascript\", \"javascript\");\nCodeMirror.defineMIME(\"application/json\", {name: \"javascript\", json: true});\nCodeMirror.defineMIME(\"application/x-json\", {name: \"javascript\", json: true});\nCodeMirror.defineMIME(\"application/ld+json\", {name: \"javascript\", jsonld: true});\nCodeMirror.defineMIME(\"text/typescript\", { name: \"javascript\", typescript: true });\nCodeMirror.defineMIME(\"application/typescript\", { name: \"javascript\", typescript: true });\n\n});\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/codemirror/mode/javascript/javascript.js","module.exports = function(module) {\n\tif(!module.webpackPolyfill) {\n\t\tmodule.deprecate = function() {};\n\t\tmodule.paths = [];\n\t\t// module.parent = undefined by default\n\t\tif(!module.children) module.children = [];\n\t\tObject.defineProperty(module, \"loaded\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.l;\n\t\t\t}\n\t\t});\n\t\tObject.defineProperty(module, \"id\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.i;\n\t\t\t}\n\t\t});\n\t\tmodule.webpackPolyfill = 1;\n\t}\n\treturn module;\n};\n\n\n\n// WEBPACK FOOTER //\n// (webpack)/buildin/module.js","var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || Function(\"return this\")() || (1,eval)(\"this\");\n} catch(e) {\n\t// This works if the window reference is available\n\tif(typeof window === \"object\")\n\t\tg = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n\n\n\n// WEBPACK FOOTER //\n// (webpack)/buildin/global.js","import root from './_root.js';\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined,\n allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined;\n\n/**\n * Creates a clone of `buffer`.\n *\n * @private\n * @param {Buffer} buffer The buffer to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Buffer} Returns the cloned buffer.\n */\nfunction cloneBuffer(buffer, isDeep) {\n if (isDeep) {\n return buffer.slice();\n }\n var length = buffer.length,\n result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);\n\n buffer.copy(result);\n return result;\n}\n\nexport default cloneBuffer;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/_cloneBuffer.js","/**\n * This method returns `false`.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {boolean} Returns `false`.\n * @example\n *\n * _.times(2, _.stubFalse);\n * // => [false, false]\n */\nfunction stubFalse() {\n return false;\n}\n\nexport default stubFalse;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/stubFalse.js","import freeGlobal from './_freeGlobal.js';\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Detect free variable `process` from Node.js. */\nvar freeProcess = moduleExports && freeGlobal.process;\n\n/** Used to access faster Node.js helpers. */\nvar nodeUtil = (function() {\n try {\n return freeProcess && freeProcess.binding && freeProcess.binding('util');\n } catch (e) {}\n}());\n\nexport default nodeUtil;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/lodash-es/_nodeUtil.js","module.exports = {\"length\":950,\"regions\":[{\"modelStart\":5,\"modelEnd\":292,\"colour\":\"#2dcf00\",\"endStyle\":\"jagged\",\"startStyle\":\"jagged\",\"display\":true,\"end\":361,\"aliEnd\":361,\"href\":\"/family/PF00082\",\"text\":\"Peptidase_S8\",\"modelLength\":307,\"metadata\":{\"scoreName\":\"e-value\",\"score\":\"1.3e-38\",\"description\":\"Subtilase family\",\"accession\":\"PF00082\",\"end\":587,\"database\":\"pfam\",\"aliEnd\":573,\"identifier\":\"Peptidase_S8\",\"type\":\"Domain\",\"aliStart\":163,\"start\":159},\"type\":\"pfama\",\"aliStart\":163,\"start\":159},{\"modelStart\":5,\"modelEnd\":292,\"colour\":\"#2dcf00\",\"endStyle\":\"jagged\",\"startStyle\":\"jagged\",\"display\":true,\"end\":587,\"aliEnd\":573,\"href\":\"/family/PF00082\",\"text\":\"Peptidase_S8\",\"modelLength\":307,\"metadata\":{\"scoreName\":\"e-value\",\"score\":\"1.3e-38\",\"description\":\"Subtilase family\",\"accession\":\"PF00082\",\"end\":587,\"database\":\"pfam\",\"aliEnd\":573,\"identifier\":\"Peptidase_S8\",\"type\":\"Domain\",\"aliStart\":163,\"start\":159},\"type\":\"pfama\",\"aliStart\":470,\"start\":470},{\"modelStart\":12,\"modelEnd\":100,\"colour\":\"#ff5353\",\"endStyle\":\"curved\",\"startStyle\":\"jagged\",\"display\":true,\"end\":469,\"aliEnd\":469,\"href\":\"/family/PF02225\",\"text\":\"PA\",\"modelLength\":100,\"metadata\":{\"scoreName\":\"e-value\",\"score\":\"7.1e-09\",\"description\":\"PA domain\",\"accession\":\"PF02225\",\"end\":469,\"database\":\"pfam\",\"aliEnd\":469,\"identifier\":\"PA\",\"type\":\"Family\",\"aliStart\":385,\"start\":362},\"type\":\"pfama\",\"aliStart\":385,\"start\":362},{\"modelStart\":1,\"modelEnd\":112,\"colour\":\"#5b5bff\",\"endStyle\":\"curved\",\"startStyle\":\"curved\",\"display\":true,\"end\":726,\"aliEnd\":726,\"href\":\"/family/PF06280\",\"text\":\"DUF1034\",\"modelLength\":112,\"metadata\":{\"scoreName\":\"e-value\",\"score\":\"1.1e-13\",\"description\":\"Fn3-like domain (DUF1034)\",\"accession\":\"PF06280\",\"end\":726,\"database\":\"pfam\",\"aliEnd\":726,\"identifier\":\"DUF1034\",\"type\":\"Domain\",\"aliStart\":613,\"start\":613},\"type\":\"pfama\",\"aliStart\":613,\"start\":613}],\"markups\":[{\"lineColour\":\"#ff0000\",\"colour\":\"#000000\",\"display\":true,\"end\":470,\"v_align\":\"top\",\"metadata\":{\"database\":\"pfam\",\"type\":\"Link between discontinous regions\",\"end\":470,\"start\":361},\"type\":\"Nested\",\"start\":361},{\"lineColour\":\"#333333\",\"colour\":\"#e469fe\",\"display\":true,\"residue\":\"S\",\"headStyle\":\"diamond\",\"v_align\":\"top\",\"type\":\"Pfam predicted active site\",\"metadata\":{\"database\":\"pfam\",\"description\":\"S Pfam predicted active site\",\"start\":538},\"start\":538},{\"lineColour\":\"#333333\",\"colour\":\"#e469fe\",\"display\":true,\"residue\":\"D\",\"headStyle\":\"diamond\",\"v_align\":\"top\",\"type\":\"Pfam predicted active site\",\"metadata\":{\"database\":\"pfam\",\"description\":\"D Pfam predicted active site\",\"start\":185},\"start\":185},{\"lineColour\":\"#333333\",\"colour\":\"#e469fe\",\"display\":true,\"residue\":\"H\",\"headStyle\":\"diamond\",\"v_align\":\"top\",\"type\":\"Pfam predicted active site\",\"metadata\":{\"database\":\"pfam\",\"description\":\"H Pfam predicted active site\",\"start\":235},\"start\":235}],\"metadata\":{\"database\":\"uniprot\",\"identifier\":\"Q560V8_CRYNE\",\"organism\":\"Cryptococcus neoformans (Filobasidiella neoformans)\",\"description\":\"Putative uncharacterized protein\",\"taxid\":5207,\"accession\":\"Q560V8\"},\"motifs\":[{\"colour\":\"#ffa500\",\"metadata\":{\"database\":\"Phobius\",\"type\":\"sig_p\",\"end\":23,\"start\":1},\"type\":\"sig_p\",\"display\":true,\"end\":23,\"start\":1},{\"colour\":\"#00ffff\",\"metadata\":{\"database\":\"seg\",\"type\":\"low_complexity\",\"score\":\"2.5100\",\"end\":21,\"start\":3},\"type\":\"low_complexity\",\"display\":false,\"end\":21,\"start\":3},{\"colour\":\"#86bcff\",\"metadata\":{\"database\":\"seg\",\"type\":\"low_complexity\",\"score\":\"1.4900\",\"end\":156,\"start\":134},\"type\":\"low_complexity\",\"display\":true,\"end\":156,\"start\":134},{\"colour\":\"#00ffff\",\"metadata\":{\"database\":\"seg\",\"type\":\"low_complexity\",\"score\":\"2.0200\",\"end\":187,\"start\":173},\"type\":\"low_complexity\",\"display\":false,\"end\":187,\"start\":173},{\"colour\":\"#00ffff\",\"metadata\":{\"database\":\"seg\",\"type\":\"low_complexity\",\"score\":\"2.0800\",\"end\":218,\"start\":207},\"type\":\"low_complexity\",\"display\":false,\"end\":218,\"start\":207},{\"colour\":\"#00ffff\",\"metadata\":{\"database\":\"seg\",\"type\":\"low_complexity\",\"score\":\"2.1300\",\"end\":231,\"start\":220},\"type\":\"low_complexity\",\"display\":false,\"end\":231,\"start\":220},{\"colour\":\"#00ffff\",\"metadata\":{\"database\":\"seg\",\"type\":\"low_complexity\",\"score\":\"2.0000\",\"end\":554,\"start\":538},\"type\":\"low_complexity\",\"display\":false,\"end\":554,\"start\":538},{\"colour\":\"#86bcff\",\"metadata\":{\"database\":\"seg\",\"type\":\"low_complexity\",\"score\":\"1.9100\",\"end\":590,\"start\":578},\"type\":\"low_complexity\",\"display\":true,\"end\":590,\"start\":588},{\"colour\":\"#00ffff\",\"metadata\":{\"database\":\"seg\",\"type\":\"low_complexity\",\"score\":\"1.7600\",\"end\":831,\"start\":822},\"type\":\"low_complexity\",\"display\":false,\"end\":831,\"start\":822},{\"colour\":[\"#ff7ff0\",\"#f2ff7f\",\"#7ff2ff\"],\"href\":\"/pfamb/PB075017\",\"type\":\"pfamb\",\"metadata\":{\"database\":\"pfam\",\"identifier\":\"Pfam-B_75017\",\"type\":\"Pfam-B\",\"start\":791,\"end\":949,\"accession\":\"PB075017\"},\"start\":791,\"end\":949,\"display\":true}]}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./demo/data.json\n// module id = 12\n// module chunks = 0"],"sourceRoot":""}