{"version":3,"sources":["webpack:///./node_modules/codemirror/lib/codemirror.js","webpack:///./node_modules/codemirror/mode/css/css.js","webpack:///./node_modules/codemirror/mode/htmlmixed/htmlmixed.js","webpack:///./node_modules/codemirror/mode/handlebars/handlebars.js","webpack:///./node_modules/codemirror/mode/sparql/sparql.js","webpack:///./node_modules/codemirror/addon/fold/foldgutter.js","webpack:///./node_modules/codemirror/addon/runmode/runmode.js","webpack:///./node_modules/codemirror/mode/clike/clike.js","webpack:///./node_modules/codemirror/mode/shell/shell.js","webpack:///./node_modules/codemirror/lib/codemirror.js-exposed","webpack:///./node_modules/codemirror/addon/fold/foldcode.js","webpack:///./node_modules/codemirror/mode/xml/xml.js","webpack:///./node_modules/codemirror/addon/mode/simple.js","webpack:///./node_modules/codemirror/addon/mode/multiplex.js","webpack:///./node_modules/codemirror/addon/fold/brace-fold.js","webpack:///./node_modules/codemirror/addon/fold/xml-fold.js","webpack:///./node_modules/codemirror/addon/edit/matchbrackets.js","webpack:///./node_modules/codemirror/mode/javascript/javascript.js","webpack:///./node_modules/codemirror/mode/turtle/turtle.js","webpack:///./node_modules/codemirror/addon/fold/indent-fold.js","webpack:///./node_modules/codemirror/addon/edit/matchtags.js"],"names":["module","exports","userAgent","navigator","platform","gecko","test","ie_upto10","ie_11up","exec","ie","ie_version","document","documentMode","webkit","qtwebkit","chrome","presto","safari","vendor","mac_geMountainLion","phantom","ios","mobile","mac","chromeOS","windows","presto_version","match","Number","flipCtrlCmd","captureRightClick","sawReadOnlySpans","sawCollapsedSpans","CodeMirror","place","options","this","copyObj","defaults","setGuttersForLineNumbers","doc","value","Doc","mode","lineSeparator","input","inputStyles","inputStyle","display","Display","wrapper","updateGutters","themeChanged","lineWrapping","className","autofocus","focus","initScrollbars","state","keyMaps","overlays","modeGen","overwrite","delayingBlurEvent","focused","suppressEdits","pasteIncoming","cutIncoming","selectingText","draggingText","highlight","Delayed","keySeq","specialChars","cm","opt","setTimeout","reset","registerEventHandlers","d","on","scroller","operation","onMouseDown","e","signalDOMEvent","pos","posFromMouse","clickInGutter","eventInWidget","e_preventDefault","word","findWordAt","extendSelection","anchor","head","onContextMenu","touchFinished","prevTouch","end","finishTouch","activeTouch","Date","farAway","touch","other","left","dx","dy","top","isMouseLikeTouchEvent","touches","length","radiusX","radiusY","clearTimeout","now","start","moved","prev","pageX","pageY","range","coordsChar","Range","Pos","line","clipPos","setSelection","clientHeight","setScrollTop","scrollTop","setScrollLeft","scrollLeft","signal","onScrollWheel","dragFunctions","enter","e_stop","over","onDragOver","frag","createDocumentFragment","drawSelectionCursor","dragCursor","elt","lineSpace","insertBefore","cursorDiv","removeChildrenAndAdd","onDragStart","lastDrop","dataTransfer","setData","getSelection","effectAllowed","setDragImage","img","src","width","height","appendChild","_top","offsetTop","parentNode","removeChild","drop","onDrop","leave","clearDragCursor","inp","getField","onKeyUp","call","onKeyDown","onKeyPress","onFocus","onBlur","ensureGlobalHandlers","globalsRegistered","registerGlobalHandlers","resizeTimer","window","forEachCodeMirror","onResize","startOperation","curOp","forceUpdate","attachDoc","hasFocus","bind","optionHandlers","hasOwnProperty","Init","maybeUpdateLineNumberWidth","finishInit","i","initHooks","endOperation","getComputedStyle","lineDiv","textRendering","style","scrollbarFiller","setAttribute","gutterFiller","selectionDiv","measure","lineMeasure","mover","sizer","sizerWidth","heightForcer","scrollerGap","gutters","lineGutter","zIndex","paddingRight","draggable","viewFrom","viewTo","first","reportedViewFrom","reportedViewTo","view","renderedView","externalMeasured","viewOffset","lastWrapHeight","lastWrapWidth","updateLineNumbers","nativeBarWidth","barHeight","barWidth","scrollbarsClipped","lineNumWidth","lineNumInnerWidth","lineNumChars","alignWidgets","cachedCharWidth","cachedTextHeight","cachedPaddingH","maxLine","maxLineLength","maxLineChanged","wheelDX","wheelDY","wheelStartX","wheelStartY","shift","selForContextMenu","init","loadMode","getMode","modeOption","resetModeState","iter","stateAfter","styles","frontier","startWorker","regChange","estimateHeight","th","textHeight","wrapping","perLine","Math","max","clientWidth","charWidth","lineIsHidden","widgetsHeight","widgets","ceil","text","estimateLineHeights","est","estHeight","updateLineHeight","replace","theme","clearCaches","guttersChanged","alignHorizontally","specs","removeChildren","gutterClass","gElt","updateGutterSpace","offsetWidth","marginLeft","lineLength","merged","len","cur","collapsedSpanAtStart","found","find","from","ch","to","collapsedSpanAtEnd","findMaxLine","getLine","indexOf","lineNumbers","concat","slice","splice","measureForScrollbars","gutterW","docH","round","paddingVert","viewHeight","scrollWidth","viewWidth","barLeft","fixedGutter","docHeight","scrollHeight","scrollGap","gutterWidth","NativeScrollbars","scroll","vert","horiz","checkedZeroWidth","minHeight","minWidth","NullScrollbars","scrollbars","clear","addClass","rmClass","scrollbarModel","scrollbarStyle","node","axis","updateScrollbars","startWidth","startHeight","updateScrollbarsInner","updateHeightsInViewport","sizes","update","right","paddingBottom","bottom","borderBottom","coverGutterNextToScrollbar","visibleLines","viewport","floor","paddingTop","lineAtHeight","ensure","ensureFrom","ensureTo","heightAtLine","min","lastLine","firstChild","comp","compensateForHScroll","hidden","gutter","gutterBackground","align","alignable","j","last","lineNumberFor","size","innerW","padding","String","lineNumberFormatter","firstLineNumber","getBoundingClientRect","DisplayUpdate","force","visible","editorIsHidden","wrapperHeight","wrapperWidth","oldDisplayWidth","displayWidth","dims","getDimensions","events","updateDisplayIfNeeded","resetView","countDirtyView","viewportMargin","visualLineNo","visualLineEndNo","different","adjustView","buildViewArray","findViewIndex","toUpdate","activeElt","patchDisplay","updateNumbersFrom","container","rm","next","nextSibling","currentWheelTarget","lineN","lineView","updateNumber","lineNumber","changes","updateLineForChanges","createTextNode","buildLineElement","offsetHeight","postUpdateDisplay","displayHeight","barMeasure","updateSelection","setDocumentHeight","updateDisplaySimple","finish","prevBottom","bot","box","diff","updateWidgetHeight","rest","gutterLeft","clientLeft","n","offsetLeft","fixedPos","gutterTotalWidth","type","updateLineText","updateLineGutter","updateLineClasses","updateLineWidgets","ensureLineWrapped","replaceChild","getLineContent","ext","built","buildLineContent","cls","pre","bgClass","textClass","updateLineBackground","background","wrap","wrapClass","markers","gutterMarkers","gutterWrap","setUneditable","k","id","insertLineWidgets","insertLineWidgetsFor","allowAbove","ws","widget","handleMouseEvents","positionLineWidget","above","signalLater","noHScroll","push","coverGutter","paddingLeft","position","prototype","needsH","needsV","sWidth","totalHeight","totalWidth","zeroWidthHack","disableHoriz","enableZeroWidthBar","disableVert","w","pointerEvents","bar","delay","set","maybeDisable","elementFromPoint","parent","emitter","hasHandler","arguments","apply","cmp","cmpPos","a","b","copyPos","x","maxPos","minPos","ensureFocus","lastCopied","applyTextInput","inserted","deleted","sel","origin","paste","textLines","splitLines","multiPaste","ranges","join","map","l","empty","lst","lineWise","updateInput","changeEvent","makeChange","triggerElectric","ensureCursorVisible","typing","handlePaste","pasted","clipboardData","getData","preventDefault","isReadOnly","disableInput","runInOp","electricChars","smartIndent","getModeAt","indented","charAt","indentLine","electricInput","copyableRanges","lineRange","getRange","disableBrowserMagic","field","spellcheck","TextareaInput","prevInput","pollingFast","polling","inaccurateSelection","hasSelection","composing","hiddenTextarea","te","div","border","ContentEditableInput","lastAnchorNode","lastAnchorOffset","lastFocusNode","lastFocusOffset","gracePeriod","posToDOM","findViewForLine","info","mapFromLineView","order","getOrder","side","getBidiPartAt","result","nodeAndOffsetInLineMap","offset","collapse","badPos","bad","domToPos","lineNode","childNodes","locateNodeInLineView","contains","lineNo","textNode","nodeType","topNode","nodeValue","maps","curNode","after","dist","textContent","before","previousSibling","Selection","primIndex","normalizeSelection","prim","sort","inv","simpleSelection","clipLine","clipToLen","linelen","isLine","clipPosArray","array","out","extendRange","extend","posBefore","primary","extendSelections","heads","replaceOneSelection","setSimpleSelection","setSelectionReplaceHistory","done","history","setSelectionNoUndo","addSelectionToHistory","opId","hist","lastSelOp","lastSelOrigin","lastModTime","lastSelTime","lastOrigin","selectionEventCanBeMerged","somethingSelected","historyEventDelay","pushSelectionToHistory","clearRedo","clearSelectionEvents","undone","NaN","filterSelectionChange","obj","bias","setSelectionInner","skipAtomicInSelection","equals","selectionChanged","signalCursorActivity","reCheckSelection","mayClear","old","newAnchor","skipAtomic","newHead","skipAtomicInner","oldPos","dir","markedSpans","sp","m","marker","inclusiveLeft","inclusiveRight","explicitlyCleared","atomic","near","movePos","far","cantEdit","showSelection","prepareSelection","curFragment","cursors","selFragment","selection","collapsed","showCursorWhenSelecting","drawSelectionRange","output","cursorCoords","singleCursorHeightPerLine","cursor","cursorHeight","otherCursor","fragment","paddingH","leftSide","rightSide","add","drawForLine","fromArg","toArg","lineObj","lineLen","coords","charCoords","iterateBidiSections","f","part","level","rightPos","leftPos","tmp","sFrom","sTo","fromLine","toLine","singleVLine","visualLine","leftEnd","rightStart","restartBlink","clearInterval","blinker","visibility","cursorBlinkRate","setInterval","time","startState","highlightWorker","workTime","copyState","getStateBefore","changedLines","oldStyles","tooLong","maxHighlightLength","highlighted","highlightLine","oldCls","styleClasses","newCls","classes","ischange","processLine","workDelay","regLineChange","precise","findStartLine","minindent","minline","lim","innerMode","search","countColumn","tabSize","save","currentStyle","data","parseInt","isNaN","cache","caches","measureChar","measureCharPrepared","prepareMeasureForLine","updateExternalMeasurement","LineView","rect","hasHeights","prepared","varHeight","key","ensureLineHeights","curWidth","heights","rects","getClientRects","abs","measureCharInner","isExtendingChar","coverStart","coverEnd","getUsefulRect","maybeUpdateRectForZooming","screen","logicalXDPI","deviceXDPI","hasBadZoomedRects","badZoomedRects","normal","fromRange","scaleX","scaleY","logicalYDPI","deviceYDPI","rSpan","nullRect","rtop","rbot","mid","bogus","rbottom","textarea","prepareCopyCut","getSelections","selectInput","lineWiseCopyCut","setSelections","sel_dontScroll","poll","fastPoll","getCursor","markText","moveInputWithCursor","headPos","wrapOff","lineOff","teTop","teLeft","drawn","contextMenuPending","minimal","selected","content","hasCopyEvent","supportsTouch","readOnly","blur","resetPosition","receivedFocus","slowPoll","pollInterval","missed","p","charCodeAt","execCommand","same","self","ensurePolled","scrollPos","resetSelectionOnContextMenu","oldCSS","cssText","oldWrapperCSS","wrapperBox","clientY","clientX","oldScrollY","scrollY","scrollTo","detectingSelectAll","prepareSelectAllHack","mouseup","off","rehide","selectionStart","extval","selectionEnd","commands","selectAll","readOnlyChanged","val","nothing","needsContentAttribute","onCopyCut","replaceSelection","clearData","kludge","hadFocus","activeElement","showPrimarySelection","pollContent","startData","ours","handled","applyComposition","forceCompositionEnd","takeFocus","showMultipleSelections","curAnchor","anchorNode","anchorOffset","curFocus","focusNode","focusOffset","rangeCount","getRangeAt","rng","addRange","removeAllRanges","startGracePeriod","rememberSelection","selectionInEditor","commonAncestorContainer","pollSelection","fromIndex","fromNode","toIndex","toNode","lastChild","newText","domTextBetween","closing","lineSep","walk","cmText","getAttribute","markerID","findMarks","recognizeMarker","getBetween","nodeName","oldText","pop","cutFront","cutEnd","newTop","oldTop","maxCutFront","newBot","oldBot","maxCutEnd","chFrom","chTo","replaceRange","contentEditable","fromCharCode","charCode","keyCode","here","there","deepCopy","measureText","mStart","mEnd","insertLeft","clearLineMeasurementCacheFor","clearLineMeasurementCache","externalMeasure","pageScrollX","pageXOffset","documentElement","body","pageScrollY","pageYOffset","intoCoordSystem","context","widgetHeight","yOff","lOff","xOff","fromCoordSystem","localBox","lineSpaceBox","preparedMeasure","get","getBidi","partPos","bidiLeft","bidiRight","bidiOther","estimateCoords","PosWithInfo","outside","xRel","y","coordsCharInner","mergedPos","innerOff","wrongLine","adjust","getX","bidi","lineLeft","lineRight","fromX","fromOutside","toX","toOutside","moveVisually","xDiff","charSize","step","middle","middleX","lastClick","lastDoubleClick","operationGroup","nextOpId","viewChanged","changeObjs","cursorActivityHandlers","cursorActivityCalled","updateMaxLine","scrollToPos","ops","ownsGroup","delayedCallbacks","group","fireCallbacksForOps","callbacks","op","endOperations","endOperation_R1","endOperation_W1","endOperation_R2","endOperation_W2","endOperation_finish","maybeClipScrollbars","marginBottom","borderRightWidth","mustUpdate","updatedDisplay","adjustWidthTo","maxScrollLeft","preparedSelection","forceScroll","scrollPosIntoView","margin","limit","changed","endCoords","calculateScrollPos","startTop","startLeft","isCursor","maybeScrollWindow","doScroll","innerHeight","scrollNode","scrollIntoView","maybeHiddenMarkers","unhidden","maybeUnhiddenMarkers","lines","methodOp","docMethodOp","visualLineContinued","nextPos","lendiff","cut","viewCuttingPoint","index","cutTop","cutBot","arr","oldN","newN","dirty","setSize","e_target","liberal","forRect","space","colDiff","shiftKey","e_button","leftButtonDown","contained","modifier","metaKey","ctrlKey","dragDrop","dragAndDrop","leftButtonStartDrag","startTime","dragEnd","e2","copy","altKey","leftButtonSelect","addNew","ourRange","ourIndex","startSel","sel_mouse","lastPos","editorSize","counter","curCount","extendTo","startCol","posCol","findColumn","oldRange","Infinity","move","up","lastMiddleDown","delayBlurEvent","gutterEvent","prevent","mX","mY","lineBox","e_defaultPrevented","g","files","FileReader","File","Array","read","loadFile","file","allowDropFileTypes","reader","onload","change","changeEnd","readAsText","listSelections","isScroller","wheelSamples","wheelPixelsPerUnit","wheelEventDelta","wheelDeltaX","wheelDeltaY","detail","HORIZONTAL_AXIS","VERTICAL_AXIS","wheelDelta","delta","canScrollX","canScrollY","outer","target","pixels","movedX","movedY","sample","doHandleBinding","bound","dropShift","prevShift","Pass","wheelEventPixels","stopSeq","dispatchKey","name","handle","seq","isModifierKey","lookupKeyForEditor","lookupKey","extraKeys","keyMap","handleKeyBinding","keyName","motion","lastStoppedKey","returnValue","code","showCrossHair","which","handleCharBinding","contextMenuInGutter","adjustForChange","computeSelAfterChange","offsetPos","nw","filterChange","canceled","cancel","undefined","ignoreReadOnly","split","removeReadOnlyRanges","mark","parts","mk","newParts","dfrom","dto","makeChangeInner","selAfter","addChangeToHistory","makeChangeSingleDoc","stretchSpansOverChange","rebased","linkedDocs","sharedHist","rebaseHist","makeChangeFromHistory","allowSelectionOnly","event","source","dest","antiChanges","generation","maxGeneration","filter","historyChangeFromChange","mergeOldSpans","shiftDoc","distance","spans","removed","makeChangeSingleDocInEditor","recomputeMaxLength","checkWidthStart","updateDoc","full","isWholeLineUpdate","changesHandler","changeHandler","x1","y1","x2","y2","snapMargin","screentop","docBottom","atTop","atBottom","screenleft","screenw","tooWide","addToScrollPos","resolveScrollToPos","cursorScrollMargin","sPos","how","aggressive","indent","curSpace","indentation","curSpaceString","indentUnit","indentString","indentWithTabs","spaceStr","changeLine","changeType","no","deleteNearSelection","compute","kill","toKill","replaced","findPosH","unit","visually","origDir","moveOnce","boundToLine","moveLogically","findNextLine","sawType","helper","getHelper","isWordChar","hitSide","findPosV","pageSize","moveAmount","constructor","setOption","option","getOption","getDoc","addKeyMap","getKeyMap","removeKeyMap","addOverlay","spec","token","Error","insertSorted","score","priority","modeSpec","opaque","overlay","removeOverlay","indentSelection","newRanges","getTokenAt","takeToken","getLineTokens","getTokenTypeAt","getLineStyles","getHelpers","helpers","help","helperType","_global","pred","getStateAfter","defaultTextHeight","defaultCharWidth","setGutterMarker","gutterID","isEmpty","clearGutter","lineInfo","getViewport","addWidget","vspace","hspace","triggerOnKeyDown","triggerOnKeyPress","triggerOnKeyUp","cmd","amount","moveH","extendSelectionsBy","rtlMoveVisually","sel_move","deleteH","goalColumn","moveV","goals","startChar","check","toggleOverwrite","getScrollInfo","interpret","refresh","oldHeight","swapDoc","getInputField","getWrapperElement","getScrollerElement","getGutterElement","eventMixin","deflt","notOnInit","toString","setValue","newBreaks","RegExp","defaultSpecialCharPlaceholder","title","detach","attach","wrappingChanged","integer","disabled","dragDropChanged","funcs","toggle","undoDepth","tabIndex","modes","mimeModes","defineMode","dependencies","defineMIME","mime","resolveMode","createObj","mfactory","modeObj","modeExtensions","exts","prop","modeProps","stream","skipToEnd","extendMode","properties","defineExtension","func","defineDocExtension","defineOption","defineInitHook","registerHelper","registerGlobalHelper","predicate","nstate","a1","a2","firstLine","singleSelection","killLine","deleteLine","delLineLeft","delWrappedLineLeft","delWrappedLineRight","undo","redo","undoSelection","redoSelection","goDocStart","goDocEnd","goLineStart","lineStart","goLineStartSmart","lineStartSmart","goLineEnd","lineEnd","goLineRight","goLineLeft","goLineLeftSmart","goLineUp","goLineDown","goPageUp","goPageDown","goCharLeft","goCharRight","goColumnLeft","goColumnRight","goWordLeft","goGroupRight","goGroupLeft","goWordRight","delCharBefore","delCharAfter","delWordBefore","delWordAfter","delGroupBefore","delGroupAfter","indentAuto","indentMore","indentLess","insertTab","insertSoftTab","spaces","col","replaceSelections","defaultTab","transposeChars","newSel","newlineAndIndent","openLine","normalizeKeyName","alt","ctrl","mod","basic","pcDefault","fallthrough","emacsy","macDefault","normalizeKeyMap","keymap","keyname","keys","Object","keyNames","noShift","base","altGraphKey","fromTextArea","tabindex","placeholder","getValue","form","leaveSubmitMethodAlone","realSubmit","submit","wrappedSubmit","getTextArea","toTextArea","StringStream","string","lastColumnPos","lastColumnValue","eol","sol","peek","eat","ok","eatWhile","eatSpace","skipTo","backUp","column","pattern","consume","caseInsensitive","cased","str","toLowerCase","substr","current","hideFirstChars","inner","nextMarkerId","TextMarker","shared","markTextShared","widgetNode","cloneNode","linked","isParent","SharedTextMarker","clearWhenEmpty","replacedWith","conflictingCollapsedRange","addToHistory","curLine","addMarkedSpan","span","attachLine","MarkedSpan","clearOnEnter","clearHistory","startStyle","endStyle","css","withOp","getMarkedSpanFor","removeMarkedSpan","visual","dHeight","detachLine","findSharedMarkers","detachSharedMarkers","subMarker","r","oldFirst","oldLast","startCh","endCh","isInsert","markedSpansBefore","endsAfter","markedSpansAfter","startsBefore","sameLine","clearEmptySpans","newMarkers","gapMarkers","gap","getOldSpans","removeClearedSpans","stretched","oldCur","stretchCur","detachMarkedSpans","attachMarkedSpans","extraLeft","extraRight","compareCollapsedMarkers","lenDiff","aPos","bPos","fromCmp","toCmp","collapsedSpanAtSide","sps","vis","lineIsHiddenInner","LineWidget","adjustScrollWhenAboveVisible","parentStyle","oldH","Line","cleanUpLine","extractLineClasses","lineClass","callBlankLine","blankLine","readToken","asArray","getObj","tokens","runMode","lineClasses","forceToEnd","flattenSpans","curStart","curStyle","addModeClass","mName","st","o","at","i_end","updateFrontier","startAt","styleToClassCache","styleToClassCacheWithMode","interpretTokenStyle","builder","trailingSpace","splitSpaces","addToken","buildToken","hasBadBidiRects","buildTokenBadBidi","insertLineContent","joinClasses","zeroWidthElement","querySelector","displayText","trailingBefore","spaceBefore","special","mustWrap","lastIndex","skipped","txt","tabWidth","specialCharPlaceholder","fullStyle","buildCollapsedSpan","ignoreWidget","createElement","allText","spanStyle","spanEndStyle","spanStartStyle","nextChange","endStyles","foundBookmarks","upto","tokenText","wholeLineUpdateBefore","spansFor","updateLine","linesFor","lastText","lastSpans","nlines","insert","remove","added","LeafChunk","BranchChunk","children","chunkSize","removeInner","insertInner","iterN","child","sz","remaining","leaf","maybeSpill","me","sibling","myIndex","used","nextDocId","cleanGeneration","History","getLines","getLineHandle","getLineNumber","getLineHandleVisualStart","lineCount","setCursor","addSelection","dup","computeReplacedSel","hint","oldPrev","newPrev","setExtending","getExtending","historySize","markClean","changeGeneration","forceSplit","lastOp","isClean","gen","getHistory","copyHistoryArray","setHistory","histData","addLineClass","where","classTest","removeLineClass","addLineWidget","insertAt","aboveVisible","removeLineWidget","setBookmark","realOpts","findMarksAt","getAllMarks","posFromIndex","sepSize","indexFromPos","copyHistory","linkedDoc","copySharedMarkers","mFrom","mTo","subMark","unlinkDoc","splitIds","iterLinkedDocs","getEditor","splitLinesAuto","eachLine","dontDelegate","method","sharedHistOnly","propagate","skip","rel","chunk","h","lh","bidiOrdering","startGen","histChange","attachLocalSpans","lastChangeEvent","existing","newGroup","instantiateSel","newChanges","rebaseHistSelSingle","rebaseHistArray","sub","copied","e_stopPropagation","stopPropagation","cancelBubble","defaultPrevented","srcElement","button","addEventListener","attachEvent","_handlers","noHandlers","getHandlers","removeEventListener","detachEvent","handlers","args","orphanDelayedCallbacks","list","fireOrphanDelayed","bnd","delayed","override","codemirrorIgnore","cursorActivity","ctor","ms","startIndex","startValue","nextTab","goal","spaceStrs","select","props","inst","create","_e","nonASCIISingleCaseWordChar","isWordCharBasic","toUpperCase","extendingChars","tag","count","createRange","endNode","setEnd","setStart","createTextRange","moveToElementText","moveEnd","moveStart","host","root","as","getElementsByClassName","byClass","zwspSupported","badBidiRects","r0","r1","nl","rt","ownerDocument","parentElement","compareEndPoints","oncopy","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","firstNonWS","inWS","compareBidiLevel","linedir","moveInLine","byUnit","bidiRE","isNeutral","isStrong","countsAsLeft","countsAsNum","BidiSpan","types","nstart","unshift","version","keySet","config","parserConfig","inline","propertyKeywords","tokenHooks","documentTypes","mediaTypes","mediaFeatures","mediaValueKeywords","nonStandardPropertyKeywords","fontProperties","counterDescriptors","colorKeywords","valueKeywords","allowNested","supportsAtComponent","ret","tp","tokenBase","tokenize","tokenString","tokenParenthesized","quote","escaped","Context","pushContext","popContext","pass","states","popAndPass","wordAsValue","stateArg","_stream","atBlock","textAfter","cx","blockCommentStart","blockCommentEnd","fold","documentTypes_","mediaTypes_","mediaFeatures_","mediaValueKeywords_","propertyKeywords_","nonStandardPropertyKeywords_","colorKeywords_","valueKeywords_","allWords","tokenCComment","maybeEnd","defaultTags","script","attrRegexpCache","getAttrValue","attr","getAttrRegexp","regexp","getTagRegexp","tagName","anchored","addTags","htmlMode","multilineTagIndentFactor","multilineTagIndentPastTag","tags","configTags","configScript","scriptTypes","matches","html","htmlState","inTag","findMatchingMode","tagInfo","tagText","endTagA","endTag","localState","localMode","maybeBackup","pat","close","local","defineSimpleMode","regex","handlebars","dash_comment","comment","multiplexingMode","open","parseDelimiters","curPunc","wordRegexp","words","keywords","operatorChars","tokenLiteral","firstChar","lineComment","foldGutter","onGutterClick","onChange","onViewportChange","onFold","State","parseOptions","opts","indicatorOpen","indicatorFolded","updateInViewport","isFolded","marks","__isFold","updateFoldInfo","minSize","foldOption","vp","folded","foldCode","rangeFinder","changeUpdate","foldOnChangeTimeSpan","updateViewportTimeSpan","modespec","callback","ie_lt9","innerHTML","idx","t","typeBefore","prevToken","typeAtEndOfLine","isTopScope","propertyIsEnumerable","isDefKeyword","statementIndentUnit","dontAlignCalls","builtin","blockKeywords","defKeywords","atoms","hooks","multiLineStrings","indentStatements","indentSwitch","namespaceSeparator","isPunctuationChar","numberStart","number","isOperatorChar","endStatement","tokenComment","maybeEOL","typeFirstDefinitions","basecolumn","startOfLine","ctx","styleDefs","dontIndentStatements","hook","switchBlock","allmanIndentation","cKeywords","cTypes","cppHook","pointerHook","cpp14Literal","cpp11StringHook","cpp11RawStringDelim","tokenRawString","tokenAtString","delim","def","mimes","tokenTripleString","cppLooksLikeConstructor","lastTwo","closeBrackets","triples","intendSwitch","tokenKotlinString","tripleString","_state","stringTokenizer","tokenCeylonString","define","tokenDollar","hungry","doFold","finder","allowFolded","cleared","myWidget","makeWidget","myRange","newFoldFunction","toggleFold","unfold","foldAll","unfoldAll","defaultOptions","auto","minFoldSize","scanUp","editorOptions","foldOptions","htmlConfig","autoSelfClosers","implicitlyClosed","contextGrabbers","doNotIndent","allowUnquoted","allowMissing","caseFold","xmlConfig","editorConf","config_","setStyle","inText","chain","parser","inBlock","doctype","depth","baseState","tagStart","inAttribute","closure","isInAttribute","stringStartCol","terminator","noIndent","maybePopContext","nextTagName","parentTagName","tagNameState","closeTagNameState","attrState","matchClosing","closeState","closeStateErr","attrEqState","attrValueState","attrContinuedState","isInText","baseIndent","fullLine","alignCDATA","tagAfter","grabbers","configuration","skipAttribute","ensureState","toRegex","caret","flags","ignoreCase","Rule","asToken","tokenFunction","pending","pend","tok","endToken","endScan","curState","rule","stack","enterLocalMode","dedent","pers","persistent","persistentStates","lState","forceEnd","indentFunction","meta","dontIndentStates","rules","scan","dedentIfLineStart","simpleMode","states_","hasIndentation","orig","s","others","returnEnd","innerActive","curInner","oldContent","delimStyle","innerToken","innerStyle","cutOff","outerToken","tokenType","lineText","findOpening","openCh","lastIndexOf","startToken","nextOpen","nextClose","hasImport","semi","startLine","has","hasInclude","nameStartChar","xmlTagStart","Iter","tagAt","nextLine","prevLine","toTagEnd","gt","lastSlash","selfClose","toTagStart","lt","toNextTag","toPrevTag","findMatchingClose","findMatchingOpen","endLine","openTag","startPos","endPos","findMatchingTag","findEnclosingTag","scanForClosingTag","ie_lt8","matching","findMatchingBracket","strict","scanForBracket","forward","maxScanLen","maxScanLineLength","maxScanLines","re","bracketRegex","matchBrackets","autoclear","maxHighlightLen","maxHighlightLineLength","currentlyHighlighted","doMatchBrackets","expressionAllowed","lastType","statementIndent","jsonldMode","jsonld","jsonMode","json","isTS","typescript","wordRE","wordCharacters","kw","A","B","C","operator","atom","jsKeywords","tsKeywords","isJsonldKeyword","cont","readRegexp","inSet","tokenQuasi","known","findFatArrow","fatArrowAt","arrow","sawSomething","bracket","atomicTypes","JSLexical","inScope","varname","v","localVars","vars","marked","cc","register","inList","globalVars","defaultVars","pushcontext","popcontext","pushlex","lexical","lex","poplex","expect","wanted","exp","statement","vardef","parenExpr","block","maybeelse","functiondef","forspec","maybelabel","expression","funarg","afterExport","afterImport","typeexpr","expressionInner","expressionNoComma","noComma","arrowBodyNoComma","arrowBody","commasep","maybeop","maybeoperatorNoComma","maybeoperatorComma","maybeexpressionNoComma","maybeexpression","arrayLiteral","contCommasep","objprop","quasi","maybeTarget","targetNoComma","expr","property","continueQuasi","_","getterSetter","afterprop","what","proceed","maybetype","maybedefault","afterType","typeprop","typearg","maybeReturnType","maybeAssign","vardefCont","proppattern","_type","forspec1","forspec2","formaybeinof","forspec3","classNameAfter","classBody","classfield","maybeFrom","importSpec","maybeAs","parseJS","c","isContinuedStatement","doubleIndentSwitch","skipExpression","getIndent","myIndent","lastLineInFold","tagHit","tagOther","doMatchTags","failedTagMatch","matchBothTags","hit","maybeUpdateMatch","bothTags","toMatchingTag"],"mappings":"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","file":"npm.codemirror-00caea6b4426c73bd2eb.js","sourcesContent":["// 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(mod) {\n if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n module.exports = mod();\n else if (typeof define == \"function\" && define.amd) // AMD\n return define([], mod);\n else // Plain browser env\n (this || window).CodeMirror = mod();\n})(function() {\n \"use strict\";\n\n // BROWSER SNIFFING\n\n // Kludges for bugs and behavior differences that can't be feature\n // detected are enabled based on userAgent etc sniffing.\n var userAgent = navigator.userAgent;\n var platform = navigator.platform;\n\n var gecko = /gecko\\/\\d/i.test(userAgent);\n var ie_upto10 = /MSIE \\d/.test(userAgent);\n var ie_11up = /Trident\\/(?:[7-9]|\\d{2,})\\..*rv:(\\d+)/.exec(userAgent);\n var ie = ie_upto10 || ie_11up;\n var ie_version = ie && (ie_upto10 ? document.documentMode || 6 : ie_11up[1]);\n var webkit = /WebKit\\//.test(userAgent);\n var qtwebkit = webkit && /Qt\\/\\d+\\.\\d+/.test(userAgent);\n var chrome = /Chrome\\//.test(userAgent);\n var presto = /Opera\\//.test(userAgent);\n var safari = /Apple Computer/.test(navigator.vendor);\n var mac_geMountainLion = /Mac OS X 1\\d\\D([8-9]|\\d\\d)\\D/.test(userAgent);\n var phantom = /PhantomJS/.test(userAgent);\n\n var ios = /AppleWebKit/.test(userAgent) && /Mobile\\/\\w+/.test(userAgent);\n // This is woefully incomplete. Suggestions for alternative methods welcome.\n var mobile = ios || /Android|webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(userAgent);\n var mac = ios || /Mac/.test(platform);\n var chromeOS = /\\bCrOS\\b/.test(userAgent);\n var windows = /win/i.test(platform);\n\n var presto_version = presto && userAgent.match(/Version\\/(\\d*\\.\\d*)/);\n if (presto_version) presto_version = Number(presto_version[1]);\n if (presto_version && presto_version >= 15) { presto = false; webkit = true; }\n // Some browsers use the wrong event properties to signal cmd/ctrl on OS X\n var flipCtrlCmd = mac && (qtwebkit || presto && (presto_version == null || presto_version < 12.11));\n var captureRightClick = gecko || (ie && ie_version >= 9);\n\n // Optimize some code when these features are not used.\n var sawReadOnlySpans = false, sawCollapsedSpans = false;\n\n // EDITOR CONSTRUCTOR\n\n // A CodeMirror instance represents an editor. This is the object\n // that user code is usually dealing with.\n\n function CodeMirror(place, options) {\n if (!(this instanceof CodeMirror)) return new CodeMirror(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);\n this.doc = doc;\n\n var input = new CodeMirror.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 if (options.autofocus && !mobile) display.input.focus();\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 var cm = this;\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() { cm.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) || cm.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, 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);\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 // DISPLAY CONSTRUCTOR\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\n function 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 = elt(\"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 = elt(\"div\", [d.measure, d.lineMeasure, d.selectionDiv, d.cursorDiv, d.lineDiv],\n null, \"position: relative; outline: none\");\n // Moved around its parent to cover visible view.\n d.mover = elt(\"div\", [elt(\"div\", [d.lineSpace], \"CodeMirror-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 // STATE UPDATES\n\n // Used to get the editor into a consistent state again when options change.\n\n function loadMode(cm) {\n cm.doc.mode = CodeMirror.getMode(cm.options, cm.doc.modeOption);\n resetModeState(cm);\n }\n\n function 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.frontier = cm.doc.first;\n startWorker(cm, 100);\n cm.state.modeGen++;\n if (cm.curOp) regChange(cm);\n }\n\n function 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(){updateScrollbars(cm);}, 100);\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).\n function 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\n function 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 function 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\n function guttersChanged(cm) {\n updateGutters(cm);\n regChange(cm);\n setTimeout(function(){alignHorizontally(cm);}, 20);\n }\n\n // Rebuild the gutter elements, ensure the margin to the left of the\n // code matches their width.\n function updateGutters(cm) {\n var gutters = cm.display.gutters, specs = cm.options.gutters;\n removeChildren(gutters);\n for (var i = 0; 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 function updateGutterSpace(cm) {\n var width = cm.display.gutters.offsetWidth;\n cm.display.sizer.style.marginLeft = width + \"px\";\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.\n function 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 = merged.find(0, true);\n len -= cur.text.length - found.from.ch;\n cur = found.to.line;\n len += cur.text.length - found.to.ch;\n }\n return len;\n }\n\n // Find the longest line in the document.\n function 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 // Make sure the gutters options contains the element\n // \"CodeMirror-linenumbers\" when the lineNumbers option is true.\n function 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 // SCROLLBARS\n\n // Prepare DOM reads needed to update the scrollbars. Done in one\n // shot to minimize update/measure roundtrips.\n function 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\n function NativeScrollbars(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\n NativeScrollbars.prototype = copyObj({\n 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 (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 setScrollLeft: function(pos) {\n if (this.horiz.scrollLeft != pos) this.horiz.scrollLeft = pos;\n if (this.disableHoriz) this.enableZeroWidthBar(this.horiz, this.disableHoriz);\n },\n setScrollTop: function(pos) {\n if (this.vert.scrollTop != pos) this.vert.scrollTop = pos;\n if (this.disableVert) this.enableZeroWidthBar(this.vert, this.disableVert);\n },\n 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 enableZeroWidthBar: function(bar, delay) {\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 // left 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 = document.elementFromPoint(box.left + 1, box.bottom - 1);\n if (elt != bar) bar.style.pointerEvents = \"none\";\n else delay.set(1000, maybeDisable);\n }\n delay.set(1000, maybeDisable);\n },\n clear: function() {\n var parent = this.horiz.parentNode;\n parent.removeChild(this.horiz);\n parent.removeChild(this.vert);\n }\n }, NativeScrollbars.prototype);\n\n function NullScrollbars() {}\n\n NullScrollbars.prototype = copyObj({\n update: function() { return {bottom: 0, right: 0}; },\n setScrollLeft: function() {},\n setScrollTop: function() {},\n clear: function() {}\n }, NullScrollbars.prototype);\n\n CodeMirror.scrollbarModel = {\"native\": NativeScrollbars, \"null\": NullScrollbars};\n\n function 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 CodeMirror.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() { 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 setScrollTop(cm, pos);\n }, cm);\n if (cm.display.scrollbars.addClass)\n addClass(cm.display.wrapper, cm.display.scrollbars.addClass);\n }\n\n function 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.\n function 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\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.\n function 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 // LINE NUMBERS\n\n // Re-align line numbers and gutter marks to compensate for\n // horizontal scrolling.\n function 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.\n function 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 function lineNumberFor(options, i) {\n return String(options.lineNumberFormatter(i + options.firstLineNumber));\n }\n\n // Computes display.scroller.scrollLeft + display.gutters.offsetWidth,\n // but using getBoundingClientRect to get a sub-pixel-accurate\n // result.\n function compensateForHScroll(display) {\n return display.scroller.getBoundingClientRect().left - display.sizer.getBoundingClientRect().left;\n }\n\n // DISPLAY DRAWING\n\n function DisplayUpdate(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\n DisplayUpdate.prototype.signal = function(emitter, type) {\n if (hasHandler(emitter, type))\n this.events.push(arguments);\n };\n DisplayUpdate.prototype.finish = function() {\n for (var i = 0; i < this.events.length; i++)\n signal.apply(null, this.events[i]);\n };\n\n function 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\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.\n function 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 focused = activeElt();\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 if (focused && activeElt() != focused && focused.offsetHeight) focused.focus();\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\n function 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 }\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\n function 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 function 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 // Read the actual heights of the rendered lines, and update their\n // stored heights to match.\n function 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;\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 > .001 || diff < -.001) {\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.\n function 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 // 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.\n function 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 // 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.\n function 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\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.\n function 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(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\n function 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\n function updateLineBackground(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 }\n }\n\n // Wrapper around buildLineContent which will reuse the structure\n // in display.externalMeasured when possible.\n function 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.\n function 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(lineView);\n } else if (cls) {\n lineView.text.className = cls;\n }\n }\n\n function updateLineClasses(lineView) {\n updateLineBackground(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\n function 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) +\n \"px; width: \" + dims.gutterTotalWidth + \"px\");\n wrap.insertBefore(lineView.gutterBackground, lineView.text);\n }\n var markers = lineView.line.gutterMarkers;\n if (cm.options.lineNumbers || markers) {\n var wrap = ensureLineWrapped(lineView);\n var gutterWrap = lineView.gutter = elt(\"div\", null, \"CodeMirror-gutter-wrapper\", \"left: \" +\n (cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) + \"px\");\n cm.display.input.setUneditable(gutterWrap);\n wrap.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: \"\n + 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\", \"left: \" +\n dims.gutterLeft[id] + \"px; width: \" + dims.gutterWidth[id] + \"px\"));\n }\n }\n }\n\n function updateLineWidgets(cm, lineView, dims) {\n if (lineView.alignable) lineView.alignable = null;\n for (var node = lineView.node.firstChild, next; node; node = next) {\n var 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\n function 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(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.\n function 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\n function 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\n function 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\n // POSITION OBJECT\n\n // A Pos instance represents a position within the text.\n var Pos = CodeMirror.Pos = function(line, ch) {\n if (!(this instanceof Pos)) return new Pos(line, ch);\n this.line = line; this.ch = ch;\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.\n var cmp = CodeMirror.cmpPos = function(a, b) { return a.line - b.line || a.ch - b.ch; };\n\n function copyPos(x) {return Pos(x.line, x.ch);}\n function maxPos(a, b) { return cmp(a, b) < 0 ? b : a; }\n function minPos(a, b) { return cmp(a, b) < 0 ? a : b; }\n\n // INPUT HANDLING\n\n function ensureFocus(cm) {\n if (!cm.state.focused) { cm.display.input.focus(); onFocus(cm); }\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.\n var lastCopied = null;\n\n function 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 = doc.splitLines(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) {\n multiPaste = map(textLines, function(l) { return [l]; });\n }\n }\n\n // Normal behavior is to insert the new text into every selection\n for (var i = sel.ranges.length - 1; i >= 0; i--) {\n var range = sel.ranges[i];\n var from = range.from(), to = range.to();\n if (range.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 var updateInput = cm.curOp.updateInput;\n var changeEvent = {from: from, to: to, text: multiPaste ? multiPaste[i % 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\n function 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() { applyTextInput(cm, pasted, 0, null, \"paste\"); });\n return true;\n }\n }\n\n function 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 = sel.ranges[i];\n if (range.head.ch > 100 || (i && sel.ranges[i - 1].head.line == range.head.line)) continue;\n var mode = cm.getModeAt(range.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.head.line, \"smart\");\n break;\n }\n } else if (mode.electricInput) {\n if (mode.electricInput.test(getLine(cm.doc, range.head.line).text.slice(0, range.head.ch)))\n indented = indentLine(cm, range.head.line, \"smart\");\n }\n if (indented) signalLater(cm, \"electricInput\", cm, range.head.line);\n }\n }\n\n function 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\n function disableBrowserMagic(field, spellcheck) {\n field.setAttribute(\"autocorrect\", \"off\");\n field.setAttribute(\"autocapitalize\", \"off\");\n field.setAttribute(\"spellcheck\", !!spellcheck);\n }\n\n // TEXTAREA INPUT STYLE\n\n function TextareaInput(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 // Tracks when input.reset has punted to just putting a short\n // string into the textarea instead of the full selection.\n this.inaccurateSelection = false;\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\n function 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 TextareaInput.prototype = copyObj({\n init: function(display) {\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 && input.hasSelection) input.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 lastCopied = {lineWise: false, text: cm.getSelections()};\n if (input.inaccurateSelection) {\n input.prevInput = \"\";\n input.inaccurateSelection = false;\n te.value = lastCopied.text.join(\"\\n\");\n selectInput(te);\n }\n } else if (!cm.options.lineWiseCopyCut) {\n return;\n } else {\n var ranges = copyableRanges(cm);\n lastCopied = {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\n 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\n 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)\n reset: function(typing) {\n if (this.contextMenuPending) return;\n var minimal, selected, cm = this.cm, doc = cm.doc;\n if (cm.somethingSelected()) {\n this.prevInput = \"\";\n var range = doc.sel.primary();\n minimal = hasCopyEvent &&\n (range.to().line - range.from().line > 100 || (selected = cm.getSelection()).length > 1000);\n var content = minimal ? \"-\" : selected || 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 this.inaccurateSelection = minimal;\n },\n\n getField: function() { return this.textarea; },\n\n supportsTouch: function() { return false; },\n\n 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\n blur: function() { this.textarea.blur(); },\n\n resetPosition: function() {\n this.wrapper.style.top = this.wrapper.style.left = 0;\n },\n\n 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.\n slowPoll: function() {\n var input = this;\n if (input.pollingFast) return;\n input.polling.set(this.cm.options.pollInterval, function() {\n input.poll();\n if (input.cm.state.focused) input.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.\n 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).\n poll: function() {\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 var self = this;\n runInOp(cm, function() {\n applyTextInput(cm, text.slice(same), prevInput.length - same,\n null, self.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 = self.prevInput = \"\";\n else self.prevInput = text;\n\n if (self.composing) {\n self.composing.range.clear();\n self.composing.range = cm.markText(self.composing.start, cm.getCursor(\"to\"),\n {className: \"CodeMirror-composing\"});\n }\n });\n return true;\n },\n\n ensurePolled: function() {\n if (this.pollingFast && this.poll()) this.pollingFast = false;\n },\n\n onKeyPress: function() {\n if (ie && ie_version >= 9) this.hasSelection = null;\n this.fastPoll();\n },\n\n 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; top: \" + (e.clientY - wrapperBox.top - 5) +\n \"px; left: \" + (e.clientX - wrapperBox.left - 5) + \"px; z-index: 1000; background: \" +\n (ie ? \"rgba(255, 255, 255, .05)\" : \"transparent\") +\n \"; outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);\";\n if (webkit) var 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, commands.selectAll)(cm);\n else if (i++ < 10) display.detectingSelectAll = setTimeout(poll, 500);\n else display.input.reset();\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\n readOnlyChanged: function(val) {\n if (!val) this.reset();\n },\n\n setUneditable: nothing,\n\n needsContentAttribute: false\n }, TextareaInput.prototype);\n\n // CONTENTEDITABLE INPUT STYLE\n\n function ContentEditableInput(cm) {\n this.cm = cm;\n this.lastAnchorNode = this.lastAnchorOffset = this.lastFocusNode = this.lastFocusOffset = null;\n this.polling = new Delayed();\n this.gracePeriod = false;\n }\n\n ContentEditableInput.prototype = copyObj({\n init: function(display) {\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() {\n if (!input.pollContent()) regChange(cm);\n }), 20)\n })\n\n on(div, \"compositionstart\", function(e) {\n var data = e.data;\n input.composing = {sel: cm.doc.sel, data: data, startData: data};\n if (!data) return;\n var prim = cm.doc.sel.primary();\n var line = cm.getLine(prim.head.line);\n var found = line.indexOf(data, Math.max(0, prim.head.ch - data.length));\n if (found > -1 && found <= prim.head.ch)\n input.composing.sel = simpleSelection(Pos(prim.head.line, found),\n Pos(prim.head.line, found + data.length));\n });\n on(div, \"compositionupdate\", function(e) {\n input.composing.data = e.data;\n });\n on(div, \"compositionend\", function(e) {\n var ours = input.composing;\n if (!ours) return;\n if (e.data != ours.startData && !/\\u200b/.test(e.data))\n ours.data = e.data;\n // Need a small delay to prevent other code (input event,\n // selection polling) from doing damage when fired right after\n // compositionend.\n setTimeout(function() {\n if (!ours.handled)\n input.applyComposition(ours);\n if (input.composing == ours)\n input.composing = null;\n }, 50);\n });\n\n on(div, \"touchstart\", function() {\n input.forceCompositionEnd();\n });\n\n on(div, \"input\", function() {\n if (input.composing) return;\n if (cm.isReadOnly() || !input.pollContent())\n runInOp(input.cm, function() {regChange(cm);});\n });\n\n function onCopyCut(e) {\n if (signalDOMEvent(cm, e)) return\n if (cm.somethingSelected()) {\n lastCopied = {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 lastCopied = {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\n prepareSelection: function() {\n var result = prepareSelection(this.cm, false);\n result.focus = this.cm.state.focused;\n return result;\n },\n\n 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\n showPrimarySelection: function() {\n var sel = window.getSelection(), prim = this.cm.doc.sel.primary();\n var curAnchor = domToPos(this.cm, sel.anchorNode, sel.anchorOffset);\n var curFocus = domToPos(this.cm, sel.focusNode, sel.focusOffset);\n if (curAnchor && !curAnchor.bad && curFocus && !curFocus.bad &&\n cmp(minPos(curAnchor, curFocus), prim.from()) == 0 &&\n cmp(maxPos(curAnchor, curFocus), prim.to()) == 0)\n return;\n\n var start = posToDOM(this.cm, prim.from());\n var end = posToDOM(this.cm, prim.to());\n if (!start && !end) return;\n\n var view = this.cm.display.view;\n var old = sel.rangeCount && sel.getRangeAt(0);\n if (!start) {\n start = {node: view[0].measure.map[2], offset: 0};\n } else if (!end) { // FIXME dangerously hacky\n var measure = view[view.length - 1].measure;\n var map = measure.maps ? measure.maps[measure.maps.length - 1] : measure.map;\n end = {node: map[map.length - 1], offset: map[map.length - 2] - map[map.length - 3]};\n }\n\n try { var 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 && this.cm.state.focused) {\n sel.collapse(start.node, start.offset);\n if (!rng.collapsed) sel.addRange(rng);\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\n startGracePeriod: function() {\n var input = this;\n clearTimeout(this.gracePeriod);\n this.gracePeriod = setTimeout(function() {\n input.gracePeriod = false;\n if (input.selectionChanged())\n input.cm.operation(function() { input.cm.curOp.selectionChanged = true; });\n }, 20);\n },\n\n showMultipleSelections: function(info) {\n removeChildrenAndAdd(this.cm.display.cursorDiv, info.cursors);\n removeChildrenAndAdd(this.cm.display.selectionDiv, info.selection);\n },\n\n 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\n 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\n focus: function() {\n if (this.cm.options.readOnly != \"nocursor\") this.div.focus();\n },\n blur: function() { this.div.blur(); },\n getField: function() { return this.div; },\n\n supportsTouch: function() { return true; },\n\n receivedFocus: function() {\n var input = this;\n if (this.selectionInEditor())\n this.pollSelection();\n else\n runInOp(this.cm, function() { 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\n 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\n pollSelection: function() {\n if (!this.composing && !this.gracePeriod && this.selectionChanged()) {\n var sel = window.getSelection(), cm = this.cm;\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 },\n\n pollContent: function() {\n var cm = this.cm, display = cm.display, sel = cm.doc.sel.primary();\n var from = sel.from(), to = sel.to();\n if (from.line < display.viewFrom || to.line > display.viewTo - 1) return false;\n\n var fromIndex;\n if (from.line == display.viewFrom || (fromIndex = findViewIndex(cm, from.line)) == 0) {\n var fromLine = lineNo(display.view[0].line);\n var fromNode = display.view[0].node;\n } else {\n var fromLine = lineNo(display.view[fromIndex].line);\n var fromNode = display.view[fromIndex - 1].node.nextSibling;\n }\n var toIndex = findViewIndex(cm, to.line);\n if (toIndex == display.view.length - 1) {\n var toLine = display.viewTo - 1;\n var toNode = display.lineDiv.lastChild;\n } else {\n var toLine = lineNo(display.view[toIndex + 1].line) - 1;\n var toNode = display.view[toIndex + 1].node.previousSibling;\n }\n\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\n newText[newText.length - 1] = newBot.slice(0, newBot.length - cutEnd);\n newText[0] = newText[0].slice(cutFront);\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\n ensurePolled: function() {\n this.forceCompositionEnd();\n },\n reset: function() {\n this.forceCompositionEnd();\n },\n forceCompositionEnd: function() {\n if (!this.composing || this.composing.handled) return;\n this.applyComposition(this.composing);\n this.composing.handled = true;\n this.div.blur();\n this.div.focus();\n },\n applyComposition: function(composing) {\n if (this.cm.isReadOnly())\n operation(this.cm, regChange)(this.cm)\n else if (composing.data && composing.data != composing.startData)\n operation(this.cm, applyTextInput)(this.cm, composing.data, 0, composing.sel);\n },\n\n setUneditable: function(node) {\n node.contentEditable = \"false\"\n },\n\n onKeyPress: function(e) {\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\n readOnlyChanged: function(val) {\n this.div.contentEditable = String(val != \"nocursor\")\n },\n\n onContextMenu: nothing,\n resetPosition: nothing,\n\n needsContentAttribute: true\n }, ContentEditableInput.prototype);\n\n function 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), 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\n function badPos(pos, bad) { if (bad) pos.bad = true; return pos; }\n\n function 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\n function 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 = i < 0 ? measure.map : maps[i];\n for (var j = 0; j < map.length; j += 3) {\n var curNode = map[j + 2];\n if (curNode == textNode || curNode == topNode) {\n var line = lineNo(i < 0 ? lineView.line : lineView.rest[i]);\n var ch = map[j] + offset;\n if (offset < 0 || curNode != textNode) ch = map[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 = offset; before; before = before.previousSibling) {\n found = find(before, before.firstChild, -1);\n if (found)\n return badPos(Pos(found.line, found.ch + dist), bad);\n else\n dist += before.textContent.length;\n }\n }\n\n function 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 walk(node) {\n if (node.nodeType == 1) {\n var cmText = node.getAttribute(\"cm-text\");\n if (cmText != null) {\n if (cmText == \"\") cmText = node.textContent.replace(/\\u200b/g, \"\");\n text += cmText;\n return;\n }\n var markerID = node.getAttribute(\"cm-marker\"), range;\n if (markerID) {\n var found = cm.findMarks(Pos(fromLine, 0), Pos(toLine + 1, 0), recognizeMarker(+markerID));\n if (found.length && (range = found[0].find()))\n text += getBetween(cm.doc, range.from, range.to).join(lineSep);\n return;\n }\n if (node.getAttribute(\"contenteditable\") == \"false\") return;\n for (var i = 0; i < node.childNodes.length; i++)\n walk(node.childNodes[i]);\n if (/^(pre|div|p)$/i.test(node.nodeName))\n closing = true;\n } else if (node.nodeType == 3) {\n var val = node.nodeValue;\n if (!val) return;\n if (closing) {\n text += lineSep;\n closing = false;\n }\n text += val;\n }\n }\n for (;;) {\n walk(from);\n if (from == to) break;\n from = from.nextSibling;\n }\n return text;\n }\n\n CodeMirror.inputStyles = {\"textarea\": TextareaInput, \"contenteditable\": ContentEditableInput};\n\n // SELECTION / CURSOR\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).\n function Selection(ranges, primIndex) {\n this.ranges = ranges;\n this.primIndex = primIndex;\n }\n\n Selection.prototype = {\n primary: function() { return this.ranges[this.primIndex]; },\n equals: function(other) {\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.ranges[i], there = other.ranges[i];\n if (cmp(here.anchor, there.anchor) != 0 || cmp(here.head, there.head) != 0) return false;\n }\n return true;\n },\n deepCopy: function() {\n for (var out = [], i = 0; i < this.ranges.length; i++)\n out[i] = new Range(copyPos(this.ranges[i].anchor), copyPos(this.ranges[i].head));\n return new Selection(out, this.primIndex);\n },\n somethingSelected: function() {\n for (var i = 0; i < this.ranges.length; i++)\n if (!this.ranges[i].empty()) return true;\n return false;\n },\n contains: function(pos, end) {\n if (!end) end = pos;\n for (var i = 0; i < this.ranges.length; i++) {\n var range = this.ranges[i];\n if (cmp(end, range.from()) >= 0 && cmp(pos, range.to()) <= 0)\n return i;\n }\n return -1;\n }\n };\n\n function Range(anchor, head) {\n this.anchor = anchor; this.head = head;\n }\n\n Range.prototype = {\n from: function() { return minPos(this.anchor, this.head); },\n to: function() { return maxPos(this.anchor, this.head); },\n empty: function() {\n return this.head.line == this.anchor.line && this.head.ch == this.anchor.ch;\n }\n };\n\n // Take an unsorted, potentially overlapping set of ranges, and\n // build a selection out of it. 'Consumes' ranges array (modifying\n // it).\n function 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\n function simpleSelection(anchor, head) {\n return new Selection([new Range(anchor, head || anchor)], 0);\n }\n\n // Most of the external API clips given positions to make sure they\n // actually exist within the document.\n function clipLine(doc, n) {return Math.max(doc.first, Math.min(n, doc.first + doc.size - 1));}\n function 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 }\n function 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 }\n function isLine(doc, l) {return l >= doc.first && l < doc.first + doc.size;}\n function clipPosArray(doc, array) {\n for (var out = [], i = 0; i < array.length; i++) out[i] = clipPos(doc, array[i]);\n return out;\n }\n\n // SELECTION UPDATES\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.\n function extendRange(doc, range, head, other) {\n if (doc.cm && doc.cm.display.shift || doc.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.\n function extendSelection(doc, head, other, options) {\n setSelection(doc, new Selection([extendRange(doc, doc.sel.primary(), head, other)], 0), options);\n }\n\n // Extend all selections (pos is an array of selections with length\n // equal the number of selections)\n function extendSelections(doc, heads, options) {\n for (var out = [], i = 0; i < doc.sel.ranges.length; i++)\n out[i] = extendRange(doc, doc.sel.ranges[i], heads[i], null);\n var newSel = normalizeSelection(out, doc.sel.primIndex);\n setSelection(doc, newSel, options);\n }\n\n // Updates a single range in the selection.\n function 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.\n function 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.\n function filterSelectionChange(doc, sel, options) {\n var obj = {\n ranges: sel.ranges,\n update: function(ranges) {\n this.ranges = [];\n for (var i = 0; i < ranges.length; i++)\n this.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\n function 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.\n function setSelection(doc, sel, options) {\n setSelectionNoUndo(doc, sel, options);\n addSelectionToHistory(doc, doc.sel, doc.cm ? doc.cm.curOp.id : NaN, options);\n }\n\n function 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\n function 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.\n function reCheckSelection(doc) {\n setSelectionInner(doc, skipAtomicInSelection(doc, doc.sel, null, false), sel_dontScroll);\n }\n\n // Return a selection that does not partially select any atomic\n // ranges.\n function 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\n function 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;\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.\n function 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\n function 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\n // SELECTION DRAWING\n\n function updateSelection(cm) {\n cm.display.input.showSelection(cm.display.input.prepareSelection());\n }\n\n function prepareSelection(cm, primary) {\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 === false && i == doc.sel.primIndex) continue;\n var range = doc.sel.ranges[i];\n if (range.from().line >= cm.display.viewTo || range.to().line < cm.display.viewFrom) continue;\n var collapsed = range.empty();\n if (collapsed || cm.options.showCursorWhenSelecting)\n drawSelectionCursor(cm, range.head, curFragment);\n if (!collapsed)\n drawSelectionRange(cm, range, selFragment);\n }\n return result;\n }\n\n // Draws a cursor for the given range\n function 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\n // Draws the given range as a highlighted selection\n function drawSelectionRange(cm, range, 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\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 +\n \"px; top: \" + top + \"px; width: \" + (width == null ? rightSide - left : width) +\n \"px; 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 iterateBidiSections(getOrder(lineObj), fromArg || 0, toArg == null ? lineLen : toArg, function(from, to, dir) {\n var leftPos = coords(from, \"left\"), rightPos, left, right;\n if (from == to) {\n rightPos = leftPos;\n left = right = leftPos.left;\n } else {\n rightPos = coords(to - 1, \"right\");\n if (dir == \"rtl\") { var tmp = leftPos; leftPos = rightPos; rightPos = tmp; }\n left = leftPos.left;\n right = rightPos.right;\n }\n if (fromArg == null && from == 0) left = leftSide;\n if (rightPos.top - leftPos.top > 3) { // Different lines, draw top part\n add(left, leftPos.top, null, leftPos.bottom);\n left = leftSide;\n if (leftPos.bottom < rightPos.top) add(left, leftPos.bottom, null, rightPos.top);\n }\n if (toArg == null && to == lineLen) right = rightSide;\n if (!start || leftPos.top < start.top || leftPos.top == start.top && leftPos.left < start.left)\n start = leftPos;\n if (!end || rightPos.bottom > end.bottom || rightPos.bottom == end.bottom && rightPos.right > end.right)\n end = rightPos;\n if (left < leftSide + 1) left = leftSide;\n add(left, rightPos.top, right - left, rightPos.bottom);\n });\n return {start: start, end: end};\n }\n\n var sFrom = range.from(), sTo = range.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\n function 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() {\n 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\n // HIGHLIGHT WORKER\n\n function startWorker(cm, time) {\n if (cm.doc.mode.startState && cm.doc.frontier < cm.display.viewTo)\n cm.state.highlight.set(time, bind(highlightWorker, cm));\n }\n\n function highlightWorker(cm) {\n var doc = cm.doc;\n if (doc.frontier < doc.first) doc.frontier = doc.first;\n if (doc.frontier >= cm.display.viewTo) return;\n var end = +new Date + cm.options.workTime;\n var state = copyState(doc.mode, getStateBefore(cm, doc.frontier));\n var changedLines = [];\n\n doc.iter(doc.frontier, Math.min(doc.first + doc.size, cm.display.viewTo + 500), function(line) {\n if (doc.frontier >= cm.display.viewFrom) { // Visible\n var oldStyles = line.styles, tooLong = line.text.length > cm.options.maxHighlightLength;\n var highlighted = highlightLine(cm, line, tooLong ? copyState(doc.mode, state) : state, true);\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(doc.frontier);\n line.stateAfter = tooLong ? state : copyState(doc.mode, state);\n } else {\n if (line.text.length <= cm.options.maxHighlightLength)\n processLine(cm, line.text, state);\n line.stateAfter = doc.frontier % 5 == 0 ? copyState(doc.mode, state) : null;\n }\n ++doc.frontier;\n if (+new Date > end) {\n startWorker(cm, cm.options.workDelay);\n return true;\n }\n });\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 // 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.\n function 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);\n if (line.stateAfter && (!precise || search <= doc.frontier)) 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\n function getStateBefore(cm, n, precise) {\n var doc = cm.doc, display = cm.display;\n if (!doc.mode.startState) return true;\n var pos = findStartLine(cm, n, precise), state = pos > doc.first && getLine(doc, pos-1).stateAfter;\n if (!state) state = startState(doc.mode);\n else state = copyState(doc.mode, state);\n doc.iter(pos, n, function(line) {\n processLine(cm, line.text, state);\n var save = pos == n - 1 || pos % 5 == 0 || pos >= display.viewFrom && pos < display.viewTo;\n line.stateAfter = save ? copyState(doc.mode, state) : null;\n ++pos;\n });\n if (precise) doc.frontier = pos;\n return state;\n }\n\n // POSITION MEASUREMENT\n\n function paddingTop(display) {return display.lineSpace.offsetTop;}\n function paddingVert(display) {return display.mover.offsetHeight - display.lineSpace.offsetHeight;}\n function 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\n function scrollGap(cm) { return scrollerGap - cm.display.nativeBarWidth; }\n function displayWidth(cm) {\n return cm.display.scroller.clientWidth - scrollGap(cm) - cm.display.barWidth;\n }\n function 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.\n function 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.)\n function 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 = 0; i < lineView.rest.length; i++)\n if (lineNo(lineView.rest[i]) > lineN)\n return {map: lineView.measure.maps[i], cache: lineView.measure.caches[i], 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.\n function 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.\n function 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.\n function 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.\n function 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).\n function 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\n var nullRect = {left: 0, right: 0, top: 0, bottom: 0};\n\n function nodeAndOffsetInLineMap(map, ch, bias) {\n var node, start, end, collapse;\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.length; i += 3) {\n var mStart = map[i], mEnd = map[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.length - 3 || ch == mEnd && map[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[i + 2];\n if (mStart == mEnd && bias == (node.insertLeft ? \"left\" : \"right\"))\n collapse = bias;\n if (bias == \"left\" && start == 0)\n while (i && map[i - 2] == map[i - 3] && map[i - 1].insertLeft) {\n node = map[(i -= 3) + 2];\n collapse = \"left\";\n }\n if (bias == \"right\" && start == mEnd - mStart)\n while (i < map.length - 3 && map[i + 3] == map[i + 4] && !map[i + 5].insertLeft) {\n node = map[(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\n function 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 = rects.length - 1; i >= 0; i--) {\n if ((rect = rects[i]).left != rect.right) break\n }\n return rect\n }\n\n function 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 = 0; i < 4; i++) { // 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 for (var i = 0; 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.\n function 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\n function 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\n function 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\n function 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\n function pageScrollX() { return window.pageXOffset || (document.documentElement || document.body).scrollLeft; }\n function pageScrollY() { return window.pageYOffset || (document.documentElement || document.body).scrollTop; }\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\".\n function intoCoordSystem(cm, lineObj, rect, context) {\n if (lineObj.widgets) for (var i = 0; i < lineObj.widgets.length; ++i) if (lineObj.widgets[i].above) {\n var size = widgetHeight(lineObj.widgets[i]);\n rect.top += size; rect.bottom += size;\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.\n function 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\n function 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 function 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 function getBidi(ch, partPos) {\n var part = order[partPos], right = part.level % 2;\n if (ch == bidiLeft(part) && partPos && part.level < order[partPos - 1].level) {\n part = order[--partPos];\n ch = bidiRight(part) - (part.level % 2 ? 0 : 1);\n right = true;\n } else if (ch == bidiRight(part) && partPos < order.length - 1 && part.level < order[partPos + 1].level) {\n part = order[++partPos];\n ch = bidiLeft(part) - part.level % 2;\n right = false;\n }\n if (right && ch == part.to && ch > part.from) return get(ch - 1);\n return get(ch, right);\n }\n var order = getOrder(lineObj), ch = pos.ch;\n if (!order) return get(ch);\n var partPos = getBidiPartAt(order, ch);\n var val = getBidi(ch, partPos);\n if (bidiOther != null) val.other = getBidi(ch, bidiOther);\n return val;\n }\n\n // Used to cheaply estimate the coordinates for a position. Used for\n // intermediate scroll updates.\n function estimateCoords(cm, pos) {\n var left = 0, 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.\n function PosWithInfo(line, ch, outside, xRel) {\n var pos = Pos(line, ch);\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).\n function coordsChar(cm, x, y) {\n var doc = cm.doc;\n y += cm.display.viewOffset;\n if (y < 0) return PosWithInfo(doc.first, 0, 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, 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\n function coordsCharInner(cm, lineObj, lineNo, x, y) {\n var innerOff = y - heightAtLine(lineObj);\n var wrongLine = false, adjust = 2 * cm.display.wrapper.clientWidth;\n var preparedMeasure = prepareMeasureForLine(cm, lineObj);\n\n function getX(ch) {\n var sp = cursorCoords(cm, Pos(lineNo, ch), \"line\", lineObj, preparedMeasure);\n wrongLine = true;\n if (innerOff > sp.bottom) return sp.left - adjust;\n else if (innerOff < sp.top) return sp.left + adjust;\n else wrongLine = false;\n return sp.left;\n }\n\n var bidi = getOrder(lineObj), dist = lineObj.text.length;\n var from = lineLeft(lineObj), to = lineRight(lineObj);\n var fromX = getX(from), fromOutside = wrongLine, toX = getX(to), toOutside = wrongLine;\n\n if (x > toX) return PosWithInfo(lineNo, to, toOutside, 1);\n // Do a binary search between these bounds.\n for (;;) {\n if (bidi ? to == from || to == moveVisually(lineObj, from, 1) : to - from <= 1) {\n var ch = x < fromX || x - fromX <= toX - x ? from : to;\n var outside = ch == from ? fromOutside : toOutside\n var xDiff = x - (ch == from ? fromX : toX);\n // This is a kludge to handle the case where the coordinates\n // are after a line-wrapped line. We should replace it with a\n // more general handling of cursor positions around line\n // breaks. (Issue #4078)\n if (toOutside && !bidi && !/\\s/.test(lineObj.text.charAt(ch)) && xDiff > 0 &&\n ch < lineObj.text.length && preparedMeasure.view.measure.heights.length > 1) {\n var charSize = measureCharPrepared(cm, preparedMeasure, ch, \"right\");\n if (innerOff <= charSize.bottom && innerOff >= charSize.top && Math.abs(x - charSize.right) < xDiff) {\n outside = false\n ch++\n xDiff = x - charSize.right\n }\n }\n while (isExtendingChar(lineObj.text.charAt(ch))) ++ch;\n var pos = PosWithInfo(lineNo, ch, outside, xDiff < -1 ? -1 : xDiff > 1 ? 1 : 0);\n return pos;\n }\n var step = Math.ceil(dist / 2), middle = from + step;\n if (bidi) {\n middle = from;\n for (var i = 0; i < step; ++i) middle = moveVisually(lineObj, middle, 1);\n }\n var middleX = getX(middle);\n if (middleX > x) {to = middle; toX = middleX; if (toOutside = wrongLine) toX += 1000; dist = step;}\n else {from = middle; fromX = middleX; fromOutside = wrongLine; dist -= step;}\n }\n }\n\n var measureText;\n // Compute the default text height.\n function 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.\n function 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 // OPERATIONS\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\n var operationGroup = null;\n\n var nextOpId = 0;\n // Start a new operation.\n function 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 if (operationGroup) {\n operationGroup.ops.push(cm.curOp);\n } else {\n cm.curOp.ownsGroup = operationGroup = {\n ops: [cm.curOp],\n delayedCallbacks: []\n };\n }\n }\n\n function 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\n // Finish an operation, updating the display and signalling delayed events\n function endOperation(cm) {\n var op = cm.curOp, group = op.ownsGroup;\n if (!group) return;\n\n try { fireCallbacksForOps(group); }\n finally {\n operationGroup = null;\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.\n function 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 = 0; i < ops.length; i++) // Write DOM (maybe)\n endOperation_W1(ops[i]);\n for (var i = 0; i < ops.length; i++) // Read DOM\n endOperation_R2(ops[i]);\n for (var i = 0; i < ops.length; i++) // Write DOM (maybe)\n endOperation_W2(ops[i]);\n for (var i = 0; i < ops.length; i++) // Read DOM\n endOperation_finish(ops[i]);\n }\n\n function 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\n function endOperation_W1(op) {\n op.updatedDisplay = op.mustUpdate && updateDisplayIfNeeded(op.cm, op.update);\n }\n\n function 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(op.focus);\n }\n\n function 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() && (!document.hasFocus || document.hasFocus())\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\n function 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 && (display.scroller.scrollTop != op.scrollTop || op.forceScroll)) {\n doc.scrollTop = Math.max(0, Math.min(display.scroller.scrollHeight - display.scroller.clientHeight, op.scrollTop));\n display.scrollbars.setScrollTop(doc.scrollTop);\n display.scroller.scrollTop = doc.scrollTop;\n }\n if (op.scrollLeft != null && (display.scroller.scrollLeft != op.scrollLeft || op.forceScroll)) {\n doc.scrollLeft = Math.max(0, Math.min(display.scroller.scrollWidth - display.scroller.clientWidth, op.scrollLeft));\n display.scrollbars.setScrollLeft(doc.scrollLeft);\n display.scroller.scrollLeft = doc.scrollLeft;\n alignHorizontally(cm);\n }\n // If we need to scroll a specific position into view, do so.\n if (op.scrollToPos) {\n var coords = scrollPosIntoView(cm, clipPos(doc, op.scrollToPos.from),\n clipPos(doc, op.scrollToPos.to), op.scrollToPos.margin);\n if (op.scrollToPos.isCursor && cm.state.focused) maybeScrollWindow(cm, coords);\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 = 0; i < unhidden.length; ++i)\n if (unhidden[i].lines.length) signal(unhidden[i], \"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\n function 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.\n function 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.\n function 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 }\n function 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 // VIEW TRACKING\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.\n function 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.\n function 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\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.\n function 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 = viewCuttingPoint(cm, from, from, -1);\n if (cut) {\n display.view = display.view.slice(0, cut.index);\n display.viewTo = cut.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\"\n function 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.\n function resetView(cm) {\n cm.display.viewFrom = cm.display.viewTo = cm.doc.first;\n cm.display.view = [];\n cm.display.viewOffset = 0;\n }\n\n // Find the view element corresponding to a given line. Return null\n // when the line isn't visible.\n function 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\n function 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 for (var i = 0, n = cm.display.viewFrom; 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.\n function 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).\n function 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 // EVENT HANDLERS\n\n // Attach the necessary event handlers when initializing the editor\n function 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) { 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) {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() {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)) {\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 setScrollTop(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){onScrollWheel(cm, e);});\n on(d.scroller, \"DOMMouseScroll\", function(e){onScrollWheel(cm, e);});\n\n // Prevent wrapper from ever scrolling\n on(d.wrapper, \"scroll\", function() { 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){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) { onKeyUp.call(cm, e); });\n on(inp, \"keydown\", operation(cm, onKeyDown));\n on(inp, \"keypress\", operation(cm, onKeyPress));\n on(inp, \"focus\", function (e) { onFocus(cm, e); });\n on(inp, \"blur\", function (e) { onBlur(cm, e); });\n }\n\n function dragDropChanged(cm, value, old) {\n var wasOn = old && old != CodeMirror.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\n // Called when the window resizes\n function 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\n // MOUSE EVENTS\n\n // Return true when the given mouse event happened in a widget\n function 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 // 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.\n function 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 // 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.\n function onMouseDown(e) {\n var cm = this, display = cm.display;\n if (signalDOMEvent(cm, e) || display.activeTouch && display.input.supportsTouch()) return;\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(){display.scroller.draggable = true;}, 100);\n }\n return;\n }\n if (clickInGutter(cm, e)) return;\n var start = posFromMouse(cm, e);\n window.focus();\n\n switch (e_button(e)) {\n case 1:\n // #3261: make sure, that we're not starting a second selection\n if (cm.state.selectingText)\n cm.state.selectingText(e);\n else if (start)\n leftButtonDown(cm, e, start);\n else if (e_target(e) == display.scroller)\n e_preventDefault(e);\n break;\n case 2:\n if (webkit) cm.state.lastMiddleDown = +new Date;\n if (start) extendSelection(cm.doc, start);\n setTimeout(function() {display.input.focus();}, 20);\n e_preventDefault(e);\n break;\n case 3:\n if (captureRightClick) onContextMenu(cm, e);\n else delayBlurEvent(cm);\n break;\n }\n }\n\n var lastClick, lastDoubleClick;\n function leftButtonDown(cm, e, start) {\n if (ie) setTimeout(bind(ensureFocus, cm), 0);\n else cm.curOp.focus = activeElt();\n\n var now = +new Date, type;\n if (lastDoubleClick && lastDoubleClick.time > now - 400 && cmp(lastDoubleClick.pos, start) == 0) {\n type = \"triple\";\n } else if (lastClick && lastClick.time > now - 400 && cmp(lastClick.pos, start) == 0) {\n type = \"double\";\n lastDoubleClick = {time: now, pos: start};\n } else {\n type = \"single\";\n lastClick = {time: now, pos: start};\n }\n\n var sel = cm.doc.sel, modifier = mac ? e.metaKey : e.ctrlKey, contained;\n if (cm.options.dragDrop && dragAndDrop && !cm.isReadOnly() &&\n type == \"single\" && (contained = sel.contains(start)) > -1 &&\n (cmp((contained = sel.ranges[contained]).from(), start) < 0 || start.xRel > 0) &&\n (cmp(contained.to(), start) > 0 || start.xRel < 0))\n leftButtonStartDrag(cm, e, start, modifier);\n else\n leftButtonSelect(cm, e, start, type, modifier);\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.\n function leftButtonStartDrag(cm, e, start, modifier) {\n var display = cm.display, startTime = +new Date;\n var dragEnd = operation(cm, function(e2) {\n if (webkit) display.scroller.draggable = false;\n cm.state.draggingText = false;\n off(document, \"mouseup\", dragEnd);\n off(display.scroller, \"drop\", dragEnd);\n if (Math.abs(e.clientX - e2.clientX) + Math.abs(e.clientY - e2.clientY) < 10) {\n e_preventDefault(e2);\n if (!modifier && +new Date - 200 < startTime)\n extendSelection(cm.doc, start);\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 // Let the drag handler handle this.\n if (webkit) display.scroller.draggable = true;\n cm.state.draggingText = dragEnd;\n dragEnd.copy = mac ? e.altKey : e.ctrlKey\n // IE's approach to draggable\n if (display.scroller.dragDrop) display.scroller.dragDrop();\n on(document, \"mouseup\", dragEnd);\n on(display.scroller, \"drop\", dragEnd);\n }\n\n // Normal selection, as opposed to text dragging.\n function leftButtonSelect(cm, e, start, type, addNew) {\n var display = cm.display, doc = cm.doc;\n e_preventDefault(e);\n\n var ourRange, ourIndex, startSel = doc.sel, ranges = startSel.ranges;\n if (addNew && !e.shiftKey) {\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 (chromeOS ? e.shiftKey && e.metaKey : e.altKey) {\n type = \"rect\";\n if (!addNew) ourRange = new Range(start, start);\n start = posFromMouse(cm, e, true, true);\n ourIndex = -1;\n } else if (type == \"double\") {\n var word = cm.findWordAt(start);\n if (cm.display.shift || doc.extend)\n ourRange = extendRange(doc, ourRange, word.anchor, word.head);\n else\n ourRange = word;\n } else if (type == \"triple\") {\n var line = new Range(Pos(start.line, 0), clipPos(doc, Pos(start.line + 1, 0)));\n if (cm.display.shift || doc.extend)\n ourRange = extendRange(doc, ourRange, line.anchor, line.head);\n else\n ourRange = line;\n } else {\n ourRange = extendRange(doc, ourRange, start);\n }\n\n if (!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() && type == \"single\" && !e.shiftKey) {\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 (type == \"rect\") {\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 anchor = oldRange.anchor, head = pos;\n if (type != \"single\") {\n if (type == \"double\")\n var range = cm.findWordAt(pos);\n else\n var range = new Range(Pos(pos.line, 0), clipPos(doc, Pos(pos.line + 1, 0)));\n if (cmp(range.anchor, anchor) > 0) {\n head = range.head;\n anchor = minPos(oldRange.from(), range.anchor);\n } else {\n head = range.anchor;\n anchor = maxPos(oldRange.to(), range.head);\n }\n }\n var ranges = startSel.ranges.slice(0);\n ranges[ourIndex] = new Range(clipPos(doc, anchor), head);\n setSelection(doc, normalizeSelection(ranges, 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, type == \"rect\");\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 // Determines whether an event happened in the gutter, and fires the\n // handlers for the corresponding event.\n function gutterEvent(cm, e, type, prevent) {\n try { var mX = e.clientX, mY = e.clientY; }\n catch(e) { return false; }\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\n function clickInGutter(cm, e) {\n return gutterEvent(cm, e, \"gutterClick\", true);\n }\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)\n var lastDrop = 0;\n\n function 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() {cm.display.input.focus();}, 20);\n return;\n }\n try {\n var text = e.dataTransfer.getData(\"Text\");\n if (text) {\n if (cm.state.draggingText && !cm.state.draggingText.copy)\n var selected = cm.listSelections();\n setSelectionNoUndo(cm.doc, simpleSelection(pos, pos));\n if (selected) for (var i = 0; i < selected.length; ++i)\n replaceRange(cm.doc, \"\", selected[i].anchor, selected[i].head, \"drag\");\n cm.replaceSelection(text, \"around\", \"paste\");\n cm.display.input.focus();\n }\n }\n catch(e){}\n }\n }\n\n function 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\n function 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\n function clearDragCursor(cm) {\n if (cm.display.dragCursor) {\n cm.display.lineSpace.removeChild(cm.display.dragCursor);\n cm.display.dragCursor = null;\n }\n }\n\n // SCROLL EVENTS\n\n // Sync the scrollable area and scrollbars, ensure the viewport\n // covers the visible area.\n function setScrollTop(cm, val) {\n if (Math.abs(cm.doc.scrollTop - val) < 2) return;\n cm.doc.scrollTop = val;\n if (!gecko) updateDisplaySimple(cm, {top: val});\n if (cm.display.scroller.scrollTop != val) cm.display.scroller.scrollTop = val;\n cm.display.scrollbars.setScrollTop(val);\n if (gecko) updateDisplaySimple(cm);\n startWorker(cm, 100);\n }\n // Sync scroller and scrollbar, ensure the gutter elements are\n // aligned.\n function setScrollLeft(cm, val, isScroller) {\n if (isScroller ? val == cm.doc.scrollLeft : Math.abs(cm.doc.scrollLeft - val) < 2) return;\n val = Math.min(val, cm.display.scroller.scrollWidth - cm.display.scroller.clientWidth);\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 // 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\n var wheelSamples = 0, 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).\n if (ie) wheelPixelsPerUnit = -.53;\n else if (gecko) wheelPixelsPerUnit = 15;\n else if (chrome) wheelPixelsPerUnit = -.7;\n else if (safari) wheelPixelsPerUnit = -1/3;\n\n var wheelEventDelta = function(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 };\n CodeMirror.wheelEventPixels = function(e) {\n var delta = wheelEventDelta(e);\n delta.x *= wheelPixelsPerUnit;\n delta.y *= wheelPixelsPerUnit;\n return delta;\n };\n\n function 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 setScrollTop(cm, Math.max(0, Math.min(scroll.scrollTop + dy * wheelPixelsPerUnit, scroll.scrollHeight - scroll.clientHeight)));\n setScrollLeft(cm, Math.max(0, Math.min(scroll.scrollLeft + dx * wheelPixelsPerUnit, scroll.scrollWidth - scroll.clientWidth)));\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 // KEY EVENTS\n\n // Run a handler that was bound to a key.\n function 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\n function 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 var stopSeq = new Delayed;\n function 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.\n function 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\n function handleCharBinding(cm, e, ch) {\n return dispatchKey(cm, \"'\" + ch + \"'\", e,\n function(b) { return doHandleBinding(cm, b, true); });\n }\n\n var lastStoppedKey = null;\n function 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\n function 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\n function onKeyUp(e) {\n if (e.keyCode == 16) this.doc.sel.shift = false;\n signalDOMEvent(this, e);\n }\n\n function 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 if (handleCharBinding(cm, e, ch)) return;\n cm.display.input.onKeyPress(e);\n }\n\n // FOCUS/BLUR EVENTS\n\n function delayBlurEvent(cm) {\n cm.state.delayingBlurEvent = true;\n setTimeout(function() {\n if (cm.state.delayingBlurEvent) {\n cm.state.delayingBlurEvent = false;\n onBlur(cm);\n }\n }, 100);\n }\n\n function 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() { cm.display.input.reset(true); }, 20); // Issue #1730\n }\n cm.display.input.receivedFocus();\n }\n restartBlink(cm);\n }\n function 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 // 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.\n function 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\n function contextMenuInGutter(cm, e) {\n if (!hasHandler(cm, \"gutterContextMenu\")) return false;\n return gutterEvent(cm, e, \"gutterContextMenu\", false);\n }\n\n // UPDATING\n\n // Compute the position of the end of a change (its 'to' property\n // refers to the pre-change end).\n var changeEnd = CodeMirror.changeEnd = function(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.\n function 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\n function 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\n function 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\".\n function 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 // Allow \"beforeChange\" event handlers to influence a change\n function 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() { this.canceled = true; }\n };\n if (update) obj.update = function(from, to, text, origin) {\n if (from) this.from = clipPos(doc, from);\n if (to) this.to = clipPos(doc, to);\n if (text) this.text = text;\n if (origin !== undefined) this.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.\n function 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});\n } else {\n makeChangeInner(doc, change);\n }\n }\n\n function 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.\n function 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 for (var i = 0; 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 for (var i = event.changes.length - 1; i >= 0; --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\n // Sub-views need their line numbers shifted when text is added\n // above or below them in the parent document.\n function shiftDoc(doc, distance) {\n if (distance == 0) return;\n doc.first += distance;\n doc.sel = new Selection(map(doc.sel.ranges, function(range) {\n return new Range(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).\n function 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.\n function 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 // Adjust frontier, schedule worker\n doc.frontier = Math.min(doc.frontier, 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\n function replaceRange(doc, code, from, to, origin) {\n if (!to) to = from;\n if (cmp(to, from) < 0) { var tmp = to; to = from; from = tmp; }\n if (typeof code == \"string\") code = doc.splitLines(code);\n makeChange(doc, {from: from, to: to, text: code, origin: origin});\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.\n function maybeScrollWindow(cm, coords) {\n if (signalDOMEvent(cm, \"scrollCursorIntoView\")) return;\n\n var display = cm.display, box = display.sizer.getBoundingClientRect(), doScroll = null;\n if (coords.top + box.top < 0) doScroll = true;\n else if (coords.bottom + box.top > (window.innerHeight || document.documentElement.clientHeight)) doScroll = false;\n if (doScroll != null && !phantom) {\n var scrollNode = elt(\"div\", \"\\u200b\", null, \"position: absolute; top: \" +\n (coords.top - display.viewOffset - paddingTop(cm.display)) + \"px; height: \" +\n (coords.bottom - coords.top + scrollGap(cm) + display.barHeight) + \"px; left: \" +\n coords.left + \"px; width: 2px;\");\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).\n function scrollPosIntoView(cm, pos, end, margin) {\n if (margin == null) margin = 0;\n for (var limit = 0; limit < 5; limit++) {\n var changed = false, coords = cursorCoords(cm, pos);\n var endCoords = !end || end == pos ? coords : cursorCoords(cm, end);\n var scrollPos = calculateScrollPos(cm, Math.min(coords.left, endCoords.left),\n Math.min(coords.top, endCoords.top) - margin,\n Math.max(coords.left, endCoords.left),\n Math.max(coords.bottom, endCoords.bottom) + margin);\n var startTop = cm.doc.scrollTop, startLeft = cm.doc.scrollLeft;\n if (scrollPos.scrollTop != null) {\n setScrollTop(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 coords;\n }\n\n // Scroll a given set of coordinates into view (immediately).\n function scrollIntoView(cm, x1, y1, x2, y2) {\n var scrollPos = calculateScrollPos(cm, x1, y1, x2, y2);\n if (scrollPos.scrollTop != null) setScrollTop(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.\n function calculateScrollPos(cm, x1, y1, x2, y2) {\n var display = cm.display, snapMargin = textHeight(cm.display);\n if (y1 < 0) y1 = 0;\n var screentop = cm.curOp && cm.curOp.scrollTop != null ? cm.curOp.scrollTop : display.scroller.scrollTop;\n var screen = displayHeight(cm), result = {};\n if (y2 - y1 > screen) y2 = y1 + screen;\n var docBottom = cm.doc.height + paddingVert(display);\n var atTop = y1 < snapMargin, atBottom = y2 > docBottom - snapMargin;\n if (y1 < screentop) {\n result.scrollTop = atTop ? 0 : y1;\n } else if (y2 > screentop + screen) {\n var newTop = Math.min(y1, (atBottom ? docBottom : y2) - 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 = x2 - x1 > screenw;\n if (tooWide) x2 = x1 + screenw;\n if (x1 < 10)\n result.scrollLeft = 0;\n else if (x1 < screenleft)\n result.scrollLeft = Math.max(0, x1 - (tooWide ? 0 : 10));\n else if (x2 > screenw + screenleft - 3)\n result.scrollLeft = x2 + (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).\n function addToScrollPos(cm, left, top) {\n if (left != null || top != null) resolveScrollToPos(cm);\n if (left != null)\n cm.curOp.scrollLeft = (cm.curOp.scrollLeft == null ? cm.doc.scrollLeft : cm.curOp.scrollLeft) + left;\n if (top != null)\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.\n function ensureCursorVisible(cm) {\n resolveScrollToPos(cm);\n var cur = cm.getCursor(), from = cur, to = cur;\n if (!cm.options.lineWrapping) {\n from = cur.ch ? Pos(cur.line, cur.ch - 1) : cur;\n to = Pos(cur.line, cur.ch + 1);\n }\n cm.curOp.scrollToPos = {from: from, to: to, margin: cm.options.cursorScrollMargin, isCursor: true};\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.\n function resolveScrollToPos(cm) {\n var range = cm.curOp.scrollToPos;\n if (range) {\n cm.curOp.scrollToPos = null;\n var from = estimateCoords(cm, range.from), to = estimateCoords(cm, range.to);\n var sPos = calculateScrollPos(cm, Math.min(from.left, to.left),\n Math.min(from.top, to.top) - range.margin,\n Math.max(from.right, to.right),\n Math.max(from.bottom, to.bottom) + range.margin);\n cm.scrollTo(sPos.scrollLeft, sPos.scrollTop);\n }\n }\n\n // API UTILITIES\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.\n function 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 = getStateBefore(cm, n);\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 = 0; i < doc.sel.ranges.length; i++) {\n var range = doc.sel.ranges[i];\n if (range.head.line == n && range.head.ch < curSpaceString.length) {\n var pos = Pos(n, curSpaceString.length);\n replaceOneSelection(doc, i, new Range(pos, pos));\n break;\n }\n }\n }\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.\n function 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 // Helper for deleting text near the selection(s), used to implement\n // backspace, delete, and similar functionality.\n function 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\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.\n function findPosH(doc, pos, dir, unit, visually) {\n var line = pos.line, ch = pos.ch, origDir = dir;\n var lineObj = getLine(doc, line);\n function findNextLine() {\n var l = line + dir;\n if (l < doc.first || l >= doc.first + doc.size) return false\n line = l;\n return lineObj = getLine(doc, l);\n }\n function moveOnce(boundToLine) {\n var next = (visually ? moveVisually : moveLogically)(lineObj, ch, dir, true);\n if (next == null) {\n if (!boundToLine && findNextLine()) {\n if (visually) ch = (dir < 0 ? lineRight : lineLeft)(lineObj);\n else ch = dir < 0 ? lineObj.text.length : 0;\n } else return false\n } else ch = next;\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(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();}\n break;\n }\n\n if (type) sawType = type;\n if (dir > 0 && !moveOnce(!first)) break;\n }\n }\n var result = skipAtomic(doc, Pos(line, ch), pos, origDir, true);\n if (!cmp(pos, 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.\n function 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 } else if (unit == \"line\") {\n y = dir > 0 ? pos.bottom + 3 : pos.top - 3;\n }\n for (;;) {\n var 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 // EDITOR METHODS\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\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 },\n\n getOption: function(option) {return this.options[option];},\n getDoc: function() {return this.doc;},\n\n addKeyMap: function(map, bottom) {\n this.state.keyMaps[bottom ? \"push\" : \"unshift\"](getKeyMap(map));\n },\n removeKeyMap: function(map) {\n var maps = this.state.keyMaps;\n for (var i = 0; i < maps.length; ++i)\n if (maps[i] == map || maps[i].name == map) {\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 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.state.modeGen++;\n regChange(this);\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 ranges = this.doc.sel.ranges, end = -1;\n for (var i = 0; i < ranges.length; i++) {\n var range = ranges[i];\n if (!range.empty()) {\n var from = range.from(), to = range.to();\n var start = Math.max(end, from.line);\n end = Math.min(this.lastLine(), to.line - (to.ch ? 0 : 1)) + 1;\n for (var j = start; j < end; ++j)\n indentLine(this, j, how);\n var newRanges = this.doc.sel.ranges;\n if (from.ch == 0 && ranges.length == newRanges.length && newRanges[i].from().ch > 0)\n replaceOneSelection(this.doc, i, new Range(from, newRanges[i].to()), sel_dontScroll);\n } else if (range.head.line > end) {\n indentLine(this, range.head.line, how, true);\n end = range.head.line;\n if (i == this.doc.sel.primIndex) ensureCursorVisible(this);\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(\"cm-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 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 = 0; i < help._global.length; i++) {\n var cur = help._global[i];\n if (cur.pred(mode, this) && 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 getStateBefore(this, line + 1, precise);\n },\n\n cursorCoords: function(start, mode) {\n var pos, range = this.doc.sel.primary();\n if (start == null) pos = range.head;\n else if (typeof start == \"object\") pos = clipPos(this.doc, start);\n else pos = start ? range.from() : range.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) {\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\").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 setGutterMarker: methodOp(function(line, gutterID, value) {\n return changeLine(this.doc, 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: methodOp(function(gutterID) {\n var cm = this, doc = cm.doc, i = doc.first;\n doc.iter(function(line) {\n if (line.gutterMarkers && line.gutterMarkers[gutterID]) {\n line.gutterMarkers[gutterID] = null;\n regLineChange(cm, i, \"gutter\");\n if (isEmpty(line.gutterMarkers)) line.gutterMarkers = null;\n }\n ++i;\n });\n }),\n\n lineInfo: function(line) {\n if (typeof line == \"number\") {\n if (!isLine(this.doc, line)) return null;\n var n = line;\n line = getLine(this.doc, line);\n if (!line) return null;\n } else {\n var 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 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, top, left + node.offsetWidth, top + node.offsetHeight);\n },\n\n triggerOnKeyDown: methodOp(onKeyDown),\n triggerOnKeyPress: methodOp(onKeyPress),\n triggerOnKeyUp: onKeyUp,\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 dir = 1;\n if (amount < 0) { dir = -1; amount = -amount; }\n for (var i = 0, cur = clipPos(this.doc, from); i < amount; ++i) {\n cur = findPosH(this.doc, cur, dir, unit, visually);\n if (cur.hitSide) break;\n }\n return cur;\n },\n\n moveH: methodOp(function(dir, unit) {\n var cm = this;\n cm.extendSelectionsBy(function(range) {\n if (cm.display.shift || cm.doc.extend || range.empty())\n return findPosH(cm.doc, range.head, dir, unit, cm.options.rtlMoveVisually);\n else\n return dir < 0 ? range.from() : range.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) {\n var other = findPosH(doc, range.head, dir, unit, false);\n return dir < 0 ? {from: other, to: range.head} : {from: range.head, to: other};\n });\n }),\n\n findPosV: function(from, amount, unit, goalColumn) {\n var dir = 1, x = goalColumn;\n if (amount < 0) { dir = -1; amount = -amount; }\n for (var i = 0, cur = clipPos(this.doc, from); i < amount; ++i) {\n var coords = cursorCoords(this, cur, \"div\");\n if (x == null) x = coords.left;\n else coords.left = x;\n cur = findPosV(this, coords, dir, unit);\n if (cur.hitSide) break;\n }\n return cur;\n },\n\n moveV: methodOp(function(dir, unit) {\n var cm = this, doc = this.doc, goals = [];\n var collapse = !cm.display.shift && !doc.extend && doc.sel.somethingSelected();\n doc.extendSelectionsBy(function(range) {\n if (collapse)\n return dir < 0 ? range.from() : range.to();\n var headPos = cursorCoords(cm, range.head, \"div\");\n if (range.goalColumn != null) headPos.left = range.goalColumn;\n goals.push(headPos.left);\n var pos = findPosV(cm, headPos, dir, unit);\n if (unit == \"page\" && range == doc.sel.primary())\n addToScrollPos(cm, null, charCoords(cm, 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.xRel < 0 || 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) {\n if (x != null || y != null) resolveScrollToPos(this);\n if (x != null) this.curOp.scrollLeft = x;\n if (y != null) this.curOp.scrollTop = y;\n }),\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, margin) {\n if (range == null) {\n range = {from: this.doc.sel.primary().head, to: null};\n if (margin == null) margin = this.options.cursorScrollMargin;\n } else if (typeof range == \"number\") {\n range = {from: Pos(range, 0), to: null};\n } else if (range.from == null) {\n range = {from: range, to: null};\n }\n if (!range.to) range.to = range.from;\n range.margin = margin || 0;\n\n if (range.from.line != null) {\n resolveScrollToPos(this);\n this.curOp.scrollToPos = range;\n } else {\n var sPos = calculateScrollPos(this, Math.min(range.from.left, range.to.left),\n Math.min(range.from.top, range.to.top) - range.margin,\n Math.max(range.from.right, range.to.right),\n Math.max(range.from.bottom, range.to.bottom) + range.margin);\n this.scrollTo(sPos.scrollLeft, sPos.scrollTop);\n }\n }),\n\n setSize: methodOp(function(width, height) {\n var cm = this;\n function interpret(val) {\n return typeof val == \"number\" || /^\\d+$/.test(String(val)) ? val + \"px\" : val;\n }\n if (width != null) cm.display.wrapper.style.width = interpret(width);\n if (height != null) cm.display.wrapper.style.height = interpret(height);\n if (cm.options.lineWrapping) clearLineMeasurementCache(this);\n var lineNo = cm.display.viewFrom;\n cm.doc.iter(lineNo, cm.display.viewTo, function(line) {\n if (line.widgets) for (var i = 0; i < line.widgets.length; i++)\n if (line.widgets[i].noHScroll) { regLineChange(cm, lineNo, \"widget\"); break; }\n ++lineNo;\n });\n cm.curOp.forceUpdate = true;\n signal(cm, \"refresh\", this);\n }),\n\n operation: function(f){return runInOp(this, f);},\n\n refresh: methodOp(function() {\n var oldHeight = this.display.cachedTextHeight;\n regChange(this);\n this.curOp.forceUpdate = true;\n clearCaches(this);\n this.scrollTo(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 this.scrollTo(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 // OPTION DEFAULTS\n\n // The default configuration options.\n var defaults = CodeMirror.defaults = {};\n // Functions to run when options are changed.\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 // Passed to option handlers when there is no old value.\n var Init = CodeMirror.Init = {toString: function(){return \"CodeMirror.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) {\n cm.setValue(val);\n }, 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\\u00ad\\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 != CodeMirror.Init) cm.refresh();\n });\n option(\"specialCharPlaceholder\", defaultSpecialCharPlaceholder, function(cm) {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) {\n cm.getInputField().spellcheck = val\n }, 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 != CodeMirror.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\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) {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\n option(\"readOnly\", false, function(cm, val) {\n if (val == \"nocursor\") {\n onBlur(cm);\n cm.display.input.blur();\n cm.display.disabled = true;\n } else {\n cm.display.disabled = false;\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){cm.doc.history.undoDepth = val;});\n option(\"historyEventDelay\", 1250);\n option(\"viewportMargin\", 10, function(cm){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) {\n cm.display.input.getField().tabIndex = val || \"\";\n });\n option(\"autofocus\", null);\n\n // MODE DEFINITION AND QUERYING\n\n // Known modes, by name and by MIME\n var modes = CodeMirror.modes = {}, mimeModes = CodeMirror.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.)\n CodeMirror.defineMode = function(name, mode) {\n if (!CodeMirror.defaults.mode && name != \"null\") CodeMirror.defaults.mode = name;\n if (arguments.length > 2)\n mode.dependencies = Array.prototype.slice.call(arguments, 2);\n modes[name] = mode;\n };\n\n CodeMirror.defineMIME = function(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.\n CodeMirror.resolveMode = function(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 CodeMirror.resolveMode(\"application/xml\");\n } else if (typeof spec == \"string\" && /^[\\w\\-]+\\/[\\w\\-]+\\+json$/.test(spec)) {\n return CodeMirror.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.\n CodeMirror.getMode = function(options, spec) {\n var spec = CodeMirror.resolveMode(spec);\n var mfactory = modes[spec.name];\n if (!mfactory) return CodeMirror.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 in spec.modeProps)\n modeObj[prop] = spec.modeProps[prop];\n\n return modeObj;\n };\n\n // Minimal default mode.\n CodeMirror.defineMode(\"null\", function() {\n return {token: function(stream) {stream.skipToEnd();}};\n });\n CodeMirror.defineMIME(\"text/plain\", \"null\");\n\n // This can be used to attach properties to mode objects from\n // outside the actual mode definition.\n var modeExtensions = CodeMirror.modeExtensions = {};\n CodeMirror.extendMode = function(mode, properties) {\n var exts = modeExtensions.hasOwnProperty(mode) ? modeExtensions[mode] : (modeExtensions[mode] = {});\n copyObj(properties, exts);\n };\n\n // EXTENSIONS\n\n CodeMirror.defineExtension = function(name, func) {\n CodeMirror.prototype[name] = func;\n };\n CodeMirror.defineDocExtension = function(name, func) {\n Doc.prototype[name] = func;\n };\n CodeMirror.defineOption = option;\n\n var initHooks = [];\n CodeMirror.defineInitHook = function(f) {initHooks.push(f);};\n\n var helpers = CodeMirror.helpers = {};\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 // MODE STATE HANDLING\n\n // Utility functions for working with state. Exported because nested\n // modes need to do this for their inner modes.\n\n var copyState = CodeMirror.copyState = function(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 var startState = CodeMirror.startState = function(mode, a1, a2) {\n return mode.startState ? mode.startState(a1, a2) : true;\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.\n CodeMirror.innerMode = function(mode, state) {\n while (mode.innerMode) {\n var 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\n // STANDARD COMMANDS\n\n // Commands are parameter-less actions that can be performed on an\n // editor, mostly used for keybindings.\n var commands = CodeMirror.commands = {\n selectAll: function(cm) {cm.setSelection(Pos(cm.firstLine(), 0), Pos(cm.lastLine()), sel_dontScroll);},\n singleSelection: function(cm) {\n cm.setSelection(cm.getCursor(\"anchor\"), cm.getCursor(\"head\"), sel_dontScroll);\n },\n killLine: function(cm) {\n 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 },\n deleteLine: function(cm) {\n deleteNearSelection(cm, function(range) {\n return {from: Pos(range.from().line, 0),\n to: clipPos(cm.doc, Pos(range.to().line + 1, 0))};\n });\n },\n delLineLeft: function(cm) {\n deleteNearSelection(cm, function(range) {\n return {from: Pos(range.from().line, 0), to: range.from()};\n });\n },\n delWrappedLineLeft: function(cm) {\n 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 },\n delWrappedLineRight: function(cm) {\n 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 },\n undo: function(cm) {cm.undo();},\n redo: function(cm) {cm.redo();},\n undoSelection: function(cm) {cm.undoSelection();},\n redoSelection: function(cm) {cm.redoSelection();},\n goDocStart: function(cm) {cm.extendSelection(Pos(cm.firstLine(), 0));},\n goDocEnd: function(cm) {cm.extendSelection(Pos(cm.lastLine()));},\n goLineStart: function(cm) {\n cm.extendSelectionsBy(function(range) { return lineStart(cm, range.head.line); },\n {origin: \"+move\", bias: 1});\n },\n goLineStartSmart: function(cm) {\n cm.extendSelectionsBy(function(range) {\n return lineStartSmart(cm, range.head);\n }, {origin: \"+move\", bias: 1});\n },\n goLineEnd: function(cm) {\n cm.extendSelectionsBy(function(range) { return lineEnd(cm, range.head.line); },\n {origin: \"+move\", bias: -1});\n },\n goLineRight: function(cm) {\n cm.extendSelectionsBy(function(range) {\n var top = cm.charCoords(range.head, \"div\").top + 5;\n return cm.coordsChar({left: cm.display.lineDiv.offsetWidth + 100, top: top}, \"div\");\n }, sel_move);\n },\n goLineLeft: function(cm) {\n cm.extendSelectionsBy(function(range) {\n var top = cm.charCoords(range.head, \"div\").top + 5;\n return cm.coordsChar({left: 0, top: top}, \"div\");\n }, sel_move);\n },\n goLineLeftSmart: function(cm) {\n cm.extendSelectionsBy(function(range) {\n var top = cm.charCoords(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 },\n goLineUp: function(cm) {cm.moveV(-1, \"line\");},\n goLineDown: function(cm) {cm.moveV(1, \"line\");},\n goPageUp: function(cm) {cm.moveV(-1, \"page\");},\n goPageDown: function(cm) {cm.moveV(1, \"page\");},\n goCharLeft: function(cm) {cm.moveH(-1, \"char\");},\n goCharRight: function(cm) {cm.moveH(1, \"char\");},\n goColumnLeft: function(cm) {cm.moveH(-1, \"column\");},\n goColumnRight: function(cm) {cm.moveH(1, \"column\");},\n goWordLeft: function(cm) {cm.moveH(-1, \"word\");},\n goGroupRight: function(cm) {cm.moveH(1, \"group\");},\n goGroupLeft: function(cm) {cm.moveH(-1, \"group\");},\n goWordRight: function(cm) {cm.moveH(1, \"word\");},\n delCharBefore: function(cm) {cm.deleteH(-1, \"char\");},\n delCharAfter: function(cm) {cm.deleteH(1, \"char\");},\n delWordBefore: function(cm) {cm.deleteH(-1, \"word\");},\n delWordAfter: function(cm) {cm.deleteH(1, \"word\");},\n delGroupBefore: function(cm) {cm.deleteH(-1, \"group\");},\n delGroupAfter: function(cm) {cm.deleteH(1, \"group\");},\n indentAuto: function(cm) {cm.indentSelection(\"smart\");},\n indentMore: function(cm) {cm.indentSelection(\"add\");},\n indentLess: function(cm) {cm.indentSelection(\"subtract\");},\n insertTab: function(cm) {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 transposeChars: function(cm) {\n runInOp(cm, function() {\n var ranges = cm.listSelections(), newSel = [];\n for (var i = 0; i < ranges.length; i++) {\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 cm.replaceRange(line.charAt(0) + cm.doc.lineSeparator() +\n prev.charAt(prev.length - 1),\n Pos(cur.line - 1, prev.length - 1), Pos(cur.line, 1), \"+transpose\");\n }\n }\n newSel.push(new Range(cur, cur));\n }\n cm.setSelections(newSel);\n });\n },\n newlineAndIndent: function(cm) {\n runInOp(cm, function() {\n var len = cm.listSelections().length;\n for (var i = 0; i < len; i++) {\n var range = cm.listSelections()[i];\n cm.replaceRange(cm.doc.lineSeparator(), range.anchor, range.head, \"+input\");\n cm.indentLine(range.from().line + 1, null, true);\n }\n ensureCursorVisible(cm);\n });\n },\n openLine: function(cm) {cm.replaceSelection(\"\\n\", \"start\")},\n toggleOverwrite: function(cm) {cm.toggleOverwrite();}\n };\n\n\n // STANDARD KEYMAPS\n\n var keyMap = CodeMirror.keyMap = {};\n\n keyMap.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.\n keyMap.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.\n keyMap.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 };\n keyMap.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 };\n keyMap[\"default\"] = mac ? keyMap.macDefault : keyMap.pcDefault;\n\n // KEYMAP DISPATCH\n\n function normalizeKeyName(name) {\n var parts = name.split(/-(?!$)/), 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.\n CodeMirror.normalizeKeyMap = function(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, name;\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\n var lookupKey = CodeMirror.lookupKey = function(key, map, handle, context) {\n map = getKeyMap(map);\n var found = map.call ? map.call(key, context) : map[key];\n if (found === false) return \"nothing\";\n if (found === \"...\") return \"multi\";\n if (found != null && handle(found)) return \"handled\";\n\n if (map.fallthrough) {\n if (Object.prototype.toString.call(map.fallthrough) != \"[object Array]\")\n return lookupKey(key, map.fallthrough, handle, context);\n for (var i = 0; i < map.fallthrough.length; i++) {\n var result = lookupKey(key, map.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.\n var isModifierKey = CodeMirror.isModifierKey = function(value) {\n var name = typeof value == \"string\" ? value : keyNames[value.keyCode];\n return name == \"Ctrl\" || name == \"Alt\" || name == \"Shift\" || name == \"Mod\";\n };\n\n // Look up the name of a key as indicated by an event object.\n var keyName = CodeMirror.keyName = function(event, noShift) {\n if (presto && event.keyCode == 34 && event[\"char\"]) return false;\n var base = keyNames[event.keyCode], name = base;\n if (name == null || event.altGraphKey) return false;\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 function getKeyMap(val) {\n return typeof val == \"string\" ? keyMap[val] : val;\n }\n\n // FROMTEXTAREA\n\n CodeMirror.fromTextArea = function(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 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, 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(function(node) {\n textarea.parentNode.insertBefore(node, textarea.nextSibling);\n }, options);\n return cm;\n };\n\n // STRING STREAM\n\n // Fed to the mode parsers, provides helper functions to make\n // parsers more succinct.\n\n var StringStream = CodeMirror.StringStream = function(string, tabSize) {\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 };\n\n StringStream.prototype = {\n eol: function() {return this.pos >= this.string.length;},\n sol: function() {return this.pos == this.lineStart;},\n peek: function() {return this.string.charAt(this.pos) || undefined;},\n next: function() {\n if (this.pos < this.string.length)\n return this.string.charAt(this.pos++);\n },\n eat: function(match) {\n var ch = this.string.charAt(this.pos);\n if (typeof match == \"string\") var ok = ch == match;\n else var ok = ch && (match.test ? match.test(ch) : match(ch));\n if (ok) {++this.pos; return ch;}\n },\n eatWhile: function(match) {\n var start = this.pos;\n while (this.eat(match)){}\n return this.pos > start;\n },\n eatSpace: function() {\n var start = this.pos;\n while (/[\\s\\u00a0]/.test(this.string.charAt(this.pos))) ++this.pos;\n return this.pos > start;\n },\n skipToEnd: function() {this.pos = this.string.length;},\n skipTo: function(ch) {\n var found = this.string.indexOf(ch, this.pos);\n if (found > -1) {this.pos = found; return true;}\n },\n backUp: function(n) {this.pos -= n;},\n 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 },\n indentation: function() {\n return countColumn(this.string, null, this.tabSize) -\n (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0);\n },\n 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 },\n current: function(){return this.string.slice(this.start, this.pos);},\n hideFirstChars: function(n, inner) {\n this.lineStart += n;\n try { return inner(); }\n finally { this.lineStart -= n; }\n }\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 var nextMarkerId = 0;\n\n var TextMarker = CodeMirror.TextMarker = function(doc, type) {\n this.lines = [];\n this.type = type;\n this.doc = doc;\n this.id = ++nextMarkerId;\n };\n eventMixin(TextMarker);\n\n // Clear the marker.\n TextMarker.prototype.clear = function() {\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.lines[i];\n var span = getMarkedSpanFor(line.markedSpans, this);\n if (cm && !this.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.collapsed && !lineIsHidden(this.doc, line) && cm)\n updateLineHeight(line, textHeight(cm.display));\n }\n if (cm && this.collapsed && !cm.options.lineWrapping) for (var i = 0; i < this.lines.length; ++i) {\n var visual = visualLine(this.lines[i]), 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);\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).\n TextMarker.prototype.find = function(side, lineObj) {\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.lines[i];\n var span = getMarkedSpanFor(line.markedSpans, this);\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.\n TextMarker.prototype.changed = function() {\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 });\n };\n\n TextMarker.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 TextMarker.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;\n (op.maybeHiddenMarkers || (op.maybeHiddenMarkers = [])).push(this);\n }\n };\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).\n var nextMarkerId = 0;\n\n // Create a marker, wire it up to the right lines, and\n function 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 = elt(\"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 sawCollapsedSpans = true;\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() { marker.clear(); });\n\n if (marker.readOnly) {\n sawReadOnlySpans = true;\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.\n var SharedTextMarker = CodeMirror.SharedTextMarker = function(markers, primary) {\n this.markers = markers;\n this.primary = primary;\n for (var i = 0; i < markers.length; ++i)\n markers[i].parent = this;\n };\n eventMixin(SharedTextMarker);\n\n SharedTextMarker.prototype.clear = function() {\n if (this.explicitlyCleared) return;\n this.explicitlyCleared = true;\n for (var i = 0; i < this.markers.length; ++i)\n this.markers[i].clear();\n signalLater(this, \"clear\");\n };\n SharedTextMarker.prototype.find = function(side, lineObj) {\n return this.primary.find(side, lineObj);\n };\n\n function 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\n function findSharedMarkers(doc) {\n return doc.findMarks(Pos(doc.first, 0), doc.clipPos(Pos(doc.lastLine())),\n function(m) { return m.parent; });\n }\n\n function 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\n function detachSharedMarkers(markers) {\n for (var i = 0; i < markers.length; i++) {\n var marker = markers[i], linked = [marker.primary.doc];;\n linkedDocs(marker.primary.doc, function(d) { 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\n // TEXTMARKER SPANS\n\n function 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.\n function 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).\n function removeMarkedSpan(spans, span) {\n for (var r, 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.\n function 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).\n function markedSpansBefore(old, startCh, isInsert) {\n if (old) for (var i = 0, nw; 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);\n (nw || (nw = [])).push(new MarkedSpan(marker, span.from, endsAfter ? null : span.to));\n }\n }\n return nw;\n }\n function markedSpansAfter(old, endCh, isInsert) {\n if (old) for (var i = 0, nw; 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);\n (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.\n function 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 = 0; i < last.length; ++i) {\n var span = last[i];\n if (span.to != null) span.to += offset;\n if (span.from == null) {\n var found = getMarkedSpanFor(first, span.marker);\n if (!found) {\n span.from = offset;\n if (sameLine) (first || (first = [])).push(span);\n }\n } else {\n span.from += offset;\n if (sameLine) (first || (first = [])).push(span);\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 = 0; i < first.length; ++i)\n if (first[i].to == null)\n (gapMarkers || (gapMarkers = [])).push(new MarkedSpan(first[i].marker, null, null));\n for (var i = 0; i < gap; ++i)\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.\n function 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 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).\n function 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 to 'clip' out readOnly ranges when making a change.\n function 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 - 1;\n }\n }\n return parts;\n }\n\n // Connect or disconnect spans from a line.\n function 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 }\n function 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.\n function extraLeft(marker) { return marker.inclusiveLeft ? -1 : 0; }\n function 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.\n function 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.\n function collapsedSpanAtSide(line, start) {\n var sps = sawCollapsedSpans && line.markedSpans, found;\n if (sps) for (var sp, 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 }\n function collapsedSpanAtStart(line) { return collapsedSpanAtSide(line, true); }\n function 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.\n function conflictingCollapsedRange(doc, lineNo, from, to, marker) {\n var line = getLine(doc, lineNo);\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).\n function visualLine(line) {\n var merged;\n while (merged = collapsedSpanAtStart(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.\n function 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.\n function visualLineNo(doc, lineN) {\n var line = getLine(doc, lineN), vis = visualLine(line);\n if (line == vis) return lineN;\n return lineNo(vis);\n }\n // Get the line number of the start of the next visual line after\n // the given line.\n function 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.\n function lineIsHidden(doc, line) {\n var sps = sawCollapsedSpans && line.markedSpans;\n if (sps) for (var sp, 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 }\n function 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, 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 // LINE WIDGETS\n\n // Line widgets are block elements displayed above or below a line.\n\n var LineWidget = CodeMirror.LineWidget = function(doc, node, options) {\n if (options) for (var opt in options) if (options.hasOwnProperty(opt))\n this[opt] = options[opt];\n this.doc = doc;\n this.node = node;\n };\n eventMixin(LineWidget);\n\n function adjustScrollWhenAboveVisible(cm, line, diff) {\n if (heightAtLine(line) < ((cm.curOp && cm.curOp.scrollTop) || cm.doc.scrollTop))\n addToScrollPos(cm, null, diff);\n }\n\n LineWidget.prototype.clear = function() {\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) 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) runInOp(cm, function() {\n adjustScrollWhenAboveVisible(cm, line, -height);\n regLineChange(cm, no, \"widget\");\n });\n };\n LineWidget.prototype.changed = function() {\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) runInOp(cm, function() {\n cm.curOp.forceUpdate = true;\n adjustScrollWhenAboveVisible(cm, line, diff);\n });\n };\n\n function 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 function 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) addToScrollPos(cm, null, widget.height);\n cm.curOp.forceUpdate = true;\n }\n return true;\n });\n return widget;\n }\n\n // LINE DATA STRUCTURE\n\n // Line objects. These hold state related to a line, including\n // highlighting info (the styles array).\n var Line = CodeMirror.Line = function(text, markedSpans, estimateHeight) {\n this.text = text;\n attachMarkedSpans(this, markedSpans);\n this.height = estimateHeight ? estimateHeight(this) : 1;\n };\n eventMixin(Line);\n Line.prototype.lineNo = function() { return lineNo(this); };\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.\n function 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.\n function cleanUpLine(line) {\n line.parent = null;\n detachMarkedSpans(line);\n }\n\n function 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 function callBlankLine(mode, state) {\n if (mode.blankLine) return mode.blankLine(state);\n if (!mode.innerMode) return;\n var inner = CodeMirror.innerMode(mode, state);\n if (inner.mode.blankLine) return inner.mode.blankLine(inner.state);\n }\n\n function readToken(mode, stream, state, inner) {\n for (var i = 0; i < 10; i++) {\n if (inner) inner[0] = CodeMirror.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\n // Utility for getTokenAt and getLineTokens\n function takeToken(cm, pos, precise, asArray) {\n function getObj(copy) {\n return {start: stream.start, end: stream.pos,\n string: stream.current(),\n type: style || null,\n state: copy ? copyState(doc.mode, state) : state};\n }\n\n var doc = cm.doc, mode = doc.mode, style;\n pos = clipPos(doc, pos);\n var line = getLine(doc, pos.line), state = getStateBefore(cm, pos.line, precise);\n var stream = new StringStream(line.text, cm.options.tabSize), tokens;\n if (asArray) tokens = [];\n while ((asArray || stream.pos < pos.ch) && !stream.eol()) {\n stream.start = stream.pos;\n style = readToken(mode, stream, state);\n if (asArray) tokens.push(getObj(true));\n }\n return asArray ? tokens : getObj();\n }\n\n // Run the given mode's parser over a line, calling f for each token.\n function runMode(cm, text, mode, state, 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), style;\n var inner = cm.options.addModeClass && [null];\n if (text == \"\") extractLineClasses(callBlankLine(mode, state), lineClasses);\n while (!stream.eol()) {\n if (stream.pos > cm.options.maxHighlightLength) {\n flattenSpans = false;\n if (forceToEnd) processLine(cm, text, state, stream.pos);\n stream.pos = text.length;\n style = null;\n } else {\n style = extractLineClasses(readToken(mode, stream, 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 // 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.\n function highlightLine(cm, line, state, 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, state, function(end, style) {\n st.push(end, style);\n }, lineClasses, forceToEnd);\n\n // Run overlays, adjust style array.\n for (var o = 0; o < cm.state.overlays.length; ++o) {\n var overlay = cm.state.overlays[o], i = 1, at = 0;\n runMode(cm, line.text, overlay.mode, true, 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, \"cm-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 + \" \" : \"\") + \"cm-overlay \" + style;\n }\n }\n }, lineClasses);\n }\n\n return {styles: st, classes: lineClasses.bgClass || lineClasses.textClass ? lineClasses : null};\n }\n\n function getLineStyles(cm, line, updateFrontier) {\n if (!line.styles || line.styles[0] != cm.state.modeGen) {\n var state = getStateBefore(cm, lineNo(line));\n var result = highlightLine(cm, line, line.text.length > cm.options.maxHighlightLength ? copyState(cm.doc.mode, state) : state);\n line.stateAfter = state;\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.frontier) cm.doc.frontier++;\n }\n return line.styles;\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.\n function processLine(cm, text, state, startAt) {\n var mode = cm.doc.mode;\n var stream = new StringStream(text, cm.options.tabSize);\n stream.start = stream.pos = startAt || 0;\n if (text == \"\") callBlankLine(mode, state);\n while (!stream.eol()) {\n readToken(mode, stream, state);\n stream.start = stream.pos;\n }\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.\n var styleToClassCache = {}, styleToClassCacheWithMode = {};\n function 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.\n function 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 = elt(\"span\", null, null, webkit ? \"padding-right: .1px\" : null);\n var builder = {pre: elt(\"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;\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)))\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\n function 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.\n function 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 if (!special.test(text)) {\n builder.col += text.length;\n var 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 var content = document.createDocumentFragment(), 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 if (m[0] == \"\\t\") {\n var tabSize = builder.cm.options.tabSize, tabWidth = tabSize - builder.col % tabSize;\n var txt = content.appendChild(elt(\"span\", spaceStr(tabWidth), \"cm-tab\"));\n txt.setAttribute(\"role\", \"presentation\");\n txt.setAttribute(\"cm-text\", \"\\t\");\n builder.col += tabWidth;\n } else if (m[0] == \"\\r\" || m[0] == \"\\n\") {\n var txt = content.appendChild(elt(\"span\", m[0] == \"\\r\" ? \"\\u240d\" : \"\\u2424\", \"cm-invalidchar\"));\n txt.setAttribute(\"cm-text\", m[0]);\n builder.col += 1;\n } else {\n var txt = builder.cm.options.specialCharPlaceholder(m[0]);\n txt.setAttribute(\"cm-text\", m[0]);\n if (ie && ie_version < 9) content.appendChild(elt(\"span\", [txt]));\n else content.appendChild(txt);\n builder.col += 1;\n }\n builder.map.push(builder.pos, builder.pos + 1, txt);\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\n function 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.\n function 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 for (var i = 0; i < order.length; i++) {\n var 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\n function 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.\n function insertLineContent(line, builder, styles) {\n var spans = line.markedSpans, allText = line.text, at = 0;\n if (!spans) {\n for (var i = 1; i < styles.length; i+=2)\n builder.addToken(builder, allText.slice(at, at = styles[i]), interpretTokenStyle(styles[i+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\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 = 0; j < endStyles.length; j += 2)\n if (endStyles[j + 1] == nextChange) spanEndStyle += \" \" + endStyles[j]\n\n if (!collapsed || collapsed.from == pos) for (var j = 0; j < foundBookmarks.length; ++j)\n buildCollapsedSpan(builder, 0, foundBookmarks[j]);\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 // 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.\n function 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.\n function updateDoc(doc, change, markedSpans, estimateHeight) {\n function spansFor(n) {return markedSpans ? markedSpans[n] : null;}\n function update(line, text, spans) {\n updateLine(line, text, spans, estimateHeight);\n signalLater(line, \"change\", line, change);\n }\n function linesFor(start, end) {\n for (var i = start, result = []; i < end; ++i)\n result.push(new Line(text[i], spansFor(i), estimateHeight));\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 = linesFor(1, text.length - 1);\n added.push(new Line(lastText + firstLine.text.slice(to.ch), lastSpans, estimateHeight));\n update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0));\n doc.insert(from.line + 1, added);\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 = linesFor(1, text.length - 1);\n if (nlines > 1) doc.remove(from.line + 1, nlines - 1);\n doc.insert(from.line + 1, added);\n }\n\n signalLater(doc, \"change\", doc, change);\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\n function LeafChunk(lines) {\n this.lines = lines;\n this.parent = null;\n for (var i = 0, height = 0; i < lines.length; ++i) {\n lines[i].parent = this;\n height += lines[i].height;\n }\n this.height = height;\n }\n\n LeafChunk.prototype = {\n chunkSize: function() { return this.lines.length; },\n // Remove the n lines at offset 'at'.\n removeInner: function(at, n) {\n for (var i = at, e = at + n; i < e; ++i) {\n var line = this.lines[i];\n this.height -= line.height;\n cleanUpLine(line);\n signalLater(line, \"delete\");\n }\n this.lines.splice(at, n);\n },\n // Helper used to collapse a small branch into a single leaf.\n collapse: function(lines) {\n lines.push.apply(lines, this.lines);\n },\n // Insert the given array of lines at offset 'at', count them as\n // having the given height.\n insertInner: function(at, lines, height) {\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;\n },\n // Used to iterate over a part of the tree.\n iterN: function(at, n, op) {\n for (var e = at + n; at < e; ++at)\n if (op(this.lines[at])) return true;\n }\n };\n\n function BranchChunk(children) {\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;\n }\n this.size = size;\n this.height = height;\n this.parent = null;\n }\n\n BranchChunk.prototype = {\n chunkSize: function() { return this.size; },\n removeInner: function(at, n) {\n this.size -= n;\n for (var i = 0; i < this.children.length; ++i) {\n var child = this.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.height -= oldHeight - child.height;\n if (sz == rm) { this.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 collapse: function(lines) {\n for (var i = 0; i < this.children.length; ++i) this.children[i].collapse(lines);\n },\n insertInner: function(at, lines, height) {\n this.size += lines.length;\n this.height += height;\n for (var i = 0; i < this.children.length; ++i) {\n var child = this.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.children.splice(++i, 0, leaf);\n leaf.parent = this;\n }\n child.lines = child.lines.slice(0, remaining);\n this.maybeSpill();\n }\n break;\n }\n at -= sz;\n }\n },\n // When a node has grown, check whether it should be split.\n maybeSpill: function() {\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 iterN: function(at, n, op) {\n for (var i = 0; i < this.children.length; ++i) {\n var child = this.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 var nextDocId = 0;\n var Doc = CodeMirror.Doc = function(text, mode, firstLine, lineSep) {\n if (!(this instanceof Doc)) return new Doc(text, mode, firstLine, lineSep);\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.frontier = 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.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\n Doc.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 setSelection(this, simpleSelection(top));\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 = this.sel.primary(), pos;\n if (start == null || start == \"head\") pos = range.head;\n else if (start == \"anchor\") pos = range.anchor;\n else if (start == \"end\" || start == \"to\" || start === false) pos = range.to();\n else pos = range.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 if (!ranges.length) return;\n for (var i = 0, out = []; i < ranges.length; i++)\n out[i] = new Range(clipPos(this, ranges[i].anchor),\n clipPos(this, 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 ranges = this.sel.ranges, lines;\n for (var i = 0; i < ranges.length; i++) {\n var sel = getBetween(this, 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 parts = [], ranges = this.sel.ranges;\n for (var i = 0; i < ranges.length; i++) {\n var sel = getBetween(this, ranges[i].from(), ranges[i].to());\n if (lineSep !== false) sel = sel.join(lineSep || this.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 changes = [], sel = this.sel;\n for (var i = 0; i < sel.ranges.length; i++) {\n var range = sel.ranges[i];\n changes[i] = {from: range.from(), to: range.to(), text: this.splitLines(code[i]), origin: origin};\n }\n var newSel = collapse && collapse != \"end\" && computeReplacedSel(this, changes, collapse);\n for (var i = changes.length - 1; i >= 0; i--)\n makeChange(this, changes[i]);\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 = 0; i < hist.undone.length; i++) if (!hist.undone[i].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 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 = 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 == from.line && from.ch >= span.to ||\n span.from == null && lineNo != from.line ||\n span.from != null && lineNo == to.line && span.from >= to.ch) &&\n (!filter || filter(span.marker)))\n found.push(span.marker.parent || span.marker);\n }\n ++lineNo;\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 = 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;\n });\n return clipPos(this, Pos(lineNo, 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) {\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);\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);\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 if (other instanceof CodeMirror) other = other.doc;\n if (this.linked) for (var i = 0; i < this.linked.length; ++i) {\n var link = this.linked[i];\n if (link.doc != other) continue;\n this.linked.splice(i, 1);\n other.unlinkDoc(this);\n detachSharedMarkers(findSharedMarkers(this));\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) {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\n // Public alias.\n Doc.prototype.eachLine = Doc.prototype.iter;\n\n // Set up methods on CodeMirror's prototype to redirect to the editor's document.\n var dontDelegate = \"iter insert remove copy getEditor constructor\".split(\" \");\n for (var prop in Doc.prototype) if (Doc.prototype.hasOwnProperty(prop) && indexOf(dontDelegate, prop) < 0)\n CodeMirror.prototype[prop] = (function(method) {\n return function() {return method.apply(this.doc, arguments);};\n })(Doc.prototype[prop]);\n\n eventMixin(Doc);\n\n // Call f for all linked documents.\n function 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.\n function 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 if (!cm.options.lineWrapping) findMaxLine(cm);\n cm.options.mode = doc.modeOption;\n regChange(cm);\n }\n\n // LINE UTILITIES\n\n // Find the line object corresponding to the given line number.\n function 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 for (var chunk = doc; !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.\n function 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.\n function getLines(doc, from, to) {\n var out = [];\n doc.iter(from, to, function(line) { out.push(line.text); });\n return out;\n }\n\n // Update the height of a line, propagating the height change\n // upwards to parent nodes.\n function 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.\n function 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.\n function lineAtHeight(chunk, h) {\n var n = chunk.first;\n outer: do {\n for (var i = 0; i < chunk.children.length; ++i) {\n var child = chunk.children[i], 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 for (var i = 0; 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\n\n // Find the height above the given line.\n function 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 = 0; i < p.children.length; ++i) {\n var cur = p.children[i];\n if (cur == chunk) break;\n else h += cur.height;\n }\n }\n return h;\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.\n function getOrder(line) {\n var order = line.order;\n if (order == null) order = line.order = bidiOrdering(line.text);\n return order;\n }\n\n // HISTORY\n\n function 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.\n function 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) {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.\n function 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.\n function 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.\n function addChangeToHistory(doc, change, selAfter, opId) {\n var hist = doc.history;\n hist.undone.length = 0;\n var time = +new Date, cur;\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 var 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\n function 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).\n function 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\n function 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.\n function 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.\n function removeClearedSpans(spans) {\n if (!spans) return null;\n for (var i = 0, out; 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.\n function getOldSpans(doc, change) {\n var found = change[\"spans_\" + doc.id];\n if (!found) return null;\n for (var i = 0, nw = []; i < change.text.length; ++i)\n nw.push(removeClearedSpans(found[i]));\n return nw;\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\n function copyHistoryArray(events, newGroup, instantiateSel) {\n for (var i = 0, copy = []; 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;\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 // Rebasing/resetting history to deal with externally-sourced changes\n\n function 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.\n function 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 = 0; j < sub.changes.length; ++j) {\n var cur = sub.changes[j];\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\n function 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 // EVENT UTILITIES\n\n // Due to the fact that we still support jurassic IE versions, some\n // compatibility wrappers are needed.\n\n var e_preventDefault = CodeMirror.e_preventDefault = function(e) {\n if (e.preventDefault) e.preventDefault();\n else e.returnValue = false;\n };\n var e_stopPropagation = CodeMirror.e_stopPropagation = function(e) {\n if (e.stopPropagation) e.stopPropagation();\n else e.cancelBubble = true;\n };\n function e_defaultPrevented(e) {\n return e.defaultPrevented != null ? e.defaultPrevented : e.returnValue == false;\n }\n var e_stop = CodeMirror.e_stop = function(e) {e_preventDefault(e); e_stopPropagation(e);};\n\n function e_target(e) {return e.target || e.srcElement;}\n function 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 // EVENT HANDLING\n\n // Lightweight event framework. on/off also work on DOM nodes,\n // registering native DOM handlers.\n\n var on = CodeMirror.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 = emitter._handlers || (emitter._handlers = {});\n var arr = map[type] || (map[type] = []);\n arr.push(f);\n }\n };\n\n var noHandlers = []\n function getHandlers(emitter, type, copy) {\n var arr = emitter._handlers && emitter._handlers[type]\n if (copy) return arr && arr.length > 0 ? arr.slice() : noHandlers\n else return arr || noHandlers\n }\n\n var off = CodeMirror.off = function(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 handlers = getHandlers(emitter, type, false)\n for (var i = 0; i < handlers.length; ++i)\n if (handlers[i] == f) { handlers.splice(i, 1); break; }\n }\n };\n\n var signal = CodeMirror.signal = function(emitter, type /*, values...*/) {\n var handlers = getHandlers(emitter, type, true)\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 var 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.\n function signalLater(emitter, type /*, values...*/) {\n var arr = getHandlers(emitter, type, false)\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 function bnd(f) {return function(){f.apply(null, args);};};\n for (var i = 0; i < arr.length; ++i)\n list.push(bnd(arr[i]));\n }\n\n function fireOrphanDelayed() {\n var delayed = orphanDelayedCallbacks;\n orphanDelayedCallbacks = null;\n for (var i = 0; i < delayed.length; ++i) delayed[i]();\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.\n function 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\n function 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\n function 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.\n function 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 // MISC UTILITIES\n\n // Number of pixels added to scroller and sizer to hide scrollbar\n var scrollerGap = 30;\n\n // Returned or thrown by various protocols to signal 'I'm not\n // handling this'.\n var Pass = CodeMirror.Pass = {toString: function(){return \"CodeMirror.Pass\";}};\n\n // Reused option objects for setSelection & friends\n var sel_dontScroll = {scroll: false}, sel_mouse = {origin: \"*mouse\"}, sel_move = {origin: \"+move\"};\n\n function Delayed() {this.id = null;}\n Delayed.prototype.set = function(ms, f) {\n clearTimeout(this.id);\n this.id = setTimeout(f, ms);\n };\n\n // Counts the column offset in a string, taking tabs into account.\n // Used mostly to find indentation.\n var countColumn = CodeMirror.countColumn = function(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\n // The inverse of countColumn -- find the offset that corresponds to\n // a particular column.\n var findColumn = CodeMirror.findColumn = function(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\n var spaceStrs = [\"\"];\n function spaceStr(n) {\n while (spaceStrs.length <= n)\n spaceStrs.push(lst(spaceStrs) + \" \");\n return spaceStrs[n];\n }\n\n function lst(arr) { return arr[arr.length-1]; }\n\n var selectInput = function(node) { node.select(); };\n if (ios) // Mobile Safari apparently has a bug where select() is broken.\n selectInput = function(node) { node.selectionStart = 0; node.selectionEnd = node.value.length; };\n else if (ie) // Suppress mysterious IE10 errors\n selectInput = function(node) { try { node.select(); } catch(_e) {} };\n\n function indexOf(array, elt) {\n for (var i = 0; i < array.length; ++i)\n if (array[i] == elt) return i;\n return -1;\n }\n function 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\n function 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\n function nothing() {}\n\n function 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\n function 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 function bind(f) {\n var args = Array.prototype.slice.call(arguments, 1);\n return function(){return f.apply(null, args);};\n }\n\n var nonASCIISingleCaseWordChar = /[\\u00df\\u0587\\u0590-\\u05f4\\u0600-\\u06ff\\u3040-\\u309f\\u30a0-\\u30ff\\u3400-\\u4db5\\u4e00-\\u9fcc\\uac00-\\ud7af]/;\n var isWordCharBasic = CodeMirror.isWordChar = function(ch) {\n return /\\w/.test(ch) || ch > \"\\x80\" &&\n (ch.toUpperCase() != ch.toLowerCase() || nonASCIISingleCaseWordChar.test(ch));\n };\n function 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\n function 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.\n var 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]/;\n function isExtendingChar(ch) { return ch.charCodeAt(0) >= 768 && extendingChars.test(ch); }\n\n // DOM UTILITIES\n\n function 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\n var range;\n if (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 };\n else 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\n function removeChildren(e) {\n for (var count = e.childNodes.length; count > 0; --count)\n e.removeChild(e.firstChild);\n return e;\n }\n\n function removeChildrenAndAdd(parent, e) {\n return removeChildren(parent).appendChild(e);\n }\n\n var contains = CodeMirror.contains = function(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\n function activeElt() {\n var activeElement = document.activeElement;\n while (activeElement && activeElement.root && activeElement.root.activeElement)\n activeElement = activeElement.root.activeElement;\n return activeElement;\n }\n // Older versions of IE throws unspecified error when touching\n // document.activeElement in some cases (during loading, in iframe)\n if (ie && ie_version < 11) activeElt = function() {\n try { return document.activeElement; }\n catch(e) { return document.body; }\n };\n\n function classTest(cls) { return new RegExp(\"(^|\\\\s)\" + cls + \"(?:$|\\\\s)\\\\s*\"); }\n var rmClass = CodeMirror.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 var addClass = CodeMirror.addClass = function(node, cls) {\n var current = node.className;\n if (!classTest(cls).test(current)) node.className += (current ? \" \" : \"\") + cls;\n };\n function 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\n // WINDOW-WIDE EVENTS\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\n function forEachCodeMirror(f) {\n if (!document.body.getElementsByClassName) return;\n var byClass = document.body.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\n var globalsRegistered = false;\n function ensureGlobalHandlers() {\n if (globalsRegistered) return;\n registerGlobalHandlers();\n globalsRegistered = true;\n }\n function 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() {\n forEachCodeMirror(onBlur);\n });\n }\n\n // FEATURE DETECTION\n\n // Detect drag-and-drop\n var 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\n var zwspSupported;\n function 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\n var badBidiRects;\n function 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.\n var splitLinesAuto = CodeMirror.splitLines = \"\\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\n var hasSelection = window.getSelection ? function(te) {\n try { return te.selectionStart != te.selectionEnd; }\n catch(e) { return false; }\n } : function(te) {\n try {var range = te.ownerDocument.selection.createRange();}\n catch(e) {}\n if (!range || range.parentElement() != te) return false;\n return range.compareEndPoints(\"StartToEnd\", range) != 0;\n };\n\n var 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\n var badZoomedRects = null;\n function 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 // KEY NAMES\n\n var keyNames = CodeMirror.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 (function() {\n // Number keys\n for (var i = 0; i < 10; i++) keyNames[i + 48] = keyNames[i + 96] = String(i);\n // Alphabetic keys\n for (var i = 65; i <= 90; i++) keyNames[i] = String.fromCharCode(i);\n // Function keys\n for (var i = 1; i <= 12; i++) keyNames[i + 111] = keyNames[i + 63235] = \"F\" + i;\n })();\n\n // BIDI HELPERS\n\n function iterateBidiSections(order, from, to, f) {\n if (!order) return f(from, to, \"ltr\");\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\");\n found = true;\n }\n }\n if (!found) f(from, to, \"ltr\");\n }\n\n function bidiLeft(part) { return part.level % 2 ? part.to : part.from; }\n function bidiRight(part) { return part.level % 2 ? part.from : part.to; }\n\n function lineLeft(line) { var order = getOrder(line); return order ? bidiLeft(order[0]) : 0; }\n function lineRight(line) {\n var order = getOrder(line);\n if (!order) return line.text.length;\n return bidiRight(lst(order));\n }\n\n function lineStart(cm, lineN) {\n var line = getLine(cm.doc, lineN);\n var visual = visualLine(line);\n if (visual != line) lineN = lineNo(visual);\n var order = getOrder(visual);\n var ch = !order ? 0 : order[0].level % 2 ? lineRight(visual) : lineLeft(visual);\n return Pos(lineN, ch);\n }\n function lineEnd(cm, lineN) {\n var merged, line = getLine(cm.doc, lineN);\n while (merged = collapsedSpanAtEnd(line)) {\n line = merged.find(1, true).line;\n lineN = null;\n }\n var order = getOrder(line);\n var ch = !order ? line.text.length : order[0].level % 2 ? lineLeft(line) : lineRight(line);\n return Pos(lineN == null ? lineNo(line) : lineN, ch);\n }\n function lineStartSmart(cm, pos) {\n var start = lineStart(cm, pos.line);\n var line = getLine(cm.doc, start.line);\n var order = getOrder(line);\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);\n }\n return start;\n }\n\n function compareBidiLevel(order, a, b) {\n var linedir = order[0].level;\n if (a == linedir) return true;\n if (b == linedir) return false;\n return a < b;\n }\n var bidiOther;\n function getBidiPartAt(order, pos) {\n bidiOther = null;\n for (var i = 0, found; i < order.length; ++i) {\n var cur = order[i];\n if (cur.from < pos && cur.to > pos) return i;\n if ((cur.from == pos || cur.to == pos)) {\n if (found == null) {\n found = i;\n } else if (compareBidiLevel(order, cur.level, order[found].level)) {\n if (cur.from != cur.to) bidiOther = found;\n return i;\n } else {\n if (cur.from != cur.to) bidiOther = i;\n return found;\n }\n }\n }\n return found;\n }\n\n function moveInLine(line, pos, dir, byUnit) {\n if (!byUnit) return pos + dir;\n do pos += dir;\n while (pos > 0 && isExtendingChar(line.text.charAt(pos)));\n return pos;\n }\n\n // This is needed in order to move 'visually' through bi-directional\n // text -- i.e., pressing left should make the cursor go left, even\n // when in RTL text. The tricky part is the 'jumps', where RTL and\n // LTR text touch each other. This often requires the cursor offset\n // to move more than one unit, in order to visually move one unit.\n function moveVisually(line, start, dir, byUnit) {\n var bidi = getOrder(line);\n if (!bidi) return moveLogically(line, start, dir, byUnit);\n var pos = getBidiPartAt(bidi, start), part = bidi[pos];\n var target = moveInLine(line, start, part.level % 2 ? -dir : dir, byUnit);\n\n for (;;) {\n if (target > part.from && target < part.to) return target;\n if (target == part.from || target == part.to) {\n if (getBidiPartAt(bidi, target) == pos) return target;\n part = bidi[pos += dir];\n return (dir > 0) == part.level % 2 ? part.to : part.from;\n } else {\n part = bidi[pos += dir];\n if (!part) return null;\n if ((dir > 0) == part.level % 2)\n target = moveInLine(line, part.to, -1, byUnit);\n else\n target = moveInLine(line, part.from, 1, byUnit);\n }\n }\n }\n\n function moveLogically(line, start, dir, byUnit) {\n var target = start + dir;\n if (byUnit) while (target > 0 && isExtendingChar(line.text.charAt(target))) target += dir;\n return target < 0 || target > line.text.length ? null : target;\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.\n var 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 0x6ff\n var arabicTypes = \"rrrrrrrrrrrr,rNNmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmrrrrrrrnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmNmmmm\";\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 <= 0x6ed) 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 // Browsers seem to always treat the boundaries of block elements as being L.\n var outerType = \"L\";\n\n function BidiSpan(level, from, to) {\n this.level = level;\n this.from = from; this.to = to;\n }\n\n return function(str) {\n if (!bidiRE.test(str)) return false;\n var len = str.length, types = [];\n for (var i = 0, type; i < len; ++i)\n types.push(type = 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 = 0, prev = outerType; i < len; ++i) {\n var type = types[i];\n if (type == \"m\") types[i] = 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 = 0, cur = outerType; i < len; ++i) {\n var type = types[i];\n if (type == \"1\" && cur == \"r\") types[i] = \"n\";\n else if (isStrong.test(type)) { cur = type; if (type == \"r\") types[i] = \"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 = 1, prev = types[0]; i < len - 1; ++i) {\n var type = types[i];\n if (type == \"+\" && prev == \"1\" && types[i+1] == \"1\") types[i] = \"1\";\n else if (type == \",\" && prev == types[i+1] &&\n (prev == \"1\" || prev == \"n\")) types[i] = prev;\n prev = type;\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 = 0; i < len; ++i) {\n var type = types[i];\n if (type == \",\") types[i] = \"N\";\n else if (type == \"%\") {\n for (var end = i + 1; end < len && types[end] == \"%\"; ++end) {}\n var replace = (i && types[i-1] == \"!\") || (end < len && types[end] == \"1\") ? \"1\" : \"N\";\n for (var j = i; j < end; ++j) types[j] = replace;\n i = 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 = 0, cur = outerType; i < len; ++i) {\n var type = types[i];\n if (cur == \"L\" && type == \"1\") types[i] = \"L\";\n else if (isStrong.test(type)) cur = type;\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 = 0; i < len; ++i) {\n if (isNeutral.test(types[i])) {\n for (var end = i + 1; end < len && isNeutral.test(types[end]); ++end) {}\n var before = (i ? types[i-1] : outerType) == \"L\";\n var after = (end < len ? types[end] : outerType) == \"L\";\n var replace = before || after ? \"L\" : \"R\";\n for (var j = i; j < end; ++j) types[j] = replace;\n i = end - 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 = 0; i < len;) {\n if (countsAsLeft.test(types[i])) {\n var start = i;\n for (++i; i < len && countsAsLeft.test(types[i]); ++i) {}\n order.push(new BidiSpan(0, start, i));\n } else {\n var pos = i, at = order.length;\n for (++i; i < len && types[i] != \"L\"; ++i) {}\n for (var j = pos; j < i;) {\n if (countsAsNum.test(types[j])) {\n if (pos < j) order.splice(at, 0, new BidiSpan(1, pos, j));\n var nstart = j;\n for (++j; j < i && countsAsNum.test(types[j]); ++j) {}\n order.splice(at, 0, new BidiSpan(2, nstart, j));\n pos = j;\n } else ++j;\n }\n if (pos < i) order.splice(at, 0, new BidiSpan(1, pos, i));\n }\n }\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 if (order[0].level == 2)\n order.unshift(new BidiSpan(1, order[0].to, order[0].to));\n if (order[0].level != lst(order).level)\n order.push(new BidiSpan(order[0].level, len, len));\n\n return order;\n };\n })();\n\n // THE END\n\n CodeMirror.version = \"5.19.0\";\n\n return CodeMirror;\n});\n","// 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(\"css\", function(config, parserConfig) {\n var inline = parserConfig.inline\n if (!parserConfig.propertyKeywords) parserConfig = CodeMirror.resolveMode(\"text/css\");\n\n var indentUnit = config.indentUnit,\n tokenHooks = parserConfig.tokenHooks,\n documentTypes = parserConfig.documentTypes || {},\n mediaTypes = parserConfig.mediaTypes || {},\n mediaFeatures = parserConfig.mediaFeatures || {},\n mediaValueKeywords = parserConfig.mediaValueKeywords || {},\n propertyKeywords = parserConfig.propertyKeywords || {},\n nonStandardPropertyKeywords = parserConfig.nonStandardPropertyKeywords || {},\n fontProperties = parserConfig.fontProperties || {},\n counterDescriptors = parserConfig.counterDescriptors || {},\n colorKeywords = parserConfig.colorKeywords || {},\n valueKeywords = parserConfig.valueKeywords || {},\n allowNested = parserConfig.allowNested,\n supportsAtComponent = parserConfig.supportsAtComponent === true;\n\n var type, override;\n function ret(style, tp) { type = tp; return style; }\n\n // Tokenizers\n\n function tokenBase(stream, state) {\n var ch = stream.next();\n if (tokenHooks[ch]) {\n var result = tokenHooks[ch](stream, state);\n if (result !== false) return result;\n }\n if (ch == \"@\") {\n stream.eatWhile(/[\\w\\\\\\-]/);\n return ret(\"def\", stream.current());\n } else if (ch == \"=\" || (ch == \"~\" || ch == \"|\") && stream.eat(\"=\")) {\n return ret(null, \"compare\");\n } else if (ch == \"\\\"\" || ch == \"'\") {\n state.tokenize = tokenString(ch);\n return state.tokenize(stream, state);\n } else if (ch == \"#\") {\n stream.eatWhile(/[\\w\\\\\\-]/);\n return ret(\"atom\", \"hash\");\n } else if (ch == \"!\") {\n stream.match(/^\\s*\\w*/);\n return ret(\"keyword\", \"important\");\n } else if (/\\d/.test(ch) || ch == \".\" && stream.eat(/\\d/)) {\n stream.eatWhile(/[\\w.%]/);\n return ret(\"number\", \"unit\");\n } else if (ch === \"-\") {\n if (/[\\d.]/.test(stream.peek())) {\n stream.eatWhile(/[\\w.%]/);\n return ret(\"number\", \"unit\");\n } else if (stream.match(/^-[\\w\\\\\\-]+/)) {\n stream.eatWhile(/[\\w\\\\\\-]/);\n if (stream.match(/^\\s*:/, false))\n return ret(\"variable-2\", \"variable-definition\");\n return ret(\"variable-2\", \"variable\");\n } else if (stream.match(/^\\w+-/)) {\n return ret(\"meta\", \"meta\");\n }\n } else if (/[,+>*\\/]/.test(ch)) {\n return ret(null, \"select-op\");\n } else if (ch == \".\" && stream.match(/^-?[_a-z][_a-z0-9-]*/i)) {\n return ret(\"qualifier\", \"qualifier\");\n } else if (/[:;{}\\[\\]\\(\\)]/.test(ch)) {\n return ret(null, ch);\n } else if ((ch == \"u\" && stream.match(/rl(-prefix)?\\(/)) ||\n (ch == \"d\" && stream.match(\"omain(\")) ||\n (ch == \"r\" && stream.match(\"egexp(\"))) {\n stream.backUp(1);\n state.tokenize = tokenParenthesized;\n return ret(\"property\", \"word\");\n } else if (/[\\w\\\\\\-]/.test(ch)) {\n stream.eatWhile(/[\\w\\\\\\-]/);\n return ret(\"property\", \"word\");\n } else {\n return ret(null, null);\n }\n }\n\n function tokenString(quote) {\n return function(stream, state) {\n var escaped = false, ch;\n while ((ch = stream.next()) != null) {\n if (ch == quote && !escaped) {\n if (quote == \")\") stream.backUp(1);\n break;\n }\n escaped = !escaped && ch == \"\\\\\";\n }\n if (ch == quote || !escaped && quote != \")\") state.tokenize = null;\n return ret(\"string\", \"string\");\n };\n }\n\n function tokenParenthesized(stream, state) {\n stream.next(); // Must be '('\n if (!stream.match(/\\s*[\\\"\\')]/, false))\n state.tokenize = tokenString(\")\");\n else\n state.tokenize = null;\n return ret(null, \"(\");\n }\n\n // Context management\n\n function Context(type, indent, prev) {\n this.type = type;\n this.indent = indent;\n this.prev = prev;\n }\n\n function pushContext(state, stream, type, indent) {\n state.context = new Context(type, stream.indentation() + (indent === false ? 0 : indentUnit), state.context);\n return type;\n }\n\n function popContext(state) {\n if (state.context.prev)\n state.context = state.context.prev;\n return state.context.type;\n }\n\n function pass(type, stream, state) {\n return states[state.context.type](type, stream, state);\n }\n function popAndPass(type, stream, state, n) {\n for (var i = n || 1; i > 0; i--)\n state.context = state.context.prev;\n return pass(type, stream, state);\n }\n\n // Parser\n\n function wordAsValue(stream) {\n var word = stream.current().toLowerCase();\n if (valueKeywords.hasOwnProperty(word))\n override = \"atom\";\n else if (colorKeywords.hasOwnProperty(word))\n override = \"keyword\";\n else\n override = \"variable\";\n }\n\n var states = {};\n\n states.top = function(type, stream, state) {\n if (type == \"{\") {\n return pushContext(state, stream, \"block\");\n } else if (type == \"}\" && state.context.prev) {\n return popContext(state);\n } else if (supportsAtComponent && /@component/.test(type)) {\n return pushContext(state, stream, \"atComponentBlock\");\n } else if (/^@(-moz-)?document$/.test(type)) {\n return pushContext(state, stream, \"documentTypes\");\n } else if (/^@(media|supports|(-moz-)?document|import)$/.test(type)) {\n return pushContext(state, stream, \"atBlock\");\n } else if (/^@(font-face|counter-style)/.test(type)) {\n state.stateArg = type;\n return \"restricted_atBlock_before\";\n } else if (/^@(-(moz|ms|o|webkit)-)?keyframes$/.test(type)) {\n return \"keyframes\";\n } else if (type && type.charAt(0) == \"@\") {\n return pushContext(state, stream, \"at\");\n } else if (type == \"hash\") {\n override = \"builtin\";\n } else if (type == \"word\") {\n override = \"tag\";\n } else if (type == \"variable-definition\") {\n return \"maybeprop\";\n } else if (type == \"interpolation\") {\n return pushContext(state, stream, \"interpolation\");\n } else if (type == \":\") {\n return \"pseudo\";\n } else if (allowNested && type == \"(\") {\n return pushContext(state, stream, \"parens\");\n }\n return state.context.type;\n };\n\n states.block = function(type, stream, state) {\n if (type == \"word\") {\n var word = stream.current().toLowerCase();\n if (propertyKeywords.hasOwnProperty(word)) {\n override = \"property\";\n return \"maybeprop\";\n } else if (nonStandardPropertyKeywords.hasOwnProperty(word)) {\n override = \"string-2\";\n return \"maybeprop\";\n } else if (allowNested) {\n override = stream.match(/^\\s*:(?:\\s|$)/, false) ? \"property\" : \"tag\";\n return \"block\";\n } else {\n override += \" error\";\n return \"maybeprop\";\n }\n } else if (type == \"meta\") {\n return \"block\";\n } else if (!allowNested && (type == \"hash\" || type == \"qualifier\")) {\n override = \"error\";\n return \"block\";\n } else {\n return states.top(type, stream, state);\n }\n };\n\n states.maybeprop = function(type, stream, state) {\n if (type == \":\") return pushContext(state, stream, \"prop\");\n return pass(type, stream, state);\n };\n\n states.prop = function(type, stream, state) {\n if (type == \";\") return popContext(state);\n if (type == \"{\" && allowNested) return pushContext(state, stream, \"propBlock\");\n if (type == \"}\" || type == \"{\") return popAndPass(type, stream, state);\n if (type == \"(\") return pushContext(state, stream, \"parens\");\n\n if (type == \"hash\" && !/^#([0-9a-fA-f]{3,4}|[0-9a-fA-f]{6}|[0-9a-fA-f]{8})$/.test(stream.current())) {\n override += \" error\";\n } else if (type == \"word\") {\n wordAsValue(stream);\n } else if (type == \"interpolation\") {\n return pushContext(state, stream, \"interpolation\");\n }\n return \"prop\";\n };\n\n states.propBlock = function(type, _stream, state) {\n if (type == \"}\") return popContext(state);\n if (type == \"word\") { override = \"property\"; return \"maybeprop\"; }\n return state.context.type;\n };\n\n states.parens = function(type, stream, state) {\n if (type == \"{\" || type == \"}\") return popAndPass(type, stream, state);\n if (type == \")\") return popContext(state);\n if (type == \"(\") return pushContext(state, stream, \"parens\");\n if (type == \"interpolation\") return pushContext(state, stream, \"interpolation\");\n if (type == \"word\") wordAsValue(stream);\n return \"parens\";\n };\n\n states.pseudo = function(type, stream, state) {\n if (type == \"word\") {\n override = \"variable-3\";\n return state.context.type;\n }\n return pass(type, stream, state);\n };\n\n states.documentTypes = function(type, stream, state) {\n if (type == \"word\" && documentTypes.hasOwnProperty(stream.current())) {\n override = \"tag\";\n return state.context.type;\n } else {\n return states.atBlock(type, stream, state);\n }\n };\n\n states.atBlock = function(type, stream, state) {\n if (type == \"(\") return pushContext(state, stream, \"atBlock_parens\");\n if (type == \"}\" || type == \";\") return popAndPass(type, stream, state);\n if (type == \"{\") return popContext(state) && pushContext(state, stream, allowNested ? \"block\" : \"top\");\n\n if (type == \"interpolation\") return pushContext(state, stream, \"interpolation\");\n\n if (type == \"word\") {\n var word = stream.current().toLowerCase();\n if (word == \"only\" || word == \"not\" || word == \"and\" || word == \"or\")\n override = \"keyword\";\n else if (mediaTypes.hasOwnProperty(word))\n override = \"attribute\";\n else if (mediaFeatures.hasOwnProperty(word))\n override = \"property\";\n else if (mediaValueKeywords.hasOwnProperty(word))\n override = \"keyword\";\n else if (propertyKeywords.hasOwnProperty(word))\n override = \"property\";\n else if (nonStandardPropertyKeywords.hasOwnProperty(word))\n override = \"string-2\";\n else if (valueKeywords.hasOwnProperty(word))\n override = \"atom\";\n else if (colorKeywords.hasOwnProperty(word))\n override = \"keyword\";\n else\n override = \"error\";\n }\n return state.context.type;\n };\n\n states.atComponentBlock = function(type, stream, state) {\n if (type == \"}\")\n return popAndPass(type, stream, state);\n if (type == \"{\")\n return popContext(state) && pushContext(state, stream, allowNested ? \"block\" : \"top\", false);\n if (type == \"word\")\n override = \"error\";\n return state.context.type;\n };\n\n states.atBlock_parens = function(type, stream, state) {\n if (type == \")\") return popContext(state);\n if (type == \"{\" || type == \"}\") return popAndPass(type, stream, state, 2);\n return states.atBlock(type, stream, state);\n };\n\n states.restricted_atBlock_before = function(type, stream, state) {\n if (type == \"{\")\n return pushContext(state, stream, \"restricted_atBlock\");\n if (type == \"word\" && state.stateArg == \"@counter-style\") {\n override = \"variable\";\n return \"restricted_atBlock_before\";\n }\n return pass(type, stream, state);\n };\n\n states.restricted_atBlock = function(type, stream, state) {\n if (type == \"}\") {\n state.stateArg = null;\n return popContext(state);\n }\n if (type == \"word\") {\n if ((state.stateArg == \"@font-face\" && !fontProperties.hasOwnProperty(stream.current().toLowerCase())) ||\n (state.stateArg == \"@counter-style\" && !counterDescriptors.hasOwnProperty(stream.current().toLowerCase())))\n override = \"error\";\n else\n override = \"property\";\n return \"maybeprop\";\n }\n return \"restricted_atBlock\";\n };\n\n states.keyframes = function(type, stream, state) {\n if (type == \"word\") { override = \"variable\"; return \"keyframes\"; }\n if (type == \"{\") return pushContext(state, stream, \"top\");\n return pass(type, stream, state);\n };\n\n states.at = function(type, stream, state) {\n if (type == \";\") return popContext(state);\n if (type == \"{\" || type == \"}\") return popAndPass(type, stream, state);\n if (type == \"word\") override = \"tag\";\n else if (type == \"hash\") override = \"builtin\";\n return \"at\";\n };\n\n states.interpolation = function(type, stream, state) {\n if (type == \"}\") return popContext(state);\n if (type == \"{\" || type == \";\") return popAndPass(type, stream, state);\n if (type == \"word\") override = \"variable\";\n else if (type != \"variable\" && type != \"(\" && type != \")\") override = \"error\";\n return \"interpolation\";\n };\n\n return {\n startState: function(base) {\n return {tokenize: null,\n state: inline ? \"block\" : \"top\",\n stateArg: null,\n context: new Context(inline ? \"block\" : \"top\", base || 0, null)};\n },\n\n token: function(stream, state) {\n if (!state.tokenize && stream.eatSpace()) return null;\n var style = (state.tokenize || tokenBase)(stream, state);\n if (style && typeof style == \"object\") {\n type = style[1];\n style = style[0];\n }\n override = style;\n state.state = states[state.state](type, stream, state);\n return override;\n },\n\n indent: function(state, textAfter) {\n var cx = state.context, ch = textAfter && textAfter.charAt(0);\n var indent = cx.indent;\n if (cx.type == \"prop\" && (ch == \"}\" || ch == \")\")) cx = cx.prev;\n if (cx.prev) {\n if (ch == \"}\" && (cx.type == \"block\" || cx.type == \"top\" ||\n cx.type == \"interpolation\" || cx.type == \"restricted_atBlock\")) {\n // Resume indentation from parent context.\n cx = cx.prev;\n indent = cx.indent;\n } else if (ch == \")\" && (cx.type == \"parens\" || cx.type == \"atBlock_parens\") ||\n ch == \"{\" && (cx.type == \"at\" || cx.type == \"atBlock\")) {\n // Dedent relative to current context.\n indent = Math.max(0, cx.indent - indentUnit);\n cx = cx.prev;\n }\n }\n return indent;\n },\n\n electricChars: \"}\",\n blockCommentStart: \"/*\",\n blockCommentEnd: \"*/\",\n fold: \"brace\"\n };\n});\n\n function keySet(array) {\n var keys = {};\n for (var i = 0; i < array.length; ++i) {\n keys[array[i]] = true;\n }\n return keys;\n }\n\n var documentTypes_ = [\n \"domain\", \"regexp\", \"url\", \"url-prefix\"\n ], documentTypes = keySet(documentTypes_);\n\n var mediaTypes_ = [\n \"all\", \"aural\", \"braille\", \"handheld\", \"print\", \"projection\", \"screen\",\n \"tty\", \"tv\", \"embossed\"\n ], mediaTypes = keySet(mediaTypes_);\n\n var mediaFeatures_ = [\n \"width\", \"min-width\", \"max-width\", \"height\", \"min-height\", \"max-height\",\n \"device-width\", \"min-device-width\", \"max-device-width\", \"device-height\",\n \"min-device-height\", \"max-device-height\", \"aspect-ratio\",\n \"min-aspect-ratio\", \"max-aspect-ratio\", \"device-aspect-ratio\",\n \"min-device-aspect-ratio\", \"max-device-aspect-ratio\", \"color\", \"min-color\",\n \"max-color\", \"color-index\", \"min-color-index\", \"max-color-index\",\n \"monochrome\", \"min-monochrome\", \"max-monochrome\", \"resolution\",\n \"min-resolution\", \"max-resolution\", \"scan\", \"grid\", \"orientation\",\n \"device-pixel-ratio\", \"min-device-pixel-ratio\", \"max-device-pixel-ratio\",\n \"pointer\", \"any-pointer\", \"hover\", \"any-hover\"\n ], mediaFeatures = keySet(mediaFeatures_);\n\n var mediaValueKeywords_ = [\n \"landscape\", \"portrait\", \"none\", \"coarse\", \"fine\", \"on-demand\", \"hover\",\n \"interlace\", \"progressive\"\n ], mediaValueKeywords = keySet(mediaValueKeywords_);\n\n var propertyKeywords_ = [\n \"align-content\", \"align-items\", \"align-self\", \"alignment-adjust\",\n \"alignment-baseline\", \"anchor-point\", \"animation\", \"animation-delay\",\n \"animation-direction\", \"animation-duration\", \"animation-fill-mode\",\n \"animation-iteration-count\", \"animation-name\", \"animation-play-state\",\n \"animation-timing-function\", \"appearance\", \"azimuth\", \"backface-visibility\",\n \"background\", \"background-attachment\", \"background-blend-mode\", \"background-clip\",\n \"background-color\", \"background-image\", \"background-origin\", \"background-position\",\n \"background-repeat\", \"background-size\", \"baseline-shift\", \"binding\",\n \"bleed\", \"bookmark-label\", \"bookmark-level\", \"bookmark-state\",\n \"bookmark-target\", \"border\", \"border-bottom\", \"border-bottom-color\",\n \"border-bottom-left-radius\", \"border-bottom-right-radius\",\n \"border-bottom-style\", \"border-bottom-width\", \"border-collapse\",\n \"border-color\", \"border-image\", \"border-image-outset\",\n \"border-image-repeat\", \"border-image-slice\", \"border-image-source\",\n \"border-image-width\", \"border-left\", \"border-left-color\",\n \"border-left-style\", \"border-left-width\", \"border-radius\", \"border-right\",\n \"border-right-color\", \"border-right-style\", \"border-right-width\",\n \"border-spacing\", \"border-style\", \"border-top\", \"border-top-color\",\n \"border-top-left-radius\", \"border-top-right-radius\", \"border-top-style\",\n \"border-top-width\", \"border-width\", \"bottom\", \"box-decoration-break\",\n \"box-shadow\", \"box-sizing\", \"break-after\", \"break-before\", \"break-inside\",\n \"caption-side\", \"clear\", \"clip\", \"color\", \"color-profile\", \"column-count\",\n \"column-fill\", \"column-gap\", \"column-rule\", \"column-rule-color\",\n \"column-rule-style\", \"column-rule-width\", \"column-span\", \"column-width\",\n \"columns\", \"content\", \"counter-increment\", \"counter-reset\", \"crop\", \"cue\",\n \"cue-after\", \"cue-before\", \"cursor\", \"direction\", \"display\",\n \"dominant-baseline\", \"drop-initial-after-adjust\",\n \"drop-initial-after-align\", \"drop-initial-before-adjust\",\n \"drop-initial-before-align\", \"drop-initial-size\", \"drop-initial-value\",\n \"elevation\", \"empty-cells\", \"fit\", \"fit-position\", \"flex\", \"flex-basis\",\n \"flex-direction\", \"flex-flow\", \"flex-grow\", \"flex-shrink\", \"flex-wrap\",\n \"float\", \"float-offset\", \"flow-from\", \"flow-into\", \"font\", \"font-feature-settings\",\n \"font-family\", \"font-kerning\", \"font-language-override\", \"font-size\", \"font-size-adjust\",\n \"font-stretch\", \"font-style\", \"font-synthesis\", \"font-variant\",\n \"font-variant-alternates\", \"font-variant-caps\", \"font-variant-east-asian\",\n \"font-variant-ligatures\", \"font-variant-numeric\", \"font-variant-position\",\n \"font-weight\", \"grid\", \"grid-area\", \"grid-auto-columns\", \"grid-auto-flow\",\n \"grid-auto-rows\", \"grid-column\", \"grid-column-end\", \"grid-column-gap\",\n \"grid-column-start\", \"grid-gap\", \"grid-row\", \"grid-row-end\", \"grid-row-gap\",\n \"grid-row-start\", \"grid-template\", \"grid-template-areas\", \"grid-template-columns\",\n \"grid-template-rows\", \"hanging-punctuation\", \"height\", \"hyphens\",\n \"icon\", \"image-orientation\", \"image-rendering\", \"image-resolution\",\n \"inline-box-align\", \"justify-content\", \"left\", \"letter-spacing\",\n \"line-break\", \"line-height\", \"line-stacking\", \"line-stacking-ruby\",\n \"line-stacking-shift\", \"line-stacking-strategy\", \"list-style\",\n \"list-style-image\", \"list-style-position\", \"list-style-type\", \"margin\",\n \"margin-bottom\", \"margin-left\", \"margin-right\", \"margin-top\",\n \"marker-offset\", \"marks\", \"marquee-direction\", \"marquee-loop\",\n \"marquee-play-count\", \"marquee-speed\", \"marquee-style\", \"max-height\",\n \"max-width\", \"min-height\", \"min-width\", \"move-to\", \"nav-down\", \"nav-index\",\n \"nav-left\", \"nav-right\", \"nav-up\", \"object-fit\", \"object-position\",\n \"opacity\", \"order\", \"orphans\", \"outline\",\n \"outline-color\", \"outline-offset\", \"outline-style\", \"outline-width\",\n \"overflow\", \"overflow-style\", \"overflow-wrap\", \"overflow-x\", \"overflow-y\",\n \"padding\", \"padding-bottom\", \"padding-left\", \"padding-right\", \"padding-top\",\n \"page\", \"page-break-after\", \"page-break-before\", \"page-break-inside\",\n \"page-policy\", \"pause\", \"pause-after\", \"pause-before\", \"perspective\",\n \"perspective-origin\", \"pitch\", \"pitch-range\", \"play-during\", \"position\",\n \"presentation-level\", \"punctuation-trim\", \"quotes\", \"region-break-after\",\n \"region-break-before\", \"region-break-inside\", \"region-fragment\",\n \"rendering-intent\", \"resize\", \"rest\", \"rest-after\", \"rest-before\", \"richness\",\n \"right\", \"rotation\", \"rotation-point\", \"ruby-align\", \"ruby-overhang\",\n \"ruby-position\", \"ruby-span\", \"shape-image-threshold\", \"shape-inside\", \"shape-margin\",\n \"shape-outside\", \"size\", \"speak\", \"speak-as\", \"speak-header\",\n \"speak-numeral\", \"speak-punctuation\", \"speech-rate\", \"stress\", \"string-set\",\n \"tab-size\", \"table-layout\", \"target\", \"target-name\", \"target-new\",\n \"target-position\", \"text-align\", \"text-align-last\", \"text-decoration\",\n \"text-decoration-color\", \"text-decoration-line\", \"text-decoration-skip\",\n \"text-decoration-style\", \"text-emphasis\", \"text-emphasis-color\",\n \"text-emphasis-position\", \"text-emphasis-style\", \"text-height\",\n \"text-indent\", \"text-justify\", \"text-outline\", \"text-overflow\", \"text-shadow\",\n \"text-size-adjust\", \"text-space-collapse\", \"text-transform\", \"text-underline-position\",\n \"text-wrap\", \"top\", \"transform\", \"transform-origin\", \"transform-style\",\n \"transition\", \"transition-delay\", \"transition-duration\",\n \"transition-property\", \"transition-timing-function\", \"unicode-bidi\",\n \"vertical-align\", \"visibility\", \"voice-balance\", \"voice-duration\",\n \"voice-family\", \"voice-pitch\", \"voice-range\", \"voice-rate\", \"voice-stress\",\n \"voice-volume\", \"volume\", \"white-space\", \"widows\", \"width\", \"word-break\",\n \"word-spacing\", \"word-wrap\", \"z-index\",\n // SVG-specific\n \"clip-path\", \"clip-rule\", \"mask\", \"enable-background\", \"filter\", \"flood-color\",\n \"flood-opacity\", \"lighting-color\", \"stop-color\", \"stop-opacity\", \"pointer-events\",\n \"color-interpolation\", \"color-interpolation-filters\",\n \"color-rendering\", \"fill\", \"fill-opacity\", \"fill-rule\", \"image-rendering\",\n \"marker\", \"marker-end\", \"marker-mid\", \"marker-start\", \"shape-rendering\", \"stroke\",\n \"stroke-dasharray\", \"stroke-dashoffset\", \"stroke-linecap\", \"stroke-linejoin\",\n \"stroke-miterlimit\", \"stroke-opacity\", \"stroke-width\", \"text-rendering\",\n \"baseline-shift\", \"dominant-baseline\", \"glyph-orientation-horizontal\",\n \"glyph-orientation-vertical\", \"text-anchor\", \"writing-mode\"\n ], propertyKeywords = keySet(propertyKeywords_);\n\n var nonStandardPropertyKeywords_ = [\n \"scrollbar-arrow-color\", \"scrollbar-base-color\", \"scrollbar-dark-shadow-color\",\n \"scrollbar-face-color\", \"scrollbar-highlight-color\", \"scrollbar-shadow-color\",\n \"scrollbar-3d-light-color\", \"scrollbar-track-color\", \"shape-inside\",\n \"searchfield-cancel-button\", \"searchfield-decoration\", \"searchfield-results-button\",\n \"searchfield-results-decoration\", \"zoom\"\n ], nonStandardPropertyKeywords = keySet(nonStandardPropertyKeywords_);\n\n var fontProperties_ = [\n \"font-family\", \"src\", \"unicode-range\", \"font-variant\", \"font-feature-settings\",\n \"font-stretch\", \"font-weight\", \"font-style\"\n ], fontProperties = keySet(fontProperties_);\n\n var counterDescriptors_ = [\n \"additive-symbols\", \"fallback\", \"negative\", \"pad\", \"prefix\", \"range\",\n \"speak-as\", \"suffix\", \"symbols\", \"system\"\n ], counterDescriptors = keySet(counterDescriptors_);\n\n var colorKeywords_ = [\n \"aliceblue\", \"antiquewhite\", \"aqua\", \"aquamarine\", \"azure\", \"beige\",\n \"bisque\", \"black\", \"blanchedalmond\", \"blue\", \"blueviolet\", \"brown\",\n \"burlywood\", \"cadetblue\", \"chartreuse\", \"chocolate\", \"coral\", \"cornflowerblue\",\n \"cornsilk\", \"crimson\", \"cyan\", \"darkblue\", \"darkcyan\", \"darkgoldenrod\",\n \"darkgray\", \"darkgreen\", \"darkkhaki\", \"darkmagenta\", \"darkolivegreen\",\n \"darkorange\", \"darkorchid\", \"darkred\", \"darksalmon\", \"darkseagreen\",\n \"darkslateblue\", \"darkslategray\", \"darkturquoise\", \"darkviolet\",\n \"deeppink\", \"deepskyblue\", \"dimgray\", \"dodgerblue\", \"firebrick\",\n \"floralwhite\", \"forestgreen\", \"fuchsia\", \"gainsboro\", \"ghostwhite\",\n \"gold\", \"goldenrod\", \"gray\", \"grey\", \"green\", \"greenyellow\", \"honeydew\",\n \"hotpink\", \"indianred\", \"indigo\", \"ivory\", \"khaki\", \"lavender\",\n \"lavenderblush\", \"lawngreen\", \"lemonchiffon\", \"lightblue\", \"lightcoral\",\n \"lightcyan\", \"lightgoldenrodyellow\", \"lightgray\", \"lightgreen\", \"lightpink\",\n \"lightsalmon\", \"lightseagreen\", \"lightskyblue\", \"lightslategray\",\n \"lightsteelblue\", \"lightyellow\", \"lime\", \"limegreen\", \"linen\", \"magenta\",\n \"maroon\", \"mediumaquamarine\", \"mediumblue\", \"mediumorchid\", \"mediumpurple\",\n \"mediumseagreen\", \"mediumslateblue\", \"mediumspringgreen\", \"mediumturquoise\",\n \"mediumvioletred\", \"midnightblue\", \"mintcream\", \"mistyrose\", \"moccasin\",\n \"navajowhite\", \"navy\", \"oldlace\", \"olive\", \"olivedrab\", \"orange\", \"orangered\",\n \"orchid\", \"palegoldenrod\", \"palegreen\", \"paleturquoise\", \"palevioletred\",\n \"papayawhip\", \"peachpuff\", \"peru\", \"pink\", \"plum\", \"powderblue\",\n \"purple\", \"rebeccapurple\", \"red\", \"rosybrown\", \"royalblue\", \"saddlebrown\",\n \"salmon\", \"sandybrown\", \"seagreen\", \"seashell\", \"sienna\", \"silver\", \"skyblue\",\n \"slateblue\", \"slategray\", \"snow\", \"springgreen\", \"steelblue\", \"tan\",\n \"teal\", \"thistle\", \"tomato\", \"turquoise\", \"violet\", \"wheat\", \"white\",\n \"whitesmoke\", \"yellow\", \"yellowgreen\"\n ], colorKeywords = keySet(colorKeywords_);\n\n var valueKeywords_ = [\n \"above\", \"absolute\", \"activeborder\", \"additive\", \"activecaption\", \"afar\",\n \"after-white-space\", \"ahead\", \"alias\", \"all\", \"all-scroll\", \"alphabetic\", \"alternate\",\n \"always\", \"amharic\", \"amharic-abegede\", \"antialiased\", \"appworkspace\",\n \"arabic-indic\", \"armenian\", \"asterisks\", \"attr\", \"auto\", \"avoid\", \"avoid-column\", \"avoid-page\",\n \"avoid-region\", \"background\", \"backwards\", \"baseline\", \"below\", \"bidi-override\", \"binary\",\n \"bengali\", \"blink\", \"block\", \"block-axis\", \"bold\", \"bolder\", \"border\", \"border-box\",\n \"both\", \"bottom\", \"break\", \"break-all\", \"break-word\", \"bullets\", \"button\", \"button-bevel\",\n \"buttonface\", \"buttonhighlight\", \"buttonshadow\", \"buttontext\", \"calc\", \"cambodian\",\n \"capitalize\", \"caps-lock-indicator\", \"caption\", \"captiontext\", \"caret\",\n \"cell\", \"center\", \"checkbox\", \"circle\", \"cjk-decimal\", \"cjk-earthly-branch\",\n \"cjk-heavenly-stem\", \"cjk-ideographic\", \"clear\", \"clip\", \"close-quote\",\n \"col-resize\", \"collapse\", \"color\", \"color-burn\", \"color-dodge\", \"column\", \"column-reverse\",\n \"compact\", \"condensed\", \"contain\", \"content\",\n \"content-box\", \"context-menu\", \"continuous\", \"copy\", \"counter\", \"counters\", \"cover\", \"crop\",\n \"cross\", \"crosshair\", \"currentcolor\", \"cursive\", \"cyclic\", \"darken\", \"dashed\", \"decimal\",\n \"decimal-leading-zero\", \"default\", \"default-button\", \"dense\", \"destination-atop\",\n \"destination-in\", \"destination-out\", \"destination-over\", \"devanagari\", \"difference\",\n \"disc\", \"discard\", \"disclosure-closed\", \"disclosure-open\", \"document\",\n \"dot-dash\", \"dot-dot-dash\",\n \"dotted\", \"double\", \"down\", \"e-resize\", \"ease\", \"ease-in\", \"ease-in-out\", \"ease-out\",\n \"element\", \"ellipse\", \"ellipsis\", \"embed\", \"end\", \"ethiopic\", \"ethiopic-abegede\",\n \"ethiopic-abegede-am-et\", \"ethiopic-abegede-gez\", \"ethiopic-abegede-ti-er\",\n \"ethiopic-abegede-ti-et\", \"ethiopic-halehame-aa-er\",\n \"ethiopic-halehame-aa-et\", \"ethiopic-halehame-am-et\",\n \"ethiopic-halehame-gez\", \"ethiopic-halehame-om-et\",\n \"ethiopic-halehame-sid-et\", \"ethiopic-halehame-so-et\",\n \"ethiopic-halehame-ti-er\", \"ethiopic-halehame-ti-et\", \"ethiopic-halehame-tig\",\n \"ethiopic-numeric\", \"ew-resize\", \"exclusion\", \"expanded\", \"extends\", \"extra-condensed\",\n \"extra-expanded\", \"fantasy\", \"fast\", \"fill\", \"fixed\", \"flat\", \"flex\", \"flex-end\", \"flex-start\", \"footnotes\",\n \"forwards\", \"from\", \"geometricPrecision\", \"georgian\", \"graytext\", \"grid\", \"groove\",\n \"gujarati\", \"gurmukhi\", \"hand\", \"hangul\", \"hangul-consonant\", \"hard-light\", \"hebrew\",\n \"help\", \"hidden\", \"hide\", \"higher\", \"highlight\", \"highlighttext\",\n \"hiragana\", \"hiragana-iroha\", \"horizontal\", \"hsl\", \"hsla\", \"hue\", \"icon\", \"ignore\",\n \"inactiveborder\", \"inactivecaption\", \"inactivecaptiontext\", \"infinite\",\n \"infobackground\", \"infotext\", \"inherit\", \"initial\", \"inline\", \"inline-axis\",\n \"inline-block\", \"inline-flex\", \"inline-grid\", \"inline-table\", \"inset\", \"inside\", \"intrinsic\", \"invert\",\n \"italic\", \"japanese-formal\", \"japanese-informal\", \"justify\", \"kannada\",\n \"katakana\", \"katakana-iroha\", \"keep-all\", \"khmer\",\n \"korean-hangul-formal\", \"korean-hanja-formal\", \"korean-hanja-informal\",\n \"landscape\", \"lao\", \"large\", \"larger\", \"left\", \"level\", \"lighter\", \"lighten\",\n \"line-through\", \"linear\", \"linear-gradient\", \"lines\", \"list-item\", \"listbox\", \"listitem\",\n \"local\", \"logical\", \"loud\", \"lower\", \"lower-alpha\", \"lower-armenian\",\n \"lower-greek\", \"lower-hexadecimal\", \"lower-latin\", \"lower-norwegian\",\n \"lower-roman\", \"lowercase\", \"ltr\", \"luminosity\", \"malayalam\", \"match\", \"matrix\", \"matrix3d\",\n \"media-controls-background\", \"media-current-time-display\",\n \"media-fullscreen-button\", \"media-mute-button\", \"media-play-button\",\n \"media-return-to-realtime-button\", \"media-rewind-button\",\n \"media-seek-back-button\", \"media-seek-forward-button\", \"media-slider\",\n \"media-sliderthumb\", \"media-time-remaining-display\", \"media-volume-slider\",\n \"media-volume-slider-container\", \"media-volume-sliderthumb\", \"medium\",\n \"menu\", \"menulist\", \"menulist-button\", \"menulist-text\",\n \"menulist-textfield\", \"menutext\", \"message-box\", \"middle\", \"min-intrinsic\",\n \"mix\", \"mongolian\", \"monospace\", \"move\", \"multiple\", \"multiply\", \"myanmar\", \"n-resize\",\n \"narrower\", \"ne-resize\", \"nesw-resize\", \"no-close-quote\", \"no-drop\",\n \"no-open-quote\", \"no-repeat\", \"none\", \"normal\", \"not-allowed\", \"nowrap\",\n \"ns-resize\", \"numbers\", \"numeric\", \"nw-resize\", \"nwse-resize\", \"oblique\", \"octal\", \"open-quote\",\n \"optimizeLegibility\", \"optimizeSpeed\", \"oriya\", \"oromo\", \"outset\",\n \"outside\", \"outside-shape\", \"overlay\", \"overline\", \"padding\", \"padding-box\",\n \"painted\", \"page\", \"paused\", \"persian\", \"perspective\", \"plus-darker\", \"plus-lighter\",\n \"pointer\", \"polygon\", \"portrait\", \"pre\", \"pre-line\", \"pre-wrap\", \"preserve-3d\",\n \"progress\", \"push-button\", \"radial-gradient\", \"radio\", \"read-only\",\n \"read-write\", \"read-write-plaintext-only\", \"rectangle\", \"region\",\n \"relative\", \"repeat\", \"repeating-linear-gradient\",\n \"repeating-radial-gradient\", \"repeat-x\", \"repeat-y\", \"reset\", \"reverse\",\n \"rgb\", \"rgba\", \"ridge\", \"right\", \"rotate\", \"rotate3d\", \"rotateX\", \"rotateY\",\n \"rotateZ\", \"round\", \"row\", \"row-resize\", \"row-reverse\", \"rtl\", \"run-in\", \"running\",\n \"s-resize\", \"sans-serif\", \"saturation\", \"scale\", \"scale3d\", \"scaleX\", \"scaleY\", \"scaleZ\", \"screen\",\n \"scroll\", \"scrollbar\", \"se-resize\", \"searchfield\",\n \"searchfield-cancel-button\", \"searchfield-decoration\",\n \"searchfield-results-button\", \"searchfield-results-decoration\",\n \"semi-condensed\", \"semi-expanded\", \"separate\", \"serif\", \"show\", \"sidama\",\n \"simp-chinese-formal\", \"simp-chinese-informal\", \"single\",\n \"skew\", \"skewX\", \"skewY\", \"skip-white-space\", \"slide\", \"slider-horizontal\",\n \"slider-vertical\", \"sliderthumb-horizontal\", \"sliderthumb-vertical\", \"slow\",\n \"small\", \"small-caps\", \"small-caption\", \"smaller\", \"soft-light\", \"solid\", \"somali\",\n \"source-atop\", \"source-in\", \"source-out\", \"source-over\", \"space\", \"space-around\", \"space-between\", \"spell-out\", \"square\",\n \"square-button\", \"start\", \"static\", \"status-bar\", \"stretch\", \"stroke\", \"sub\",\n \"subpixel-antialiased\", \"super\", \"sw-resize\", \"symbolic\", \"symbols\", \"table\",\n \"table-caption\", \"table-cell\", \"table-column\", \"table-column-group\",\n \"table-footer-group\", \"table-header-group\", \"table-row\", \"table-row-group\",\n \"tamil\",\n \"telugu\", \"text\", \"text-bottom\", \"text-top\", \"textarea\", \"textfield\", \"thai\",\n \"thick\", \"thin\", \"threeddarkshadow\", \"threedface\", \"threedhighlight\",\n \"threedlightshadow\", \"threedshadow\", \"tibetan\", \"tigre\", \"tigrinya-er\",\n \"tigrinya-er-abegede\", \"tigrinya-et\", \"tigrinya-et-abegede\", \"to\", \"top\",\n \"trad-chinese-formal\", \"trad-chinese-informal\",\n \"translate\", \"translate3d\", \"translateX\", \"translateY\", \"translateZ\",\n \"transparent\", \"ultra-condensed\", \"ultra-expanded\", \"underline\", \"up\",\n \"upper-alpha\", \"upper-armenian\", \"upper-greek\", \"upper-hexadecimal\",\n \"upper-latin\", \"upper-norwegian\", \"upper-roman\", \"uppercase\", \"urdu\", \"url\",\n \"var\", \"vertical\", \"vertical-text\", \"visible\", \"visibleFill\", \"visiblePainted\",\n \"visibleStroke\", \"visual\", \"w-resize\", \"wait\", \"wave\", \"wider\",\n \"window\", \"windowframe\", \"windowtext\", \"words\", \"wrap\", \"wrap-reverse\", \"x-large\", \"x-small\", \"xor\",\n \"xx-large\", \"xx-small\"\n ], valueKeywords = keySet(valueKeywords_);\n\n var allWords = documentTypes_.concat(mediaTypes_).concat(mediaFeatures_).concat(mediaValueKeywords_)\n .concat(propertyKeywords_).concat(nonStandardPropertyKeywords_).concat(colorKeywords_)\n .concat(valueKeywords_);\n CodeMirror.registerHelper(\"hintWords\", \"css\", allWords);\n\n function tokenCComment(stream, state) {\n var maybeEnd = false, ch;\n while ((ch = stream.next()) != null) {\n if (maybeEnd && ch == \"/\") {\n state.tokenize = null;\n break;\n }\n maybeEnd = (ch == \"*\");\n }\n return [\"comment\", \"comment\"];\n }\n\n CodeMirror.defineMIME(\"text/css\", {\n documentTypes: documentTypes,\n mediaTypes: mediaTypes,\n mediaFeatures: mediaFeatures,\n mediaValueKeywords: mediaValueKeywords,\n propertyKeywords: propertyKeywords,\n nonStandardPropertyKeywords: nonStandardPropertyKeywords,\n fontProperties: fontProperties,\n counterDescriptors: counterDescriptors,\n colorKeywords: colorKeywords,\n valueKeywords: valueKeywords,\n tokenHooks: {\n \"/\": function(stream, state) {\n if (!stream.eat(\"*\")) return false;\n state.tokenize = tokenCComment;\n return tokenCComment(stream, state);\n }\n },\n name: \"css\"\n });\n\n CodeMirror.defineMIME(\"text/x-scss\", {\n mediaTypes: mediaTypes,\n mediaFeatures: mediaFeatures,\n mediaValueKeywords: mediaValueKeywords,\n propertyKeywords: propertyKeywords,\n nonStandardPropertyKeywords: nonStandardPropertyKeywords,\n colorKeywords: colorKeywords,\n valueKeywords: valueKeywords,\n fontProperties: fontProperties,\n allowNested: true,\n tokenHooks: {\n \"/\": function(stream, state) {\n if (stream.eat(\"/\")) {\n stream.skipToEnd();\n return [\"comment\", \"comment\"];\n } else if (stream.eat(\"*\")) {\n state.tokenize = tokenCComment;\n return tokenCComment(stream, state);\n } else {\n return [\"operator\", \"operator\"];\n }\n },\n \":\": function(stream) {\n if (stream.match(/\\s*\\{/))\n return [null, \"{\"];\n return false;\n },\n \"$\": function(stream) {\n stream.match(/^[\\w-]+/);\n if (stream.match(/^\\s*:/, false))\n return [\"variable-2\", \"variable-definition\"];\n return [\"variable-2\", \"variable\"];\n },\n \"#\": function(stream) {\n if (!stream.eat(\"{\")) return false;\n return [null, \"interpolation\"];\n }\n },\n name: \"css\",\n helperType: \"scss\"\n });\n\n CodeMirror.defineMIME(\"text/x-less\", {\n mediaTypes: mediaTypes,\n mediaFeatures: mediaFeatures,\n mediaValueKeywords: mediaValueKeywords,\n propertyKeywords: propertyKeywords,\n nonStandardPropertyKeywords: nonStandardPropertyKeywords,\n colorKeywords: colorKeywords,\n valueKeywords: valueKeywords,\n fontProperties: fontProperties,\n allowNested: true,\n tokenHooks: {\n \"/\": function(stream, state) {\n if (stream.eat(\"/\")) {\n stream.skipToEnd();\n return [\"comment\", \"comment\"];\n } else if (stream.eat(\"*\")) {\n state.tokenize = tokenCComment;\n return tokenCComment(stream, state);\n } else {\n return [\"operator\", \"operator\"];\n }\n },\n \"@\": function(stream) {\n if (stream.eat(\"{\")) return [null, \"interpolation\"];\n if (stream.match(/^(charset|document|font-face|import|(-(moz|ms|o|webkit)-)?keyframes|media|namespace|page|supports)\\b/, false)) return false;\n stream.eatWhile(/[\\w\\\\\\-]/);\n if (stream.match(/^\\s*:/, false))\n return [\"variable-2\", \"variable-definition\"];\n return [\"variable-2\", \"variable\"];\n },\n \"&\": function() {\n return [\"atom\", \"atom\"];\n }\n },\n name: \"css\",\n helperType: \"less\"\n });\n\n CodeMirror.defineMIME(\"text/x-gss\", {\n documentTypes: documentTypes,\n mediaTypes: mediaTypes,\n mediaFeatures: mediaFeatures,\n propertyKeywords: propertyKeywords,\n nonStandardPropertyKeywords: nonStandardPropertyKeywords,\n fontProperties: fontProperties,\n counterDescriptors: counterDescriptors,\n colorKeywords: colorKeywords,\n valueKeywords: valueKeywords,\n supportsAtComponent: true,\n tokenHooks: {\n \"/\": function(stream, state) {\n if (!stream.eat(\"*\")) return false;\n state.tokenize = tokenCComment;\n return tokenCComment(stream, state);\n }\n },\n name: \"css\",\n helperType: \"gss\"\n });\n\n});\n","// 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\"), require(\"../xml/xml\"), require(\"../javascript/javascript\"), require(\"../css/css\"));\n else if (typeof define == \"function\" && define.amd) // AMD\n define([\"../../lib/codemirror\", \"../xml/xml\", \"../javascript/javascript\", \"../css/css\"], mod);\n else // Plain browser env\n mod(CodeMirror);\n})(function(CodeMirror) {\n \"use strict\";\n\n var defaultTags = {\n script: [\n [\"lang\", /(javascript|babel)/i, \"javascript\"],\n [\"type\", /^(?:text|application)\\/(?:x-)?(?:java|ecma)script$|^$/i, \"javascript\"],\n [\"type\", /./, \"text/plain\"],\n [null, null, \"javascript\"]\n ],\n style: [\n [\"lang\", /^css$/i, \"css\"],\n [\"type\", /^(text\\/)?(x-)?(stylesheet|css)$/i, \"css\"],\n [\"type\", /./, \"text/plain\"],\n [null, null, \"css\"]\n ]\n };\n\n function maybeBackup(stream, pat, style) {\n var cur = stream.current(), close = cur.search(pat);\n if (close > -1) {\n stream.backUp(cur.length - close);\n } else if (cur.match(/<\\/?$/)) {\n stream.backUp(cur.length);\n if (!stream.match(pat, false)) stream.match(cur);\n }\n return style;\n }\n\n var attrRegexpCache = {};\n function getAttrRegexp(attr) {\n var regexp = attrRegexpCache[attr];\n if (regexp) return regexp;\n return attrRegexpCache[attr] = new RegExp(\"\\\\s+\" + attr + \"\\\\s*=\\\\s*('|\\\")?([^'\\\"]+)('|\\\")?\\\\s*\");\n }\n\n function getAttrValue(text, attr) {\n var match = text.match(getAttrRegexp(attr))\n return match ? /^\\s*(.*?)\\s*$/.exec(match[2])[1] : \"\"\n }\n\n function getTagRegexp(tagName, anchored) {\n return new RegExp((anchored ? \"^\" : \"\") + \"<\\/\\s*\" + tagName + \"\\s*>\", \"i\");\n }\n\n function addTags(from, to) {\n for (var tag in from) {\n var dest = to[tag] || (to[tag] = []);\n var source = from[tag];\n for (var i = source.length - 1; i >= 0; i--)\n dest.unshift(source[i])\n }\n }\n\n function findMatchingMode(tagInfo, tagText) {\n for (var i = 0; i < tagInfo.length; i++) {\n var spec = tagInfo[i];\n if (!spec[0] || spec[1].test(getAttrValue(tagText, spec[0]))) return spec[2];\n }\n }\n\n CodeMirror.defineMode(\"htmlmixed\", function (config, parserConfig) {\n var htmlMode = CodeMirror.getMode(config, {\n name: \"xml\",\n htmlMode: true,\n multilineTagIndentFactor: parserConfig.multilineTagIndentFactor,\n multilineTagIndentPastTag: parserConfig.multilineTagIndentPastTag\n });\n\n var tags = {};\n var configTags = parserConfig && parserConfig.tags, configScript = parserConfig && parserConfig.scriptTypes;\n addTags(defaultTags, tags);\n if (configTags) addTags(configTags, tags);\n if (configScript) for (var i = configScript.length - 1; i >= 0; i--)\n tags.script.unshift([\"type\", configScript[i].matches, configScript[i].mode])\n\n function html(stream, state) {\n var style = htmlMode.token(stream, state.htmlState), tag = /\\btag\\b/.test(style), tagName\n if (tag && !/[<>\\s\\/]/.test(stream.current()) &&\n (tagName = state.htmlState.tagName && state.htmlState.tagName.toLowerCase()) &&\n tags.hasOwnProperty(tagName)) {\n state.inTag = tagName + \" \"\n } else if (state.inTag && tag && />$/.test(stream.current())) {\n var inTag = /^([\\S]+) (.*)/.exec(state.inTag)\n state.inTag = null\n var modeSpec = stream.current() == \">\" && findMatchingMode(tags[inTag[1]], inTag[2])\n var mode = CodeMirror.getMode(config, modeSpec)\n var endTagA = getTagRegexp(inTag[1], true), endTag = getTagRegexp(inTag[1], false);\n state.token = function (stream, state) {\n if (stream.match(endTagA, false)) {\n state.token = html;\n state.localState = state.localMode = null;\n return null;\n }\n return maybeBackup(stream, endTag, state.localMode.token(stream, state.localState));\n };\n state.localMode = mode;\n state.localState = CodeMirror.startState(mode, htmlMode.indent(state.htmlState, \"\"));\n } else if (state.inTag) {\n state.inTag += stream.current()\n if (stream.eol()) state.inTag += \" \"\n }\n return style;\n };\n\n return {\n startState: function () {\n var state = CodeMirror.startState(htmlMode);\n return {token: html, inTag: null, localMode: null, localState: null, htmlState: state};\n },\n\n copyState: function (state) {\n var local;\n if (state.localState) {\n local = CodeMirror.copyState(state.localMode, state.localState);\n }\n return {token: state.token, inTag: state.inTag,\n localMode: state.localMode, localState: local,\n htmlState: CodeMirror.copyState(htmlMode, state.htmlState)};\n },\n\n token: function (stream, state) {\n return state.token(stream, state);\n },\n\n indent: function (state, textAfter) {\n if (!state.localMode || /^\\s*<\\//.test(textAfter))\n return htmlMode.indent(state.htmlState, textAfter);\n else if (state.localMode.indent)\n return state.localMode.indent(state.localState, textAfter);\n else\n return CodeMirror.Pass;\n },\n\n innerMode: function (state) {\n return {state: state.localState || state.htmlState, mode: state.localMode || htmlMode};\n }\n };\n }, \"xml\", \"javascript\", \"css\");\n\n CodeMirror.defineMIME(\"text/html\", \"htmlmixed\");\n});\n","// 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\"), require(\"../../addon/mode/simple\"), require(\"../../addon/mode/multiplex\"));\n else if (typeof define == \"function\" && define.amd) // AMD\n define([\"../../lib/codemirror\", \"../../addon/mode/simple\", \"../../addon/mode/multiplex\"], mod);\n else // Plain browser env\n mod(CodeMirror);\n})(function(CodeMirror) {\n \"use strict\";\n\n CodeMirror.defineSimpleMode(\"handlebars-tags\", {\n start: [\n { regex: /\\{\\{!--/, push: \"dash_comment\", token: \"comment\" },\n { regex: /\\{\\{!/, push: \"comment\", token: \"comment\" },\n { regex: /\\{\\{/, push: \"handlebars\", token: \"tag\" }\n ],\n handlebars: [\n { regex: /\\}\\}/, pop: true, token: \"tag\" },\n\n // Double and single quotes\n { regex: /\"(?:[^\\\\\"]|\\\\.)*\"?/, token: \"string\" },\n { regex: /'(?:[^\\\\']|\\\\.)*'?/, token: \"string\" },\n\n // Handlebars keywords\n { regex: />|[#\\/]([A-Za-z_]\\w*)/, token: \"keyword\" },\n { regex: /(?:else|this)\\b/, token: \"keyword\" },\n\n // Numeral\n { regex: /\\d+/i, token: \"number\" },\n\n // Atoms like = and .\n { regex: /=|~|@|true|false/, token: \"atom\" },\n\n // Paths\n { regex: /(?:\\.\\.\\/)*(?:[A-Za-z_][\\w\\.]*)+/, token: \"variable-2\" }\n ],\n dash_comment: [\n { regex: /--\\}\\}/, pop: true, token: \"comment\" },\n\n // Commented code\n { regex: /./, token: \"comment\"}\n ],\n comment: [\n { regex: /\\}\\}/, pop: true, token: \"comment\" },\n { regex: /./, token: \"comment\" }\n ]\n });\n\n CodeMirror.defineMode(\"handlebars\", function(config, parserConfig) {\n var handlebars = CodeMirror.getMode(config, \"handlebars-tags\");\n if (!parserConfig || !parserConfig.base) return handlebars;\n return CodeMirror.multiplexingMode(\n CodeMirror.getMode(config, parserConfig.base),\n {open: \"{{\", close: \"}}\", mode: handlebars, parseDelimiters: true}\n );\n });\n\n CodeMirror.defineMIME(\"text/x-handlebars-template\", \"handlebars\");\n});\n","// 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(\"sparql\", function(config) {\n var indentUnit = config.indentUnit;\n var curPunc;\n\n function wordRegexp(words) {\n return new RegExp(\"^(?:\" + words.join(\"|\") + \")$\", \"i\");\n }\n var ops = wordRegexp([\"str\", \"lang\", \"langmatches\", \"datatype\", \"bound\", \"sameterm\", \"isiri\", \"isuri\",\n \"iri\", \"uri\", \"bnode\", \"count\", \"sum\", \"min\", \"max\", \"avg\", \"sample\",\n \"group_concat\", \"rand\", \"abs\", \"ceil\", \"floor\", \"round\", \"concat\", \"substr\", \"strlen\",\n \"replace\", \"ucase\", \"lcase\", \"encode_for_uri\", \"contains\", \"strstarts\", \"strends\",\n \"strbefore\", \"strafter\", \"year\", \"month\", \"day\", \"hours\", \"minutes\", \"seconds\",\n \"timezone\", \"tz\", \"now\", \"uuid\", \"struuid\", \"md5\", \"sha1\", \"sha256\", \"sha384\",\n \"sha512\", \"coalesce\", \"if\", \"strlang\", \"strdt\", \"isnumeric\", \"regex\", \"exists\",\n \"isblank\", \"isliteral\", \"a\", \"bind\"]);\n var keywords = wordRegexp([\"base\", \"prefix\", \"select\", \"distinct\", \"reduced\", \"construct\", \"describe\",\n \"ask\", \"from\", \"named\", \"where\", \"order\", \"limit\", \"offset\", \"filter\", \"optional\",\n \"graph\", \"by\", \"asc\", \"desc\", \"as\", \"having\", \"undef\", \"values\", \"group\",\n \"minus\", \"in\", \"not\", \"service\", \"silent\", \"using\", \"insert\", \"delete\", \"union\",\n \"true\", \"false\", \"with\",\n \"data\", \"copy\", \"to\", \"move\", \"add\", \"create\", \"drop\", \"clear\", \"load\"]);\n var operatorChars = /[*+\\-<>=&|\\^\\/!\\?]/;\n\n function tokenBase(stream, state) {\n var ch = stream.next();\n curPunc = null;\n if (ch == \"$\" || ch == \"?\") {\n if(ch == \"?\" && stream.match(/\\s/, false)){\n return \"operator\";\n }\n stream.match(/^[\\w\\d]*/);\n return \"variable-2\";\n }\n else if (ch == \"<\" && !stream.match(/^[\\s\\u00a0=]/, false)) {\n stream.match(/^[^\\s\\u00a0>]*>?/);\n return \"atom\";\n }\n else if (ch == \"\\\"\" || ch == \"'\") {\n state.tokenize = tokenLiteral(ch);\n return state.tokenize(stream, state);\n }\n else if (/[{}\\(\\),\\.;\\[\\]]/.test(ch)) {\n curPunc = ch;\n return \"bracket\";\n }\n else if (ch == \"#\") {\n stream.skipToEnd();\n return \"comment\";\n }\n else if (operatorChars.test(ch)) {\n stream.eatWhile(operatorChars);\n return \"operator\";\n }\n else if (ch == \":\") {\n stream.eatWhile(/[\\w\\d\\._\\-]/);\n return \"atom\";\n }\n else if (ch == \"@\") {\n stream.eatWhile(/[a-z\\d\\-]/i);\n return \"meta\";\n }\n else {\n stream.eatWhile(/[_\\w\\d]/);\n if (stream.eat(\":\")) {\n stream.eatWhile(/[\\w\\d_\\-]/);\n return \"atom\";\n }\n var word = stream.current();\n if (ops.test(word))\n return \"builtin\";\n else if (keywords.test(word))\n return \"keyword\";\n else\n return \"variable\";\n }\n }\n\n function tokenLiteral(quote) {\n return function(stream, state) {\n var escaped = false, ch;\n while ((ch = stream.next()) != null) {\n if (ch == quote && !escaped) {\n state.tokenize = tokenBase;\n break;\n }\n escaped = !escaped && ch == \"\\\\\";\n }\n return \"string\";\n };\n }\n\n function pushContext(state, type, col) {\n state.context = {prev: state.context, indent: state.indent, col: col, type: type};\n }\n function popContext(state) {\n state.indent = state.context.indent;\n state.context = state.context.prev;\n }\n\n return {\n startState: function() {\n return {tokenize: tokenBase,\n context: null,\n indent: 0,\n col: 0};\n },\n\n token: function(stream, state) {\n if (stream.sol()) {\n if (state.context && state.context.align == null) state.context.align = false;\n state.indent = stream.indentation();\n }\n if (stream.eatSpace()) return null;\n var style = state.tokenize(stream, state);\n\n if (style != \"comment\" && state.context && state.context.align == null && state.context.type != \"pattern\") {\n state.context.align = true;\n }\n\n if (curPunc == \"(\") pushContext(state, \")\", stream.column());\n else if (curPunc == \"[\") pushContext(state, \"]\", stream.column());\n else if (curPunc == \"{\") pushContext(state, \"}\", stream.column());\n else if (/[\\]\\}\\)]/.test(curPunc)) {\n while (state.context && state.context.type == \"pattern\") popContext(state);\n if (state.context && curPunc == state.context.type) {\n popContext(state);\n if (curPunc == \"}\" && state.context && state.context.type == \"pattern\")\n popContext(state);\n }\n }\n else if (curPunc == \".\" && state.context && state.context.type == \"pattern\") popContext(state);\n else if (/atom|string|variable/.test(style) && state.context) {\n if (/[\\}\\]]/.test(state.context.type))\n pushContext(state, \"pattern\", stream.column());\n else if (state.context.type == \"pattern\" && !state.context.align) {\n state.context.align = true;\n state.context.col = stream.column();\n }\n }\n\n return style;\n },\n\n indent: function(state, textAfter) {\n var firstChar = textAfter && textAfter.charAt(0);\n var context = state.context;\n if (/[\\]\\}]/.test(firstChar))\n while (context && context.type == \"pattern\") context = context.prev;\n\n var closing = context && firstChar == context.type;\n if (!context)\n return 0;\n else if (context.type == \"pattern\")\n return context.col;\n else if (context.align)\n return context.col + (closing ? 0 : 1);\n else\n return context.indent + (closing ? 0 : indentUnit);\n },\n\n lineComment: \"#\"\n };\n});\n\nCodeMirror.defineMIME(\"application/sparql-query\", \"sparql\");\n\n});\n","// 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\"), require(\"./foldcode\"));\n else if (typeof define == \"function\" && define.amd) // AMD\n define([\"../../lib/codemirror\", \"./foldcode\"], mod);\n else // Plain browser env\n mod(CodeMirror);\n})(function(CodeMirror) {\n \"use strict\";\n\n CodeMirror.defineOption(\"foldGutter\", false, function(cm, val, old) {\n if (old && old != CodeMirror.Init) {\n cm.clearGutter(cm.state.foldGutter.options.gutter);\n cm.state.foldGutter = null;\n cm.off(\"gutterClick\", onGutterClick);\n cm.off(\"change\", onChange);\n cm.off(\"viewportChange\", onViewportChange);\n cm.off(\"fold\", onFold);\n cm.off(\"unfold\", onFold);\n cm.off(\"swapDoc\", onChange);\n }\n if (val) {\n cm.state.foldGutter = new State(parseOptions(val));\n updateInViewport(cm);\n cm.on(\"gutterClick\", onGutterClick);\n cm.on(\"change\", onChange);\n cm.on(\"viewportChange\", onViewportChange);\n cm.on(\"fold\", onFold);\n cm.on(\"unfold\", onFold);\n cm.on(\"swapDoc\", onChange);\n }\n });\n\n var Pos = CodeMirror.Pos;\n\n function State(options) {\n this.options = options;\n this.from = this.to = 0;\n }\n\n function parseOptions(opts) {\n if (opts === true) opts = {};\n if (opts.gutter == null) opts.gutter = \"CodeMirror-foldgutter\";\n if (opts.indicatorOpen == null) opts.indicatorOpen = \"CodeMirror-foldgutter-open\";\n if (opts.indicatorFolded == null) opts.indicatorFolded = \"CodeMirror-foldgutter-folded\";\n return opts;\n }\n\n function isFolded(cm, line) {\n var marks = cm.findMarks(Pos(line, 0), Pos(line + 1, 0));\n for (var i = 0; i < marks.length; ++i)\n if (marks[i].__isFold && marks[i].find().from.line == line) return marks[i];\n }\n\n function marker(spec) {\n if (typeof spec == \"string\") {\n var elt = document.createElement(\"div\");\n elt.className = spec + \" CodeMirror-guttermarker-subtle\";\n return elt;\n } else {\n return spec.cloneNode(true);\n }\n }\n\n function updateFoldInfo(cm, from, to) {\n var opts = cm.state.foldGutter.options, cur = from;\n var minSize = cm.foldOption(opts, \"minFoldSize\");\n var func = cm.foldOption(opts, \"rangeFinder\");\n cm.eachLine(from, to, function(line) {\n var mark = null;\n if (isFolded(cm, cur)) {\n mark = marker(opts.indicatorFolded);\n } else {\n var pos = Pos(cur, 0);\n var range = func && func(cm, pos);\n if (range && range.to.line - range.from.line >= minSize)\n mark = marker(opts.indicatorOpen);\n }\n cm.setGutterMarker(line, opts.gutter, mark);\n ++cur;\n });\n }\n\n function updateInViewport(cm) {\n var vp = cm.getViewport(), state = cm.state.foldGutter;\n if (!state) return;\n cm.operation(function() {\n updateFoldInfo(cm, vp.from, vp.to);\n });\n state.from = vp.from; state.to = vp.to;\n }\n\n function onGutterClick(cm, line, gutter) {\n var state = cm.state.foldGutter;\n if (!state) return;\n var opts = state.options;\n if (gutter != opts.gutter) return;\n var folded = isFolded(cm, line);\n if (folded) folded.clear();\n else cm.foldCode(Pos(line, 0), opts.rangeFinder);\n }\n\n function onChange(cm) {\n var state = cm.state.foldGutter;\n if (!state) return;\n var opts = state.options;\n state.from = state.to = 0;\n clearTimeout(state.changeUpdate);\n state.changeUpdate = setTimeout(function() { updateInViewport(cm); }, opts.foldOnChangeTimeSpan || 600);\n }\n\n function onViewportChange(cm) {\n var state = cm.state.foldGutter;\n if (!state) return;\n var opts = state.options;\n clearTimeout(state.changeUpdate);\n state.changeUpdate = setTimeout(function() {\n var vp = cm.getViewport();\n if (state.from == state.to || vp.from - state.to > 20 || state.from - vp.to > 20) {\n updateInViewport(cm);\n } else {\n cm.operation(function() {\n if (vp.from < state.from) {\n updateFoldInfo(cm, vp.from, state.from);\n state.from = vp.from;\n }\n if (vp.to > state.to) {\n updateFoldInfo(cm, state.to, vp.to);\n state.to = vp.to;\n }\n });\n }\n }, opts.updateViewportTimeSpan || 400);\n }\n\n function onFold(cm, from) {\n var state = cm.state.foldGutter;\n if (!state) return;\n var line = from.line;\n if (line >= state.from && line < state.to)\n updateFoldInfo(cm, line, line + 1);\n }\n});\n","// 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.runMode = function(string, modespec, callback, options) {\n var mode = CodeMirror.getMode(CodeMirror.defaults, modespec);\n var ie = /MSIE \\d/.test(navigator.userAgent);\n var ie_lt9 = ie && (document.documentMode == null || document.documentMode < 9);\n\n if (callback.appendChild) {\n var tabSize = (options && options.tabSize) || CodeMirror.defaults.tabSize;\n var node = callback, col = 0;\n node.innerHTML = \"\";\n callback = function(text, style) {\n if (text == \"\\n\") {\n // Emitting LF or CRLF on IE8 or earlier results in an incorrect display.\n // Emitting a carriage return makes everything ok.\n node.appendChild(document.createTextNode(ie_lt9 ? '\\r' : text));\n col = 0;\n return;\n }\n var content = \"\";\n // replace tabs\n for (var pos = 0;;) {\n var idx = text.indexOf(\"\\t\", pos);\n if (idx == -1) {\n content += text.slice(pos);\n col += text.length - pos;\n break;\n } else {\n col += idx - pos;\n content += text.slice(pos, idx);\n var size = tabSize - col % tabSize;\n col += size;\n for (var i = 0; i < size; ++i) content += \" \";\n pos = idx + 1;\n }\n }\n\n if (style) {\n var sp = node.appendChild(document.createElement(\"span\"));\n sp.className = \"cm-\" + style.replace(/ +/g, \" cm-\");\n sp.appendChild(document.createTextNode(content));\n } else {\n node.appendChild(document.createTextNode(content));\n }\n };\n }\n\n var lines = CodeMirror.splitLines(string), state = (options && options.state) || CodeMirror.startState(mode);\n for (var i = 0, e = lines.length; i < e; ++i) {\n if (i) callback(\"\\n\");\n var stream = new CodeMirror.StringStream(lines[i]);\n if (!stream.string && mode.blankLine) mode.blankLine(state);\n while (!stream.eol()) {\n var style = mode.token(stream, state);\n callback(stream.current(), style, i, stream.start, state);\n stream.start = stream.pos;\n }\n }\n};\n\n});\n","// 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\nfunction Context(indented, column, type, info, align, prev) {\n this.indented = indented;\n this.column = column;\n this.type = type;\n this.info = info;\n this.align = align;\n this.prev = prev;\n}\nfunction pushContext(state, col, type, info) {\n var indent = state.indented;\n if (state.context && state.context.type != \"statement\" && type != \"statement\")\n indent = state.context.indented;\n return state.context = new Context(indent, col, type, info, null, state.context);\n}\nfunction popContext(state) {\n var t = state.context.type;\n if (t == \")\" || t == \"]\" || t == \"}\")\n state.indented = state.context.indented;\n return state.context = state.context.prev;\n}\n\nfunction typeBefore(stream, state, pos) {\n if (state.prevToken == \"variable\" || state.prevToken == \"variable-3\") return true;\n if (/\\S(?:[^- ]>|[*\\]])\\s*$|\\*$/.test(stream.string.slice(0, pos))) return true;\n if (state.typeAtEndOfLine && stream.column() == stream.indentation()) return true;\n}\n\nfunction isTopScope(context) {\n for (;;) {\n if (!context || context.type == \"top\") return true;\n if (context.type == \"}\" && context.prev.info != \"namespace\") return false;\n context = context.prev;\n }\n}\n\nCodeMirror.defineMode(\"clike\", function(config, parserConfig) {\n var indentUnit = config.indentUnit,\n statementIndentUnit = parserConfig.statementIndentUnit || indentUnit,\n dontAlignCalls = parserConfig.dontAlignCalls,\n keywords = parserConfig.keywords || {},\n types = parserConfig.types || {},\n builtin = parserConfig.builtin || {},\n blockKeywords = parserConfig.blockKeywords || {},\n defKeywords = parserConfig.defKeywords || {},\n atoms = parserConfig.atoms || {},\n hooks = parserConfig.hooks || {},\n multiLineStrings = parserConfig.multiLineStrings,\n indentStatements = parserConfig.indentStatements !== false,\n indentSwitch = parserConfig.indentSwitch !== false,\n namespaceSeparator = parserConfig.namespaceSeparator,\n isPunctuationChar = parserConfig.isPunctuationChar || /[\\[\\]{}\\(\\),;\\:\\.]/,\n numberStart = parserConfig.numberStart || /[\\d\\.]/,\n number = parserConfig.number || /^(?:0x[a-f\\d]+|0b[01]+|(?:\\d+\\.?\\d*|\\.\\d+)(?:e[-+]?\\d+)?)(u|ll?|l|f)?/i,\n isOperatorChar = parserConfig.isOperatorChar || /[+\\-*&%=<>!?|\\/]/,\n endStatement = parserConfig.endStatement || /^[;:,]$/;\n\n var curPunc, isDefKeyword;\n\n function tokenBase(stream, state) {\n var ch = stream.next();\n if (hooks[ch]) {\n var result = hooks[ch](stream, state);\n if (result !== false) return result;\n }\n if (ch == '\"' || ch == \"'\") {\n state.tokenize = tokenString(ch);\n return state.tokenize(stream, state);\n }\n if (isPunctuationChar.test(ch)) {\n curPunc = ch;\n return null;\n }\n if (numberStart.test(ch)) {\n stream.backUp(1)\n if (stream.match(number)) return \"number\"\n stream.next()\n }\n if (ch == \"/\") {\n if (stream.eat(\"*\")) {\n state.tokenize = tokenComment;\n return tokenComment(stream, state);\n }\n if (stream.eat(\"/\")) {\n stream.skipToEnd();\n return \"comment\";\n }\n }\n if (isOperatorChar.test(ch)) {\n while (!stream.match(/^\\/[\\/*]/, false) && stream.eat(isOperatorChar)) {}\n return \"operator\";\n }\n stream.eatWhile(/[\\w\\$_\\xa1-\\uffff]/);\n if (namespaceSeparator) while (stream.match(namespaceSeparator))\n stream.eatWhile(/[\\w\\$_\\xa1-\\uffff]/);\n\n var cur = stream.current();\n if (contains(keywords, cur)) {\n if (contains(blockKeywords, cur)) curPunc = \"newstatement\";\n if (contains(defKeywords, cur)) isDefKeyword = true;\n return \"keyword\";\n }\n if (contains(types, cur)) return \"variable-3\";\n if (contains(builtin, cur)) {\n if (contains(blockKeywords, cur)) curPunc = \"newstatement\";\n return \"builtin\";\n }\n if (contains(atoms, cur)) return \"atom\";\n return \"variable\";\n }\n\n function tokenString(quote) {\n return function(stream, state) {\n var escaped = false, next, end = false;\n while ((next = stream.next()) != null) {\n if (next == quote && !escaped) {end = true; break;}\n escaped = !escaped && next == \"\\\\\";\n }\n if (end || !(escaped || multiLineStrings))\n state.tokenize = null;\n return \"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 = null;\n break;\n }\n maybeEnd = (ch == \"*\");\n }\n return \"comment\";\n }\n\n function maybeEOL(stream, state) {\n if (parserConfig.typeFirstDefinitions && stream.eol() && isTopScope(state.context))\n state.typeAtEndOfLine = typeBefore(stream, state, stream.pos)\n }\n\n // Interface\n\n return {\n startState: function(basecolumn) {\n return {\n tokenize: null,\n context: new Context((basecolumn || 0) - indentUnit, 0, \"top\", null, false),\n indented: 0,\n startOfLine: true,\n prevToken: null\n };\n },\n\n token: function(stream, state) {\n var ctx = state.context;\n if (stream.sol()) {\n if (ctx.align == null) ctx.align = false;\n state.indented = stream.indentation();\n state.startOfLine = true;\n }\n if (stream.eatSpace()) { maybeEOL(stream, state); return null; }\n curPunc = isDefKeyword = null;\n var style = (state.tokenize || tokenBase)(stream, state);\n if (style == \"comment\" || style == \"meta\") return style;\n if (ctx.align == null) ctx.align = true;\n\n if (endStatement.test(curPunc)) while (state.context.type == \"statement\") popContext(state);\n else if (curPunc == \"{\") pushContext(state, stream.column(), \"}\");\n else if (curPunc == \"[\") pushContext(state, stream.column(), \"]\");\n else if (curPunc == \"(\") pushContext(state, stream.column(), \")\");\n else if (curPunc == \"}\") {\n while (ctx.type == \"statement\") ctx = popContext(state);\n if (ctx.type == \"}\") ctx = popContext(state);\n while (ctx.type == \"statement\") ctx = popContext(state);\n }\n else if (curPunc == ctx.type) popContext(state);\n else if (indentStatements &&\n (((ctx.type == \"}\" || ctx.type == \"top\") && curPunc != \";\") ||\n (ctx.type == \"statement\" && curPunc == \"newstatement\"))) {\n pushContext(state, stream.column(), \"statement\", stream.current());\n }\n\n if (style == \"variable\" &&\n ((state.prevToken == \"def\" ||\n (parserConfig.typeFirstDefinitions && typeBefore(stream, state, stream.start) &&\n isTopScope(state.context) && stream.match(/^\\s*\\(/, false)))))\n style = \"def\";\n\n if (hooks.token) {\n var result = hooks.token(stream, state, style);\n if (result !== undefined) style = result;\n }\n\n if (style == \"def\" && parserConfig.styleDefs === false) style = \"variable\";\n\n state.startOfLine = false;\n state.prevToken = isDefKeyword ? \"def\" : style || curPunc;\n maybeEOL(stream, state);\n return style;\n },\n\n indent: function(state, textAfter) {\n if (state.tokenize != tokenBase && state.tokenize != null || state.typeAtEndOfLine) return CodeMirror.Pass;\n var ctx = state.context, firstChar = textAfter && textAfter.charAt(0);\n if (ctx.type == \"statement\" && firstChar == \"}\") ctx = ctx.prev;\n if (parserConfig.dontIndentStatements)\n while (ctx.type == \"statement\" && parserConfig.dontIndentStatements.test(ctx.info))\n ctx = ctx.prev\n if (hooks.indent) {\n var hook = hooks.indent(state, ctx, textAfter);\n if (typeof hook == \"number\") return hook\n }\n var closing = firstChar == ctx.type;\n var switchBlock = ctx.prev && ctx.prev.info == \"switch\";\n if (parserConfig.allmanIndentation && /[{(]/.test(firstChar)) {\n while (ctx.type != \"top\" && ctx.type != \"}\") ctx = ctx.prev\n return ctx.indented\n }\n if (ctx.type == \"statement\")\n return ctx.indented + (firstChar == \"{\" ? 0 : statementIndentUnit);\n if (ctx.align && (!dontAlignCalls || ctx.type != \")\"))\n return ctx.column + (closing ? 0 : 1);\n if (ctx.type == \")\" && !closing)\n return ctx.indented + statementIndentUnit;\n\n return ctx.indented + (closing ? 0 : indentUnit) +\n (!closing && switchBlock && !/^(?:case|default)\\b/.test(textAfter) ? indentUnit : 0);\n },\n\n electricInput: indentSwitch ? /^\\s*(?:case .*?:|default:|\\{\\}?|\\})$/ : /^\\s*[{}]$/,\n blockCommentStart: \"/*\",\n blockCommentEnd: \"*/\",\n lineComment: \"//\",\n fold: \"brace\"\n };\n});\n\n function words(str) {\n var obj = {}, words = str.split(\" \");\n for (var i = 0; i < words.length; ++i) obj[words[i]] = true;\n return obj;\n }\n function contains(words, word) {\n if (typeof words === \"function\") {\n return words(word);\n } else {\n return words.propertyIsEnumerable(word);\n }\n }\n var cKeywords = \"auto if break case register continue return default do sizeof \" +\n \"static else struct switch extern typedef union for goto while enum const volatile\";\n var cTypes = \"int long char short double float unsigned signed void size_t ptrdiff_t\";\n\n function cppHook(stream, state) {\n if (!state.startOfLine) return false\n for (var ch, next = null; ch = stream.peek();) {\n if (ch == \"\\\\\" && stream.match(/^.$/)) {\n next = cppHook\n break\n } else if (ch == \"/\" && stream.match(/^\\/[\\/\\*]/, false)) {\n break\n }\n stream.next()\n }\n state.tokenize = next\n return \"meta\"\n }\n\n function pointerHook(_stream, state) {\n if (state.prevToken == \"variable-3\") return \"variable-3\";\n return false;\n }\n\n function cpp14Literal(stream) {\n stream.eatWhile(/[\\w\\.']/);\n return \"number\";\n }\n\n function cpp11StringHook(stream, state) {\n stream.backUp(1);\n // Raw strings.\n if (stream.match(/(R|u8R|uR|UR|LR)/)) {\n var match = stream.match(/\"([^\\s\\\\()]{0,16})\\(/);\n if (!match) {\n return false;\n }\n state.cpp11RawStringDelim = match[1];\n state.tokenize = tokenRawString;\n return tokenRawString(stream, state);\n }\n // Unicode strings/chars.\n if (stream.match(/(u8|u|U|L)/)) {\n if (stream.match(/[\"']/, /* eat */ false)) {\n return \"string\";\n }\n return false;\n }\n // Ignore this hook.\n stream.next();\n return false;\n }\n\n function cppLooksLikeConstructor(word) {\n var lastTwo = /(\\w+)::(\\w+)$/.exec(word);\n return lastTwo && lastTwo[1] == lastTwo[2];\n }\n\n // C#-style strings where \"\" escapes a quote.\n function tokenAtString(stream, state) {\n var next;\n while ((next = stream.next()) != null) {\n if (next == '\"' && !stream.eat('\"')) {\n state.tokenize = null;\n break;\n }\n }\n return \"string\";\n }\n\n // C++11 raw string literal is \"( anything )\", where\n // can be a string up to 16 characters long.\n function tokenRawString(stream, state) {\n // Escape characters that have special regex meanings.\n var delim = state.cpp11RawStringDelim.replace(/[^\\w\\s]/g, '\\\\$&');\n var match = stream.match(new RegExp(\".*?\\\\)\" + delim + '\"'));\n if (match)\n state.tokenize = null;\n else\n stream.skipToEnd();\n return \"string\";\n }\n\n function def(mimes, mode) {\n if (typeof mimes == \"string\") mimes = [mimes];\n var words = [];\n function add(obj) {\n if (obj) for (var prop in obj) if (obj.hasOwnProperty(prop))\n words.push(prop);\n }\n add(mode.keywords);\n add(mode.types);\n add(mode.builtin);\n add(mode.atoms);\n if (words.length) {\n mode.helperType = mimes[0];\n CodeMirror.registerHelper(\"hintWords\", mimes[0], words);\n }\n\n for (var i = 0; i < mimes.length; ++i)\n CodeMirror.defineMIME(mimes[i], mode);\n }\n\n def([\"text/x-csrc\", \"text/x-c\", \"text/x-chdr\"], {\n name: \"clike\",\n keywords: words(cKeywords),\n types: words(cTypes + \" bool _Complex _Bool float_t double_t intptr_t intmax_t \" +\n \"int8_t int16_t int32_t int64_t uintptr_t uintmax_t uint8_t uint16_t \" +\n \"uint32_t uint64_t\"),\n blockKeywords: words(\"case do else for if switch while struct\"),\n defKeywords: words(\"struct\"),\n typeFirstDefinitions: true,\n atoms: words(\"null true false\"),\n hooks: {\"#\": cppHook, \"*\": pointerHook},\n modeProps: {fold: [\"brace\", \"include\"]}\n });\n\n def([\"text/x-c++src\", \"text/x-c++hdr\"], {\n name: \"clike\",\n keywords: words(cKeywords + \" asm dynamic_cast namespace reinterpret_cast try explicit new \" +\n \"static_cast typeid catch operator template typename class friend private \" +\n \"this using const_cast inline public throw virtual delete mutable protected \" +\n \"alignas alignof constexpr decltype nullptr noexcept thread_local final \" +\n \"static_assert override\"),\n types: words(cTypes + \" bool wchar_t\"),\n blockKeywords: words(\"catch class do else finally for if struct switch try while\"),\n defKeywords: words(\"class namespace struct enum union\"),\n typeFirstDefinitions: true,\n atoms: words(\"true false null\"),\n dontIndentStatements: /^template$/,\n hooks: {\n \"#\": cppHook,\n \"*\": pointerHook,\n \"u\": cpp11StringHook,\n \"U\": cpp11StringHook,\n \"L\": cpp11StringHook,\n \"R\": cpp11StringHook,\n \"0\": cpp14Literal,\n \"1\": cpp14Literal,\n \"2\": cpp14Literal,\n \"3\": cpp14Literal,\n \"4\": cpp14Literal,\n \"5\": cpp14Literal,\n \"6\": cpp14Literal,\n \"7\": cpp14Literal,\n \"8\": cpp14Literal,\n \"9\": cpp14Literal,\n token: function(stream, state, style) {\n if (style == \"variable\" && stream.peek() == \"(\" &&\n (state.prevToken == \";\" || state.prevToken == null ||\n state.prevToken == \"}\") &&\n cppLooksLikeConstructor(stream.current()))\n return \"def\";\n }\n },\n namespaceSeparator: \"::\",\n modeProps: {fold: [\"brace\", \"include\"]}\n });\n\n def(\"text/x-java\", {\n name: \"clike\",\n keywords: words(\"abstract assert break case catch class const continue default \" +\n \"do else enum extends final finally float for goto if implements import \" +\n \"instanceof interface native new package private protected public \" +\n \"return static strictfp super switch synchronized this throw throws transient \" +\n \"try volatile while\"),\n types: words(\"byte short int long float double boolean char void Boolean Byte Character Double Float \" +\n \"Integer Long Number Object Short String StringBuffer StringBuilder Void\"),\n blockKeywords: words(\"catch class do else finally for if switch try while\"),\n defKeywords: words(\"class interface package enum\"),\n typeFirstDefinitions: true,\n atoms: words(\"true false null\"),\n endStatement: /^[;:]$/,\n number: /^(?:0x[a-f\\d_]+|0b[01_]+|(?:[\\d_]+\\.?\\d*|\\.\\d+)(?:e[-+]?[\\d_]+)?)(u|ll?|l|f)?/i,\n hooks: {\n \"@\": function(stream) {\n stream.eatWhile(/[\\w\\$_]/);\n return \"meta\";\n }\n },\n modeProps: {fold: [\"brace\", \"import\"]}\n });\n\n def(\"text/x-csharp\", {\n name: \"clike\",\n keywords: words(\"abstract as async await base break case catch checked class const continue\" +\n \" default delegate do else enum event explicit extern finally fixed for\" +\n \" foreach goto if implicit in interface internal is lock namespace new\" +\n \" operator out override params private protected public readonly ref return sealed\" +\n \" sizeof stackalloc static struct switch this throw try typeof unchecked\" +\n \" unsafe using virtual void volatile while add alias ascending descending dynamic from get\" +\n \" global group into join let orderby partial remove select set value var yield\"),\n types: words(\"Action Boolean Byte Char DateTime DateTimeOffset Decimal Double Func\" +\n \" Guid Int16 Int32 Int64 Object SByte Single String Task TimeSpan UInt16 UInt32\" +\n \" UInt64 bool byte char decimal double short int long object\" +\n \" sbyte float string ushort uint ulong\"),\n blockKeywords: words(\"catch class do else finally for foreach if struct switch try while\"),\n defKeywords: words(\"class interface namespace struct var\"),\n typeFirstDefinitions: true,\n atoms: words(\"true false null\"),\n hooks: {\n \"@\": function(stream, state) {\n if (stream.eat('\"')) {\n state.tokenize = tokenAtString;\n return tokenAtString(stream, state);\n }\n stream.eatWhile(/[\\w\\$_]/);\n return \"meta\";\n }\n }\n });\n\n function tokenTripleString(stream, state) {\n var escaped = false;\n while (!stream.eol()) {\n if (!escaped && stream.match('\"\"\"')) {\n state.tokenize = null;\n break;\n }\n escaped = stream.next() == \"\\\\\" && !escaped;\n }\n return \"string\";\n }\n\n def(\"text/x-scala\", {\n name: \"clike\",\n keywords: words(\n\n /* scala */\n \"abstract case catch class def do else extends final finally for forSome if \" +\n \"implicit import lazy match new null object override package private protected return \" +\n \"sealed super this throw trait try type val var while with yield _ : = => <- <: \" +\n \"<% >: # @ \" +\n\n /* package scala */\n \"assert assume require print println printf readLine readBoolean readByte readShort \" +\n \"readChar readInt readLong readFloat readDouble \" +\n\n \":: #:: \"\n ),\n types: words(\n \"AnyVal App Application Array BufferedIterator BigDecimal BigInt Char Console Either \" +\n \"Enumeration Equiv Error Exception Fractional Function IndexedSeq Int Integral Iterable \" +\n \"Iterator List Map Numeric Nil NotNull Option Ordered Ordering PartialFunction PartialOrdering \" +\n \"Product Proxy Range Responder Seq Serializable Set Specializable Stream StringBuilder \" +\n \"StringContext Symbol Throwable Traversable TraversableOnce Tuple Unit Vector \" +\n\n /* package java.lang */\n \"Boolean Byte Character CharSequence Class ClassLoader Cloneable Comparable \" +\n \"Compiler Double Exception Float Integer Long Math Number Object Package Pair Process \" +\n \"Runtime Runnable SecurityManager Short StackTraceElement StrictMath String \" +\n \"StringBuffer System Thread ThreadGroup ThreadLocal Throwable Triple Void\"\n ),\n multiLineStrings: true,\n blockKeywords: words(\"catch class do else finally for forSome if match switch try while\"),\n defKeywords: words(\"class def object package trait type val var\"),\n atoms: words(\"true false null\"),\n indentStatements: false,\n indentSwitch: false,\n hooks: {\n \"@\": function(stream) {\n stream.eatWhile(/[\\w\\$_]/);\n return \"meta\";\n },\n '\"': function(stream, state) {\n if (!stream.match('\"\"')) return false;\n state.tokenize = tokenTripleString;\n return state.tokenize(stream, state);\n },\n \"'\": function(stream) {\n stream.eatWhile(/[\\w\\$_\\xa1-\\uffff]/);\n return \"atom\";\n },\n \"=\": function(stream, state) {\n var cx = state.context\n if (cx.type == \"}\" && cx.align && stream.eat(\">\")) {\n state.context = new Context(cx.indented, cx.column, cx.type, cx.info, null, cx.prev)\n return \"operator\"\n } else {\n return false\n }\n }\n },\n modeProps: {closeBrackets: {triples: '\"'}}\n });\n\n function tokenKotlinString(tripleString){\n return function (stream, state) {\n var escaped = false, next, end = false;\n while (!stream.eol()) {\n if (!tripleString && !escaped && stream.match('\"') ) {end = true; break;}\n if (tripleString && stream.match('\"\"\"')) {end = true; break;}\n next = stream.next();\n if(!escaped && next == \"$\" && stream.match('{'))\n stream.skipTo(\"}\");\n escaped = !escaped && next == \"\\\\\" && !tripleString;\n }\n if (end || !tripleString)\n state.tokenize = null;\n return \"string\";\n }\n }\n\n def(\"text/x-kotlin\", {\n name: \"clike\",\n keywords: words(\n /*keywords*/\n \"package as typealias class interface this super val \" +\n \"var fun for is in This throw return \" +\n \"break continue object if else while do try when !in !is as? \" +\n\n /*soft keywords*/\n \"file import where by get set abstract enum open inner override private public internal \" +\n \"protected catch finally out final vararg reified dynamic companion constructor init \" +\n \"sealed field property receiver param sparam lateinit data inline noinline tailrec \" +\n \"external annotation crossinline const operator infix\"\n ),\n types: words(\n /* package java.lang */\n \"Boolean Byte Character CharSequence Class ClassLoader Cloneable Comparable \" +\n \"Compiler Double Exception Float Integer Long Math Number Object Package Pair Process \" +\n \"Runtime Runnable SecurityManager Short StackTraceElement StrictMath String \" +\n \"StringBuffer System Thread ThreadGroup ThreadLocal Throwable Triple Void\"\n ),\n intendSwitch: false,\n indentStatements: false,\n multiLineStrings: true,\n blockKeywords: words(\"catch class do else finally for if where try while enum\"),\n defKeywords: words(\"class val var object package interface fun\"),\n atoms: words(\"true false null this\"),\n hooks: {\n '\"': function(stream, state) {\n state.tokenize = tokenKotlinString(stream.match('\"\"'));\n return state.tokenize(stream, state);\n }\n },\n modeProps: {closeBrackets: {triples: '\"'}}\n });\n\n def([\"x-shader/x-vertex\", \"x-shader/x-fragment\"], {\n name: \"clike\",\n keywords: words(\"sampler1D sampler2D sampler3D samplerCube \" +\n \"sampler1DShadow sampler2DShadow \" +\n \"const attribute uniform varying \" +\n \"break continue discard return \" +\n \"for while do if else struct \" +\n \"in out inout\"),\n types: words(\"float int bool void \" +\n \"vec2 vec3 vec4 ivec2 ivec3 ivec4 bvec2 bvec3 bvec4 \" +\n \"mat2 mat3 mat4\"),\n blockKeywords: words(\"for while do if else struct\"),\n builtin: words(\"radians degrees sin cos tan asin acos atan \" +\n \"pow exp log exp2 sqrt inversesqrt \" +\n \"abs sign floor ceil fract mod min max clamp mix step smoothstep \" +\n \"length distance dot cross normalize ftransform faceforward \" +\n \"reflect refract matrixCompMult \" +\n \"lessThan lessThanEqual greaterThan greaterThanEqual \" +\n \"equal notEqual any all not \" +\n \"texture1D texture1DProj texture1DLod texture1DProjLod \" +\n \"texture2D texture2DProj texture2DLod texture2DProjLod \" +\n \"texture3D texture3DProj texture3DLod texture3DProjLod \" +\n \"textureCube textureCubeLod \" +\n \"shadow1D shadow2D shadow1DProj shadow2DProj \" +\n \"shadow1DLod shadow2DLod shadow1DProjLod shadow2DProjLod \" +\n \"dFdx dFdy fwidth \" +\n \"noise1 noise2 noise3 noise4\"),\n atoms: words(\"true false \" +\n \"gl_FragColor gl_SecondaryColor gl_Normal gl_Vertex \" +\n \"gl_MultiTexCoord0 gl_MultiTexCoord1 gl_MultiTexCoord2 gl_MultiTexCoord3 \" +\n \"gl_MultiTexCoord4 gl_MultiTexCoord5 gl_MultiTexCoord6 gl_MultiTexCoord7 \" +\n \"gl_FogCoord gl_PointCoord \" +\n \"gl_Position gl_PointSize gl_ClipVertex \" +\n \"gl_FrontColor gl_BackColor gl_FrontSecondaryColor gl_BackSecondaryColor \" +\n \"gl_TexCoord gl_FogFragCoord \" +\n \"gl_FragCoord gl_FrontFacing \" +\n \"gl_FragData gl_FragDepth \" +\n \"gl_ModelViewMatrix gl_ProjectionMatrix gl_ModelViewProjectionMatrix \" +\n \"gl_TextureMatrix gl_NormalMatrix gl_ModelViewMatrixInverse \" +\n \"gl_ProjectionMatrixInverse gl_ModelViewProjectionMatrixInverse \" +\n \"gl_TexureMatrixTranspose gl_ModelViewMatrixInverseTranspose \" +\n \"gl_ProjectionMatrixInverseTranspose \" +\n \"gl_ModelViewProjectionMatrixInverseTranspose \" +\n \"gl_TextureMatrixInverseTranspose \" +\n \"gl_NormalScale gl_DepthRange gl_ClipPlane \" +\n \"gl_Point gl_FrontMaterial gl_BackMaterial gl_LightSource gl_LightModel \" +\n \"gl_FrontLightModelProduct gl_BackLightModelProduct \" +\n \"gl_TextureColor gl_EyePlaneS gl_EyePlaneT gl_EyePlaneR gl_EyePlaneQ \" +\n \"gl_FogParameters \" +\n \"gl_MaxLights gl_MaxClipPlanes gl_MaxTextureUnits gl_MaxTextureCoords \" +\n \"gl_MaxVertexAttribs gl_MaxVertexUniformComponents gl_MaxVaryingFloats \" +\n \"gl_MaxVertexTextureImageUnits gl_MaxTextureImageUnits \" +\n \"gl_MaxFragmentUniformComponents gl_MaxCombineTextureImageUnits \" +\n \"gl_MaxDrawBuffers\"),\n indentSwitch: false,\n hooks: {\"#\": cppHook},\n modeProps: {fold: [\"brace\", \"include\"]}\n });\n\n def(\"text/x-nesc\", {\n name: \"clike\",\n keywords: words(cKeywords + \"as atomic async call command component components configuration event generic \" +\n \"implementation includes interface module new norace nx_struct nx_union post provides \" +\n \"signal task uses abstract extends\"),\n types: words(cTypes),\n blockKeywords: words(\"case do else for if switch while struct\"),\n atoms: words(\"null true false\"),\n hooks: {\"#\": cppHook},\n modeProps: {fold: [\"brace\", \"include\"]}\n });\n\n def(\"text/x-objectivec\", {\n name: \"clike\",\n keywords: words(cKeywords + \"inline restrict _Bool _Complex _Imaginary BOOL Class bycopy byref id IMP in \" +\n \"inout nil oneway out Protocol SEL self super atomic nonatomic retain copy readwrite readonly\"),\n types: words(cTypes),\n atoms: words(\"YES NO NULL NILL ON OFF true false\"),\n hooks: {\n \"@\": function(stream) {\n stream.eatWhile(/[\\w\\$]/);\n return \"keyword\";\n },\n \"#\": cppHook,\n indent: function(_state, ctx, textAfter) {\n if (ctx.type == \"statement\" && /^@\\w/.test(textAfter)) return ctx.indented\n }\n },\n modeProps: {fold: \"brace\"}\n });\n\n def(\"text/x-squirrel\", {\n name: \"clike\",\n keywords: words(\"base break clone continue const default delete enum extends function in class\" +\n \" foreach local resume return this throw typeof yield constructor instanceof static\"),\n types: words(cTypes),\n blockKeywords: words(\"case catch class else for foreach if switch try while\"),\n defKeywords: words(\"function local class\"),\n typeFirstDefinitions: true,\n atoms: words(\"true false null\"),\n hooks: {\"#\": cppHook},\n modeProps: {fold: [\"brace\", \"include\"]}\n });\n\n // Ceylon Strings need to deal with interpolation\n var stringTokenizer = null;\n function tokenCeylonString(type) {\n return function(stream, state) {\n var escaped = false, next, end = false;\n while (!stream.eol()) {\n if (!escaped && stream.match('\"') &&\n (type == \"single\" || stream.match('\"\"'))) {\n end = true;\n break;\n }\n if (!escaped && stream.match('``')) {\n stringTokenizer = tokenCeylonString(type);\n end = true;\n break;\n }\n next = stream.next();\n escaped = type == \"single\" && !escaped && next == \"\\\\\";\n }\n if (end)\n state.tokenize = null;\n return \"string\";\n }\n }\n\n def(\"text/x-ceylon\", {\n name: \"clike\",\n keywords: words(\"abstracts alias assembly assert assign break case catch class continue dynamic else\" +\n \" exists extends finally for function given if import in interface is let module new\" +\n \" nonempty object of out outer package return satisfies super switch then this throw\" +\n \" try value void while\"),\n types: function(word) {\n // In Ceylon all identifiers that start with an uppercase are types\n var first = word.charAt(0);\n return (first === first.toUpperCase() && first !== first.toLowerCase());\n },\n blockKeywords: words(\"case catch class dynamic else finally for function if interface module new object switch try while\"),\n defKeywords: words(\"class dynamic function interface module object package value\"),\n builtin: words(\"abstract actual aliased annotation by default deprecated doc final formal late license\" +\n \" native optional sealed see serializable shared suppressWarnings tagged throws variable\"),\n isPunctuationChar: /[\\[\\]{}\\(\\),;\\:\\.`]/,\n isOperatorChar: /[+\\-*&%=<>!?|^~:\\/]/,\n numberStart: /[\\d#$]/,\n number: /^(?:#[\\da-fA-F_]+|\\$[01_]+|[\\d_]+[kMGTPmunpf]?|[\\d_]+\\.[\\d_]+(?:[eE][-+]?\\d+|[kMGTPmunpf]|)|)/i,\n multiLineStrings: true,\n typeFirstDefinitions: true,\n atoms: words(\"true false null larger smaller equal empty finished\"),\n indentSwitch: false,\n styleDefs: false,\n hooks: {\n \"@\": function(stream) {\n stream.eatWhile(/[\\w\\$_]/);\n return \"meta\";\n },\n '\"': function(stream, state) {\n state.tokenize = tokenCeylonString(stream.match('\"\"') ? \"triple\" : \"single\");\n return state.tokenize(stream, state);\n },\n '`': function(stream, state) {\n if (!stringTokenizer || !stream.match('`')) return false;\n state.tokenize = stringTokenizer;\n stringTokenizer = null;\n return state.tokenize(stream, state);\n },\n \"'\": function(stream) {\n stream.eatWhile(/[\\w\\$_\\xa1-\\uffff]/);\n return \"atom\";\n },\n token: function(_stream, state, style) {\n if ((style == \"variable\" || style == \"variable-3\") &&\n state.prevToken == \".\") {\n return \"variable-2\";\n }\n }\n },\n modeProps: {\n fold: [\"brace\", \"import\"],\n closeBrackets: {triples: '\"'}\n }\n });\n\n});\n","// 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('shell', function() {\n\n var words = {};\n function define(style, string) {\n var split = string.split(' ');\n for(var i = 0; i < split.length; i++) {\n words[split[i]] = style;\n }\n };\n\n // Atoms\n define('atom', 'true false');\n\n // Keywords\n define('keyword', 'if then do else elif while until for in esac fi fin ' +\n 'fil done exit set unset export function');\n\n // Commands\n define('builtin', 'ab awk bash beep cat cc cd chown chmod chroot clear cp ' +\n 'curl cut diff echo find gawk gcc get git grep kill killall ln ls make ' +\n 'mkdir openssl mv nc node npm ping ps restart rm rmdir sed service sh ' +\n 'shopt shred source sort sleep ssh start stop su sudo tee telnet top ' +\n 'touch vi vim wall wc wget who write yes zsh');\n\n function tokenBase(stream, state) {\n if (stream.eatSpace()) return null;\n\n var sol = stream.sol();\n var ch = stream.next();\n\n if (ch === '\\\\') {\n stream.next();\n return null;\n }\n if (ch === '\\'' || ch === '\"' || ch === '`') {\n state.tokens.unshift(tokenString(ch));\n return tokenize(stream, state);\n }\n if (ch === '#') {\n if (sol && stream.eat('!')) {\n stream.skipToEnd();\n return 'meta'; // 'comment'?\n }\n stream.skipToEnd();\n return 'comment';\n }\n if (ch === '$') {\n state.tokens.unshift(tokenDollar);\n return tokenize(stream, state);\n }\n if (ch === '+' || ch === '=') {\n return 'operator';\n }\n if (ch === '-') {\n stream.eat('-');\n stream.eatWhile(/\\w/);\n return 'attribute';\n }\n if (/\\d/.test(ch)) {\n stream.eatWhile(/\\d/);\n if(stream.eol() || !/\\w/.test(stream.peek())) {\n return 'number';\n }\n }\n stream.eatWhile(/[\\w-]/);\n var cur = stream.current();\n if (stream.peek() === '=' && /\\w+/.test(cur)) return 'def';\n return words.hasOwnProperty(cur) ? words[cur] : null;\n }\n\n function tokenString(quote) {\n return function(stream, state) {\n var next, end = false, escaped = false;\n while ((next = stream.next()) != null) {\n if (next === quote && !escaped) {\n end = true;\n break;\n }\n if (next === '$' && !escaped && quote !== '\\'') {\n escaped = true;\n stream.backUp(1);\n state.tokens.unshift(tokenDollar);\n break;\n }\n escaped = !escaped && next === '\\\\';\n }\n if (end || !escaped) {\n state.tokens.shift();\n }\n return (quote === '`' || quote === ')' ? 'quote' : 'string');\n };\n };\n\n var tokenDollar = function(stream, state) {\n if (state.tokens.length > 1) stream.eat('$');\n var ch = stream.next(), hungry = /\\w/;\n if (ch === '{') hungry = /[^}]/;\n if (ch === '(') {\n state.tokens[0] = tokenString(')');\n return tokenize(stream, state);\n }\n if (!/\\d/.test(ch)) {\n stream.eatWhile(hungry);\n stream.eat('}');\n }\n state.tokens.shift();\n return 'def';\n };\n\n function tokenize(stream, state) {\n return (state.tokens[0] || tokenBase) (stream, state);\n };\n\n return {\n startState: function() {return {tokens:[]};},\n token: function(stream, state) {\n return tokenize(stream, state);\n },\n lineComment: '#',\n fold: \"brace\"\n };\n});\n\nCodeMirror.defineMIME('text/x-sh', 'shell');\n\n});\n","module.exports = global[\"CodeMirror\"] = require(\"-!./codemirror.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\n function doFold(cm, pos, options, force) {\n if (options && options.call) {\n var finder = options;\n options = null;\n } else {\n var finder = getOption(cm, options, \"rangeFinder\");\n }\n if (typeof pos == \"number\") pos = CodeMirror.Pos(pos, 0);\n var minSize = getOption(cm, options, \"minFoldSize\");\n\n function getRange(allowFolded) {\n var range = finder(cm, pos);\n if (!range || range.to.line - range.from.line < minSize) return null;\n var marks = cm.findMarksAt(range.from);\n for (var i = 0; i < marks.length; ++i) {\n if (marks[i].__isFold && force !== \"fold\") {\n if (!allowFolded) return null;\n range.cleared = true;\n marks[i].clear();\n }\n }\n return range;\n }\n\n var range = getRange(true);\n if (getOption(cm, options, \"scanUp\")) while (!range && pos.line > cm.firstLine()) {\n pos = CodeMirror.Pos(pos.line - 1, 0);\n range = getRange(false);\n }\n if (!range || range.cleared || force === \"unfold\") return;\n\n var myWidget = makeWidget(cm, options);\n CodeMirror.on(myWidget, \"mousedown\", function(e) {\n myRange.clear();\n CodeMirror.e_preventDefault(e);\n });\n var myRange = cm.markText(range.from, range.to, {\n replacedWith: myWidget,\n clearOnEnter: getOption(cm, options, \"clearOnEnter\"),\n __isFold: true\n });\n myRange.on(\"clear\", function(from, to) {\n CodeMirror.signal(cm, \"unfold\", cm, from, to);\n });\n CodeMirror.signal(cm, \"fold\", cm, range.from, range.to);\n }\n\n function makeWidget(cm, options) {\n var widget = getOption(cm, options, \"widget\");\n if (typeof widget == \"string\") {\n var text = document.createTextNode(widget);\n widget = document.createElement(\"span\");\n widget.appendChild(text);\n widget.className = \"CodeMirror-foldmarker\";\n }\n return widget;\n }\n\n // Clumsy backwards-compatible interface\n CodeMirror.newFoldFunction = function(rangeFinder, widget) {\n return function(cm, pos) { doFold(cm, pos, {rangeFinder: rangeFinder, widget: widget}); };\n };\n\n // New-style interface\n CodeMirror.defineExtension(\"foldCode\", function(pos, options, force) {\n doFold(this, pos, options, force);\n });\n\n CodeMirror.defineExtension(\"isFolded\", function(pos) {\n var marks = this.findMarksAt(pos);\n for (var i = 0; i < marks.length; ++i)\n if (marks[i].__isFold) return true;\n });\n\n CodeMirror.commands.toggleFold = function(cm) {\n cm.foldCode(cm.getCursor());\n };\n CodeMirror.commands.fold = function(cm) {\n cm.foldCode(cm.getCursor(), null, \"fold\");\n };\n CodeMirror.commands.unfold = function(cm) {\n cm.foldCode(cm.getCursor(), null, \"unfold\");\n };\n CodeMirror.commands.foldAll = function(cm) {\n cm.operation(function() {\n for (var i = cm.firstLine(), e = cm.lastLine(); i <= e; i++)\n cm.foldCode(CodeMirror.Pos(i, 0), null, \"fold\");\n });\n };\n CodeMirror.commands.unfoldAll = function(cm) {\n cm.operation(function() {\n for (var i = cm.firstLine(), e = cm.lastLine(); i <= e; i++)\n cm.foldCode(CodeMirror.Pos(i, 0), null, \"unfold\");\n });\n };\n\n CodeMirror.registerHelper(\"fold\", \"combine\", function() {\n var funcs = Array.prototype.slice.call(arguments, 0);\n return function(cm, start) {\n for (var i = 0; i < funcs.length; ++i) {\n var found = funcs[i](cm, start);\n if (found) return found;\n }\n };\n });\n\n CodeMirror.registerHelper(\"fold\", \"auto\", function(cm, start) {\n var helpers = cm.getHelpers(start, \"fold\");\n for (var i = 0; i < helpers.length; i++) {\n var cur = helpers[i](cm, start);\n if (cur) return cur;\n }\n });\n\n var defaultOptions = {\n rangeFinder: CodeMirror.fold.auto,\n widget: \"\\u2194\",\n minFoldSize: 0,\n scanUp: false,\n clearOnEnter: true\n };\n\n CodeMirror.defineOption(\"foldOptions\", null);\n\n function getOption(cm, options, name) {\n if (options && options[name] !== undefined)\n return options[name];\n var editorOptions = cm.options.foldOptions;\n if (editorOptions && editorOptions[name] !== undefined)\n return editorOptions[name];\n return defaultOptions[name];\n }\n\n CodeMirror.defineExtension(\"foldOption\", function(options, name) {\n return getOption(this, options, name);\n });\n});\n","// 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\nvar htmlConfig = {\n autoSelfClosers: {'area': true, 'base': true, 'br': true, 'col': true, 'command': true,\n 'embed': true, 'frame': true, 'hr': true, 'img': true, 'input': true,\n 'keygen': true, 'link': true, 'meta': true, 'param': true, 'source': true,\n 'track': true, 'wbr': true, 'menuitem': true},\n implicitlyClosed: {'dd': true, 'li': true, 'optgroup': true, 'option': true, 'p': true,\n 'rp': true, 'rt': true, 'tbody': true, 'td': true, 'tfoot': true,\n 'th': true, 'tr': true},\n contextGrabbers: {\n 'dd': {'dd': true, 'dt': true},\n 'dt': {'dd': true, 'dt': true},\n 'li': {'li': true},\n 'option': {'option': true, 'optgroup': true},\n 'optgroup': {'optgroup': true},\n 'p': {'address': true, 'article': true, 'aside': true, 'blockquote': true, 'dir': true,\n 'div': true, 'dl': true, 'fieldset': true, 'footer': true, 'form': true,\n 'h1': true, 'h2': true, 'h3': true, 'h4': true, 'h5': true, 'h6': true,\n 'header': true, 'hgroup': true, 'hr': true, 'menu': true, 'nav': true, 'ol': true,\n 'p': true, 'pre': true, 'section': true, 'table': true, 'ul': true},\n 'rp': {'rp': true, 'rt': true},\n 'rt': {'rp': true, 'rt': true},\n 'tbody': {'tbody': true, 'tfoot': true},\n 'td': {'td': true, 'th': true},\n 'tfoot': {'tbody': true},\n 'th': {'td': true, 'th': true},\n 'thead': {'tbody': true, 'tfoot': true},\n 'tr': {'tr': true}\n },\n doNotIndent: {\"pre\": true},\n allowUnquoted: true,\n allowMissing: true,\n caseFold: true\n}\n\nvar xmlConfig = {\n autoSelfClosers: {},\n implicitlyClosed: {},\n contextGrabbers: {},\n doNotIndent: {},\n allowUnquoted: false,\n allowMissing: false,\n caseFold: false\n}\n\nCodeMirror.defineMode(\"xml\", function(editorConf, config_) {\n var indentUnit = editorConf.indentUnit\n var config = {}\n var defaults = config_.htmlMode ? htmlConfig : xmlConfig\n for (var prop in defaults) config[prop] = defaults[prop]\n for (var prop in config_) config[prop] = config_[prop]\n\n // Return variables for tokenizers\n var type, setStyle;\n\n function inText(stream, state) {\n function chain(parser) {\n state.tokenize = parser;\n return parser(stream, state);\n }\n\n var ch = stream.next();\n if (ch == \"<\") {\n if (stream.eat(\"!\")) {\n if (stream.eat(\"[\")) {\n if (stream.match(\"CDATA[\")) return chain(inBlock(\"atom\", \"]]>\"));\n else return null;\n } else if (stream.match(\"--\")) {\n return chain(inBlock(\"comment\", \"-->\"));\n } else if (stream.match(\"DOCTYPE\", true, true)) {\n stream.eatWhile(/[\\w\\._\\-]/);\n return chain(doctype(1));\n } else {\n return null;\n }\n } else if (stream.eat(\"?\")) {\n stream.eatWhile(/[\\w\\._\\-]/);\n state.tokenize = inBlock(\"meta\", \"?>\");\n return \"meta\";\n } else {\n type = stream.eat(\"/\") ? \"closeTag\" : \"openTag\";\n state.tokenize = inTag;\n return \"tag bracket\";\n }\n } else if (ch == \"&\") {\n var ok;\n if (stream.eat(\"#\")) {\n if (stream.eat(\"x\")) {\n ok = stream.eatWhile(/[a-fA-F\\d]/) && stream.eat(\";\");\n } else {\n ok = stream.eatWhile(/[\\d]/) && stream.eat(\";\");\n }\n } else {\n ok = stream.eatWhile(/[\\w\\.\\-:]/) && stream.eat(\";\");\n }\n return ok ? \"atom\" : \"error\";\n } else {\n stream.eatWhile(/[^&<]/);\n return null;\n }\n }\n inText.isInText = true;\n\n function inTag(stream, state) {\n var ch = stream.next();\n if (ch == \">\" || (ch == \"/\" && stream.eat(\">\"))) {\n state.tokenize = inText;\n type = ch == \">\" ? \"endTag\" : \"selfcloseTag\";\n return \"tag bracket\";\n } else if (ch == \"=\") {\n type = \"equals\";\n return null;\n } else if (ch == \"<\") {\n state.tokenize = inText;\n state.state = baseState;\n state.tagName = state.tagStart = null;\n var next = state.tokenize(stream, state);\n return next ? next + \" tag error\" : \"tag error\";\n } else if (/[\\'\\\"]/.test(ch)) {\n state.tokenize = inAttribute(ch);\n state.stringStartCol = stream.column();\n return state.tokenize(stream, state);\n } else {\n stream.match(/^[^\\s\\u00a0=<>\\\"\\']*[^\\s\\u00a0=<>\\\"\\'\\/]/);\n return \"word\";\n }\n }\n\n function inAttribute(quote) {\n var closure = function(stream, state) {\n while (!stream.eol()) {\n if (stream.next() == quote) {\n state.tokenize = inTag;\n break;\n }\n }\n return \"string\";\n };\n closure.isInAttribute = true;\n return closure;\n }\n\n function inBlock(style, terminator) {\n return function(stream, state) {\n while (!stream.eol()) {\n if (stream.match(terminator)) {\n state.tokenize = inText;\n break;\n }\n stream.next();\n }\n return style;\n };\n }\n function doctype(depth) {\n return function(stream, state) {\n var ch;\n while ((ch = stream.next()) != null) {\n if (ch == \"<\") {\n state.tokenize = doctype(depth + 1);\n return state.tokenize(stream, state);\n } else if (ch == \">\") {\n if (depth == 1) {\n state.tokenize = inText;\n break;\n } else {\n state.tokenize = doctype(depth - 1);\n return state.tokenize(stream, state);\n }\n }\n }\n return \"meta\";\n };\n }\n\n function Context(state, tagName, startOfLine) {\n this.prev = state.context;\n this.tagName = tagName;\n this.indent = state.indented;\n this.startOfLine = startOfLine;\n if (config.doNotIndent.hasOwnProperty(tagName) || (state.context && state.context.noIndent))\n this.noIndent = true;\n }\n function popContext(state) {\n if (state.context) state.context = state.context.prev;\n }\n function maybePopContext(state, nextTagName) {\n var parentTagName;\n while (true) {\n if (!state.context) {\n return;\n }\n parentTagName = state.context.tagName;\n if (!config.contextGrabbers.hasOwnProperty(parentTagName) ||\n !config.contextGrabbers[parentTagName].hasOwnProperty(nextTagName)) {\n return;\n }\n popContext(state);\n }\n }\n\n function baseState(type, stream, state) {\n if (type == \"openTag\") {\n state.tagStart = stream.column();\n return tagNameState;\n } else if (type == \"closeTag\") {\n return closeTagNameState;\n } else {\n return baseState;\n }\n }\n function tagNameState(type, stream, state) {\n if (type == \"word\") {\n state.tagName = stream.current();\n setStyle = \"tag\";\n return attrState;\n } else {\n setStyle = \"error\";\n return tagNameState;\n }\n }\n function closeTagNameState(type, stream, state) {\n if (type == \"word\") {\n var tagName = stream.current();\n if (state.context && state.context.tagName != tagName &&\n config.implicitlyClosed.hasOwnProperty(state.context.tagName))\n popContext(state);\n if ((state.context && state.context.tagName == tagName) || config.matchClosing === false) {\n setStyle = \"tag\";\n return closeState;\n } else {\n setStyle = \"tag error\";\n return closeStateErr;\n }\n } else {\n setStyle = \"error\";\n return closeStateErr;\n }\n }\n\n function closeState(type, _stream, state) {\n if (type != \"endTag\") {\n setStyle = \"error\";\n return closeState;\n }\n popContext(state);\n return baseState;\n }\n function closeStateErr(type, stream, state) {\n setStyle = \"error\";\n return closeState(type, stream, state);\n }\n\n function attrState(type, _stream, state) {\n if (type == \"word\") {\n setStyle = \"attribute\";\n return attrEqState;\n } else if (type == \"endTag\" || type == \"selfcloseTag\") {\n var tagName = state.tagName, tagStart = state.tagStart;\n state.tagName = state.tagStart = null;\n if (type == \"selfcloseTag\" ||\n config.autoSelfClosers.hasOwnProperty(tagName)) {\n maybePopContext(state, tagName);\n } else {\n maybePopContext(state, tagName);\n state.context = new Context(state, tagName, tagStart == state.indented);\n }\n return baseState;\n }\n setStyle = \"error\";\n return attrState;\n }\n function attrEqState(type, stream, state) {\n if (type == \"equals\") return attrValueState;\n if (!config.allowMissing) setStyle = \"error\";\n return attrState(type, stream, state);\n }\n function attrValueState(type, stream, state) {\n if (type == \"string\") return attrContinuedState;\n if (type == \"word\" && config.allowUnquoted) {setStyle = \"string\"; return attrState;}\n setStyle = \"error\";\n return attrState(type, stream, state);\n }\n function attrContinuedState(type, stream, state) {\n if (type == \"string\") return attrContinuedState;\n return attrState(type, stream, state);\n }\n\n return {\n startState: function(baseIndent) {\n var state = {tokenize: inText,\n state: baseState,\n indented: baseIndent || 0,\n tagName: null, tagStart: null,\n context: null}\n if (baseIndent != null) state.baseIndent = baseIndent\n return state\n },\n\n token: function(stream, state) {\n if (!state.tagName && stream.sol())\n state.indented = stream.indentation();\n\n if (stream.eatSpace()) return null;\n type = null;\n var style = state.tokenize(stream, state);\n if ((style || type) && style != \"comment\") {\n setStyle = null;\n state.state = state.state(type || style, stream, state);\n if (setStyle)\n style = setStyle == \"error\" ? style + \" error\" : setStyle;\n }\n return style;\n },\n\n indent: function(state, textAfter, fullLine) {\n var context = state.context;\n // Indent multi-line strings (e.g. css).\n if (state.tokenize.isInAttribute) {\n if (state.tagStart == state.indented)\n return state.stringStartCol + 1;\n else\n return state.indented + indentUnit;\n }\n if (context && context.noIndent) return CodeMirror.Pass;\n if (state.tokenize != inTag && state.tokenize != inText)\n return fullLine ? fullLine.match(/^(\\s*)/)[0].length : 0;\n // Indent the starts of attribute names.\n if (state.tagName) {\n if (config.multilineTagIndentPastTag !== false)\n return state.tagStart + state.tagName.length + 2;\n else\n return state.tagStart + indentUnit * (config.multilineTagIndentFactor || 1);\n }\n if (config.alignCDATA && /$/,\n blockCommentStart: \"\",\n\n configuration: config.htmlMode ? \"html\" : \"xml\",\n helperType: config.htmlMode ? \"html\" : \"xml\",\n\n skipAttribute: function(state) {\n if (state.state == attrValueState)\n state.state = attrState\n }\n };\n});\n\nCodeMirror.defineMIME(\"text/xml\", \"xml\");\nCodeMirror.defineMIME(\"application/xml\", \"xml\");\nif (!CodeMirror.mimeModes.hasOwnProperty(\"text/html\"))\n CodeMirror.defineMIME(\"text/html\", {name: \"xml\", htmlMode: true});\n\n});\n","// 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\n CodeMirror.defineSimpleMode = function(name, states) {\n CodeMirror.defineMode(name, function(config) {\n return CodeMirror.simpleMode(config, states);\n });\n };\n\n CodeMirror.simpleMode = function(config, states) {\n ensureState(states, \"start\");\n var states_ = {}, meta = states.meta || {}, hasIndentation = false;\n for (var state in states) if (state != meta && states.hasOwnProperty(state)) {\n var list = states_[state] = [], orig = states[state];\n for (var i = 0; i < orig.length; i++) {\n var data = orig[i];\n list.push(new Rule(data, states));\n if (data.indent || data.dedent) hasIndentation = true;\n }\n }\n var mode = {\n startState: function() {\n return {state: \"start\", pending: null,\n local: null, localState: null,\n indent: hasIndentation ? [] : null};\n },\n copyState: function(state) {\n var s = {state: state.state, pending: state.pending,\n local: state.local, localState: null,\n indent: state.indent && state.indent.slice(0)};\n if (state.localState)\n s.localState = CodeMirror.copyState(state.local.mode, state.localState);\n if (state.stack)\n s.stack = state.stack.slice(0);\n for (var pers = state.persistentStates; pers; pers = pers.next)\n s.persistentStates = {mode: pers.mode,\n spec: pers.spec,\n state: pers.state == state.localState ? s.localState : CodeMirror.copyState(pers.mode, pers.state),\n next: s.persistentStates};\n return s;\n },\n token: tokenFunction(states_, config),\n innerMode: function(state) { return state.local && {mode: state.local.mode, state: state.localState}; },\n indent: indentFunction(states_, meta)\n };\n if (meta) for (var prop in meta) if (meta.hasOwnProperty(prop))\n mode[prop] = meta[prop];\n return mode;\n };\n\n function ensureState(states, name) {\n if (!states.hasOwnProperty(name))\n throw new Error(\"Undefined state \" + name + \" in simple mode\");\n }\n\n function toRegex(val, caret) {\n if (!val) return /(?:)/;\n var flags = \"\";\n if (val instanceof RegExp) {\n if (val.ignoreCase) flags = \"i\";\n val = val.source;\n } else {\n val = String(val);\n }\n return new RegExp((caret === false ? \"\" : \"^\") + \"(?:\" + val + \")\", flags);\n }\n\n function asToken(val) {\n if (!val) return null;\n if (typeof val == \"string\") return val.replace(/\\./g, \" \");\n var result = [];\n for (var i = 0; i < val.length; i++)\n result.push(val[i] && val[i].replace(/\\./g, \" \"));\n return result;\n }\n\n function Rule(data, states) {\n if (data.next || data.push) ensureState(states, data.next || data.push);\n this.regex = toRegex(data.regex);\n this.token = asToken(data.token);\n this.data = data;\n }\n\n function tokenFunction(states, config) {\n return function(stream, state) {\n if (state.pending) {\n var pend = state.pending.shift();\n if (state.pending.length == 0) state.pending = null;\n stream.pos += pend.text.length;\n return pend.token;\n }\n\n if (state.local) {\n if (state.local.end && stream.match(state.local.end)) {\n var tok = state.local.endToken || null;\n state.local = state.localState = null;\n return tok;\n } else {\n var tok = state.local.mode.token(stream, state.localState), m;\n if (state.local.endScan && (m = state.local.endScan.exec(stream.current())))\n stream.pos = stream.start + m.index;\n return tok;\n }\n }\n\n var curState = states[state.state];\n for (var i = 0; i < curState.length; i++) {\n var rule = curState[i];\n var matches = (!rule.data.sol || stream.sol()) && stream.match(rule.regex);\n if (matches) {\n if (rule.data.next) {\n state.state = rule.data.next;\n } else if (rule.data.push) {\n (state.stack || (state.stack = [])).push(state.state);\n state.state = rule.data.push;\n } else if (rule.data.pop && state.stack && state.stack.length) {\n state.state = state.stack.pop();\n }\n\n if (rule.data.mode)\n enterLocalMode(config, state, rule.data.mode, rule.token);\n if (rule.data.indent)\n state.indent.push(stream.indentation() + config.indentUnit);\n if (rule.data.dedent)\n state.indent.pop();\n if (matches.length > 2) {\n state.pending = [];\n for (var j = 2; j < matches.length; j++)\n if (matches[j])\n state.pending.push({text: matches[j], token: rule.token[j - 1]});\n stream.backUp(matches[0].length - (matches[1] ? matches[1].length : 0));\n return rule.token[0];\n } else if (rule.token && rule.token.join) {\n return rule.token[0];\n } else {\n return rule.token;\n }\n }\n }\n stream.next();\n return null;\n };\n }\n\n function cmp(a, b) {\n if (a === b) return true;\n if (!a || typeof a != \"object\" || !b || typeof b != \"object\") return false;\n var props = 0;\n for (var prop in a) if (a.hasOwnProperty(prop)) {\n if (!b.hasOwnProperty(prop) || !cmp(a[prop], b[prop])) return false;\n props++;\n }\n for (var prop in b) if (b.hasOwnProperty(prop)) props--;\n return props == 0;\n }\n\n function enterLocalMode(config, state, spec, token) {\n var pers;\n if (spec.persistent) for (var p = state.persistentStates; p && !pers; p = p.next)\n if (spec.spec ? cmp(spec.spec, p.spec) : spec.mode == p.mode) pers = p;\n var mode = pers ? pers.mode : spec.mode || CodeMirror.getMode(config, spec.spec);\n var lState = pers ? pers.state : CodeMirror.startState(mode);\n if (spec.persistent && !pers)\n state.persistentStates = {mode: mode, spec: spec.spec, state: lState, next: state.persistentStates};\n\n state.localState = lState;\n state.local = {mode: mode,\n end: spec.end && toRegex(spec.end),\n endScan: spec.end && spec.forceEnd !== false && toRegex(spec.end, false),\n endToken: token && token.join ? token[token.length - 1] : token};\n }\n\n function indexOf(val, arr) {\n for (var i = 0; i < arr.length; i++) if (arr[i] === val) return true;\n }\n\n function indentFunction(states, meta) {\n return function(state, textAfter, line) {\n if (state.local && state.local.mode.indent)\n return state.local.mode.indent(state.localState, textAfter, line);\n if (state.indent == null || state.local || meta.dontIndentStates && indexOf(state.state, meta.dontIndentStates) > -1)\n return CodeMirror.Pass;\n\n var pos = state.indent.length - 1, rules = states[state.state];\n scan: for (;;) {\n for (var i = 0; i < rules.length; i++) {\n var rule = rules[i];\n if (rule.data.dedent && rule.data.dedentIfLineStart !== false) {\n var m = rule.regex.exec(textAfter);\n if (m && m[0]) {\n pos--;\n if (rule.next || rule.push) rules = states[rule.next || rule.push];\n textAfter = textAfter.slice(m[0].length);\n continue scan;\n }\n }\n }\n break;\n }\n return pos < 0 ? 0 : state.indent[pos];\n };\n }\n});\n","// 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.multiplexingMode = function(outer /*, others */) {\n // Others should be {open, close, mode [, delimStyle] [, innerStyle]} objects\n var others = Array.prototype.slice.call(arguments, 1);\n\n function indexOf(string, pattern, from, returnEnd) {\n if (typeof pattern == \"string\") {\n var found = string.indexOf(pattern, from);\n return returnEnd && found > -1 ? found + pattern.length : found;\n }\n var m = pattern.exec(from ? string.slice(from) : string);\n return m ? m.index + from + (returnEnd ? m[0].length : 0) : -1;\n }\n\n return {\n startState: function() {\n return {\n outer: CodeMirror.startState(outer),\n innerActive: null,\n inner: null\n };\n },\n\n copyState: function(state) {\n return {\n outer: CodeMirror.copyState(outer, state.outer),\n innerActive: state.innerActive,\n inner: state.innerActive && CodeMirror.copyState(state.innerActive.mode, state.inner)\n };\n },\n\n token: function(stream, state) {\n if (!state.innerActive) {\n var cutOff = Infinity, oldContent = stream.string;\n for (var i = 0; i < others.length; ++i) {\n var other = others[i];\n var found = indexOf(oldContent, other.open, stream.pos);\n if (found == stream.pos) {\n if (!other.parseDelimiters) stream.match(other.open);\n state.innerActive = other;\n state.inner = CodeMirror.startState(other.mode, outer.indent ? outer.indent(state.outer, \"\") : 0);\n return other.delimStyle && (other.delimStyle + \" \" + other.delimStyle + \"-open\");\n } else if (found != -1 && found < cutOff) {\n cutOff = found;\n }\n }\n if (cutOff != Infinity) stream.string = oldContent.slice(0, cutOff);\n var outerToken = outer.token(stream, state.outer);\n if (cutOff != Infinity) stream.string = oldContent;\n return outerToken;\n } else {\n var curInner = state.innerActive, oldContent = stream.string;\n if (!curInner.close && stream.sol()) {\n state.innerActive = state.inner = null;\n return this.token(stream, state);\n }\n var found = curInner.close ? indexOf(oldContent, curInner.close, stream.pos, curInner.parseDelimiters) : -1;\n if (found == stream.pos && !curInner.parseDelimiters) {\n stream.match(curInner.close);\n state.innerActive = state.inner = null;\n return curInner.delimStyle && (curInner.delimStyle + \" \" + curInner.delimStyle + \"-close\");\n }\n if (found > -1) stream.string = oldContent.slice(0, found);\n var innerToken = curInner.mode.token(stream, state.inner);\n if (found > -1) stream.string = oldContent;\n\n if (found == stream.pos && curInner.parseDelimiters)\n state.innerActive = state.inner = null;\n\n if (curInner.innerStyle) {\n if (innerToken) innerToken = innerToken + \" \" + curInner.innerStyle;\n else innerToken = curInner.innerStyle;\n }\n\n return innerToken;\n }\n },\n\n indent: function(state, textAfter) {\n var mode = state.innerActive ? state.innerActive.mode : outer;\n if (!mode.indent) return CodeMirror.Pass;\n return mode.indent(state.innerActive ? state.inner : state.outer, textAfter);\n },\n\n blankLine: function(state) {\n var mode = state.innerActive ? state.innerActive.mode : outer;\n if (mode.blankLine) {\n mode.blankLine(state.innerActive ? state.inner : state.outer);\n }\n if (!state.innerActive) {\n for (var i = 0; i < others.length; ++i) {\n var other = others[i];\n if (other.open === \"\\n\") {\n state.innerActive = other;\n state.inner = CodeMirror.startState(other.mode, mode.indent ? mode.indent(state.outer, \"\") : 0);\n }\n }\n } else if (state.innerActive.close === \"\\n\") {\n state.innerActive = state.inner = null;\n }\n },\n\n electricChars: outer.electricChars,\n\n innerMode: function(state) {\n return state.inner ? {state: state.inner, mode: state.innerActive.mode} : {state: state.outer, mode: outer};\n }\n };\n};\n\n});\n","// 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.registerHelper(\"fold\", \"brace\", function(cm, start) {\n var line = start.line, lineText = cm.getLine(line);\n var tokenType;\n\n function findOpening(openCh) {\n for (var at = start.ch, pass = 0;;) {\n var found = at <= 0 ? -1 : lineText.lastIndexOf(openCh, at - 1);\n if (found == -1) {\n if (pass == 1) break;\n pass = 1;\n at = lineText.length;\n continue;\n }\n if (pass == 1 && found < start.ch) break;\n tokenType = cm.getTokenTypeAt(CodeMirror.Pos(line, found + 1));\n if (!/^(comment|string)/.test(tokenType)) return found + 1;\n at = found - 1;\n }\n }\n\n var startToken = \"{\", endToken = \"}\", startCh = findOpening(\"{\");\n if (startCh == null) {\n startToken = \"[\", endToken = \"]\";\n startCh = findOpening(\"[\");\n }\n\n if (startCh == null) return;\n var count = 1, lastLine = cm.lastLine(), end, endCh;\n outer: for (var i = line; i <= lastLine; ++i) {\n var text = cm.getLine(i), pos = i == line ? startCh : 0;\n for (;;) {\n var nextOpen = text.indexOf(startToken, pos), nextClose = text.indexOf(endToken, pos);\n if (nextOpen < 0) nextOpen = text.length;\n if (nextClose < 0) nextClose = text.length;\n pos = Math.min(nextOpen, nextClose);\n if (pos == text.length) break;\n if (cm.getTokenTypeAt(CodeMirror.Pos(i, pos + 1)) == tokenType) {\n if (pos == nextOpen) ++count;\n else if (!--count) { end = i; endCh = pos; break outer; }\n }\n ++pos;\n }\n }\n if (end == null || line == end && endCh == startCh) return;\n return {from: CodeMirror.Pos(line, startCh),\n to: CodeMirror.Pos(end, endCh)};\n});\n\nCodeMirror.registerHelper(\"fold\", \"import\", function(cm, start) {\n function hasImport(line) {\n if (line < cm.firstLine() || line > cm.lastLine()) return null;\n var start = cm.getTokenAt(CodeMirror.Pos(line, 1));\n if (!/\\S/.test(start.string)) start = cm.getTokenAt(CodeMirror.Pos(line, start.end + 1));\n if (start.type != \"keyword\" || start.string != \"import\") return null;\n // Now find closing semicolon, return its position\n for (var i = line, e = Math.min(cm.lastLine(), line + 10); i <= e; ++i) {\n var text = cm.getLine(i), semi = text.indexOf(\";\");\n if (semi != -1) return {startCh: start.end, end: CodeMirror.Pos(i, semi)};\n }\n }\n\n var startLine = start.line, has = hasImport(startLine), prev;\n if (!has || hasImport(startLine - 1) || ((prev = hasImport(startLine - 2)) && prev.end.line == startLine - 1))\n return null;\n for (var end = has.end;;) {\n var next = hasImport(end.line + 1);\n if (next == null) break;\n end = next.end;\n }\n return {from: cm.clipPos(CodeMirror.Pos(startLine, has.startCh + 1)), to: end};\n});\n\nCodeMirror.registerHelper(\"fold\", \"include\", function(cm, start) {\n function hasInclude(line) {\n if (line < cm.firstLine() || line > cm.lastLine()) return null;\n var start = cm.getTokenAt(CodeMirror.Pos(line, 1));\n if (!/\\S/.test(start.string)) start = cm.getTokenAt(CodeMirror.Pos(line, start.end + 1));\n if (start.type == \"meta\" && start.string.slice(0, 8) == \"#include\") return start.start + 8;\n }\n\n var startLine = start.line, has = hasInclude(startLine);\n if (has == null || hasInclude(startLine - 1) != null) return null;\n for (var end = startLine;;) {\n var next = hasInclude(end + 1);\n if (next == null) break;\n ++end;\n }\n return {from: CodeMirror.Pos(startLine, has + 1),\n to: cm.clipPos(CodeMirror.Pos(end))};\n});\n\n});\n","// 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\n var Pos = CodeMirror.Pos;\n function cmp(a, b) { return a.line - b.line || a.ch - b.ch; }\n\n var nameStartChar = \"A-Z_a-z\\\\u00C0-\\\\u00D6\\\\u00D8-\\\\u00F6\\\\u00F8-\\\\u02FF\\\\u0370-\\\\u037D\\\\u037F-\\\\u1FFF\\\\u200C-\\\\u200D\\\\u2070-\\\\u218F\\\\u2C00-\\\\u2FEF\\\\u3001-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFFD\";\n var nameChar = nameStartChar + \"\\-\\:\\.0-9\\\\u00B7\\\\u0300-\\\\u036F\\\\u203F-\\\\u2040\";\n var xmlTagStart = new RegExp(\"<(/?)([\" + nameStartChar + \"][\" + nameChar + \"]*)\", \"g\");\n\n function Iter(cm, line, ch, range) {\n this.line = line; this.ch = ch;\n this.cm = cm; this.text = cm.getLine(line);\n this.min = range ? Math.max(range.from, cm.firstLine()) : cm.firstLine();\n this.max = range ? Math.min(range.to - 1, cm.lastLine()) : cm.lastLine();\n }\n\n function tagAt(iter, ch) {\n var type = iter.cm.getTokenTypeAt(Pos(iter.line, ch));\n return type && /\\btag\\b/.test(type);\n }\n\n function nextLine(iter) {\n if (iter.line >= iter.max) return;\n iter.ch = 0;\n iter.text = iter.cm.getLine(++iter.line);\n return true;\n }\n function prevLine(iter) {\n if (iter.line <= iter.min) return;\n iter.text = iter.cm.getLine(--iter.line);\n iter.ch = iter.text.length;\n return true;\n }\n\n function toTagEnd(iter) {\n for (;;) {\n var gt = iter.text.indexOf(\">\", iter.ch);\n if (gt == -1) { if (nextLine(iter)) continue; else return; }\n if (!tagAt(iter, gt + 1)) { iter.ch = gt + 1; continue; }\n var lastSlash = iter.text.lastIndexOf(\"/\", gt);\n var selfClose = lastSlash > -1 && !/\\S/.test(iter.text.slice(lastSlash + 1, gt));\n iter.ch = gt + 1;\n return selfClose ? \"selfClose\" : \"regular\";\n }\n }\n function toTagStart(iter) {\n for (;;) {\n var lt = iter.ch ? iter.text.lastIndexOf(\"<\", iter.ch - 1) : -1;\n if (lt == -1) { if (prevLine(iter)) continue; else return; }\n if (!tagAt(iter, lt + 1)) { iter.ch = lt; continue; }\n xmlTagStart.lastIndex = lt;\n iter.ch = lt;\n var match = xmlTagStart.exec(iter.text);\n if (match && match.index == lt) return match;\n }\n }\n\n function toNextTag(iter) {\n for (;;) {\n xmlTagStart.lastIndex = iter.ch;\n var found = xmlTagStart.exec(iter.text);\n if (!found) { if (nextLine(iter)) continue; else return; }\n if (!tagAt(iter, found.index + 1)) { iter.ch = found.index + 1; continue; }\n iter.ch = found.index + found[0].length;\n return found;\n }\n }\n function toPrevTag(iter) {\n for (;;) {\n var gt = iter.ch ? iter.text.lastIndexOf(\">\", iter.ch - 1) : -1;\n if (gt == -1) { if (prevLine(iter)) continue; else return; }\n if (!tagAt(iter, gt + 1)) { iter.ch = gt; continue; }\n var lastSlash = iter.text.lastIndexOf(\"/\", gt);\n var selfClose = lastSlash > -1 && !/\\S/.test(iter.text.slice(lastSlash + 1, gt));\n iter.ch = gt + 1;\n return selfClose ? \"selfClose\" : \"regular\";\n }\n }\n\n function findMatchingClose(iter, tag) {\n var stack = [];\n for (;;) {\n var next = toNextTag(iter), end, startLine = iter.line, startCh = iter.ch - (next ? next[0].length : 0);\n if (!next || !(end = toTagEnd(iter))) return;\n if (end == \"selfClose\") continue;\n if (next[1]) { // closing tag\n for (var i = stack.length - 1; i >= 0; --i) if (stack[i] == next[2]) {\n stack.length = i;\n break;\n }\n if (i < 0 && (!tag || tag == next[2])) return {\n tag: next[2],\n from: Pos(startLine, startCh),\n to: Pos(iter.line, iter.ch)\n };\n } else { // opening tag\n stack.push(next[2]);\n }\n }\n }\n function findMatchingOpen(iter, tag) {\n var stack = [];\n for (;;) {\n var prev = toPrevTag(iter);\n if (!prev) return;\n if (prev == \"selfClose\") { toTagStart(iter); continue; }\n var endLine = iter.line, endCh = iter.ch;\n var start = toTagStart(iter);\n if (!start) return;\n if (start[1]) { // closing tag\n stack.push(start[2]);\n } else { // opening tag\n for (var i = stack.length - 1; i >= 0; --i) if (stack[i] == start[2]) {\n stack.length = i;\n break;\n }\n if (i < 0 && (!tag || tag == start[2])) return {\n tag: start[2],\n from: Pos(iter.line, iter.ch),\n to: Pos(endLine, endCh)\n };\n }\n }\n }\n\n CodeMirror.registerHelper(\"fold\", \"xml\", function(cm, start) {\n var iter = new Iter(cm, start.line, 0);\n for (;;) {\n var openTag = toNextTag(iter), end;\n if (!openTag || iter.line != start.line || !(end = toTagEnd(iter))) return;\n if (!openTag[1] && end != \"selfClose\") {\n var startPos = Pos(iter.line, iter.ch);\n var endPos = findMatchingClose(iter, openTag[2]);\n return endPos && {from: startPos, to: endPos.from};\n }\n }\n });\n CodeMirror.findMatchingTag = function(cm, pos, range) {\n var iter = new Iter(cm, pos.line, pos.ch, range);\n if (iter.text.indexOf(\">\") == -1 && iter.text.indexOf(\"<\") == -1) return;\n var end = toTagEnd(iter), to = end && Pos(iter.line, iter.ch);\n var start = end && toTagStart(iter);\n if (!end || !start || cmp(iter, pos) > 0) return;\n var here = {from: Pos(iter.line, iter.ch), to: to, tag: start[2]};\n if (end == \"selfClose\") return {open: here, close: null, at: \"open\"};\n\n if (start[1]) { // closing tag\n return {open: findMatchingOpen(iter, start[2]), close: here, at: \"close\"};\n } else { // opening tag\n iter = new Iter(cm, to.line, to.ch, range);\n return {open: here, close: findMatchingClose(iter, start[2]), at: \"open\"};\n }\n };\n\n CodeMirror.findEnclosingTag = function(cm, pos, range) {\n var iter = new Iter(cm, pos.line, pos.ch, range);\n for (;;) {\n var open = findMatchingOpen(iter);\n if (!open) break;\n var forward = new Iter(cm, pos.line, pos.ch, range);\n var close = findMatchingClose(forward, open.tag);\n if (close) return {open: open, close: close};\n }\n };\n\n // Used by addon/edit/closetag.js\n CodeMirror.scanForClosingTag = function(cm, pos, name, end) {\n var iter = new Iter(cm, pos.line, pos.ch, end ? {from: 0, to: end} : null);\n return findMatchingClose(iter, name);\n };\n});\n","// 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 var ie_lt8 = /MSIE \\d/.test(navigator.userAgent) &&\n (document.documentMode == null || document.documentMode < 8);\n\n var Pos = CodeMirror.Pos;\n\n var matching = {\"(\": \")>\", \")\": \"(<\", \"[\": \"]>\", \"]\": \"[<\", \"{\": \"}>\", \"}\": \"{<\"};\n\n function findMatchingBracket(cm, where, strict, config) {\n var line = cm.getLineHandle(where.line), pos = where.ch - 1;\n var match = (pos >= 0 && matching[line.text.charAt(pos)]) || matching[line.text.charAt(++pos)];\n if (!match) return null;\n var dir = match.charAt(1) == \">\" ? 1 : -1;\n if (strict && (dir > 0) != (pos == where.ch)) return null;\n var style = cm.getTokenTypeAt(Pos(where.line, pos + 1));\n\n var found = scanForBracket(cm, Pos(where.line, pos + (dir > 0 ? 1 : 0)), dir, style || null, config);\n if (found == null) return null;\n return {from: Pos(where.line, pos), to: found && found.pos,\n match: found && found.ch == match.charAt(0), forward: dir > 0};\n }\n\n // bracketRegex is used to specify which type of bracket to scan\n // should be a regexp, e.g. /[[\\]]/\n //\n // Note: If \"where\" is on an open bracket, then this bracket is ignored.\n //\n // Returns false when no bracket was found, null when it reached\n // maxScanLines and gave up\n function scanForBracket(cm, where, dir, style, config) {\n var maxScanLen = (config && config.maxScanLineLength) || 10000;\n var maxScanLines = (config && config.maxScanLines) || 1000;\n\n var stack = [];\n var re = config && config.bracketRegex ? config.bracketRegex : /[(){}[\\]]/;\n var lineEnd = dir > 0 ? Math.min(where.line + maxScanLines, cm.lastLine() + 1)\n : Math.max(cm.firstLine() - 1, where.line - maxScanLines);\n for (var lineNo = where.line; lineNo != lineEnd; lineNo += dir) {\n var line = cm.getLine(lineNo);\n if (!line) continue;\n var pos = dir > 0 ? 0 : line.length - 1, end = dir > 0 ? line.length : -1;\n if (line.length > maxScanLen) continue;\n if (lineNo == where.line) pos = where.ch - (dir < 0 ? 1 : 0);\n for (; pos != end; pos += dir) {\n var ch = line.charAt(pos);\n if (re.test(ch) && (style === undefined || cm.getTokenTypeAt(Pos(lineNo, pos + 1)) == style)) {\n var match = matching[ch];\n if ((match.charAt(1) == \">\") == (dir > 0)) stack.push(ch);\n else if (!stack.length) return {pos: Pos(lineNo, pos), ch: ch};\n else stack.pop();\n }\n }\n }\n return lineNo - dir == (dir > 0 ? cm.lastLine() : cm.firstLine()) ? false : null;\n }\n\n function matchBrackets(cm, autoclear, config) {\n // Disable brace matching in long lines, since it'll cause hugely slow updates\n var maxHighlightLen = cm.state.matchBrackets.maxHighlightLineLength || 1000;\n var marks = [], ranges = cm.listSelections();\n for (var i = 0; i < ranges.length; i++) {\n var match = ranges[i].empty() && findMatchingBracket(cm, ranges[i].head, false, config);\n if (match && cm.getLine(match.from.line).length <= maxHighlightLen) {\n var style = match.match ? \"CodeMirror-matchingbracket\" : \"CodeMirror-nonmatchingbracket\";\n marks.push(cm.markText(match.from, Pos(match.from.line, match.from.ch + 1), {className: style}));\n if (match.to && cm.getLine(match.to.line).length <= maxHighlightLen)\n marks.push(cm.markText(match.to, Pos(match.to.line, match.to.ch + 1), {className: style}));\n }\n }\n\n if (marks.length) {\n // Kludge to work around the IE bug from issue #1193, where text\n // input stops going to the textare whever this fires.\n if (ie_lt8 && cm.state.focused) cm.focus();\n\n var clear = function() {\n cm.operation(function() {\n for (var i = 0; i < marks.length; i++) marks[i].clear();\n });\n };\n if (autoclear) setTimeout(clear, 800);\n else return clear;\n }\n }\n\n var currentlyHighlighted = null;\n function doMatchBrackets(cm) {\n cm.operation(function() {\n if (currentlyHighlighted) {currentlyHighlighted(); currentlyHighlighted = null;}\n currentlyHighlighted = matchBrackets(cm, false, cm.state.matchBrackets);\n });\n }\n\n CodeMirror.defineOption(\"matchBrackets\", false, function(cm, val, old) {\n if (old && old != CodeMirror.Init) {\n cm.off(\"cursorActivity\", doMatchBrackets);\n if (currentlyHighlighted) {currentlyHighlighted(); currentlyHighlighted = null;}\n }\n if (val) {\n cm.state.matchBrackets = typeof val == \"object\" ? val : {};\n cm.on(\"cursorActivity\", doMatchBrackets);\n }\n });\n\n CodeMirror.defineExtension(\"matchBrackets\", function() {matchBrackets(this, true);});\n CodeMirror.defineExtension(\"findMatchingBracket\", function(pos, strict, config){\n return findMatchingBracket(this, pos, strict, config);\n });\n CodeMirror.defineExtension(\"scanForBracket\", function(pos, dir, style, config){\n return scanForBracket(this, pos, dir, style, config);\n });\n});\n","// 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\nfunction expressionAllowed(stream, state, backUp) {\n return /^(?:operator|sof|keyword c|case|new|[\\[{}\\(,;:]|=>)$/.test(state.lastType) ||\n (state.lastType == \"quasi\" && /\\{\\s*$/.test(stream.string.slice(0, stream.pos - (backUp || 0))))\n}\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\");\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\": C, \"break\": C, \"continue\": C, \"new\": kw(\"new\"), \"delete\": C, \"throw\": C, \"debugger\": C,\n \"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, \"async\": kw(\"async\")\n };\n\n // Extend the 'normal' keywords with the TypeScript language extensions\n if (isTS) {\n var type = {type: \"variable\", style: \"variable-3\"};\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 \"type\": kw(\"type\"),\n\n // scope modifiers\n \"public\": kw(\"modifier\"),\n \"private\": kw(\"modifier\"),\n \"protected\": kw(\"modifier\"),\n \"abstract\": kw(\"modifier\"),\n\n // operators\n \"as\": operator,\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.eatWhile(isOperatorChar);\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 stream.eatWhile(isOperatorChar);\n return ret(\"operator\", \"operator\", stream.current());\n } else if (wordRE.test(ch)) {\n stream.eatWhile(wordRE);\n var word = stream.current(), known = keywords.propertyIsEnumerable(word) && keywords[word];\n return (known && state.lastType != \".\") ? ret(known.type, known.style, word) :\n 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 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 == \"{\") 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\") return cont(pushlex(\"stat\"), maybelabel);\n if (type == \"switch\") return cont(pushlex(\"form\"), parenExpr, pushlex(\"}\", \"switch\"), expect(\"{\"),\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, pushlex(\"}\"), expect(\"{\"), block, poplex, poplex)\n if (type == \"type\") return cont(typeexpr, expect(\"operator\"), typeexpr, expect(\";\"));\n if (type == \"async\") return cont(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(pattern, \")\"), 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 == \"keyword c\" || type == \"async\") return cont(noComma ? maybeexpressionNoComma : maybeexpression);\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 function maybeexpressionNoComma(type) {\n if (type.match(/[;\\}\\)\\],]/)) return pass();\n return pass(expressionNoComma);\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)) 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 }\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 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 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(expression);\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) {\n function proceed(type, value) {\n if (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 maybedefault(_, value) {\n if (value == \"=\") return cont(expressionNoComma);\n }\n function typeexpr(type) {\n if (type == \"variable\") {cx.marked = \"variable-3\"; return cont(afterType);}\n if (type == \"{\") return cont(commasep(typeprop, \"}\"))\n if (type == \"(\") return cont(commasep(typearg, \")\"), maybeReturnType)\n }\n function maybeReturnType(type) {\n if (type == \"=>\") return cont(typeexpr)\n }\n function typeprop(type) {\n if (type == \"variable\" || cx.style == \"keyword\") {\n cx.marked = \"property\"\n return cont(typeprop)\n } else if (type == \":\") {\n return cont(typeexpr)\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(commasep(typeexpr, \">\"), afterType)\n if (type == \"[\") return cont(expect(\"]\"), 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 }\n function funarg(type) {\n if (type == \"spread\") return cont(funarg);\n return pass(pattern, maybetype, maybedefault);\n }\n function className(type, value) {\n if (type == \"variable\") {register(value); return cont(classNameAfter);}\n }\n function classNameAfter(type, value) {\n if (value == \"extends\") return cont(isTS ? typeexpr : expression, classNameAfter);\n if (type == \"{\") return cont(pushlex(\"}\"), classBody, poplex);\n }\n function classBody(type, value) {\n if (type == \"variable\" || cx.style == \"keyword\") {\n if ((value == \"static\" || value == \"get\" || value == \"set\" ||\n (isTS && (value == \"public\" || value == \"private\" || value == \"protected\"))) &&\n cx.stream.match(/^\\s+[\\w$\\xa1-\\uffff]/, false)) {\n cx.marked = \"keyword\";\n return cont(classBody);\n }\n cx.marked = \"property\";\n return cont(isTS ? classfield : functiondef, classBody);\n }\n if (value == \"*\") {\n cx.marked = \"keyword\";\n return cont(classBody);\n }\n if (type == \";\") return cont(classBody);\n if (type == \"}\") return cont();\n }\n function classfield(type) {\n if (type == \":\") return cont(typeexpr)\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 return pass(statement);\n }\n function afterImport(type) {\n if (type == \"string\") return cont();\n return pass(importSpec, 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 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 // 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 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 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","// 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(\"turtle\", function(config) {\n var indentUnit = config.indentUnit;\n var curPunc;\n\n function wordRegexp(words) {\n return new RegExp(\"^(?:\" + words.join(\"|\") + \")$\", \"i\");\n }\n var ops = wordRegexp([]);\n var keywords = wordRegexp([\"@prefix\", \"@base\", \"a\"]);\n var operatorChars = /[*+\\-<>=&|]/;\n\n function tokenBase(stream, state) {\n var ch = stream.next();\n curPunc = null;\n if (ch == \"<\" && !stream.match(/^[\\s\\u00a0=]/, false)) {\n stream.match(/^[^\\s\\u00a0>]*>?/);\n return \"atom\";\n }\n else if (ch == \"\\\"\" || ch == \"'\") {\n state.tokenize = tokenLiteral(ch);\n return state.tokenize(stream, state);\n }\n else if (/[{}\\(\\),\\.;\\[\\]]/.test(ch)) {\n curPunc = ch;\n return null;\n }\n else if (ch == \"#\") {\n stream.skipToEnd();\n return \"comment\";\n }\n else if (operatorChars.test(ch)) {\n stream.eatWhile(operatorChars);\n return null;\n }\n else if (ch == \":\") {\n return \"operator\";\n } else {\n stream.eatWhile(/[_\\w\\d]/);\n if(stream.peek() == \":\") {\n return \"variable-3\";\n } else {\n var word = stream.current();\n\n if(keywords.test(word)) {\n return \"meta\";\n }\n\n if(ch >= \"A\" && ch <= \"Z\") {\n return \"comment\";\n } else {\n return \"keyword\";\n }\n }\n var word = stream.current();\n if (ops.test(word))\n return null;\n else if (keywords.test(word))\n return \"meta\";\n else\n return \"variable\";\n }\n }\n\n function tokenLiteral(quote) {\n return function(stream, state) {\n var escaped = false, ch;\n while ((ch = stream.next()) != null) {\n if (ch == quote && !escaped) {\n state.tokenize = tokenBase;\n break;\n }\n escaped = !escaped && ch == \"\\\\\";\n }\n return \"string\";\n };\n }\n\n function pushContext(state, type, col) {\n state.context = {prev: state.context, indent: state.indent, col: col, type: type};\n }\n function popContext(state) {\n state.indent = state.context.indent;\n state.context = state.context.prev;\n }\n\n return {\n startState: function() {\n return {tokenize: tokenBase,\n context: null,\n indent: 0,\n col: 0};\n },\n\n token: function(stream, state) {\n if (stream.sol()) {\n if (state.context && state.context.align == null) state.context.align = false;\n state.indent = stream.indentation();\n }\n if (stream.eatSpace()) return null;\n var style = state.tokenize(stream, state);\n\n if (style != \"comment\" && state.context && state.context.align == null && state.context.type != \"pattern\") {\n state.context.align = true;\n }\n\n if (curPunc == \"(\") pushContext(state, \")\", stream.column());\n else if (curPunc == \"[\") pushContext(state, \"]\", stream.column());\n else if (curPunc == \"{\") pushContext(state, \"}\", stream.column());\n else if (/[\\]\\}\\)]/.test(curPunc)) {\n while (state.context && state.context.type == \"pattern\") popContext(state);\n if (state.context && curPunc == state.context.type) popContext(state);\n }\n else if (curPunc == \".\" && state.context && state.context.type == \"pattern\") popContext(state);\n else if (/atom|string|variable/.test(style) && state.context) {\n if (/[\\}\\]]/.test(state.context.type))\n pushContext(state, \"pattern\", stream.column());\n else if (state.context.type == \"pattern\" && !state.context.align) {\n state.context.align = true;\n state.context.col = stream.column();\n }\n }\n\n return style;\n },\n\n indent: function(state, textAfter) {\n var firstChar = textAfter && textAfter.charAt(0);\n var context = state.context;\n if (/[\\]\\}]/.test(firstChar))\n while (context && context.type == \"pattern\") context = context.prev;\n\n var closing = context && firstChar == context.type;\n if (!context)\n return 0;\n else if (context.type == \"pattern\")\n return context.col;\n else if (context.align)\n return context.col + (closing ? 0 : 1);\n else\n return context.indent + (closing ? 0 : indentUnit);\n },\n\n lineComment: \"#\"\n };\n});\n\nCodeMirror.defineMIME(\"text/turtle\", \"turtle\");\n\n});\n","// 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.registerHelper(\"fold\", \"indent\", function(cm, start) {\n var tabSize = cm.getOption(\"tabSize\"), firstLine = cm.getLine(start.line);\n if (!/\\S/.test(firstLine)) return;\n var getIndent = function(line) {\n return CodeMirror.countColumn(line, null, tabSize);\n };\n var myIndent = getIndent(firstLine);\n var lastLineInFold = null;\n // Go through lines until we find a line that definitely doesn't belong in\n // the block we're folding, or to the end.\n for (var i = start.line + 1, end = cm.lastLine(); i <= end; ++i) {\n var curLine = cm.getLine(i);\n var curIndent = getIndent(curLine);\n if (curIndent > myIndent) {\n // Lines with a greater indent are considered part of the block.\n lastLineInFold = i;\n } else if (!/\\S/.test(curLine)) {\n // Empty lines might be breaks within the block we're trying to fold.\n } else {\n // A non-empty line at an indent equal to or less than ours marks the\n // start of another block.\n break;\n }\n }\n if (lastLineInFold) return {\n from: CodeMirror.Pos(start.line, firstLine.length),\n to: CodeMirror.Pos(lastLineInFold, cm.getLine(lastLineInFold).length)\n };\n});\n\n});\n","// 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\"), require(\"../fold/xml-fold\"));\n else if (typeof define == \"function\" && define.amd) // AMD\n define([\"../../lib/codemirror\", \"../fold/xml-fold\"], mod);\n else // Plain browser env\n mod(CodeMirror);\n})(function(CodeMirror) {\n \"use strict\";\n\n CodeMirror.defineOption(\"matchTags\", false, function(cm, val, old) {\n if (old && old != CodeMirror.Init) {\n cm.off(\"cursorActivity\", doMatchTags);\n cm.off(\"viewportChange\", maybeUpdateMatch);\n clear(cm);\n }\n if (val) {\n cm.state.matchBothTags = typeof val == \"object\" && val.bothTags;\n cm.on(\"cursorActivity\", doMatchTags);\n cm.on(\"viewportChange\", maybeUpdateMatch);\n doMatchTags(cm);\n }\n });\n\n function clear(cm) {\n if (cm.state.tagHit) cm.state.tagHit.clear();\n if (cm.state.tagOther) cm.state.tagOther.clear();\n cm.state.tagHit = cm.state.tagOther = null;\n }\n\n function doMatchTags(cm) {\n cm.state.failedTagMatch = false;\n cm.operation(function() {\n clear(cm);\n if (cm.somethingSelected()) return;\n var cur = cm.getCursor(), range = cm.getViewport();\n range.from = Math.min(range.from, cur.line); range.to = Math.max(cur.line + 1, range.to);\n var match = CodeMirror.findMatchingTag(cm, cur, range);\n if (!match) return;\n if (cm.state.matchBothTags) {\n var hit = match.at == \"open\" ? match.open : match.close;\n if (hit) cm.state.tagHit = cm.markText(hit.from, hit.to, {className: \"CodeMirror-matchingtag\"});\n }\n var other = match.at == \"close\" ? match.open : match.close;\n if (other)\n cm.state.tagOther = cm.markText(other.from, other.to, {className: \"CodeMirror-matchingtag\"});\n else\n cm.state.failedTagMatch = true;\n });\n }\n\n function maybeUpdateMatch(cm) {\n if (cm.state.failedTagMatch) doMatchTags(cm);\n }\n\n CodeMirror.commands.toMatchingTag = function(cm) {\n var found = CodeMirror.findMatchingTag(cm, cm.getCursor());\n if (found) {\n var other = found.at == \"close\" ? found.open : found.close;\n if (other) cm.extendSelection(other.to, other.from);\n }\n };\n});\n"],"sourceRoot":""}