{"version":3,"file":"easymde.min-BNGfgSjI.js","sources":["../../../../../shared/node_modules/codemirror/lib/codemirror.js","../../../../../shared/node_modules/codemirror/addon/edit/continuelist.js","../../../../../shared/node_modules/easymde/src/js/codemirror/tablist.js","../../../../../shared/node_modules/codemirror/addon/display/fullscreen.js","../../../../../shared/node_modules/codemirror/mode/xml/xml.js","../../../../../shared/node_modules/codemirror/mode/meta.js","../../../../../shared/node_modules/codemirror/mode/markdown/markdown.js","../../../../../shared/node_modules/codemirror/addon/mode/overlay.js","../../../../../shared/node_modules/codemirror/addon/display/placeholder.js","../../../../../shared/node_modules/codemirror/addon/display/autorefresh.js","../../../../../shared/node_modules/codemirror/addon/selection/mark-selection.js","../../../../../shared/node_modules/codemirror/addon/search/searchcursor.js","../../../../../shared/node_modules/codemirror/mode/gfm/gfm.js","../../../__vite-browser-external","../../../../../shared/node_modules/typo-js/typo.js","../../../../../shared/node_modules/codemirror-spell-checker/src/js/spell-checker.js","../../../../../shared/node_modules/marked/lib/marked.cjs","../../../../../shared/node_modules/easymde/src/js/easymde.js"],"sourcesContent":["// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/5/LICENSE\n\n// This is CodeMirror (https://codemirror.net/5), a code editor\n// implemented in JavaScript on top of the browser's DOM.\n//\n// You can find some technical background for some of the code below\n// at http://marijnhaverbeke.nl/blog/#cm-internals .\n\n(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n typeof define === 'function' && define.amd ? define(factory) :\n (global = global || self, global.CodeMirror = factory());\n}(this, (function () { 'use strict';\n\n // Kludges for bugs and behavior differences that can't be feature\n // detected are enabled based on userAgent etc sniffing.\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 edge = /Edge\\/(\\d+)/.exec(userAgent);\n var ie = ie_upto10 || ie_11up || edge;\n var ie_version = ie && (ie_upto10 ? document.documentMode || 6 : +(edge || ie_11up)[1]);\n var webkit = !edge && /WebKit\\//.test(userAgent);\n var qtwebkit = webkit && /Qt\\/\\d+\\.\\d+/.test(userAgent);\n var chrome = !edge && /Chrome\\/(\\d+)/.exec(userAgent);\n var chrome_version = chrome && +chrome[1];\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 = safari && (/Mobile\\/\\w+/.test(userAgent) || navigator.maxTouchPoints > 2);\n var android = /Android/.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 function classTest(cls) { return new RegExp(\"(^|\\\\s)\" + cls + \"(?:$|\\\\s)\\\\s*\") }\n\n var 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\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 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 // wrapper for elt, which removes the elt from the accessibility tree\n function eltP(tag, content, className, style) {\n var e = elt(tag, content, className, style);\n e.setAttribute(\"role\", \"presentation\");\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 contains(parent, child) {\n if (child.nodeType == 3) // Android browser always returns false when child is a textnode\n { child = child.parentNode; }\n if (parent.contains)\n { return parent.contains(child) }\n do {\n if (child.nodeType == 11) { child = child.host; }\n if (child == parent) { return true }\n } while (child = child.parentNode)\n }\n\n function activeElt(rootNode) {\n // IE and Edge may throw an \"Unspecified Error\" when accessing document.activeElement.\n // IE < 10 will throw when accessed while the page is loading or in an iframe.\n // IE > 9 and Edge will throw when accessed in an iframe if document.body is unavailable.\n var doc = rootNode.ownerDocument || rootNode;\n var activeElement;\n try {\n activeElement = rootNode.activeElement;\n } catch(e) {\n activeElement = doc.body || null;\n }\n while (activeElement && activeElement.shadowRoot && activeElement.shadowRoot.activeElement)\n { activeElement = activeElement.shadowRoot.activeElement; }\n return activeElement\n }\n\n function addClass(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 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 doc(cm) { return cm.display.wrapper.ownerDocument }\n\n function root(cm) {\n return rootNode(cm.display.wrapper)\n }\n\n function rootNode(element) {\n // Detect modern browsers (2017+).\n return element.getRootNode ? element.getRootNode() : element.ownerDocument\n }\n\n function win(cm) { return doc(cm).defaultView }\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 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 // Counts the column offset in a string, taking tabs into account.\n // Used mostly to find indentation.\n function countColumn(string, end, tabSize, startIndex, startValue) {\n if (end == null) {\n end = string.search(/[^\\s\\u00a0]/);\n if (end == -1) { end = string.length; }\n }\n for (var i = startIndex || 0, n = startValue || 0;;) {\n var nextTab = string.indexOf(\"\\t\", i);\n if (nextTab < 0 || nextTab >= end)\n { return n + (end - i) }\n n += nextTab - i;\n n += tabSize - (n % tabSize);\n i = nextTab + 1;\n }\n }\n\n var Delayed = function() {\n this.id = null;\n this.f = null;\n this.time = 0;\n this.handler = bind(this.onTimeout, this);\n };\n Delayed.prototype.onTimeout = function (self) {\n self.id = 0;\n if (self.time <= +new Date) {\n self.f();\n } else {\n setTimeout(self.handler, self.time - +new Date);\n }\n };\n Delayed.prototype.set = function (ms, f) {\n this.f = f;\n var time = +new Date + ms;\n if (!this.id || time < this.time) {\n clearTimeout(this.id);\n this.id = setTimeout(this.handler, ms);\n this.time = time;\n }\n };\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\n // Number of pixels added to scroller and sizer to hide scrollbar\n var scrollerGap = 50;\n\n // Returned or thrown by various protocols to signal 'I'm not\n // handling this'.\n var 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 // The inverse of countColumn -- find the offset that corresponds to\n // a particular column.\n function findColumn(string, goal, tabSize) {\n for (var pos = 0, col = 0;;) {\n var nextTab = string.indexOf(\"\\t\", pos);\n if (nextTab == -1) { nextTab = string.length; }\n var skipped = nextTab - pos;\n if (nextTab == string.length || col + skipped >= goal)\n { return pos + Math.min(skipped, goal - col) }\n col += nextTab - pos;\n col += tabSize - (col % tabSize);\n pos = nextTab + 1;\n if (col >= goal) { return pos }\n }\n }\n\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 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 var nonASCIISingleCaseWordChar = /[\\u00df\\u0587\\u0590-\\u05f4\\u0600-\\u06ff\\u3040-\\u309f\\u30a0-\\u30ff\\u3400-\\u4db5\\u4e00-\\u9fcc\\uac00-\\ud7af]/;\n function isWordCharBasic(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 // Returns a number from the range [`0`; `str.length`] unless `pos` is outside that range.\n function skipExtendingChars(str, pos, dir) {\n while ((dir < 0 ? pos > 0 : pos < str.length) && isExtendingChar(str.charAt(pos))) { pos += dir; }\n return pos\n }\n\n // Returns the value from the range [`from`; `to`] that satisfies\n // `pred` and is closest to `from`. Assumes that at least `to`\n // satisfies `pred`. Supports `from` being greater than `to`.\n function findFirst(pred, from, to) {\n // At any point we are certain `to` satisfies `pred`, don't know\n // whether `from` does.\n var dir = from > to ? -1 : 1;\n for (;;) {\n if (from == to) { return from }\n var midF = (from + to) / 2, mid = dir < 0 ? Math.ceil(midF) : Math.floor(midF);\n if (mid == from) { return pred(mid) ? from : to }\n if (pred(mid)) { to = mid; }\n else { from = mid + dir; }\n }\n }\n\n // BIDI HELPERS\n\n function iterateBidiSections(order, from, to, f) {\n if (!order) { return f(from, to, \"ltr\", 0) }\n var found = false;\n for (var i = 0; i < order.length; ++i) {\n var part = order[i];\n if (part.from < to && part.to > from || from == to && part.to == from) {\n f(Math.max(part.from, from), Math.min(part.to, to), part.level == 1 ? \"rtl\" : \"ltr\", i);\n found = true;\n }\n }\n if (!found) { f(from, to, \"ltr\"); }\n }\n\n var bidiOther = null;\n function getBidiPartAt(order, ch, sticky) {\n var found;\n bidiOther = null;\n for (var i = 0; i < order.length; ++i) {\n var cur = order[i];\n if (cur.from < ch && cur.to > ch) { return i }\n if (cur.to == ch) {\n if (cur.from != cur.to && sticky == \"before\") { found = i; }\n else { bidiOther = i; }\n }\n if (cur.from == ch) {\n if (cur.from != cur.to && sticky != \"before\") { found = i; }\n else { bidiOther = i; }\n }\n }\n return found != null ? found : bidiOther\n }\n\n // Bidirectional ordering algorithm\n // See http://unicode.org/reports/tr9/tr9-13.html for the algorithm\n // that this (partially) implements.\n\n // One-char codes used for character types:\n // L (L): Left-to-Right\n // R (R): Right-to-Left\n // r (AL): Right-to-Left Arabic\n // 1 (EN): European Number\n // + (ES): European Number Separator\n // % (ET): European Number Terminator\n // n (AN): Arabic Number\n // , (CS): Common Number Separator\n // m (NSM): Non-Spacing Mark\n // b (BN): Boundary Neutral\n // s (B): Paragraph Separator\n // t (S): Segment Separator\n // w (WS): Whitespace\n // N (ON): Other Neutrals\n\n // Returns null if characters are ordered as they appear\n // (left-to-right), or an array of sections ({from, to, level}\n // objects) in the order in which they occur visually.\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 0x6f9\n var arabicTypes = \"nnnnnnNNr%%r,rNNmmmmmmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmmmnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmnNmmmmmmrrmmNmmmmrr1111111111\";\n function charType(code) {\n if (code <= 0xf7) { return lowTypes.charAt(code) }\n else if (0x590 <= code && code <= 0x5f4) { return \"R\" }\n else if (0x600 <= code && code <= 0x6f9) { return arabicTypes.charAt(code - 0x600) }\n else if (0x6ee <= code && code <= 0x8ac) { return \"r\" }\n else if (0x2000 <= code && code <= 0x200b) { return \"w\" }\n else if (code == 0x200c) { return \"b\" }\n else { return \"L\" }\n }\n\n var bidiRE = /[\\u0590-\\u05f4\\u0600-\\u06ff\\u0700-\\u08ac]/;\n var isNeutral = /[stwN]/, isStrong = /[LRr]/, countsAsLeft = /[Lb1n]/, countsAsNum = /[1n]/;\n\n function BidiSpan(level, from, to) {\n this.level = level;\n this.from = from; this.to = to;\n }\n\n return function(str, direction) {\n var outerType = direction == \"ltr\" ? \"L\" : \"R\";\n\n if (str.length == 0 || direction == \"ltr\" && !bidiRE.test(str)) { return false }\n var len = str.length, types = [];\n for (var i = 0; i < len; ++i)\n { types.push(charType(str.charCodeAt(i))); }\n\n // W1. Examine each non-spacing mark (NSM) in the level run, and\n // change the type of the NSM to the type of the previous\n // character. If the NSM is at the start of the level run, it will\n // get the type of sor.\n for (var i$1 = 0, prev = outerType; i$1 < len; ++i$1) {\n var type = types[i$1];\n if (type == \"m\") { types[i$1] = prev; }\n else { prev = type; }\n }\n\n // W2. Search backwards from each instance of a European number\n // until the first strong type (R, L, AL, or sor) is found. If an\n // AL is found, change the type of the European number to Arabic\n // number.\n // W3. Change all ALs to R.\n for (var i$2 = 0, cur = outerType; i$2 < len; ++i$2) {\n var type$1 = types[i$2];\n if (type$1 == \"1\" && cur == \"r\") { types[i$2] = \"n\"; }\n else if (isStrong.test(type$1)) { cur = type$1; if (type$1 == \"r\") { types[i$2] = \"R\"; } }\n }\n\n // W4. A single European separator between two European numbers\n // changes to a European number. A single common separator between\n // two numbers of the same type changes to that type.\n for (var i$3 = 1, prev$1 = types[0]; i$3 < len - 1; ++i$3) {\n var type$2 = types[i$3];\n if (type$2 == \"+\" && prev$1 == \"1\" && types[i$3+1] == \"1\") { types[i$3] = \"1\"; }\n else if (type$2 == \",\" && prev$1 == types[i$3+1] &&\n (prev$1 == \"1\" || prev$1 == \"n\")) { types[i$3] = prev$1; }\n prev$1 = type$2;\n }\n\n // W5. A sequence of European terminators adjacent to European\n // numbers changes to all European numbers.\n // W6. Otherwise, separators and terminators change to Other\n // Neutral.\n for (var i$4 = 0; i$4 < len; ++i$4) {\n var type$3 = types[i$4];\n if (type$3 == \",\") { types[i$4] = \"N\"; }\n else if (type$3 == \"%\") {\n var end = (void 0);\n for (end = i$4 + 1; end < len && types[end] == \"%\"; ++end) {}\n var replace = (i$4 && types[i$4-1] == \"!\") || (end < len && types[end] == \"1\") ? \"1\" : \"N\";\n for (var j = i$4; j < end; ++j) { types[j] = replace; }\n i$4 = end - 1;\n }\n }\n\n // W7. Search backwards from each instance of a European number\n // until the first strong type (R, L, or sor) is found. If an L is\n // found, then change the type of the European number to L.\n for (var i$5 = 0, cur$1 = outerType; i$5 < len; ++i$5) {\n var type$4 = types[i$5];\n if (cur$1 == \"L\" && type$4 == \"1\") { types[i$5] = \"L\"; }\n else if (isStrong.test(type$4)) { cur$1 = type$4; }\n }\n\n // N1. A sequence of neutrals takes the direction of the\n // surrounding strong text if the text on both sides has the same\n // direction. European and Arabic numbers act as if they were R in\n // terms of their influence on neutrals. Start-of-level-run (sor)\n // and end-of-level-run (eor) are used at level run boundaries.\n // N2. Any remaining neutrals take the embedding direction.\n for (var i$6 = 0; i$6 < len; ++i$6) {\n if (isNeutral.test(types[i$6])) {\n var end$1 = (void 0);\n for (end$1 = i$6 + 1; end$1 < len && isNeutral.test(types[end$1]); ++end$1) {}\n var before = (i$6 ? types[i$6-1] : outerType) == \"L\";\n var after = (end$1 < len ? types[end$1] : outerType) == \"L\";\n var replace$1 = before == after ? (before ? \"L\" : \"R\") : outerType;\n for (var j$1 = i$6; j$1 < end$1; ++j$1) { types[j$1] = replace$1; }\n i$6 = end$1 - 1;\n }\n }\n\n // Here we depart from the documented algorithm, in order to avoid\n // building up an actual levels array. Since there are only three\n // levels (0, 1, 2) in an implementation that doesn't take\n // explicit embedding into account, we can build up the order on\n // the fly, without following the level-based algorithm.\n var order = [], m;\n for (var i$7 = 0; i$7 < len;) {\n if (countsAsLeft.test(types[i$7])) {\n var start = i$7;\n for (++i$7; i$7 < len && countsAsLeft.test(types[i$7]); ++i$7) {}\n order.push(new BidiSpan(0, start, i$7));\n } else {\n var pos = i$7, at = order.length, isRTL = direction == \"rtl\" ? 1 : 0;\n for (++i$7; i$7 < len && types[i$7] != \"L\"; ++i$7) {}\n for (var j$2 = pos; j$2 < i$7;) {\n if (countsAsNum.test(types[j$2])) {\n if (pos < j$2) { order.splice(at, 0, new BidiSpan(1, pos, j$2)); at += isRTL; }\n var nstart = j$2;\n for (++j$2; j$2 < i$7 && countsAsNum.test(types[j$2]); ++j$2) {}\n order.splice(at, 0, new BidiSpan(2, nstart, j$2));\n at += isRTL;\n pos = j$2;\n } else { ++j$2; }\n }\n if (pos < i$7) { order.splice(at, 0, new BidiSpan(1, pos, i$7)); }\n }\n }\n if (direction == \"ltr\") {\n if (order[0].level == 1 && (m = str.match(/^\\s+/))) {\n order[0].from = m[0].length;\n order.unshift(new BidiSpan(0, 0, m[0].length));\n }\n if (lst(order).level == 1 && (m = str.match(/\\s+$/))) {\n lst(order).to -= m[0].length;\n order.push(new BidiSpan(0, len - m[0].length, len));\n }\n }\n\n return direction == \"rtl\" ? order.reverse() : order\n }\n })();\n\n // Get the bidi ordering for the given line (and cache it). Returns\n // false for lines that are fully left-to-right, and an array of\n // BidiSpan objects otherwise.\n function getOrder(line, direction) {\n var order = line.order;\n if (order == null) { order = line.order = bidiOrdering(line.text, direction); }\n return order\n }\n\n // EVENT HANDLING\n\n // Lightweight event framework. on/off also work on DOM nodes,\n // registering native DOM handlers.\n\n var noHandlers = [];\n\n var 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 map[type] = (map[type] || noHandlers).concat(f);\n }\n };\n\n function getHandlers(emitter, type) {\n return emitter._handlers && emitter._handlers[type] || noHandlers\n }\n\n function off(emitter, type, f) {\n if (emitter.removeEventListener) {\n emitter.removeEventListener(type, f, false);\n } else if (emitter.detachEvent) {\n emitter.detachEvent(\"on\" + type, f);\n } else {\n var map = emitter._handlers, arr = map && map[type];\n if (arr) {\n var index = indexOf(arr, f);\n if (index > -1)\n { map[type] = arr.slice(0, index).concat(arr.slice(index + 1)); }\n }\n }\n }\n\n function signal(emitter, type /*, values...*/) {\n var handlers = getHandlers(emitter, type);\n if (!handlers.length) { return }\n var args = Array.prototype.slice.call(arguments, 2);\n for (var i = 0; i < handlers.length; ++i) { handlers[i].apply(null, args); }\n }\n\n // The DOM events that CodeMirror handles can be overridden by\n // registering a (non-DOM) handler on the editor for the event name,\n // and preventDefault-ing the event in that handler.\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 // Due to the fact that we still support jurassic IE versions, some\n // compatibility wrappers are needed.\n\n function e_preventDefault(e) {\n if (e.preventDefault) { e.preventDefault(); }\n else { e.returnValue = false; }\n }\n function e_stopPropagation(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 function e_stop(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 // 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 = \"\\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 var range;\n try {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 // Known modes, by name and by MIME\n var modes = {}, 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 function defineMode(name, mode) {\n if (arguments.length > 2)\n { mode.dependencies = Array.prototype.slice.call(arguments, 2); }\n modes[name] = mode;\n }\n\n function defineMIME(mime, spec) {\n mimeModes[mime] = spec;\n }\n\n // Given a MIME type, a {name, ...options} config object, or a name\n // string, return a mode config object.\n function resolveMode(spec) {\n if (typeof spec == \"string\" && mimeModes.hasOwnProperty(spec)) {\n spec = mimeModes[spec];\n } else if (spec && typeof spec.name == \"string\" && mimeModes.hasOwnProperty(spec.name)) {\n var found = mimeModes[spec.name];\n if (typeof found == \"string\") { found = {name: found}; }\n spec = createObj(found, spec);\n spec.name = found.name;\n } else if (typeof spec == \"string\" && /^[\\w\\-]+\\/[\\w\\-]+\\+xml$/.test(spec)) {\n return resolveMode(\"application/xml\")\n } else if (typeof spec == \"string\" && /^[\\w\\-]+\\/[\\w\\-]+\\+json$/.test(spec)) {\n return resolveMode(\"application/json\")\n }\n if (typeof spec == \"string\") { return {name: spec} }\n else { return spec || {name: \"null\"} }\n }\n\n // Given a mode spec (anything that resolveMode accepts), find and\n // initialize an actual mode object.\n function getMode(options, spec) {\n spec = resolveMode(spec);\n var mfactory = modes[spec.name];\n if (!mfactory) { return getMode(options, \"text/plain\") }\n var modeObj = mfactory(options, spec);\n if (modeExtensions.hasOwnProperty(spec.name)) {\n var exts = modeExtensions[spec.name];\n for (var prop in exts) {\n if (!exts.hasOwnProperty(prop)) { continue }\n if (modeObj.hasOwnProperty(prop)) { modeObj[\"_\" + prop] = modeObj[prop]; }\n modeObj[prop] = exts[prop];\n }\n }\n modeObj.name = spec.name;\n if (spec.helperType) { modeObj.helperType = spec.helperType; }\n if (spec.modeProps) { for (var prop$1 in spec.modeProps)\n { modeObj[prop$1] = spec.modeProps[prop$1]; } }\n\n return modeObj\n }\n\n // This can be used to attach properties to mode objects from\n // outside the actual mode definition.\n var modeExtensions = {};\n function extendMode(mode, properties) {\n var exts = modeExtensions.hasOwnProperty(mode) ? modeExtensions[mode] : (modeExtensions[mode] = {});\n copyObj(properties, exts);\n }\n\n function copyState(mode, state) {\n if (state === true) { return state }\n if (mode.copyState) { return mode.copyState(state) }\n var nstate = {};\n for (var n in state) {\n var val = state[n];\n if (val instanceof Array) { val = val.concat([]); }\n nstate[n] = val;\n }\n return nstate\n }\n\n // Given a mode and a state (for that mode), find the inner mode and\n // state at the position that the state refers to.\n function innerMode(mode, state) {\n var info;\n while (mode.innerMode) {\n info = mode.innerMode(state);\n if (!info || info.mode == mode) { break }\n state = info.state;\n mode = info.mode;\n }\n return info || {mode: mode, state: state}\n }\n\n function startState(mode, a1, a2) {\n return mode.startState ? mode.startState(a1, a2) : true\n }\n\n // STRING STREAM\n\n // Fed to the mode parsers, provides helper functions to make\n // parsers more succinct.\n\n var StringStream = function(string, tabSize, lineOracle) {\n this.pos = this.start = 0;\n this.string = string;\n this.tabSize = tabSize || 8;\n this.lastColumnPos = this.lastColumnValue = 0;\n this.lineStart = 0;\n this.lineOracle = lineOracle;\n };\n\n StringStream.prototype.eol = function () {return this.pos >= this.string.length};\n StringStream.prototype.sol = function () {return this.pos == this.lineStart};\n StringStream.prototype.peek = function () {return this.string.charAt(this.pos) || undefined};\n StringStream.prototype.next = function () {\n if (this.pos < this.string.length)\n { return this.string.charAt(this.pos++) }\n };\n StringStream.prototype.eat = function (match) {\n var ch = this.string.charAt(this.pos);\n var ok;\n if (typeof match == \"string\") { ok = ch == match; }\n else { ok = ch && (match.test ? match.test(ch) : match(ch)); }\n if (ok) {++this.pos; return ch}\n };\n StringStream.prototype.eatWhile = function (match) {\n var start = this.pos;\n while (this.eat(match)){}\n return this.pos > start\n };\n StringStream.prototype.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 StringStream.prototype.skipToEnd = function () {this.pos = this.string.length;};\n StringStream.prototype.skipTo = function (ch) {\n var found = this.string.indexOf(ch, this.pos);\n if (found > -1) {this.pos = found; return true}\n };\n StringStream.prototype.backUp = function (n) {this.pos -= n;};\n StringStream.prototype.column = function () {\n if (this.lastColumnPos < this.start) {\n this.lastColumnValue = countColumn(this.string, this.start, this.tabSize, this.lastColumnPos, this.lastColumnValue);\n this.lastColumnPos = this.start;\n }\n return this.lastColumnValue - (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0)\n };\n StringStream.prototype.indentation = function () {\n return countColumn(this.string, null, this.tabSize) -\n (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0)\n };\n StringStream.prototype.match = function (pattern, consume, caseInsensitive) {\n if (typeof pattern == \"string\") {\n var cased = function (str) { return caseInsensitive ? str.toLowerCase() : str; };\n var substr = this.string.substr(this.pos, pattern.length);\n if (cased(substr) == cased(pattern)) {\n if (consume !== false) { this.pos += pattern.length; }\n return true\n }\n } else {\n var match = this.string.slice(this.pos).match(pattern);\n if (match && match.index > 0) { return null }\n if (match && consume !== false) { this.pos += match[0].length; }\n return match\n }\n };\n StringStream.prototype.current = function (){return this.string.slice(this.start, this.pos)};\n StringStream.prototype.hideFirstChars = function (n, inner) {\n this.lineStart += n;\n try { return inner() }\n finally { this.lineStart -= n; }\n };\n StringStream.prototype.lookAhead = function (n) {\n var oracle = this.lineOracle;\n return oracle && oracle.lookAhead(n)\n };\n StringStream.prototype.baseToken = function () {\n var oracle = this.lineOracle;\n return oracle && oracle.baseToken(this.pos)\n };\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 var chunk = doc;\n while (!chunk.lines) {\n for (var i = 0;; ++i) {\n var child = chunk.children[i], sz = child.chunkSize();\n if (n < sz) { chunk = child; break }\n n -= sz;\n }\n }\n return chunk.lines[n]\n }\n\n // Get the part of a document between two positions, as an array of\n // strings.\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); }); // iter aborts when callback returns truthy value\n return out\n }\n\n // Update the height of a line, propagating the height change\n // upwards to parent nodes.\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$1 = 0; i$1 < chunk.children.length; ++i$1) {\n var child = chunk.children[i$1], ch = child.height;\n if (h < ch) { chunk = child; continue outer }\n h -= ch;\n n += child.chunkSize();\n }\n return n\n } while (!chunk.lines)\n var i = 0;\n for (; i < chunk.lines.length; ++i) {\n var line = chunk.lines[i], lh = line.height;\n if (h < lh) { break }\n h -= lh;\n }\n return n + i\n }\n\n function isLine(doc, l) {return l >= doc.first && l < doc.first + doc.size}\n\n function lineNumberFor(options, i) {\n return String(options.lineNumberFormatter(i + options.firstLineNumber))\n }\n\n // A Pos instance represents a position within the text.\n function Pos(line, ch, sticky) {\n if ( sticky === void 0 ) sticky = null;\n\n if (!(this instanceof Pos)) { return new Pos(line, ch, sticky) }\n this.line = line;\n this.ch = ch;\n this.sticky = sticky;\n }\n\n // Compare two positions, return 0 if they are the same, a negative\n // number when a is less, and a positive number otherwise.\n function cmp(a, b) { return a.line - b.line || a.ch - b.ch }\n\n function equalCursorPos(a, b) { return a.sticky == b.sticky && cmp(a, b) == 0 }\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 // 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 clipPosArray(doc, array) {\n var out = [];\n for (var i = 0; i < array.length; i++) { out[i] = clipPos(doc, array[i]); }\n return out\n }\n\n var SavedContext = function(state, lookAhead) {\n this.state = state;\n this.lookAhead = lookAhead;\n };\n\n var Context = function(doc, state, line, lookAhead) {\n this.state = state;\n this.doc = doc;\n this.line = line;\n this.maxLookAhead = lookAhead || 0;\n this.baseTokens = null;\n this.baseTokenPos = 1;\n };\n\n Context.prototype.lookAhead = function (n) {\n var line = this.doc.getLine(this.line + n);\n if (line != null && n > this.maxLookAhead) { this.maxLookAhead = n; }\n return line\n };\n\n Context.prototype.baseToken = function (n) {\n if (!this.baseTokens) { return null }\n while (this.baseTokens[this.baseTokenPos] <= n)\n { this.baseTokenPos += 2; }\n var type = this.baseTokens[this.baseTokenPos + 1];\n return {type: type && type.replace(/( |^)overlay .*/, \"\"),\n size: this.baseTokens[this.baseTokenPos] - n}\n };\n\n Context.prototype.nextLine = function () {\n this.line++;\n if (this.maxLookAhead > 0) { this.maxLookAhead--; }\n };\n\n Context.fromSaved = function (doc, saved, line) {\n if (saved instanceof SavedContext)\n { return new Context(doc, copyState(doc.mode, saved.state), line, saved.lookAhead) }\n else\n { return new Context(doc, copyState(doc.mode, saved), line) }\n };\n\n Context.prototype.save = function (copy) {\n var state = copy !== false ? copyState(this.doc.mode, this.state) : this.state;\n return this.maxLookAhead > 0 ? new SavedContext(state, this.maxLookAhead) : state\n };\n\n\n // Compute a style array (an array starting with a mode generation\n // -- for invalidation -- followed by pairs of end positions and\n // style strings), which is used to highlight the tokens on the\n // line.\n function highlightLine(cm, line, context, forceToEnd) {\n // A styles array always starts with a number identifying the\n // mode/overlays that it is based on (for easy invalidation).\n var st = [cm.state.modeGen], lineClasses = {};\n // Compute the base array of styles\n runMode(cm, line.text, cm.doc.mode, context, function (end, style) { return st.push(end, style); },\n lineClasses, forceToEnd);\n var state = context.state;\n\n // Run overlays, adjust style array.\n var loop = function ( o ) {\n context.baseTokens = st;\n var overlay = cm.state.overlays[o], i = 1, at = 0;\n context.state = true;\n runMode(cm, line.text, overlay.mode, context, function (end, style) {\n var start = i;\n // Ensure there's a token end at the current position, and that i points at it\n while (at < end) {\n var i_end = st[i];\n if (i_end > end)\n { st.splice(i, 1, end, st[i+1], i_end); }\n i += 2;\n at = Math.min(end, i_end);\n }\n if (!style) { return }\n if (overlay.opaque) {\n st.splice(start, i - start, end, \"overlay \" + style);\n i = start + 2;\n } else {\n for (; start < i; start += 2) {\n var cur = st[start+1];\n st[start+1] = (cur ? cur + \" \" : \"\") + \"overlay \" + style;\n }\n }\n }, lineClasses);\n context.state = state;\n context.baseTokens = null;\n context.baseTokenPos = 1;\n };\n\n for (var o = 0; o < cm.state.overlays.length; ++o) loop( o );\n\n return {styles: st, classes: lineClasses.bgClass || lineClasses.textClass ? lineClasses : null}\n }\n\n function getLineStyles(cm, line, updateFrontier) {\n if (!line.styles || line.styles[0] != cm.state.modeGen) {\n var context = getContextBefore(cm, lineNo(line));\n var resetState = line.text.length > cm.options.maxHighlightLength && copyState(cm.doc.mode, context.state);\n var result = highlightLine(cm, line, context);\n if (resetState) { context.state = resetState; }\n line.stateAfter = context.save(!resetState);\n line.styles = result.styles;\n if (result.classes) { line.styleClasses = result.classes; }\n else if (line.styleClasses) { line.styleClasses = null; }\n if (updateFrontier === cm.doc.highlightFrontier)\n { cm.doc.modeFrontier = Math.max(cm.doc.modeFrontier, ++cm.doc.highlightFrontier); }\n }\n return line.styles\n }\n\n function getContextBefore(cm, n, precise) {\n var doc = cm.doc, display = cm.display;\n if (!doc.mode.startState) { return new Context(doc, true, n) }\n var start = findStartLine(cm, n, precise);\n var saved = start > doc.first && getLine(doc, start - 1).stateAfter;\n var context = saved ? Context.fromSaved(doc, saved, start) : new Context(doc, startState(doc.mode), start);\n\n doc.iter(start, n, function (line) {\n processLine(cm, line.text, context);\n var pos = context.line;\n line.stateAfter = pos == n - 1 || pos % 5 == 0 || pos >= display.viewFrom && pos < display.viewTo ? context.save() : null;\n context.nextLine();\n });\n if (precise) { doc.modeFrontier = context.line; }\n return context\n }\n\n // Lightweight form of highlight -- proceed over this line and\n // update state, but don't save a style array. Used for lines that\n // aren't currently visible.\n function processLine(cm, text, context, startAt) {\n var mode = cm.doc.mode;\n var stream = new StringStream(text, cm.options.tabSize, context);\n stream.start = stream.pos = startAt || 0;\n if (text == \"\") { callBlankLine(mode, context.state); }\n while (!stream.eol()) {\n readToken(mode, stream, context.state);\n stream.start = stream.pos;\n }\n }\n\n function callBlankLine(mode, state) {\n if (mode.blankLine) { return mode.blankLine(state) }\n if (!mode.innerMode) { return }\n var inner = innerMode(mode, state);\n if (inner.mode.blankLine) { return inner.mode.blankLine(inner.state) }\n }\n\n function readToken(mode, stream, state, inner) {\n for (var i = 0; i < 10; i++) {\n if (inner) { inner[0] = innerMode(mode, state).mode; }\n var style = mode.token(stream, state);\n if (stream.pos > stream.start) { return style }\n }\n throw new Error(\"Mode \" + mode.name + \" failed to advance stream.\")\n }\n\n var Token = function(stream, type, state) {\n this.start = stream.start; this.end = stream.pos;\n this.string = stream.current();\n this.type = type || null;\n this.state = state;\n };\n\n // Utility for getTokenAt and getLineTokens\n function takeToken(cm, pos, precise, asArray) {\n var doc = cm.doc, mode = doc.mode, style;\n pos = clipPos(doc, pos);\n var line = getLine(doc, pos.line), context = getContextBefore(cm, pos.line, precise);\n var stream = new StringStream(line.text, cm.options.tabSize, context), tokens;\n if (asArray) { tokens = []; }\n while ((asArray || stream.pos < pos.ch) && !stream.eol()) {\n stream.start = stream.pos;\n style = readToken(mode, stream, context.state);\n if (asArray) { tokens.push(new Token(stream, style, copyState(doc.mode, context.state))); }\n }\n return asArray ? tokens : new Token(stream, style, context.state)\n }\n\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 // Run the given mode's parser over a line, calling f for each token.\n function runMode(cm, text, mode, context, f, lineClasses, forceToEnd) {\n var flattenSpans = mode.flattenSpans;\n if (flattenSpans == null) { flattenSpans = cm.options.flattenSpans; }\n var curStart = 0, curStyle = null;\n var stream = new StringStream(text, cm.options.tabSize, context), style;\n var inner = cm.options.addModeClass && [null];\n if (text == \"\") { extractLineClasses(callBlankLine(mode, context.state), lineClasses); }\n while (!stream.eol()) {\n if (stream.pos > cm.options.maxHighlightLength) {\n flattenSpans = false;\n if (forceToEnd) { processLine(cm, text, context, stream.pos); }\n stream.pos = text.length;\n style = null;\n } else {\n style = extractLineClasses(readToken(mode, stream, context.state, inner), lineClasses);\n }\n if (inner) {\n var mName = inner[0].name;\n if (mName) { style = \"m-\" + (style ? mName + \" \" + style : mName); }\n }\n if (!flattenSpans || curStyle != style) {\n while (curStart < stream.start) {\n curStart = Math.min(stream.start, curStart + 5000);\n f(curStart, curStyle);\n }\n curStyle = style;\n }\n stream.start = stream.pos;\n }\n while (curStart < stream.pos) {\n // Webkit seems to refuse to render text nodes longer than 57444\n // characters, and returns inaccurate measurements in nodes\n // starting around 5000 chars.\n var pos = Math.min(stream.pos, curStart + 5000);\n f(pos, curStyle);\n curStart = pos;\n }\n }\n\n // Finds the line to start with when starting a parse. Tries to\n // find a line with a stateAfter, so that it can start with a\n // valid state. If that fails, it returns the line with the\n // smallest indentation, which tends to need the least context to\n // parse correctly.\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), after = line.stateAfter;\n if (after && (!precise || search + (after instanceof SavedContext ? after.lookAhead : 0) <= doc.modeFrontier))\n { return search }\n var indented = countColumn(line.text, null, cm.options.tabSize);\n if (minline == null || minindent > indented) {\n minline = search - 1;\n minindent = indented;\n }\n }\n return minline\n }\n\n function retreatFrontier(doc, n) {\n doc.modeFrontier = Math.min(doc.modeFrontier, n);\n if (doc.highlightFrontier < n - 10) { return }\n var start = doc.first;\n for (var line = n - 1; line > start; line--) {\n var saved = getLine(doc, line).stateAfter;\n // change is on 3\n // state on line 1 looked ahead 2 -- so saw 3\n // test 1 + 2 < 3 should cover this\n if (saved && (!(saved instanceof SavedContext) || line + saved.lookAhead < n)) {\n start = line + 1;\n break\n }\n }\n doc.highlightFrontier = Math.min(doc.highlightFrontier, start);\n }\n\n // Optimize some code when these features are not used.\n var sawReadOnlySpans = false, sawCollapsedSpans = false;\n\n function seeReadOnlySpans() {\n sawReadOnlySpans = true;\n }\n\n function seeCollapsedSpans() {\n sawCollapsedSpans = true;\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\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 var r;\n for (var i = 0; i < spans.length; ++i)\n { if (spans[i] != span) { (r || (r = [])).push(spans[i]); } }\n return r\n }\n\n // Add a span to a line.\n function addMarkedSpan(line, span, op) {\n var inThisOp = op && window.WeakSet && (op.markedSpans || (op.markedSpans = new WeakSet));\n if (inThisOp && line.markedSpans && inThisOp.has(line.markedSpans)) {\n line.markedSpans.push(span);\n } else {\n line.markedSpans = line.markedSpans ? line.markedSpans.concat([span]) : [span];\n if (inThisOp) { inThisOp.add(line.markedSpans); }\n }\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 var nw;\n if (old) { for (var i = 0; i < old.length; ++i) {\n var span = old[i], marker = span.marker;\n var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= startCh : span.from < startCh);\n if (startsBefore || span.from == startCh && marker.type == \"bookmark\" && (!isInsert || !span.marker.insertLeft)) {\n var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= startCh : span.to > startCh)\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 var nw;\n if (old) { for (var i = 0; i < old.length; ++i) {\n var span = old[i], marker = span.marker;\n var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= endCh : span.to > endCh);\n if (endsAfter || span.from == endCh && marker.type == \"bookmark\" && (!isInsert || span.marker.insertLeft)) {\n var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= endCh : span.from < endCh)\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$1 = 0; i$1 < last.length; ++i$1) {\n var span$1 = last[i$1];\n if (span$1.to != null) { span$1.to += offset; }\n if (span$1.from == null) {\n var found$1 = getMarkedSpanFor(first, span$1.marker);\n if (!found$1) {\n span$1.from = offset;\n if (sameLine) { (first || (first = [])).push(span$1); }\n }\n } else {\n span$1.from += offset;\n if (sameLine) { (first || (first = [])).push(span$1); }\n }\n }\n }\n // Make sure we didn't create any zero-length spans\n if (first) { first = clearEmptySpans(first); }\n if (last && last != first) { last = clearEmptySpans(last); }\n\n var newMarkers = [first];\n if (!sameLine) {\n // Fill gap with whole-line-spans\n var gap = change.text.length - 2, gapMarkers;\n if (gap > 0 && first)\n { for (var i$2 = 0; i$2 < first.length; ++i$2)\n { if (first[i$2].to == null)\n { (gapMarkers || (gapMarkers = [])).push(new MarkedSpan(first[i$2].marker, null, null)); } } }\n for (var i$3 = 0; i$3 < gap; ++i$3)\n { newMarkers.push(gapMarkers); }\n newMarkers.push(last);\n }\n return newMarkers\n }\n\n // Remove spans that are empty and don't have a clearWhenEmpty\n // option of false.\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 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 - 3;\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 = (void 0), i = 0; i < sps.length; ++i) {\n sp = sps[i];\n if (sp.marker.collapsed && (start ? sp.from : sp.to) == null &&\n (!found || compareCollapsedMarkers(found, sp.marker) < 0))\n { found = sp.marker; }\n } }\n return found\n }\n function collapsedSpanAtStart(line) { return collapsedSpanAtSide(line, true) }\n function collapsedSpanAtEnd(line) { return collapsedSpanAtSide(line, false) }\n\n function collapsedSpanAround(line, ch) {\n var sps = sawCollapsedSpans && line.markedSpans, found;\n if (sps) { for (var i = 0; i < sps.length; ++i) {\n var sp = sps[i];\n if (sp.marker.collapsed && (sp.from == null || sp.from < ch) && (sp.to == null || sp.to > ch) &&\n (!found || compareCollapsedMarkers(found, sp.marker) < 0)) { found = sp.marker; }\n } }\n return found\n }\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 function visualLineEnd(line) {\n var merged;\n while (merged = collapsedSpanAtEnd(line))\n { line = merged.find(1, true).line; }\n return line\n }\n\n // Returns an array of logical lines that continue the visual line\n // started by the argument, or undefined if there are no such lines.\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\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 = (void 0), i = 0; i < sps.length; ++i) {\n sp = sps[i];\n if (!sp.marker.collapsed) { continue }\n if (sp.from == null) { return true }\n if (sp.marker.widgetNode) { continue }\n if (sp.from == 0 && sp.marker.inclusiveLeft && lineIsHiddenInner(doc, line, sp))\n { return true }\n } }\n }\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 = (void 0), i = 0; i < line.markedSpans.length; ++i) {\n sp = line.markedSpans[i];\n if (sp.marker.collapsed && !sp.marker.widgetNode && sp.from == span.to &&\n (sp.to == null || sp.to != span.from) &&\n (sp.marker.inclusiveLeft || span.marker.inclusiveRight) &&\n lineIsHiddenInner(doc, line, sp)) { return true }\n }\n }\n\n // Find the height above the given line.\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$1 = 0; i$1 < p.children.length; ++i$1) {\n var cur = p.children[i$1];\n if (cur == chunk) { break }\n else { h += cur.height; }\n }\n }\n return h\n }\n\n // Compute the character length of a line, taking into account\n // collapsed ranges (see markText) that might hide parts, and join\n // other lines onto it.\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$1 = merged.find(0, true);\n len -= cur.text.length - found$1.from.ch;\n cur = found$1.to.line;\n len += cur.text.length - found$1.to.ch;\n }\n return len\n }\n\n // Find the longest line in the document.\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 // LINE DATA STRUCTURE\n\n // Line objects. These hold state related to a line, including\n // highlighting info (the styles array).\n var Line = function(text, markedSpans, estimateHeight) {\n this.text = text;\n attachMarkedSpans(this, markedSpans);\n this.height = estimateHeight ? estimateHeight(this) : 1;\n };\n\n Line.prototype.lineNo = function () { return lineNo(this) };\n eventMixin(Line);\n\n // Change the content (text, markers) of a line. Automatically\n // invalidates cached information and tries to re-estimate the\n // line's height.\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 // 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 = eltP(\"span\", null, null, webkit ? \"padding-right: .1px\" : null);\n var builder = {pre: eltP(\"pre\", [content], \"CodeMirror-line\"), content: content,\n col: 0, pos: 0, cm: cm,\n trailingSpace: false,\n splitSpaces: cm.getOption(\"lineWrapping\")};\n lineView.measure = {};\n\n // Iterate over the logical lines that make up this visual line.\n for (var i = 0; i <= (lineView.rest ? lineView.rest.length : 0); i++) {\n var line = i ? lineView.rest[i - 1] : lineView.line, order = (void 0);\n builder.pos = 0;\n builder.addToken = buildToken;\n // Optionally wire in some hacks into the token-rendering\n // algorithm, to deal with browser quirks.\n if (hasBadBidiRects(cm.display.measure) && (order = getOrder(line, cm.doc.direction)))\n { builder.addToken = buildTokenBadBidi(builder.addToken, order); }\n builder.map = [];\n var allowFrontierUpdate = lineView != cm.display.externalMeasured && lineNo(line);\n insertLineContent(line, builder, getLineStyles(cm, line, allowFrontierUpdate));\n if (line.styleClasses) {\n if (line.styleClasses.bgClass)\n { builder.bgClass = joinClasses(line.styleClasses.bgClass, builder.bgClass || \"\"); }\n if (line.styleClasses.textClass)\n { builder.textClass = joinClasses(line.styleClasses.textClass, builder.textClass || \"\"); }\n }\n\n // Ensure at least a single node is present, for measuring.\n if (builder.map.length == 0)\n { builder.map.push(0, 0, builder.content.appendChild(zeroWidthElement(cm.display.measure))); }\n\n // Store the map and a cache object for the current logical line\n if (i == 0) {\n lineView.measure.map = builder.map;\n lineView.measure.cache = {};\n } else {\n (lineView.measure.maps || (lineView.measure.maps = [])).push(builder.map)\n ;(lineView.measure.caches || (lineView.measure.caches = [])).push({});\n }\n }\n\n // See issue #2901\n if (webkit) {\n var last = builder.content.lastChild;\n if (/\\bcm-tab\\b/.test(last.className) || (last.querySelector && last.querySelector(\".cm-tab\")))\n { builder.content.className = \"cm-tab-wrap-hack\"; }\n }\n\n signal(cm, \"renderLine\", cm, lineView.line, builder.pre);\n if (builder.pre.className)\n { builder.textClass = joinClasses(builder.pre.className, builder.textClass || \"\"); }\n\n return builder\n }\n\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, css, attributes) {\n if (!text) { return }\n var displayText = builder.splitSpaces ? splitSpaces(text, builder.trailingSpace) : text;\n var special = builder.cm.state.specialChars, mustWrap = false;\n var content;\n if (!special.test(text)) {\n builder.col += text.length;\n content = document.createTextNode(displayText);\n builder.map.push(builder.pos, builder.pos + text.length, content);\n if (ie && ie_version < 9) { mustWrap = true; }\n builder.pos += text.length;\n } else {\n content = document.createDocumentFragment();\n var pos = 0;\n while (true) {\n special.lastIndex = pos;\n var m = special.exec(text);\n var skipped = m ? m.index - pos : text.length - pos;\n if (skipped) {\n var txt = document.createTextNode(displayText.slice(pos, pos + skipped));\n if (ie && ie_version < 9) { content.appendChild(elt(\"span\", [txt])); }\n else { content.appendChild(txt); }\n builder.map.push(builder.pos, builder.pos + skipped, txt);\n builder.col += skipped;\n builder.pos += skipped;\n }\n if (!m) { break }\n pos += skipped + 1;\n var txt$1 = (void 0);\n if (m[0] == \"\\t\") {\n var tabSize = builder.cm.options.tabSize, tabWidth = tabSize - builder.col % tabSize;\n txt$1 = content.appendChild(elt(\"span\", spaceStr(tabWidth), \"cm-tab\"));\n txt$1.setAttribute(\"role\", \"presentation\");\n txt$1.setAttribute(\"cm-text\", \"\\t\");\n builder.col += tabWidth;\n } else if (m[0] == \"\\r\" || m[0] == \"\\n\") {\n txt$1 = content.appendChild(elt(\"span\", m[0] == \"\\r\" ? \"\\u240d\" : \"\\u2424\", \"cm-invalidchar\"));\n txt$1.setAttribute(\"cm-text\", m[0]);\n builder.col += 1;\n } else {\n txt$1 = builder.cm.options.specialCharPlaceholder(m[0]);\n txt$1.setAttribute(\"cm-text\", m[0]);\n if (ie && ie_version < 9) { content.appendChild(elt(\"span\", [txt$1])); }\n else { content.appendChild(txt$1); }\n builder.col += 1;\n }\n builder.map.push(builder.pos, builder.pos + 1, txt$1);\n builder.pos++;\n }\n }\n builder.trailingSpace = displayText.charCodeAt(text.length - 1) == 32;\n if (style || startStyle || endStyle || mustWrap || css || attributes) {\n var fullStyle = style || \"\";\n if (startStyle) { fullStyle += startStyle; }\n if (endStyle) { fullStyle += endStyle; }\n var token = elt(\"span\", [content], fullStyle, css);\n if (attributes) {\n for (var attr in attributes) { if (attributes.hasOwnProperty(attr) && attr != \"style\" && attr != \"class\")\n { token.setAttribute(attr, attributes[attr]); } }\n }\n return builder.content.appendChild(token)\n }\n builder.content.appendChild(content);\n }\n\n // Change some spaces to NBSP to prevent the browser from collapsing\n // trailing spaces at the end of a line when rendering text (issue #1362).\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, css, attributes) {\n style = style ? style + \" cm-force-border\" : \"cm-force-border\";\n var start = builder.pos, end = start + text.length;\n for (;;) {\n // Find the part that overlaps with the start of this text\n var part = (void 0);\n for (var i = 0; i < order.length; i++) {\n part = order[i];\n if (part.to > start && part.from <= start) { break }\n }\n if (part.to >= end) { return inner(builder, text, style, startStyle, endStyle, css, attributes) }\n inner(builder, text.slice(0, part.to - start), style, startStyle, null, css, attributes);\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 = 1; i$1 < styles.length; i$1+=2)\n { builder.addToken(builder, allText.slice(at, at = styles[i$1]), interpretTokenStyle(styles[i$1+1], builder.cm.options)); }\n return\n }\n\n var len = allText.length, pos = 0, i = 1, text = \"\", style, css;\n var nextChange = 0, spanStyle, spanEndStyle, spanStartStyle, collapsed, attributes;\n for (;;) {\n if (nextChange == pos) { // Update current marker set\n spanStyle = spanEndStyle = spanStartStyle = css = \"\";\n attributes = null;\n collapsed = null; nextChange = Infinity;\n var foundBookmarks = [], endStyles = (void 0);\n for (var j = 0; j < spans.length; ++j) {\n var sp = spans[j], m = sp.marker;\n if (m.type == \"bookmark\" && sp.from == pos && m.widgetNode) {\n foundBookmarks.push(m);\n } else if (sp.from <= pos && (sp.to == null || sp.to > pos || m.collapsed && sp.to == pos && sp.from == pos)) {\n if (sp.to != null && sp.to != pos && nextChange > sp.to) {\n nextChange = sp.to;\n spanEndStyle = \"\";\n }\n if (m.className) { spanStyle += \" \" + m.className; }\n if (m.css) { css = (css ? css + \";\" : \"\") + m.css; }\n if (m.startStyle && sp.from == pos) { spanStartStyle += \" \" + m.startStyle; }\n if (m.endStyle && sp.to == nextChange) { (endStyles || (endStyles = [])).push(m.endStyle, sp.to); }\n // support for the old title property\n // https://github.com/codemirror/CodeMirror/pull/5673\n if (m.title) { (attributes || (attributes = {})).title = m.title; }\n if (m.attributes) {\n for (var attr in m.attributes)\n { (attributes || (attributes = {}))[attr] = m.attributes[attr]; }\n }\n if (m.collapsed && (!collapsed || compareCollapsedMarkers(collapsed.marker, m) < 0))\n { collapsed = sp; }\n } else if (sp.from > pos && nextChange > sp.from) {\n nextChange = sp.from;\n }\n }\n if (endStyles) { for (var j$1 = 0; j$1 < endStyles.length; j$1 += 2)\n { if (endStyles[j$1 + 1] == nextChange) { spanEndStyle += \" \" + endStyles[j$1]; } } }\n\n if (!collapsed || collapsed.from == pos) { for (var j$2 = 0; j$2 < foundBookmarks.length; ++j$2)\n { buildCollapsedSpan(builder, 0, foundBookmarks[j$2]); } }\n if (collapsed && (collapsed.from || 0) == pos) {\n buildCollapsedSpan(builder, (collapsed.to == null ? len + 1 : collapsed.to) - pos,\n collapsed.marker, collapsed.from == null);\n if (collapsed.to == null) { return }\n if (collapsed.to == pos) { collapsed = false; }\n }\n }\n if (pos >= len) { break }\n\n var upto = Math.min(len, nextChange);\n while (true) {\n if (text) {\n var end = pos + text.length;\n if (!collapsed) {\n var tokenText = end > upto ? text.slice(0, upto - pos) : text;\n builder.addToken(builder, tokenText, style ? style + spanStyle : spanStyle,\n spanStartStyle, pos + tokenText.length == nextChange ? spanEndStyle : \"\", css, attributes);\n }\n if (end >= upto) {text = text.slice(upto - pos); pos = upto; break}\n pos = end;\n spanStartStyle = \"\";\n }\n text = allText.slice(at, at = styles[i++]);\n style = interpretTokenStyle(styles[i++], builder.cm.options);\n }\n }\n }\n\n\n // These objects are used to represent the visible (currently drawn)\n // part of the document. A LineView may correspond to multiple\n // logical lines, if those are connected by collapsed ranges.\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 var operationGroup = null;\n\n function pushOperation(op) {\n if (operationGroup) {\n operationGroup.ops.push(op);\n } else {\n op.ownsGroup = operationGroup = {\n ops: [op],\n delayedCallbacks: []\n };\n }\n }\n\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 function finishOperation(op, endCb) {\n var group = op.ownsGroup;\n if (!group) { return }\n\n try { fireCallbacksForOps(group); }\n finally {\n operationGroup = null;\n endCb(group);\n }\n }\n\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);\n if (!arr.length) { return }\n var args = Array.prototype.slice.call(arguments, 2), list;\n if (operationGroup) {\n list = operationGroup.delayedCallbacks;\n } else if (orphanDelayedCallbacks) {\n list = orphanDelayedCallbacks;\n } else {\n list = orphanDelayedCallbacks = [];\n setTimeout(fireOrphanDelayed, 0);\n }\n var loop = function ( i ) {\n list.push(function () { return arr[i].apply(null, args); });\n };\n\n for (var i = 0; i < arr.length; ++i)\n loop( i );\n }\n\n function fireOrphanDelayed() {\n var delayed = orphanDelayedCallbacks;\n orphanDelayedCallbacks = null;\n for (var i = 0; i < delayed.length; ++i) { delayed[i](); }\n }\n\n // When an aspect of a line changes, a string is added to\n // lineView.changes. This updates the relevant part of the line's\n // DOM structure.\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(cm, lineView); }\n else if (type == \"widget\") { updateLineWidgets(cm, lineView, dims); }\n }\n lineView.changes = null;\n }\n\n // Lines with gutter elements, widgets or a background class need to\n // be wrapped, and have the extra elements added to the wrapper div\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(cm, lineView) {\n var cls = lineView.bgClass ? lineView.bgClass + \" \" + (lineView.line.bgClass || \"\") : lineView.line.bgClass;\n if (cls) { cls += \" CodeMirror-linebackground\"; }\n if (lineView.background) {\n if (cls) { lineView.background.className = cls; }\n else { lineView.background.parentNode.removeChild(lineView.background); lineView.background = null; }\n } else if (cls) {\n var wrap = ensureLineWrapped(lineView);\n lineView.background = wrap.insertBefore(elt(\"div\", null, cls), wrap.firstChild);\n cm.display.input.setUneditable(lineView.background);\n }\n }\n\n // Wrapper around buildLineContent which will reuse the structure\n // in display.externalMeasured when possible.\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(cm, lineView);\n } else if (cls) {\n lineView.text.className = cls;\n }\n }\n\n function updateLineClasses(cm, lineView) {\n updateLineBackground(cm, lineView);\n if (lineView.line.wrapClass)\n { ensureLineWrapped(lineView).className = lineView.line.wrapClass; }\n else if (lineView.node != lineView.text)\n { lineView.node.className = \"\"; }\n var textClass = lineView.textClass ? lineView.textClass + \" \" + (lineView.line.textClass || \"\") : lineView.line.textClass;\n lineView.text.className = textClass || \"\";\n }\n\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) + \"px; width: \" + (dims.gutterTotalWidth) + \"px\"));\n cm.display.input.setUneditable(lineView.gutterBackground);\n wrap.insertBefore(lineView.gutterBackground, lineView.text);\n }\n var markers = lineView.line.gutterMarkers;\n if (cm.options.lineNumbers || markers) {\n var wrap$1 = ensureLineWrapped(lineView);\n var gutterWrap = lineView.gutter = elt(\"div\", null, \"CodeMirror-gutter-wrapper\", (\"left: \" + (cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) + \"px\"));\n gutterWrap.setAttribute(\"aria-hidden\", \"true\");\n cm.display.input.setUneditable(gutterWrap);\n wrap$1.insertBefore(gutterWrap, lineView.text);\n if (lineView.line.gutterClass)\n { gutterWrap.className += \" \" + lineView.line.gutterClass; }\n if (cm.options.lineNumbers && (!markers || !markers[\"CodeMirror-linenumbers\"]))\n { lineView.lineNumber = gutterWrap.appendChild(\n elt(\"div\", lineNumberFor(cm.options, lineN),\n \"CodeMirror-linenumber CodeMirror-gutter-elt\",\n (\"left: \" + (dims.gutterLeft[\"CodeMirror-linenumbers\"]) + \"px; width: \" + (cm.display.lineNumInnerWidth) + \"px\"))); }\n if (markers) { for (var k = 0; k < cm.display.gutterSpecs.length; ++k) {\n var id = cm.display.gutterSpecs[k].className, found = markers.hasOwnProperty(id) && markers[id];\n if (found)\n { gutterWrap.appendChild(elt(\"div\", [found], \"CodeMirror-gutter-elt\",\n (\"left: \" + (dims.gutterLeft[id]) + \"px; width: \" + (dims.gutterWidth[id]) + \"px\"))); }\n } }\n }\n }\n\n function updateLineWidgets(cm, lineView, dims) {\n if (lineView.alignable) { lineView.alignable = null; }\n var isWidget = classTest(\"CodeMirror-linewidget\");\n for (var node = lineView.node.firstChild, next = (void 0); node; node = next) {\n next = node.nextSibling;\n if (isWidget.test(node.className)) { 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(cm, lineView);\n updateLineGutter(cm, lineView, lineN, dims);\n insertLineWidgets(cm, lineView, dims);\n return lineView.node\n }\n\n // A lineView may contain multiple logical lines (when merged by\n // collapsed spans). The widgets for all of them need to be drawn.\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\" + (widget.className ? \" \" + widget.className : \"\"));\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 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 // 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 // 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\", \"CodeMirror-line-like\"));\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 if (lineView.rest) {\n for (var i = 0; i < lineView.rest.length; i++)\n { if (lineView.rest[i] == line)\n { return {map: lineView.measure.maps[i], cache: lineView.measure.caches[i]} } }\n for (var i$1 = 0; i$1 < lineView.rest.length; i$1++)\n { if (lineNo(lineView.rest[i$1]) > lineN)\n { return {map: lineView.measure.maps[i$1], cache: lineView.measure.caches[i$1], before: true} } }\n }\n }\n\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, mStart, mEnd;\n // First, search the line map for the text node corresponding to,\n // or closest to, the target character.\n for (var i = 0; i < map.length; i += 3) {\n mStart = map[i];\n 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$1 = rects.length - 1; i$1 >= 0; i$1--) {\n if ((rect = rects[i$1]).left != rect.right) { break }\n } }\n return rect\n }\n\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$1 = 0; i$1 < 4; i$1++) { // Retry a maximum of 4 times when nonsense rectangles are returned\n while (start && isExtendingChar(prepared.line.text.charAt(place.coverStart + start))) { --start; }\n while (place.coverStart + end < place.coverEnd && isExtendingChar(prepared.line.text.charAt(place.coverStart + end))) { ++end; }\n if (ie && ie_version < 9 && start == 0 && end == place.coverEnd - place.coverStart)\n { rect = node.parentNode.getBoundingClientRect(); }\n else\n { rect = getUsefulRect(range(node, start, end).getClientRects(), bias); }\n if (rect.left || rect.right || start == 0) { break }\n end = start;\n start = start - 1;\n collapse = \"right\";\n }\n if (ie && ie_version < 11) { rect = maybeUpdateRectForZooming(cm.display.measure, rect); }\n } else { // If it is a widget, simply get the box for the whole widget.\n if (start > 0) { collapse = bias = \"right\"; }\n var rects;\n if (cm.options.lineWrapping && (rects = node.getClientRects()).length > 1)\n { rect = rects[bias == \"right\" ? rects.length - 1 : 0]; }\n else\n { rect = node.getBoundingClientRect(); }\n }\n if (ie && ie_version < 9 && !start && (!rect || !rect.left && !rect.right)) {\n var rSpan = node.parentNode.getClientRects()[0];\n if (rSpan)\n { rect = {left: rSpan.left, right: rSpan.left + charWidth(cm.display), top: rSpan.top, bottom: rSpan.bottom}; }\n else\n { rect = nullRect; }\n }\n\n var rtop = rect.top - prepared.rect.top, rbot = rect.bottom - prepared.rect.top;\n var mid = (rtop + rbot) / 2;\n var heights = prepared.view.measure.heights;\n var i = 0;\n for (; i < heights.length - 1; i++)\n { if (mid < heights[i]) { break } }\n var top = i ? heights[i - 1] : 0, bot = heights[i];\n var result = {left: (collapse == \"right\" ? rect.right : rect.left) - prepared.rect.left,\n right: (collapse == \"left\" ? rect.left : rect.right) - prepared.rect.left,\n top: top, bottom: bot};\n if (!rect.left && !rect.right) { result.bogus = true; }\n if (!cm.options.singleCursorHeightPerLine) { result.rtop = rtop; result.rbottom = rbot; }\n\n return result\n }\n\n // Work around problem with bounding client rects on ranges being\n // returned incorrectly when zoomed on IE10 and below.\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(doc) {\n // Work around https://bugs.chromium.org/p/chromium/issues/detail?id=489206\n // which causes page_Offset and bounding client rects to use\n // different reference viewports and invalidate our calculations.\n if (chrome && android) { return -(doc.body.getBoundingClientRect().left - parseInt(getComputedStyle(doc.body).marginLeft)) }\n return doc.defaultView.pageXOffset || (doc.documentElement || doc.body).scrollLeft\n }\n function pageScrollY(doc) {\n if (chrome && android) { return -(doc.body.getBoundingClientRect().top - parseInt(getComputedStyle(doc.body).marginTop)) }\n return doc.defaultView.pageYOffset || (doc.documentElement || doc.body).scrollTop\n }\n\n function widgetTopHeight(lineObj) {\n var ref = visualLine(lineObj);\n var widgets = ref.widgets;\n var height = 0;\n if (widgets) { for (var i = 0; i < widgets.length; ++i) { if (widgets[i].above)\n { height += widgetHeight(widgets[i]); } } }\n return height\n }\n\n // Converts a {top, bottom, left, right} box from line-local\n // coordinates into another coordinate system. Context may be one of\n // \"line\", \"div\" (display.lineDiv), \"local\"./null (editor), \"window\",\n // or \"page\".\n function intoCoordSystem(cm, lineObj, rect, context, includeWidgets) {\n if (!includeWidgets) {\n var height = widgetTopHeight(lineObj);\n rect.top += height; rect.bottom += height;\n }\n if (context == \"line\") { return rect }\n if (!context) { context = \"local\"; }\n var yOff = heightAtLine(lineObj);\n if (context == \"local\") { yOff += paddingTop(cm.display); }\n else { yOff -= cm.display.viewOffset; }\n if (context == \"page\" || context == \"window\") {\n var lOff = cm.display.lineSpace.getBoundingClientRect();\n yOff += lOff.top + (context == \"window\" ? 0 : pageScrollY(doc(cm)));\n var xOff = lOff.left + (context == \"window\" ? 0 : pageScrollX(doc(cm)));\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(doc(cm));\n top -= pageScrollY(doc(cm));\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 // A cursor Pos(line, char, \"before\") is on the same visual line as `char - 1`\n // and after `char - 1` in writing order of `char - 1`\n // A cursor Pos(line, char, \"after\") is on the same visual line as `char`\n // and before `char` in writing order of `char`\n // Examples (upper-case letters are RTL, lower-case are LTR):\n // Pos(0, 1, ...)\n // before after\n // ab a|b a|b\n // aB a|B aB|\n // Ab |Ab A|b\n // AB B|A B|A\n // Every position after the last character on a line is considered to stick\n // to the last character on the line.\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 var order = getOrder(lineObj, cm.doc.direction), ch = pos.ch, sticky = pos.sticky;\n if (ch >= lineObj.text.length) {\n ch = lineObj.text.length;\n sticky = \"before\";\n } else if (ch <= 0) {\n ch = 0;\n sticky = \"after\";\n }\n if (!order) { return get(sticky == \"before\" ? ch - 1 : ch, sticky == \"before\") }\n\n function getBidi(ch, partPos, invert) {\n var part = order[partPos], right = part.level == 1;\n return get(invert ? ch - 1 : ch, right != invert)\n }\n var partPos = getBidiPartAt(order, ch, sticky);\n var other = bidiOther;\n var val = getBidi(ch, partPos, sticky == \"before\");\n if (other != null) { val.other = getBidi(ch, other, sticky != \"before\"); }\n return val\n }\n\n // Used to cheaply estimate the coordinates for a position. Used for\n // intermediate scroll updates.\n function estimateCoords(cm, pos) {\n var left = 0;\n pos = clipPos(cm.doc, pos);\n if (!cm.options.lineWrapping) { left = charWidth(cm.display) * pos.ch; }\n var lineObj = getLine(cm.doc, pos.line);\n var top = heightAtLine(lineObj) + paddingTop(cm.display);\n return {left: left, right: left, top: top, bottom: top + lineObj.height}\n }\n\n // Positions returned by coordsChar contain some extra information.\n // xRel is the relative x position of the input coordinates compared\n // to the found position (so xRel > 0 means the coordinates are to\n // the right of the character position, for example). When outside\n // is true, that means the coordinates lie outside the line's\n // vertical range.\n function PosWithInfo(line, ch, sticky, outside, xRel) {\n var pos = Pos(line, ch, sticky);\n pos.xRel = xRel;\n if (outside) { pos.outside = outside; }\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, null, -1, -1) }\n var lineN = lineAtHeight(doc, y), last = doc.first + doc.size - 1;\n if (lineN > last)\n { return PosWithInfo(doc.first + doc.size - 1, getLine(doc, last).text.length, null, 1, 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 collapsed = collapsedSpanAround(lineObj, found.ch + (found.xRel > 0 || found.outside > 0 ? 1 : 0));\n if (!collapsed) { return found }\n var rangeEnd = collapsed.find(1);\n if (rangeEnd.line == lineN) { return rangeEnd }\n lineObj = getLine(doc, lineN = rangeEnd.line);\n }\n }\n\n function wrappedLineExtent(cm, lineObj, preparedMeasure, y) {\n y -= widgetTopHeight(lineObj);\n var end = lineObj.text.length;\n var begin = findFirst(function (ch) { return measureCharPrepared(cm, preparedMeasure, ch - 1).bottom <= y; }, end, 0);\n end = findFirst(function (ch) { return measureCharPrepared(cm, preparedMeasure, ch).top > y; }, begin, end);\n return {begin: begin, end: end}\n }\n\n function wrappedLineExtentChar(cm, lineObj, preparedMeasure, target) {\n if (!preparedMeasure) { preparedMeasure = prepareMeasureForLine(cm, lineObj); }\n var targetTop = intoCoordSystem(cm, lineObj, measureCharPrepared(cm, preparedMeasure, target), \"line\").top;\n return wrappedLineExtent(cm, lineObj, preparedMeasure, targetTop)\n }\n\n // Returns true if the given side of a box is after the given\n // coordinates, in top-to-bottom, left-to-right order.\n function boxIsAfter(box, x, y, left) {\n return box.bottom <= y ? false : box.top > y ? true : (left ? box.left : box.right) > x\n }\n\n function coordsCharInner(cm, lineObj, lineNo, x, y) {\n // Move y into line-local coordinate space\n y -= heightAtLine(lineObj);\n var preparedMeasure = prepareMeasureForLine(cm, lineObj);\n // When directly calling `measureCharPrepared`, we have to adjust\n // for the widgets at this line.\n var widgetHeight = widgetTopHeight(lineObj);\n var begin = 0, end = lineObj.text.length, ltr = true;\n\n var order = getOrder(lineObj, cm.doc.direction);\n // If the line isn't plain left-to-right text, first figure out\n // which bidi section the coordinates fall into.\n if (order) {\n var part = (cm.options.lineWrapping ? coordsBidiPartWrapped : coordsBidiPart)\n (cm, lineObj, lineNo, preparedMeasure, order, x, y);\n ltr = part.level != 1;\n // The awkward -1 offsets are needed because findFirst (called\n // on these below) will treat its first bound as inclusive,\n // second as exclusive, but we want to actually address the\n // characters in the part's range\n begin = ltr ? part.from : part.to - 1;\n end = ltr ? part.to : part.from - 1;\n }\n\n // A binary search to find the first character whose bounding box\n // starts after the coordinates. If we run across any whose box wrap\n // the coordinates, store that.\n var chAround = null, boxAround = null;\n var ch = findFirst(function (ch) {\n var box = measureCharPrepared(cm, preparedMeasure, ch);\n box.top += widgetHeight; box.bottom += widgetHeight;\n if (!boxIsAfter(box, x, y, false)) { return false }\n if (box.top <= y && box.left <= x) {\n chAround = ch;\n boxAround = box;\n }\n return true\n }, begin, end);\n\n var baseX, sticky, outside = false;\n // If a box around the coordinates was found, use that\n if (boxAround) {\n // Distinguish coordinates nearer to the left or right side of the box\n var atLeft = x - boxAround.left < boxAround.right - x, atStart = atLeft == ltr;\n ch = chAround + (atStart ? 0 : 1);\n sticky = atStart ? \"after\" : \"before\";\n baseX = atLeft ? boxAround.left : boxAround.right;\n } else {\n // (Adjust for extended bound, if necessary.)\n if (!ltr && (ch == end || ch == begin)) { ch++; }\n // To determine which side to associate with, get the box to the\n // left of the character and compare it's vertical position to the\n // coordinates\n sticky = ch == 0 ? \"after\" : ch == lineObj.text.length ? \"before\" :\n (measureCharPrepared(cm, preparedMeasure, ch - (ltr ? 1 : 0)).bottom + widgetHeight <= y) == ltr ?\n \"after\" : \"before\";\n // Now get accurate coordinates for this place, in order to get a\n // base X position\n var coords = cursorCoords(cm, Pos(lineNo, ch, sticky), \"line\", lineObj, preparedMeasure);\n baseX = coords.left;\n outside = y < coords.top ? -1 : y >= coords.bottom ? 1 : 0;\n }\n\n ch = skipExtendingChars(lineObj.text, ch, 1);\n return PosWithInfo(lineNo, ch, sticky, outside, x - baseX)\n }\n\n function coordsBidiPart(cm, lineObj, lineNo, preparedMeasure, order, x, y) {\n // Bidi parts are sorted left-to-right, and in a non-line-wrapping\n // situation, we can take this ordering to correspond to the visual\n // ordering. This finds the first part whose end is after the given\n // coordinates.\n var index = findFirst(function (i) {\n var part = order[i], ltr = part.level != 1;\n return boxIsAfter(cursorCoords(cm, Pos(lineNo, ltr ? part.to : part.from, ltr ? \"before\" : \"after\"),\n \"line\", lineObj, preparedMeasure), x, y, true)\n }, 0, order.length - 1);\n var part = order[index];\n // If this isn't the first part, the part's start is also after\n // the coordinates, and the coordinates aren't on the same line as\n // that start, move one part back.\n if (index > 0) {\n var ltr = part.level != 1;\n var start = cursorCoords(cm, Pos(lineNo, ltr ? part.from : part.to, ltr ? \"after\" : \"before\"),\n \"line\", lineObj, preparedMeasure);\n if (boxIsAfter(start, x, y, true) && start.top > y)\n { part = order[index - 1]; }\n }\n return part\n }\n\n function coordsBidiPartWrapped(cm, lineObj, _lineNo, preparedMeasure, order, x, y) {\n // In a wrapped line, rtl text on wrapping boundaries can do things\n // that don't correspond to the ordering in our `order` array at\n // all, so a binary search doesn't work, and we want to return a\n // part that only spans one line so that the binary search in\n // coordsCharInner is safe. As such, we first find the extent of the\n // wrapped line, and then do a flat search in which we discard any\n // spans that aren't on the line.\n var ref = wrappedLineExtent(cm, lineObj, preparedMeasure, y);\n var begin = ref.begin;\n var end = ref.end;\n if (/\\s/.test(lineObj.text.charAt(end - 1))) { end--; }\n var part = null, closestDist = null;\n for (var i = 0; i < order.length; i++) {\n var p = order[i];\n if (p.from >= end || p.to <= begin) { continue }\n var ltr = p.level != 1;\n var endX = measureCharPrepared(cm, preparedMeasure, ltr ? Math.min(end, p.to) - 1 : Math.max(begin, p.from)).right;\n // Weigh against spans ending before this, so that they are only\n // picked if nothing ends after\n var dist = endX < x ? x - endX + 1e9 : endX - x;\n if (!part || closestDist > dist) {\n part = p;\n closestDist = dist;\n }\n }\n if (!part) { part = order[order.length - 1]; }\n // Clip the part to the wrapped line.\n if (part.from < begin) { part = {from: begin, to: part.to, level: part.level}; }\n if (part.to > end) { part = {from: part.from, to: end, level: part.level}; }\n return part\n }\n\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\", null, \"CodeMirror-line-like\");\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], \"CodeMirror-line-like\");\n removeChildrenAndAdd(display.measure, pre);\n var rect = anchor.getBoundingClientRect(), width = (rect.right - rect.left) / 10;\n if (width > 2) { display.cachedCharWidth = width; }\n return width || 10\n }\n\n // Do a bulk-read of the DOM positions and sizes needed to draw the\n // view, so that we don't interleave reading and writing to the DOM.\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 var id = cm.display.gutterSpecs[i].className;\n left[id] = n.offsetLeft + n.clientLeft + gutterLeft;\n width[id] = n.clientWidth;\n }\n return {fixedPos: compensateForHScroll(d),\n gutterTotalWidth: d.gutters.offsetWidth,\n gutterLeft: left,\n gutterWidth: width,\n wrapperWidth: d.wrapper.clientWidth}\n }\n\n // Computes display.scroller.scrollLeft + display.gutters.offsetWidth,\n // but using getBoundingClientRect to get a sub-pixel-accurate\n // result.\n function compensateForHScroll(display) {\n return display.scroller.getBoundingClientRect().left - display.sizer.getBoundingClientRect().left\n }\n\n // Returns a function that estimates the height of a line, to use as\n // first approximation until the line becomes visible (and is thus\n // properly measurable).\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 // 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$1) { return null }\n var coords = coordsChar(cm, x, y), line;\n if (forRect && coords.xRel > 0 && (line = getLine(cm.doc, coords.line).text).length == coords.ch) {\n var colDiff = countColumn(line, line.length, cm.options.tabSize) - line.length;\n coords = Pos(coords.line, Math.max(0, Math.round((x - paddingH(cm.display).left) / charWidth(cm.display)) - colDiff));\n }\n return coords\n }\n\n // Find the view element corresponding to a given line. Return null\n // when the line isn't visible.\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 // 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$1 = viewCuttingPoint(cm, from, from, -1);\n if (cut$1) {\n display.view = display.view.slice(0, cut$1.index);\n display.viewTo = cut$1.lineN;\n } else {\n resetView(cm);\n }\n } else { // Gap in the middle\n var cutTop = viewCuttingPoint(cm, from, from, -1);\n var cutBot = viewCuttingPoint(cm, to, to + lendiff, 1);\n if (cutTop && cutBot) {\n display.view = display.view.slice(0, cutTop.index)\n .concat(buildViewArray(cm, cutTop.lineN, cutBot.lineN))\n .concat(display.view.slice(cutBot.index));\n display.viewTo += lendiff;\n } else {\n resetView(cm);\n }\n }\n\n var ext = display.externalMeasured;\n if (ext) {\n if (to < ext.lineN)\n { ext.lineN += lendiff; }\n else if (from < ext.lineN + ext.size)\n { display.externalMeasured = null; }\n }\n }\n\n // Register a change to a single line. Type must be one of \"text\",\n // \"gutter\", \"class\", \"widget\"\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 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 var n = cm.display.viewFrom;\n for (var i = 0; i < index; i++)\n { n += view[i].size; }\n if (n != oldN) {\n if (dir > 0) {\n if (index == view.length - 1) { return null }\n diff = (n + view[index].size) - oldN;\n index++;\n } else {\n diff = n - oldN;\n }\n oldN += diff; newN += diff;\n }\n while (visualLineNo(cm.doc, newN) != newN) {\n if (index == (dir < 0 ? 0 : view.length - 1)) { return null }\n newN += dir * view[index - (dir < 0 ? 1 : 0)].size;\n index += dir;\n }\n return {index: index, lineN: newN}\n }\n\n // Force the view to cover a given range, adding empty view element\n // or clipping off existing ones as needed.\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 function updateSelection(cm) {\n cm.display.input.showSelection(cm.display.input.prepareSelection());\n }\n\n function prepareSelection(cm, primary) {\n if ( primary === void 0 ) primary = true;\n\n var doc = cm.doc, result = {};\n var curFragment = result.cursors = document.createDocumentFragment();\n var selFragment = result.selection = document.createDocumentFragment();\n\n var customCursor = cm.options.$customCursor;\n if (customCursor) { primary = true; }\n for (var i = 0; i < doc.sel.ranges.length; i++) {\n if (!primary && 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 (customCursor) {\n var head = customCursor(cm, range);\n if (head) { drawSelectionCursor(cm, head, curFragment); }\n } else if (collapsed || cm.options.showCursorWhenSelecting) {\n drawSelectionCursor(cm, range.head, curFragment);\n }\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 (/\\bcm-fat-cursor\\b/.test(cm.getWrapperElement().className)) {\n var charPos = charCoords(cm, head, \"div\", null, null);\n var width = charPos.right - charPos.left;\n cursor.style.width = (width > 0 ? width : cm.defaultCharWidth()) + \"px\";\n }\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 function cmpCoords(a, b) { return a.top - b.top || a.left - b.left }\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 var docLTR = doc.direction == \"ltr\";\n\n function add(left, top, width, bottom) {\n if (top < 0) { top = 0; }\n top = Math.round(top);\n bottom = Math.round(bottom);\n fragment.appendChild(elt(\"div\", null, \"CodeMirror-selected\", (\"position: absolute; left: \" + left + \"px;\\n top: \" + top + \"px; width: \" + (width == null ? rightSide - left : width) + \"px;\\n height: \" + (bottom - top) + \"px\")));\n }\n\n function drawForLine(line, fromArg, toArg) {\n var lineObj = getLine(doc, line);\n var lineLen = lineObj.text.length;\n var start, end;\n function coords(ch, bias) {\n return charCoords(cm, Pos(line, ch), \"div\", lineObj, bias)\n }\n\n function wrapX(pos, dir, side) {\n var extent = wrappedLineExtentChar(cm, lineObj, null, pos);\n var prop = (dir == \"ltr\") == (side == \"after\") ? \"left\" : \"right\";\n var ch = side == \"after\" ? extent.begin : extent.end - (/\\s/.test(lineObj.text.charAt(extent.end - 1)) ? 2 : 1);\n return coords(ch, prop)[prop]\n }\n\n var order = getOrder(lineObj, doc.direction);\n iterateBidiSections(order, fromArg || 0, toArg == null ? lineLen : toArg, function (from, to, dir, i) {\n var ltr = dir == \"ltr\";\n var fromPos = coords(from, ltr ? \"left\" : \"right\");\n var toPos = coords(to - 1, ltr ? \"right\" : \"left\");\n\n var openStart = fromArg == null && from == 0, openEnd = toArg == null && to == lineLen;\n var first = i == 0, last = !order || i == order.length - 1;\n if (toPos.top - fromPos.top <= 3) { // Single line\n var openLeft = (docLTR ? openStart : openEnd) && first;\n var openRight = (docLTR ? openEnd : openStart) && last;\n var left = openLeft ? leftSide : (ltr ? fromPos : toPos).left;\n var right = openRight ? rightSide : (ltr ? toPos : fromPos).right;\n add(left, fromPos.top, right - left, fromPos.bottom);\n } else { // Multiple lines\n var topLeft, topRight, botLeft, botRight;\n if (ltr) {\n topLeft = docLTR && openStart && first ? leftSide : fromPos.left;\n topRight = docLTR ? rightSide : wrapX(from, dir, \"before\");\n botLeft = docLTR ? leftSide : wrapX(to, dir, \"after\");\n botRight = docLTR && openEnd && last ? rightSide : toPos.right;\n } else {\n topLeft = !docLTR ? leftSide : wrapX(from, dir, \"before\");\n topRight = !docLTR && openStart && first ? rightSide : fromPos.right;\n botLeft = !docLTR && openEnd && last ? leftSide : toPos.left;\n botRight = !docLTR ? rightSide : wrapX(to, dir, \"after\");\n }\n add(topLeft, fromPos.top, topRight - topLeft, fromPos.bottom);\n if (fromPos.bottom < toPos.top) { add(leftSide, fromPos.bottom, null, toPos.top); }\n add(botLeft, toPos.top, botRight - botLeft, toPos.bottom);\n }\n\n if (!start || cmpCoords(fromPos, start) < 0) { start = fromPos; }\n if (cmpCoords(toPos, start) < 0) { start = toPos; }\n if (!end || cmpCoords(fromPos, end) < 0) { end = fromPos; }\n if (cmpCoords(toPos, end) < 0) { end = toPos; }\n });\n return {start: start, end: end}\n }\n\n var sFrom = range.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 if (!cm.hasFocus()) { onBlur(cm); }\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 function ensureFocus(cm) {\n if (!cm.hasFocus()) {\n cm.display.input.focus();\n if (!cm.state.focused) { onFocus(cm); }\n }\n }\n\n function delayBlurEvent(cm) {\n cm.state.delayingBlurEvent = true;\n setTimeout(function () { if (cm.state.delayingBlurEvent) {\n cm.state.delayingBlurEvent = false;\n if (cm.state.focused) { onBlur(cm); }\n } }, 100);\n }\n\n function onFocus(cm, e) {\n if (cm.state.delayingBlurEvent && !cm.state.draggingText) { cm.state.delayingBlurEvent = false; }\n\n if (cm.options.readOnly == \"nocursor\") { return }\n if (!cm.state.focused) {\n signal(cm, \"focus\", cm, e);\n cm.state.focused = true;\n addClass(cm.display.wrapper, \"CodeMirror-focused\");\n // This test prevents this from firing when a context\n // menu is closed (since the input reset would kill the\n // select-all detection hack)\n if (!cm.curOp && cm.display.selForContextMenu != cm.doc.sel) {\n cm.display.input.reset();\n if (webkit) { setTimeout(function () { return cm.display.input.reset(true); }, 20); } // Issue #1730\n }\n cm.display.input.receivedFocus();\n }\n restartBlink(cm);\n }\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 // 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 var viewTop = Math.max(0, display.scroller.getBoundingClientRect().top);\n var oldHeight = display.lineDiv.getBoundingClientRect().top;\n var mustScroll = 0;\n for (var i = 0; i < display.view.length; i++) {\n var cur = display.view[i], wrapping = cm.options.lineWrapping;\n var height = (void 0), width = 0;\n if (cur.hidden) { continue }\n oldHeight += cur.line.height;\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 // Check that lines don't extend past the right of the current\n // editor width\n if (!wrapping && cur.text.firstChild)\n { width = cur.text.firstChild.getBoundingClientRect().right - box.left - 1; }\n }\n var diff = cur.line.height - height;\n if (diff > .005 || diff < -.005) {\n if (oldHeight < viewTop) { mustScroll -= diff; }\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 if (width > cm.display.sizerWidth) {\n var chWidth = Math.ceil(width / charWidth(cm.display));\n if (chWidth > cm.display.maxLineLength) {\n cm.display.maxLineLength = chWidth;\n cm.display.maxLine = cur.line;\n cm.display.maxLineChanged = true;\n }\n }\n }\n if (Math.abs(mustScroll) > 2) { display.scroller.scrollTop += mustScroll; }\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 var w = line.widgets[i], parent = w.node.parentNode;\n if (parent) { w.height = parent.offsetHeight; }\n } }\n }\n\n // Compute the lines that are visible in a given viewport (defaults\n // 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 // 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, rect) {\n if (signalDOMEvent(cm, \"scrollCursorIntoView\")) { return }\n\n var display = cm.display, box = display.sizer.getBoundingClientRect(), doScroll = null;\n var doc = display.wrapper.ownerDocument;\n if (rect.top + box.top < 0) { doScroll = true; }\n else if (rect.bottom + box.top > (doc.defaultView.innerHeight || doc.documentElement.clientHeight)) { doScroll = false; }\n if (doScroll != null && !phantom) {\n var scrollNode = elt(\"div\", \"\\u200b\", null, (\"position: absolute;\\n top: \" + (rect.top - display.viewOffset - paddingTop(cm.display)) + \"px;\\n height: \" + (rect.bottom - rect.top + scrollGap(cm) + display.barHeight) + \"px;\\n left: \" + (rect.left) + \"px; width: \" + (Math.max(2, rect.right - rect.left)) + \"px;\"));\n cm.display.lineSpace.appendChild(scrollNode);\n scrollNode.scrollIntoView(doScroll);\n cm.display.lineSpace.removeChild(scrollNode);\n }\n }\n\n // Scroll a given position into view (immediately), verifying that\n // it actually became visible (as line heights are accurately\n // measured, the position of something may 'drift' during drawing).\n function scrollPosIntoView(cm, pos, end, margin) {\n if (margin == null) { margin = 0; }\n var rect;\n if (!cm.options.lineWrapping && pos == end) {\n // Set pos and end to the cursor positions around the character pos sticks to\n // If pos.sticky == \"before\", that is around pos.ch - 1, otherwise around pos.ch\n // If pos == Pos(_, 0, \"before\"), pos and end are unchanged\n end = pos.sticky == \"before\" ? Pos(pos.line, pos.ch + 1, \"before\") : pos;\n pos = pos.ch ? Pos(pos.line, pos.sticky == \"before\" ? pos.ch - 1 : pos.ch, \"after\") : pos;\n }\n for (var limit = 0; limit < 5; limit++) {\n var changed = false;\n var coords = cursorCoords(cm, pos);\n var endCoords = !end || end == pos ? coords : cursorCoords(cm, end);\n rect = {left: Math.min(coords.left, endCoords.left),\n top: Math.min(coords.top, endCoords.top) - margin,\n right: Math.max(coords.left, endCoords.left),\n bottom: Math.max(coords.bottom, endCoords.bottom) + margin};\n var scrollPos = calculateScrollPos(cm, rect);\n var startTop = cm.doc.scrollTop, startLeft = cm.doc.scrollLeft;\n if (scrollPos.scrollTop != null) {\n updateScrollTop(cm, scrollPos.scrollTop);\n if (Math.abs(cm.doc.scrollTop - startTop) > 1) { changed = true; }\n }\n if (scrollPos.scrollLeft != null) {\n setScrollLeft(cm, scrollPos.scrollLeft);\n if (Math.abs(cm.doc.scrollLeft - startLeft) > 1) { changed = true; }\n }\n if (!changed) { break }\n }\n return rect\n }\n\n // Scroll a given set of coordinates into view (immediately).\n function scrollIntoView(cm, rect) {\n var scrollPos = calculateScrollPos(cm, rect);\n if (scrollPos.scrollTop != null) { updateScrollTop(cm, scrollPos.scrollTop); }\n if (scrollPos.scrollLeft != null) { setScrollLeft(cm, scrollPos.scrollLeft); }\n }\n\n // Calculate a new scroll position needed to scroll the given\n // rectangle into view. Returns an object with scrollTop and\n // scrollLeft properties. When these are undefined, the\n // vertical/horizontal position does not need to be adjusted.\n function calculateScrollPos(cm, rect) {\n var display = cm.display, snapMargin = textHeight(cm.display);\n if (rect.top < 0) { rect.top = 0; }\n var screentop = cm.curOp && cm.curOp.scrollTop != null ? cm.curOp.scrollTop : display.scroller.scrollTop;\n var screen = displayHeight(cm), result = {};\n if (rect.bottom - rect.top > screen) { rect.bottom = rect.top + screen; }\n var docBottom = cm.doc.height + paddingVert(display);\n var atTop = rect.top < snapMargin, atBottom = rect.bottom > docBottom - snapMargin;\n if (rect.top < screentop) {\n result.scrollTop = atTop ? 0 : rect.top;\n } else if (rect.bottom > screentop + screen) {\n var newTop = Math.min(rect.top, (atBottom ? docBottom : rect.bottom) - screen);\n if (newTop != screentop) { result.scrollTop = newTop; }\n }\n\n var gutterSpace = cm.options.fixedGutter ? 0 : display.gutters.offsetWidth;\n var screenleft = cm.curOp && cm.curOp.scrollLeft != null ? cm.curOp.scrollLeft : display.scroller.scrollLeft - gutterSpace;\n var screenw = displayWidth(cm) - display.gutters.offsetWidth;\n var tooWide = rect.right - rect.left > screenw;\n if (tooWide) { rect.right = rect.left + screenw; }\n if (rect.left < 10)\n { result.scrollLeft = 0; }\n else if (rect.left < screenleft)\n { result.scrollLeft = Math.max(0, rect.left + gutterSpace - (tooWide ? 0 : 10)); }\n else if (rect.right > screenw + screenleft - 3)\n { result.scrollLeft = rect.right + (tooWide ? 0 : 10) - screenw; }\n return result\n }\n\n // Store a relative adjustment to the scroll position in the current\n // operation (to be applied when the operation finishes).\n function addToScrollTop(cm, top) {\n if (top == null) { return }\n resolveScrollToPos(cm);\n cm.curOp.scrollTop = (cm.curOp.scrollTop == null ? cm.doc.scrollTop : cm.curOp.scrollTop) + top;\n }\n\n // Make sure that at the end of the operation the current cursor is\n // shown.\n function ensureCursorVisible(cm) {\n resolveScrollToPos(cm);\n var cur = cm.getCursor();\n cm.curOp.scrollToPos = {from: cur, to: cur, margin: cm.options.cursorScrollMargin};\n }\n\n function scrollToCoords(cm, x, y) {\n if (x != null || y != null) { resolveScrollToPos(cm); }\n if (x != null) { cm.curOp.scrollLeft = x; }\n if (y != null) { cm.curOp.scrollTop = y; }\n }\n\n function scrollToRange(cm, range) {\n resolveScrollToPos(cm);\n cm.curOp.scrollToPos = range;\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 scrollToCoordsRange(cm, from, to, range.margin);\n }\n }\n\n function scrollToCoordsRange(cm, from, to, margin) {\n var sPos = calculateScrollPos(cm, {\n left: Math.min(from.left, to.left),\n top: Math.min(from.top, to.top) - margin,\n right: Math.max(from.right, to.right),\n bottom: Math.max(from.bottom, to.bottom) + margin\n });\n scrollToCoords(cm, sPos.scrollLeft, sPos.scrollTop);\n }\n\n // Sync the scrollable area and scrollbars, ensure the viewport\n // covers the visible area.\n function updateScrollTop(cm, val) {\n if (Math.abs(cm.doc.scrollTop - val) < 2) { return }\n if (!gecko) { updateDisplaySimple(cm, {top: val}); }\n setScrollTop(cm, val, true);\n if (gecko) { updateDisplaySimple(cm); }\n startWorker(cm, 100);\n }\n\n function setScrollTop(cm, val, forceScroll) {\n val = Math.max(0, Math.min(cm.display.scroller.scrollHeight - cm.display.scroller.clientHeight, val));\n if (cm.display.scroller.scrollTop == val && !forceScroll) { return }\n cm.doc.scrollTop = val;\n cm.display.scrollbars.setScrollTop(val);\n if (cm.display.scroller.scrollTop != val) { cm.display.scroller.scrollTop = val; }\n }\n\n // Sync scroller and scrollbar, ensure the gutter elements are\n // aligned.\n function setScrollLeft(cm, val, isScroller, forceScroll) {\n val = Math.max(0, Math.min(val, cm.display.scroller.scrollWidth - cm.display.scroller.clientWidth));\n if ((isScroller ? val == cm.doc.scrollLeft : Math.abs(cm.doc.scrollLeft - val) < 2) && !forceScroll) { return }\n cm.doc.scrollLeft = val;\n alignHorizontally(cm);\n if (cm.display.scroller.scrollLeft != val) { cm.display.scroller.scrollLeft = val; }\n cm.display.scrollbars.setScrollLeft(val);\n }\n\n // SCROLLBARS\n\n // Prepare DOM reads needed to update the scrollbars. Done in one\n // shot to minimize update/measure roundtrips.\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 var NativeScrollbars = function(place, scroll, cm) {\n this.cm = cm;\n var vert = this.vert = elt(\"div\", [elt(\"div\", null, null, \"min-width: 1px\")], \"CodeMirror-vscrollbar\");\n var horiz = this.horiz = elt(\"div\", [elt(\"div\", null, null, \"height: 100%; min-height: 1px\")], \"CodeMirror-hscrollbar\");\n vert.tabIndex = horiz.tabIndex = -1;\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.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.scrollTop = 0;\n this.vert.style.display = \"\";\n this.vert.firstChild.style.height = \"0\";\n }\n\n if (needsH) {\n this.horiz.style.display = \"block\";\n this.horiz.style.right = needsV ? sWidth + \"px\" : \"0\";\n this.horiz.style.left = measure.barLeft + \"px\";\n var totalWidth = measure.viewWidth - measure.barLeft - (needsV ? sWidth : 0);\n this.horiz.firstChild.style.width =\n Math.max(0, measure.scrollWidth - measure.clientWidth + totalWidth) + \"px\";\n } else {\n this.horiz.style.display = \"\";\n this.horiz.firstChild.style.width = \"0\";\n }\n\n if (!this.checkedZeroWidth && measure.clientHeight > 0) {\n if (sWidth == 0) { this.zeroWidthHack(); }\n this.checkedZeroWidth = true;\n }\n\n return {right: needsV ? sWidth : 0, bottom: needsH ? sWidth : 0}\n };\n\n NativeScrollbars.prototype.setScrollLeft = function (pos) {\n if (this.horiz.scrollLeft != pos) { this.horiz.scrollLeft = pos; }\n if (this.disableHoriz) { this.enableZeroWidthBar(this.horiz, this.disableHoriz, \"horiz\"); }\n };\n\n NativeScrollbars.prototype.setScrollTop = function (pos) {\n if (this.vert.scrollTop != pos) { this.vert.scrollTop = pos; }\n if (this.disableVert) { this.enableZeroWidthBar(this.vert, this.disableVert, \"vert\"); }\n };\n\n NativeScrollbars.prototype.zeroWidthHack = function () {\n var w = mac && !mac_geMountainLion ? \"12px\" : \"18px\";\n this.horiz.style.height = this.vert.style.width = w;\n this.horiz.style.visibility = this.vert.style.visibility = \"hidden\";\n this.disableHoriz = new Delayed;\n this.disableVert = new Delayed;\n };\n\n NativeScrollbars.prototype.enableZeroWidthBar = function (bar, delay, type) {\n bar.style.visibility = \"\";\n function maybeDisable() {\n // To find out whether the scrollbar is still visible, we\n // check whether the element under the pixel in the bottom\n // right corner of the scrollbar box is the scrollbar box\n // itself (when the bar is still visible) or its filler child\n // (when the bar is hidden). If it is still visible, we keep\n // it enabled, if it's hidden, we disable pointer events.\n var box = bar.getBoundingClientRect();\n var elt = type == \"vert\" ? document.elementFromPoint(box.right - 1, (box.top + box.bottom) / 2)\n : document.elementFromPoint((box.right + box.left) / 2, box.bottom - 1);\n if (elt != bar) { bar.style.visibility = \"hidden\"; }\n else { delay.set(1000, maybeDisable); }\n }\n delay.set(1000, maybeDisable);\n };\n\n NativeScrollbars.prototype.clear = function () {\n var parent = this.horiz.parentNode;\n parent.removeChild(this.horiz);\n parent.removeChild(this.vert);\n };\n\n var NullScrollbars = function () {};\n\n NullScrollbars.prototype.update = function () { return {bottom: 0, right: 0} };\n NullScrollbars.prototype.setScrollLeft = function () {};\n NullScrollbars.prototype.setScrollTop = function () {};\n NullScrollbars.prototype.clear = function () {};\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 var 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 scrollbarModel[cm.options.scrollbarStyle](function (node) {\n cm.display.wrapper.insertBefore(node, cm.display.scrollbarFiller);\n // Prevent clicks in the scrollbars from killing focus\n on(node, \"mousedown\", function () {\n if (cm.state.focused) { setTimeout(function () { return cm.display.input.focus(); }, 0); }\n });\n node.setAttribute(\"cm-not-content\", \"true\");\n }, function (pos, axis) {\n if (axis == \"horizontal\") { setScrollLeft(cm, pos); }\n else { updateScrollTop(cm, pos); }\n }, cm);\n if (cm.display.scrollbars.addClass)\n { addClass(cm.display.wrapper, cm.display.scrollbars.addClass); }\n }\n\n // Operations are used to wrap a series of changes to the editor\n // state in such a way that each change won't have to update the\n // cursor and display (which would be awkward, slow, and\n // error-prone). Instead, display updates are batched and then all\n // combined and executed at once.\n\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: 0, // 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 markArrays: null // Used by addMarkedSpan\n };\n pushOperation(cm.curOp);\n }\n\n // Finish an operation, updating the display and signalling delayed events\n function endOperation(cm) {\n var op = cm.curOp;\n if (op) { finishOperation(op, function (group) {\n for (var i = 0; i < group.ops.length; i++)\n { group.ops[i].cm.curOp = null; }\n endOperations(group);\n }); }\n }\n\n // The DOM updates done when an operation finishes are batched so\n // that the minimum number of relayouts are required.\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$1 = 0; i$1 < ops.length; i$1++) // Write DOM (maybe)\n { endOperation_W1(ops[i$1]); }\n for (var i$2 = 0; i$2 < ops.length; i$2++) // Read DOM\n { endOperation_R2(ops[i$2]); }\n for (var i$3 = 0; i$3 < ops.length; i$3++) // Write DOM (maybe)\n { endOperation_W2(ops[i$3]); }\n for (var i$4 = 0; i$4 < ops.length; i$4++) // Read DOM\n { endOperation_finish(ops[i$4]); }\n }\n\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(); }\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(root(cm));\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) { setScrollTop(cm, op.scrollTop, op.forceScroll); }\n\n if (op.scrollLeft != null) { setScrollLeft(cm, op.scrollLeft, true, true); }\n // If we need to scroll a specific position into view, do so.\n if (op.scrollToPos) {\n var rect = scrollPosIntoView(cm, clipPos(doc, op.scrollToPos.from),\n clipPos(doc, op.scrollToPos.to), op.scrollToPos.margin);\n maybeScrollWindow(cm, rect);\n }\n\n // Fire events for markers that are hidden/unidden by editing or\n // undoing\n var hidden = op.maybeHiddenMarkers, unhidden = op.maybeUnhiddenMarkers;\n if (hidden) { for (var i = 0; i < hidden.length; ++i)\n { if (!hidden[i].lines.length) { signal(hidden[i], \"hide\"); } } }\n if (unhidden) { for (var i$1 = 0; i$1 < unhidden.length; ++i$1)\n { if (unhidden[i$1].lines.length) { signal(unhidden[i$1], \"unhide\"); } } }\n\n if (display.wrapper.offsetHeight)\n { doc.scrollTop = cm.display.scroller.scrollTop; }\n\n // Fire change events, and delayed event handlers\n if (op.changeObjs)\n { signal(cm, \"changes\", cm, op.changeObjs); }\n if (op.update)\n { op.update.finish(); }\n }\n\n // Run the given function in an operation\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 // HIGHLIGHT WORKER\n\n function startWorker(cm, time) {\n if (cm.doc.highlightFrontier < 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.highlightFrontier >= cm.display.viewTo) { return }\n var end = +new Date + cm.options.workTime;\n var context = getContextBefore(cm, doc.highlightFrontier);\n var changedLines = [];\n\n doc.iter(context.line, Math.min(doc.first + doc.size, cm.display.viewTo + 500), function (line) {\n if (context.line >= cm.display.viewFrom) { // Visible\n var oldStyles = line.styles;\n var resetState = line.text.length > cm.options.maxHighlightLength ? copyState(doc.mode, context.state) : null;\n var highlighted = highlightLine(cm, line, context, true);\n if (resetState) { context.state = resetState; }\n line.styles = highlighted.styles;\n var oldCls = line.styleClasses, newCls = highlighted.classes;\n if (newCls) { line.styleClasses = newCls; }\n else if (oldCls) { line.styleClasses = null; }\n var ischange = !oldStyles || oldStyles.length != line.styles.length ||\n oldCls != newCls && (!oldCls || !newCls || oldCls.bgClass != newCls.bgClass || oldCls.textClass != newCls.textClass);\n for (var i = 0; !ischange && i < oldStyles.length; ++i) { ischange = oldStyles[i] != line.styles[i]; }\n if (ischange) { changedLines.push(context.line); }\n line.stateAfter = context.save();\n context.nextLine();\n } else {\n if (line.text.length <= cm.options.maxHighlightLength)\n { processLine(cm, line.text, context); }\n line.stateAfter = context.line % 5 == 0 ? context.save() : null;\n context.nextLine();\n }\n if (+new Date > end) {\n startWorker(cm, cm.options.workDelay);\n return true\n }\n });\n doc.highlightFrontier = context.line;\n doc.modeFrontier = Math.max(doc.modeFrontier, context.line);\n if (changedLines.length) { runInOp(cm, function () {\n for (var i = 0; i < changedLines.length; i++)\n { regLineChange(cm, changedLines[i], \"text\"); }\n }); }\n }\n\n // DISPLAY DRAWING\n\n var DisplayUpdate = function(cm, viewport, force) {\n var display = cm.display;\n\n this.viewport = viewport;\n // Store some values that we'll need later (but don't want to force a relayout for)\n this.visible = visibleLines(display, cm.doc, viewport);\n this.editorIsHidden = !display.wrapper.offsetWidth;\n this.wrapperHeight = display.wrapper.clientHeight;\n this.wrapperWidth = display.wrapper.clientWidth;\n this.oldDisplayWidth = displayWidth(cm);\n this.force = force;\n this.dims = getDimensions(cm);\n this.events = [];\n };\n\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 function selectionSnapshot(cm) {\n if (cm.hasFocus()) { return null }\n var active = activeElt(root(cm));\n if (!active || !contains(cm.display.lineDiv, active)) { return null }\n var result = {activeElt: active};\n if (window.getSelection) {\n var sel = win(cm).getSelection();\n if (sel.anchorNode && sel.extend && contains(cm.display.lineDiv, sel.anchorNode)) {\n result.anchorNode = sel.anchorNode;\n result.anchorOffset = sel.anchorOffset;\n result.focusNode = sel.focusNode;\n result.focusOffset = sel.focusOffset;\n }\n }\n return result\n }\n\n function restoreSelection(snapshot) {\n if (!snapshot || !snapshot.activeElt || snapshot.activeElt == activeElt(rootNode(snapshot.activeElt))) { return }\n snapshot.activeElt.focus();\n if (!/^(INPUT|TEXTAREA)$/.test(snapshot.activeElt.nodeName) &&\n snapshot.anchorNode && contains(document.body, snapshot.anchorNode) && contains(document.body, snapshot.focusNode)) {\n var doc = snapshot.activeElt.ownerDocument;\n var sel = doc.defaultView.getSelection(), range = doc.createRange();\n range.setEnd(snapshot.anchorNode, snapshot.anchorOffset);\n range.collapse(false);\n sel.removeAllRanges();\n sel.addRange(range);\n sel.extend(snapshot.focusNode, snapshot.focusOffset);\n }\n }\n\n // Does the actual updating of the line display. Bails out\n // (returning false) when there is nothing to be done and forced is\n // false.\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 selSnapshot = selectionSnapshot(cm);\n if (toUpdate > 4) { display.lineDiv.style.display = \"none\"; }\n patchDisplay(cm, display.updateLineNumbers, update.dims);\n if (toUpdate > 4) { display.lineDiv.style.display = \"\"; }\n display.renderedView = display.view;\n // There might have been a widget with a focused element that got\n // hidden or updated, if so re-focus it.\n restoreSelection(selSnapshot);\n\n // Prevent selection and cursors from interfering with the scroll\n // width and height.\n removeChildren(display.cursorDiv);\n removeChildren(display.selectionDiv);\n display.gutters.style.height = display.sizer.style.minHeight = 0;\n\n if (different) {\n display.lastWrapHeight = update.wrapperHeight;\n display.lastWrapWidth = update.wrapperWidth;\n startWorker(cm, 400);\n }\n\n display.updateLineNumbers = null;\n\n return true\n }\n\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 } else if (first) {\n update.visible = visibleLines(cm.display, cm.doc, viewport);\n }\n if (!updateDisplayIfNeeded(cm, update)) { break }\n updateHeightsInViewport(cm);\n var barMeasure = measureForScrollbars(cm);\n updateSelection(cm);\n updateScrollbars(cm, barMeasure);\n setDocumentHeight(cm, barMeasure);\n update.force = false;\n }\n\n update.signal(cm, \"update\", cm);\n if (cm.display.viewFrom != cm.display.reportedViewFrom || cm.display.viewTo != cm.display.reportedViewTo) {\n update.signal(cm, \"viewportChange\", cm, cm.display.viewFrom, cm.display.viewTo);\n cm.display.reportedViewFrom = cm.display.viewFrom; cm.display.reportedViewTo = cm.display.viewTo;\n }\n }\n\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 // 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) ; 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 function updateGutterSpace(display) {\n var width = display.gutters.offsetWidth;\n display.sizer.style.marginLeft = width + \"px\";\n // Send an event to consumers responding to changes in gutter width.\n signalLater(display, \"gutterChanged\", display);\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 // 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.display);\n return true\n }\n return false\n }\n\n function getGutters(gutters, lineNumbers) {\n var result = [], sawLineNumbers = false;\n for (var i = 0; i < gutters.length; i++) {\n var name = gutters[i], style = null;\n if (typeof name != \"string\") { style = name.style; name = name.className; }\n if (name == \"CodeMirror-linenumbers\") {\n if (!lineNumbers) { continue }\n else { sawLineNumbers = true; }\n }\n result.push({className: name, style: style});\n }\n if (lineNumbers && !sawLineNumbers) { result.push({className: \"CodeMirror-linenumbers\", style: null}); }\n return result\n }\n\n // Rebuild the gutter elements, ensure the margin to the left of the\n // code matches their width.\n function renderGutters(display) {\n var gutters = display.gutters, specs = display.gutterSpecs;\n removeChildren(gutters);\n display.lineGutter = null;\n for (var i = 0; i < specs.length; ++i) {\n var ref = specs[i];\n var className = ref.className;\n var style = ref.style;\n var gElt = gutters.appendChild(elt(\"div\", null, \"CodeMirror-gutter \" + className));\n if (style) { gElt.style.cssText = style; }\n if (className == \"CodeMirror-linenumbers\") {\n display.lineGutter = gElt;\n gElt.style.width = (display.lineNumWidth || 1) + \"px\";\n }\n }\n gutters.style.display = specs.length ? \"\" : \"none\";\n updateGutterSpace(display);\n }\n\n function updateGutters(cm) {\n renderGutters(cm.display);\n regChange(cm);\n alignHorizontally(cm);\n }\n\n // The display handles the DOM integration, both for input reading\n // and content drawing. It holds references to DOM nodes and\n // display-related state.\n\n function Display(place, doc, input, options) {\n var d = this;\n this.input = input;\n\n // Covers bottom-right square when both scrollbars are present.\n d.scrollbarFiller = elt(\"div\", null, \"CodeMirror-scrollbar-filler\");\n d.scrollbarFiller.setAttribute(\"cm-not-content\", \"true\");\n // Covers bottom of gutter when coverGutterNextToScrollbar is on\n // and h scrollbar is present.\n d.gutterFiller = elt(\"div\", null, \"CodeMirror-gutter-filler\");\n d.gutterFiller.setAttribute(\"cm-not-content\", \"true\");\n // Will contain the actual code, positioned to cover the viewport.\n d.lineDiv = eltP(\"div\", null, \"CodeMirror-code\");\n // Elements are added to these to represent selection and cursors.\n d.selectionDiv = elt(\"div\", null, null, \"position: relative; z-index: 1\");\n d.cursorDiv = elt(\"div\", null, \"CodeMirror-cursors\");\n // A visibility: hidden element used to find the size of things.\n d.measure = elt(\"div\", null, \"CodeMirror-measure\");\n // When lines outside of the viewport are measured, they are drawn in this.\n d.lineMeasure = elt(\"div\", null, \"CodeMirror-measure\");\n // Wraps everything that needs to exist inside the vertically-padded coordinate system\n d.lineSpace = eltP(\"div\", [d.measure, d.lineMeasure, d.selectionDiv, d.cursorDiv, d.lineDiv],\n null, \"position: relative; outline: none\");\n var lines = eltP(\"div\", [d.lineSpace], \"CodeMirror-lines\");\n // Moved around its parent to cover visible view.\n d.mover = elt(\"div\", [lines], null, \"position: relative\");\n // Set to the height of the document, allowing scrolling.\n d.sizer = elt(\"div\", [d.mover], \"CodeMirror-sizer\");\n d.sizerWidth = null;\n // Behavior of elts with overflow: auto and padding is\n // inconsistent across browsers. This is used to ensure the\n // scrollable area is big enough.\n d.heightForcer = elt(\"div\", null, null, \"position: absolute; height: \" + scrollerGap + \"px; width: 1px;\");\n // Will contain the gutters, if any.\n d.gutters = elt(\"div\", null, \"CodeMirror-gutters\");\n d.lineGutter = null;\n // Actual scrollable element.\n d.scroller = elt(\"div\", [d.sizer, d.heightForcer, d.gutters], \"CodeMirror-scroll\");\n d.scroller.setAttribute(\"tabIndex\", \"-1\");\n // The element in which the editor lives.\n d.wrapper = elt(\"div\", [d.scrollbarFiller, d.gutterFiller, d.scroller], \"CodeMirror\");\n // See #6982. FIXME remove when this has been fixed for a while in Chrome\n if (chrome && chrome_version >= 105) { d.wrapper.style.clipPath = \"inset(0px)\"; }\n\n // This attribute is respected by automatic translation systems such as Google Translate,\n // and may also be respected by tools used by human translators.\n d.wrapper.setAttribute('translate', 'no');\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 d.gutterSpecs = getGutters(options.gutters, options.lineNumbers);\n renderGutters(d);\n\n input.init(d);\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 function wheelEventDelta(e) {\n var dx = e.wheelDeltaX, dy = e.wheelDeltaY;\n if (dx == null && e.detail && e.axis == e.HORIZONTAL_AXIS) { dx = e.detail; }\n if (dy == null && e.detail && e.axis == e.VERTICAL_AXIS) { dy = e.detail; }\n else if (dy == null) { dy = e.wheelDelta; }\n return {x: dx, y: dy}\n }\n function wheelEventPixels(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 // On Chrome 102, viewport updates somehow stop wheel-based\n // scrolling. Turning off pointer events during the scroll seems\n // to avoid the issue.\n if (chrome && chrome_version == 102) {\n if (cm.display.chromeScrollHack == null) { cm.display.sizer.style.pointerEvents = \"none\"; }\n else { clearTimeout(cm.display.chromeScrollHack); }\n cm.display.chromeScrollHack = setTimeout(function () {\n cm.display.chromeScrollHack = null;\n cm.display.sizer.style.pointerEvents = \"\";\n }, 100);\n }\n var delta = wheelEventDelta(e), dx = delta.x, dy = delta.y;\n var pixelsPerUnit = wheelPixelsPerUnit;\n if (e.deltaMode === 0) {\n dx = e.deltaX;\n dy = e.deltaY;\n pixelsPerUnit = 1;\n }\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 && pixelsPerUnit != null) {\n if (dy && canScrollY)\n { updateScrollTop(cm, Math.max(0, scroll.scrollTop + dy * pixelsPerUnit)); }\n setScrollLeft(cm, Math.max(0, scroll.scrollLeft + dx * pixelsPerUnit));\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 && pixelsPerUnit != null) {\n var pixels = dy * pixelsPerUnit;\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 && e.deltaMode !== 0) {\n if (display.wheelStartX == null) {\n display.wheelStartX = scroll.scrollLeft; display.wheelStartY = scroll.scrollTop;\n display.wheelDX = dx; display.wheelDY = dy;\n setTimeout(function () {\n if (display.wheelStartX == null) { return }\n var movedX = scroll.scrollLeft - display.wheelStartX;\n var movedY = scroll.scrollTop - display.wheelStartY;\n var sample = (movedY && display.wheelDY && movedY / display.wheelDY) ||\n (movedX && display.wheelDX && movedX / display.wheelDX);\n display.wheelStartX = display.wheelStartY = null;\n if (!sample) { return }\n wheelPixelsPerUnit = (wheelPixelsPerUnit * wheelSamples + sample) / (wheelSamples + 1);\n ++wheelSamples;\n }, 200);\n } else {\n display.wheelDX += dx; display.wheelDY += dy;\n }\n }\n }\n\n // Selection objects are immutable. A new one is created every time\n // the selection changes. A selection is one or more non-overlapping\n // (and non-touching) ranges, sorted, and an integer that indicates\n // which one is the primary selection (the one that's scrolled into\n // view, that getCursor returns, etc).\n var Selection = function(ranges, primIndex) {\n this.ranges = ranges;\n this.primIndex = primIndex;\n };\n\n Selection.prototype.primary = function () { return this.ranges[this.primIndex] };\n\n Selection.prototype.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 (!equalCursorPos(here.anchor, there.anchor) || !equalCursorPos(here.head, there.head)) { return false }\n }\n return true\n };\n\n Selection.prototype.deepCopy = function () {\n var out = [];\n for (var 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\n Selection.prototype.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\n Selection.prototype.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 var Range = function(anchor, head) {\n this.anchor = anchor; this.head = head;\n };\n\n Range.prototype.from = function () { return minPos(this.anchor, this.head) };\n Range.prototype.to = function () { return maxPos(this.anchor, this.head) };\n Range.prototype.empty = function () { return this.head.line == this.anchor.line && this.head.ch == this.anchor.ch };\n\n // Take an unsorted, potentially overlapping set of ranges, and\n // build a selection out of it. 'Consumes' ranges array (modifying\n // it).\n function normalizeSelection(cm, ranges, primIndex) {\n var mayTouch = cm && cm.options.selectionsMayTouch;\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 var diff = cmp(prev.to(), cur.from());\n if (mayTouch && !cur.empty() ? diff > 0 : diff >= 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 // Compute the position of the end of a change (its 'to' property\n // refers to the pre-change end).\n function changeEnd(change) {\n if (!change.text) { return change.to }\n return Pos(change.from.line + change.text.length - 1,\n lst(change.text).length + (change.text.length == 1 ? change.from.ch : 0))\n }\n\n // Adjust a position to refer to the post-change position of the\n // same text, or the end of the change if the change covers it.\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(doc.cm, 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 // Used to get the editor into a consistent state again when options change.\n\n function loadMode(cm) {\n cm.doc.mode = 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.modeFrontier = cm.doc.highlightFrontier = cm.doc.first;\n startWorker(cm, 100);\n cm.state.modeGen++;\n if (cm.curOp) { regChange(cm); }\n }\n\n // DOCUMENT DATA STRUCTURE\n\n // By default, updates that start and end at the beginning of a line\n // are treated specially, in order to make the association of line\n // widgets and marker elements with the text behave more intuitive.\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 var result = [];\n for (var i = start; 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$1 = linesFor(1, text.length - 1);\n added$1.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$1);\n }\n } else if (text.length == 1) {\n update(firstLine, firstLine.text.slice(0, from.ch) + text[0] + lastLine.text.slice(to.ch), spansFor(0));\n doc.remove(from.line + 1, nlines);\n } else {\n update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0));\n update(lastLine, lastText + lastLine.text.slice(to.ch), lastSpans);\n var added$2 = linesFor(1, text.length - 1);\n if (nlines > 1) { doc.remove(from.line + 1, nlines - 1); }\n doc.insert(from.line + 1, added$2);\n }\n\n signalLater(doc, \"change\", doc, change);\n }\n\n // Call f for all linked documents.\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 setDirectionClass(cm);\n cm.options.direction = doc.direction;\n if (!cm.options.lineWrapping) { findMaxLine(cm); }\n cm.options.mode = doc.modeOption;\n regChange(cm);\n }\n\n function setDirectionClass(cm) {\n (cm.doc.direction == \"rtl\" ? addClass : rmClass)(cm.display.lineDiv, \"CodeMirror-rtl\");\n }\n\n function directionChanged(cm) {\n runInOp(cm, function () {\n setDirectionClass(cm);\n regChange(cm);\n });\n }\n\n function History(prev) {\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 = prev ? prev.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 = prev ? prev.maxGeneration : 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) { return attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1); }, true);\n return histChange\n }\n\n // Pop all selection events off the end of a history array. Stop at\n // a change event.\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 var last;\n\n if ((hist.lastOp == opId ||\n hist.lastOrigin == change.origin && change.origin &&\n ((change.origin.charAt(0) == \"+\" && hist.lastModTime > time - (doc.cm ? doc.cm.options.historyEventDelay : 500)) ||\n change.origin.charAt(0) == \"*\")) &&\n (cur = lastChangeEvent(hist, hist.lastOp == opId))) {\n // Merge this change into the last event\n last = lst(cur.changes);\n if (cmp(change.from, change.to) == 0 && cmp(change.from, last.to) == 0) {\n // Optimized case for simple insertion -- don't want to add\n // new changesets for every character typed\n last.to = changeEnd(change);\n } else {\n // Add new sub-event\n cur.changes.push(historyChangeFromChange(doc, change));\n }\n } else {\n // Can not be merged, start a new event.\n var before = lst(hist.done);\n if (!before || !before.ranges)\n { pushSelectionToHistory(doc.sel, hist.done); }\n cur = {changes: [historyChangeFromChange(doc, change)],\n generation: hist.generation};\n hist.done.push(cur);\n while (hist.done.length > hist.undoDepth) {\n hist.done.shift();\n if (!hist.done[0].ranges) { hist.done.shift(); }\n }\n }\n hist.done.push(selAfter);\n hist.generation = ++hist.maxGeneration;\n hist.lastModTime = hist.lastSelTime = time;\n hist.lastOp = hist.lastSelOp = opId;\n hist.lastOrigin = hist.lastSelOrigin = change.origin;\n\n if (!last) { signal(doc, \"historyAdded\"); }\n }\n\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 var out;\n for (var i = 0; i < spans.length; ++i) {\n if (spans[i].marker.explicitlyCleared) { if (!out) { out = spans.slice(0, i); } }\n else if (out) { out.push(spans[i]); }\n }\n return !out ? spans : out.length ? out : null\n }\n\n // Retrieve and filter the old marked spans stored in a change event.\n function getOldSpans(doc, change) {\n var found = change[\"spans_\" + doc.id];\n if (!found) { return null }\n var nw = [];\n for (var i = 0; i < change.text.length; ++i)\n { nw.push(removeClearedSpans(found[i])); }\n return nw\n }\n\n // Used for un/re-doing changes from the history. Combines the\n // result of computing the existing spans with the set of spans that\n // existed in the history (so that deleting around a span and then\n // undoing brings back the span).\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 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 var copy = [];\n for (var i = 0; i < events.length; ++i) {\n var event = events[i];\n if (event.ranges) {\n copy.push(instantiateSel ? Selection.prototype.deepCopy.call(event) : event);\n continue\n }\n var changes = event.changes, newChanges = [];\n copy.push({changes: newChanges});\n for (var j = 0; j < changes.length; ++j) {\n var change = changes[j], m = (void 0);\n newChanges.push({from: change.from, to: change.to, text: change.text});\n if (newGroup) { for (var prop in change) { if (m = prop.match(/^spans_(\\d+)$/)) {\n if (indexOf(newGroup, Number(m[1])) > -1) {\n lst(newChanges)[prop] = change[prop];\n delete change[prop];\n }\n } } }\n }\n }\n return copy\n }\n\n // The 'scroll' parameter given to many of these indicated whether\n // the new cursor position should be scrolled into view after\n // modifying the selection.\n\n // If shift is held or the extend flag is set, extends a range to\n // include a given position (and optionally a second position).\n // Otherwise, simply returns the range between the given positions.\n // Used for cursor motion and such.\n function extendRange(range, head, other, extend) {\n if (extend) {\n var anchor = range.anchor;\n if (other) {\n var posBefore = cmp(head, anchor) < 0;\n if (posBefore != (cmp(other, anchor) < 0)) {\n anchor = head;\n head = other;\n } else if (posBefore != (cmp(head, other) < 0)) {\n head = other;\n }\n }\n return new Range(anchor, head)\n } else {\n return new Range(other || head, head)\n }\n }\n\n // Extend the primary selection range, discard the rest.\n function extendSelection(doc, head, other, options, extend) {\n if (extend == null) { extend = doc.cm && (doc.cm.display.shift || doc.extend); }\n setSelection(doc, new Selection([extendRange(doc.sel.primary(), head, other, extend)], 0), options);\n }\n\n // Extend all selections (pos is an array of selections with length\n // equal the number of selections)\n function extendSelections(doc, heads, options) {\n var out = [];\n var extend = doc.cm && (doc.cm.display.shift || doc.extend);\n for (var i = 0; i < doc.sel.ranges.length; i++)\n { out[i] = extendRange(doc.sel.ranges[i], heads[i], null, extend); }\n var newSel = normalizeSelection(doc.cm, 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(doc.cm, 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(doc.cm, 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 && doc.cm.getOption(\"readOnly\") != \"nocursor\")\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 = 1;\n 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));\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 = range.head == range.anchor ? newAnchor : 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(doc.cm, 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\n // Determine if we should prevent the cursor being placed to the left/right of an atomic marker\n // Historically this was determined using the inclusiveLeft/Right option, but the new way to control it\n // is with selectLeft/Right\n var preventCursorLeft = (\"selectLeft\" in m) ? !m.selectLeft : m.inclusiveLeft;\n var preventCursorRight = (\"selectRight\" in m) ? !m.selectRight : m.inclusiveRight;\n\n if ((sp.from == null || (preventCursorLeft ? sp.from <= pos.ch : sp.from < pos.ch)) &&\n (sp.to == null || (preventCursorRight ? sp.to >= pos.ch : sp.to > pos.ch))) {\n if (mayClear) {\n signal(m, \"beforeCursorEnter\");\n if (m.explicitlyCleared) {\n if (!line.markedSpans) { break }\n else {--i; continue}\n }\n }\n if (!m.atomic) { continue }\n\n if (oldPos) {\n var near = m.find(dir < 0 ? 1 : -1), diff = (void 0);\n if (dir < 0 ? preventCursorRight : preventCursorLeft)\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 ? preventCursorLeft : preventCursorRight)\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 function selectAll(cm) {\n cm.setSelection(Pos(cm.firstLine(), 0), Pos(cm.lastLine()), sel_dontScroll);\n }\n\n // UPDATING\n\n // Allow \"beforeChange\" event handlers to influence a change\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 () { return obj.canceled = true; }\n };\n if (update) { obj.update = function (from, to, text, origin) {\n if (from) { obj.from = clipPos(doc, from); }\n if (to) { obj.to = clipPos(doc, to); }\n if (text) { obj.text = text; }\n if (origin !== undefined) { obj.origin = origin; }\n }; }\n signal(doc, \"beforeChange\", doc, obj);\n if (doc.cm) { signal(doc.cm, \"beforeChange\", doc.cm, obj); }\n\n if (obj.canceled) {\n if (doc.cm) { doc.cm.curOp.updateInput = 2; }\n return null\n }\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, origin: change.origin}); }\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 var suppress = doc.cm && doc.cm.state.suppressEdits;\n if (suppress && !allowSelectionOnly) { return }\n\n var hist = doc.history, event, selAfter = doc.sel;\n var source = type == \"undo\" ? hist.done : hist.undone, dest = type == \"undo\" ? hist.undone : hist.done;\n\n // Verify that there is a useable event (so that ctrl-z won't\n // needlessly clear selection events)\n var i = 0;\n for (; i < source.length; i++) {\n event = source[i];\n if (allowSelectionOnly ? event.ranges && !event.equals(doc.sel) : !event.ranges)\n { break }\n }\n if (i == source.length) { return }\n hist.lastOrigin = hist.lastSelOrigin = null;\n\n for (;;) {\n event = source.pop();\n if (event.ranges) {\n pushSelectionToHistory(event, dest);\n if (allowSelectionOnly && !event.equals(doc.sel)) {\n setSelection(doc, event, {clearRedo: false});\n return\n }\n selAfter = event;\n } else if (suppress) {\n source.push(event);\n return\n } else { break }\n }\n\n // Build up a reverse change object to add to the opposite history\n // stack (redo when undoing, and vice versa).\n var antiChanges = [];\n pushSelectionToHistory(selAfter, dest);\n dest.push({changes: antiChanges, generation: hist.generation});\n hist.generation = event.generation || ++hist.maxGeneration;\n\n var filter = hasHandler(doc, \"beforeChange\") || doc.cm && hasHandler(doc.cm, \"beforeChange\");\n\n var loop = function ( i ) {\n var change = event.changes[i];\n change.origin = type;\n if (filter && !filterChange(doc, change, false)) {\n source.length = 0;\n return {}\n }\n\n antiChanges.push(historyChangeFromChange(doc, change));\n\n var after = i ? computeSelAfterChange(doc, change) : lst(source);\n makeChangeSingleDoc(doc, change, after, mergeOldSpans(doc, change));\n if (!i && doc.cm) { doc.cm.scrollIntoView({from: change.from, to: changeEnd(change)}); }\n var rebased = [];\n\n // Propagate to the linked documents\n linkedDocs(doc, function (doc, sharedHist) {\n if (!sharedHist && indexOf(rebased, doc.history) == -1) {\n rebaseHist(doc.history, change);\n rebased.push(doc.history);\n }\n makeChangeSingleDoc(doc, change, null, mergeOldSpans(doc, change));\n });\n };\n\n for (var i$1 = event.changes.length - 1; i$1 >= 0; --i$1) {\n var returned = loop( i$1 );\n\n if ( returned ) return returned.v;\n }\n }\n\n // Sub-views need their line numbers shifted when text is added\n // above or below them in the parent document.\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) { return new Range(\n Pos(range.anchor.line + distance, range.anchor.ch),\n Pos(range.head.line + distance, range.head.ch)\n ); }), doc.sel.primIndex);\n if (doc.cm) {\n regChange(doc.cm, doc.first, doc.first - distance, distance);\n for (var d = doc.cm.display, l = d.viewFrom; l < d.viewTo; l++)\n { regLineChange(doc.cm, l, \"gutter\"); }\n }\n }\n\n // More lower-level change function, handling only a single document\n // (not linked ones).\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 if (doc.cantEdit && skipAtomic(doc, Pos(doc.firstLine(), 0)))\n { doc.cantEdit = false; }\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 retreatFrontier(doc, from.line);\n startWorker(cm, 400);\n\n var lendiff = change.text.length - (to.line - from.line) - 1;\n // Remember that these lines changed, for updating the display\n if (change.full)\n { regChange(cm); }\n else if (from.line == to.line && change.text.length == 1 && !isWholeLineUpdate(cm.doc, change))\n { regLineChange(cm, from.line, \"text\"); }\n else\n { regChange(cm, from.line, to.line + 1, lendiff); }\n\n var changesHandler = hasHandler(cm, \"changes\"), changeHandler = hasHandler(cm, \"change\");\n if (changeHandler || changesHandler) {\n var obj = {\n from: from, to: to,\n text: change.text,\n removed: change.removed,\n origin: change.origin\n };\n if (changeHandler) { signalLater(cm, \"change\", cm, obj); }\n if (changesHandler) { (cm.curOp.changeObjs || (cm.curOp.changeObjs = [])).push(obj); }\n }\n cm.display.selForContextMenu = null;\n }\n\n function replaceRange(doc, code, from, to, origin) {\n var assign;\n\n if (!to) { to = from; }\n if (cmp(to, from) < 0) { (assign = [to, from], from = assign[0], to = assign[1]); }\n if (typeof code == \"string\") { code = doc.splitLines(code); }\n makeChange(doc, {from: from, to: to, text: code, origin: origin});\n }\n\n // Rebasing/resetting history to deal with externally-sourced changes\n\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$1 = 0; j$1 < sub.changes.length; ++j$1) {\n var cur = sub.changes[j$1];\n if (to < cur.from.line) {\n cur.from = Pos(cur.from.line + diff, cur.from.ch);\n cur.to = Pos(cur.to.line + diff, cur.to.ch);\n } else if (from <= cur.to.line) {\n ok = false;\n break\n }\n }\n if (!ok) {\n array.splice(0, i + 1);\n i = 0;\n }\n }\n }\n\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 // 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 // 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 var height = 0;\n for (var i = 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\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\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\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\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\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\n collapse: function(lines) {\n for (var i = 0; i < this.children.length; ++i) { this.children[i].collapse(lines); }\n },\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\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\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 // Line widgets are block elements displayed above or below a line.\n\n var 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\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) {\n runInOp(cm, function () {\n adjustScrollWhenAboveVisible(cm, line, -height);\n regLineChange(cm, no, \"widget\");\n });\n signalLater(cm, \"lineWidgetCleared\", cm, this, no);\n }\n };\n\n LineWidget.prototype.changed = function () {\n var this$1 = this;\n\n var oldH = this.height, cm = this.doc.cm, line = this.line;\n this.height = null;\n var diff = widgetHeight(this) - oldH;\n if (!diff) { return }\n if (!lineIsHidden(this.doc, line)) { updateLineHeight(line, line.height + diff); }\n if (cm) {\n runInOp(cm, function () {\n cm.curOp.forceUpdate = true;\n adjustScrollWhenAboveVisible(cm, line, diff);\n signalLater(cm, \"lineWidgetChanged\", cm, this$1, lineNo(line));\n });\n }\n };\n eventMixin(LineWidget);\n\n function adjustScrollWhenAboveVisible(cm, line, diff) {\n if (heightAtLine(line) < ((cm.curOp && cm.curOp.scrollTop) || cm.doc.scrollTop))\n { addToScrollTop(cm, diff); }\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, Math.max(0, widget.insertAt)), 0, widget); }\n widget.line = line;\n if (cm && !lineIsHidden(doc, line)) {\n var aboveVisible = heightAtLine(line) < doc.scrollTop;\n updateLineHeight(line, line.height + widgetHeight(widget));\n if (aboveVisible) { addToScrollTop(cm, widget.height); }\n cm.curOp.forceUpdate = true;\n }\n return true\n });\n if (cm) { signalLater(cm, \"lineWidgetAdded\", cm, widget, typeof handle == \"number\" ? handle : lineNo(handle)); }\n return widget\n }\n\n // TEXTMARKERS\n\n // Created with markText and setBookmark methods. A TextMarker is a\n // handle that can be used to clear or find a marked position in the\n // document. Line objects hold arrays (markedSpans) containing\n // {from, to, marker} object pointing to such marker objects, and\n // indicating that such a marker is present on that line. Multiple\n // lines may point to the same marker when it spans across lines.\n // The spans will have null for their from/to properties when the\n // marker continues beyond the start/end of the line. Markers have\n // links back to the lines they currently touch.\n\n // Collapsed markers have unique ids, in order to be able to order\n // them, which is needed for uniquely determining an outer marker\n // when they overlap (they may nest, but not partially overlap).\n var nextMarkerId = 0;\n\n var TextMarker = function(doc, type) {\n this.lines = [];\n this.type = type;\n this.doc = doc;\n this.id = ++nextMarkerId;\n };\n\n // Clear the marker.\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$1 = 0; i$1 < this.lines.length; ++i$1) {\n var visual = visualLine(this.lines[i$1]), len = lineLength(visual);\n if (len > cm.display.maxLineLength) {\n cm.display.maxLine = visual;\n cm.display.maxLineLength = len;\n cm.display.maxLineChanged = true;\n }\n } }\n\n if (min != null && cm && this.collapsed) { regChange(cm, min, max + 1); }\n this.lines.length = 0;\n this.explicitlyCleared = true;\n if (this.atomic && this.doc.cantEdit) {\n this.doc.cantEdit = false;\n if (cm) { reCheckSelection(cm.doc); }\n }\n if (cm) { signalLater(cm, \"markerCleared\", cm, this, min, max); }\n if (withOp) { endOperation(cm); }\n if (this.parent) { this.parent.clear(); }\n };\n\n // Find the position of the marker in the document. Returns a {from,\n // to} object by default. Side can be passed to get a specific side\n // -- 0 (both), -1 (left), or 1 (right). When lineObj is true, the\n // Pos objects returned contain a line object, rather than a line\n // number (used to prevent looking up the same line twice).\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 this$1 = this;\n\n var pos = this.find(-1, true), widget = this, cm = this.doc.cm;\n if (!pos || !cm) { return }\n runInOp(cm, function () {\n var line = pos.line, lineN = lineNo(pos.line);\n var view = findViewForLine(cm, lineN);\n if (view) {\n clearLineMeasurementCacheFor(view);\n cm.curOp.selectionChanged = cm.curOp.forceUpdate = true;\n }\n cm.curOp.updateMaxLine = true;\n if (!lineIsHidden(widget.doc, line) && widget.height != null) {\n var oldHeight = widget.height;\n widget.height = null;\n var dHeight = widgetHeight(widget) - oldHeight;\n if (dHeight)\n { updateLineHeight(line, line.height + dHeight); }\n }\n signalLater(cm, \"markerChanged\", cm, this$1);\n });\n };\n\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\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 eventMixin(TextMarker);\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 = eltP(\"span\", [marker.replacedWith], \"CodeMirror-widget\");\n if (!options.handleMouseEvents) { marker.widgetNode.setAttribute(\"cm-ignore-events\", \"true\"); }\n if (options.insertLeft) { marker.widgetNode.insertLeft = true; }\n }\n if (marker.collapsed) {\n if (conflictingCollapsedRange(doc, from.line, from, to, marker) ||\n from.line != to.line && conflictingCollapsedRange(doc, to.line, from, to, marker))\n { throw new Error(\"Inserting collapsed marker partially overlapping an existing one\") }\n seeCollapsedSpans();\n }\n\n if (marker.addToHistory)\n { addChangeToHistory(doc, {from: from, to: to, origin: \"markText\"}, doc.sel, NaN); }\n\n var curLine = from.line, cm = doc.cm, updateMaxLine;\n doc.iter(curLine, to.line + 1, function (line) {\n if (cm && marker.collapsed && !cm.options.lineWrapping && visualLine(line) == cm.display.maxLine)\n { updateMaxLine = true; }\n if (marker.collapsed && curLine != from.line) { updateLineHeight(line, 0); }\n addMarkedSpan(line, new MarkedSpan(marker,\n curLine == from.line ? from.ch : null,\n curLine == to.line ? to.ch : null), doc.cm && doc.cm.curOp);\n ++curLine;\n });\n // lineIsHidden depends on the presence of the spans, so needs a second pass\n if (marker.collapsed) { doc.iter(from.line, to.line + 1, function (line) {\n if (lineIsHidden(doc, line)) { updateLineHeight(line, 0); }\n }); }\n\n if (marker.clearOnEnter) { on(marker, \"beforeCursorEnter\", function () { return marker.clear(); }); }\n\n if (marker.readOnly) {\n seeReadOnlySpans();\n if (doc.history.done.length || doc.history.undone.length)\n { doc.clearHistory(); }\n }\n if (marker.collapsed) {\n marker.id = ++nextMarkerId;\n marker.atomic = true;\n }\n if (cm) {\n // Sync editor state\n if (updateMaxLine) { cm.curOp.updateMaxLine = true; }\n if (marker.collapsed)\n { regChange(cm, from.line, to.line + 1); }\n else if (marker.className || marker.startStyle || marker.endStyle || marker.css ||\n marker.attributes || marker.title)\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 = 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\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\n SharedTextMarker.prototype.find = function (side, lineObj) {\n return this.primary.find(side, lineObj)\n };\n eventMixin(SharedTextMarker);\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())), 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 var loop = function ( i ) {\n var marker = markers[i], linked = [marker.primary.doc];\n linkedDocs(marker.primary.doc, function (d) { return linked.push(d); });\n for (var j = 0; j < marker.markers.length; j++) {\n var subMarker = marker.markers[j];\n if (indexOf(linked, subMarker.doc) == -1) {\n subMarker.parent = null;\n marker.markers.splice(j--, 1);\n }\n }\n };\n\n for (var i = 0; i < markers.length; i++) loop( i );\n }\n\n var nextDocId = 0;\n var Doc = function(text, mode, firstLine, lineSep, direction) {\n if (!(this instanceof Doc)) { return new Doc(text, mode, firstLine, lineSep, direction) }\n if (firstLine == null) { firstLine = 0; }\n\n BranchChunk.call(this, [new LeafChunk([new Line(\"\", null)])]);\n this.first = firstLine;\n this.scrollTop = this.scrollLeft = 0;\n this.cantEdit = false;\n this.cleanGeneration = 1;\n this.modeFrontier = this.highlightFrontier = firstLine;\n var start = Pos(firstLine, 0);\n this.sel = simpleSelection(start);\n this.history = new History(null);\n this.id = ++nextDocId;\n this.modeOption = mode;\n this.lineSep = lineSep;\n this.direction = (direction == \"rtl\") ? \"rtl\" : \"ltr\";\n this.extend = false;\n\n if (typeof text == \"string\") { text = this.splitLines(text); }\n updateDoc(this, {from: start, to: start, text: text});\n setSelection(this, simpleSelection(start), sel_dontScroll);\n };\n\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 if (this.cm) { scrollToCoords(this.cm, 0, 0); }\n setSelection(this, simpleSelection(top), sel_dontScroll);\n }),\n replaceRange: function(code, from, to, origin) {\n from = clipPos(this, from);\n to = to ? clipPos(this, to) : from;\n replaceRange(this, code, from, to, origin);\n },\n getRange: function(from, to, lineSep) {\n var lines = getBetween(this, clipPos(this, from), clipPos(this, to));\n if (lineSep === false) { return lines }\n if (lineSep === '') { return lines.join('') }\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 var out = [];\n for (var i = 0; i < ranges.length; i++)\n { out[i] = new Range(clipPos(this, ranges[i].anchor),\n clipPos(this, ranges[i].head || ranges[i].anchor)); }\n if (primary == null) { primary = Math.min(ranges.length - 1, this.sel.primIndex); }\n setSelection(this, normalizeSelection(this.cm, 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(this.cm, 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$1 = changes.length - 1; i$1 >= 0; i$1--)\n { makeChange(this, changes[i$1]); }\n if (newSel) { setSelectionReplaceHistory(this, newSel); }\n else if (this.cm) { ensureCursorVisible(this.cm); }\n }),\n undo: docMethodOp(function() {makeChangeFromHistory(this, \"undo\");}),\n redo: docMethodOp(function() {makeChangeFromHistory(this, \"redo\");}),\n undoSelection: docMethodOp(function() {makeChangeFromHistory(this, \"undo\", true);}),\n redoSelection: docMethodOp(function() {makeChangeFromHistory(this, \"redo\", true);}),\n\n setExtending: function(val) {this.extend = val;},\n getExtending: function() {return this.extend},\n\n historySize: function() {\n var hist = this.history, done = 0, undone = 0;\n for (var i = 0; i < hist.done.length; i++) { if (!hist.done[i].ranges) { ++done; } }\n for (var i$1 = 0; i$1 < hist.undone.length; i$1++) { if (!hist.undone[i$1].ranges) { ++undone; } }\n return {undo: done, redo: undone}\n },\n clearHistory: function() {\n var this$1 = this;\n\n this.history = new History(this.history);\n linkedDocs(this, function (doc) { return doc.history = this$1.history; }, true);\n },\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);\n hist.done = copyHistoryArray(histData.done.slice(0), null, true);\n hist.undone = copyHistoryArray(histData.undone.slice(0), null, true);\n },\n\n setGutterMarker: docMethodOp(function(line, gutterID, value) {\n return changeLine(this, line, \"gutter\", function (line) {\n var markers = line.gutterMarkers || (line.gutterMarkers = {});\n markers[gutterID] = value;\n if (!value && isEmpty(markers)) { line.gutterMarkers = null; }\n return true\n })\n }),\n\n clearGutter: docMethodOp(function(gutterID) {\n var this$1 = this;\n\n this.iter(function (line) {\n if (line.gutterMarkers && line.gutterMarkers[gutterID]) {\n changeLine(this$1, line, \"gutter\", function () {\n line.gutterMarkers[gutterID] = null;\n if (isEmpty(line.gutterMarkers)) { line.gutterMarkers = null; }\n return true\n });\n }\n });\n }),\n\n lineInfo: function(line) {\n var n;\n if (typeof line == \"number\") {\n if (!isLine(this, line)) { return null }\n n = line;\n line = getLine(this, line);\n if (!line) { return null }\n } else {\n n = lineNo(line);\n if (n == null) { return null }\n }\n return {line: n, handle: line, text: line.text, gutterMarkers: line.gutterMarkers,\n textClass: line.textClass, bgClass: line.bgClass, wrapClass: line.wrapClass,\n widgets: line.widgets}\n },\n\n addLineClass: docMethodOp(function(handle, where, cls) {\n return changeLine(this, handle, where == \"gutter\" ? \"gutter\" : \"class\", function (line) {\n var prop = where == \"text\" ? \"textClass\"\n : where == \"background\" ? \"bgClass\"\n : where == \"gutter\" ? \"gutterClass\" : \"wrapClass\";\n if (!line[prop]) { line[prop] = cls; }\n else if (classTest(cls).test(line[prop])) { return false }\n else { line[prop] += \" \" + cls; }\n return true\n })\n }),\n removeLineClass: docMethodOp(function(handle, where, cls) {\n return changeLine(this, handle, where == \"gutter\" ? \"gutter\" : \"class\", function (line) {\n var prop = where == \"text\" ? \"textClass\"\n : where == \"background\" ? \"bgClass\"\n : where == \"gutter\" ? \"gutterClass\" : \"wrapClass\";\n var cur = line[prop];\n if (!cur) { return false }\n else if (cls == null) { line[prop] = null; }\n else {\n var found = cur.match(classTest(cls));\n if (!found) { return false }\n var end = found.index + found[0].length;\n line[prop] = cur.slice(0, found.index) + (!found.index || end == cur.length ? \"\" : \" \") + cur.slice(end) || null;\n }\n return true\n })\n }),\n\n addLineWidget: docMethodOp(function(handle, node, options) {\n return addLineWidget(this, handle, node, options)\n }),\n removeLineWidget: function(widget) { widget.clear(); },\n\n markText: function(from, to, options) {\n return markText(this, clipPos(this, from), clipPos(this, to), options, options && options.type || \"range\")\n },\n setBookmark: function(pos, options) {\n var realOpts = {replacedWith: options && (options.nodeType == null ? options.widget : options),\n insertLeft: options && options.insertLeft,\n clearWhenEmpty: false, shared: options && options.shared,\n handleMouseEvents: options && options.handleMouseEvents};\n pos = clipPos(this, pos);\n return markText(this, pos, pos, realOpts, \"bookmark\")\n },\n findMarksAt: function(pos) {\n pos = clipPos(this, pos);\n var markers = [], spans = getLine(this, pos.line).markedSpans;\n if (spans) { for (var i = 0; i < spans.length; ++i) {\n var span = spans[i];\n if ((span.from == null || span.from <= pos.ch) &&\n (span.to == null || span.to >= pos.ch))\n { markers.push(span.marker.parent || span.marker); }\n } }\n return markers\n },\n findMarks: function(from, to, filter) {\n from = clipPos(this, from); to = clipPos(this, to);\n var found = [], lineNo = 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) { // iter aborts when callback returns a truthy value\n index += line.text.length + sepSize;\n });\n return index\n },\n\n copy: function(copyHistory) {\n var doc = new Doc(getLines(this, this.first, this.first + this.size),\n this.modeOption, this.first, this.lineSep, this.direction);\n doc.scrollTop = this.scrollTop; doc.scrollLeft = this.scrollLeft;\n doc.sel = this.sel;\n doc.extend = false;\n if (copyHistory) {\n doc.history.undoDepth = this.history.undoDepth;\n doc.setHistory(this.getHistory());\n }\n return doc\n },\n\n linkedDoc: function(options) {\n if (!options) { options = {}; }\n var from = this.first, to = this.first + this.size;\n if (options.from != null && options.from > from) { from = options.from; }\n if (options.to != null && options.to < to) { to = options.to; }\n var copy = new Doc(getLines(this, from, to), options.mode || this.modeOption, from, this.lineSep, this.direction);\n if (options.sharedHist) { copy.history = this.history\n ; }(this.linked || (this.linked = [])).push({doc: copy, sharedHist: options.sharedHist});\n copy.linked = [{doc: this, isParent: true, sharedHist: options.sharedHist}];\n copySharedMarkers(copy, findSharedMarkers(this));\n return copy\n },\n unlinkDoc: function(other) {\n 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) { return splitIds.push(doc.id); }, true);\n other.history = new History(null);\n other.history.done = copyHistoryArray(this.history.done, splitIds);\n other.history.undone = copyHistoryArray(this.history.undone, splitIds);\n }\n },\n iterLinkedDocs: function(f) {linkedDocs(this, f);},\n\n getMode: function() {return this.mode},\n getEditor: function() {return this.cm},\n\n splitLines: function(str) {\n if (this.lineSep) { return str.split(this.lineSep) }\n return splitLinesAuto(str)\n },\n lineSeparator: function() { return this.lineSep || \"\\n\" },\n\n setDirection: docMethodOp(function (dir) {\n if (dir != \"rtl\") { dir = \"ltr\"; }\n if (dir == this.direction) { return }\n this.direction = dir;\n this.iter(function (line) { return line.order = null; });\n if (this.cm) { directionChanged(this.cm); }\n })\n });\n\n // Public alias.\n Doc.prototype.eachLine = Doc.prototype.iter;\n\n // Kludge to work around strange IE behavior where it'll sometimes\n // re-fire a series of drag-related events right after the drop (#1551)\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 markAsReadAndPasteIfAllFilesAreRead = function () {\n if (++read == n) {\n operation(cm, function () {\n pos = clipPos(cm.doc, pos);\n var change = {from: pos, to: pos,\n text: cm.doc.splitLines(\n text.filter(function (t) { return t != null; }).join(cm.doc.lineSeparator())),\n origin: \"paste\"};\n makeChange(cm.doc, change);\n setSelectionReplaceHistory(cm.doc, simpleSelection(clipPos(cm.doc, pos), clipPos(cm.doc, changeEnd(change))));\n })();\n }\n };\n var readTextFromFile = function (file, i) {\n if (cm.options.allowDropFileTypes &&\n indexOf(cm.options.allowDropFileTypes, file.type) == -1) {\n markAsReadAndPasteIfAllFilesAreRead();\n return\n }\n var reader = new FileReader;\n reader.onerror = function () { return markAsReadAndPasteIfAllFilesAreRead(); };\n reader.onload = function () {\n var content = reader.result;\n if (/[\\x00-\\x08\\x0e-\\x1f]{2}/.test(content)) {\n markAsReadAndPasteIfAllFilesAreRead();\n return\n }\n text[i] = content;\n markAsReadAndPasteIfAllFilesAreRead();\n };\n reader.readAsText(file);\n };\n for (var i = 0; i < files.length; i++) { readTextFromFile(files[i], i); }\n } else { // Normal drop\n // Don't do a replace if the drop happened inside of the selected text.\n if (cm.state.draggingText && cm.doc.sel.contains(pos) > -1) {\n cm.state.draggingText(e);\n // Ensure the editor is re-focused\n setTimeout(function () { return cm.display.input.focus(); }, 20);\n return\n }\n try {\n var text$1 = e.dataTransfer.getData(\"Text\");\n if (text$1) {\n var selected;\n if (cm.state.draggingText && !cm.state.draggingText.copy)\n { selected = cm.listSelections(); }\n setSelectionNoUndo(cm.doc, simpleSelection(pos, pos));\n if (selected) { for (var i$1 = 0; i$1 < selected.length; ++i$1)\n { replaceRange(cm.doc, \"\", selected[i$1].anchor, selected[i$1].head, \"drag\"); } }\n cm.replaceSelection(text$1, \"around\", \"paste\");\n cm.display.input.focus();\n }\n }\n catch(e$1){}\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 // 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.getElementsByClassName) { return }\n var byClass = document.getElementsByClassName(\"CodeMirror\"), editors = [];\n for (var i = 0; i < byClass.length; i++) {\n var cm = byClass[i].CodeMirror;\n if (cm) { editors.push(cm); }\n }\n if (editors.length) { editors[0].operation(function () {\n for (var i = 0; i < editors.length; i++) { f(editors[i]); }\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 () { return forEachCodeMirror(onBlur); });\n }\n // Called when the window resizes\n function onResize(cm) {\n var d = cm.display;\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 var keyNames = {\n 3: \"Pause\", 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: \"/\", 145: \"ScrollLock\",\n 173: \"-\", 186: \";\", 187: \"=\", 188: \",\", 189: \"-\", 190: \".\", 191: \"/\", 192: \"`\", 219: \"[\", 220: \"\\\\\",\n 221: \"]\", 222: \"'\", 224: \"Mod\", 63232: \"Up\", 63233: \"Down\", 63234: \"Left\", 63235: \"Right\", 63272: \"Delete\",\n 63273: \"Home\", 63275: \"End\", 63276: \"PageUp\", 63277: \"PageDown\", 63302: \"Insert\"\n };\n\n // Number keys\n for (var i = 0; i < 10; i++) { keyNames[i + 48] = keyNames[i + 96] = String(i); }\n // Alphabetic keys\n for (var i$1 = 65; i$1 <= 90; i$1++) { keyNames[i$1] = String.fromCharCode(i$1); }\n // Function keys\n for (var i$2 = 1; i$2 <= 12; i$2++) { keyNames[i$2 + 111] = keyNames[i$2 + 63235] = \"F\" + i$2; }\n\n var 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 \"Ctrl-A\": \"goLineStart\", \"Ctrl-E\": \"goLineEnd\", \"Ctrl-V\": \"goPageDown\", \"Shift-Ctrl-V\": \"goPageUp\",\n \"Ctrl-D\": \"delCharAfter\", \"Ctrl-H\": \"delCharBefore\", \"Alt-Backspace\": \"delWordBefore\", \"Ctrl-K\": \"killLine\",\n \"Ctrl-T\": \"transposeChars\", \"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(/-(?!$)/);\n name = parts[parts.length - 1];\n var alt, ctrl, shift, cmd;\n for (var i = 0; i < parts.length - 1; i++) {\n var mod = parts[i];\n if (/^(cmd|meta|m)$/i.test(mod)) { cmd = true; }\n else if (/^a(lt)?$/i.test(mod)) { alt = true; }\n else if (/^(c|ctrl|control)$/i.test(mod)) { ctrl = true; }\n else if (/^s(hift)?$/i.test(mod)) { shift = true; }\n else { throw new Error(\"Unrecognized modifier name: \" + mod) }\n }\n if (alt) { name = \"Alt-\" + name; }\n if (ctrl) { name = \"Ctrl-\" + name; }\n if (cmd) { name = \"Cmd-\" + name; }\n if (shift) { name = \"Shift-\" + name; }\n return name\n }\n\n // This is a kludge to keep keymaps mostly working as raw objects\n // (backwards compatibility) while at the same time support features\n // like normalization and multi-stroke key bindings. It compiles a\n // new normalized keymap, and then updates the old object to reflect\n // this.\n function normalizeKeyMap(keymap) {\n var copy = {};\n for (var keyname in keymap) { if (keymap.hasOwnProperty(keyname)) {\n var value = keymap[keyname];\n if (/^(name|fallthrough|(de|at)tach)$/.test(keyname)) { continue }\n if (value == \"...\") { delete keymap[keyname]; continue }\n\n var keys = map(keyname.split(\" \"), normalizeKeyName);\n for (var i = 0; i < keys.length; i++) {\n var val = (void 0), name = (void 0);\n if (i == keys.length - 1) {\n name = keys.join(\" \");\n val = value;\n } else {\n name = keys.slice(0, i + 1).join(\" \");\n val = \"...\";\n }\n var prev = copy[name];\n if (!prev) { copy[name] = val; }\n else if (prev != val) { throw new Error(\"Inconsistent bindings for \" + name) }\n }\n delete keymap[keyname];\n } }\n for (var prop in copy) { keymap[prop] = copy[prop]; }\n return keymap\n }\n\n function lookupKey(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 function isModifierKey(value) {\n var name = typeof value == \"string\" ? value : keyNames[value.keyCode];\n return name == \"Ctrl\" || name == \"Alt\" || name == \"Shift\" || name == \"Mod\"\n }\n\n function addModifierNames(name, event, noShift) {\n var base = name;\n if (event.altKey && base != \"Alt\") { name = \"Alt-\" + name; }\n if ((flipCtrlCmd ? event.metaKey : event.ctrlKey) && base != \"Ctrl\") { name = \"Ctrl-\" + name; }\n if ((flipCtrlCmd ? event.ctrlKey : event.metaKey) && base != \"Mod\") { name = \"Cmd-\" + name; }\n if (!noShift && event.shiftKey && base != \"Shift\") { name = \"Shift-\" + name; }\n return name\n }\n\n // Look up the name of a key as indicated by an event object.\n function keyName(event, noShift) {\n if (presto && event.keyCode == 34 && event[\"char\"]) { return false }\n var name = keyNames[event.keyCode];\n if (name == null || event.altGraphKey) { return false }\n // Ctrl-ScrollLock has keyCode 3, same as Ctrl-Pause,\n // so we'll use event.code when available (Chrome 48+, FF 38+, Safari 10.1+)\n if (event.keyCode == 3 && event.code) { name = event.code; }\n return addModifierNames(name, event, noShift)\n }\n\n function getKeyMap(val) {\n return typeof val == \"string\" ? keyMap[val] : val\n }\n\n // Helper for deleting text near the selection(s), used to implement\n // backspace, delete, and similar functionality.\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 function moveCharLogically(line, ch, dir) {\n var target = skipExtendingChars(line.text, ch + dir, dir);\n return target < 0 || target > line.text.length ? null : target\n }\n\n function moveLogically(line, start, dir) {\n var ch = moveCharLogically(line, start.ch, dir);\n return ch == null ? null : new Pos(start.line, ch, dir < 0 ? \"after\" : \"before\")\n }\n\n function endOfLine(visually, cm, lineObj, lineNo, dir) {\n if (visually) {\n if (cm.doc.direction == \"rtl\") { dir = -dir; }\n var order = getOrder(lineObj, cm.doc.direction);\n if (order) {\n var part = dir < 0 ? lst(order) : order[0];\n var moveInStorageOrder = (dir < 0) == (part.level == 1);\n var sticky = moveInStorageOrder ? \"after\" : \"before\";\n var ch;\n // With a wrapped rtl chunk (possibly spanning multiple bidi parts),\n // it could be that the last bidi part is not on the last visual line,\n // since visual lines contain content order-consecutive chunks.\n // Thus, in rtl, we are looking for the first (content-order) character\n // in the rtl chunk that is on the last line (that is, the same line\n // as the last (content-order) character).\n if (part.level > 0 || cm.doc.direction == \"rtl\") {\n var prep = prepareMeasureForLine(cm, lineObj);\n ch = dir < 0 ? lineObj.text.length - 1 : 0;\n var targetTop = measureCharPrepared(cm, prep, ch).top;\n ch = findFirst(function (ch) { return measureCharPrepared(cm, prep, ch).top == targetTop; }, (dir < 0) == (part.level == 1) ? part.from : part.to - 1, ch);\n if (sticky == \"before\") { ch = moveCharLogically(lineObj, ch, 1); }\n } else { ch = dir < 0 ? part.to : part.from; }\n return new Pos(lineNo, ch, sticky)\n }\n }\n return new Pos(lineNo, dir < 0 ? lineObj.text.length : 0, dir < 0 ? \"before\" : \"after\")\n }\n\n function moveVisually(cm, line, start, dir) {\n var bidi = getOrder(line, cm.doc.direction);\n if (!bidi) { return moveLogically(line, start, dir) }\n if (start.ch >= line.text.length) {\n start.ch = line.text.length;\n start.sticky = \"before\";\n } else if (start.ch <= 0) {\n start.ch = 0;\n start.sticky = \"after\";\n }\n var partPos = getBidiPartAt(bidi, start.ch, start.sticky), part = bidi[partPos];\n if (cm.doc.direction == \"ltr\" && part.level % 2 == 0 && (dir > 0 ? part.to > start.ch : part.from < start.ch)) {\n // Case 1: We move within an ltr part in an ltr editor. Even with wrapped lines,\n // nothing interesting happens.\n return moveLogically(line, start, dir)\n }\n\n var mv = function (pos, dir) { return moveCharLogically(line, pos instanceof Pos ? pos.ch : pos, dir); };\n var prep;\n var getWrappedLineExtent = function (ch) {\n if (!cm.options.lineWrapping) { return {begin: 0, end: line.text.length} }\n prep = prep || prepareMeasureForLine(cm, line);\n return wrappedLineExtentChar(cm, line, prep, ch)\n };\n var wrappedLineExtent = getWrappedLineExtent(start.sticky == \"before\" ? mv(start, -1) : start.ch);\n\n if (cm.doc.direction == \"rtl\" || part.level == 1) {\n var moveInStorageOrder = (part.level == 1) == (dir < 0);\n var ch = mv(start, moveInStorageOrder ? 1 : -1);\n if (ch != null && (!moveInStorageOrder ? ch >= part.from && ch >= wrappedLineExtent.begin : ch <= part.to && ch <= wrappedLineExtent.end)) {\n // Case 2: We move within an rtl part or in an rtl editor on the same visual line\n var sticky = moveInStorageOrder ? \"before\" : \"after\";\n return new Pos(start.line, ch, sticky)\n }\n }\n\n // Case 3: Could not move within this bidi part in this visual line, so leave\n // the current bidi part\n\n var searchInVisualLine = function (partPos, dir, wrappedLineExtent) {\n var getRes = function (ch, moveInStorageOrder) { return moveInStorageOrder\n ? new Pos(start.line, mv(ch, 1), \"before\")\n : new Pos(start.line, ch, \"after\"); };\n\n for (; partPos >= 0 && partPos < bidi.length; partPos += dir) {\n var part = bidi[partPos];\n var moveInStorageOrder = (dir > 0) == (part.level != 1);\n var ch = moveInStorageOrder ? wrappedLineExtent.begin : mv(wrappedLineExtent.end, -1);\n if (part.from <= ch && ch < part.to) { return getRes(ch, moveInStorageOrder) }\n ch = moveInStorageOrder ? part.from : mv(part.to, -1);\n if (wrappedLineExtent.begin <= ch && ch < wrappedLineExtent.end) { return getRes(ch, moveInStorageOrder) }\n }\n };\n\n // Case 3a: Look for other bidi parts on the same visual line\n var res = searchInVisualLine(partPos + dir, dir, wrappedLineExtent);\n if (res) { return res }\n\n // Case 3b: Look for other bidi parts on the next visual line\n var nextCh = dir > 0 ? wrappedLineExtent.end : mv(wrappedLineExtent.begin, -1);\n if (nextCh != null && !(dir > 0 && nextCh == line.text.length)) {\n res = searchInVisualLine(dir > 0 ? 0 : bidi.length - 1, dir, getWrappedLineExtent(nextCh));\n if (res) { return res }\n }\n\n // Case 4: Nowhere to move\n return null\n }\n\n // Commands are parameter-less actions that can be performed on an\n // editor, mostly used for keybindings.\n var commands = {\n selectAll: selectAll,\n singleSelection: function (cm) { return cm.setSelection(cm.getCursor(\"anchor\"), cm.getCursor(\"head\"), sel_dontScroll); },\n killLine: function (cm) { return deleteNearSelection(cm, function (range) {\n if (range.empty()) {\n var len = getLine(cm.doc, range.head.line).text.length;\n if (range.head.ch == len && range.head.line < cm.lastLine())\n { return {from: range.head, to: Pos(range.head.line + 1, 0)} }\n else\n { return {from: range.head, to: Pos(range.head.line, len)} }\n } else {\n return {from: range.from(), to: range.to()}\n }\n }); },\n deleteLine: function (cm) { return deleteNearSelection(cm, function (range) { return ({\n from: Pos(range.from().line, 0),\n to: clipPos(cm.doc, Pos(range.to().line + 1, 0))\n }); }); },\n delLineLeft: function (cm) { return deleteNearSelection(cm, function (range) { return ({\n from: Pos(range.from().line, 0), to: range.from()\n }); }); },\n delWrappedLineLeft: function (cm) { return deleteNearSelection(cm, function (range) {\n var top = cm.charCoords(range.head, \"div\").top + 5;\n var leftPos = cm.coordsChar({left: 0, top: top}, \"div\");\n return {from: leftPos, to: range.from()}\n }); },\n delWrappedLineRight: function (cm) { return deleteNearSelection(cm, function (range) {\n var top = cm.charCoords(range.head, \"div\").top + 5;\n var rightPos = cm.coordsChar({left: cm.display.lineDiv.offsetWidth + 100, top: top}, \"div\");\n return {from: range.from(), to: rightPos }\n }); },\n undo: function (cm) { return cm.undo(); },\n redo: function (cm) { return cm.redo(); },\n undoSelection: function (cm) { return cm.undoSelection(); },\n redoSelection: function (cm) { return cm.redoSelection(); },\n goDocStart: function (cm) { return cm.extendSelection(Pos(cm.firstLine(), 0)); },\n goDocEnd: function (cm) { return cm.extendSelection(Pos(cm.lastLine())); },\n goLineStart: function (cm) { return cm.extendSelectionsBy(function (range) { return lineStart(cm, range.head.line); },\n {origin: \"+move\", bias: 1}\n ); },\n goLineStartSmart: function (cm) { return cm.extendSelectionsBy(function (range) { return lineStartSmart(cm, range.head); },\n {origin: \"+move\", bias: 1}\n ); },\n goLineEnd: function (cm) { return cm.extendSelectionsBy(function (range) { return lineEnd(cm, range.head.line); },\n {origin: \"+move\", bias: -1}\n ); },\n goLineRight: function (cm) { return cm.extendSelectionsBy(function (range) {\n var top = cm.cursorCoords(range.head, \"div\").top + 5;\n return cm.coordsChar({left: cm.display.lineDiv.offsetWidth + 100, top: top}, \"div\")\n }, sel_move); },\n goLineLeft: function (cm) { return cm.extendSelectionsBy(function (range) {\n var top = cm.cursorCoords(range.head, \"div\").top + 5;\n return cm.coordsChar({left: 0, top: top}, \"div\")\n }, sel_move); },\n goLineLeftSmart: function (cm) { return cm.extendSelectionsBy(function (range) {\n var top = cm.cursorCoords(range.head, \"div\").top + 5;\n var pos = cm.coordsChar({left: 0, top: top}, \"div\");\n if (pos.ch < cm.getLine(pos.line).search(/\\S/)) { return lineStartSmart(cm, range.head) }\n return pos\n }, sel_move); },\n goLineUp: function (cm) { return cm.moveV(-1, \"line\"); },\n goLineDown: function (cm) { return cm.moveV(1, \"line\"); },\n goPageUp: function (cm) { return cm.moveV(-1, \"page\"); },\n goPageDown: function (cm) { return cm.moveV(1, \"page\"); },\n goCharLeft: function (cm) { return cm.moveH(-1, \"char\"); },\n goCharRight: function (cm) { return cm.moveH(1, \"char\"); },\n goColumnLeft: function (cm) { return cm.moveH(-1, \"column\"); },\n goColumnRight: function (cm) { return cm.moveH(1, \"column\"); },\n goWordLeft: function (cm) { return cm.moveH(-1, \"word\"); },\n goGroupRight: function (cm) { return cm.moveH(1, \"group\"); },\n goGroupLeft: function (cm) { return cm.moveH(-1, \"group\"); },\n goWordRight: function (cm) { return cm.moveH(1, \"word\"); },\n delCharBefore: function (cm) { return cm.deleteH(-1, \"codepoint\"); },\n delCharAfter: function (cm) { return cm.deleteH(1, \"char\"); },\n delWordBefore: function (cm) { return cm.deleteH(-1, \"word\"); },\n delWordAfter: function (cm) { return cm.deleteH(1, \"word\"); },\n delGroupBefore: function (cm) { return cm.deleteH(-1, \"group\"); },\n delGroupAfter: function (cm) { return cm.deleteH(1, \"group\"); },\n indentAuto: function (cm) { return cm.indentSelection(\"smart\"); },\n indentMore: function (cm) { return cm.indentSelection(\"add\"); },\n indentLess: function (cm) { return cm.indentSelection(\"subtract\"); },\n insertTab: function (cm) { return cm.replaceSelection(\"\\t\"); },\n insertSoftTab: function (cm) {\n var spaces = [], ranges = cm.listSelections(), tabSize = cm.options.tabSize;\n for (var i = 0; i < ranges.length; i++) {\n var pos = ranges[i].from();\n var col = countColumn(cm.getLine(pos.line), pos.ch, tabSize);\n spaces.push(spaceStr(tabSize - col % tabSize));\n }\n cm.replaceSelections(spaces);\n },\n defaultTab: function (cm) {\n if (cm.somethingSelected()) { cm.indentSelection(\"add\"); }\n else { cm.execCommand(\"insertTab\"); }\n },\n // Swap the two chars left and right of each selection's head.\n // Move cursor behind the two swapped characters afterwards.\n //\n // Doesn't consider line feeds a character.\n // Doesn't scan more than one line above to find a character.\n // Doesn't do anything on an empty line.\n // Doesn't do anything with non-empty selections.\n transposeChars: function (cm) { return runInOp(cm, function () {\n var ranges = cm.listSelections(), newSel = [];\n for (var i = 0; i < ranges.length; i++) {\n if (!ranges[i].empty()) { continue }\n var cur = ranges[i].head, line = getLine(cm.doc, cur.line).text;\n if (line) {\n if (cur.ch == line.length) { cur = new Pos(cur.line, cur.ch - 1); }\n if (cur.ch > 0) {\n cur = new Pos(cur.line, cur.ch + 1);\n cm.replaceRange(line.charAt(cur.ch - 1) + line.charAt(cur.ch - 2),\n Pos(cur.line, cur.ch - 2), cur, \"+transpose\");\n } else if (cur.line > cm.doc.first) {\n var prev = getLine(cm.doc, cur.line - 1).text;\n if (prev) {\n cur = new Pos(cur.line, 1);\n cm.replaceRange(line.charAt(0) + cm.doc.lineSeparator() +\n prev.charAt(prev.length - 1),\n Pos(cur.line - 1, prev.length - 1), cur, \"+transpose\");\n }\n }\n }\n newSel.push(new Range(cur, cur));\n }\n cm.setSelections(newSel);\n }); },\n newlineAndIndent: function (cm) { return runInOp(cm, function () {\n var sels = cm.listSelections();\n for (var i = sels.length - 1; i >= 0; i--)\n { cm.replaceRange(cm.doc.lineSeparator(), sels[i].anchor, sels[i].head, \"+input\"); }\n sels = cm.listSelections();\n for (var i$1 = 0; i$1 < sels.length; i$1++)\n { cm.indentLine(sels[i$1].from().line, null, true); }\n ensureCursorVisible(cm);\n }); },\n openLine: function (cm) { return cm.replaceSelection(\"\\n\", \"start\"); },\n toggleOverwrite: function (cm) { return cm.toggleOverwrite(); }\n };\n\n\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 return endOfLine(true, cm, visual, lineN, 1)\n }\n function lineEnd(cm, lineN) {\n var line = getLine(cm.doc, lineN);\n var visual = visualLineEnd(line);\n if (visual != line) { lineN = lineNo(visual); }\n return endOfLine(true, cm, line, lineN, -1)\n }\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, cm.doc.direction);\n if (!order || order[0].level == 0) {\n var firstNonWS = Math.max(start.ch, line.text.search(/\\S/));\n var inWS = pos.line == start.line && pos.ch <= firstNonWS && pos.ch;\n return Pos(start.line, inWS ? 0 : firstNonWS, start.sticky)\n }\n return start\n }\n\n // Run a handler that was bound to a key.\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 // Note that, despite the name, this function is also used to check\n // for bound mouse clicks.\n\n var stopSeq = new Delayed;\n\n function dispatchKey(cm, name, e, handle) {\n var seq = cm.state.keySeq;\n if (seq) {\n if (isModifierKey(name)) { return \"handled\" }\n if (/\\'$/.test(name))\n { cm.state.keySeq = null; }\n else\n { stopSeq.set(50, function () {\n if (cm.state.keySeq == seq) {\n cm.state.keySeq = null;\n cm.display.input.reset();\n }\n }); }\n if (dispatchKeyInner(cm, seq + \" \" + name, e, handle)) { return true }\n }\n return dispatchKeyInner(cm, name, e, handle)\n }\n\n function dispatchKeyInner(cm, name, e, handle) {\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 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, function (b) { return doHandleBinding(cm, b, true); })\n }\n\n var lastStoppedKey = null;\n function onKeyDown(e) {\n var cm = this;\n if (e.target && e.target != cm.display.input.getField()) { return }\n cm.curOp.focus = activeElt(root(cm));\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 if (gecko && !mac && !handled && code == 46 && e.shiftKey && !e.ctrlKey && document.execCommand)\n { document.execCommand(\"cut\"); }\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 (e.target && e.target != cm.display.input.getField()) { return }\n if (eventInWidget(cm.display, e) || signalDOMEvent(cm, e) || e.ctrlKey && !e.altKey || mac && e.metaKey) { return }\n var keyCode = e.keyCode, charCode = e.charCode;\n if (presto && keyCode == lastStoppedKey) {lastStoppedKey = null; e_preventDefault(e); return}\n if ((presto && (!e.which || e.which < 10)) && handleKeyBinding(cm, e)) { return }\n var ch = String.fromCharCode(charCode == null ? keyCode : charCode);\n // Some browsers fire keypress events for backspace\n if (ch == \"\\x08\") { return }\n if (handleCharBinding(cm, e, ch)) { return }\n cm.display.input.onKeyPress(e);\n }\n\n var DOUBLECLICK_DELAY = 400;\n\n var PastClick = function(time, pos, button) {\n this.time = time;\n this.pos = pos;\n this.button = button;\n };\n\n PastClick.prototype.compare = function (time, pos, button) {\n return this.time + DOUBLECLICK_DELAY > time &&\n cmp(pos, this.pos) == 0 && button == this.button\n };\n\n var lastClick, lastDoubleClick;\n function clickRepeat(pos, button) {\n var now = +new Date;\n if (lastDoubleClick && lastDoubleClick.compare(now, pos, button)) {\n lastClick = lastDoubleClick = null;\n return \"triple\"\n } else if (lastClick && lastClick.compare(now, pos, button)) {\n lastDoubleClick = new PastClick(now, pos, button);\n lastClick = null;\n return \"double\"\n } else {\n lastClick = new PastClick(now, pos, button);\n lastDoubleClick = null;\n return \"single\"\n }\n }\n\n // A mouse down can be a single click, double click, triple click,\n // start of selection drag, start of text drag, new cursor\n // (ctrl-click), rectangle drag (alt-drag), or xwin\n // middle-click-paste. Or it might be a click on something we should\n // not interfere with, such as a scrollbar or widget.\n function onMouseDown(e) {\n var cm = this, display = cm.display;\n if (signalDOMEvent(cm, e) || display.activeTouch && display.input.supportsTouch()) { return }\n display.input.ensurePolled();\n display.shift = e.shiftKey;\n\n if (eventInWidget(display, e)) {\n if (!webkit) {\n // Briefly turn off draggability, to allow widgets to do\n // normal dragging things.\n display.scroller.draggable = false;\n setTimeout(function () { return display.scroller.draggable = true; }, 100);\n }\n return\n }\n if (clickInGutter(cm, e)) { return }\n var pos = posFromMouse(cm, e), button = e_button(e), repeat = pos ? clickRepeat(pos, button) : \"single\";\n win(cm).focus();\n\n // #3261: make sure, that we're not starting a second selection\n if (button == 1 && cm.state.selectingText)\n { cm.state.selectingText(e); }\n\n if (pos && handleMappedButton(cm, button, pos, repeat, e)) { return }\n\n if (button == 1) {\n if (pos) { leftButtonDown(cm, pos, repeat, e); }\n else if (e_target(e) == display.scroller) { e_preventDefault(e); }\n } else if (button == 2) {\n if (pos) { extendSelection(cm.doc, pos); }\n setTimeout(function () { return display.input.focus(); }, 20);\n } else if (button == 3) {\n if (captureRightClick) { cm.display.input.onContextMenu(e); }\n else { delayBlurEvent(cm); }\n }\n }\n\n function handleMappedButton(cm, button, pos, repeat, event) {\n var name = \"Click\";\n if (repeat == \"double\") { name = \"Double\" + name; }\n else if (repeat == \"triple\") { name = \"Triple\" + name; }\n name = (button == 1 ? \"Left\" : button == 2 ? \"Middle\" : \"Right\") + name;\n\n return dispatchKey(cm, addModifierNames(name, event), event, function (bound) {\n if (typeof bound == \"string\") { bound = commands[bound]; }\n if (!bound) { return false }\n var done = false;\n try {\n if (cm.isReadOnly()) { cm.state.suppressEdits = true; }\n done = bound(cm, pos) != Pass;\n } finally {\n cm.state.suppressEdits = false;\n }\n return done\n })\n }\n\n function configureMouse(cm, repeat, event) {\n var option = cm.getOption(\"configureMouse\");\n var value = option ? option(cm, repeat, event) : {};\n if (value.unit == null) {\n var rect = chromeOS ? event.shiftKey && event.metaKey : event.altKey;\n value.unit = rect ? \"rectangle\" : repeat == \"single\" ? \"char\" : repeat == \"double\" ? \"word\" : \"line\";\n }\n if (value.extend == null || cm.doc.extend) { value.extend = cm.doc.extend || event.shiftKey; }\n if (value.addNew == null) { value.addNew = mac ? event.metaKey : event.ctrlKey; }\n if (value.moveOnDrag == null) { value.moveOnDrag = !(mac ? event.altKey : event.ctrlKey); }\n return value\n }\n\n function leftButtonDown(cm, pos, repeat, event) {\n if (ie) { setTimeout(bind(ensureFocus, cm), 0); }\n else { cm.curOp.focus = activeElt(root(cm)); }\n\n var behavior = configureMouse(cm, repeat, event);\n\n var sel = cm.doc.sel, contained;\n if (cm.options.dragDrop && dragAndDrop && !cm.isReadOnly() &&\n repeat == \"single\" && (contained = sel.contains(pos)) > -1 &&\n (cmp((contained = sel.ranges[contained]).from(), pos) < 0 || pos.xRel > 0) &&\n (cmp(contained.to(), pos) > 0 || pos.xRel < 0))\n { leftButtonStartDrag(cm, event, pos, behavior); }\n else\n { leftButtonSelect(cm, event, pos, behavior); }\n }\n\n // Start a text drag. When it ends, see if any dragging actually\n // happen, and treat as a click if it didn't.\n function leftButtonStartDrag(cm, event, pos, behavior) {\n var display = cm.display, moved = false;\n var dragEnd = operation(cm, function (e) {\n if (webkit) { display.scroller.draggable = false; }\n cm.state.draggingText = false;\n if (cm.state.delayingBlurEvent) {\n if (cm.hasFocus()) { cm.state.delayingBlurEvent = false; }\n else { delayBlurEvent(cm); }\n }\n off(display.wrapper.ownerDocument, \"mouseup\", dragEnd);\n off(display.wrapper.ownerDocument, \"mousemove\", mouseMove);\n off(display.scroller, \"dragstart\", dragStart);\n off(display.scroller, \"drop\", dragEnd);\n if (!moved) {\n e_preventDefault(e);\n if (!behavior.addNew)\n { extendSelection(cm.doc, pos, null, null, behavior.extend); }\n // Work around unexplainable focus problem in IE9 (#2127) and Chrome (#3081)\n if ((webkit && !safari) || ie && ie_version == 9)\n { setTimeout(function () {display.wrapper.ownerDocument.body.focus({preventScroll: true}); display.input.focus();}, 20); }\n else\n { display.input.focus(); }\n }\n });\n var mouseMove = function(e2) {\n moved = moved || Math.abs(event.clientX - e2.clientX) + Math.abs(event.clientY - e2.clientY) >= 10;\n };\n var dragStart = function () { return moved = true; };\n // Let the drag handler handle this.\n if (webkit) { display.scroller.draggable = true; }\n cm.state.draggingText = dragEnd;\n dragEnd.copy = !behavior.moveOnDrag;\n on(display.wrapper.ownerDocument, \"mouseup\", dragEnd);\n on(display.wrapper.ownerDocument, \"mousemove\", mouseMove);\n on(display.scroller, \"dragstart\", dragStart);\n on(display.scroller, \"drop\", dragEnd);\n\n cm.state.delayingBlurEvent = true;\n setTimeout(function () { return display.input.focus(); }, 20);\n // IE's approach to draggable\n if (display.scroller.dragDrop) { display.scroller.dragDrop(); }\n }\n\n function rangeForUnit(cm, pos, unit) {\n if (unit == \"char\") { return new Range(pos, pos) }\n if (unit == \"word\") { return cm.findWordAt(pos) }\n if (unit == \"line\") { return new Range(Pos(pos.line, 0), clipPos(cm.doc, Pos(pos.line + 1, 0))) }\n var result = unit(cm, pos);\n return new Range(result.from, result.to)\n }\n\n // Normal selection, as opposed to text dragging.\n function leftButtonSelect(cm, event, start, behavior) {\n if (ie) { delayBlurEvent(cm); }\n var display = cm.display, doc = cm.doc;\n e_preventDefault(event);\n\n var ourRange, ourIndex, startSel = doc.sel, ranges = startSel.ranges;\n if (behavior.addNew && !behavior.extend) {\n ourIndex = doc.sel.contains(start);\n if (ourIndex > -1)\n { ourRange = ranges[ourIndex]; }\n else\n { ourRange = new Range(start, start); }\n } else {\n ourRange = doc.sel.primary();\n ourIndex = doc.sel.primIndex;\n }\n\n if (behavior.unit == \"rectangle\") {\n if (!behavior.addNew) { ourRange = new Range(start, start); }\n start = posFromMouse(cm, event, true, true);\n ourIndex = -1;\n } else {\n var range = rangeForUnit(cm, start, behavior.unit);\n if (behavior.extend)\n { ourRange = extendRange(ourRange, range.anchor, range.head, behavior.extend); }\n else\n { ourRange = range; }\n }\n\n if (!behavior.addNew) {\n ourIndex = 0;\n setSelection(doc, new Selection([ourRange], 0), sel_mouse);\n startSel = doc.sel;\n } else if (ourIndex == -1) {\n ourIndex = ranges.length;\n setSelection(doc, normalizeSelection(cm, ranges.concat([ourRange]), ourIndex),\n {scroll: false, origin: \"*mouse\"});\n } else if (ranges.length > 1 && ranges[ourIndex].empty() && behavior.unit == \"char\" && !behavior.extend) {\n setSelection(doc, normalizeSelection(cm, ranges.slice(0, ourIndex).concat(ranges.slice(ourIndex + 1)), 0),\n {scroll: false, origin: \"*mouse\"});\n startSel = doc.sel;\n } else {\n replaceOneSelection(doc, ourIndex, ourRange, sel_mouse);\n }\n\n var lastPos = start;\n function extendTo(pos) {\n if (cmp(lastPos, pos) == 0) { return }\n lastPos = pos;\n\n if (behavior.unit == \"rectangle\") {\n var ranges = [], tabSize = cm.options.tabSize;\n var startCol = countColumn(getLine(doc, start.line).text, start.ch, tabSize);\n var posCol = countColumn(getLine(doc, pos.line).text, pos.ch, tabSize);\n var left = Math.min(startCol, posCol), right = Math.max(startCol, posCol);\n for (var line = Math.min(start.line, pos.line), end = Math.min(cm.lastLine(), Math.max(start.line, pos.line));\n line <= end; line++) {\n var text = getLine(doc, line).text, leftPos = findColumn(text, left, tabSize);\n if (left == right)\n { ranges.push(new Range(Pos(line, leftPos), Pos(line, leftPos))); }\n else if (text.length > leftPos)\n { ranges.push(new Range(Pos(line, leftPos), Pos(line, findColumn(text, right, tabSize)))); }\n }\n if (!ranges.length) { ranges.push(new Range(start, start)); }\n setSelection(doc, normalizeSelection(cm, startSel.ranges.slice(0, ourIndex).concat(ranges), ourIndex),\n {origin: \"*mouse\", scroll: false});\n cm.scrollIntoView(pos);\n } else {\n var oldRange = ourRange;\n var range = rangeForUnit(cm, pos, behavior.unit);\n var anchor = oldRange.anchor, head;\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 var ranges$1 = startSel.ranges.slice(0);\n ranges$1[ourIndex] = bidiSimplify(cm, new Range(clipPos(doc, anchor), head));\n setSelection(doc, normalizeSelection(cm, ranges$1, ourIndex), sel_mouse);\n }\n }\n\n var editorSize = display.wrapper.getBoundingClientRect();\n // Used to ensure timeout re-tries don't fire when another extend\n // happened in the meantime (clearTimeout isn't reliable -- at\n // least on Chrome, the timeouts still happen even when cleared,\n // if the clear happens after their scheduled firing time).\n var counter = 0;\n\n function extend(e) {\n var curCount = ++counter;\n var cur = posFromMouse(cm, e, true, behavior.unit == \"rectangle\");\n if (!cur) { return }\n if (cmp(cur, lastPos) != 0) {\n cm.curOp.focus = activeElt(root(cm));\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 // If e is null or undefined we interpret this as someone trying\n // to explicitly cancel the selection rather than the user\n // letting go of the mouse button.\n if (e) {\n e_preventDefault(e);\n display.input.focus();\n }\n off(display.wrapper.ownerDocument, \"mousemove\", move);\n off(display.wrapper.ownerDocument, \"mouseup\", up);\n doc.history.lastSelOrigin = null;\n }\n\n var move = operation(cm, function (e) {\n if (e.buttons === 0 || !e_button(e)) { done(e); }\n else { extend(e); }\n });\n var up = operation(cm, done);\n cm.state.selectingText = up;\n on(display.wrapper.ownerDocument, \"mousemove\", move);\n on(display.wrapper.ownerDocument, \"mouseup\", up);\n }\n\n // Used when mouse-selecting to adjust the anchor to the proper side\n // of a bidi jump depending on the visual position of the head.\n function bidiSimplify(cm, range) {\n var anchor = range.anchor;\n var head = range.head;\n var anchorLine = getLine(cm.doc, anchor.line);\n if (cmp(anchor, head) == 0 && anchor.sticky == head.sticky) { return range }\n var order = getOrder(anchorLine);\n if (!order) { return range }\n var index = getBidiPartAt(order, anchor.ch, anchor.sticky), part = order[index];\n if (part.from != anchor.ch && part.to != anchor.ch) { return range }\n var boundary = index + ((part.from == anchor.ch) == (part.level != 1) ? 0 : 1);\n if (boundary == 0 || boundary == order.length) { return range }\n\n // Compute the relative visual position of the head compared to the\n // anchor (<0 is to the left, >0 to the right)\n var leftSide;\n if (head.line != anchor.line) {\n leftSide = (head.line - anchor.line) * (cm.doc.direction == \"ltr\" ? 1 : -1) > 0;\n } else {\n var headIndex = getBidiPartAt(order, head.ch, head.sticky);\n var dir = headIndex - index || (head.ch - anchor.ch) * (part.level == 1 ? -1 : 1);\n if (headIndex == boundary - 1 || headIndex == boundary)\n { leftSide = dir < 0; }\n else\n { leftSide = dir > 0; }\n }\n\n var usePart = order[boundary + (leftSide ? -1 : 0)];\n var from = leftSide == (usePart.level == 1);\n var ch = from ? usePart.from : usePart.to, sticky = from ? \"after\" : \"before\";\n return anchor.ch == ch && anchor.sticky == sticky ? range : new Range(new Pos(anchor.line, ch, sticky), head)\n }\n\n\n // Determines whether an event happened in the gutter, and fires the\n // handlers for the corresponding event.\n function gutterEvent(cm, e, type, prevent) {\n var mX, mY;\n if (e.touches) {\n mX = e.touches[0].clientX;\n mY = e.touches[0].clientY;\n } else {\n try { mX = e.clientX; mY = e.clientY; }\n catch(e$1) { return false }\n }\n if (mX >= Math.floor(cm.display.gutters.getBoundingClientRect().right)) { return false }\n if (prevent) { e_preventDefault(e); }\n\n var display = cm.display;\n var lineBox = display.lineDiv.getBoundingClientRect();\n\n if (mY > lineBox.bottom || !hasHandler(cm, type)) { return e_defaultPrevented(e) }\n mY -= lineBox.top - display.viewOffset;\n\n for (var i = 0; i < cm.display.gutterSpecs.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.display.gutterSpecs[i];\n signal(cm, type, cm, line, gutter.className, 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 // 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 if (!captureRightClick) { 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 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 var Init = {toString: function(){return \"CodeMirror.Init\"}};\n\n var defaults = {};\n var optionHandlers = {};\n\n function defineOptions(CodeMirror) {\n var optionHandlers = CodeMirror.optionHandlers;\n\n function option(name, deflt, handle, notOnInit) {\n CodeMirror.defaults[name] = deflt;\n if (handle) { optionHandlers[name] =\n notOnInit ? function (cm, val, old) {if (old != Init) { handle(cm, val, old); }} : handle; }\n }\n\n CodeMirror.defineOption = option;\n\n // Passed to option handlers when there is no old value.\n CodeMirror.Init = Init;\n\n // These two are, on init, called from the constructor because they\n // have to be initialized before the editor can start at all.\n option(\"value\", \"\", function (cm, val) { return cm.setValue(val); }, true);\n option(\"mode\", null, function (cm, val) {\n cm.doc.modeOption = val;\n loadMode(cm);\n }, true);\n\n option(\"indentUnit\", 2, loadMode, true);\n option(\"indentWithTabs\", false);\n option(\"smartIndent\", true);\n option(\"tabSize\", 4, function (cm) {\n resetModeState(cm);\n clearCaches(cm);\n regChange(cm);\n }, true);\n\n option(\"lineSeparator\", null, function (cm, val) {\n cm.doc.lineSep = val;\n if (!val) { return }\n var newBreaks = [], lineNo = cm.doc.first;\n cm.doc.iter(function (line) {\n for (var pos = 0;;) {\n var found = line.text.indexOf(val, pos);\n if (found == -1) { break }\n pos = found + val.length;\n newBreaks.push(Pos(lineNo, found));\n }\n lineNo++;\n });\n for (var i = newBreaks.length - 1; i >= 0; i--)\n { replaceRange(cm.doc, val, newBreaks[i], Pos(newBreaks[i].line, newBreaks[i].ch + val.length)); }\n });\n option(\"specialChars\", /[\\u0000-\\u001f\\u007f-\\u009f\\u00ad\\u061c\\u200b\\u200e\\u200f\\u2028\\u2029\\u202d\\u202e\\u2066\\u2067\\u2069\\ufeff\\ufff9-\\ufffc]/g, function (cm, val, old) {\n cm.state.specialChars = new RegExp(val.source + (val.test(\"\\t\") ? \"\" : \"|\\t\"), \"g\");\n if (old != Init) { cm.refresh(); }\n });\n option(\"specialCharPlaceholder\", defaultSpecialCharPlaceholder, function (cm) { return cm.refresh(); }, true);\n option(\"electricChars\", true);\n option(\"inputStyle\", mobile ? \"contenteditable\" : \"textarea\", function () {\n throw new Error(\"inputStyle can not (yet) be changed in a running editor\") // FIXME\n }, true);\n option(\"spellcheck\", false, function (cm, val) { return cm.getInputField().spellcheck = val; }, true);\n option(\"autocorrect\", false, function (cm, val) { return cm.getInputField().autocorrect = val; }, true);\n option(\"autocapitalize\", false, function (cm, val) { return cm.getInputField().autocapitalize = val; }, true);\n option(\"rtlMoveVisually\", !windows);\n option(\"wholeLineUpdateBefore\", true);\n\n option(\"theme\", \"default\", function (cm) {\n themeChanged(cm);\n updateGutters(cm);\n }, true);\n option(\"keyMap\", \"default\", function (cm, val, old) {\n var next = getKeyMap(val);\n var prev = old != Init && getKeyMap(old);\n if (prev && prev.detach) { prev.detach(cm, next); }\n if (next.attach) { next.attach(cm, prev || null); }\n });\n option(\"extraKeys\", null);\n option(\"configureMouse\", null);\n\n option(\"lineWrapping\", false, wrappingChanged, true);\n option(\"gutters\", [], function (cm, val) {\n cm.display.gutterSpecs = getGutters(val, cm.options.lineNumbers);\n updateGutters(cm);\n }, true);\n option(\"fixedGutter\", true, function (cm, val) {\n cm.display.gutters.style.left = val ? compensateForHScroll(cm.display) + \"px\" : \"0\";\n cm.refresh();\n }, true);\n option(\"coverGutterNextToScrollbar\", false, function (cm) { return updateScrollbars(cm); }, true);\n option(\"scrollbarStyle\", \"native\", function (cm) {\n initScrollbars(cm);\n updateScrollbars(cm);\n cm.display.scrollbars.setScrollTop(cm.doc.scrollTop);\n cm.display.scrollbars.setScrollLeft(cm.doc.scrollLeft);\n }, true);\n option(\"lineNumbers\", false, function (cm, val) {\n cm.display.gutterSpecs = getGutters(cm.options.gutters, val);\n updateGutters(cm);\n }, true);\n option(\"firstLineNumber\", 1, updateGutters, true);\n option(\"lineNumberFormatter\", function (integer) { return integer; }, updateGutters, true);\n option(\"showCursorWhenSelecting\", false, updateSelection, true);\n\n option(\"resetSelectionOnContextMenu\", true);\n option(\"lineWiseCopyCut\", true);\n option(\"pasteLinesPerSelection\", true);\n option(\"selectionsMayTouch\", false);\n\n option(\"readOnly\", false, function (cm, val) {\n if (val == \"nocursor\") {\n onBlur(cm);\n cm.display.input.blur();\n }\n cm.display.input.readOnlyChanged(val);\n });\n\n option(\"screenReaderLabel\", null, function (cm, val) {\n val = (val === '') ? null : val;\n cm.display.input.screenReaderLabelChanged(val);\n });\n\n option(\"disableInput\", false, function (cm, val) {if (!val) { cm.display.input.reset(); }}, true);\n option(\"dragDrop\", true, dragDropChanged);\n option(\"allowDropFileTypes\", null);\n\n option(\"cursorBlinkRate\", 530);\n option(\"cursorScrollMargin\", 0);\n option(\"cursorHeight\", 1, updateSelection, true);\n option(\"singleCursorHeightPerLine\", true, updateSelection, true);\n option(\"workTime\", 100);\n option(\"workDelay\", 100);\n option(\"flattenSpans\", true, resetModeState, true);\n option(\"addModeClass\", false, resetModeState, true);\n option(\"pollInterval\", 100);\n option(\"undoDepth\", 200, function (cm, val) { return cm.doc.history.undoDepth = val; });\n option(\"historyEventDelay\", 1250);\n option(\"viewportMargin\", 10, function (cm) { return cm.refresh(); }, true);\n option(\"maxHighlightLength\", 10000, resetModeState, true);\n option(\"moveInputWithCursor\", true, function (cm, val) {\n if (!val) { cm.display.input.resetPosition(); }\n });\n\n option(\"tabindex\", null, function (cm, val) { return cm.display.input.getField().tabIndex = val || \"\"; });\n option(\"autofocus\", null);\n option(\"direction\", \"ltr\", function (cm, val) { return cm.doc.setDirection(val); }, true);\n option(\"phrases\", null);\n }\n\n function dragDropChanged(cm, value, old) {\n var wasOn = old && old != Init;\n if (!value != !wasOn) {\n var funcs = cm.display.dragFunctions;\n var toggle = value ? on : off;\n toggle(cm.display.scroller, \"dragstart\", funcs.start);\n toggle(cm.display.scroller, \"dragenter\", funcs.enter);\n toggle(cm.display.scroller, \"dragover\", funcs.over);\n toggle(cm.display.scroller, \"dragleave\", funcs.leave);\n toggle(cm.display.scroller, \"drop\", funcs.drop);\n }\n }\n\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 () { return updateScrollbars(cm); }, 100);\n }\n\n // A CodeMirror instance represents an editor. This is the object\n // that user code is usually dealing with.\n\n function CodeMirror(place, options) {\n var this$1 = this;\n\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\n var doc = options.value;\n if (typeof doc == \"string\") { doc = new Doc(doc, options.mode, null, options.lineSeparator, options.direction); }\n else if (options.mode) { doc.modeOption = options.mode; }\n this.doc = doc;\n\n var input = new CodeMirror.inputStyles[options.inputStyle](this);\n var display = this.display = new Display(place, doc, input, options);\n display.wrapper.CodeMirror = this;\n themeChanged(this);\n if (options.lineWrapping)\n { this.display.wrapper.className += \" CodeMirror-wrap\"; }\n initScrollbars(this);\n\n this.state = {\n keyMaps: [], // stores maps added by addKeyMap\n overlays: [], // highlighting overlays, as added by addOverlay\n modeGen: 0, // bumped when mode/overlay changes, used to invalidate highlighting info\n overwrite: false,\n delayingBlurEvent: false,\n focused: false,\n suppressEdits: false, // used to disable editing during key handlers when in readOnly mode\n pasteIncoming: -1, cutIncoming: -1, // help recognize paste/cut edits in input.poll\n selectingText: false,\n draggingText: false,\n highlight: new Delayed(), // stores highlight worker timeout\n keySeq: null, // Unfinished key sequence\n specialChars: null\n };\n\n if (options.autofocus && !mobile) { display.input.focus(); }\n\n // Override magic textarea content restore that IE sometimes does\n // on our hidden textarea on reload\n if (ie && ie_version < 11) { setTimeout(function () { return this$1.display.input.reset(true); }, 20); }\n\n registerEventHandlers(this);\n ensureGlobalHandlers();\n\n startOperation(this);\n this.curOp.forceUpdate = true;\n attachDoc(this, doc);\n\n if ((options.autofocus && !mobile) || this.hasFocus())\n { setTimeout(function () {\n if (this$1.hasFocus() && !this$1.state.focused) { onFocus(this$1); }\n }, 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 // The default configuration options.\n CodeMirror.defaults = defaults;\n // Functions to run when options are changed.\n CodeMirror.optionHandlers = optionHandlers;\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) { return signalDOMEvent(cm, e) || e_preventDefault(e); }); }\n // Some browsers fire contextmenu *after* opening the menu, at\n // which point we can't mess with it anymore. Context menu is\n // handled in onMouseDown for these browsers.\n on(d.scroller, \"contextmenu\", function (e) { return onContextMenu(cm, e); });\n on(d.input.getField(), \"contextmenu\", function (e) {\n if (!d.scroller.contains(e.target)) { onContextMenu(cm, e); }\n });\n\n // Used to suppress mouse event handling when a touch happens\n var touchFinished, prevTouch = {end: 0};\n function finishTouch() {\n if (d.activeTouch) {\n touchFinished = setTimeout(function () { return d.activeTouch = null; }, 1000);\n prevTouch = d.activeTouch;\n prevTouch.end = +new Date;\n }\n }\n function isMouseLikeTouchEvent(e) {\n if (e.touches.length != 1) { return false }\n var touch = e.touches[0];\n return touch.radiusX <= 1 && touch.radiusY <= 1\n }\n function farAway(touch, other) {\n if (other.left == null) { return true }\n var dx = other.left - touch.left, dy = other.top - touch.top;\n return dx * dx + dy * dy > 20 * 20\n }\n on(d.scroller, \"touchstart\", function (e) {\n if (!signalDOMEvent(cm, e) && !isMouseLikeTouchEvent(e) && !clickInGutter(cm, e)) {\n d.input.ensurePolled();\n clearTimeout(touchFinished);\n var now = +new Date;\n d.activeTouch = {start: now, moved: false,\n prev: now - prevTouch.end <= 300 ? prevTouch : null};\n if (e.touches.length == 1) {\n d.activeTouch.left = e.touches[0].pageX;\n d.activeTouch.top = e.touches[0].pageY;\n }\n }\n });\n on(d.scroller, \"touchmove\", function () {\n if (d.activeTouch) { d.activeTouch.moved = true; }\n });\n on(d.scroller, \"touchend\", function (e) {\n var touch = d.activeTouch;\n if (touch && !eventInWidget(d, e) && touch.left != null &&\n !touch.moved && new Date - touch.start < 300) {\n var pos = cm.coordsChar(d.activeTouch, \"page\"), range;\n if (!touch.prev || farAway(touch, touch.prev)) // Single tap\n { range = new Range(pos, pos); }\n else if (!touch.prev.prev || farAway(touch, touch.prev.prev)) // Double tap\n { range = cm.findWordAt(pos); }\n else // Triple tap\n { range = new Range(Pos(pos.line, 0), clipPos(cm.doc, Pos(pos.line + 1, 0))); }\n cm.setSelection(range.anchor, range.head);\n cm.focus();\n e_preventDefault(e);\n }\n finishTouch();\n });\n on(d.scroller, \"touchcancel\", finishTouch);\n\n // Sync scrolling between fake scrollbars and real scrollable\n // area, ensure viewport is updated when scrolling.\n on(d.scroller, \"scroll\", function () {\n if (d.scroller.clientHeight) {\n updateScrollTop(cm, d.scroller.scrollTop);\n setScrollLeft(cm, d.scroller.scrollLeft, true);\n signal(cm, \"scroll\", cm);\n }\n });\n\n // Listen to wheel events in order to try and update the viewport on time.\n on(d.scroller, \"mousewheel\", function (e) { return onScrollWheel(cm, e); });\n on(d.scroller, \"DOMMouseScroll\", function (e) { return onScrollWheel(cm, e); });\n\n // Prevent wrapper from ever scrolling\n on(d.wrapper, \"scroll\", function () { return d.wrapper.scrollTop = d.wrapper.scrollLeft = 0; });\n\n d.dragFunctions = {\n enter: function (e) {if (!signalDOMEvent(cm, e)) { e_stop(e); }},\n over: function (e) {if (!signalDOMEvent(cm, e)) { onDragOver(cm, e); e_stop(e); }},\n start: function (e) { return onDragStart(cm, e); },\n drop: operation(cm, onDrop),\n leave: function (e) {if (!signalDOMEvent(cm, e)) { clearDragCursor(cm); }}\n };\n\n var inp = d.input.getField();\n on(inp, \"keyup\", function (e) { return onKeyUp.call(cm, e); });\n on(inp, \"keydown\", operation(cm, onKeyDown));\n on(inp, \"keypress\", operation(cm, onKeyPress));\n on(inp, \"focus\", function (e) { return onFocus(cm, e); });\n on(inp, \"blur\", function (e) { return onBlur(cm, e); });\n }\n\n var initHooks = [];\n CodeMirror.defineInitHook = function (f) { return initHooks.push(f); };\n\n // Indent the given line. The how parameter can be \"smart\",\n // \"add\"/null, \"subtract\", or \"prev\". When aggressive is false\n // (typically set to true for forced single-line indents), empty\n // lines are not indented, and places where the mode returns Pass\n // are left alone.\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 = getContextBefore(cm, n).state; }\n }\n\n var tabSize = cm.options.tabSize;\n var line = getLine(doc, n), curSpace = countColumn(line.text, null, tabSize);\n if (line.stateAfter) { line.stateAfter = null; }\n var curSpaceString = line.text.match(/^\\s*/)[0], indentation;\n if (!aggressive && !/\\S/.test(line.text)) {\n indentation = 0;\n how = \"not\";\n } else if (how == \"smart\") {\n indentation = doc.mode.indent(state, line.text.slice(curSpaceString.length), line.text);\n if (indentation == Pass || indentation > 150) {\n if (!aggressive) { return }\n how = \"prev\";\n }\n }\n if (how == \"prev\") {\n if (n > doc.first) { indentation = countColumn(getLine(doc, n-1).text, null, tabSize); }\n else { indentation = 0; }\n } else if (how == \"add\") {\n indentation = curSpace + cm.options.indentUnit;\n } else if (how == \"subtract\") {\n indentation = curSpace - cm.options.indentUnit;\n } else if (typeof how == \"number\") {\n indentation = curSpace + how;\n }\n indentation = Math.max(0, indentation);\n\n var indentString = \"\", pos = 0;\n if (cm.options.indentWithTabs)\n { for (var i = Math.floor(indentation / tabSize); i; --i) {pos += tabSize; indentString += \"\\t\";} }\n if (pos < indentation) { indentString += spaceStr(indentation - pos); }\n\n if (indentString != curSpaceString) {\n replaceRange(doc, indentString, Pos(n, 0), Pos(n, curSpaceString.length), \"+input\");\n line.stateAfter = null;\n return true\n } else {\n // Ensure that, if the cursor was in the whitespace at the start\n // of the line, it is moved to the end of that space.\n for (var i$1 = 0; i$1 < doc.sel.ranges.length; i$1++) {\n var range = doc.sel.ranges[i$1];\n if (range.head.line == n && range.head.ch < curSpaceString.length) {\n var pos$1 = Pos(n, curSpaceString.length);\n replaceOneSelection(doc, i$1, new Range(pos$1, pos$1));\n break\n }\n }\n }\n }\n\n // This will be set to a {lineWise: bool, text: [string]} object, so\n // that, when pasting, we know what kind of selections the copied\n // text was made out of.\n var lastCopied = null;\n\n function setLastCopied(newLastCopied) {\n lastCopied = newLastCopied;\n }\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 recent = +new Date - 200;\n var paste = origin == \"paste\" || cm.state.pasteIncoming > recent;\n var textLines = splitLinesAuto(inserted), multiPaste = null;\n // When pasting N lines into N selections, insert one line per selection\n if (paste && sel.ranges.length > 1) {\n if (lastCopied && lastCopied.text.join(\"\\n\") == inserted) {\n if (sel.ranges.length % lastCopied.text.length == 0) {\n multiPaste = [];\n for (var i = 0; i < lastCopied.text.length; i++)\n { multiPaste.push(doc.splitLines(lastCopied.text[i])); }\n }\n } else if (textLines.length == sel.ranges.length && cm.options.pasteLinesPerSelection) {\n multiPaste = map(textLines, function (l) { return [l]; });\n }\n }\n\n var updateInput = cm.curOp.updateInput;\n // Normal behavior is to insert the new text into every selection\n for (var i$1 = sel.ranges.length - 1; i$1 >= 0; i$1--) {\n var range = sel.ranges[i$1];\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 (paste && lastCopied && lastCopied.lineWise && lastCopied.text.join(\"\\n\") == textLines.join(\"\\n\"))\n { from = to = Pos(from.line, 0); }\n }\n var changeEvent = {from: from, to: to, text: multiPaste ? multiPaste[i$1 % multiPaste.length] : textLines,\n origin: origin || (paste ? \"paste\" : cm.state.cutIncoming > recent ? \"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 if (cm.curOp.updateInput < 2) { cm.curOp.updateInput = updateInput; }\n cm.curOp.typing = true;\n cm.state.pasteIncoming = cm.state.cutIncoming = -1;\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 && cm.hasFocus())\n { runInOp(cm, function () { return 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, autocorrect, autocapitalize) {\n field.setAttribute(\"autocorrect\", autocorrect ? \"on\" : \"off\");\n field.setAttribute(\"autocapitalize\", autocapitalize ? \"on\" : \"off\");\n field.setAttribute(\"spellcheck\", !!spellcheck);\n }\n\n function hiddenTextarea() {\n var te = elt(\"textarea\", null, null, \"position: absolute; bottom: -1em; padding: 0; width: 1px; height: 1em; min-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 return div\n }\n\n // The publicly visible API. Note that methodOp(f) means\n // 'wrap f in an operation, performed on its `this` parameter'.\n\n // This is not the complete set of editor methods. Most of the\n // methods defined on the Doc type are also injected into\n // CodeMirror.prototype, for backwards compatibility and\n // convenience.\n\n function addEditorMethods(CodeMirror) {\n var optionHandlers = CodeMirror.optionHandlers;\n\n var helpers = CodeMirror.helpers = {};\n\n CodeMirror.prototype = {\n constructor: CodeMirror,\n focus: function(){win(this).focus(); this.display.input.focus();},\n\n setOption: function(option, value) {\n var options = this.options, old = options[option];\n if (options[option] == value && option != \"mode\") { return }\n options[option] = value;\n if (optionHandlers.hasOwnProperty(option))\n { operation(this, optionHandlers[option])(this, value, old); }\n signal(this, \"optionChange\", this, option);\n },\n\n getOption: function(option) {return this.options[option]},\n getDoc: function() {return this.doc},\n\n addKeyMap: function(map, 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(\"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$1 = 0; i$1 < help._global.length; i$1++) {\n var cur = help._global[i$1];\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 getContextBefore(this, line + 1, precise).state\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, includeWidgets) {\n var end = false, lineObj;\n if (typeof line == \"number\") {\n var last = this.doc.first + this.doc.size - 1;\n if (line < this.doc.first) { line = this.doc.first; }\n else if (line > last) { line = last; end = true; }\n lineObj = getLine(this.doc, line);\n } else {\n lineObj = line;\n }\n return intoCoordSystem(this, lineObj, {top: 0, left: 0}, mode || \"page\", includeWidgets || end).top +\n (end ? this.doc.height - heightAtLine(lineObj) : 0)\n },\n\n defaultTextHeight: function() { return textHeight(this.display) },\n defaultCharWidth: function() { return charWidth(this.display) },\n\n getViewport: function() { return {from: this.display.viewFrom, to: this.display.viewTo}},\n\n addWidget: function(pos, node, scroll, vert, horiz) {\n var display = this.display;\n pos = cursorCoords(this, clipPos(this.doc, pos));\n var top = pos.bottom, left = pos.left;\n node.style.position = \"absolute\";\n node.setAttribute(\"cm-ignore-events\", \"true\");\n this.display.input.setUneditable(node);\n display.sizer.appendChild(node);\n if (vert == \"over\") {\n top = pos.top;\n } else if (vert == \"above\" || vert == \"near\") {\n var vspace = Math.max(display.wrapper.clientHeight, this.doc.height),\n hspace = Math.max(display.sizer.clientWidth, display.lineSpace.clientWidth);\n // Default to positioning above (if specified and possible); otherwise default to positioning below\n if ((vert == 'above' || pos.bottom + node.offsetHeight > vspace) && pos.top > node.offsetHeight)\n { top = pos.top - node.offsetHeight; }\n else if (pos.bottom + node.offsetHeight <= vspace)\n { top = pos.bottom; }\n if (left + node.offsetWidth > hspace)\n { left = hspace - node.offsetWidth; }\n }\n node.style.top = top + \"px\";\n node.style.left = node.style.right = \"\";\n if (horiz == \"right\") {\n left = display.sizer.clientWidth - node.offsetWidth;\n node.style.right = \"0px\";\n } else {\n if (horiz == \"left\") { left = 0; }\n else if (horiz == \"middle\") { left = (display.sizer.clientWidth - node.offsetWidth) / 2; }\n node.style.left = left + \"px\";\n }\n if (scroll)\n { scrollIntoView(this, {left: left, top: top, right: left + node.offsetWidth, bottom: top + node.offsetHeight}); }\n },\n\n triggerOnKeyDown: methodOp(onKeyDown),\n triggerOnKeyPress: methodOp(onKeyPress),\n triggerOnKeyUp: onKeyUp,\n triggerOnMouseDown: methodOp(onMouseDown),\n\n execCommand: function(cmd) {\n if (commands.hasOwnProperty(cmd))\n { return commands[cmd].call(null, this) }\n },\n\n triggerElectric: methodOp(function(text) { triggerElectric(this, text); }),\n\n findPosH: function(from, amount, unit, visually) {\n var dir = 1;\n if (amount < 0) { dir = -1; amount = -amount; }\n var cur = clipPos(this.doc, from);\n for (var i = 0; i < amount; ++i) {\n cur = findPosH(this.doc, cur, dir, unit, visually);\n if (cur.hitSide) { break }\n }\n return cur\n },\n\n moveH: methodOp(function(dir, unit) {\n var this$1 = this;\n\n this.extendSelectionsBy(function (range) {\n if (this$1.display.shift || this$1.doc.extend || range.empty())\n { return findPosH(this$1.doc, range.head, dir, unit, this$1.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 var cur = clipPos(this.doc, from);\n for (var i = 0; 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 this$1 = this;\n\n var doc = this.doc, goals = [];\n var collapse = !this.display.shift && !doc.extend && doc.sel.somethingSelected();\n doc.extendSelectionsBy(function (range) {\n if (collapse)\n { return dir < 0 ? range.from() : range.to() }\n var headPos = cursorCoords(this$1, range.head, \"div\");\n if (range.goalColumn != null) { headPos.left = range.goalColumn; }\n goals.push(headPos.left);\n var pos = findPosV(this$1, headPos, dir, unit);\n if (unit == \"page\" && range == doc.sel.primary())\n { addToScrollTop(this$1, charCoords(this$1, pos, \"div\").top - headPos.top); }\n return pos\n }, sel_move);\n if (goals.length) { for (var i = 0; i < doc.sel.ranges.length; i++)\n { doc.sel.ranges[i].goalColumn = goals[i]; } }\n }),\n\n // Find the word at the given position (as returned by coordsChar).\n findWordAt: function(pos) {\n var doc = this.doc, line = getLine(doc, pos.line).text;\n var start = pos.ch, end = pos.ch;\n if (line) {\n var helper = this.getHelper(pos, \"wordChars\");\n if ((pos.sticky == \"before\" || end == line.length) && start) { --start; } else { ++end; }\n var startChar = line.charAt(start);\n var check = isWordChar(startChar, helper)\n ? function (ch) { return isWordChar(ch, helper); }\n : /\\s/.test(startChar) ? function (ch) { return /\\s/.test(ch); }\n : function (ch) { return (!/\\s/.test(ch) && !isWordChar(ch)); };\n while (start > 0 && check(line.charAt(start - 1))) { --start; }\n while (end < line.length && check(line.charAt(end))) { ++end; }\n }\n return new Range(Pos(pos.line, start), Pos(pos.line, end))\n },\n\n toggleOverwrite: function(value) {\n if (value != null && value == this.state.overwrite) { return }\n if (this.state.overwrite = !this.state.overwrite)\n { addClass(this.display.cursorDiv, \"CodeMirror-overwrite\"); }\n else\n { rmClass(this.display.cursorDiv, \"CodeMirror-overwrite\"); }\n\n signal(this, \"overwriteToggle\", this, this.state.overwrite);\n },\n hasFocus: function() { return this.display.input.getField() == activeElt(root(this)) },\n isReadOnly: function() { return !!(this.options.readOnly || this.doc.cantEdit) },\n\n scrollTo: methodOp(function (x, y) { scrollToCoords(this, x, y); }),\n getScrollInfo: function() {\n var scroller = this.display.scroller;\n return {left: scroller.scrollLeft, top: scroller.scrollTop,\n height: scroller.scrollHeight - scrollGap(this) - this.display.barHeight,\n width: scroller.scrollWidth - scrollGap(this) - this.display.barWidth,\n clientHeight: displayHeight(this), clientWidth: displayWidth(this)}\n },\n\n scrollIntoView: methodOp(function(range, 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 scrollToRange(this, range);\n } else {\n scrollToCoordsRange(this, range.from, range.to, range.margin);\n }\n }),\n\n setSize: methodOp(function(width, height) {\n var this$1 = this;\n\n var interpret = function (val) { return typeof val == \"number\" || /^\\d+$/.test(String(val)) ? val + \"px\" : val; };\n if (width != null) { this.display.wrapper.style.width = interpret(width); }\n if (height != null) { this.display.wrapper.style.height = interpret(height); }\n if (this.options.lineWrapping) { clearLineMeasurementCache(this); }\n var lineNo = this.display.viewFrom;\n this.doc.iter(lineNo, this.display.viewTo, function (line) {\n if (line.widgets) { for (var i = 0; i < line.widgets.length; i++)\n { if (line.widgets[i].noHScroll) { regLineChange(this$1, lineNo, \"widget\"); break } } }\n ++lineNo;\n });\n this.curOp.forceUpdate = true;\n signal(this, \"refresh\", this);\n }),\n\n operation: function(f){return runInOp(this, f)},\n startOperation: function(){return startOperation(this)},\n endOperation: function(){return endOperation(this)},\n\n refresh: methodOp(function() {\n var oldHeight = this.display.cachedTextHeight;\n regChange(this);\n this.curOp.forceUpdate = true;\n clearCaches(this);\n scrollToCoords(this, this.doc.scrollLeft, this.doc.scrollTop);\n updateGutterSpace(this.display);\n if (oldHeight == null || Math.abs(oldHeight - textHeight(this.display)) > .5 || this.options.lineWrapping)\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 // Cancel the current text selection if any (#5821)\n if (this.state.selectingText) { this.state.selectingText(); }\n attachDoc(this, doc);\n clearCaches(this);\n this.display.input.reset();\n scrollToCoords(this, doc.scrollLeft, doc.scrollTop);\n this.curOp.forceScroll = true;\n signalLater(this, \"swapDoc\", this, old);\n return old\n }),\n\n phrase: function(phraseText) {\n var phrases = this.options.phrases;\n return phrases && Object.prototype.hasOwnProperty.call(phrases, phraseText) ? phrases[phraseText] : phraseText\n },\n\n getInputField: function(){return this.display.input.getField()},\n getWrapperElement: function(){return this.display.wrapper},\n getScrollerElement: function(){return this.display.scroller},\n getGutterElement: function(){return this.display.gutters}\n };\n eventMixin(CodeMirror);\n\n CodeMirror.registerHelper = function(type, name, value) {\n if (!helpers.hasOwnProperty(type)) { helpers[type] = CodeMirror[type] = {_global: []}; }\n helpers[type][name] = value;\n };\n CodeMirror.registerGlobalHelper = function(type, name, predicate, value) {\n CodeMirror.registerHelper(type, name, value);\n helpers[type]._global.push({pred: predicate, val: value});\n };\n }\n\n // Used for horizontal relative motion. Dir is -1 or 1 (left or\n // right), unit can be \"codepoint\", \"char\", \"column\" (like char, but\n // doesn't cross line boundaries), \"word\" (across next word), or\n // \"group\" (to the start of next group of word or\n // non-word-non-whitespace chars). The visually param controls\n // whether, in right-to-left text, direction 1 means to move towards\n // the next index in the string, or towards the character to the right\n // of the current position. The resulting position will have a\n // hitSide=true property if it reached the end of the document.\n function findPosH(doc, pos, dir, unit, visually) {\n var oldPos = pos;\n var origDir = dir;\n var lineObj = getLine(doc, pos.line);\n var lineDir = visually && doc.direction == \"rtl\" ? -dir : dir;\n function findNextLine() {\n var l = pos.line + lineDir;\n if (l < doc.first || l >= doc.first + doc.size) { return false }\n pos = new Pos(l, pos.ch, pos.sticky);\n return lineObj = getLine(doc, l)\n }\n function moveOnce(boundToLine) {\n var next;\n if (unit == \"codepoint\") {\n var ch = lineObj.text.charCodeAt(pos.ch + (dir > 0 ? 0 : -1));\n if (isNaN(ch)) {\n next = null;\n } else {\n var astral = dir > 0 ? ch >= 0xD800 && ch < 0xDC00 : ch >= 0xDC00 && ch < 0xDFFF;\n next = new Pos(pos.line, Math.max(0, Math.min(lineObj.text.length, pos.ch + dir * (astral ? 2 : 1))), -dir);\n }\n } else if (visually) {\n next = moveVisually(doc.cm, lineObj, pos, dir);\n } else {\n next = moveLogically(lineObj, pos, dir);\n }\n if (next == null) {\n if (!boundToLine && findNextLine())\n { pos = endOfLine(visually, doc.cm, lineObj, pos.line, lineDir); }\n else\n { return false }\n } else {\n pos = next;\n }\n return true\n }\n\n if (unit == \"char\" || unit == \"codepoint\") {\n moveOnce();\n } else if (unit == \"column\") {\n moveOnce(true);\n } else if (unit == \"word\" || unit == \"group\") {\n var sawType = null, group = unit == \"group\";\n var helper = doc.cm && doc.cm.getHelper(pos, \"wordChars\");\n for (var first = true;; first = false) {\n if (dir < 0 && !moveOnce(!first)) { break }\n var cur = lineObj.text.charAt(pos.ch) || \"\\n\";\n var type = isWordChar(cur, helper) ? \"w\"\n : group && cur == \"\\n\" ? \"n\"\n : !group || /\\s/.test(cur) ? null\n : \"p\";\n if (group && !first && !type) { type = \"s\"; }\n if (sawType && sawType != type) {\n if (dir < 0) {dir = 1; moveOnce(); pos.sticky = \"after\";}\n break\n }\n\n if (type) { sawType = type; }\n if (dir > 0 && !moveOnce(!first)) { break }\n }\n }\n var result = skipAtomic(doc, pos, oldPos, origDir, true);\n if (equalCursorPos(oldPos, result)) { result.hitSide = true; }\n return result\n }\n\n // For relative vertical movement. Dir may be -1 or 1. Unit can be\n // \"page\" or \"line\". The resulting position will have a hitSide=true\n // property if it reached the end of the document.\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, win(cm).innerHeight || doc(cm).documentElement.clientHeight);\n var moveAmount = Math.max(pageSize - .5 * textHeight(cm.display), 3);\n y = (dir > 0 ? pos.bottom : pos.top) + dir * moveAmount;\n\n } else if (unit == \"line\") {\n y = dir > 0 ? pos.bottom + 3 : pos.top - 3;\n }\n var target;\n for (;;) {\n target = coordsChar(cm, x, y);\n if (!target.outside) { break }\n if (dir < 0 ? y <= 0 : y >= doc.height) { target.hitSide = true; break }\n y += dir * 5;\n }\n return target\n }\n\n // CONTENTEDITABLE INPUT STYLE\n\n var ContentEditableInput = function(cm) {\n this.cm = cm;\n this.lastAnchorNode = this.lastAnchorOffset = this.lastFocusNode = this.lastFocusOffset = null;\n this.polling = new Delayed();\n this.composing = null;\n this.gracePeriod = false;\n this.readDOMTimeout = null;\n };\n\n ContentEditableInput.prototype.init = function (display) {\n var this$1 = this;\n\n var input = this, cm = input.cm;\n var div = input.div = display.lineDiv;\n div.contentEditable = true;\n disableBrowserMagic(div, cm.options.spellcheck, cm.options.autocorrect, cm.options.autocapitalize);\n\n function belongsToInput(e) {\n for (var t = e.target; t; t = t.parentNode) {\n if (t == div) { return true }\n if (/\\bCodeMirror-(?:line)?widget\\b/.test(t.className)) { break }\n }\n return false\n }\n\n on(div, \"paste\", function (e) {\n if (!belongsToInput(e) || signalDOMEvent(cm, e) || handlePaste(e, cm)) { return }\n // IE doesn't fire input events, so we schedule a read for the pasted content in this way\n if (ie_version <= 11) { setTimeout(operation(cm, function () { return this$1.updateFromDOM(); }), 20); }\n });\n\n on(div, \"compositionstart\", function (e) {\n this$1.composing = {data: e.data, done: false};\n });\n on(div, \"compositionupdate\", function (e) {\n if (!this$1.composing) { this$1.composing = {data: e.data, done: false}; }\n });\n on(div, \"compositionend\", function (e) {\n if (this$1.composing) {\n if (e.data != this$1.composing.data) { this$1.readFromDOMSoon(); }\n this$1.composing.done = true;\n }\n });\n\n on(div, \"touchstart\", function () { return input.forceCompositionEnd(); });\n\n on(div, \"input\", function () {\n if (!this$1.composing) { this$1.readFromDOMSoon(); }\n });\n\n function onCopyCut(e) {\n if (!belongsToInput(e) || signalDOMEvent(cm, e)) { return }\n if (cm.somethingSelected()) {\n setLastCopied({lineWise: false, text: cm.getSelections()});\n if (e.type == \"cut\") { cm.replaceSelection(\"\", null, \"cut\"); }\n } else if (!cm.options.lineWiseCopyCut) {\n return\n } else {\n var ranges = copyableRanges(cm);\n setLastCopied({lineWise: true, text: ranges.text});\n if (e.type == \"cut\") {\n cm.operation(function () {\n cm.setSelections(ranges.ranges, 0, sel_dontScroll);\n cm.replaceSelection(\"\", null, \"cut\");\n });\n }\n }\n if (e.clipboardData) {\n e.clipboardData.clearData();\n var content = lastCopied.text.join(\"\\n\");\n // iOS exposes the clipboard API, but seems to discard content inserted into it\n e.clipboardData.setData(\"Text\", content);\n if (e.clipboardData.getData(\"Text\") == content) {\n e.preventDefault();\n return\n }\n }\n // Old-fashioned briefly-focus-a-textarea hack\n var kludge = hiddenTextarea(), te = kludge.firstChild;\n disableBrowserMagic(te);\n cm.display.lineSpace.insertBefore(kludge, cm.display.lineSpace.firstChild);\n te.value = lastCopied.text.join(\"\\n\");\n var hadFocus = activeElt(rootNode(div));\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 ContentEditableInput.prototype.screenReaderLabelChanged = function (label) {\n // Label for screenreaders, accessibility\n if(label) {\n this.div.setAttribute('aria-label', label);\n } else {\n this.div.removeAttribute('aria-label');\n }\n };\n\n ContentEditableInput.prototype.prepareSelection = function () {\n var result = prepareSelection(this.cm, false);\n result.focus = activeElt(rootNode(this.div)) == this.div;\n return result\n };\n\n ContentEditableInput.prototype.showSelection = function (info, takeFocus) {\n if (!info || !this.cm.display.view.length) { return }\n if (info.focus || takeFocus) { this.showPrimarySelection(); }\n this.showMultipleSelections(info);\n };\n\n ContentEditableInput.prototype.getSelection = function () {\n return this.cm.display.wrapper.ownerDocument.getSelection()\n };\n\n ContentEditableInput.prototype.showPrimarySelection = function () {\n var sel = this.getSelection(), cm = this.cm, prim = cm.doc.sel.primary();\n var from = prim.from(), to = prim.to();\n\n if (cm.display.viewTo == cm.display.viewFrom || from.line >= cm.display.viewTo || to.line < cm.display.viewFrom) {\n sel.removeAllRanges();\n return\n }\n\n var curAnchor = domToPos(cm, sel.anchorNode, sel.anchorOffset);\n var curFocus = domToPos(cm, sel.focusNode, sel.focusOffset);\n if (curAnchor && !curAnchor.bad && curFocus && !curFocus.bad &&\n cmp(minPos(curAnchor, curFocus), from) == 0 &&\n cmp(maxPos(curAnchor, curFocus), to) == 0)\n { return }\n\n var view = cm.display.view;\n var start = (from.line >= cm.display.viewFrom && posToDOM(cm, from)) ||\n {node: view[0].measure.map[2], offset: 0};\n var end = to.line < cm.display.viewTo && posToDOM(cm, to);\n if (!end) {\n var measure = view[view.length - 1].measure;\n var map = 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 if (!start || !end) {\n sel.removeAllRanges();\n return\n }\n\n var old = sel.rangeCount && sel.getRangeAt(0), rng;\n try { rng = range(start.node, start.offset, end.offset, end.node); }\n catch(e) {} // Our model of the DOM might be outdated, in which case the range we try to set can be impossible\n if (rng) {\n if (!gecko && cm.state.focused) {\n sel.collapse(start.node, start.offset);\n if (!rng.collapsed) {\n sel.removeAllRanges();\n sel.addRange(rng);\n }\n } else {\n sel.removeAllRanges();\n sel.addRange(rng);\n }\n if (old && sel.anchorNode == null) { sel.addRange(old); }\n else if (gecko) { this.startGracePeriod(); }\n }\n this.rememberSelection();\n };\n\n ContentEditableInput.prototype.startGracePeriod = function () {\n var this$1 = this;\n\n clearTimeout(this.gracePeriod);\n this.gracePeriod = setTimeout(function () {\n this$1.gracePeriod = false;\n if (this$1.selectionChanged())\n { this$1.cm.operation(function () { return this$1.cm.curOp.selectionChanged = true; }); }\n }, 20);\n };\n\n ContentEditableInput.prototype.showMultipleSelections = function (info) {\n removeChildrenAndAdd(this.cm.display.cursorDiv, info.cursors);\n removeChildrenAndAdd(this.cm.display.selectionDiv, info.selection);\n };\n\n ContentEditableInput.prototype.rememberSelection = function () {\n var sel = this.getSelection();\n this.lastAnchorNode = sel.anchorNode; this.lastAnchorOffset = sel.anchorOffset;\n this.lastFocusNode = sel.focusNode; this.lastFocusOffset = sel.focusOffset;\n };\n\n ContentEditableInput.prototype.selectionInEditor = function () {\n var sel = this.getSelection();\n if (!sel.rangeCount) { return false }\n var node = sel.getRangeAt(0).commonAncestorContainer;\n return contains(this.div, node)\n };\n\n ContentEditableInput.prototype.focus = function () {\n if (this.cm.options.readOnly != \"nocursor\") {\n if (!this.selectionInEditor() || activeElt(rootNode(this.div)) != this.div)\n { this.showSelection(this.prepareSelection(), true); }\n this.div.focus();\n }\n };\n ContentEditableInput.prototype.blur = function () { this.div.blur(); };\n ContentEditableInput.prototype.getField = function () { return this.div };\n\n ContentEditableInput.prototype.supportsTouch = function () { return true };\n\n ContentEditableInput.prototype.receivedFocus = function () {\n var this$1 = this;\n\n var input = this;\n if (this.selectionInEditor())\n { setTimeout(function () { return this$1.pollSelection(); }, 20); }\n else\n { runInOp(this.cm, function () { return input.cm.curOp.selectionChanged = true; }); }\n\n function poll() {\n if (input.cm.state.focused) {\n input.pollSelection();\n input.polling.set(input.cm.options.pollInterval, poll);\n }\n }\n this.polling.set(this.cm.options.pollInterval, poll);\n };\n\n ContentEditableInput.prototype.selectionChanged = function () {\n var sel = this.getSelection();\n return sel.anchorNode != this.lastAnchorNode || sel.anchorOffset != this.lastAnchorOffset ||\n sel.focusNode != this.lastFocusNode || sel.focusOffset != this.lastFocusOffset\n };\n\n ContentEditableInput.prototype.pollSelection = function () {\n if (this.readDOMTimeout != null || this.gracePeriod || !this.selectionChanged()) { return }\n var sel = this.getSelection(), cm = this.cm;\n // On Android Chrome (version 56, at least), backspacing into an\n // uneditable block element will put the cursor in that element,\n // and then, because it's not editable, hide the virtual keyboard.\n // Because Android doesn't allow us to actually detect backspace\n // presses in a sane way, this code checks for when that happens\n // and simulates a backspace press in this case.\n if (android && chrome && this.cm.display.gutterSpecs.length && isInGutter(sel.anchorNode)) {\n this.cm.triggerOnKeyDown({type: \"keydown\", keyCode: 8, preventDefault: Math.abs});\n this.blur();\n this.focus();\n return\n }\n if (this.composing) { return }\n this.rememberSelection();\n var anchor = domToPos(cm, sel.anchorNode, sel.anchorOffset);\n var head = domToPos(cm, sel.focusNode, sel.focusOffset);\n if (anchor && head) { runInOp(cm, function () {\n setSelection(cm.doc, simpleSelection(anchor, head), sel_dontScroll);\n if (anchor.bad || head.bad) { cm.curOp.selectionChanged = true; }\n }); }\n };\n\n ContentEditableInput.prototype.pollContent = function () {\n if (this.readDOMTimeout != null) {\n clearTimeout(this.readDOMTimeout);\n this.readDOMTimeout = null;\n }\n\n var cm = this.cm, display = cm.display, sel = cm.doc.sel.primary();\n var from = sel.from(), to = sel.to();\n if (from.ch == 0 && from.line > cm.firstLine())\n { from = Pos(from.line - 1, getLine(cm.doc, from.line - 1).length); }\n if (to.ch == getLine(cm.doc, to.line).text.length && to.line < cm.lastLine())\n { to = Pos(to.line + 1, 0); }\n if (from.line < display.viewFrom || to.line > display.viewTo - 1) { return false }\n\n var fromIndex, fromLine, fromNode;\n if (from.line == display.viewFrom || (fromIndex = findViewIndex(cm, from.line)) == 0) {\n fromLine = lineNo(display.view[0].line);\n fromNode = display.view[0].node;\n } else {\n fromLine = lineNo(display.view[fromIndex].line);\n fromNode = display.view[fromIndex - 1].node.nextSibling;\n }\n var toIndex = findViewIndex(cm, to.line);\n var toLine, toNode;\n if (toIndex == display.view.length - 1) {\n toLine = display.viewTo - 1;\n toNode = display.lineDiv.lastChild;\n } else {\n toLine = lineNo(display.view[toIndex + 1].line) - 1;\n toNode = display.view[toIndex + 1].node.previousSibling;\n }\n\n if (!fromNode) { return false }\n var newText = cm.doc.splitLines(domTextBetween(cm, fromNode, toNode, fromLine, toLine));\n var oldText = getBetween(cm.doc, Pos(fromLine, 0), Pos(toLine, getLine(cm.doc, toLine).text.length));\n while (newText.length > 1 && oldText.length > 1) {\n if (lst(newText) == lst(oldText)) { newText.pop(); oldText.pop(); toLine--; }\n else if (newText[0] == oldText[0]) { newText.shift(); oldText.shift(); fromLine++; }\n else { break }\n }\n\n var cutFront = 0, cutEnd = 0;\n var newTop = newText[0], oldTop = oldText[0], maxCutFront = Math.min(newTop.length, oldTop.length);\n while (cutFront < maxCutFront && newTop.charCodeAt(cutFront) == oldTop.charCodeAt(cutFront))\n { ++cutFront; }\n var newBot = lst(newText), oldBot = lst(oldText);\n var maxCutEnd = Math.min(newBot.length - (newText.length == 1 ? cutFront : 0),\n oldBot.length - (oldText.length == 1 ? cutFront : 0));\n while (cutEnd < maxCutEnd &&\n newBot.charCodeAt(newBot.length - cutEnd - 1) == oldBot.charCodeAt(oldBot.length - cutEnd - 1))\n { ++cutEnd; }\n // Try to move start of change to start of selection if ambiguous\n if (newText.length == 1 && oldText.length == 1 && fromLine == from.line) {\n while (cutFront && cutFront > from.ch &&\n newBot.charCodeAt(newBot.length - cutEnd - 1) == oldBot.charCodeAt(oldBot.length - cutEnd - 1)) {\n cutFront--;\n cutEnd++;\n }\n }\n\n newText[newText.length - 1] = newBot.slice(0, newBot.length - cutEnd).replace(/^\\u200b+/, \"\");\n newText[0] = newText[0].slice(cutFront).replace(/\\u200b+$/, \"\");\n\n var chFrom = Pos(fromLine, cutFront);\n var chTo = Pos(toLine, oldText.length ? lst(oldText).length - cutEnd : 0);\n if (newText.length > 1 || newText[0] || cmp(chFrom, chTo)) {\n replaceRange(cm.doc, newText, chFrom, chTo, \"+input\");\n return true\n }\n };\n\n ContentEditableInput.prototype.ensurePolled = function () {\n this.forceCompositionEnd();\n };\n ContentEditableInput.prototype.reset = function () {\n this.forceCompositionEnd();\n };\n ContentEditableInput.prototype.forceCompositionEnd = function () {\n if (!this.composing) { return }\n clearTimeout(this.readDOMTimeout);\n this.composing = null;\n this.updateFromDOM();\n this.div.blur();\n this.div.focus();\n };\n ContentEditableInput.prototype.readFromDOMSoon = function () {\n var this$1 = this;\n\n if (this.readDOMTimeout != null) { return }\n this.readDOMTimeout = setTimeout(function () {\n this$1.readDOMTimeout = null;\n if (this$1.composing) {\n if (this$1.composing.done) { this$1.composing = null; }\n else { return }\n }\n this$1.updateFromDOM();\n }, 80);\n };\n\n ContentEditableInput.prototype.updateFromDOM = function () {\n var this$1 = this;\n\n if (this.cm.isReadOnly() || !this.pollContent())\n { runInOp(this.cm, function () { return regChange(this$1.cm); }); }\n };\n\n ContentEditableInput.prototype.setUneditable = function (node) {\n node.contentEditable = \"false\";\n };\n\n ContentEditableInput.prototype.onKeyPress = function (e) {\n if (e.charCode == 0 || this.composing) { return }\n e.preventDefault();\n if (!this.cm.isReadOnly())\n { operation(this.cm, applyTextInput)(this.cm, String.fromCharCode(e.charCode == null ? e.keyCode : e.charCode), 0); }\n };\n\n ContentEditableInput.prototype.readOnlyChanged = function (val) {\n this.div.contentEditable = String(val != \"nocursor\");\n };\n\n ContentEditableInput.prototype.onContextMenu = function () {};\n ContentEditableInput.prototype.resetPosition = function () {};\n\n ContentEditableInput.prototype.needsContentAttribute = true;\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, cm.doc.direction), side = \"left\";\n if (order) {\n var partPos = getBidiPartAt(order, pos.ch);\n side = partPos % 2 ? \"right\" : \"left\";\n }\n var result = nodeAndOffsetInLineMap(info.map, pos.ch, side);\n result.offset = result.collapse == \"right\" ? result.end : result.start;\n return result\n }\n\n function isInGutter(node) {\n for (var scan = node; scan; scan = scan.parentNode)\n { if (/CodeMirror-gutter-wrapper/.test(scan.className)) { return true } }\n return false\n }\n\n function badPos(pos, bad) { if (bad) { pos.bad = true; } return pos }\n\n function domTextBetween(cm, from, to, fromLine, toLine) {\n var text = \"\", closing = false, lineSep = cm.doc.lineSeparator(), extraLinebreak = false;\n function recognizeMarker(id) { return function (marker) { return marker.id == id; } }\n function close() {\n if (closing) {\n text += lineSep;\n if (extraLinebreak) { text += lineSep; }\n closing = extraLinebreak = false;\n }\n }\n function addText(str) {\n if (str) {\n close();\n text += str;\n }\n }\n function walk(node) {\n if (node.nodeType == 1) {\n var cmText = node.getAttribute(\"cm-text\");\n if (cmText) {\n addText(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(0)))\n { addText(getBetween(cm.doc, range.from, range.to).join(lineSep)); }\n return\n }\n if (node.getAttribute(\"contenteditable\") == \"false\") { return }\n var isBlock = /^(pre|div|p|li|table|br)$/i.test(node.nodeName);\n if (!/^br$/i.test(node.nodeName) && node.textContent.length == 0) { return }\n\n if (isBlock) { close(); }\n for (var i = 0; i < node.childNodes.length; i++)\n { walk(node.childNodes[i]); }\n\n if (/^(pre|p)$/i.test(node.nodeName)) { extraLinebreak = true; }\n if (isBlock) { closing = true; }\n } else if (node.nodeType == 3) {\n addText(node.nodeValue.replace(/\\u200b/g, \"\").replace(/\\u00a0/g, \" \"));\n }\n }\n for (;;) {\n walk(from);\n if (from == to) { break }\n from = from.nextSibling;\n extraLinebreak = false;\n }\n return text\n }\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$1 = offset; before; before = before.previousSibling) {\n found = find(before, before.firstChild, -1);\n if (found)\n { return badPos(Pos(found.line, found.ch + dist$1), bad) }\n else\n { dist$1 += before.textContent.length; }\n }\n }\n\n // TEXTAREA INPUT STYLE\n\n var TextareaInput = function(cm) {\n this.cm = cm;\n // See input.poll and input.reset\n this.prevInput = \"\";\n\n // Flag that indicates whether we expect input to appear real soon\n // now (after some event like 'keypress' or 'input') and are\n // polling intensively.\n this.pollingFast = false;\n // Self-resetting timeout for the poller\n this.polling = new Delayed();\n // Used to work around IE issue with selection being forgotten when focus moves away from textarea\n this.hasSelection = false;\n this.composing = null;\n this.resetting = false;\n };\n\n TextareaInput.prototype.init = function (display) {\n var this$1 = this;\n\n var input = this, cm = this.cm;\n this.createField(display);\n var te = this.textarea;\n\n display.wrapper.insertBefore(this.wrapper, display.wrapper.firstChild);\n\n // Needed to hide big blue blinking cursor on Mobile Safari (doesn't seem to work in iOS 8 anymore)\n if (ios) { te.style.width = \"0px\"; }\n\n on(te, \"input\", function () {\n if (ie && ie_version >= 9 && this$1.hasSelection) { this$1.hasSelection = null; }\n input.poll();\n });\n\n on(te, \"paste\", function (e) {\n if (signalDOMEvent(cm, e) || handlePaste(e, cm)) { return }\n\n cm.state.pasteIncoming = +new Date;\n input.fastPoll();\n });\n\n function prepareCopyCut(e) {\n if (signalDOMEvent(cm, e)) { return }\n if (cm.somethingSelected()) {\n setLastCopied({lineWise: false, text: cm.getSelections()});\n } else if (!cm.options.lineWiseCopyCut) {\n return\n } else {\n var ranges = copyableRanges(cm);\n setLastCopied({lineWise: true, text: ranges.text});\n if (e.type == \"cut\") {\n cm.setSelections(ranges.ranges, null, sel_dontScroll);\n } else {\n input.prevInput = \"\";\n te.value = ranges.text.join(\"\\n\");\n selectInput(te);\n }\n }\n if (e.type == \"cut\") { cm.state.cutIncoming = +new Date; }\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 if (!te.dispatchEvent) {\n cm.state.pasteIncoming = +new Date;\n input.focus();\n return\n }\n\n // Pass the `paste` event to the textarea so it's handled by its event listener.\n var event = new Event(\"paste\");\n event.clipboardData = e.clipboardData;\n te.dispatchEvent(event);\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 TextareaInput.prototype.createField = function (_display) {\n // Wraps and hides input textarea\n this.wrapper = hiddenTextarea();\n // The semihidden textarea that is focused when the editor is\n // focused, and receives input.\n this.textarea = this.wrapper.firstChild;\n var opts = this.cm.options;\n disableBrowserMagic(this.textarea, opts.spellcheck, opts.autocorrect, opts.autocapitalize);\n };\n\n TextareaInput.prototype.screenReaderLabelChanged = function (label) {\n // Label for screenreaders, accessibility\n if(label) {\n this.textarea.setAttribute('aria-label', label);\n } else {\n this.textarea.removeAttribute('aria-label');\n }\n };\n\n TextareaInput.prototype.prepareSelection = function () {\n // Redraw the selection and/or cursor\n var cm = this.cm, display = cm.display, doc = cm.doc;\n var result = prepareSelection(cm);\n\n // Move the hidden textarea near the cursor to prevent scrolling artifacts\n if (cm.options.moveInputWithCursor) {\n var headPos = cursorCoords(cm, doc.sel.primary().head, \"div\");\n var wrapOff = display.wrapper.getBoundingClientRect(), lineOff = display.lineDiv.getBoundingClientRect();\n result.teTop = Math.max(0, Math.min(display.wrapper.clientHeight - 10,\n headPos.top + lineOff.top - wrapOff.top));\n result.teLeft = Math.max(0, Math.min(display.wrapper.clientWidth - 10,\n headPos.left + lineOff.left - wrapOff.left));\n }\n\n return result\n };\n\n TextareaInput.prototype.showSelection = function (drawn) {\n var cm = this.cm, display = cm.display;\n removeChildrenAndAdd(display.cursorDiv, drawn.cursors);\n removeChildrenAndAdd(display.selectionDiv, drawn.selection);\n if (drawn.teTop != null) {\n this.wrapper.style.top = drawn.teTop + \"px\";\n this.wrapper.style.left = drawn.teLeft + \"px\";\n }\n };\n\n // Reset the input to correspond to the selection (or to be empty,\n // when not typing and nothing is selected)\n TextareaInput.prototype.reset = function (typing) {\n if (this.contextMenuPending || this.composing && typing) { return }\n var cm = this.cm;\n this.resetting = true;\n if (cm.somethingSelected()) {\n this.prevInput = \"\";\n var content = cm.getSelection();\n this.textarea.value = content;\n if (cm.state.focused) { selectInput(this.textarea); }\n if (ie && ie_version >= 9) { this.hasSelection = content; }\n } else if (!typing) {\n this.prevInput = this.textarea.value = \"\";\n if (ie && ie_version >= 9) { this.hasSelection = null; }\n }\n this.resetting = false;\n };\n\n TextareaInput.prototype.getField = function () { return this.textarea };\n\n TextareaInput.prototype.supportsTouch = function () { return false };\n\n TextareaInput.prototype.focus = function () {\n if (this.cm.options.readOnly != \"nocursor\" && (!mobile || activeElt(rootNode(this.textarea)) != 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 TextareaInput.prototype.blur = function () { this.textarea.blur(); };\n\n TextareaInput.prototype.resetPosition = function () {\n this.wrapper.style.top = this.wrapper.style.left = 0;\n };\n\n TextareaInput.prototype.receivedFocus = function () { this.slowPoll(); };\n\n // Poll for input changes, using the normal rate of polling. This\n // runs as long as the editor is focused.\n TextareaInput.prototype.slowPoll = function () {\n var this$1 = this;\n\n if (this.pollingFast) { return }\n this.polling.set(this.cm.options.pollInterval, function () {\n this$1.poll();\n if (this$1.cm.state.focused) { this$1.slowPoll(); }\n });\n };\n\n // When an event has just come in that is likely to add or change\n // something in the input textarea, we poll faster, to ensure that\n // the change appears on the screen quickly.\n TextareaInput.prototype.fastPoll = function () {\n var missed = false, input = this;\n input.pollingFast = true;\n function p() {\n var changed = input.poll();\n if (!changed && !missed) {missed = true; input.polling.set(60, p);}\n else {input.pollingFast = false; input.slowPoll();}\n }\n input.polling.set(20, p);\n };\n\n // Read input from the textarea, and update the document to match.\n // When something is selected, it is present in the textarea, and\n // selected (unless it is huge, in which case a placeholder is\n // used). When nothing is selected, the cursor sits after previously\n // seen text (can be empty), which is stored in prevInput (we must\n // not reset the textarea when typing, because that breaks IME).\n TextareaInput.prototype.poll = function () {\n var this$1 = this;\n\n var cm = this.cm, input = this.textarea, prevInput = this.prevInput;\n // Since this is called a *lot*, try to bail out as cheaply as\n // possible when it is clear that nothing happened. hasSelection\n // will be the case when there is a lot of text in the textarea,\n // in which case reading its value would be expensive.\n if (this.contextMenuPending || this.resetting || !cm.state.focused ||\n (hasSelection(input) && !prevInput && !this.composing) ||\n cm.isReadOnly() || cm.options.disableInput || cm.state.keySeq)\n { return false }\n\n var text = input.value;\n // If nothing changed, bail.\n if (text == prevInput && !cm.somethingSelected()) { return false }\n // Work around nonsensical selection resetting in IE9/10, and\n // inexplicable appearance of private area unicode characters on\n // some key combos in Mac (#2689).\n if (ie && ie_version >= 9 && this.hasSelection === text ||\n mac && /[\\uf700-\\uf7ff]/.test(text)) {\n cm.display.input.reset();\n return false\n }\n\n if (cm.doc.sel == cm.display.selForContextMenu) {\n var first = text.charCodeAt(0);\n if (first == 0x200b && !prevInput) { prevInput = \"\\u200b\"; }\n if (first == 0x21da) { this.reset(); return this.cm.execCommand(\"undo\") }\n }\n // Find the part of the input that is actually new\n var same = 0, l = Math.min(prevInput.length, text.length);\n while (same < l && prevInput.charCodeAt(same) == text.charCodeAt(same)) { ++same; }\n\n runInOp(cm, function () {\n applyTextInput(cm, text.slice(same), prevInput.length - same,\n null, this$1.composing ? \"*compose\" : null);\n\n // Don't leave long text in the textarea, since it makes further polling slow\n if (text.length > 1000 || text.indexOf(\"\\n\") > -1) { input.value = this$1.prevInput = \"\"; }\n else { this$1.prevInput = text; }\n\n if (this$1.composing) {\n this$1.composing.range.clear();\n this$1.composing.range = cm.markText(this$1.composing.start, cm.getCursor(\"to\"),\n {className: \"CodeMirror-composing\"});\n }\n });\n return true\n };\n\n TextareaInput.prototype.ensurePolled = function () {\n if (this.pollingFast && this.poll()) { this.pollingFast = false; }\n };\n\n TextareaInput.prototype.onKeyPress = function () {\n if (ie && ie_version >= 9) { this.hasSelection = null; }\n this.fastPoll();\n };\n\n TextareaInput.prototype.onContextMenu = function (e) {\n var input = this, cm = input.cm, display = cm.display, te = input.textarea;\n if (input.contextMenuPending) { input.contextMenuPending(); }\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 var wrapperBox = input.wrapper.offsetParent.getBoundingClientRect();\n input.wrapper.style.cssText = \"position: static\";\n te.style.cssText = \"position: absolute; width: 30px; height: 30px;\\n top: \" + (e.clientY - wrapperBox.top - 5) + \"px; left: \" + (e.clientX - wrapperBox.left - 5) + \"px;\\n z-index: 1000; background: \" + (ie ? \"rgba(255, 255, 255, .05)\" : \"transparent\") + \";\\n outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);\";\n var oldScrollY;\n if (webkit) { oldScrollY = te.ownerDocument.defaultView.scrollY; } // Work around Chrome issue (#2712)\n display.input.focus();\n if (webkit) { te.ownerDocument.defaultView.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 = rehide;\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 if (input.contextMenuPending != rehide) { return }\n input.contextMenuPending = false;\n input.wrapper.style.cssText = oldWrapperCSS;\n te.style.cssText = oldCSS;\n if (ie && ie_version < 9) { display.scrollbars.setScrollTop(display.scroller.scrollTop = scrollPos); }\n\n // Try to detect the user choosing select-all\n if (te.selectionStart != null) {\n if (!ie || (ie && ie_version < 9)) { prepareSelectAllHack(); }\n var i = 0, poll = function () {\n if (display.selForContextMenu == cm.doc.sel && te.selectionStart == 0 &&\n te.selectionEnd > 0 && input.prevInput == \"\\u200b\") {\n operation(cm, selectAll)(cm);\n } else if (i++ < 10) {\n display.detectingSelectAll = setTimeout(poll, 500);\n } else {\n display.selForContextMenu = null;\n display.input.reset();\n }\n };\n display.detectingSelectAll = setTimeout(poll, 200);\n }\n }\n\n if (ie && ie_version >= 9) { prepareSelectAllHack(); }\n if (captureRightClick) {\n e_stop(e);\n var mouseup = function () {\n off(window, \"mouseup\", mouseup);\n setTimeout(rehide, 20);\n };\n on(window, \"mouseup\", mouseup);\n } else {\n setTimeout(rehide, 50);\n }\n };\n\n TextareaInput.prototype.readOnlyChanged = function (val) {\n if (!val) { this.reset(); }\n this.textarea.disabled = val == \"nocursor\";\n this.textarea.readOnly = !!val;\n };\n\n TextareaInput.prototype.setUneditable = function () {};\n\n TextareaInput.prototype.needsContentAttribute = false;\n\n function fromTextArea(textarea, options) {\n options = options ? copyObj(options) : {};\n options.value = textarea.value;\n if (!options.tabindex && textarea.tabIndex)\n { options.tabindex = textarea.tabIndex; }\n if (!options.placeholder && textarea.placeholder)\n { options.placeholder = textarea.placeholder; }\n // Set autofocus to true if this textarea is focused, or if it has\n // autofocus and no other element is focused.\n if (options.autofocus == null) {\n var hasFocus = activeElt(rootNode(textarea));\n options.autofocus = hasFocus == textarea ||\n textarea.getAttribute(\"autofocus\") != null && hasFocus == document.body;\n }\n\n function save() {textarea.value = cm.getValue();}\n\n var realSubmit;\n if (textarea.form) {\n on(textarea.form, \"submit\", save);\n // Deplorable hack to make the submit method do the right thing.\n if (!options.leaveSubmitMethodAlone) {\n var form = textarea.form;\n realSubmit = form.submit;\n try {\n var wrappedSubmit = form.submit = function () {\n save();\n form.submit = realSubmit;\n form.submit();\n form.submit = wrappedSubmit;\n };\n } catch(e) {}\n }\n }\n\n options.finishInit = function (cm) {\n cm.save = save;\n cm.getTextArea = function () { return textarea; };\n cm.toTextArea = function () {\n cm.toTextArea = isNaN; // Prevent this from being ran twice\n save();\n textarea.parentNode.removeChild(cm.getWrapperElement());\n textarea.style.display = \"\";\n if (textarea.form) {\n off(textarea.form, \"submit\", save);\n if (!options.leaveSubmitMethodAlone && 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) { return textarea.parentNode.insertBefore(node, textarea.nextSibling); },\n options);\n return cm\n }\n\n function addLegacyProps(CodeMirror) {\n CodeMirror.off = off;\n CodeMirror.on = on;\n CodeMirror.wheelEventPixels = wheelEventPixels;\n CodeMirror.Doc = Doc;\n CodeMirror.splitLines = splitLinesAuto;\n CodeMirror.countColumn = countColumn;\n CodeMirror.findColumn = findColumn;\n CodeMirror.isWordChar = isWordCharBasic;\n CodeMirror.Pass = Pass;\n CodeMirror.signal = signal;\n CodeMirror.Line = Line;\n CodeMirror.changeEnd = changeEnd;\n CodeMirror.scrollbarModel = scrollbarModel;\n CodeMirror.Pos = Pos;\n CodeMirror.cmpPos = cmp;\n CodeMirror.modes = modes;\n CodeMirror.mimeModes = mimeModes;\n CodeMirror.resolveMode = resolveMode;\n CodeMirror.getMode = getMode;\n CodeMirror.modeExtensions = modeExtensions;\n CodeMirror.extendMode = extendMode;\n CodeMirror.copyState = copyState;\n CodeMirror.startState = startState;\n CodeMirror.innerMode = innerMode;\n CodeMirror.commands = commands;\n CodeMirror.keyMap = keyMap;\n CodeMirror.keyName = keyName;\n CodeMirror.isModifierKey = isModifierKey;\n CodeMirror.lookupKey = lookupKey;\n CodeMirror.normalizeKeyMap = normalizeKeyMap;\n CodeMirror.StringStream = StringStream;\n CodeMirror.SharedTextMarker = SharedTextMarker;\n CodeMirror.TextMarker = TextMarker;\n CodeMirror.LineWidget = LineWidget;\n CodeMirror.e_preventDefault = e_preventDefault;\n CodeMirror.e_stopPropagation = e_stopPropagation;\n CodeMirror.e_stop = e_stop;\n CodeMirror.addClass = addClass;\n CodeMirror.contains = contains;\n CodeMirror.rmClass = rmClass;\n CodeMirror.keyNames = keyNames;\n }\n\n // EDITOR CONSTRUCTOR\n\n defineOptions(CodeMirror);\n\n addEditorMethods(CodeMirror);\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 CodeMirror.inputStyles = {\"textarea\": TextareaInput, \"contenteditable\": ContentEditableInput};\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 defineMode.apply(this, arguments);\n };\n\n CodeMirror.defineMIME = defineMIME;\n\n // Minimal default mode.\n CodeMirror.defineMode(\"null\", function () { return ({token: function (stream) { return stream.skipToEnd(); }}); });\n CodeMirror.defineMIME(\"text/plain\", \"null\");\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\n CodeMirror.fromTextArea = fromTextArea;\n\n addLegacyProps(CodeMirror);\n\n CodeMirror.version = \"5.65.18\";\n\n return CodeMirror;\n\n})));\n","// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/5/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 listRE = /^(\\s*)(>[> ]*|[*+-] \\[[x ]\\]\\s|[*+-]\\s|(\\d+)([.)]))(\\s*)/,\n emptyListRE = /^(\\s*)(>[> ]*|[*+-] \\[[x ]\\]|[*+-]|(\\d+)[.)])(\\s*)$/,\n unorderedListRE = /[*+-]\\s/;\n\n CodeMirror.commands.newlineAndIndentContinueMarkdownList = function(cm) {\n if (cm.getOption(\"disableInput\")) return CodeMirror.Pass;\n var ranges = cm.listSelections(), replacements = [];\n for (var i = 0; i < ranges.length; i++) {\n var pos = ranges[i].head;\n\n // If we're not in Markdown mode, fall back to normal newlineAndIndent\n var eolState = cm.getStateAfter(pos.line);\n var inner = CodeMirror.innerMode(cm.getMode(), eolState);\n if (inner.mode.name !== \"markdown\" && inner.mode.helperType !== \"markdown\") {\n cm.execCommand(\"newlineAndIndent\");\n return;\n } else {\n eolState = inner.state;\n }\n\n var inList = eolState.list !== false;\n var inQuote = eolState.quote !== 0;\n\n var line = cm.getLine(pos.line), match = listRE.exec(line);\n var cursorBeforeBullet = /^\\s*$/.test(line.slice(0, pos.ch));\n if (!ranges[i].empty() || (!inList && !inQuote) || !match || cursorBeforeBullet) {\n cm.execCommand(\"newlineAndIndent\");\n return;\n }\n if (emptyListRE.test(line)) {\n var endOfQuote = inQuote && />\\s*$/.test(line)\n var endOfList = !/>\\s*$/.test(line)\n if (endOfQuote || endOfList) cm.replaceRange(\"\", {\n line: pos.line, ch: 0\n }, {\n line: pos.line, ch: pos.ch + 1\n });\n replacements[i] = \"\\n\";\n } else {\n var indent = match[1], after = match[5];\n var numbered = !(unorderedListRE.test(match[2]) || match[2].indexOf(\">\") >= 0);\n var bullet = numbered ? (parseInt(match[3], 10) + 1) + match[4] : match[2].replace(\"x\", \" \");\n replacements[i] = \"\\n\" + indent + bullet + after;\n\n if (numbered) incrementRemainingMarkdownListNumbers(cm, pos);\n }\n }\n\n cm.replaceSelections(replacements);\n };\n\n // Auto-updating Markdown list numbers when a new item is added to the\n // middle of a list\n function incrementRemainingMarkdownListNumbers(cm, pos) {\n var startLine = pos.line, lookAhead = 0, skipCount = 0;\n var startItem = listRE.exec(cm.getLine(startLine)), startIndent = startItem[1];\n\n do {\n lookAhead += 1;\n var nextLineNumber = startLine + lookAhead;\n var nextLine = cm.getLine(nextLineNumber), nextItem = listRE.exec(nextLine);\n\n if (nextItem) {\n var nextIndent = nextItem[1];\n var newNumber = (parseInt(startItem[3], 10) + lookAhead - skipCount);\n var nextNumber = (parseInt(nextItem[3], 10)), itemNumber = nextNumber;\n\n if (startIndent === nextIndent && !isNaN(nextNumber)) {\n if (newNumber === nextNumber) itemNumber = nextNumber + 1;\n if (newNumber > nextNumber) itemNumber = newNumber + 1;\n cm.replaceRange(\n nextLine.replace(listRE, nextIndent + itemNumber + nextItem[4] + nextItem[5]),\n {\n line: nextLineNumber, ch: 0\n }, {\n line: nextLineNumber, ch: nextLine.length\n });\n } else {\n if (startIndent.length > nextIndent.length) return;\n // This doesn't run if the next line immediately indents, as it is\n // not clear of the users intention (new indented item or same level)\n if ((startIndent.length < nextIndent.length) && (lookAhead === 1)) return;\n skipCount += 1;\n }\n }\n } while (nextItem);\n }\n});\n","// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: http://codemirror.net/LICENSE\n\nvar CodeMirror = require('codemirror');\n\nCodeMirror.commands.tabAndIndentMarkdownList = function (cm) {\n var ranges = cm.listSelections();\n var pos = ranges[0].head;\n var eolState = cm.getStateAfter(pos.line);\n var inList = eolState.list !== false;\n\n if (inList) {\n cm.execCommand('indentMore');\n return;\n }\n\n if (cm.options.indentWithTabs) {\n cm.execCommand('insertTab');\n } else {\n var spaces = Array(cm.options.tabSize + 1).join(' ');\n cm.replaceSelection(spaces);\n }\n};\n\nCodeMirror.commands.shiftTabAndUnindentMarkdownList = function (cm) {\n var ranges = cm.listSelections();\n var pos = ranges[0].head;\n var eolState = cm.getStateAfter(pos.line);\n var inList = eolState.list !== false;\n\n if (inList) {\n cm.execCommand('indentLess');\n return;\n }\n\n if (cm.options.indentWithTabs) {\n cm.execCommand('insertTab');\n } else {\n var spaces = Array(cm.options.tabSize + 1).join(' ');\n cm.replaceSelection(spaces);\n }\n};\n","// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/5/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.defineOption(\"fullScreen\", false, function(cm, val, old) {\n if (old == CodeMirror.Init) old = false;\n if (!old == !val) return;\n if (val) setFullscreen(cm);\n else setNormal(cm);\n });\n\n function setFullscreen(cm) {\n var wrap = cm.getWrapperElement();\n cm.state.fullScreenRestore = {scrollTop: window.pageYOffset, scrollLeft: window.pageXOffset,\n width: wrap.style.width, height: wrap.style.height};\n wrap.style.width = \"\";\n wrap.style.height = \"auto\";\n wrap.className += \" CodeMirror-fullscreen\";\n document.documentElement.style.overflow = \"hidden\";\n cm.refresh();\n }\n\n function setNormal(cm) {\n var wrap = cm.getWrapperElement();\n wrap.className = wrap.className.replace(/\\s*CodeMirror-fullscreen\\b/, \"\");\n document.documentElement.style.overflow = \"\";\n var info = cm.state.fullScreenRestore;\n wrap.style.width = info.width; wrap.style.height = info.height;\n window.scrollTo(info.scrollLeft, info.scrollTop);\n cm.refresh();\n }\n});\n","// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/5/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 allowMissingTagName: 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\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 lower(tagName) {\n return tagName && tagName.toLowerCase();\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(lower(parentTagName)) ||\n !config.contextGrabbers[lower(parentTagName)].hasOwnProperty(lower(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 if (config.allowMissingTagName && type == \"endTag\") {\n setStyle = \"tag bracket\";\n return attrState(type, stream, state);\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(lower(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 if (config.allowMissingTagName && type == \"endTag\") {\n setStyle = \"tag bracket\";\n return closeState(type, stream, state);\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(lower(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 xmlCurrentTag: function(state) {\n return state.tagName ? {name: state.tagName, close: state.type == \"closeTag\"} : null\n },\n\n xmlCurrentContext: function(state) {\n var context = []\n for (var cx = state.context; cx; cx = cx.prev)\n context.push(cx.tagName)\n return context.reverse()\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: https://codemirror.net/5/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.modeInfo = [\n {name: \"APL\", mime: \"text/apl\", mode: \"apl\", ext: [\"dyalog\", \"apl\"]},\n {name: \"PGP\", mimes: [\"application/pgp\", \"application/pgp-encrypted\", \"application/pgp-keys\", \"application/pgp-signature\"], mode: \"asciiarmor\", ext: [\"asc\", \"pgp\", \"sig\"]},\n {name: \"ASN.1\", mime: \"text/x-ttcn-asn\", mode: \"asn.1\", ext: [\"asn\", \"asn1\"]},\n {name: \"Asterisk\", mime: \"text/x-asterisk\", mode: \"asterisk\", file: /^extensions\\.conf$/i},\n {name: \"Brainfuck\", mime: \"text/x-brainfuck\", mode: \"brainfuck\", ext: [\"b\", \"bf\"]},\n {name: \"C\", mime: \"text/x-csrc\", mode: \"clike\", ext: [\"c\", \"h\", \"ino\"]},\n {name: \"C++\", mime: \"text/x-c++src\", mode: \"clike\", ext: [\"cpp\", \"c++\", \"cc\", \"cxx\", \"hpp\", \"h++\", \"hh\", \"hxx\"], alias: [\"cpp\"]},\n {name: \"Cobol\", mime: \"text/x-cobol\", mode: \"cobol\", ext: [\"cob\", \"cpy\", \"cbl\"]},\n {name: \"C#\", mime: \"text/x-csharp\", mode: \"clike\", ext: [\"cs\"], alias: [\"csharp\", \"cs\"]},\n {name: \"Clojure\", mime: \"text/x-clojure\", mode: \"clojure\", ext: [\"clj\", \"cljc\", \"cljx\"]},\n {name: \"ClojureScript\", mime: \"text/x-clojurescript\", mode: \"clojure\", ext: [\"cljs\"]},\n {name: \"Closure Stylesheets (GSS)\", mime: \"text/x-gss\", mode: \"css\", ext: [\"gss\"]},\n {name: \"CMake\", mime: \"text/x-cmake\", mode: \"cmake\", ext: [\"cmake\", \"cmake.in\"], file: /^CMakeLists\\.txt$/},\n {name: \"CoffeeScript\", mimes: [\"application/vnd.coffeescript\", \"text/coffeescript\", \"text/x-coffeescript\"], mode: \"coffeescript\", ext: [\"coffee\"], alias: [\"coffee\", \"coffee-script\"]},\n {name: \"Common Lisp\", mime: \"text/x-common-lisp\", mode: \"commonlisp\", ext: [\"cl\", \"lisp\", \"el\"], alias: [\"lisp\"]},\n {name: \"Cypher\", mime: \"application/x-cypher-query\", mode: \"cypher\", ext: [\"cyp\", \"cypher\"]},\n {name: \"Cython\", mime: \"text/x-cython\", mode: \"python\", ext: [\"pyx\", \"pxd\", \"pxi\"]},\n {name: \"Crystal\", mime: \"text/x-crystal\", mode: \"crystal\", ext: [\"cr\"]},\n {name: \"CSS\", mime: \"text/css\", mode: \"css\", ext: [\"css\"]},\n {name: \"CQL\", mime: \"text/x-cassandra\", mode: \"sql\", ext: [\"cql\"]},\n {name: \"D\", mime: \"text/x-d\", mode: \"d\", ext: [\"d\"]},\n {name: \"Dart\", mimes: [\"application/dart\", \"text/x-dart\"], mode: \"dart\", ext: [\"dart\"]},\n {name: \"diff\", mime: \"text/x-diff\", mode: \"diff\", ext: [\"diff\", \"patch\"]},\n {name: \"Django\", mime: \"text/x-django\", mode: \"django\"},\n {name: \"Dockerfile\", mime: \"text/x-dockerfile\", mode: \"dockerfile\", file: /^Dockerfile$/},\n {name: \"DTD\", mime: \"application/xml-dtd\", mode: \"dtd\", ext: [\"dtd\"]},\n {name: \"Dylan\", mime: \"text/x-dylan\", mode: \"dylan\", ext: [\"dylan\", \"dyl\", \"intr\"]},\n {name: \"EBNF\", mime: \"text/x-ebnf\", mode: \"ebnf\"},\n {name: \"ECL\", mime: \"text/x-ecl\", mode: \"ecl\", ext: [\"ecl\"]},\n {name: \"edn\", mime: \"application/edn\", mode: \"clojure\", ext: [\"edn\"]},\n {name: \"Eiffel\", mime: \"text/x-eiffel\", mode: \"eiffel\", ext: [\"e\"]},\n {name: \"Elm\", mime: \"text/x-elm\", mode: \"elm\", ext: [\"elm\"]},\n {name: \"Embedded JavaScript\", mime: \"application/x-ejs\", mode: \"htmlembedded\", ext: [\"ejs\"]},\n {name: \"Embedded Ruby\", mime: \"application/x-erb\", mode: \"htmlembedded\", ext: [\"erb\"]},\n {name: \"Erlang\", mime: \"text/x-erlang\", mode: \"erlang\", ext: [\"erl\"]},\n {name: \"Esper\", mime: \"text/x-esper\", mode: \"sql\"},\n {name: \"Factor\", mime: \"text/x-factor\", mode: \"factor\", ext: [\"factor\"]},\n {name: \"FCL\", mime: \"text/x-fcl\", mode: \"fcl\"},\n {name: \"Forth\", mime: \"text/x-forth\", mode: \"forth\", ext: [\"forth\", \"fth\", \"4th\"]},\n {name: \"Fortran\", mime: \"text/x-fortran\", mode: \"fortran\", ext: [\"f\", \"for\", \"f77\", \"f90\", \"f95\"]},\n {name: \"F#\", mime: \"text/x-fsharp\", mode: \"mllike\", ext: [\"fs\"], alias: [\"fsharp\"]},\n {name: \"Gas\", mime: \"text/x-gas\", mode: \"gas\", ext: [\"s\"]},\n {name: \"Gherkin\", mime: \"text/x-feature\", mode: \"gherkin\", ext: [\"feature\"]},\n {name: \"GitHub Flavored Markdown\", mime: \"text/x-gfm\", mode: \"gfm\", file: /^(readme|contributing|history)\\.md$/i},\n {name: \"Go\", mime: \"text/x-go\", mode: \"go\", ext: [\"go\"]},\n {name: \"Groovy\", mime: \"text/x-groovy\", mode: \"groovy\", ext: [\"groovy\", \"gradle\"], file: /^Jenkinsfile$/},\n {name: \"HAML\", mime: \"text/x-haml\", mode: \"haml\", ext: [\"haml\"]},\n {name: \"Haskell\", mime: \"text/x-haskell\", mode: \"haskell\", ext: [\"hs\"]},\n {name: \"Haskell (Literate)\", mime: \"text/x-literate-haskell\", mode: \"haskell-literate\", ext: [\"lhs\"]},\n {name: \"Haxe\", mime: \"text/x-haxe\", mode: \"haxe\", ext: [\"hx\"]},\n {name: \"HXML\", mime: \"text/x-hxml\", mode: \"haxe\", ext: [\"hxml\"]},\n {name: \"ASP.NET\", mime: \"application/x-aspx\", mode: \"htmlembedded\", ext: [\"aspx\"], alias: [\"asp\", \"aspx\"]},\n {name: \"HTML\", mime: \"text/html\", mode: \"htmlmixed\", ext: [\"html\", \"htm\", \"handlebars\", \"hbs\"], alias: [\"xhtml\"]},\n {name: \"HTTP\", mime: \"message/http\", mode: \"http\"},\n {name: \"IDL\", mime: \"text/x-idl\", mode: \"idl\", ext: [\"pro\"]},\n {name: \"Pug\", mime: \"text/x-pug\", mode: \"pug\", ext: [\"jade\", \"pug\"], alias: [\"jade\"]},\n {name: \"Java\", mime: \"text/x-java\", mode: \"clike\", ext: [\"java\"]},\n {name: \"Java Server Pages\", mime: \"application/x-jsp\", mode: \"htmlembedded\", ext: [\"jsp\"], alias: [\"jsp\"]},\n {name: \"JavaScript\", mimes: [\"text/javascript\", \"text/ecmascript\", \"application/javascript\", \"application/x-javascript\", \"application/ecmascript\"],\n mode: \"javascript\", ext: [\"js\"], alias: [\"ecmascript\", \"js\", \"node\"]},\n {name: \"JSON\", mimes: [\"application/json\", \"application/x-json\"], mode: \"javascript\", ext: [\"json\", \"map\"], alias: [\"json5\"]},\n {name: \"JSON-LD\", mime: \"application/ld+json\", mode: \"javascript\", ext: [\"jsonld\"], alias: [\"jsonld\"]},\n {name: \"JSX\", mime: \"text/jsx\", mode: \"jsx\", ext: [\"jsx\"]},\n {name: \"Jinja2\", mime: \"text/jinja2\", mode: \"jinja2\", ext: [\"j2\", \"jinja\", \"jinja2\"]},\n {name: \"Julia\", mime: \"text/x-julia\", mode: \"julia\", ext: [\"jl\"], alias: [\"jl\"]},\n {name: \"Kotlin\", mime: \"text/x-kotlin\", mode: \"clike\", ext: [\"kt\"]},\n {name: \"LESS\", mime: \"text/x-less\", mode: \"css\", ext: [\"less\"]},\n {name: \"LiveScript\", mime: \"text/x-livescript\", mode: \"livescript\", ext: [\"ls\"], alias: [\"ls\"]},\n {name: \"Lua\", mime: \"text/x-lua\", mode: \"lua\", ext: [\"lua\"]},\n {name: \"Markdown\", mime: \"text/x-markdown\", mode: \"markdown\", ext: [\"markdown\", \"md\", \"mkd\"]},\n {name: \"mIRC\", mime: \"text/mirc\", mode: \"mirc\"},\n {name: \"MariaDB SQL\", mime: \"text/x-mariadb\", mode: \"sql\"},\n {name: \"Mathematica\", mime: \"text/x-mathematica\", mode: \"mathematica\", ext: [\"m\", \"nb\", \"wl\", \"wls\"]},\n {name: \"Modelica\", mime: \"text/x-modelica\", mode: \"modelica\", ext: [\"mo\"]},\n {name: \"MUMPS\", mime: \"text/x-mumps\", mode: \"mumps\", ext: [\"mps\"]},\n {name: \"MS SQL\", mime: \"text/x-mssql\", mode: \"sql\"},\n {name: \"mbox\", mime: \"application/mbox\", mode: \"mbox\", ext: [\"mbox\"]},\n {name: \"MySQL\", mime: \"text/x-mysql\", mode: \"sql\"},\n {name: \"Nginx\", mime: \"text/x-nginx-conf\", mode: \"nginx\", file: /nginx.*\\.conf$/i},\n {name: \"NSIS\", mime: \"text/x-nsis\", mode: \"nsis\", ext: [\"nsh\", \"nsi\"]},\n {name: \"NTriples\", mimes: [\"application/n-triples\", \"application/n-quads\", \"text/n-triples\"],\n mode: \"ntriples\", ext: [\"nt\", \"nq\"]},\n {name: \"Objective-C\", mime: \"text/x-objectivec\", mode: \"clike\", ext: [\"m\"], alias: [\"objective-c\", \"objc\"]},\n {name: \"Objective-C++\", mime: \"text/x-objectivec++\", mode: \"clike\", ext: [\"mm\"], alias: [\"objective-c++\", \"objc++\"]},\n {name: \"OCaml\", mime: \"text/x-ocaml\", mode: \"mllike\", ext: [\"ml\", \"mli\", \"mll\", \"mly\"]},\n {name: \"Octave\", mime: \"text/x-octave\", mode: \"octave\", ext: [\"m\"]},\n {name: \"Oz\", mime: \"text/x-oz\", mode: \"oz\", ext: [\"oz\"]},\n {name: \"Pascal\", mime: \"text/x-pascal\", mode: \"pascal\", ext: [\"p\", \"pas\"]},\n {name: \"PEG.js\", mime: \"null\", mode: \"pegjs\", ext: [\"jsonld\"]},\n {name: \"Perl\", mime: \"text/x-perl\", mode: \"perl\", ext: [\"pl\", \"pm\"]},\n {name: \"PHP\", mimes: [\"text/x-php\", \"application/x-httpd-php\", \"application/x-httpd-php-open\"], mode: \"php\", ext: [\"php\", \"php3\", \"php4\", \"php5\", \"php7\", \"phtml\"]},\n {name: \"Pig\", mime: \"text/x-pig\", mode: \"pig\", ext: [\"pig\"]},\n {name: \"Plain Text\", mime: \"text/plain\", mode: \"null\", ext: [\"txt\", \"text\", \"conf\", \"def\", \"list\", \"log\"]},\n {name: \"PLSQL\", mime: \"text/x-plsql\", mode: \"sql\", ext: [\"pls\"]},\n {name: \"PostgreSQL\", mime: \"text/x-pgsql\", mode: \"sql\"},\n {name: \"PowerShell\", mime: \"application/x-powershell\", mode: \"powershell\", ext: [\"ps1\", \"psd1\", \"psm1\"]},\n {name: \"Properties files\", mime: \"text/x-properties\", mode: \"properties\", ext: [\"properties\", \"ini\", \"in\"], alias: [\"ini\", \"properties\"]},\n {name: \"ProtoBuf\", mime: \"text/x-protobuf\", mode: \"protobuf\", ext: [\"proto\"]},\n {name: \"Python\", mime: \"text/x-python\", mode: \"python\", ext: [\"BUILD\", \"bzl\", \"py\", \"pyw\"], file: /^(BUCK|BUILD)$/},\n {name: \"Puppet\", mime: \"text/x-puppet\", mode: \"puppet\", ext: [\"pp\"]},\n {name: \"Q\", mime: \"text/x-q\", mode: \"q\", ext: [\"q\"]},\n {name: \"R\", mime: \"text/x-rsrc\", mode: \"r\", ext: [\"r\", \"R\"], alias: [\"rscript\"]},\n {name: \"reStructuredText\", mime: \"text/x-rst\", mode: \"rst\", ext: [\"rst\"], alias: [\"rst\"]},\n {name: \"RPM Changes\", mime: \"text/x-rpm-changes\", mode: \"rpm\"},\n {name: \"RPM Spec\", mime: \"text/x-rpm-spec\", mode: \"rpm\", ext: [\"spec\"]},\n {name: \"Ruby\", mime: \"text/x-ruby\", mode: \"ruby\", ext: [\"rb\"], alias: [\"jruby\", \"macruby\", \"rake\", \"rb\", \"rbx\"]},\n {name: \"Rust\", mime: \"text/x-rustsrc\", mode: \"rust\", ext: [\"rs\"]},\n {name: \"SAS\", mime: \"text/x-sas\", mode: \"sas\", ext: [\"sas\"]},\n {name: \"Sass\", mime: \"text/x-sass\", mode: \"sass\", ext: [\"sass\"]},\n {name: \"Scala\", mime: \"text/x-scala\", mode: \"clike\", ext: [\"scala\"]},\n {name: \"Scheme\", mime: \"text/x-scheme\", mode: \"scheme\", ext: [\"scm\", \"ss\"]},\n {name: \"SCSS\", mime: \"text/x-scss\", mode: \"css\", ext: [\"scss\"]},\n {name: \"Shell\", mimes: [\"text/x-sh\", \"application/x-sh\"], mode: \"shell\", ext: [\"sh\", \"ksh\", \"bash\"], alias: [\"bash\", \"sh\", \"zsh\"], file: /^PKGBUILD$/},\n {name: \"Sieve\", mime: \"application/sieve\", mode: \"sieve\", ext: [\"siv\", \"sieve\"]},\n {name: \"Slim\", mimes: [\"text/x-slim\", \"application/x-slim\"], mode: \"slim\", ext: [\"slim\"]},\n {name: \"Smalltalk\", mime: \"text/x-stsrc\", mode: \"smalltalk\", ext: [\"st\"]},\n {name: \"Smarty\", mime: \"text/x-smarty\", mode: \"smarty\", ext: [\"tpl\"]},\n {name: \"Solr\", mime: \"text/x-solr\", mode: \"solr\"},\n {name: \"SML\", mime: \"text/x-sml\", mode: \"mllike\", ext: [\"sml\", \"sig\", \"fun\", \"smackspec\"]},\n {name: \"Soy\", mime: \"text/x-soy\", mode: \"soy\", ext: [\"soy\"], alias: [\"closure template\"]},\n {name: \"SPARQL\", mime: \"application/sparql-query\", mode: \"sparql\", ext: [\"rq\", \"sparql\"], alias: [\"sparul\"]},\n {name: \"Spreadsheet\", mime: \"text/x-spreadsheet\", mode: \"spreadsheet\", alias: [\"excel\", \"formula\"]},\n {name: \"SQL\", mime: \"text/x-sql\", mode: \"sql\", ext: [\"sql\"]},\n {name: \"SQLite\", mime: \"text/x-sqlite\", mode: \"sql\"},\n {name: \"Squirrel\", mime: \"text/x-squirrel\", mode: \"clike\", ext: [\"nut\"]},\n {name: \"Stylus\", mime: \"text/x-styl\", mode: \"stylus\", ext: [\"styl\"]},\n {name: \"Swift\", mime: \"text/x-swift\", mode: \"swift\", ext: [\"swift\"]},\n {name: \"sTeX\", mime: \"text/x-stex\", mode: \"stex\"},\n {name: \"LaTeX\", mime: \"text/x-latex\", mode: \"stex\", ext: [\"text\", \"ltx\", \"tex\"], alias: [\"tex\"]},\n {name: \"SystemVerilog\", mime: \"text/x-systemverilog\", mode: \"verilog\", ext: [\"v\", \"sv\", \"svh\"]},\n {name: \"Tcl\", mime: \"text/x-tcl\", mode: \"tcl\", ext: [\"tcl\"]},\n {name: \"Textile\", mime: \"text/x-textile\", mode: \"textile\", ext: [\"textile\"]},\n {name: \"TiddlyWiki\", mime: \"text/x-tiddlywiki\", mode: \"tiddlywiki\"},\n {name: \"Tiki wiki\", mime: \"text/tiki\", mode: \"tiki\"},\n {name: \"TOML\", mime: \"text/x-toml\", mode: \"toml\", ext: [\"toml\"]},\n {name: \"Tornado\", mime: \"text/x-tornado\", mode: \"tornado\"},\n {name: \"troff\", mime: \"text/troff\", mode: \"troff\", ext: [\"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\"]},\n {name: \"TTCN\", mime: \"text/x-ttcn\", mode: \"ttcn\", ext: [\"ttcn\", \"ttcn3\", \"ttcnpp\"]},\n {name: \"TTCN_CFG\", mime: \"text/x-ttcn-cfg\", mode: \"ttcn-cfg\", ext: [\"cfg\"]},\n {name: \"Turtle\", mime: \"text/turtle\", mode: \"turtle\", ext: [\"ttl\"]},\n {name: \"TypeScript\", mime: \"application/typescript\", mode: \"javascript\", ext: [\"ts\"], alias: [\"ts\"]},\n {name: \"TypeScript-JSX\", mime: \"text/typescript-jsx\", mode: \"jsx\", ext: [\"tsx\"], alias: [\"tsx\"]},\n {name: \"Twig\", mime: \"text/x-twig\", mode: \"twig\"},\n {name: \"Web IDL\", mime: \"text/x-webidl\", mode: \"webidl\", ext: [\"webidl\"]},\n {name: \"VB.NET\", mime: \"text/x-vb\", mode: \"vb\", ext: [\"vb\"]},\n {name: \"VBScript\", mime: \"text/vbscript\", mode: \"vbscript\", ext: [\"vbs\"]},\n {name: \"Velocity\", mime: \"text/velocity\", mode: \"velocity\", ext: [\"vtl\"]},\n {name: \"Verilog\", mime: \"text/x-verilog\", mode: \"verilog\", ext: [\"v\"]},\n {name: \"VHDL\", mime: \"text/x-vhdl\", mode: \"vhdl\", ext: [\"vhd\", \"vhdl\"]},\n {name: \"Vue.js Component\", mimes: [\"script/x-vue\", \"text/x-vue\"], mode: \"vue\", ext: [\"vue\"]},\n {name: \"XML\", mimes: [\"application/xml\", \"text/xml\"], mode: \"xml\", ext: [\"xml\", \"xsl\", \"xsd\", \"svg\"], alias: [\"rss\", \"wsdl\", \"xsd\"]},\n {name: \"XQuery\", mime: \"application/xquery\", mode: \"xquery\", ext: [\"xy\", \"xquery\"]},\n {name: \"Yacas\", mime: \"text/x-yacas\", mode: \"yacas\", ext: [\"ys\"]},\n {name: \"YAML\", mimes: [\"text/x-yaml\", \"text/yaml\"], mode: \"yaml\", ext: [\"yaml\", \"yml\"], alias: [\"yml\"]},\n {name: \"Z80\", mime: \"text/x-z80\", mode: \"z80\", ext: [\"z80\"]},\n {name: \"mscgen\", mime: \"text/x-mscgen\", mode: \"mscgen\", ext: [\"mscgen\", \"mscin\", \"msc\"]},\n {name: \"xu\", mime: \"text/x-xu\", mode: \"mscgen\", ext: [\"xu\"]},\n {name: \"msgenny\", mime: \"text/x-msgenny\", mode: \"mscgen\", ext: [\"msgenny\"]},\n {name: \"WebAssembly\", mime: \"text/webassembly\", mode: \"wast\", ext: [\"wat\", \"wast\"]},\n ];\n // Ensure all modes have a mime property for backwards compatibility\n for (var i = 0; i < CodeMirror.modeInfo.length; i++) {\n var info = CodeMirror.modeInfo[i];\n if (info.mimes) info.mime = info.mimes[0];\n }\n\n CodeMirror.findModeByMIME = function(mime) {\n mime = mime.toLowerCase();\n for (var i = 0; i < CodeMirror.modeInfo.length; i++) {\n var info = CodeMirror.modeInfo[i];\n if (info.mime == mime) return info;\n if (info.mimes) for (var j = 0; j < info.mimes.length; j++)\n if (info.mimes[j] == mime) return info;\n }\n if (/\\+xml$/.test(mime)) return CodeMirror.findModeByMIME(\"application/xml\")\n if (/\\+json$/.test(mime)) return CodeMirror.findModeByMIME(\"application/json\")\n };\n\n CodeMirror.findModeByExtension = function(ext) {\n ext = ext.toLowerCase();\n for (var i = 0; i < CodeMirror.modeInfo.length; i++) {\n var info = CodeMirror.modeInfo[i];\n if (info.ext) for (var j = 0; j < info.ext.length; j++)\n if (info.ext[j] == ext) return info;\n }\n };\n\n CodeMirror.findModeByFileName = function(filename) {\n for (var i = 0; i < CodeMirror.modeInfo.length; i++) {\n var info = CodeMirror.modeInfo[i];\n if (info.file && info.file.test(filename)) return info;\n }\n var dot = filename.lastIndexOf(\".\");\n var ext = dot > -1 && filename.substring(dot + 1, filename.length);\n if (ext) return CodeMirror.findModeByExtension(ext);\n };\n\n CodeMirror.findModeByName = function(name) {\n name = name.toLowerCase();\n for (var i = 0; i < CodeMirror.modeInfo.length; i++) {\n var info = CodeMirror.modeInfo[i];\n if (info.name.toLowerCase() == name) return info;\n if (info.alias) for (var j = 0; j < info.alias.length; j++)\n if (info.alias[j].toLowerCase() == name) return info;\n }\n };\n});\n","// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/5/LICENSE\n\n(function(mod) {\n if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n mod(require(\"../../lib/codemirror\"), require(\"../xml/xml\"), require(\"../meta\"));\n else if (typeof define == \"function\" && define.amd) // AMD\n define([\"../../lib/codemirror\", \"../xml/xml\", \"../meta\"], mod);\n else // Plain browser env\n mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"markdown\", function(cmCfg, modeCfg) {\n\n var htmlMode = CodeMirror.getMode(cmCfg, \"text/html\");\n var htmlModeMissing = htmlMode.name == \"null\"\n\n function getMode(name) {\n if (CodeMirror.findModeByName) {\n var found = CodeMirror.findModeByName(name);\n if (found) name = found.mime || found.mimes[0];\n }\n var mode = CodeMirror.getMode(cmCfg, name);\n return mode.name == \"null\" ? null : mode;\n }\n\n // Should characters that affect highlighting be highlighted separate?\n // Does not include characters that will be output (such as `1.` and `-` for lists)\n if (modeCfg.highlightFormatting === undefined)\n modeCfg.highlightFormatting = false;\n\n // Maximum number of nested blockquotes. Set to 0 for infinite nesting.\n // Excess `>` will emit `error` token.\n if (modeCfg.maxBlockquoteDepth === undefined)\n modeCfg.maxBlockquoteDepth = 0;\n\n // Turn on task lists? (\"- [ ] \" and \"- [x] \")\n if (modeCfg.taskLists === undefined) modeCfg.taskLists = false;\n\n // Turn on strikethrough syntax\n if (modeCfg.strikethrough === undefined)\n modeCfg.strikethrough = false;\n\n if (modeCfg.emoji === undefined)\n modeCfg.emoji = false;\n\n if (modeCfg.fencedCodeBlockHighlighting === undefined)\n modeCfg.fencedCodeBlockHighlighting = true;\n\n if (modeCfg.fencedCodeBlockDefaultMode === undefined)\n modeCfg.fencedCodeBlockDefaultMode = 'text/plain';\n\n if (modeCfg.xml === undefined)\n modeCfg.xml = true;\n\n // Allow token types to be overridden by user-provided token types.\n if (modeCfg.tokenTypeOverrides === undefined)\n modeCfg.tokenTypeOverrides = {};\n\n var tokenTypes = {\n header: \"header\",\n code: \"comment\",\n quote: \"quote\",\n list1: \"variable-2\",\n list2: \"variable-3\",\n list3: \"keyword\",\n hr: \"hr\",\n image: \"image\",\n imageAltText: \"image-alt-text\",\n imageMarker: \"image-marker\",\n formatting: \"formatting\",\n linkInline: \"link\",\n linkEmail: \"link\",\n linkText: \"link\",\n linkHref: \"string\",\n em: \"em\",\n strong: \"strong\",\n strikethrough: \"strikethrough\",\n emoji: \"builtin\"\n };\n\n for (var tokenType in tokenTypes) {\n if (tokenTypes.hasOwnProperty(tokenType) && modeCfg.tokenTypeOverrides[tokenType]) {\n tokenTypes[tokenType] = modeCfg.tokenTypeOverrides[tokenType];\n }\n }\n\n var hrRE = /^([*\\-_])(?:\\s*\\1){2,}\\s*$/\n , listRE = /^(?:[*\\-+]|^[0-9]+([.)]))\\s+/\n , taskListRE = /^\\[(x| )\\](?=\\s)/i // Must follow listRE\n , atxHeaderRE = modeCfg.allowAtxHeaderWithoutSpace ? /^(#+)/ : /^(#+)(?: |$)/\n , setextHeaderRE = /^ {0,3}(?:\\={1,}|-{2,})\\s*$/\n , textRE = /^[^#!\\[\\]*_\\\\<>` \"'(~:]+/\n , fencedCodeRE = /^(~~~+|```+)[ \\t]*([\\w\\/+#-]*)[^\\n`]*$/\n , linkDefRE = /^\\s*\\[[^\\]]+?\\]:.*$/ // naive link-definition\n , punctuation = /[!\"#$%&'()*+,\\-.\\/:;<=>?@\\[\\\\\\]^_`{|}~\\xA1\\xA7\\xAB\\xB6\\xB7\\xBB\\xBF\\u037E\\u0387\\u055A-\\u055F\\u0589\\u058A\\u05BE\\u05C0\\u05C3\\u05C6\\u05F3\\u05F4\\u0609\\u060A\\u060C\\u060D\\u061B\\u061E\\u061F\\u066A-\\u066D\\u06D4\\u0700-\\u070D\\u07F7-\\u07F9\\u0830-\\u083E\\u085E\\u0964\\u0965\\u0970\\u0AF0\\u0DF4\\u0E4F\\u0E5A\\u0E5B\\u0F04-\\u0F12\\u0F14\\u0F3A-\\u0F3D\\u0F85\\u0FD0-\\u0FD4\\u0FD9\\u0FDA\\u104A-\\u104F\\u10FB\\u1360-\\u1368\\u1400\\u166D\\u166E\\u169B\\u169C\\u16EB-\\u16ED\\u1735\\u1736\\u17D4-\\u17D6\\u17D8-\\u17DA\\u1800-\\u180A\\u1944\\u1945\\u1A1E\\u1A1F\\u1AA0-\\u1AA6\\u1AA8-\\u1AAD\\u1B5A-\\u1B60\\u1BFC-\\u1BFF\\u1C3B-\\u1C3F\\u1C7E\\u1C7F\\u1CC0-\\u1CC7\\u1CD3\\u2010-\\u2027\\u2030-\\u2043\\u2045-\\u2051\\u2053-\\u205E\\u207D\\u207E\\u208D\\u208E\\u2308-\\u230B\\u2329\\u232A\\u2768-\\u2775\\u27C5\\u27C6\\u27E6-\\u27EF\\u2983-\\u2998\\u29D8-\\u29DB\\u29FC\\u29FD\\u2CF9-\\u2CFC\\u2CFE\\u2CFF\\u2D70\\u2E00-\\u2E2E\\u2E30-\\u2E42\\u3001-\\u3003\\u3008-\\u3011\\u3014-\\u301F\\u3030\\u303D\\u30A0\\u30FB\\uA4FE\\uA4FF\\uA60D-\\uA60F\\uA673\\uA67E\\uA6F2-\\uA6F7\\uA874-\\uA877\\uA8CE\\uA8CF\\uA8F8-\\uA8FA\\uA8FC\\uA92E\\uA92F\\uA95F\\uA9C1-\\uA9CD\\uA9DE\\uA9DF\\uAA5C-\\uAA5F\\uAADE\\uAADF\\uAAF0\\uAAF1\\uABEB\\uFD3E\\uFD3F\\uFE10-\\uFE19\\uFE30-\\uFE52\\uFE54-\\uFE61\\uFE63\\uFE68\\uFE6A\\uFE6B\\uFF01-\\uFF03\\uFF05-\\uFF0A\\uFF0C-\\uFF0F\\uFF1A\\uFF1B\\uFF1F\\uFF20\\uFF3B-\\uFF3D\\uFF3F\\uFF5B\\uFF5D\\uFF5F-\\uFF65]|\\uD800[\\uDD00-\\uDD02\\uDF9F\\uDFD0]|\\uD801\\uDD6F|\\uD802[\\uDC57\\uDD1F\\uDD3F\\uDE50-\\uDE58\\uDE7F\\uDEF0-\\uDEF6\\uDF39-\\uDF3F\\uDF99-\\uDF9C]|\\uD804[\\uDC47-\\uDC4D\\uDCBB\\uDCBC\\uDCBE-\\uDCC1\\uDD40-\\uDD43\\uDD74\\uDD75\\uDDC5-\\uDDC9\\uDDCD\\uDDDB\\uDDDD-\\uDDDF\\uDE38-\\uDE3D\\uDEA9]|\\uD805[\\uDCC6\\uDDC1-\\uDDD7\\uDE41-\\uDE43\\uDF3C-\\uDF3E]|\\uD809[\\uDC70-\\uDC74]|\\uD81A[\\uDE6E\\uDE6F\\uDEF5\\uDF37-\\uDF3B\\uDF44]|\\uD82F\\uDC9F|\\uD836[\\uDE87-\\uDE8B]/\n , expandedTab = \" \" // CommonMark specifies tab as 4 spaces\n\n function switchInline(stream, state, f) {\n state.f = state.inline = f;\n return f(stream, state);\n }\n\n function switchBlock(stream, state, f) {\n state.f = state.block = f;\n return f(stream, state);\n }\n\n function lineIsEmpty(line) {\n return !line || !/\\S/.test(line.string)\n }\n\n // Blocks\n\n function blankLine(state) {\n // Reset linkTitle state\n state.linkTitle = false;\n state.linkHref = false;\n state.linkText = false;\n // Reset EM state\n state.em = false;\n // Reset STRONG state\n state.strong = false;\n // Reset strikethrough state\n state.strikethrough = false;\n // Reset state.quote\n state.quote = 0;\n // Reset state.indentedCode\n state.indentedCode = false;\n if (state.f == htmlBlock) {\n var exit = htmlModeMissing\n if (!exit) {\n var inner = CodeMirror.innerMode(htmlMode, state.htmlState)\n exit = inner.mode.name == \"xml\" && inner.state.tagStart === null &&\n (!inner.state.context && inner.state.tokenize.isInText)\n }\n if (exit) {\n state.f = inlineNormal;\n state.block = blockNormal;\n state.htmlState = null;\n }\n }\n // Reset state.trailingSpace\n state.trailingSpace = 0;\n state.trailingSpaceNewLine = false;\n // Mark this line as blank\n state.prevLine = state.thisLine\n state.thisLine = {stream: null}\n return null;\n }\n\n function blockNormal(stream, state) {\n var firstTokenOnLine = stream.column() === state.indentation;\n var prevLineLineIsEmpty = lineIsEmpty(state.prevLine.stream);\n var prevLineIsIndentedCode = state.indentedCode;\n var prevLineIsHr = state.prevLine.hr;\n var prevLineIsList = state.list !== false;\n var maxNonCodeIndentation = (state.listStack[state.listStack.length - 1] || 0) + 3;\n\n state.indentedCode = false;\n\n var lineIndentation = state.indentation;\n // compute once per line (on first token)\n if (state.indentationDiff === null) {\n state.indentationDiff = state.indentation;\n if (prevLineIsList) {\n state.list = null;\n // While this list item's marker's indentation is less than the deepest\n // list item's content's indentation,pop the deepest list item\n // indentation off the stack, and update block indentation state\n while (lineIndentation < state.listStack[state.listStack.length - 1]) {\n state.listStack.pop();\n if (state.listStack.length) {\n state.indentation = state.listStack[state.listStack.length - 1];\n // less than the first list's indent -> the line is no longer a list\n } else {\n state.list = false;\n }\n }\n if (state.list !== false) {\n state.indentationDiff = lineIndentation - state.listStack[state.listStack.length - 1]\n }\n }\n }\n\n // not comprehensive (currently only for setext detection purposes)\n var allowsInlineContinuation = (\n !prevLineLineIsEmpty && !prevLineIsHr && !state.prevLine.header &&\n (!prevLineIsList || !prevLineIsIndentedCode) &&\n !state.prevLine.fencedCodeEnd\n );\n\n var isHr = (state.list === false || prevLineIsHr || prevLineLineIsEmpty) &&\n state.indentation <= maxNonCodeIndentation && stream.match(hrRE);\n\n var match = null;\n if (state.indentationDiff >= 4 && (prevLineIsIndentedCode || state.prevLine.fencedCodeEnd ||\n state.prevLine.header || prevLineLineIsEmpty)) {\n stream.skipToEnd();\n state.indentedCode = true;\n return tokenTypes.code;\n } else if (stream.eatSpace()) {\n return null;\n } else if (firstTokenOnLine && state.indentation <= maxNonCodeIndentation && (match = stream.match(atxHeaderRE)) && match[1].length <= 6) {\n state.quote = 0;\n state.header = match[1].length;\n state.thisLine.header = true;\n if (modeCfg.highlightFormatting) state.formatting = \"header\";\n state.f = state.inline;\n return getType(state);\n } else if (state.indentation <= maxNonCodeIndentation && stream.eat('>')) {\n state.quote = firstTokenOnLine ? 1 : state.quote + 1;\n if (modeCfg.highlightFormatting) state.formatting = \"quote\";\n stream.eatSpace();\n return getType(state);\n } else if (!isHr && !state.setext && firstTokenOnLine && state.indentation <= maxNonCodeIndentation && (match = stream.match(listRE))) {\n var listType = match[1] ? \"ol\" : \"ul\";\n\n state.indentation = lineIndentation + stream.current().length;\n state.list = true;\n state.quote = 0;\n\n // Add this list item's content's indentation to the stack\n state.listStack.push(state.indentation);\n // Reset inline styles which shouldn't propagate across list items\n state.em = false;\n state.strong = false;\n state.code = false;\n state.strikethrough = false;\n\n if (modeCfg.taskLists && stream.match(taskListRE, false)) {\n state.taskList = true;\n }\n state.f = state.inline;\n if (modeCfg.highlightFormatting) state.formatting = [\"list\", \"list-\" + listType];\n return getType(state);\n } else if (firstTokenOnLine && state.indentation <= maxNonCodeIndentation && (match = stream.match(fencedCodeRE, true))) {\n state.quote = 0;\n state.fencedEndRE = new RegExp(match[1] + \"+ *$\");\n // try switching mode\n state.localMode = modeCfg.fencedCodeBlockHighlighting && getMode(match[2] || modeCfg.fencedCodeBlockDefaultMode );\n if (state.localMode) state.localState = CodeMirror.startState(state.localMode);\n state.f = state.block = local;\n if (modeCfg.highlightFormatting) state.formatting = \"code-block\";\n state.code = -1\n return getType(state);\n // SETEXT has lowest block-scope precedence after HR, so check it after\n // the others (code, blockquote, list...)\n } else if (\n // if setext set, indicates line after ---/===\n state.setext || (\n // line before ---/===\n (!allowsInlineContinuation || !prevLineIsList) && !state.quote && state.list === false &&\n !state.code && !isHr && !linkDefRE.test(stream.string) &&\n (match = stream.lookAhead(1)) && (match = match.match(setextHeaderRE))\n )\n ) {\n if ( !state.setext ) {\n state.header = match[0].charAt(0) == '=' ? 1 : 2;\n state.setext = state.header;\n } else {\n state.header = state.setext;\n // has no effect on type so we can reset it now\n state.setext = 0;\n stream.skipToEnd();\n if (modeCfg.highlightFormatting) state.formatting = \"header\";\n }\n state.thisLine.header = true;\n state.f = state.inline;\n return getType(state);\n } else if (isHr) {\n stream.skipToEnd();\n state.hr = true;\n state.thisLine.hr = true;\n return tokenTypes.hr;\n } else if (stream.peek() === '[') {\n return switchInline(stream, state, footnoteLink);\n }\n\n return switchInline(stream, state, state.inline);\n }\n\n function htmlBlock(stream, state) {\n var style = htmlMode.token(stream, state.htmlState);\n if (!htmlModeMissing) {\n var inner = CodeMirror.innerMode(htmlMode, state.htmlState)\n if ((inner.mode.name == \"xml\" && inner.state.tagStart === null &&\n (!inner.state.context && inner.state.tokenize.isInText)) ||\n (state.md_inside && stream.current().indexOf(\">\") > -1)) {\n state.f = inlineNormal;\n state.block = blockNormal;\n state.htmlState = null;\n }\n }\n return style;\n }\n\n function local(stream, state) {\n var currListInd = state.listStack[state.listStack.length - 1] || 0;\n var hasExitedList = state.indentation < currListInd;\n var maxFencedEndInd = currListInd + 3;\n if (state.fencedEndRE && state.indentation <= maxFencedEndInd && (hasExitedList || stream.match(state.fencedEndRE))) {\n if (modeCfg.highlightFormatting) state.formatting = \"code-block\";\n var returnType;\n if (!hasExitedList) returnType = getType(state)\n state.localMode = state.localState = null;\n state.block = blockNormal;\n state.f = inlineNormal;\n state.fencedEndRE = null;\n state.code = 0\n state.thisLine.fencedCodeEnd = true;\n if (hasExitedList) return switchBlock(stream, state, state.block);\n return returnType;\n } else if (state.localMode) {\n return state.localMode.token(stream, state.localState);\n } else {\n stream.skipToEnd();\n return tokenTypes.code;\n }\n }\n\n // Inline\n function getType(state) {\n var styles = [];\n\n if (state.formatting) {\n styles.push(tokenTypes.formatting);\n\n if (typeof state.formatting === \"string\") state.formatting = [state.formatting];\n\n for (var i = 0; i < state.formatting.length; i++) {\n styles.push(tokenTypes.formatting + \"-\" + state.formatting[i]);\n\n if (state.formatting[i] === \"header\") {\n styles.push(tokenTypes.formatting + \"-\" + state.formatting[i] + \"-\" + state.header);\n }\n\n // Add `formatting-quote` and `formatting-quote-#` for blockquotes\n // Add `error` instead if the maximum blockquote nesting depth is passed\n if (state.formatting[i] === \"quote\") {\n if (!modeCfg.maxBlockquoteDepth || modeCfg.maxBlockquoteDepth >= state.quote) {\n styles.push(tokenTypes.formatting + \"-\" + state.formatting[i] + \"-\" + state.quote);\n } else {\n styles.push(\"error\");\n }\n }\n }\n }\n\n if (state.taskOpen) {\n styles.push(\"meta\");\n return styles.length ? styles.join(' ') : null;\n }\n if (state.taskClosed) {\n styles.push(\"property\");\n return styles.length ? styles.join(' ') : null;\n }\n\n if (state.linkHref) {\n styles.push(tokenTypes.linkHref, \"url\");\n } else { // Only apply inline styles to non-url text\n if (state.strong) { styles.push(tokenTypes.strong); }\n if (state.em) { styles.push(tokenTypes.em); }\n if (state.strikethrough) { styles.push(tokenTypes.strikethrough); }\n if (state.emoji) { styles.push(tokenTypes.emoji); }\n if (state.linkText) { styles.push(tokenTypes.linkText); }\n if (state.code) { styles.push(tokenTypes.code); }\n if (state.image) { styles.push(tokenTypes.image); }\n if (state.imageAltText) { styles.push(tokenTypes.imageAltText, \"link\"); }\n if (state.imageMarker) { styles.push(tokenTypes.imageMarker); }\n }\n\n if (state.header) { styles.push(tokenTypes.header, tokenTypes.header + \"-\" + state.header); }\n\n if (state.quote) {\n styles.push(tokenTypes.quote);\n\n // Add `quote-#` where the maximum for `#` is modeCfg.maxBlockquoteDepth\n if (!modeCfg.maxBlockquoteDepth || modeCfg.maxBlockquoteDepth >= state.quote) {\n styles.push(tokenTypes.quote + \"-\" + state.quote);\n } else {\n styles.push(tokenTypes.quote + \"-\" + modeCfg.maxBlockquoteDepth);\n }\n }\n\n if (state.list !== false) {\n var listMod = (state.listStack.length - 1) % 3;\n if (!listMod) {\n styles.push(tokenTypes.list1);\n } else if (listMod === 1) {\n styles.push(tokenTypes.list2);\n } else {\n styles.push(tokenTypes.list3);\n }\n }\n\n if (state.trailingSpaceNewLine) {\n styles.push(\"trailing-space-new-line\");\n } else if (state.trailingSpace) {\n styles.push(\"trailing-space-\" + (state.trailingSpace % 2 ? \"a\" : \"b\"));\n }\n\n return styles.length ? styles.join(' ') : null;\n }\n\n function handleText(stream, state) {\n if (stream.match(textRE, true)) {\n return getType(state);\n }\n return undefined;\n }\n\n function inlineNormal(stream, state) {\n var style = state.text(stream, state);\n if (typeof style !== 'undefined')\n return style;\n\n if (state.list) { // List marker (*, +, -, 1., etc)\n state.list = null;\n return getType(state);\n }\n\n if (state.taskList) {\n var taskOpen = stream.match(taskListRE, true)[1] === \" \";\n if (taskOpen) state.taskOpen = true;\n else state.taskClosed = true;\n if (modeCfg.highlightFormatting) state.formatting = \"task\";\n state.taskList = false;\n return getType(state);\n }\n\n state.taskOpen = false;\n state.taskClosed = false;\n\n if (state.header && stream.match(/^#+$/, true)) {\n if (modeCfg.highlightFormatting) state.formatting = \"header\";\n return getType(state);\n }\n\n var ch = stream.next();\n\n // Matches link titles present on next line\n if (state.linkTitle) {\n state.linkTitle = false;\n var matchCh = ch;\n if (ch === '(') {\n matchCh = ')';\n }\n matchCh = (matchCh+'').replace(/([.?*+^\\[\\]\\\\(){}|-])/g, \"\\\\$1\");\n var regex = '^\\\\s*(?:[^' + matchCh + '\\\\\\\\]+|\\\\\\\\\\\\\\\\|\\\\\\\\.)' + matchCh;\n if (stream.match(new RegExp(regex), true)) {\n return tokenTypes.linkHref;\n }\n }\n\n // If this block is changed, it may need to be updated in GFM mode\n if (ch === '`') {\n var previousFormatting = state.formatting;\n if (modeCfg.highlightFormatting) state.formatting = \"code\";\n stream.eatWhile('`');\n var count = stream.current().length\n if (state.code == 0 && (!state.quote || count == 1)) {\n state.code = count\n return getType(state)\n } else if (count == state.code) { // Must be exact\n var t = getType(state)\n state.code = 0\n return t\n } else {\n state.formatting = previousFormatting\n return getType(state)\n }\n } else if (state.code) {\n return getType(state);\n }\n\n if (ch === '\\\\') {\n stream.next();\n if (modeCfg.highlightFormatting) {\n var type = getType(state);\n var formattingEscape = tokenTypes.formatting + \"-escape\";\n return type ? type + \" \" + formattingEscape : formattingEscape;\n }\n }\n\n if (ch === '!' && stream.match(/\\[[^\\]]*\\] ?(?:\\(|\\[)/, false)) {\n state.imageMarker = true;\n state.image = true;\n if (modeCfg.highlightFormatting) state.formatting = \"image\";\n return getType(state);\n }\n\n if (ch === '[' && state.imageMarker && stream.match(/[^\\]]*\\](\\(.*?\\)| ?\\[.*?\\])/, false)) {\n state.imageMarker = false;\n state.imageAltText = true\n if (modeCfg.highlightFormatting) state.formatting = \"image\";\n return getType(state);\n }\n\n if (ch === ']' && state.imageAltText) {\n if (modeCfg.highlightFormatting) state.formatting = \"image\";\n var type = getType(state);\n state.imageAltText = false;\n state.image = false;\n state.inline = state.f = linkHref;\n return type;\n }\n\n if (ch === '[' && !state.image) {\n if (state.linkText && stream.match(/^.*?\\]/)) return getType(state)\n state.linkText = true;\n if (modeCfg.highlightFormatting) state.formatting = \"link\";\n return getType(state);\n }\n\n if (ch === ']' && state.linkText) {\n if (modeCfg.highlightFormatting) state.formatting = \"link\";\n var type = getType(state);\n state.linkText = false;\n state.inline = state.f = stream.match(/\\(.*?\\)| ?\\[.*?\\]/, false) ? linkHref : inlineNormal\n return type;\n }\n\n if (ch === '<' && stream.match(/^(https?|ftps?):\\/\\/(?:[^\\\\>]|\\\\.)+>/, false)) {\n state.f = state.inline = linkInline;\n if (modeCfg.highlightFormatting) state.formatting = \"link\";\n var type = getType(state);\n if (type){\n type += \" \";\n } else {\n type = \"\";\n }\n return type + tokenTypes.linkInline;\n }\n\n if (ch === '<' && stream.match(/^[^> \\\\]+@(?:[^\\\\>]|\\\\.)+>/, false)) {\n state.f = state.inline = linkInline;\n if (modeCfg.highlightFormatting) state.formatting = \"link\";\n var type = getType(state);\n if (type){\n type += \" \";\n } else {\n type = \"\";\n }\n return type + tokenTypes.linkEmail;\n }\n\n if (modeCfg.xml && ch === '<' && stream.match(/^(!--|\\?|!\\[CDATA\\[|[a-z][a-z0-9-]*(?:\\s+[a-z_:.\\-]+(?:\\s*=\\s*[^>]+)?)*\\s*(?:>|$))/i, false)) {\n var end = stream.string.indexOf(\">\", stream.pos);\n if (end != -1) {\n var atts = stream.string.substring(stream.start, end);\n if (/markdown\\s*=\\s*('|\"){0,1}1('|\"){0,1}/.test(atts)) state.md_inside = true;\n }\n stream.backUp(1);\n state.htmlState = CodeMirror.startState(htmlMode);\n return switchBlock(stream, state, htmlBlock);\n }\n\n if (modeCfg.xml && ch === '<' && stream.match(/^\\/\\w*?>/)) {\n state.md_inside = false;\n return \"tag\";\n } else if (ch === \"*\" || ch === \"_\") {\n var len = 1, before = stream.pos == 1 ? \" \" : stream.string.charAt(stream.pos - 2)\n while (len < 3 && stream.eat(ch)) len++\n var after = stream.peek() || \" \"\n // See http://spec.commonmark.org/0.27/#emphasis-and-strong-emphasis\n var leftFlanking = !/\\s/.test(after) && (!punctuation.test(after) || /\\s/.test(before) || punctuation.test(before))\n var rightFlanking = !/\\s/.test(before) && (!punctuation.test(before) || /\\s/.test(after) || punctuation.test(after))\n var setEm = null, setStrong = null\n if (len % 2) { // Em\n if (!state.em && leftFlanking && (ch === \"*\" || !rightFlanking || punctuation.test(before)))\n setEm = true\n else if (state.em == ch && rightFlanking && (ch === \"*\" || !leftFlanking || punctuation.test(after)))\n setEm = false\n }\n if (len > 1) { // Strong\n if (!state.strong && leftFlanking && (ch === \"*\" || !rightFlanking || punctuation.test(before)))\n setStrong = true\n else if (state.strong == ch && rightFlanking && (ch === \"*\" || !leftFlanking || punctuation.test(after)))\n setStrong = false\n }\n if (setStrong != null || setEm != null) {\n if (modeCfg.highlightFormatting) state.formatting = setEm == null ? \"strong\" : setStrong == null ? \"em\" : \"strong em\"\n if (setEm === true) state.em = ch\n if (setStrong === true) state.strong = ch\n var t = getType(state)\n if (setEm === false) state.em = false\n if (setStrong === false) state.strong = false\n return t\n }\n } else if (ch === ' ') {\n if (stream.eat('*') || stream.eat('_')) { // Probably surrounded by spaces\n if (stream.peek() === ' ') { // Surrounded by spaces, ignore\n return getType(state);\n } else { // Not surrounded by spaces, back up pointer\n stream.backUp(1);\n }\n }\n }\n\n if (modeCfg.strikethrough) {\n if (ch === '~' && stream.eatWhile(ch)) {\n if (state.strikethrough) {// Remove strikethrough\n if (modeCfg.highlightFormatting) state.formatting = \"strikethrough\";\n var t = getType(state);\n state.strikethrough = false;\n return t;\n } else if (stream.match(/^[^\\s]/, false)) {// Add strikethrough\n state.strikethrough = true;\n if (modeCfg.highlightFormatting) state.formatting = \"strikethrough\";\n return getType(state);\n }\n } else if (ch === ' ') {\n if (stream.match('~~', true)) { // Probably surrounded by space\n if (stream.peek() === ' ') { // Surrounded by spaces, ignore\n return getType(state);\n } else { // Not surrounded by spaces, back up pointer\n stream.backUp(2);\n }\n }\n }\n }\n\n if (modeCfg.emoji && ch === \":\" && stream.match(/^(?:[a-z_\\d+][a-z_\\d+-]*|\\-[a-z_\\d+][a-z_\\d+-]*):/)) {\n state.emoji = true;\n if (modeCfg.highlightFormatting) state.formatting = \"emoji\";\n var retType = getType(state);\n state.emoji = false;\n return retType;\n }\n\n if (ch === ' ') {\n if (stream.match(/^ +$/, false)) {\n state.trailingSpace++;\n } else if (state.trailingSpace) {\n state.trailingSpaceNewLine = true;\n }\n }\n\n return getType(state);\n }\n\n function linkInline(stream, state) {\n var ch = stream.next();\n\n if (ch === \">\") {\n state.f = state.inline = inlineNormal;\n if (modeCfg.highlightFormatting) state.formatting = \"link\";\n var type = getType(state);\n if (type){\n type += \" \";\n } else {\n type = \"\";\n }\n return type + tokenTypes.linkInline;\n }\n\n stream.match(/^[^>]+/, true);\n\n return tokenTypes.linkInline;\n }\n\n function linkHref(stream, state) {\n // Check if space, and return NULL if so (to avoid marking the space)\n if(stream.eatSpace()){\n return null;\n }\n var ch = stream.next();\n if (ch === '(' || ch === '[') {\n state.f = state.inline = getLinkHrefInside(ch === \"(\" ? \")\" : \"]\");\n if (modeCfg.highlightFormatting) state.formatting = \"link-string\";\n state.linkHref = true;\n return getType(state);\n }\n return 'error';\n }\n\n var linkRE = {\n \")\": /^(?:[^\\\\\\(\\)]|\\\\.|\\((?:[^\\\\\\(\\)]|\\\\.)*\\))*?(?=\\))/,\n \"]\": /^(?:[^\\\\\\[\\]]|\\\\.|\\[(?:[^\\\\\\[\\]]|\\\\.)*\\])*?(?=\\])/\n }\n\n function getLinkHrefInside(endChar) {\n return function(stream, state) {\n var ch = stream.next();\n\n if (ch === endChar) {\n state.f = state.inline = inlineNormal;\n if (modeCfg.highlightFormatting) state.formatting = \"link-string\";\n var returnState = getType(state);\n state.linkHref = false;\n return returnState;\n }\n\n stream.match(linkRE[endChar])\n state.linkHref = true;\n return getType(state);\n };\n }\n\n function footnoteLink(stream, state) {\n if (stream.match(/^([^\\]\\\\]|\\\\.)*\\]:/, false)) {\n state.f = footnoteLinkInside;\n stream.next(); // Consume [\n if (modeCfg.highlightFormatting) state.formatting = \"link\";\n state.linkText = true;\n return getType(state);\n }\n return switchInline(stream, state, inlineNormal);\n }\n\n function footnoteLinkInside(stream, state) {\n if (stream.match(']:', true)) {\n state.f = state.inline = footnoteUrl;\n if (modeCfg.highlightFormatting) state.formatting = \"link\";\n var returnType = getType(state);\n state.linkText = false;\n return returnType;\n }\n\n stream.match(/^([^\\]\\\\]|\\\\.)+/, true);\n\n return tokenTypes.linkText;\n }\n\n function footnoteUrl(stream, state) {\n // Check if space, and return NULL if so (to avoid marking the space)\n if(stream.eatSpace()){\n return null;\n }\n // Match URL\n stream.match(/^[^\\s]+/, true);\n // Check for link title\n if (stream.peek() === undefined) { // End of line, set flag to check next line\n state.linkTitle = true;\n } else { // More content on line, check if link title\n stream.match(/^(?:\\s+(?:\"(?:[^\"\\\\]|\\\\.)+\"|'(?:[^'\\\\]|\\\\.)+'|\\((?:[^)\\\\]|\\\\.)+\\)))?/, true);\n }\n state.f = state.inline = inlineNormal;\n return tokenTypes.linkHref + \" url\";\n }\n\n var mode = {\n startState: function() {\n return {\n f: blockNormal,\n\n prevLine: {stream: null},\n thisLine: {stream: null},\n\n block: blockNormal,\n htmlState: null,\n indentation: 0,\n\n inline: inlineNormal,\n text: handleText,\n\n formatting: false,\n linkText: false,\n linkHref: false,\n linkTitle: false,\n code: 0,\n em: false,\n strong: false,\n header: 0,\n setext: 0,\n hr: false,\n taskList: false,\n list: false,\n listStack: [],\n quote: 0,\n trailingSpace: 0,\n trailingSpaceNewLine: false,\n strikethrough: false,\n emoji: false,\n fencedEndRE: null\n };\n },\n\n copyState: function(s) {\n return {\n f: s.f,\n\n prevLine: s.prevLine,\n thisLine: s.thisLine,\n\n block: s.block,\n htmlState: s.htmlState && CodeMirror.copyState(htmlMode, s.htmlState),\n indentation: s.indentation,\n\n localMode: s.localMode,\n localState: s.localMode ? CodeMirror.copyState(s.localMode, s.localState) : null,\n\n inline: s.inline,\n text: s.text,\n formatting: false,\n linkText: s.linkText,\n linkTitle: s.linkTitle,\n linkHref: s.linkHref,\n code: s.code,\n em: s.em,\n strong: s.strong,\n strikethrough: s.strikethrough,\n emoji: s.emoji,\n header: s.header,\n setext: s.setext,\n hr: s.hr,\n taskList: s.taskList,\n list: s.list,\n listStack: s.listStack.slice(0),\n quote: s.quote,\n indentedCode: s.indentedCode,\n trailingSpace: s.trailingSpace,\n trailingSpaceNewLine: s.trailingSpaceNewLine,\n md_inside: s.md_inside,\n fencedEndRE: s.fencedEndRE\n };\n },\n\n token: function(stream, state) {\n\n // Reset state.formatting\n state.formatting = false;\n\n if (stream != state.thisLine.stream) {\n state.header = 0;\n state.hr = false;\n\n if (stream.match(/^\\s*$/, true)) {\n blankLine(state);\n return null;\n }\n\n state.prevLine = state.thisLine\n state.thisLine = {stream: stream}\n\n // Reset state.taskList\n state.taskList = false;\n\n // Reset state.trailingSpace\n state.trailingSpace = 0;\n state.trailingSpaceNewLine = false;\n\n if (!state.localState) {\n state.f = state.block;\n if (state.f != htmlBlock) {\n var indentation = stream.match(/^\\s*/, true)[0].replace(/\\t/g, expandedTab).length;\n state.indentation = indentation;\n state.indentationDiff = null;\n if (indentation > 0) return null;\n }\n }\n }\n return state.f(stream, state);\n },\n\n innerMode: function(state) {\n if (state.block == htmlBlock) return {state: state.htmlState, mode: htmlMode};\n if (state.localState) return {state: state.localState, mode: state.localMode};\n return {state: state, mode: mode};\n },\n\n indent: function(state, textAfter, line) {\n if (state.block == htmlBlock && htmlMode.indent) return htmlMode.indent(state.htmlState, textAfter, line)\n if (state.localState && state.localMode.indent) return state.localMode.indent(state.localState, textAfter, line)\n return CodeMirror.Pass\n },\n\n blankLine: blankLine,\n\n getType: getType,\n\n blockCommentStart: \"\",\n closeBrackets: \"()[]{}''\\\"\\\"``\",\n fold: \"markdown\"\n };\n return mode;\n}, \"xml\");\n\nCodeMirror.defineMIME(\"text/markdown\", \"markdown\");\n\nCodeMirror.defineMIME(\"text/x-markdown\", \"markdown\");\n\n});\n","// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/5/LICENSE\n\n// Utility function that allows modes to be combined. The mode given\n// as the base argument takes care of most of the normal mode\n// functionality, but a second (typically simple) mode is used, which\n// can override the style of text. Both modes get to parse all of the\n// text, but when both assign a non-null style to a piece of code, the\n// overlay wins, unless the combine argument was true and not overridden,\n// or state.overlay.combineTokens was true, in which case the styles are\n// combined.\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.overlayMode = function(base, overlay, combine) {\n return {\n startState: function() {\n return {\n base: CodeMirror.startState(base),\n overlay: CodeMirror.startState(overlay),\n basePos: 0, baseCur: null,\n overlayPos: 0, overlayCur: null,\n streamSeen: null\n };\n },\n copyState: function(state) {\n return {\n base: CodeMirror.copyState(base, state.base),\n overlay: CodeMirror.copyState(overlay, state.overlay),\n basePos: state.basePos, baseCur: null,\n overlayPos: state.overlayPos, overlayCur: null\n };\n },\n\n token: function(stream, state) {\n if (stream != state.streamSeen ||\n Math.min(state.basePos, state.overlayPos) < stream.start) {\n state.streamSeen = stream;\n state.basePos = state.overlayPos = stream.start;\n }\n\n if (stream.start == state.basePos) {\n state.baseCur = base.token(stream, state.base);\n state.basePos = stream.pos;\n }\n if (stream.start == state.overlayPos) {\n stream.pos = stream.start;\n state.overlayCur = overlay.token(stream, state.overlay);\n state.overlayPos = stream.pos;\n }\n stream.pos = Math.min(state.basePos, state.overlayPos);\n\n // state.overlay.combineTokens always takes precedence over combine,\n // unless set to null\n if (state.overlayCur == null) return state.baseCur;\n else if (state.baseCur != null &&\n state.overlay.combineTokens ||\n combine && state.overlay.combineTokens == null)\n return state.baseCur + \" \" + state.overlayCur;\n else return state.overlayCur;\n },\n\n indent: base.indent && function(state, textAfter, line) {\n return base.indent(state.base, textAfter, line);\n },\n electricChars: base.electricChars,\n\n innerMode: function(state) { return {state: state.base, mode: base}; },\n\n blankLine: function(state) {\n var baseToken, overlayToken;\n if (base.blankLine) baseToken = base.blankLine(state.base);\n if (overlay.blankLine) overlayToken = overlay.blankLine(state.overlay);\n\n return overlayToken == null ?\n baseToken :\n (combine && baseToken != null ? baseToken + \" \" + overlayToken : overlayToken);\n }\n };\n};\n\n});\n","// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/5/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 CodeMirror.defineOption(\"placeholder\", \"\", function(cm, val, old) {\n var prev = old && old != CodeMirror.Init;\n if (val && !prev) {\n cm.on(\"blur\", onBlur);\n cm.on(\"change\", onChange);\n cm.on(\"swapDoc\", onChange);\n CodeMirror.on(cm.getInputField(), \"compositionupdate\", cm.state.placeholderCompose = function() { onComposition(cm) })\n onChange(cm);\n } else if (!val && prev) {\n cm.off(\"blur\", onBlur);\n cm.off(\"change\", onChange);\n cm.off(\"swapDoc\", onChange);\n CodeMirror.off(cm.getInputField(), \"compositionupdate\", cm.state.placeholderCompose)\n clearPlaceholder(cm);\n var wrapper = cm.getWrapperElement();\n wrapper.className = wrapper.className.replace(\" CodeMirror-empty\", \"\");\n }\n\n if (val && !cm.hasFocus()) onBlur(cm);\n });\n\n function clearPlaceholder(cm) {\n if (cm.state.placeholder) {\n cm.state.placeholder.parentNode.removeChild(cm.state.placeholder);\n cm.state.placeholder = null;\n }\n }\n function setPlaceholder(cm) {\n clearPlaceholder(cm);\n var elt = cm.state.placeholder = document.createElement(\"pre\");\n elt.style.cssText = \"height: 0; overflow: visible\";\n elt.style.direction = cm.getOption(\"direction\");\n elt.className = \"CodeMirror-placeholder CodeMirror-line-like\";\n var placeHolder = cm.getOption(\"placeholder\")\n if (typeof placeHolder == \"string\") placeHolder = document.createTextNode(placeHolder)\n elt.appendChild(placeHolder)\n cm.display.lineSpace.insertBefore(elt, cm.display.lineSpace.firstChild);\n }\n\n function onComposition(cm) {\n setTimeout(function() {\n var empty = false\n if (cm.lineCount() == 1) {\n var input = cm.getInputField()\n empty = input.nodeName == \"TEXTAREA\" ? !cm.getLine(0).length\n : !/[^\\u200b]/.test(input.querySelector(\".CodeMirror-line\").textContent)\n }\n if (empty) setPlaceholder(cm)\n else clearPlaceholder(cm)\n }, 20)\n }\n\n function onBlur(cm) {\n if (isEmpty(cm)) setPlaceholder(cm);\n }\n function onChange(cm) {\n var wrapper = cm.getWrapperElement(), empty = isEmpty(cm);\n wrapper.className = wrapper.className.replace(\" CodeMirror-empty\", \"\") + (empty ? \" CodeMirror-empty\" : \"\");\n\n if (empty) setPlaceholder(cm);\n else clearPlaceholder(cm);\n }\n\n function isEmpty(cm) {\n return (cm.lineCount() === 1) && (cm.getLine(0) === \"\");\n }\n});\n","// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/5/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.defineOption(\"autoRefresh\", false, function(cm, val) {\n if (cm.state.autoRefresh) {\n stopListening(cm, cm.state.autoRefresh)\n cm.state.autoRefresh = null\n }\n if (val && cm.display.wrapper.offsetHeight == 0)\n startListening(cm, cm.state.autoRefresh = {delay: val.delay || 250})\n })\n\n function startListening(cm, state) {\n function check() {\n if (cm.display.wrapper.offsetHeight) {\n stopListening(cm, state)\n if (cm.display.lastWrapHeight != cm.display.wrapper.clientHeight)\n cm.refresh()\n } else {\n state.timeout = setTimeout(check, state.delay)\n }\n }\n state.timeout = setTimeout(check, state.delay)\n state.hurry = function() {\n clearTimeout(state.timeout)\n state.timeout = setTimeout(check, 50)\n }\n CodeMirror.on(window, \"mouseup\", state.hurry)\n CodeMirror.on(window, \"keyup\", state.hurry)\n }\n\n function stopListening(_cm, state) {\n clearTimeout(state.timeout)\n CodeMirror.off(window, \"mouseup\", state.hurry)\n CodeMirror.off(window, \"keyup\", state.hurry)\n }\n});\n","// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/5/LICENSE\n\n// Because sometimes you need to mark the selected *text*.\n//\n// Adds an option 'styleSelectedText' which, when enabled, gives\n// selected text the CSS class given as option value, or\n// \"CodeMirror-selectedtext\" when the value is not a string.\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.defineOption(\"styleSelectedText\", false, function(cm, val, old) {\n var prev = old && old != CodeMirror.Init;\n if (val && !prev) {\n cm.state.markedSelection = [];\n cm.state.markedSelectionStyle = typeof val == \"string\" ? val : \"CodeMirror-selectedtext\";\n reset(cm);\n cm.on(\"cursorActivity\", onCursorActivity);\n cm.on(\"change\", onChange);\n } else if (!val && prev) {\n cm.off(\"cursorActivity\", onCursorActivity);\n cm.off(\"change\", onChange);\n clear(cm);\n cm.state.markedSelection = cm.state.markedSelectionStyle = null;\n }\n });\n\n function onCursorActivity(cm) {\n if (cm.state.markedSelection)\n cm.operation(function() { update(cm); });\n }\n\n function onChange(cm) {\n if (cm.state.markedSelection && cm.state.markedSelection.length)\n cm.operation(function() { clear(cm); });\n }\n\n var CHUNK_SIZE = 8;\n var Pos = CodeMirror.Pos;\n var cmp = CodeMirror.cmpPos;\n\n function coverRange(cm, from, to, addAt) {\n if (cmp(from, to) == 0) return;\n var array = cm.state.markedSelection;\n var cls = cm.state.markedSelectionStyle;\n for (var line = from.line;;) {\n var start = line == from.line ? from : Pos(line, 0);\n var endLine = line + CHUNK_SIZE, atEnd = endLine >= to.line;\n var end = atEnd ? to : Pos(endLine, 0);\n var mark = cm.markText(start, end, {className: cls});\n if (addAt == null) array.push(mark);\n else array.splice(addAt++, 0, mark);\n if (atEnd) break;\n line = endLine;\n }\n }\n\n function clear(cm) {\n var array = cm.state.markedSelection;\n for (var i = 0; i < array.length; ++i) array[i].clear();\n array.length = 0;\n }\n\n function reset(cm) {\n clear(cm);\n var ranges = cm.listSelections();\n for (var i = 0; i < ranges.length; i++)\n coverRange(cm, ranges[i].from(), ranges[i].to());\n }\n\n function update(cm) {\n if (!cm.somethingSelected()) return clear(cm);\n if (cm.listSelections().length > 1) return reset(cm);\n\n var from = cm.getCursor(\"start\"), to = cm.getCursor(\"end\");\n\n var array = cm.state.markedSelection;\n if (!array.length) return coverRange(cm, from, to);\n\n var coverStart = array[0].find(), coverEnd = array[array.length - 1].find();\n if (!coverStart || !coverEnd || to.line - from.line <= CHUNK_SIZE ||\n cmp(from, coverEnd.to) >= 0 || cmp(to, coverStart.from) <= 0)\n return reset(cm);\n\n while (cmp(from, coverStart.from) > 0) {\n array.shift().clear();\n coverStart = array[0].find();\n }\n if (cmp(from, coverStart.from) < 0) {\n if (coverStart.to.line - from.line < CHUNK_SIZE) {\n array.shift().clear();\n coverRange(cm, from, coverStart.to, 0);\n } else {\n coverRange(cm, from, coverStart.from, 0);\n }\n }\n\n while (cmp(to, coverEnd.to) < 0) {\n array.pop().clear();\n coverEnd = array[array.length - 1].find();\n }\n if (cmp(to, coverEnd.to) > 0) {\n if (to.line - coverEnd.from.line < CHUNK_SIZE) {\n array.pop().clear();\n coverRange(cm, coverEnd.from, to);\n } else {\n coverRange(cm, coverEnd.to, to);\n }\n }\n }\n});\n","// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/5/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 var Pos = CodeMirror.Pos\n\n function regexpFlags(regexp) {\n var flags = regexp.flags\n return flags != null ? flags : (regexp.ignoreCase ? \"i\" : \"\")\n + (regexp.global ? \"g\" : \"\")\n + (regexp.multiline ? \"m\" : \"\")\n }\n\n function ensureFlags(regexp, flags) {\n var current = regexpFlags(regexp), target = current\n for (var i = 0; i < flags.length; i++) if (target.indexOf(flags.charAt(i)) == -1)\n target += flags.charAt(i)\n return current == target ? regexp : new RegExp(regexp.source, target)\n }\n\n function maybeMultiline(regexp) {\n return /\\\\s|\\\\n|\\n|\\\\W|\\\\D|\\[\\^/.test(regexp.source)\n }\n\n function searchRegexpForward(doc, regexp, start) {\n regexp = ensureFlags(regexp, \"g\")\n for (var line = start.line, ch = start.ch, last = doc.lastLine(); line <= last; line++, ch = 0) {\n regexp.lastIndex = ch\n var string = doc.getLine(line), match = regexp.exec(string)\n if (match)\n return {from: Pos(line, match.index),\n to: Pos(line, match.index + match[0].length),\n match: match}\n }\n }\n\n function searchRegexpForwardMultiline(doc, regexp, start) {\n if (!maybeMultiline(regexp)) return searchRegexpForward(doc, regexp, start)\n\n regexp = ensureFlags(regexp, \"gm\")\n var string, chunk = 1\n for (var line = start.line, last = doc.lastLine(); line <= last;) {\n // This grows the search buffer in exponentially-sized chunks\n // between matches, so that nearby matches are fast and don't\n // require concatenating the whole document (in case we're\n // searching for something that has tons of matches), but at the\n // same time, the amount of retries is limited.\n for (var i = 0; i < chunk; i++) {\n if (line > last) break\n var curLine = doc.getLine(line++)\n string = string == null ? curLine : string + \"\\n\" + curLine\n }\n chunk = chunk * 2\n regexp.lastIndex = start.ch\n var match = regexp.exec(string)\n if (match) {\n var before = string.slice(0, match.index).split(\"\\n\"), inside = match[0].split(\"\\n\")\n var startLine = start.line + before.length - 1, startCh = before[before.length - 1].length\n return {from: Pos(startLine, startCh),\n to: Pos(startLine + inside.length - 1,\n inside.length == 1 ? startCh + inside[0].length : inside[inside.length - 1].length),\n match: match}\n }\n }\n }\n\n function lastMatchIn(string, regexp, endMargin) {\n var match, from = 0\n while (from <= string.length) {\n regexp.lastIndex = from\n var newMatch = regexp.exec(string)\n if (!newMatch) break\n var end = newMatch.index + newMatch[0].length\n if (end > string.length - endMargin) break\n if (!match || end > match.index + match[0].length)\n match = newMatch\n from = newMatch.index + 1\n }\n return match\n }\n\n function searchRegexpBackward(doc, regexp, start) {\n regexp = ensureFlags(regexp, \"g\")\n for (var line = start.line, ch = start.ch, first = doc.firstLine(); line >= first; line--, ch = -1) {\n var string = doc.getLine(line)\n var match = lastMatchIn(string, regexp, ch < 0 ? 0 : string.length - ch)\n if (match)\n return {from: Pos(line, match.index),\n to: Pos(line, match.index + match[0].length),\n match: match}\n }\n }\n\n function searchRegexpBackwardMultiline(doc, regexp, start) {\n if (!maybeMultiline(regexp)) return searchRegexpBackward(doc, regexp, start)\n regexp = ensureFlags(regexp, \"gm\")\n var string, chunkSize = 1, endMargin = doc.getLine(start.line).length - start.ch\n for (var line = start.line, first = doc.firstLine(); line >= first;) {\n for (var i = 0; i < chunkSize && line >= first; i++) {\n var curLine = doc.getLine(line--)\n string = string == null ? curLine : curLine + \"\\n\" + string\n }\n chunkSize *= 2\n\n var match = lastMatchIn(string, regexp, endMargin)\n if (match) {\n var before = string.slice(0, match.index).split(\"\\n\"), inside = match[0].split(\"\\n\")\n var startLine = line + before.length, startCh = before[before.length - 1].length\n return {from: Pos(startLine, startCh),\n to: Pos(startLine + inside.length - 1,\n inside.length == 1 ? startCh + inside[0].length : inside[inside.length - 1].length),\n match: match}\n }\n }\n }\n\n var doFold, noFold\n if (String.prototype.normalize) {\n doFold = function(str) { return str.normalize(\"NFD\").toLowerCase() }\n noFold = function(str) { return str.normalize(\"NFD\") }\n } else {\n doFold = function(str) { return str.toLowerCase() }\n noFold = function(str) { return str }\n }\n\n // Maps a position in a case-folded line back to a position in the original line\n // (compensating for codepoints increasing in number during folding)\n function adjustPos(orig, folded, pos, foldFunc) {\n if (orig.length == folded.length) return pos\n for (var min = 0, max = pos + Math.max(0, orig.length - folded.length);;) {\n if (min == max) return min\n var mid = (min + max) >> 1\n var len = foldFunc(orig.slice(0, mid)).length\n if (len == pos) return mid\n else if (len > pos) max = mid\n else min = mid + 1\n }\n }\n\n function searchStringForward(doc, query, start, caseFold) {\n // Empty string would match anything and never progress, so we\n // define it to match nothing instead.\n if (!query.length) return null\n var fold = caseFold ? doFold : noFold\n var lines = fold(query).split(/\\r|\\n\\r?/)\n\n search: for (var line = start.line, ch = start.ch, last = doc.lastLine() + 1 - lines.length; line <= last; line++, ch = 0) {\n var orig = doc.getLine(line).slice(ch), string = fold(orig)\n if (lines.length == 1) {\n var found = string.indexOf(lines[0])\n if (found == -1) continue search\n var start = adjustPos(orig, string, found, fold) + ch\n return {from: Pos(line, adjustPos(orig, string, found, fold) + ch),\n to: Pos(line, adjustPos(orig, string, found + lines[0].length, fold) + ch)}\n } else {\n var cutFrom = string.length - lines[0].length\n if (string.slice(cutFrom) != lines[0]) continue search\n for (var i = 1; i < lines.length - 1; i++)\n if (fold(doc.getLine(line + i)) != lines[i]) continue search\n var end = doc.getLine(line + lines.length - 1), endString = fold(end), lastLine = lines[lines.length - 1]\n if (endString.slice(0, lastLine.length) != lastLine) continue search\n return {from: Pos(line, adjustPos(orig, string, cutFrom, fold) + ch),\n to: Pos(line + lines.length - 1, adjustPos(end, endString, lastLine.length, fold))}\n }\n }\n }\n\n function searchStringBackward(doc, query, start, caseFold) {\n if (!query.length) return null\n var fold = caseFold ? doFold : noFold\n var lines = fold(query).split(/\\r|\\n\\r?/)\n\n search: for (var line = start.line, ch = start.ch, first = doc.firstLine() - 1 + lines.length; line >= first; line--, ch = -1) {\n var orig = doc.getLine(line)\n if (ch > -1) orig = orig.slice(0, ch)\n var string = fold(orig)\n if (lines.length == 1) {\n var found = string.lastIndexOf(lines[0])\n if (found == -1) continue search\n return {from: Pos(line, adjustPos(orig, string, found, fold)),\n to: Pos(line, adjustPos(orig, string, found + lines[0].length, fold))}\n } else {\n var lastLine = lines[lines.length - 1]\n if (string.slice(0, lastLine.length) != lastLine) continue search\n for (var i = 1, start = line - lines.length + 1; i < lines.length - 1; i++)\n if (fold(doc.getLine(start + i)) != lines[i]) continue search\n var top = doc.getLine(line + 1 - lines.length), topString = fold(top)\n if (topString.slice(topString.length - lines[0].length) != lines[0]) continue search\n return {from: Pos(line + 1 - lines.length, adjustPos(top, topString, top.length - lines[0].length, fold)),\n to: Pos(line, adjustPos(orig, string, lastLine.length, fold))}\n }\n }\n }\n\n function SearchCursor(doc, query, pos, options) {\n this.atOccurrence = false\n this.afterEmptyMatch = false\n this.doc = doc\n pos = pos ? doc.clipPos(pos) : Pos(0, 0)\n this.pos = {from: pos, to: pos}\n\n var caseFold\n if (typeof options == \"object\") {\n caseFold = options.caseFold\n } else { // Backwards compat for when caseFold was the 4th argument\n caseFold = options\n options = null\n }\n\n if (typeof query == \"string\") {\n if (caseFold == null) caseFold = false\n this.matches = function(reverse, pos) {\n return (reverse ? searchStringBackward : searchStringForward)(doc, query, pos, caseFold)\n }\n } else {\n query = ensureFlags(query, \"gm\")\n if (!options || options.multiline !== false)\n this.matches = function(reverse, pos) {\n return (reverse ? searchRegexpBackwardMultiline : searchRegexpForwardMultiline)(doc, query, pos)\n }\n else\n this.matches = function(reverse, pos) {\n return (reverse ? searchRegexpBackward : searchRegexpForward)(doc, query, pos)\n }\n }\n }\n\n SearchCursor.prototype = {\n findNext: function() {return this.find(false)},\n findPrevious: function() {return this.find(true)},\n\n find: function(reverse) {\n var head = this.doc.clipPos(reverse ? this.pos.from : this.pos.to);\n if (this.afterEmptyMatch && this.atOccurrence) {\n // do not return the same 0 width match twice\n head = Pos(head.line, head.ch)\n if (reverse) {\n head.ch--;\n if (head.ch < 0) {\n head.line--;\n head.ch = (this.doc.getLine(head.line) || \"\").length;\n }\n } else {\n head.ch++;\n if (head.ch > (this.doc.getLine(head.line) || \"\").length) {\n head.ch = 0;\n head.line++;\n }\n }\n if (CodeMirror.cmpPos(head, this.doc.clipPos(head)) != 0) {\n return this.atOccurrence = false\n }\n }\n var result = this.matches(reverse, head)\n this.afterEmptyMatch = result && CodeMirror.cmpPos(result.from, result.to) == 0\n\n if (result) {\n this.pos = result\n this.atOccurrence = true\n return this.pos.match || true\n } else {\n var end = Pos(reverse ? this.doc.firstLine() : this.doc.lastLine() + 1, 0)\n this.pos = {from: end, to: end}\n return this.atOccurrence = false\n }\n },\n\n from: function() {if (this.atOccurrence) return this.pos.from},\n to: function() {if (this.atOccurrence) return this.pos.to},\n\n replace: function(newText, origin) {\n if (!this.atOccurrence) return\n var lines = CodeMirror.splitLines(newText)\n this.doc.replaceRange(lines, this.pos.from, this.pos.to, origin)\n this.pos.to = Pos(this.pos.from.line + lines.length - 1,\n lines[lines.length - 1].length + (lines.length == 1 ? this.pos.from.ch : 0))\n }\n }\n\n CodeMirror.defineExtension(\"getSearchCursor\", function(query, pos, caseFold) {\n return new SearchCursor(this.doc, query, pos, caseFold)\n })\n CodeMirror.defineDocExtension(\"getSearchCursor\", function(query, pos, caseFold) {\n return new SearchCursor(this, query, pos, caseFold)\n })\n\n CodeMirror.defineExtension(\"selectMatches\", function(query, caseFold) {\n var ranges = []\n var cur = this.getSearchCursor(query, this.getCursor(\"from\"), caseFold)\n while (cur.findNext()) {\n if (CodeMirror.cmpPos(cur.to(), this.getCursor(\"to\")) > 0) break\n ranges.push({anchor: cur.from(), head: cur.to()})\n }\n if (ranges.length)\n this.setSelections(ranges, 0)\n })\n});\n","// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/5/LICENSE\n\n(function(mod) {\n if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n mod(require(\"../../lib/codemirror\"), require(\"../markdown/markdown\"), require(\"../../addon/mode/overlay\"));\n else if (typeof define == \"function\" && define.amd) // AMD\n define([\"../../lib/codemirror\", \"../markdown/markdown\", \"../../addon/mode/overlay\"], mod);\n else // Plain browser env\n mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nvar urlRE = /^((?:(?:aaas?|about|acap|adiumxtra|af[ps]|aim|apt|attachment|aw|beshare|bitcoin|bolo|callto|cap|chrome(?:-extension)?|cid|coap|com-eventbrite-attendee|content|crid|cvs|data|dav|dict|dlna-(?:playcontainer|playsingle)|dns|doi|dtn|dvb|ed2k|facetime|feed|file|finger|fish|ftp|geo|gg|git|gizmoproject|go|gopher|gtalk|h323|hcp|https?|iax|icap|icon|im|imap|info|ipn|ipp|irc[6s]?|iris(?:\\.beep|\\.lwz|\\.xpc|\\.xpcs)?|itms|jar|javascript|jms|keyparc|lastfm|ldaps?|magnet|mailto|maps|market|message|mid|mms|ms-help|msnim|msrps?|mtqp|mumble|mupdate|mvn|news|nfs|nih?|nntp|notes|oid|opaquelocktoken|palm|paparazzi|platform|pop|pres|proxy|psyc|query|res(?:ource)?|rmi|rsync|rtmp|rtsp|secondlife|service|session|sftp|sgn|shttp|sieve|sips?|skype|sm[bs]|snmp|soap\\.beeps?|soldat|spotify|ssh|steam|svn|tag|teamspeak|tel(?:net)?|tftp|things|thismessage|tip|tn3270|tv|udp|unreal|urn|ut2004|vemmi|ventrilo|view-source|webcal|wss?|wtai|wyciwyg|xcon(?:-userid)?|xfire|xmlrpc\\.beeps?|xmpp|xri|ymsgr|z39\\.50[rs]?):(?:\\/{1,3}|[a-z0-9%])|www\\d{0,3}[.]|[a-z0-9.\\-]+[.][a-z]{2,4}\\/)(?:[^\\s()<>]|\\([^\\s()<>]*\\))+(?:\\([^\\s()<>]*\\)|[^\\s`*!()\\[\\]{};:'\".,<>?«»“”‘’]))/i\n\nCodeMirror.defineMode(\"gfm\", function(config, modeConfig) {\n var codeDepth = 0;\n function blankLine(state) {\n state.code = false;\n return null;\n }\n var gfmOverlay = {\n startState: function() {\n return {\n code: false,\n codeBlock: false,\n ateSpace: false\n };\n },\n copyState: function(s) {\n return {\n code: s.code,\n codeBlock: s.codeBlock,\n ateSpace: s.ateSpace\n };\n },\n token: function(stream, state) {\n state.combineTokens = null;\n\n // Hack to prevent formatting override inside code blocks (block and inline)\n if (state.codeBlock) {\n if (stream.match(/^```+/)) {\n state.codeBlock = false;\n return null;\n }\n stream.skipToEnd();\n return null;\n }\n if (stream.sol()) {\n state.code = false;\n }\n if (stream.sol() && stream.match(/^```+/)) {\n stream.skipToEnd();\n state.codeBlock = true;\n return null;\n }\n // If this block is changed, it may need to be updated in Markdown mode\n if (stream.peek() === '`') {\n stream.next();\n var before = stream.pos;\n stream.eatWhile('`');\n var difference = 1 + stream.pos - before;\n if (!state.code) {\n codeDepth = difference;\n state.code = true;\n } else {\n if (difference === codeDepth) { // Must be exact\n state.code = false;\n }\n }\n return null;\n } else if (state.code) {\n stream.next();\n return null;\n }\n // Check if space. If so, links can be formatted later on\n if (stream.eatSpace()) {\n state.ateSpace = true;\n return null;\n }\n if (stream.sol() || state.ateSpace) {\n state.ateSpace = false;\n if (modeConfig.gitHubSpice !== false) {\n if(stream.match(/^(?:[a-zA-Z0-9\\-_]+\\/)?(?:[a-zA-Z0-9\\-_]+@)?(?=.{0,6}\\d)(?:[a-f0-9]{7,40}\\b)/)) {\n // User/Project@SHA\n // User@SHA\n // SHA\n state.combineTokens = true;\n return \"link\";\n } else if (stream.match(/^(?:[a-zA-Z0-9\\-_]+\\/)?(?:[a-zA-Z0-9\\-_]+)?#[0-9]+\\b/)) {\n // User/Project#Num\n // User#Num\n // #Num\n state.combineTokens = true;\n return \"link\";\n }\n }\n }\n if (stream.match(urlRE) &&\n stream.string.slice(stream.start - 2, stream.start) != \"](\" &&\n (stream.start == 0 || /\\W/.test(stream.string.charAt(stream.start - 1)))) {\n // URLs\n // Taken from http://daringfireball.net/2010/07/improved_regex_for_matching_urls\n // And then (issue #1160) simplified to make it not crash the Chrome Regexp engine\n // And then limited url schemes to the CommonMark list, so foo:bar isn't matched as a URL\n state.combineTokens = true;\n return \"link\";\n }\n stream.next();\n return null;\n },\n blankLine: blankLine\n };\n\n var markdownConfig = {\n taskLists: true,\n strikethrough: true,\n emoji: true\n };\n for (var attr in modeConfig) {\n markdownConfig[attr] = modeConfig[attr];\n }\n markdownConfig.name = \"markdown\";\n return CodeMirror.overlayMode(CodeMirror.getMode(config, markdownConfig), gfmOverlay);\n\n}, \"markdown\");\n\n CodeMirror.defineMIME(\"text/x-gfm\", \"gfm\");\n});\n","export default {}","/* globals chrome: false */\n/* globals __dirname: false */\n/* globals require: false */\n/* globals Buffer: false */\n/* globals module: false */\n\n/**\n * Typo is a JavaScript implementation of a spellchecker using hunspell-style \n * dictionaries.\n */\n\nvar Typo;\n\n(function () {\n\"use strict\";\n\n/**\n * Typo constructor.\n *\n * @param {String} [dictionary] The locale code of the dictionary being used. e.g.,\n * \"en_US\". This is only used to auto-load dictionaries.\n * @param {String} [affData] The data from the dictionary's .aff file. If omitted\n * and Typo.js is being used in a Chrome extension, the .aff\n * file will be loaded automatically from\n * lib/typo/dictionaries/[dictionary]/[dictionary].aff\n * In other environments, it will be loaded from\n * [settings.dictionaryPath]/dictionaries/[dictionary]/[dictionary].aff\n * @param {String} [wordsData] The data from the dictionary's .dic file. If omitted\n * and Typo.js is being used in a Chrome extension, the .dic\n * file will be loaded automatically from\n * lib/typo/dictionaries/[dictionary]/[dictionary].dic\n * In other environments, it will be loaded from\n * [settings.dictionaryPath]/dictionaries/[dictionary]/[dictionary].dic\n * @param {Object} [settings] Constructor settings. Available properties are:\n * {String} [dictionaryPath]: path to load dictionary from in non-chrome\n * environment.\n * {Object} [flags]: flag information.\n * {Boolean} [asyncLoad]: If true, affData and wordsData will be loaded\n * asynchronously.\n * {Function} [loadedCallback]: Called when both affData and wordsData\n * have been loaded. Only used if asyncLoad is set to true. The parameter\n * is the instantiated Typo object.\n *\n * @returns {Typo} A Typo object.\n */\n\nTypo = function (dictionary, affData, wordsData, settings) {\n\tsettings = settings || {};\n\n\tthis.dictionary = null;\n\t\n\tthis.rules = {};\n\tthis.dictionaryTable = {};\n\t\n\tthis.compoundRules = [];\n\tthis.compoundRuleCodes = {};\n\t\n\tthis.replacementTable = [];\n\t\n\tthis.flags = settings.flags || {}; \n\t\n\tthis.memoized = {};\n\n\tthis.loaded = false;\n\t\n\tvar self = this;\n\t\n\tvar path;\n\t\n\t// Loop-control variables.\n\tvar i, j, _len, _jlen;\n\t\n\tif (dictionary) {\n\t\tself.dictionary = dictionary;\n\t\t\n\t\t// If the data is preloaded, just setup the Typo object.\n\t\tif (affData && wordsData) {\n\t\t\tsetup();\n\t\t}\n\t\t// Loading data for Chrome extentions.\n\t\telse if (typeof window !== 'undefined' && 'chrome' in window && 'extension' in window.chrome && 'getURL' in window.chrome.extension) {\n\t\t\tif (settings.dictionaryPath) {\n\t\t\t\tpath = settings.dictionaryPath;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tpath = \"typo/dictionaries\";\n\t\t\t}\n\t\t\t\n\t\t\tif (!affData) readDataFile(chrome.extension.getURL(path + \"/\" + dictionary + \"/\" + dictionary + \".aff\"), setAffData);\n\t\t\tif (!wordsData) readDataFile(chrome.extension.getURL(path + \"/\" + dictionary + \"/\" + dictionary + \".dic\"), setWordsData);\n\t\t}\n\t\telse {\n\t\t\tif (settings.dictionaryPath) {\n\t\t\t\tpath = settings.dictionaryPath;\n\t\t\t}\n\t\t\telse if (typeof __dirname !== 'undefined') {\n\t\t\t\tpath = __dirname + '/dictionaries';\n\t\t\t}\n\t\t\telse {\n\t\t\t\tpath = './dictionaries';\n\t\t\t}\n\t\t\t\n\t\t\tif (!affData) readDataFile(path + \"/\" + dictionary + \"/\" + dictionary + \".aff\", setAffData);\n\t\t\tif (!wordsData) readDataFile(path + \"/\" + dictionary + \"/\" + dictionary + \".dic\", setWordsData);\n\t\t}\n\t}\n\t\n\tfunction readDataFile(url, setFunc) {\n\t\tvar response = self._readFile(url, null, settings.asyncLoad);\n\t\t\n\t\tif (settings.asyncLoad) {\n\t\t\tresponse.then(function(data) {\n\t\t\t\tsetFunc(data);\n\t\t\t});\n\t\t}\n\t\telse {\n\t\t\tsetFunc(response);\n\t\t}\n\t}\n\n\tfunction setAffData(data) {\n\t\taffData = data;\n\n\t\tif (wordsData) {\n\t\t\tsetup();\n\t\t}\n\t}\n\n\tfunction setWordsData(data) {\n\t\twordsData = data;\n\n\t\tif (affData) {\n\t\t\tsetup();\n\t\t}\n\t}\n\n\tfunction setup() {\n\t\tself.rules = self._parseAFF(affData);\n\t\t\n\t\t// Save the rule codes that are used in compound rules.\n\t\tself.compoundRuleCodes = {};\n\t\t\n\t\tfor (i = 0, _len = self.compoundRules.length; i < _len; i++) {\n\t\t\tvar rule = self.compoundRules[i];\n\t\t\t\n\t\t\tfor (j = 0, _jlen = rule.length; j < _jlen; j++) {\n\t\t\t\tself.compoundRuleCodes[rule[j]] = [];\n\t\t\t}\n\t\t}\n\t\t\n\t\t// If we add this ONLYINCOMPOUND flag to self.compoundRuleCodes, then _parseDIC\n\t\t// will do the work of saving the list of words that are compound-only.\n\t\tif (\"ONLYINCOMPOUND\" in self.flags) {\n\t\t\tself.compoundRuleCodes[self.flags.ONLYINCOMPOUND] = [];\n\t\t}\n\t\t\n\t\tself.dictionaryTable = self._parseDIC(wordsData);\n\t\t\n\t\t// Get rid of any codes from the compound rule codes that are never used \n\t\t// (or that were special regex characters). Not especially necessary... \n\t\tfor (i in self.compoundRuleCodes) {\n\t\t\tif (self.compoundRuleCodes[i].length === 0) {\n\t\t\t\tdelete self.compoundRuleCodes[i];\n\t\t\t}\n\t\t}\n\t\t\n\t\t// Build the full regular expressions for each compound rule.\n\t\t// I have a feeling (but no confirmation yet) that this method of \n\t\t// testing for compound words is probably slow.\n\t\tfor (i = 0, _len = self.compoundRules.length; i < _len; i++) {\n\t\t\tvar ruleText = self.compoundRules[i];\n\t\t\t\n\t\t\tvar expressionText = \"\";\n\t\t\t\n\t\t\tfor (j = 0, _jlen = ruleText.length; j < _jlen; j++) {\n\t\t\t\tvar character = ruleText[j];\n\t\t\t\t\n\t\t\t\tif (character in self.compoundRuleCodes) {\n\t\t\t\t\texpressionText += \"(\" + self.compoundRuleCodes[character].join(\"|\") + \")\";\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\texpressionText += character;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tself.compoundRules[i] = new RegExp(expressionText, \"i\");\n\t\t}\n\t\t\n\t\tself.loaded = true;\n\t\t\n\t\tif (settings.asyncLoad && settings.loadedCallback) {\n\t\t\tsettings.loadedCallback(self);\n\t\t}\n\t}\n\t\n\treturn this;\n};\n\nTypo.prototype = {\n\t/**\n\t * Loads a Typo instance from a hash of all of the Typo properties.\n\t *\n\t * @param object obj A hash of Typo properties, probably gotten from a JSON.parse(JSON.stringify(typo_instance)).\n\t */\n\t\n\tload : function (obj) {\n\t\tfor (var i in obj) {\n\t\t\tif (obj.hasOwnProperty(i)) {\n\t\t\t\tthis[i] = obj[i];\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn this;\n\t},\n\t\n\t/**\n\t * Read the contents of a file.\n\t * \n\t * @param {String} path The path (relative) to the file.\n\t * @param {String} [charset=\"ISO8859-1\"] The expected charset of the file\n\t * @param {Boolean} async If true, the file will be read asynchronously. For node.js this does nothing, all\n\t * files are read synchronously.\n\t * @returns {String} The file data if async is false, otherwise a promise object. If running node.js, the data is\n\t * always returned.\n\t */\n\t\n\t_readFile : function (path, charset, async) {\n\t\tcharset = charset || \"utf8\";\n\t\t\n\t\tif (typeof XMLHttpRequest !== 'undefined') {\n\t\t\tvar promise;\n\t\t\tvar req = new XMLHttpRequest();\n\t\t\treq.open(\"GET\", path, async);\n\t\t\t\n\t\t\tif (async) {\n\t\t\t\tpromise = new Promise(function(resolve, reject) {\n\t\t\t\t\treq.onload = function() {\n\t\t\t\t\t\tif (req.status === 200) {\n\t\t\t\t\t\t\tresolve(req.responseText);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\treject(req.statusText);\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t\n\t\t\t\t\treq.onerror = function() {\n\t\t\t\t\t\treject(req.statusText);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\n\t\t\tif (req.overrideMimeType)\n\t\t\t\treq.overrideMimeType(\"text/plain; charset=\" + charset);\n\t\t\n\t\t\treq.send(null);\n\t\t\t\n\t\t\treturn async ? promise : req.responseText;\n\t\t}\n\t\telse if (typeof require !== 'undefined') {\n\t\t\t// Node.js\n\t\t\tvar fs = require(\"fs\");\n\t\t\t\n\t\t\ttry {\n\t\t\t\tif (fs.existsSync(path)) {\n\t\t\t\t\treturn fs.readFileSync(path, charset);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tconsole.log(\"Path \" + path + \" does not exist.\");\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\tconsole.log(e);\n\t\t\t\treturn '';\n\t\t\t}\n\t\t}\n\t},\n\t\n\t/**\n\t * Parse the rules out from a .aff file.\n\t *\n\t * @param {String} data The contents of the affix file.\n\t * @returns object The rules from the file.\n\t */\n\t\n\t_parseAFF : function (data) {\n\t\tvar rules = {};\n\t\t\n\t\tvar line, subline, numEntries, lineParts;\n\t\tvar i, j, _len, _jlen;\n\t\t\n\t\tvar lines = data.split(/\\r?\\n/);\n\t\t\n\t\tfor (i = 0, _len = lines.length; i < _len; i++) {\n\t\t\t// Remove comment lines\n\t\t\tline = this._removeAffixComments(lines[i]);\n\t\t\tline = line.trim();\n\t\t\t\n\t\t\tif ( ! line ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t\n\t\t\tvar definitionParts = line.split(/\\s+/);\n\t\t\t\n\t\t\tvar ruleType = definitionParts[0];\n\t\t\t\n\t\t\tif (ruleType == \"PFX\" || ruleType == \"SFX\") {\n\t\t\t\tvar ruleCode = definitionParts[1];\n\t\t\t\tvar combineable = definitionParts[2];\n\t\t\t\tnumEntries = parseInt(definitionParts[3], 10);\n\t\t\t\t\n\t\t\t\tvar entries = [];\n\t\t\t\t\n\t\t\t\tfor (j = i + 1, _jlen = i + 1 + numEntries; j < _jlen; j++) {\n\t\t\t\t\tsubline = lines[j];\n\t\t\t\t\t\n\t\t\t\t\tlineParts = subline.split(/\\s+/);\n\t\t\t\t\tvar charactersToRemove = lineParts[2];\n\t\t\t\t\t\n\t\t\t\t\tvar additionParts = lineParts[3].split(\"/\");\n\t\t\t\t\t\n\t\t\t\t\tvar charactersToAdd = additionParts[0];\n\t\t\t\t\tif (charactersToAdd === \"0\") charactersToAdd = \"\";\n\t\t\t\t\t\n\t\t\t\t\tvar continuationClasses = this.parseRuleCodes(additionParts[1]);\n\t\t\t\t\t\n\t\t\t\t\tvar regexToMatch = lineParts[4];\n\t\t\t\t\t\n\t\t\t\t\tvar entry = {};\n\t\t\t\t\tentry.add = charactersToAdd;\n\t\t\t\t\t\n\t\t\t\t\tif (continuationClasses.length > 0) entry.continuationClasses = continuationClasses;\n\t\t\t\t\t\n\t\t\t\t\tif (regexToMatch !== \".\") {\n\t\t\t\t\t\tif (ruleType === \"SFX\") {\n\t\t\t\t\t\t\tentry.match = new RegExp(regexToMatch + \"$\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tentry.match = new RegExp(\"^\" + regexToMatch);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tif (charactersToRemove != \"0\") {\n\t\t\t\t\t\tif (ruleType === \"SFX\") {\n\t\t\t\t\t\t\tentry.remove = new RegExp(charactersToRemove + \"$\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tentry.remove = charactersToRemove;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tentries.push(entry);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\trules[ruleCode] = { \"type\" : ruleType, \"combineable\" : (combineable == \"Y\"), \"entries\" : entries };\n\t\t\t\t\n\t\t\t\ti += numEntries;\n\t\t\t}\n\t\t\telse if (ruleType === \"COMPOUNDRULE\") {\n\t\t\t\tnumEntries = parseInt(definitionParts[1], 10);\n\t\t\t\t\n\t\t\t\tfor (j = i + 1, _jlen = i + 1 + numEntries; j < _jlen; j++) {\n\t\t\t\t\tline = lines[j];\n\t\t\t\t\t\n\t\t\t\t\tlineParts = line.split(/\\s+/);\n\t\t\t\t\tthis.compoundRules.push(lineParts[1]);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\ti += numEntries;\n\t\t\t}\n\t\t\telse if (ruleType === \"REP\") {\n\t\t\t\tlineParts = line.split(/\\s+/);\n\t\t\t\t\n\t\t\t\tif (lineParts.length === 3) {\n\t\t\t\t\tthis.replacementTable.push([ lineParts[1], lineParts[2] ]);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// ONLYINCOMPOUND\n\t\t\t\t// COMPOUNDMIN\n\t\t\t\t// FLAG\n\t\t\t\t// KEEPCASE\n\t\t\t\t// NEEDAFFIX\n\t\t\t\t\n\t\t\t\tthis.flags[ruleType] = definitionParts[1];\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn rules;\n\t},\n\t\n\t/**\n\t * Removes comments.\n\t *\n\t * @param {String} data A line from an affix file.\n\t * @return {String} The cleaned-up line.\n\t */\n\t\n\t_removeAffixComments : function (line) {\n\t\t// This used to remove any string starting with '#' up to the end of the line,\n\t\t// but some COMPOUNDRULE definitions include '#' as part of the rule.\n\t\t// So, only remove lines that begin with a comment, optionally preceded by whitespace.\n\t\tif ( line.match( /^\\s*#/, \"\" ) ) {\n\t\t\treturn '';\n\t\t}\n\t\t\n\t\treturn line;\n\t},\n\t\n\t/**\n\t * Parses the words out from the .dic file.\n\t *\n\t * @param {String} data The data from the dictionary file.\n\t * @returns object The lookup table containing all of the words and\n\t * word forms from the dictionary.\n\t */\n\t\n\t_parseDIC : function (data) {\n\t\tdata = this._removeDicComments(data);\n\t\t\n\t\tvar lines = data.split(/\\r?\\n/);\n\t\tvar dictionaryTable = {};\n\t\t\n\t\tfunction addWord(word, rules) {\n\t\t\t// Some dictionaries will list the same word multiple times with different rule sets.\n\t\t\tif (!dictionaryTable.hasOwnProperty(word)) {\n\t\t\t\tdictionaryTable[word] = null;\n\t\t\t}\n\t\t\t\n\t\t\tif (rules.length > 0) {\n\t\t\t\tif (dictionaryTable[word] === null) {\n\t\t\t\t\tdictionaryTable[word] = [];\n\t\t\t\t}\n\n\t\t\t\tdictionaryTable[word].push(rules);\n\t\t\t}\n\t\t}\n\t\t\n\t\t// The first line is the number of words in the dictionary.\n\t\tfor (var i = 1, _len = lines.length; i < _len; i++) {\n\t\t\tvar line = lines[i];\n\t\t\t\n\t\t\tif (!line) {\n\t\t\t\t// Ignore empty lines.\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tvar parts = line.split(\"/\", 2);\n\t\t\t\n\t\t\tvar word = parts[0];\n\n\t\t\t// Now for each affix rule, generate that form of the word.\n\t\t\tif (parts.length > 1) {\n\t\t\t\tvar ruleCodesArray = this.parseRuleCodes(parts[1]);\n\t\t\t\t\n\t\t\t\t// Save the ruleCodes for compound word situations.\n\t\t\t\tif (!(\"NEEDAFFIX\" in this.flags) || ruleCodesArray.indexOf(this.flags.NEEDAFFIX) == -1) {\n\t\t\t\t\taddWord(word, ruleCodesArray);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tfor (var j = 0, _jlen = ruleCodesArray.length; j < _jlen; j++) {\n\t\t\t\t\tvar code = ruleCodesArray[j];\n\t\t\t\t\t\n\t\t\t\t\tvar rule = this.rules[code];\n\t\t\t\t\t\n\t\t\t\t\tif (rule) {\n\t\t\t\t\t\tvar newWords = this._applyRule(word, rule);\n\t\t\t\t\t\t\n\t\t\t\t\t\tfor (var ii = 0, _iilen = newWords.length; ii < _iilen; ii++) {\n\t\t\t\t\t\t\tvar newWord = newWords[ii];\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\taddWord(newWord, []);\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tif (rule.combineable) {\n\t\t\t\t\t\t\t\tfor (var k = j + 1; k < _jlen; k++) {\n\t\t\t\t\t\t\t\t\tvar combineCode = ruleCodesArray[k];\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\tvar combineRule = this.rules[combineCode];\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\tif (combineRule) {\n\t\t\t\t\t\t\t\t\t\tif (combineRule.combineable && (rule.type != combineRule.type)) {\n\t\t\t\t\t\t\t\t\t\t\tvar otherNewWords = this._applyRule(newWord, combineRule);\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\tfor (var iii = 0, _iiilen = otherNewWords.length; iii < _iiilen; iii++) {\n\t\t\t\t\t\t\t\t\t\t\t\tvar otherNewWord = otherNewWords[iii];\n\t\t\t\t\t\t\t\t\t\t\t\taddWord(otherNewWord, []);\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tif (code in this.compoundRuleCodes) {\n\t\t\t\t\t\tthis.compoundRuleCodes[code].push(word);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\taddWord(word.trim(), []);\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn dictionaryTable;\n\t},\n\t\n\t\n\t/**\n\t * Removes comment lines and then cleans up blank lines and trailing whitespace.\n\t *\n\t * @param {String} data The data from a .dic file.\n\t * @return {String} The cleaned-up data.\n\t */\n\t\n\t_removeDicComments : function (data) {\n\t\t// I can't find any official documentation on it, but at least the de_DE\n\t\t// dictionary uses tab-indented lines as comments.\n\t\t\n\t\t// Remove comments\n\t\tdata = data.replace(/^\\t.*$/mg, \"\");\n\t\t\n\t\treturn data;\n\t},\n\t\n\tparseRuleCodes : function (textCodes) {\n\t\tif (!textCodes) {\n\t\t\treturn [];\n\t\t}\n\t\telse if (!(\"FLAG\" in this.flags)) {\n\t\t\t// The flag symbols are single characters\n\t\t\treturn textCodes.split(\"\");\n\t\t}\n\t\telse if (this.flags.FLAG === \"long\") {\n\t\t\t// The flag symbols are two characters long.\n\t\t\tvar flags = [];\n\t\t\t\n\t\t\tfor (var i = 0, _len = textCodes.length; i < _len; i += 2) {\n\t\t\t\tflags.push(textCodes.substr(i, 2));\n\t\t\t}\n\t\t\t\n\t\t\treturn flags;\n\t\t}\n\t\telse if (this.flags.FLAG === \"num\") {\n\t\t\t// The flag symbols are a CSV list of numbers.\n\t\t\treturn textCodes.split(\",\");\n\t\t}\n\t\telse if (this.flags.FLAG === \"UTF-8\") {\n\t\t\t// The flags are single UTF-8 characters.\n\t\t\t// @see https://github.com/cfinke/Typo.js/issues/57\n\t\t\treturn Array.from(textCodes);\n\t\t}\n\t\telse {\n\t\t\t// It's possible that this fallback case will not work for all FLAG values,\n\t\t\t// but I think it's more likely to work than not returning anything at all.\n\t\t\treturn textCodes.split(\"\");\n\t\t}\n\t},\n\t\n\t/**\n\t * Applies an affix rule to a word.\n\t *\n\t * @param {String} word The base word.\n\t * @param {Object} rule The affix rule.\n\t * @returns {String[]} The new words generated by the rule.\n\t */\n\t\n\t_applyRule : function (word, rule) {\n\t\tvar entries = rule.entries;\n\t\tvar newWords = [];\n\t\t\n\t\tfor (var i = 0, _len = entries.length; i < _len; i++) {\n\t\t\tvar entry = entries[i];\n\t\t\t\n\t\t\tif (!entry.match || word.match(entry.match)) {\n\t\t\t\tvar newWord = word;\n\t\t\t\t\n\t\t\t\tif (entry.remove) {\n\t\t\t\t\tnewWord = newWord.replace(entry.remove, \"\");\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (rule.type === \"SFX\") {\n\t\t\t\t\tnewWord = newWord + entry.add;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tnewWord = entry.add + newWord;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tnewWords.push(newWord);\n\t\t\t\t\n\t\t\t\tif (\"continuationClasses\" in entry) {\n\t\t\t\t\tfor (var j = 0, _jlen = entry.continuationClasses.length; j < _jlen; j++) {\n\t\t\t\t\t\tvar continuationRule = this.rules[entry.continuationClasses[j]];\n\t\t\t\t\t\t\n\t\t\t\t\t\tif (continuationRule) {\n\t\t\t\t\t\t\tnewWords = newWords.concat(this._applyRule(newWord, continuationRule));\n\t\t\t\t\t\t}\n\t\t\t\t\t\t/*\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t// This shouldn't happen, but it does, at least in the de_DE dictionary.\n\t\t\t\t\t\t\t// I think the author mistakenly supplied lower-case rule codes instead \n\t\t\t\t\t\t\t// of upper-case.\n\t\t\t\t\t\t}\n\t\t\t\t\t\t*/\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn newWords;\n\t},\n\t\n\t/**\n\t * Checks whether a word or a capitalization variant exists in the current dictionary.\n\t * The word is trimmed and several variations of capitalizations are checked.\n\t * If you want to check a word without any changes made to it, call checkExact()\n\t *\n\t * @see http://blog.stevenlevithan.com/archives/faster-trim-javascript re:trimming function\n\t *\n\t * @param {String} aWord The word to check.\n\t * @returns {Boolean}\n\t */\n\t\n\tcheck : function (aWord) {\n\t\tif (!this.loaded) {\n\t\t\tthrow \"Dictionary not loaded.\";\n\t\t}\n\t\t\n\t\tif (!aWord) {\n\t\t\treturn false;\n\t\t}\n\t\t\n\t\t// Remove leading and trailing whitespace\n\t\tvar trimmedWord = aWord.replace(/^\\s\\s*/, '').replace(/\\s\\s*$/, '');\n\t\t\n\t\tif (this.checkExact(trimmedWord)) {\n\t\t\treturn true;\n\t\t}\n\t\t\n\t\t// The exact word is not in the dictionary.\n\t\tif (trimmedWord.toUpperCase() === trimmedWord) {\n\t\t\t// The word was supplied in all uppercase.\n\t\t\t// Check for a capitalized form of the word.\n\t\t\tvar capitalizedWord = trimmedWord[0] + trimmedWord.substring(1).toLowerCase();\n\t\t\t\n\t\t\tif (this.hasFlag(capitalizedWord, \"KEEPCASE\")) {\n\t\t\t\t// Capitalization variants are not allowed for this word.\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t\n\t\t\tif (this.checkExact(capitalizedWord)) {\n\t\t\t\t// The all-caps word is a capitalized word spelled correctly.\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif (this.checkExact(trimmedWord.toLowerCase())) {\n\t\t\t\t// The all-caps is a lowercase word spelled correctly.\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\t\n\t\tvar uncapitalizedWord = trimmedWord[0].toLowerCase() + trimmedWord.substring(1);\n\t\t\n\t\tif (uncapitalizedWord !== trimmedWord) {\n\t\t\tif (this.hasFlag(uncapitalizedWord, \"KEEPCASE\")) {\n\t\t\t\t// Capitalization variants are not allowed for this word.\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t\n\t\t\t// Check for an uncapitalized form\n\t\t\tif (this.checkExact(uncapitalizedWord)) {\n\t\t\t\t// The word is spelled correctly but with the first letter capitalized.\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn false;\n\t},\n\t\n\t/**\n\t * Checks whether a word exists in the current dictionary.\n\t *\n\t * @param {String} word The word to check.\n\t * @returns {Boolean}\n\t */\n\t\n\tcheckExact : function (word) {\n\t\tif (!this.loaded) {\n\t\t\tthrow \"Dictionary not loaded.\";\n\t\t}\n\n\t\tvar ruleCodes = this.dictionaryTable[word];\n\t\t\n\t\tvar i, _len;\n\t\t\n\t\tif (typeof ruleCodes === 'undefined') {\n\t\t\t// Check if this might be a compound word.\n\t\t\tif (\"COMPOUNDMIN\" in this.flags && word.length >= this.flags.COMPOUNDMIN) {\n\t\t\t\tfor (i = 0, _len = this.compoundRules.length; i < _len; i++) {\n\t\t\t\t\tif (word.match(this.compoundRules[i])) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse if (ruleCodes === null) {\n\t\t\t// a null (but not undefined) value for an entry in the dictionary table\n\t\t\t// means that the word is in the dictionary but has no flags.\n\t\t\treturn true;\n\t\t}\n\t\telse if (typeof ruleCodes === 'object') { // this.dictionary['hasOwnProperty'] will be a function.\n\t\t\tfor (i = 0, _len = ruleCodes.length; i < _len; i++) {\n\t\t\t\tif (!this.hasFlag(word, \"ONLYINCOMPOUND\", ruleCodes[i])) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t},\n\t\n\t/**\n\t * Looks up whether a given word is flagged with a given flag.\n\t *\n\t * @param {String} word The word in question.\n\t * @param {String} flag The flag in question.\n\t * @return {Boolean}\n\t */\n\t \n\thasFlag : function (word, flag, wordFlags) {\n\t\tif (!this.loaded) {\n\t\t\tthrow \"Dictionary not loaded.\";\n\t\t}\n\n\t\tif (flag in this.flags) {\n\t\t\tif (typeof wordFlags === 'undefined') {\n\t\t\t\twordFlags = Array.prototype.concat.apply([], this.dictionaryTable[word]);\n\t\t\t}\n\t\t\t\n\t\t\tif (wordFlags && wordFlags.indexOf(this.flags[flag]) !== -1) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn false;\n\t},\n\t\n\t/**\n\t * Returns a list of suggestions for a misspelled word.\n\t *\n\t * @see http://www.norvig.com/spell-correct.html for the basis of this suggestor.\n\t * This suggestor is primitive, but it works.\n\t *\n\t * @param {String} word The misspelling.\n\t * @param {Number} [limit=5] The maximum number of suggestions to return.\n\t * @returns {String[]} The array of suggestions.\n\t */\n\t\n\talphabet : \"\",\n\t\n\tsuggest : function (word, limit) {\n\t\tif (!this.loaded) {\n\t\t\tthrow \"Dictionary not loaded.\";\n\t\t}\n\n\t\tlimit = limit || 5;\n\n\t\tif (this.memoized.hasOwnProperty(word)) {\n\t\t\tvar memoizedLimit = this.memoized[word]['limit'];\n\n\t\t\t// Only return the cached list if it's big enough or if there weren't enough suggestions\n\t\t\t// to fill a smaller limit.\n\t\t\tif (limit <= memoizedLimit || this.memoized[word]['suggestions'].length < memoizedLimit) {\n\t\t\t\treturn this.memoized[word]['suggestions'].slice(0, limit);\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (this.check(word)) return [];\n\t\t\n\t\t// Check the replacement table.\n\t\tfor (var i = 0, _len = this.replacementTable.length; i < _len; i++) {\n\t\t\tvar replacementEntry = this.replacementTable[i];\n\t\t\t\n\t\t\tif (word.indexOf(replacementEntry[0]) !== -1) {\n\t\t\t\tvar correctedWord = word.replace(replacementEntry[0], replacementEntry[1]);\n\t\t\t\t\n\t\t\t\tif (this.check(correctedWord)) {\n\t\t\t\t\treturn [ correctedWord ];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (!this.alphabet) {\n\t\t\t// Use the English alphabet as the default. Problematic, but backwards-compatible.\n\t\t\tthis.alphabet = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';\n\t\t\t\n\t\t\t// Any characters defined in the affix file as substitutions can go in the alphabet too.\n\t\t\t// Note that dictionaries do not include the entire alphabet in the TRY flag when it's there.\n\t\t\t// For example, Q is not in the default English TRY list; that's why having the default\n\t\t\t// alphabet above is useful.\n\t\t\tif ( 'TRY' in this.flags ) {\n\t\t\t\tthis.alphabet += this.flags['TRY'];\n\t\t\t}\n\t\t\t\n\t\t\t// Plus any additional characters specifically defined as being allowed in words.\n\t\t\tif ( 'WORDCHARS' in this.flags ) {\n\t\t\t\tthis.alphabet += this.flags['WORDCHARS'];\n\t\t\t}\n\t\t\t\n\t\t\t// Remove any duplicates.\n\t\t\tvar alphaArray = this.alphabet.split(\"\");\n\t\t\talphaArray.sort();\n\n\t\t\tvar alphaHash = {};\n\t\t\tfor ( var i = 0; i < alphaArray.length; i++ ) {\n\t\t\t\talphaHash[ alphaArray[i] ] = true;\n\t\t\t}\n\t\t\t\n\t\t\tthis.alphabet = '';\n\t\t\t\n\t\t\tfor ( var i in alphaHash ) {\n\t\t\t\tthis.alphabet += i;\n\t\t\t}\n\t\t}\n\t\t\n\t\tvar self = this;\n\n\t\t/**\n\t\t * Returns a hash keyed by all of the strings that can be made by making a single edit to the word (or words in) `words`\n\t\t * The value of each entry is the number of unique ways that the resulting word can be made.\n\t\t *\n\t\t * @arg mixed words Either a hash keyed by words or a string word to operate on.\n\t\t * @arg bool known_only Whether this function should ignore strings that are not in the dictionary.\n\t\t */\n\t\tfunction edits1(words, known_only) {\n\t\t\tvar rv = {};\n\t\t\t\n\t\t\tvar i, j, _iilen, _len, _jlen, _edit;\n\n\t\t\tvar alphabetLength = self.alphabet.length;\n\t\t\t\n\t\t\tif (typeof words == 'string') {\n\t\t\t\tvar word = words;\n\t\t\t\twords = {};\n\t\t\t\twords[word] = true;\n\t\t\t}\n\n\t\t\tfor (var word in words) {\n\t\t\t\tfor (i = 0, _len = word.length + 1; i < _len; i++) {\n\t\t\t\t\tvar s = [ word.substring(0, i), word.substring(i) ];\n\t\t\t\t\n\t\t\t\t\t// Remove a letter.\n\t\t\t\t\tif (s[1]) {\n\t\t\t\t\t\t_edit = s[0] + s[1].substring(1);\n\n\t\t\t\t\t\tif (!known_only || self.check(_edit)) {\n\t\t\t\t\t\t\tif (!(_edit in rv)) {\n\t\t\t\t\t\t\t\trv[_edit] = 1;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\trv[_edit] += 1;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t// Transpose letters\n\t\t\t\t\t// Eliminate transpositions of identical letters\n\t\t\t\t\tif (s[1].length > 1 && s[1][1] !== s[1][0]) {\n\t\t\t\t\t\t_edit = s[0] + s[1][1] + s[1][0] + s[1].substring(2);\n\n\t\t\t\t\t\tif (!known_only || self.check(_edit)) {\n\t\t\t\t\t\t\tif (!(_edit in rv)) {\n\t\t\t\t\t\t\t\trv[_edit] = 1;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\trv[_edit] += 1;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (s[1]) {\n\t\t\t\t\t\t// Replace a letter with another letter.\n\n\t\t\t\t\t\tvar lettercase = (s[1].substring(0,1).toUpperCase() === s[1].substring(0,1)) ? 'uppercase' : 'lowercase';\n\n\t\t\t\t\t\tfor (j = 0; j < alphabetLength; j++) {\n\t\t\t\t\t\t\tvar replacementLetter = self.alphabet[j];\n\n\t\t\t\t\t\t\t// Set the case of the replacement letter to the same as the letter being replaced.\n\t\t\t\t\t\t\tif ( 'uppercase' === lettercase ) {\n\t\t\t\t\t\t\t\treplacementLetter = replacementLetter.toUpperCase();\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// Eliminate replacement of a letter by itself\n\t\t\t\t\t\t\tif (replacementLetter != s[1].substring(0,1)){\n\t\t\t\t\t\t\t\t_edit = s[0] + replacementLetter + s[1].substring(1);\n\n\t\t\t\t\t\t\t\tif (!known_only || self.check(_edit)) {\n\t\t\t\t\t\t\t\t\tif (!(_edit in rv)) {\n\t\t\t\t\t\t\t\t\t\trv[_edit] = 1;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t\trv[_edit] += 1;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (s[1]) {\n\t\t\t\t\t\t// Add a letter between each letter.\n\t\t\t\t\t\tfor (j = 0; j < alphabetLength; j++) {\n\t\t\t\t\t\t\t// If the letters on each side are capitalized, capitalize the replacement.\n\t\t\t\t\t\t\tvar lettercase = (s[0].substring(-1).toUpperCase() === s[0].substring(-1) && s[1].substring(0,1).toUpperCase() === s[1].substring(0,1)) ? 'uppercase' : 'lowercase';\n\n\t\t\t\t\t\t\tvar replacementLetter = self.alphabet[j];\n\n\t\t\t\t\t\t\tif ( 'uppercase' === lettercase ) {\n\t\t\t\t\t\t\t\treplacementLetter = replacementLetter.toUpperCase();\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t_edit = s[0] + replacementLetter + s[1];\n\n\t\t\t\t\t\t\tif (!known_only || self.check(_edit)) {\n\t\t\t\t\t\t\t\tif (!(_edit in rv)) {\n\t\t\t\t\t\t\t\t\trv[_edit] = 1;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\trv[_edit] += 1;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\treturn rv;\n\t\t}\n\n\t\tfunction correct(word) {\n\t\t\t// Get the edit-distance-1 and edit-distance-2 forms of this word.\n\t\t\tvar ed1 = edits1(word);\n\t\t\tvar ed2 = edits1(ed1, true);\n\t\t\t\n\t\t\t// Sort the edits based on how many different ways they were created.\n\t\t\tvar weighted_corrections = ed2;\n\t\t\t\n\t\t\tfor (var ed1word in ed1) {\n\t\t\t\tif (!self.check(ed1word)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (ed1word in weighted_corrections) {\n\t\t\t\t\tweighted_corrections[ed1word] += ed1[ed1word];\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tweighted_corrections[ed1word] = ed1[ed1word];\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tvar i, _len;\n\n\t\t\tvar sorted_corrections = [];\n\t\t\t\n\t\t\tfor (i in weighted_corrections) {\n\t\t\t\tif (weighted_corrections.hasOwnProperty(i)) {\n\t\t\t\t\tsorted_corrections.push([ i, weighted_corrections[i] ]);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfunction sorter(a, b) {\n\t\t\t\tvar a_val = a[1];\n\t\t\t\tvar b_val = b[1];\n\t\t\t\tif (a_val < b_val) {\n\t\t\t\t\treturn -1;\n\t\t\t\t} else if (a_val > b_val) {\n\t\t\t\t\treturn 1;\n\t\t\t\t}\n\t\t\t\t// @todo If a and b are equally weighted, add our own weight based on something like the key locations on this language's default keyboard.\n\t\t\t\treturn b[0].localeCompare(a[0]);\n\t\t\t}\n\t\t\t\n\t\t\tsorted_corrections.sort(sorter).reverse();\n\n\t\t\tvar rv = [];\n\n\t\t\tvar capitalization_scheme = \"lowercase\";\n\t\t\t\n\t\t\tif (word.toUpperCase() === word) {\n\t\t\t\tcapitalization_scheme = \"uppercase\";\n\t\t\t}\n\t\t\telse if (word.substr(0, 1).toUpperCase() + word.substr(1).toLowerCase() === word) {\n\t\t\t\tcapitalization_scheme = \"capitalized\";\n\t\t\t}\n\t\t\t\n\t\t\tvar working_limit = limit;\n\n\t\t\tfor (i = 0; i < Math.min(working_limit, sorted_corrections.length); i++) {\n\t\t\t\tif (\"uppercase\" === capitalization_scheme) {\n\t\t\t\t\tsorted_corrections[i][0] = sorted_corrections[i][0].toUpperCase();\n\t\t\t\t}\n\t\t\t\telse if (\"capitalized\" === capitalization_scheme) {\n\t\t\t\t\tsorted_corrections[i][0] = sorted_corrections[i][0].substr(0, 1).toUpperCase() + sorted_corrections[i][0].substr(1);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (!self.hasFlag(sorted_corrections[i][0], \"NOSUGGEST\") && rv.indexOf(sorted_corrections[i][0]) == -1) {\n\t\t\t\t\trv.push(sorted_corrections[i][0]);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t// If one of the corrections is not eligible as a suggestion , make sure we still return the right number of suggestions.\n\t\t\t\t\tworking_limit++;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn rv;\n\t\t}\n\t\t\n\t\tthis.memoized[word] = {\n\t\t\t'suggestions': correct(word),\n\t\t\t'limit': limit\n\t\t};\n\n\t\treturn this.memoized[word]['suggestions'];\n\t}\n};\n})();\n\n// Support for use as a node.js module.\nif (typeof module !== 'undefined') {\n\tmodule.exports = Typo;\n}\n","// Use strict mode (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode)\n\"use strict\";\n\n\n// Requires\nvar Typo = require(\"typo-js\");\n\n\n// Create function\nfunction CodeMirrorSpellChecker(options) {\n\t// Initialize\n\toptions = options || {};\n\n\n\t// Verify\n\tif(typeof options.codeMirrorInstance !== \"function\" || typeof options.codeMirrorInstance.defineMode !== \"function\") {\n\t\tconsole.log(\"CodeMirror Spell Checker: You must provide an instance of CodeMirror via the option `codeMirrorInstance`\");\n\t\treturn;\n\t}\n\n\n\t// Because some browsers don't support this functionality yet\n\tif(!String.prototype.includes) {\n\t\tString.prototype.includes = function() {\n\t\t\t\"use strict\";\n\t\t\treturn String.prototype.indexOf.apply(this, arguments) !== -1;\n\t\t};\n\t}\n\n\n\t// Define the new mode\n\toptions.codeMirrorInstance.defineMode(\"spell-checker\", function(config) {\n\t\t// Load AFF/DIC data\n\t\tif(!CodeMirrorSpellChecker.aff_loading) {\n\t\t\tCodeMirrorSpellChecker.aff_loading = true;\n\t\t\tvar xhr_aff = new XMLHttpRequest();\n\t\t\txhr_aff.open(\"GET\", \"https://cdn.jsdelivr.net/codemirror.spell-checker/latest/en_US.aff\", true);\n\t\t\txhr_aff.onload = function() {\n\t\t\t\tif(xhr_aff.readyState === 4 && xhr_aff.status === 200) {\n\t\t\t\t\tCodeMirrorSpellChecker.aff_data = xhr_aff.responseText;\n\t\t\t\t\tCodeMirrorSpellChecker.num_loaded++;\n\n\t\t\t\t\tif(CodeMirrorSpellChecker.num_loaded == 2) {\n\t\t\t\t\t\tCodeMirrorSpellChecker.typo = new Typo(\"en_US\", CodeMirrorSpellChecker.aff_data, CodeMirrorSpellChecker.dic_data, {\n\t\t\t\t\t\t\tplatform: \"any\"\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t\txhr_aff.send(null);\n\t\t}\n\n\t\tif(!CodeMirrorSpellChecker.dic_loading) {\n\t\t\tCodeMirrorSpellChecker.dic_loading = true;\n\t\t\tvar xhr_dic = new XMLHttpRequest();\n\t\t\txhr_dic.open(\"GET\", \"https://cdn.jsdelivr.net/codemirror.spell-checker/latest/en_US.dic\", true);\n\t\t\txhr_dic.onload = function() {\n\t\t\t\tif(xhr_dic.readyState === 4 && xhr_dic.status === 200) {\n\t\t\t\t\tCodeMirrorSpellChecker.dic_data = xhr_dic.responseText;\n\t\t\t\t\tCodeMirrorSpellChecker.num_loaded++;\n\n\t\t\t\t\tif(CodeMirrorSpellChecker.num_loaded == 2) {\n\t\t\t\t\t\tCodeMirrorSpellChecker.typo = new Typo(\"en_US\", CodeMirrorSpellChecker.aff_data, CodeMirrorSpellChecker.dic_data, {\n\t\t\t\t\t\t\tplatform: \"any\"\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t\txhr_dic.send(null);\n\t\t}\n\n\n\t\t// Define what separates a word\n\t\tvar rx_word = \"!\\\"#$%&()*+,-./:;<=>?@[\\\\]^_`{|}~ \";\n\n\n\t\t// Create the overlay and such\n\t\tvar overlay = {\n\t\t\ttoken: function(stream) {\n\t\t\t\tvar ch = stream.peek();\n\t\t\t\tvar word = \"\";\n\n\t\t\t\tif(rx_word.includes(ch)) {\n\t\t\t\t\tstream.next();\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\n\t\t\t\twhile((ch = stream.peek()) != null && !rx_word.includes(ch)) {\n\t\t\t\t\tword += ch;\n\t\t\t\t\tstream.next();\n\t\t\t\t}\n\n\t\t\t\tif(CodeMirrorSpellChecker.typo && !CodeMirrorSpellChecker.typo.check(word))\n\t\t\t\t\treturn \"spell-error\"; // CSS class: cm-spell-error\n\n\t\t\t\treturn null;\n\t\t\t}\n\t\t};\n\n\t\tvar mode = options.codeMirrorInstance.getMode(\n\t\t\tconfig, config.backdrop || \"text/plain\"\n\t\t);\n\n\t\treturn options.codeMirrorInstance.overlayMode(mode, overlay, true);\n\t});\n}\n\n\n// Initialize data globally to reduce memory consumption\nCodeMirrorSpellChecker.num_loaded = 0;\nCodeMirrorSpellChecker.aff_loading = false;\nCodeMirrorSpellChecker.dic_loading = false;\nCodeMirrorSpellChecker.aff_data = \"\";\nCodeMirrorSpellChecker.dic_data = \"\";\nCodeMirrorSpellChecker.typo;\n\n\n// Export\nmodule.exports = CodeMirrorSpellChecker;","/**\n * marked v4.3.0 - a markdown parser\n * Copyright (c) 2011-2023, Christopher Jeffrey. (MIT Licensed)\n * https://github.com/markedjs/marked\n */\n\n/**\n * DO NOT EDIT THIS FILE\n * The code in this file is generated from files in ./src/\n */\n\n'use strict';\n\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor);\n }\n}\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n Object.defineProperty(Constructor, \"prototype\", {\n writable: false\n });\n return Constructor;\n}\nfunction _extends() {\n _extends = Object.assign ? Object.assign.bind() : function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n return target;\n };\n return _extends.apply(this, arguments);\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n return arr2;\n}\nfunction _createForOfIteratorHelperLoose(o, allowArrayLike) {\n var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"];\n if (it) return (it = it.call(o)).next.bind(it);\n if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n if (it) o = it;\n var i = 0;\n return function () {\n if (i >= o.length) return {\n done: true\n };\n return {\n done: false,\n value: o[i++]\n };\n };\n }\n throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nfunction _toPrimitive(input, hint) {\n if (typeof input !== \"object\" || input === null) return input;\n var prim = input[Symbol.toPrimitive];\n if (prim !== undefined) {\n var res = prim.call(input, hint || \"default\");\n if (typeof res !== \"object\") return res;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }\n return (hint === \"string\" ? String : Number)(input);\n}\nfunction _toPropertyKey(arg) {\n var key = _toPrimitive(arg, \"string\");\n return typeof key === \"symbol\" ? key : String(key);\n}\n\nfunction getDefaults() {\n return {\n async: false,\n baseUrl: null,\n breaks: false,\n extensions: null,\n gfm: true,\n headerIds: true,\n headerPrefix: '',\n highlight: null,\n hooks: null,\n langPrefix: 'language-',\n mangle: true,\n pedantic: false,\n renderer: null,\n sanitize: false,\n sanitizer: null,\n silent: false,\n smartypants: false,\n tokenizer: null,\n walkTokens: null,\n xhtml: false\n };\n}\nexports.defaults = getDefaults();\nfunction changeDefaults(newDefaults) {\n exports.defaults = newDefaults;\n}\n\n/**\n * Helpers\n */\nvar escapeTest = /[&<>\"']/;\nvar escapeReplace = new RegExp(escapeTest.source, 'g');\nvar escapeTestNoEncode = /[<>\"']|&(?!(#\\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\\w+);)/;\nvar escapeReplaceNoEncode = new RegExp(escapeTestNoEncode.source, 'g');\nvar escapeReplacements = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": '''\n};\nvar getEscapeReplacement = function getEscapeReplacement(ch) {\n return escapeReplacements[ch];\n};\nfunction escape(html, encode) {\n if (encode) {\n if (escapeTest.test(html)) {\n return html.replace(escapeReplace, getEscapeReplacement);\n }\n } else {\n if (escapeTestNoEncode.test(html)) {\n return html.replace(escapeReplaceNoEncode, getEscapeReplacement);\n }\n }\n return html;\n}\nvar unescapeTest = /&(#(?:\\d+)|(?:#x[0-9A-Fa-f]+)|(?:\\w+));?/ig;\n\n/**\n * @param {string} html\n */\nfunction unescape(html) {\n // explicitly match decimal, hex, and named HTML entities\n return html.replace(unescapeTest, function (_, n) {\n n = n.toLowerCase();\n if (n === 'colon') return ':';\n if (n.charAt(0) === '#') {\n return n.charAt(1) === 'x' ? String.fromCharCode(parseInt(n.substring(2), 16)) : String.fromCharCode(+n.substring(1));\n }\n return '';\n });\n}\nvar caret = /(^|[^\\[])\\^/g;\n\n/**\n * @param {string | RegExp} regex\n * @param {string} opt\n */\nfunction edit(regex, opt) {\n regex = typeof regex === 'string' ? regex : regex.source;\n opt = opt || '';\n var obj = {\n replace: function replace(name, val) {\n val = val.source || val;\n val = val.replace(caret, '$1');\n regex = regex.replace(name, val);\n return obj;\n },\n getRegex: function getRegex() {\n return new RegExp(regex, opt);\n }\n };\n return obj;\n}\nvar nonWordAndColonTest = /[^\\w:]/g;\nvar originIndependentUrl = /^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;\n\n/**\n * @param {boolean} sanitize\n * @param {string} base\n * @param {string} href\n */\nfunction cleanUrl(sanitize, base, href) {\n if (sanitize) {\n var prot;\n try {\n prot = decodeURIComponent(unescape(href)).replace(nonWordAndColonTest, '').toLowerCase();\n } catch (e) {\n return null;\n }\n if (prot.indexOf('javascript:') === 0 || prot.indexOf('vbscript:') === 0 || prot.indexOf('data:') === 0) {\n return null;\n }\n }\n if (base && !originIndependentUrl.test(href)) {\n href = resolveUrl(base, href);\n }\n try {\n href = encodeURI(href).replace(/%25/g, '%');\n } catch (e) {\n return null;\n }\n return href;\n}\nvar baseUrls = {};\nvar justDomain = /^[^:]+:\\/*[^/]*$/;\nvar protocol = /^([^:]+:)[\\s\\S]*$/;\nvar domain = /^([^:]+:\\/*[^/]*)[\\s\\S]*$/;\n\n/**\n * @param {string} base\n * @param {string} href\n */\nfunction resolveUrl(base, href) {\n if (!baseUrls[' ' + base]) {\n // we can ignore everything in base after the last slash of its path component,\n // but we might need to add _that_\n // https://tools.ietf.org/html/rfc3986#section-3\n if (justDomain.test(base)) {\n baseUrls[' ' + base] = base + '/';\n } else {\n baseUrls[' ' + base] = rtrim(base, '/', true);\n }\n }\n base = baseUrls[' ' + base];\n var relativeBase = base.indexOf(':') === -1;\n if (href.substring(0, 2) === '//') {\n if (relativeBase) {\n return href;\n }\n return base.replace(protocol, '$1') + href;\n } else if (href.charAt(0) === '/') {\n if (relativeBase) {\n return href;\n }\n return base.replace(domain, '$1') + href;\n } else {\n return base + href;\n }\n}\nvar noopTest = {\n exec: function noopTest() {}\n};\nfunction splitCells(tableRow, count) {\n // ensure that every cell-delimiting pipe has a space\n // before it to distinguish it from an escaped pipe\n var row = tableRow.replace(/\\|/g, function (match, offset, str) {\n var escaped = false,\n curr = offset;\n while (--curr >= 0 && str[curr] === '\\\\') {\n escaped = !escaped;\n }\n if (escaped) {\n // odd number of slashes means | is escaped\n // so we leave it alone\n return '|';\n } else {\n // add space before unescaped |\n return ' |';\n }\n }),\n cells = row.split(/ \\|/);\n var i = 0;\n\n // First/last cell in a row cannot be empty if it has no leading/trailing pipe\n if (!cells[0].trim()) {\n cells.shift();\n }\n if (cells.length > 0 && !cells[cells.length - 1].trim()) {\n cells.pop();\n }\n if (cells.length > count) {\n cells.splice(count);\n } else {\n while (cells.length < count) {\n cells.push('');\n }\n }\n for (; i < cells.length; i++) {\n // leading or trailing whitespace is ignored per the gfm spec\n cells[i] = cells[i].trim().replace(/\\\\\\|/g, '|');\n }\n return cells;\n}\n\n/**\n * Remove trailing 'c's. Equivalent to str.replace(/c*$/, '').\n * /c*$/ is vulnerable to REDOS.\n *\n * @param {string} str\n * @param {string} c\n * @param {boolean} invert Remove suffix of non-c chars instead. Default falsey.\n */\nfunction rtrim(str, c, invert) {\n var l = str.length;\n if (l === 0) {\n return '';\n }\n\n // Length of suffix matching the invert condition.\n var suffLen = 0;\n\n // Step left until we fail to match the invert condition.\n while (suffLen < l) {\n var currChar = str.charAt(l - suffLen - 1);\n if (currChar === c && !invert) {\n suffLen++;\n } else if (currChar !== c && invert) {\n suffLen++;\n } else {\n break;\n }\n }\n return str.slice(0, l - suffLen);\n}\nfunction findClosingBracket(str, b) {\n if (str.indexOf(b[1]) === -1) {\n return -1;\n }\n var l = str.length;\n var level = 0,\n i = 0;\n for (; i < l; i++) {\n if (str[i] === '\\\\') {\n i++;\n } else if (str[i] === b[0]) {\n level++;\n } else if (str[i] === b[1]) {\n level--;\n if (level < 0) {\n return i;\n }\n }\n }\n return -1;\n}\nfunction checkSanitizeDeprecation(opt) {\n if (opt && opt.sanitize && !opt.silent) {\n console.warn('marked(): sanitize and sanitizer parameters are deprecated since version 0.7.0, should not be used and will be removed in the future. Read more here: https://marked.js.org/#/USING_ADVANCED.md#options');\n }\n}\n\n// copied from https://stackoverflow.com/a/5450113/806777\n/**\n * @param {string} pattern\n * @param {number} count\n */\nfunction repeatString(pattern, count) {\n if (count < 1) {\n return '';\n }\n var result = '';\n while (count > 1) {\n if (count & 1) {\n result += pattern;\n }\n count >>= 1;\n pattern += pattern;\n }\n return result + pattern;\n}\n\nfunction outputLink(cap, link, raw, lexer) {\n var href = link.href;\n var title = link.title ? escape(link.title) : null;\n var text = cap[1].replace(/\\\\([\\[\\]])/g, '$1');\n if (cap[0].charAt(0) !== '!') {\n lexer.state.inLink = true;\n var token = {\n type: 'link',\n raw: raw,\n href: href,\n title: title,\n text: text,\n tokens: lexer.inlineTokens(text)\n };\n lexer.state.inLink = false;\n return token;\n }\n return {\n type: 'image',\n raw: raw,\n href: href,\n title: title,\n text: escape(text)\n };\n}\nfunction indentCodeCompensation(raw, text) {\n var matchIndentToCode = raw.match(/^(\\s+)(?:```)/);\n if (matchIndentToCode === null) {\n return text;\n }\n var indentToCode = matchIndentToCode[1];\n return text.split('\\n').map(function (node) {\n var matchIndentInNode = node.match(/^\\s+/);\n if (matchIndentInNode === null) {\n return node;\n }\n var indentInNode = matchIndentInNode[0];\n if (indentInNode.length >= indentToCode.length) {\n return node.slice(indentToCode.length);\n }\n return node;\n }).join('\\n');\n}\n\n/**\n * Tokenizer\n */\nvar Tokenizer = /*#__PURE__*/function () {\n function Tokenizer(options) {\n this.options = options || exports.defaults;\n }\n var _proto = Tokenizer.prototype;\n _proto.space = function space(src) {\n var cap = this.rules.block.newline.exec(src);\n if (cap && cap[0].length > 0) {\n return {\n type: 'space',\n raw: cap[0]\n };\n }\n };\n _proto.code = function code(src) {\n var cap = this.rules.block.code.exec(src);\n if (cap) {\n var text = cap[0].replace(/^ {1,4}/gm, '');\n return {\n type: 'code',\n raw: cap[0],\n codeBlockStyle: 'indented',\n text: !this.options.pedantic ? rtrim(text, '\\n') : text\n };\n }\n };\n _proto.fences = function fences(src) {\n var cap = this.rules.block.fences.exec(src);\n if (cap) {\n var raw = cap[0];\n var text = indentCodeCompensation(raw, cap[3] || '');\n return {\n type: 'code',\n raw: raw,\n lang: cap[2] ? cap[2].trim().replace(this.rules.inline._escapes, '$1') : cap[2],\n text: text\n };\n }\n };\n _proto.heading = function heading(src) {\n var cap = this.rules.block.heading.exec(src);\n if (cap) {\n var text = cap[2].trim();\n\n // remove trailing #s\n if (/#$/.test(text)) {\n var trimmed = rtrim(text, '#');\n if (this.options.pedantic) {\n text = trimmed.trim();\n } else if (!trimmed || / $/.test(trimmed)) {\n // CommonMark requires space before trailing #s\n text = trimmed.trim();\n }\n }\n return {\n type: 'heading',\n raw: cap[0],\n depth: cap[1].length,\n text: text,\n tokens: this.lexer.inline(text)\n };\n }\n };\n _proto.hr = function hr(src) {\n var cap = this.rules.block.hr.exec(src);\n if (cap) {\n return {\n type: 'hr',\n raw: cap[0]\n };\n }\n };\n _proto.blockquote = function blockquote(src) {\n var cap = this.rules.block.blockquote.exec(src);\n if (cap) {\n var text = cap[0].replace(/^ *>[ \\t]?/gm, '');\n var top = this.lexer.state.top;\n this.lexer.state.top = true;\n var tokens = this.lexer.blockTokens(text);\n this.lexer.state.top = top;\n return {\n type: 'blockquote',\n raw: cap[0],\n tokens: tokens,\n text: text\n };\n }\n };\n _proto.list = function list(src) {\n var cap = this.rules.block.list.exec(src);\n if (cap) {\n var raw, istask, ischecked, indent, i, blankLine, endsWithBlankLine, line, nextLine, rawLine, itemContents, endEarly;\n var bull = cap[1].trim();\n var isordered = bull.length > 1;\n var list = {\n type: 'list',\n raw: '',\n ordered: isordered,\n start: isordered ? +bull.slice(0, -1) : '',\n loose: false,\n items: []\n };\n bull = isordered ? \"\\\\d{1,9}\\\\\" + bull.slice(-1) : \"\\\\\" + bull;\n if (this.options.pedantic) {\n bull = isordered ? bull : '[*+-]';\n }\n\n // Get next list item\n var itemRegex = new RegExp(\"^( {0,3}\" + bull + \")((?:[\\t ][^\\\\n]*)?(?:\\\\n|$))\");\n\n // Check if current bullet point can start a new List Item\n while (src) {\n endEarly = false;\n if (!(cap = itemRegex.exec(src))) {\n break;\n }\n if (this.rules.block.hr.test(src)) {\n // End list if bullet was actually HR (possibly move into itemRegex?)\n break;\n }\n raw = cap[0];\n src = src.substring(raw.length);\n line = cap[2].split('\\n', 1)[0].replace(/^\\t+/, function (t) {\n return ' '.repeat(3 * t.length);\n });\n nextLine = src.split('\\n', 1)[0];\n if (this.options.pedantic) {\n indent = 2;\n itemContents = line.trimLeft();\n } else {\n indent = cap[2].search(/[^ ]/); // Find first non-space char\n indent = indent > 4 ? 1 : indent; // Treat indented code blocks (> 4 spaces) as having only 1 indent\n itemContents = line.slice(indent);\n indent += cap[1].length;\n }\n blankLine = false;\n if (!line && /^ *$/.test(nextLine)) {\n // Items begin with at most one blank line\n raw += nextLine + '\\n';\n src = src.substring(nextLine.length + 1);\n endEarly = true;\n }\n if (!endEarly) {\n var nextBulletRegex = new RegExp(\"^ {0,\" + Math.min(3, indent - 1) + \"}(?:[*+-]|\\\\d{1,9}[.)])((?:[ \\t][^\\\\n]*)?(?:\\\\n|$))\");\n var hrRegex = new RegExp(\"^ {0,\" + Math.min(3, indent - 1) + \"}((?:- *){3,}|(?:_ *){3,}|(?:\\\\* *){3,})(?:\\\\n+|$)\");\n var fencesBeginRegex = new RegExp(\"^ {0,\" + Math.min(3, indent - 1) + \"}(?:```|~~~)\");\n var headingBeginRegex = new RegExp(\"^ {0,\" + Math.min(3, indent - 1) + \"}#\");\n\n // Check if following lines should be included in List Item\n while (src) {\n rawLine = src.split('\\n', 1)[0];\n nextLine = rawLine;\n\n // Re-align to follow commonmark nesting rules\n if (this.options.pedantic) {\n nextLine = nextLine.replace(/^ {1,4}(?=( {4})*[^ ])/g, ' ');\n }\n\n // End list item if found code fences\n if (fencesBeginRegex.test(nextLine)) {\n break;\n }\n\n // End list item if found start of new heading\n if (headingBeginRegex.test(nextLine)) {\n break;\n }\n\n // End list item if found start of new bullet\n if (nextBulletRegex.test(nextLine)) {\n break;\n }\n\n // Horizontal rule found\n if (hrRegex.test(src)) {\n break;\n }\n if (nextLine.search(/[^ ]/) >= indent || !nextLine.trim()) {\n // Dedent if possible\n itemContents += '\\n' + nextLine.slice(indent);\n } else {\n // not enough indentation\n if (blankLine) {\n break;\n }\n\n // paragraph continuation unless last line was a different block level element\n if (line.search(/[^ ]/) >= 4) {\n // indented code block\n break;\n }\n if (fencesBeginRegex.test(line)) {\n break;\n }\n if (headingBeginRegex.test(line)) {\n break;\n }\n if (hrRegex.test(line)) {\n break;\n }\n itemContents += '\\n' + nextLine;\n }\n if (!blankLine && !nextLine.trim()) {\n // Check if current line is blank\n blankLine = true;\n }\n raw += rawLine + '\\n';\n src = src.substring(rawLine.length + 1);\n line = nextLine.slice(indent);\n }\n }\n if (!list.loose) {\n // If the previous item ended with a blank line, the list is loose\n if (endsWithBlankLine) {\n list.loose = true;\n } else if (/\\n *\\n *$/.test(raw)) {\n endsWithBlankLine = true;\n }\n }\n\n // Check for task list items\n if (this.options.gfm) {\n istask = /^\\[[ xX]\\] /.exec(itemContents);\n if (istask) {\n ischecked = istask[0] !== '[ ] ';\n itemContents = itemContents.replace(/^\\[[ xX]\\] +/, '');\n }\n }\n list.items.push({\n type: 'list_item',\n raw: raw,\n task: !!istask,\n checked: ischecked,\n loose: false,\n text: itemContents\n });\n list.raw += raw;\n }\n\n // Do not consume newlines at end of final item. Alternatively, make itemRegex *start* with any newlines to simplify/speed up endsWithBlankLine logic\n list.items[list.items.length - 1].raw = raw.trimRight();\n list.items[list.items.length - 1].text = itemContents.trimRight();\n list.raw = list.raw.trimRight();\n var l = list.items.length;\n\n // Item child tokens handled here at end because we needed to have the final item to trim it first\n for (i = 0; i < l; i++) {\n this.lexer.state.top = false;\n list.items[i].tokens = this.lexer.blockTokens(list.items[i].text, []);\n if (!list.loose) {\n // Check if list should be loose\n var spacers = list.items[i].tokens.filter(function (t) {\n return t.type === 'space';\n });\n var hasMultipleLineBreaks = spacers.length > 0 && spacers.some(function (t) {\n return /\\n.*\\n/.test(t.raw);\n });\n list.loose = hasMultipleLineBreaks;\n }\n }\n\n // Set all items to loose if list is loose\n if (list.loose) {\n for (i = 0; i < l; i++) {\n list.items[i].loose = true;\n }\n }\n return list;\n }\n };\n _proto.html = function html(src) {\n var cap = this.rules.block.html.exec(src);\n if (cap) {\n var token = {\n type: 'html',\n raw: cap[0],\n pre: !this.options.sanitizer && (cap[1] === 'pre' || cap[1] === 'script' || cap[1] === 'style'),\n text: cap[0]\n };\n if (this.options.sanitize) {\n var text = this.options.sanitizer ? this.options.sanitizer(cap[0]) : escape(cap[0]);\n token.type = 'paragraph';\n token.text = text;\n token.tokens = this.lexer.inline(text);\n }\n return token;\n }\n };\n _proto.def = function def(src) {\n var cap = this.rules.block.def.exec(src);\n if (cap) {\n var tag = cap[1].toLowerCase().replace(/\\s+/g, ' ');\n var href = cap[2] ? cap[2].replace(/^<(.*)>$/, '$1').replace(this.rules.inline._escapes, '$1') : '';\n var title = cap[3] ? cap[3].substring(1, cap[3].length - 1).replace(this.rules.inline._escapes, '$1') : cap[3];\n return {\n type: 'def',\n tag: tag,\n raw: cap[0],\n href: href,\n title: title\n };\n }\n };\n _proto.table = function table(src) {\n var cap = this.rules.block.table.exec(src);\n if (cap) {\n var item = {\n type: 'table',\n header: splitCells(cap[1]).map(function (c) {\n return {\n text: c\n };\n }),\n align: cap[2].replace(/^ *|\\| *$/g, '').split(/ *\\| */),\n rows: cap[3] && cap[3].trim() ? cap[3].replace(/\\n[ \\t]*$/, '').split('\\n') : []\n };\n if (item.header.length === item.align.length) {\n item.raw = cap[0];\n var l = item.align.length;\n var i, j, k, row;\n for (i = 0; i < l; i++) {\n if (/^ *-+: *$/.test(item.align[i])) {\n item.align[i] = 'right';\n } else if (/^ *:-+: *$/.test(item.align[i])) {\n item.align[i] = 'center';\n } else if (/^ *:-+ *$/.test(item.align[i])) {\n item.align[i] = 'left';\n } else {\n item.align[i] = null;\n }\n }\n l = item.rows.length;\n for (i = 0; i < l; i++) {\n item.rows[i] = splitCells(item.rows[i], item.header.length).map(function (c) {\n return {\n text: c\n };\n });\n }\n\n // parse child tokens inside headers and cells\n\n // header child tokens\n l = item.header.length;\n for (j = 0; j < l; j++) {\n item.header[j].tokens = this.lexer.inline(item.header[j].text);\n }\n\n // cell child tokens\n l = item.rows.length;\n for (j = 0; j < l; j++) {\n row = item.rows[j];\n for (k = 0; k < row.length; k++) {\n row[k].tokens = this.lexer.inline(row[k].text);\n }\n }\n return item;\n }\n }\n };\n _proto.lheading = function lheading(src) {\n var cap = this.rules.block.lheading.exec(src);\n if (cap) {\n return {\n type: 'heading',\n raw: cap[0],\n depth: cap[2].charAt(0) === '=' ? 1 : 2,\n text: cap[1],\n tokens: this.lexer.inline(cap[1])\n };\n }\n };\n _proto.paragraph = function paragraph(src) {\n var cap = this.rules.block.paragraph.exec(src);\n if (cap) {\n var text = cap[1].charAt(cap[1].length - 1) === '\\n' ? cap[1].slice(0, -1) : cap[1];\n return {\n type: 'paragraph',\n raw: cap[0],\n text: text,\n tokens: this.lexer.inline(text)\n };\n }\n };\n _proto.text = function text(src) {\n var cap = this.rules.block.text.exec(src);\n if (cap) {\n return {\n type: 'text',\n raw: cap[0],\n text: cap[0],\n tokens: this.lexer.inline(cap[0])\n };\n }\n };\n _proto.escape = function escape$1(src) {\n var cap = this.rules.inline.escape.exec(src);\n if (cap) {\n return {\n type: 'escape',\n raw: cap[0],\n text: escape(cap[1])\n };\n }\n };\n _proto.tag = function tag(src) {\n var cap = this.rules.inline.tag.exec(src);\n if (cap) {\n if (!this.lexer.state.inLink && /^/i.test(cap[0])) {\n this.lexer.state.inLink = false;\n }\n if (!this.lexer.state.inRawBlock && /^<(pre|code|kbd|script)(\\s|>)/i.test(cap[0])) {\n this.lexer.state.inRawBlock = true;\n } else if (this.lexer.state.inRawBlock && /^<\\/(pre|code|kbd|script)(\\s|>)/i.test(cap[0])) {\n this.lexer.state.inRawBlock = false;\n }\n return {\n type: this.options.sanitize ? 'text' : 'html',\n raw: cap[0],\n inLink: this.lexer.state.inLink,\n inRawBlock: this.lexer.state.inRawBlock,\n text: this.options.sanitize ? this.options.sanitizer ? this.options.sanitizer(cap[0]) : escape(cap[0]) : cap[0]\n };\n }\n };\n _proto.link = function link(src) {\n var cap = this.rules.inline.link.exec(src);\n if (cap) {\n var trimmedUrl = cap[2].trim();\n if (!this.options.pedantic && /^$/.test(trimmedUrl)) {\n return;\n }\n\n // ending angle bracket cannot be escaped\n var rtrimSlash = rtrim(trimmedUrl.slice(0, -1), '\\\\');\n if ((trimmedUrl.length - rtrimSlash.length) % 2 === 0) {\n return;\n }\n } else {\n // find closing parenthesis\n var lastParenIndex = findClosingBracket(cap[2], '()');\n if (lastParenIndex > -1) {\n var start = cap[0].indexOf('!') === 0 ? 5 : 4;\n var linkLen = start + cap[1].length + lastParenIndex;\n cap[2] = cap[2].substring(0, lastParenIndex);\n cap[0] = cap[0].substring(0, linkLen).trim();\n cap[3] = '';\n }\n }\n var href = cap[2];\n var title = '';\n if (this.options.pedantic) {\n // split pedantic href and title\n var link = /^([^'\"]*[^\\s])\\s+(['\"])(.*)\\2/.exec(href);\n if (link) {\n href = link[1];\n title = link[3];\n }\n } else {\n title = cap[3] ? cap[3].slice(1, -1) : '';\n }\n href = href.trim();\n if (/^$/.test(trimmedUrl)) {\n // pedantic allows starting angle bracket without ending angle bracket\n href = href.slice(1);\n } else {\n href = href.slice(1, -1);\n }\n }\n return outputLink(cap, {\n href: href ? href.replace(this.rules.inline._escapes, '$1') : href,\n title: title ? title.replace(this.rules.inline._escapes, '$1') : title\n }, cap[0], this.lexer);\n }\n };\n _proto.reflink = function reflink(src, links) {\n var cap;\n if ((cap = this.rules.inline.reflink.exec(src)) || (cap = this.rules.inline.nolink.exec(src))) {\n var link = (cap[2] || cap[1]).replace(/\\s+/g, ' ');\n link = links[link.toLowerCase()];\n if (!link) {\n var text = cap[0].charAt(0);\n return {\n type: 'text',\n raw: text,\n text: text\n };\n }\n return outputLink(cap, link, cap[0], this.lexer);\n }\n };\n _proto.emStrong = function emStrong(src, maskedSrc, prevChar) {\n if (prevChar === void 0) {\n prevChar = '';\n }\n var match = this.rules.inline.emStrong.lDelim.exec(src);\n if (!match) return;\n\n // _ can't be between two alphanumerics. \\p{L}\\p{N} includes non-english alphabet/numbers as well\n if (match[3] && prevChar.match(/(?:[0-9A-Za-z\\xAA\\xB2\\xB3\\xB5\\xB9\\xBA\\xBC-\\xBE\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0370-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u048A-\\u052F\\u0531-\\u0556\\u0559\\u0560-\\u0588\\u05D0-\\u05EA\\u05EF-\\u05F2\\u0620-\\u064A\\u0660-\\u0669\\u066E\\u066F\\u0671-\\u06D3\\u06D5\\u06E5\\u06E6\\u06EE-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07C0-\\u07EA\\u07F4\\u07F5\\u07FA\\u0800-\\u0815\\u081A\\u0824\\u0828\\u0840-\\u0858\\u0860-\\u086A\\u0870-\\u0887\\u0889-\\u088E\\u08A0-\\u08C9\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0966-\\u096F\\u0971-\\u0980\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF-\\u09E1\\u09E6-\\u09F1\\u09F4-\\u09F9\\u09FC\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A59-\\u0A5C\\u0A5E\\u0A66-\\u0A6F\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0AE6-\\u0AEF\\u0AF9\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F-\\u0B61\\u0B66-\\u0B6F\\u0B71-\\u0B77\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0\\u0BE6-\\u0BF2\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D\\u0C58-\\u0C5A\\u0C5D\\u0C60\\u0C61\\u0C66-\\u0C6F\\u0C78-\\u0C7E\\u0C80\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDD\\u0CDE\\u0CE0\\u0CE1\\u0CE6-\\u0CEF\\u0CF1\\u0CF2\\u0D04-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D\\u0D4E\\u0D54-\\u0D56\\u0D58-\\u0D61\\u0D66-\\u0D78\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0DE6-\\u0DEF\\u0E01-\\u0E30\\u0E32\\u0E33\\u0E40-\\u0E46\\u0E50-\\u0E59\\u0E81\\u0E82\\u0E84\\u0E86-\\u0E8A\\u0E8C-\\u0EA3\\u0EA5\\u0EA7-\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0ED0-\\u0ED9\\u0EDC-\\u0EDF\\u0F00\\u0F20-\\u0F33\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8C\\u1000-\\u102A\\u103F-\\u1049\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u1090-\\u1099\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1369-\\u137C\\u1380-\\u138F\\u13A0-\\u13F5\\u13F8-\\u13FD\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16EE-\\u16F8\\u1700-\\u1711\\u171F-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17D7\\u17DC\\u17E0-\\u17E9\\u17F0-\\u17F9\\u1810-\\u1819\\u1820-\\u1878\\u1880-\\u1884\\u1887-\\u18A8\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1946-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19B0-\\u19C9\\u19D0-\\u19DA\\u1A00-\\u1A16\\u1A20-\\u1A54\\u1A80-\\u1A89\\u1A90-\\u1A99\\u1AA7\\u1B05-\\u1B33\\u1B45-\\u1B4C\\u1B50-\\u1B59\\u1B83-\\u1BA0\\u1BAE-\\u1BE5\\u1C00-\\u1C23\\u1C40-\\u1C49\\u1C4D-\\u1C7D\\u1C80-\\u1C88\\u1C90-\\u1CBA\\u1CBD-\\u1CBF\\u1CE9-\\u1CEC\\u1CEE-\\u1CF3\\u1CF5\\u1CF6\\u1CFA\\u1D00-\\u1DBF\\u1E00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2070\\u2071\\u2074-\\u2079\\u207F-\\u2089\\u2090-\\u209C\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2150-\\u2189\\u2460-\\u249B\\u24EA-\\u24FF\\u2776-\\u2793\\u2C00-\\u2CE4\\u2CEB-\\u2CEE\\u2CF2\\u2CF3\\u2CFD\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2E2F\\u3005-\\u3007\\u3021-\\u3029\\u3031-\\u3035\\u3038-\\u303C\\u3041-\\u3096\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312F\\u3131-\\u318E\\u3192-\\u3195\\u31A0-\\u31BF\\u31F0-\\u31FF\\u3220-\\u3229\\u3248-\\u324F\\u3251-\\u325F\\u3280-\\u3289\\u32B1-\\u32BF\\u3400-\\u4DBF\\u4E00-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA62B\\uA640-\\uA66E\\uA67F-\\uA69D\\uA6A0-\\uA6EF\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA7CA\\uA7D0\\uA7D1\\uA7D3\\uA7D5-\\uA7D9\\uA7F2-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA830-\\uA835\\uA840-\\uA873\\uA882-\\uA8B3\\uA8D0-\\uA8D9\\uA8F2-\\uA8F7\\uA8FB\\uA8FD\\uA8FE\\uA900-\\uA925\\uA930-\\uA946\\uA960-\\uA97C\\uA984-\\uA9B2\\uA9CF-\\uA9D9\\uA9E0-\\uA9E4\\uA9E6-\\uA9FE\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAA50-\\uAA59\\uAA60-\\uAA76\\uAA7A\\uAA7E-\\uAAAF\\uAAB1\\uAAB5\\uAAB6\\uAAB9-\\uAABD\\uAAC0\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEA\\uAAF2-\\uAAF4\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAB30-\\uAB5A\\uAB5C-\\uAB69\\uAB70-\\uABE2\\uABF0-\\uABF9\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF10-\\uFF19\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC]|\\uD800[\\uDC00-\\uDC0B\\uDC0D-\\uDC26\\uDC28-\\uDC3A\\uDC3C\\uDC3D\\uDC3F-\\uDC4D\\uDC50-\\uDC5D\\uDC80-\\uDCFA\\uDD07-\\uDD33\\uDD40-\\uDD78\\uDD8A\\uDD8B\\uDE80-\\uDE9C\\uDEA0-\\uDED0\\uDEE1-\\uDEFB\\uDF00-\\uDF23\\uDF2D-\\uDF4A\\uDF50-\\uDF75\\uDF80-\\uDF9D\\uDFA0-\\uDFC3\\uDFC8-\\uDFCF\\uDFD1-\\uDFD5]|\\uD801[\\uDC00-\\uDC9D\\uDCA0-\\uDCA9\\uDCB0-\\uDCD3\\uDCD8-\\uDCFB\\uDD00-\\uDD27\\uDD30-\\uDD63\\uDD70-\\uDD7A\\uDD7C-\\uDD8A\\uDD8C-\\uDD92\\uDD94\\uDD95\\uDD97-\\uDDA1\\uDDA3-\\uDDB1\\uDDB3-\\uDDB9\\uDDBB\\uDDBC\\uDE00-\\uDF36\\uDF40-\\uDF55\\uDF60-\\uDF67\\uDF80-\\uDF85\\uDF87-\\uDFB0\\uDFB2-\\uDFBA]|\\uD802[\\uDC00-\\uDC05\\uDC08\\uDC0A-\\uDC35\\uDC37\\uDC38\\uDC3C\\uDC3F-\\uDC55\\uDC58-\\uDC76\\uDC79-\\uDC9E\\uDCA7-\\uDCAF\\uDCE0-\\uDCF2\\uDCF4\\uDCF5\\uDCFB-\\uDD1B\\uDD20-\\uDD39\\uDD80-\\uDDB7\\uDDBC-\\uDDCF\\uDDD2-\\uDE00\\uDE10-\\uDE13\\uDE15-\\uDE17\\uDE19-\\uDE35\\uDE40-\\uDE48\\uDE60-\\uDE7E\\uDE80-\\uDE9F\\uDEC0-\\uDEC7\\uDEC9-\\uDEE4\\uDEEB-\\uDEEF\\uDF00-\\uDF35\\uDF40-\\uDF55\\uDF58-\\uDF72\\uDF78-\\uDF91\\uDFA9-\\uDFAF]|\\uD803[\\uDC00-\\uDC48\\uDC80-\\uDCB2\\uDCC0-\\uDCF2\\uDCFA-\\uDD23\\uDD30-\\uDD39\\uDE60-\\uDE7E\\uDE80-\\uDEA9\\uDEB0\\uDEB1\\uDF00-\\uDF27\\uDF30-\\uDF45\\uDF51-\\uDF54\\uDF70-\\uDF81\\uDFB0-\\uDFCB\\uDFE0-\\uDFF6]|\\uD804[\\uDC03-\\uDC37\\uDC52-\\uDC6F\\uDC71\\uDC72\\uDC75\\uDC83-\\uDCAF\\uDCD0-\\uDCE8\\uDCF0-\\uDCF9\\uDD03-\\uDD26\\uDD36-\\uDD3F\\uDD44\\uDD47\\uDD50-\\uDD72\\uDD76\\uDD83-\\uDDB2\\uDDC1-\\uDDC4\\uDDD0-\\uDDDA\\uDDDC\\uDDE1-\\uDDF4\\uDE00-\\uDE11\\uDE13-\\uDE2B\\uDE80-\\uDE86\\uDE88\\uDE8A-\\uDE8D\\uDE8F-\\uDE9D\\uDE9F-\\uDEA8\\uDEB0-\\uDEDE\\uDEF0-\\uDEF9\\uDF05-\\uDF0C\\uDF0F\\uDF10\\uDF13-\\uDF28\\uDF2A-\\uDF30\\uDF32\\uDF33\\uDF35-\\uDF39\\uDF3D\\uDF50\\uDF5D-\\uDF61]|\\uD805[\\uDC00-\\uDC34\\uDC47-\\uDC4A\\uDC50-\\uDC59\\uDC5F-\\uDC61\\uDC80-\\uDCAF\\uDCC4\\uDCC5\\uDCC7\\uDCD0-\\uDCD9\\uDD80-\\uDDAE\\uDDD8-\\uDDDB\\uDE00-\\uDE2F\\uDE44\\uDE50-\\uDE59\\uDE80-\\uDEAA\\uDEB8\\uDEC0-\\uDEC9\\uDF00-\\uDF1A\\uDF30-\\uDF3B\\uDF40-\\uDF46]|\\uD806[\\uDC00-\\uDC2B\\uDCA0-\\uDCF2\\uDCFF-\\uDD06\\uDD09\\uDD0C-\\uDD13\\uDD15\\uDD16\\uDD18-\\uDD2F\\uDD3F\\uDD41\\uDD50-\\uDD59\\uDDA0-\\uDDA7\\uDDAA-\\uDDD0\\uDDE1\\uDDE3\\uDE00\\uDE0B-\\uDE32\\uDE3A\\uDE50\\uDE5C-\\uDE89\\uDE9D\\uDEB0-\\uDEF8]|\\uD807[\\uDC00-\\uDC08\\uDC0A-\\uDC2E\\uDC40\\uDC50-\\uDC6C\\uDC72-\\uDC8F\\uDD00-\\uDD06\\uDD08\\uDD09\\uDD0B-\\uDD30\\uDD46\\uDD50-\\uDD59\\uDD60-\\uDD65\\uDD67\\uDD68\\uDD6A-\\uDD89\\uDD98\\uDDA0-\\uDDA9\\uDEE0-\\uDEF2\\uDFB0\\uDFC0-\\uDFD4]|\\uD808[\\uDC00-\\uDF99]|\\uD809[\\uDC00-\\uDC6E\\uDC80-\\uDD43]|\\uD80B[\\uDF90-\\uDFF0]|[\\uD80C\\uD81C-\\uD820\\uD822\\uD840-\\uD868\\uD86A-\\uD86C\\uD86F-\\uD872\\uD874-\\uD879\\uD880-\\uD883][\\uDC00-\\uDFFF]|\\uD80D[\\uDC00-\\uDC2E]|\\uD811[\\uDC00-\\uDE46]|\\uD81A[\\uDC00-\\uDE38\\uDE40-\\uDE5E\\uDE60-\\uDE69\\uDE70-\\uDEBE\\uDEC0-\\uDEC9\\uDED0-\\uDEED\\uDF00-\\uDF2F\\uDF40-\\uDF43\\uDF50-\\uDF59\\uDF5B-\\uDF61\\uDF63-\\uDF77\\uDF7D-\\uDF8F]|\\uD81B[\\uDE40-\\uDE96\\uDF00-\\uDF4A\\uDF50\\uDF93-\\uDF9F\\uDFE0\\uDFE1\\uDFE3]|\\uD821[\\uDC00-\\uDFF7]|\\uD823[\\uDC00-\\uDCD5\\uDD00-\\uDD08]|\\uD82B[\\uDFF0-\\uDFF3\\uDFF5-\\uDFFB\\uDFFD\\uDFFE]|\\uD82C[\\uDC00-\\uDD22\\uDD50-\\uDD52\\uDD64-\\uDD67\\uDD70-\\uDEFB]|\\uD82F[\\uDC00-\\uDC6A\\uDC70-\\uDC7C\\uDC80-\\uDC88\\uDC90-\\uDC99]|\\uD834[\\uDEE0-\\uDEF3\\uDF60-\\uDF78]|\\uD835[\\uDC00-\\uDC54\\uDC56-\\uDC9C\\uDC9E\\uDC9F\\uDCA2\\uDCA5\\uDCA6\\uDCA9-\\uDCAC\\uDCAE-\\uDCB9\\uDCBB\\uDCBD-\\uDCC3\\uDCC5-\\uDD05\\uDD07-\\uDD0A\\uDD0D-\\uDD14\\uDD16-\\uDD1C\\uDD1E-\\uDD39\\uDD3B-\\uDD3E\\uDD40-\\uDD44\\uDD46\\uDD4A-\\uDD50\\uDD52-\\uDEA5\\uDEA8-\\uDEC0\\uDEC2-\\uDEDA\\uDEDC-\\uDEFA\\uDEFC-\\uDF14\\uDF16-\\uDF34\\uDF36-\\uDF4E\\uDF50-\\uDF6E\\uDF70-\\uDF88\\uDF8A-\\uDFA8\\uDFAA-\\uDFC2\\uDFC4-\\uDFCB\\uDFCE-\\uDFFF]|\\uD837[\\uDF00-\\uDF1E]|\\uD838[\\uDD00-\\uDD2C\\uDD37-\\uDD3D\\uDD40-\\uDD49\\uDD4E\\uDE90-\\uDEAD\\uDEC0-\\uDEEB\\uDEF0-\\uDEF9]|\\uD839[\\uDFE0-\\uDFE6\\uDFE8-\\uDFEB\\uDFED\\uDFEE\\uDFF0-\\uDFFE]|\\uD83A[\\uDC00-\\uDCC4\\uDCC7-\\uDCCF\\uDD00-\\uDD43\\uDD4B\\uDD50-\\uDD59]|\\uD83B[\\uDC71-\\uDCAB\\uDCAD-\\uDCAF\\uDCB1-\\uDCB4\\uDD01-\\uDD2D\\uDD2F-\\uDD3D\\uDE00-\\uDE03\\uDE05-\\uDE1F\\uDE21\\uDE22\\uDE24\\uDE27\\uDE29-\\uDE32\\uDE34-\\uDE37\\uDE39\\uDE3B\\uDE42\\uDE47\\uDE49\\uDE4B\\uDE4D-\\uDE4F\\uDE51\\uDE52\\uDE54\\uDE57\\uDE59\\uDE5B\\uDE5D\\uDE5F\\uDE61\\uDE62\\uDE64\\uDE67-\\uDE6A\\uDE6C-\\uDE72\\uDE74-\\uDE77\\uDE79-\\uDE7C\\uDE7E\\uDE80-\\uDE89\\uDE8B-\\uDE9B\\uDEA1-\\uDEA3\\uDEA5-\\uDEA9\\uDEAB-\\uDEBB]|\\uD83C[\\uDD00-\\uDD0C]|\\uD83E[\\uDFF0-\\uDFF9]|\\uD869[\\uDC00-\\uDEDF\\uDF00-\\uDFFF]|\\uD86D[\\uDC00-\\uDF38\\uDF40-\\uDFFF]|\\uD86E[\\uDC00-\\uDC1D\\uDC20-\\uDFFF]|\\uD873[\\uDC00-\\uDEA1\\uDEB0-\\uDFFF]|\\uD87A[\\uDC00-\\uDFE0]|\\uD87E[\\uDC00-\\uDE1D]|\\uD884[\\uDC00-\\uDF4A])/)) return;\n var nextChar = match[1] || match[2] || '';\n if (!nextChar || nextChar && (prevChar === '' || this.rules.inline.punctuation.exec(prevChar))) {\n var lLength = match[0].length - 1;\n var rDelim,\n rLength,\n delimTotal = lLength,\n midDelimTotal = 0;\n var endReg = match[0][0] === '*' ? this.rules.inline.emStrong.rDelimAst : this.rules.inline.emStrong.rDelimUnd;\n endReg.lastIndex = 0;\n\n // Clip maskedSrc to same section of string as src (move to lexer?)\n maskedSrc = maskedSrc.slice(-1 * src.length + lLength);\n while ((match = endReg.exec(maskedSrc)) != null) {\n rDelim = match[1] || match[2] || match[3] || match[4] || match[5] || match[6];\n if (!rDelim) continue; // skip single * in __abc*abc__\n\n rLength = rDelim.length;\n if (match[3] || match[4]) {\n // found another Left Delim\n delimTotal += rLength;\n continue;\n } else if (match[5] || match[6]) {\n // either Left or Right Delim\n if (lLength % 3 && !((lLength + rLength) % 3)) {\n midDelimTotal += rLength;\n continue; // CommonMark Emphasis Rules 9-10\n }\n }\n\n delimTotal -= rLength;\n if (delimTotal > 0) continue; // Haven't found enough closing delimiters\n\n // Remove extra characters. *a*** -> *a*\n rLength = Math.min(rLength, rLength + delimTotal + midDelimTotal);\n var raw = src.slice(0, lLength + match.index + (match[0].length - rDelim.length) + rLength);\n\n // Create `em` if smallest delimiter has odd char count. *a***\n if (Math.min(lLength, rLength) % 2) {\n var _text = raw.slice(1, -1);\n return {\n type: 'em',\n raw: raw,\n text: _text,\n tokens: this.lexer.inlineTokens(_text)\n };\n }\n\n // Create 'strong' if smallest delimiter has even char count. **a***\n var text = raw.slice(2, -2);\n return {\n type: 'strong',\n raw: raw,\n text: text,\n tokens: this.lexer.inlineTokens(text)\n };\n }\n }\n };\n _proto.codespan = function codespan(src) {\n var cap = this.rules.inline.code.exec(src);\n if (cap) {\n var text = cap[2].replace(/\\n/g, ' ');\n var hasNonSpaceChars = /[^ ]/.test(text);\n var hasSpaceCharsOnBothEnds = /^ /.test(text) && / $/.test(text);\n if (hasNonSpaceChars && hasSpaceCharsOnBothEnds) {\n text = text.substring(1, text.length - 1);\n }\n text = escape(text, true);\n return {\n type: 'codespan',\n raw: cap[0],\n text: text\n };\n }\n };\n _proto.br = function br(src) {\n var cap = this.rules.inline.br.exec(src);\n if (cap) {\n return {\n type: 'br',\n raw: cap[0]\n };\n }\n };\n _proto.del = function del(src) {\n var cap = this.rules.inline.del.exec(src);\n if (cap) {\n return {\n type: 'del',\n raw: cap[0],\n text: cap[2],\n tokens: this.lexer.inlineTokens(cap[2])\n };\n }\n };\n _proto.autolink = function autolink(src, mangle) {\n var cap = this.rules.inline.autolink.exec(src);\n if (cap) {\n var text, href;\n if (cap[2] === '@') {\n text = escape(this.options.mangle ? mangle(cap[1]) : cap[1]);\n href = 'mailto:' + text;\n } else {\n text = escape(cap[1]);\n href = text;\n }\n return {\n type: 'link',\n raw: cap[0],\n text: text,\n href: href,\n tokens: [{\n type: 'text',\n raw: text,\n text: text\n }]\n };\n }\n };\n _proto.url = function url(src, mangle) {\n var cap;\n if (cap = this.rules.inline.url.exec(src)) {\n var text, href;\n if (cap[2] === '@') {\n text = escape(this.options.mangle ? mangle(cap[0]) : cap[0]);\n href = 'mailto:' + text;\n } else {\n // do extended autolink path validation\n var prevCapZero;\n do {\n prevCapZero = cap[0];\n cap[0] = this.rules.inline._backpedal.exec(cap[0])[0];\n } while (prevCapZero !== cap[0]);\n text = escape(cap[0]);\n if (cap[1] === 'www.') {\n href = 'http://' + cap[0];\n } else {\n href = cap[0];\n }\n }\n return {\n type: 'link',\n raw: cap[0],\n text: text,\n href: href,\n tokens: [{\n type: 'text',\n raw: text,\n text: text\n }]\n };\n }\n };\n _proto.inlineText = function inlineText(src, smartypants) {\n var cap = this.rules.inline.text.exec(src);\n if (cap) {\n var text;\n if (this.lexer.state.inRawBlock) {\n text = this.options.sanitize ? this.options.sanitizer ? this.options.sanitizer(cap[0]) : escape(cap[0]) : cap[0];\n } else {\n text = escape(this.options.smartypants ? smartypants(cap[0]) : cap[0]);\n }\n return {\n type: 'text',\n raw: cap[0],\n text: text\n };\n }\n };\n return Tokenizer;\n}();\n\n/**\n * Block-Level Grammar\n */\nvar block = {\n newline: /^(?: *(?:\\n|$))+/,\n code: /^( {4}[^\\n]+(?:\\n(?: *(?:\\n|$))*)?)+/,\n fences: /^ {0,3}(`{3,}(?=[^`\\n]*(?:\\n|$))|~{3,})([^\\n]*)(?:\\n|$)(?:|([\\s\\S]*?)(?:\\n|$))(?: {0,3}\\1[~`]* *(?=\\n|$)|$)/,\n hr: /^ {0,3}((?:-[\\t ]*){3,}|(?:_[ \\t]*){3,}|(?:\\*[ \\t]*){3,})(?:\\n+|$)/,\n heading: /^ {0,3}(#{1,6})(?=\\s|$)(.*)(?:\\n+|$)/,\n blockquote: /^( {0,3}> ?(paragraph|[^\\n]*)(?:\\n|$))+/,\n list: /^( {0,3}bull)([ \\t][^\\n]+?)?(?:\\n|$)/,\n html: '^ {0,3}(?:' // optional indentation\n + '<(script|pre|style|textarea)[\\\\s>][\\\\s\\\\S]*?(?:[^\\\\n]*\\\\n+|$)' // (1)\n + '|comment[^\\\\n]*(\\\\n+|$)' // (2)\n + '|<\\\\?[\\\\s\\\\S]*?(?:\\\\?>\\\\n*|$)' // (3)\n + '|\\\\n*|$)' // (4)\n + '|\\\\n*|$)' // (5)\n + '|)[\\\\s\\\\S]*?(?:(?:\\\\n *)+\\\\n|$)' // (6)\n + '|<(?!script|pre|style|textarea)([a-z][\\\\w-]*)(?:attribute)*? */?>(?=[ \\\\t]*(?:\\\\n|$))[\\\\s\\\\S]*?(?:(?:\\\\n *)+\\\\n|$)' // (7) open tag\n + '|(?=[ \\\\t]*(?:\\\\n|$))[\\\\s\\\\S]*?(?:(?:\\\\n *)+\\\\n|$)' // (7) closing tag\n + ')',\n def: /^ {0,3}\\[(label)\\]: *(?:\\n *)?([^<\\s][^\\s]*|<.*?>)(?:(?: +(?:\\n *)?| *\\n *)(title))? *(?:\\n+|$)/,\n table: noopTest,\n lheading: /^((?:.|\\n(?!\\n))+?)\\n {0,3}(=+|-+) *(?:\\n+|$)/,\n // regex template, placeholders will be replaced according to different paragraph\n // interruption rules of commonmark and the original markdown spec:\n _paragraph: /^([^\\n]+(?:\\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\\n)[^\\n]+)*)/,\n text: /^[^\\n]+/\n};\nblock._label = /(?!\\s*\\])(?:\\\\.|[^\\[\\]\\\\])+/;\nblock._title = /(?:\"(?:\\\\\"?|[^\"\\\\])*\"|'[^'\\n]*(?:\\n[^'\\n]+)*\\n?'|\\([^()]*\\))/;\nblock.def = edit(block.def).replace('label', block._label).replace('title', block._title).getRegex();\nblock.bullet = /(?:[*+-]|\\d{1,9}[.)])/;\nblock.listItemStart = edit(/^( *)(bull) */).replace('bull', block.bullet).getRegex();\nblock.list = edit(block.list).replace(/bull/g, block.bullet).replace('hr', '\\\\n+(?=\\\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\\\* *){3,})(?:\\\\n+|$))').replace('def', '\\\\n+(?=' + block.def.source + ')').getRegex();\nblock._tag = 'address|article|aside|base|basefont|blockquote|body|caption' + '|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption' + '|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe' + '|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option' + '|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr' + '|track|ul';\nblock._comment = /|$)/;\nblock.html = edit(block.html, 'i').replace('comment', block._comment).replace('tag', block._tag).replace('attribute', / +[a-zA-Z:_][\\w.:-]*(?: *= *\"[^\"\\n]*\"| *= *'[^'\\n]*'| *= *[^\\s\"'=<>`]+)?/).getRegex();\nblock.paragraph = edit(block._paragraph).replace('hr', block.hr).replace('heading', ' {0,3}#{1,6} ').replace('|lheading', '') // setex headings don't interrupt commonmark paragraphs\n.replace('|table', '').replace('blockquote', ' {0,3}>').replace('fences', ' {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~{3,})[^\\\\n]*\\\\n').replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt\n.replace('html', ')|<(?:script|pre|style|textarea|!--)').replace('tag', block._tag) // pars can be interrupted by type (6) html blocks\n.getRegex();\nblock.blockquote = edit(block.blockquote).replace('paragraph', block.paragraph).getRegex();\n\n/**\n * Normal Block Grammar\n */\n\nblock.normal = _extends({}, block);\n\n/**\n * GFM Block Grammar\n */\n\nblock.gfm = _extends({}, block.normal, {\n table: '^ *([^\\\\n ].*\\\\|.*)\\\\n' // Header\n + ' {0,3}(?:\\\\| *)?(:?-+:? *(?:\\\\| *:?-+:? *)*)(?:\\\\| *)?' // Align\n + '(?:\\\\n((?:(?! *\\\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\\\n|$))*)\\\\n*|$)' // Cells\n});\n\nblock.gfm.table = edit(block.gfm.table).replace('hr', block.hr).replace('heading', ' {0,3}#{1,6} ').replace('blockquote', ' {0,3}>').replace('code', ' {4}[^\\\\n]').replace('fences', ' {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~{3,})[^\\\\n]*\\\\n').replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt\n.replace('html', ')|<(?:script|pre|style|textarea|!--)').replace('tag', block._tag) // tables can be interrupted by type (6) html blocks\n.getRegex();\nblock.gfm.paragraph = edit(block._paragraph).replace('hr', block.hr).replace('heading', ' {0,3}#{1,6} ').replace('|lheading', '') // setex headings don't interrupt commonmark paragraphs\n.replace('table', block.gfm.table) // interrupt paragraphs with table\n.replace('blockquote', ' {0,3}>').replace('fences', ' {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~{3,})[^\\\\n]*\\\\n').replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt\n.replace('html', ')|<(?:script|pre|style|textarea|!--)').replace('tag', block._tag) // pars can be interrupted by type (6) html blocks\n.getRegex();\n/**\n * Pedantic grammar (original John Gruber's loose markdown specification)\n */\n\nblock.pedantic = _extends({}, block.normal, {\n html: edit('^ *(?:comment *(?:\\\\n|\\\\s*$)' + '|<(tag)[\\\\s\\\\S]+? *(?:\\\\n{2,}|\\\\s*$)' // closed tag\n + '|\\\\s]*)*?/?> *(?:\\\\n{2,}|\\\\s*$))').replace('comment', block._comment).replace(/tag/g, '(?!(?:' + 'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub' + '|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)' + '\\\\b)\\\\w+(?!:|[^\\\\w\\\\s@]*@)\\\\b').getRegex(),\n def: /^ *\\[([^\\]]+)\\]: *]+)>?(?: +([\"(][^\\n]+[\")]))? *(?:\\n+|$)/,\n heading: /^(#{1,6})(.*)(?:\\n+|$)/,\n fences: noopTest,\n // fences not supported\n lheading: /^(.+?)\\n {0,3}(=+|-+) *(?:\\n+|$)/,\n paragraph: edit(block.normal._paragraph).replace('hr', block.hr).replace('heading', ' *#{1,6} *[^\\n]').replace('lheading', block.lheading).replace('blockquote', ' {0,3}>').replace('|fences', '').replace('|list', '').replace('|html', '').getRegex()\n});\n\n/**\n * Inline-Level Grammar\n */\nvar inline = {\n escape: /^\\\\([!\"#$%&'()*+,\\-./:;<=>?@\\[\\]\\\\^_`{|}~])/,\n autolink: /^<(scheme:[^\\s\\x00-\\x1f<>]*|email)>/,\n url: noopTest,\n tag: '^comment' + '|^' // self-closing tag\n + '|^<[a-zA-Z][\\\\w-]*(?:attribute)*?\\\\s*/?>' // open tag\n + '|^<\\\\?[\\\\s\\\\S]*?\\\\?>' // processing instruction, e.g. \n + '|^' // declaration, e.g. \n + '|^',\n // CDATA section\n link: /^!?\\[(label)\\]\\(\\s*(href)(?:\\s+(title))?\\s*\\)/,\n reflink: /^!?\\[(label)\\]\\[(ref)\\]/,\n nolink: /^!?\\[(ref)\\](?:\\[\\])?/,\n reflinkSearch: 'reflink|nolink(?!\\\\()',\n emStrong: {\n lDelim: /^(?:\\*+(?:([punct_])|[^\\s*]))|^_+(?:([punct*])|([^\\s_]))/,\n // (1) and (2) can only be a Right Delimiter. (3) and (4) can only be Left. (5) and (6) can be either Left or Right.\n // () Skip orphan inside strong () Consume to delim (1) #*** (2) a***#, a*** (3) #***a, ***a (4) ***# (5) #***# (6) a***a\n rDelimAst: /^(?:[^_*\\\\]|\\\\.)*?\\_\\_(?:[^_*\\\\]|\\\\.)*?\\*(?:[^_*\\\\]|\\\\.)*?(?=\\_\\_)|(?:[^*\\\\]|\\\\.)+(?=[^*])|[punct_](\\*+)(?=[\\s]|$)|(?:[^punct*_\\s\\\\]|\\\\.)(\\*+)(?=[punct_\\s]|$)|[punct_\\s](\\*+)(?=[^punct*_\\s])|[\\s](\\*+)(?=[punct_])|[punct_](\\*+)(?=[punct_])|(?:[^punct*_\\s\\\\]|\\\\.)(\\*+)(?=[^punct*_\\s])/,\n rDelimUnd: /^(?:[^_*\\\\]|\\\\.)*?\\*\\*(?:[^_*\\\\]|\\\\.)*?\\_(?:[^_*\\\\]|\\\\.)*?(?=\\*\\*)|(?:[^_\\\\]|\\\\.)+(?=[^_])|[punct*](\\_+)(?=[\\s]|$)|(?:[^punct*_\\s\\\\]|\\\\.)(\\_+)(?=[punct*\\s]|$)|[punct*\\s](\\_+)(?=[^punct*_\\s])|[\\s](\\_+)(?=[punct*])|[punct*](\\_+)(?=[punct*])/ // ^- Not allowed for _\n },\n\n code: /^(`+)([^`]|[^`][\\s\\S]*?[^`])\\1(?!`)/,\n br: /^( {2,}|\\\\)\\n(?!\\s*$)/,\n del: noopTest,\n text: /^(`+|[^`])(?:(?= {2,}\\n)|[\\s\\S]*?(?:(?=[\\\\?@\\\\[\\\\]`^{|}~';\ninline.punctuation = edit(inline.punctuation).replace(/punctuation/g, inline._punctuation).getRegex();\n\n// sequences em should skip over [title](link), `code`, \ninline.blockSkip = /\\[[^\\]]*?\\]\\([^\\)]*?\\)|`[^`]*?`|<[^>]*?>/g;\n// lookbehind is not available on Safari as of version 16\n// inline.escapedEmSt = /(?<=(?:^|[^\\\\)(?:\\\\[^])*)\\\\[*_]/g;\ninline.escapedEmSt = /(?:^|[^\\\\])(?:\\\\\\\\)*\\\\[*_]/g;\ninline._comment = edit(block._comment).replace('(?:-->|$)', '-->').getRegex();\ninline.emStrong.lDelim = edit(inline.emStrong.lDelim).replace(/punct/g, inline._punctuation).getRegex();\ninline.emStrong.rDelimAst = edit(inline.emStrong.rDelimAst, 'g').replace(/punct/g, inline._punctuation).getRegex();\ninline.emStrong.rDelimUnd = edit(inline.emStrong.rDelimUnd, 'g').replace(/punct/g, inline._punctuation).getRegex();\ninline._escapes = /\\\\([!\"#$%&'()*+,\\-./:;<=>?@\\[\\]\\\\^_`{|}~])/g;\ninline._scheme = /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/;\ninline._email = /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/;\ninline.autolink = edit(inline.autolink).replace('scheme', inline._scheme).replace('email', inline._email).getRegex();\ninline._attribute = /\\s+[a-zA-Z:_][\\w.:-]*(?:\\s*=\\s*\"[^\"]*\"|\\s*=\\s*'[^']*'|\\s*=\\s*[^\\s\"'=<>`]+)?/;\ninline.tag = edit(inline.tag).replace('comment', inline._comment).replace('attribute', inline._attribute).getRegex();\ninline._label = /(?:\\[(?:\\\\.|[^\\[\\]\\\\])*\\]|\\\\.|`[^`]*`|[^\\[\\]\\\\`])*?/;\ninline._href = /<(?:\\\\.|[^\\n<>\\\\])+>|[^\\s\\x00-\\x1f]*/;\ninline._title = /\"(?:\\\\\"?|[^\"\\\\])*\"|'(?:\\\\'?|[^'\\\\])*'|\\((?:\\\\\\)?|[^)\\\\])*\\)/;\ninline.link = edit(inline.link).replace('label', inline._label).replace('href', inline._href).replace('title', inline._title).getRegex();\ninline.reflink = edit(inline.reflink).replace('label', inline._label).replace('ref', block._label).getRegex();\ninline.nolink = edit(inline.nolink).replace('ref', block._label).getRegex();\ninline.reflinkSearch = edit(inline.reflinkSearch, 'g').replace('reflink', inline.reflink).replace('nolink', inline.nolink).getRegex();\n\n/**\n * Normal Inline Grammar\n */\n\ninline.normal = _extends({}, inline);\n\n/**\n * Pedantic Inline Grammar\n */\n\ninline.pedantic = _extends({}, inline.normal, {\n strong: {\n start: /^__|\\*\\*/,\n middle: /^__(?=\\S)([\\s\\S]*?\\S)__(?!_)|^\\*\\*(?=\\S)([\\s\\S]*?\\S)\\*\\*(?!\\*)/,\n endAst: /\\*\\*(?!\\*)/g,\n endUnd: /__(?!_)/g\n },\n em: {\n start: /^_|\\*/,\n middle: /^()\\*(?=\\S)([\\s\\S]*?\\S)\\*(?!\\*)|^_(?=\\S)([\\s\\S]*?\\S)_(?!_)/,\n endAst: /\\*(?!\\*)/g,\n endUnd: /_(?!_)/g\n },\n link: edit(/^!?\\[(label)\\]\\((.*?)\\)/).replace('label', inline._label).getRegex(),\n reflink: edit(/^!?\\[(label)\\]\\s*\\[([^\\]]*)\\]/).replace('label', inline._label).getRegex()\n});\n\n/**\n * GFM Inline Grammar\n */\n\ninline.gfm = _extends({}, inline.normal, {\n escape: edit(inline.escape).replace('])', '~|])').getRegex(),\n _extended_email: /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/,\n url: /^((?:ftp|https?):\\/\\/|www\\.)(?:[a-zA-Z0-9\\-]+\\.?)+[^\\s<]*|^email/,\n _backpedal: /(?:[^?!.,:;*_'\"~()&]+|\\([^)]*\\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'\"~)]+(?!$))+/,\n del: /^(~~?)(?=[^\\s~])([\\s\\S]*?[^\\s~])\\1(?=[^~]|$)/,\n text: /^([`~]+|[^`~])(?:(?= {2,}\\n)|(?=[a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-]+@)|[\\s\\S]*?(?:(?=[\\\\ 0.5) {\n ch = 'x' + ch.toString(16);\n }\n out += '&#' + ch + ';';\n }\n return out;\n}\n\n/**\n * Block Lexer\n */\nvar Lexer = /*#__PURE__*/function () {\n function Lexer(options) {\n this.tokens = [];\n this.tokens.links = Object.create(null);\n this.options = options || exports.defaults;\n this.options.tokenizer = this.options.tokenizer || new Tokenizer();\n this.tokenizer = this.options.tokenizer;\n this.tokenizer.options = this.options;\n this.tokenizer.lexer = this;\n this.inlineQueue = [];\n this.state = {\n inLink: false,\n inRawBlock: false,\n top: true\n };\n var rules = {\n block: block.normal,\n inline: inline.normal\n };\n if (this.options.pedantic) {\n rules.block = block.pedantic;\n rules.inline = inline.pedantic;\n } else if (this.options.gfm) {\n rules.block = block.gfm;\n if (this.options.breaks) {\n rules.inline = inline.breaks;\n } else {\n rules.inline = inline.gfm;\n }\n }\n this.tokenizer.rules = rules;\n }\n\n /**\n * Expose Rules\n */\n /**\n * Static Lex Method\n */\n Lexer.lex = function lex(src, options) {\n var lexer = new Lexer(options);\n return lexer.lex(src);\n }\n\n /**\n * Static Lex Inline Method\n */;\n Lexer.lexInline = function lexInline(src, options) {\n var lexer = new Lexer(options);\n return lexer.inlineTokens(src);\n }\n\n /**\n * Preprocessing\n */;\n var _proto = Lexer.prototype;\n _proto.lex = function lex(src) {\n src = src.replace(/\\r\\n|\\r/g, '\\n');\n this.blockTokens(src, this.tokens);\n var next;\n while (next = this.inlineQueue.shift()) {\n this.inlineTokens(next.src, next.tokens);\n }\n return this.tokens;\n }\n\n /**\n * Lexing\n */;\n _proto.blockTokens = function blockTokens(src, tokens) {\n var _this = this;\n if (tokens === void 0) {\n tokens = [];\n }\n if (this.options.pedantic) {\n src = src.replace(/\\t/g, ' ').replace(/^ +$/gm, '');\n } else {\n src = src.replace(/^( *)(\\t+)/gm, function (_, leading, tabs) {\n return leading + ' '.repeat(tabs.length);\n });\n }\n var token, lastToken, cutSrc, lastParagraphClipped;\n while (src) {\n if (this.options.extensions && this.options.extensions.block && this.options.extensions.block.some(function (extTokenizer) {\n if (token = extTokenizer.call({\n lexer: _this\n }, src, tokens)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n return true;\n }\n return false;\n })) {\n continue;\n }\n\n // newline\n if (token = this.tokenizer.space(src)) {\n src = src.substring(token.raw.length);\n if (token.raw.length === 1 && tokens.length > 0) {\n // if there's a single \\n as a spacer, it's terminating the last line,\n // so move it there so that we don't get unecessary paragraph tags\n tokens[tokens.length - 1].raw += '\\n';\n } else {\n tokens.push(token);\n }\n continue;\n }\n\n // code\n if (token = this.tokenizer.code(src)) {\n src = src.substring(token.raw.length);\n lastToken = tokens[tokens.length - 1];\n // An indented code block cannot interrupt a paragraph.\n if (lastToken && (lastToken.type === 'paragraph' || lastToken.type === 'text')) {\n lastToken.raw += '\\n' + token.raw;\n lastToken.text += '\\n' + token.text;\n this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;\n } else {\n tokens.push(token);\n }\n continue;\n }\n\n // fences\n if (token = this.tokenizer.fences(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // heading\n if (token = this.tokenizer.heading(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // hr\n if (token = this.tokenizer.hr(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // blockquote\n if (token = this.tokenizer.blockquote(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // list\n if (token = this.tokenizer.list(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // html\n if (token = this.tokenizer.html(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // def\n if (token = this.tokenizer.def(src)) {\n src = src.substring(token.raw.length);\n lastToken = tokens[tokens.length - 1];\n if (lastToken && (lastToken.type === 'paragraph' || lastToken.type === 'text')) {\n lastToken.raw += '\\n' + token.raw;\n lastToken.text += '\\n' + token.raw;\n this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;\n } else if (!this.tokens.links[token.tag]) {\n this.tokens.links[token.tag] = {\n href: token.href,\n title: token.title\n };\n }\n continue;\n }\n\n // table (gfm)\n if (token = this.tokenizer.table(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // lheading\n if (token = this.tokenizer.lheading(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // top-level paragraph\n // prevent paragraph consuming extensions by clipping 'src' to extension start\n cutSrc = src;\n if (this.options.extensions && this.options.extensions.startBlock) {\n (function () {\n var startIndex = Infinity;\n var tempSrc = src.slice(1);\n var tempStart = void 0;\n _this.options.extensions.startBlock.forEach(function (getStartIndex) {\n tempStart = getStartIndex.call({\n lexer: this\n }, tempSrc);\n if (typeof tempStart === 'number' && tempStart >= 0) {\n startIndex = Math.min(startIndex, tempStart);\n }\n });\n if (startIndex < Infinity && startIndex >= 0) {\n cutSrc = src.substring(0, startIndex + 1);\n }\n })();\n }\n if (this.state.top && (token = this.tokenizer.paragraph(cutSrc))) {\n lastToken = tokens[tokens.length - 1];\n if (lastParagraphClipped && lastToken.type === 'paragraph') {\n lastToken.raw += '\\n' + token.raw;\n lastToken.text += '\\n' + token.text;\n this.inlineQueue.pop();\n this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;\n } else {\n tokens.push(token);\n }\n lastParagraphClipped = cutSrc.length !== src.length;\n src = src.substring(token.raw.length);\n continue;\n }\n\n // text\n if (token = this.tokenizer.text(src)) {\n src = src.substring(token.raw.length);\n lastToken = tokens[tokens.length - 1];\n if (lastToken && lastToken.type === 'text') {\n lastToken.raw += '\\n' + token.raw;\n lastToken.text += '\\n' + token.text;\n this.inlineQueue.pop();\n this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;\n } else {\n tokens.push(token);\n }\n continue;\n }\n if (src) {\n var errMsg = 'Infinite loop on byte: ' + src.charCodeAt(0);\n if (this.options.silent) {\n console.error(errMsg);\n break;\n } else {\n throw new Error(errMsg);\n }\n }\n }\n this.state.top = true;\n return tokens;\n };\n _proto.inline = function inline(src, tokens) {\n if (tokens === void 0) {\n tokens = [];\n }\n this.inlineQueue.push({\n src: src,\n tokens: tokens\n });\n return tokens;\n }\n\n /**\n * Lexing/Compiling\n */;\n _proto.inlineTokens = function inlineTokens(src, tokens) {\n var _this2 = this;\n if (tokens === void 0) {\n tokens = [];\n }\n var token, lastToken, cutSrc;\n\n // String with links masked to avoid interference with em and strong\n var maskedSrc = src;\n var match;\n var keepPrevChar, prevChar;\n\n // Mask out reflinks\n if (this.tokens.links) {\n var links = Object.keys(this.tokens.links);\n if (links.length > 0) {\n while ((match = this.tokenizer.rules.inline.reflinkSearch.exec(maskedSrc)) != null) {\n if (links.includes(match[0].slice(match[0].lastIndexOf('[') + 1, -1))) {\n maskedSrc = maskedSrc.slice(0, match.index) + '[' + repeatString('a', match[0].length - 2) + ']' + maskedSrc.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex);\n }\n }\n }\n }\n // Mask out other blocks\n while ((match = this.tokenizer.rules.inline.blockSkip.exec(maskedSrc)) != null) {\n maskedSrc = maskedSrc.slice(0, match.index) + '[' + repeatString('a', match[0].length - 2) + ']' + maskedSrc.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);\n }\n\n // Mask out escaped em & strong delimiters\n while ((match = this.tokenizer.rules.inline.escapedEmSt.exec(maskedSrc)) != null) {\n maskedSrc = maskedSrc.slice(0, match.index + match[0].length - 2) + '++' + maskedSrc.slice(this.tokenizer.rules.inline.escapedEmSt.lastIndex);\n this.tokenizer.rules.inline.escapedEmSt.lastIndex--;\n }\n while (src) {\n if (!keepPrevChar) {\n prevChar = '';\n }\n keepPrevChar = false;\n\n // extensions\n if (this.options.extensions && this.options.extensions.inline && this.options.extensions.inline.some(function (extTokenizer) {\n if (token = extTokenizer.call({\n lexer: _this2\n }, src, tokens)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n return true;\n }\n return false;\n })) {\n continue;\n }\n\n // escape\n if (token = this.tokenizer.escape(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // tag\n if (token = this.tokenizer.tag(src)) {\n src = src.substring(token.raw.length);\n lastToken = tokens[tokens.length - 1];\n if (lastToken && token.type === 'text' && lastToken.type === 'text') {\n lastToken.raw += token.raw;\n lastToken.text += token.text;\n } else {\n tokens.push(token);\n }\n continue;\n }\n\n // link\n if (token = this.tokenizer.link(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // reflink, nolink\n if (token = this.tokenizer.reflink(src, this.tokens.links)) {\n src = src.substring(token.raw.length);\n lastToken = tokens[tokens.length - 1];\n if (lastToken && token.type === 'text' && lastToken.type === 'text') {\n lastToken.raw += token.raw;\n lastToken.text += token.text;\n } else {\n tokens.push(token);\n }\n continue;\n }\n\n // em & strong\n if (token = this.tokenizer.emStrong(src, maskedSrc, prevChar)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // code\n if (token = this.tokenizer.codespan(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // br\n if (token = this.tokenizer.br(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // del (gfm)\n if (token = this.tokenizer.del(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // autolink\n if (token = this.tokenizer.autolink(src, mangle)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // url (gfm)\n if (!this.state.inLink && (token = this.tokenizer.url(src, mangle))) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // text\n // prevent inlineText consuming extensions by clipping 'src' to extension start\n cutSrc = src;\n if (this.options.extensions && this.options.extensions.startInline) {\n (function () {\n var startIndex = Infinity;\n var tempSrc = src.slice(1);\n var tempStart = void 0;\n _this2.options.extensions.startInline.forEach(function (getStartIndex) {\n tempStart = getStartIndex.call({\n lexer: this\n }, tempSrc);\n if (typeof tempStart === 'number' && tempStart >= 0) {\n startIndex = Math.min(startIndex, tempStart);\n }\n });\n if (startIndex < Infinity && startIndex >= 0) {\n cutSrc = src.substring(0, startIndex + 1);\n }\n })();\n }\n if (token = this.tokenizer.inlineText(cutSrc, smartypants)) {\n src = src.substring(token.raw.length);\n if (token.raw.slice(-1) !== '_') {\n // Track prevChar before string of ____ started\n prevChar = token.raw.slice(-1);\n }\n keepPrevChar = true;\n lastToken = tokens[tokens.length - 1];\n if (lastToken && lastToken.type === 'text') {\n lastToken.raw += token.raw;\n lastToken.text += token.text;\n } else {\n tokens.push(token);\n }\n continue;\n }\n if (src) {\n var errMsg = 'Infinite loop on byte: ' + src.charCodeAt(0);\n if (this.options.silent) {\n console.error(errMsg);\n break;\n } else {\n throw new Error(errMsg);\n }\n }\n }\n return tokens;\n };\n _createClass(Lexer, null, [{\n key: \"rules\",\n get: function get() {\n return {\n block: block,\n inline: inline\n };\n }\n }]);\n return Lexer;\n}();\n\n/**\n * Renderer\n */\nvar Renderer = /*#__PURE__*/function () {\n function Renderer(options) {\n this.options = options || exports.defaults;\n }\n var _proto = Renderer.prototype;\n _proto.code = function code(_code, infostring, escaped) {\n var lang = (infostring || '').match(/\\S*/)[0];\n if (this.options.highlight) {\n var out = this.options.highlight(_code, lang);\n if (out != null && out !== _code) {\n escaped = true;\n _code = out;\n }\n }\n _code = _code.replace(/\\n$/, '') + '\\n';\n if (!lang) {\n return '
' + (escaped ? _code : escape(_code, true)) + '
\\n';\n }\n return '
' + (escaped ? _code : escape(_code, true)) + '
\\n';\n }\n\n /**\n * @param {string} quote\n */;\n _proto.blockquote = function blockquote(quote) {\n return \"
\\n\" + quote + \"
\\n\";\n };\n _proto.html = function html(_html) {\n return _html;\n }\n\n /**\n * @param {string} text\n * @param {string} level\n * @param {string} raw\n * @param {any} slugger\n */;\n _proto.heading = function heading(text, level, raw, slugger) {\n if (this.options.headerIds) {\n var id = this.options.headerPrefix + slugger.slug(raw);\n return \"\" + text + \"\\n\";\n }\n\n // ignore IDs\n return \"\" + text + \"\\n\";\n };\n _proto.hr = function hr() {\n return this.options.xhtml ? '
\\n' : '
\\n';\n };\n _proto.list = function list(body, ordered, start) {\n var type = ordered ? 'ol' : 'ul',\n startatt = ordered && start !== 1 ? ' start=\"' + start + '\"' : '';\n return '<' + type + startatt + '>\\n' + body + '\\n';\n }\n\n /**\n * @param {string} text\n */;\n _proto.listitem = function listitem(text) {\n return \"
  • \" + text + \"
  • \\n\";\n };\n _proto.checkbox = function checkbox(checked) {\n return ' ';\n }\n\n /**\n * @param {string} text\n */;\n _proto.paragraph = function paragraph(text) {\n return \"

    \" + text + \"

    \\n\";\n }\n\n /**\n * @param {string} header\n * @param {string} body\n */;\n _proto.table = function table(header, body) {\n if (body) body = \"\" + body + \"\";\n return '\\n' + '\\n' + header + '\\n' + body + '
    \\n';\n }\n\n /**\n * @param {string} content\n */;\n _proto.tablerow = function tablerow(content) {\n return \"\\n\" + content + \"\\n\";\n };\n _proto.tablecell = function tablecell(content, flags) {\n var type = flags.header ? 'th' : 'td';\n var tag = flags.align ? \"<\" + type + \" align=\\\"\" + flags.align + \"\\\">\" : \"<\" + type + \">\";\n return tag + content + (\"\\n\");\n }\n\n /**\n * span level renderer\n * @param {string} text\n */;\n _proto.strong = function strong(text) {\n return \"\" + text + \"\";\n }\n\n /**\n * @param {string} text\n */;\n _proto.em = function em(text) {\n return \"\" + text + \"\";\n }\n\n /**\n * @param {string} text\n */;\n _proto.codespan = function codespan(text) {\n return \"\" + text + \"\";\n };\n _proto.br = function br() {\n return this.options.xhtml ? '
    ' : '
    ';\n }\n\n /**\n * @param {string} text\n */;\n _proto.del = function del(text) {\n return \"\" + text + \"\";\n }\n\n /**\n * @param {string} href\n * @param {string} title\n * @param {string} text\n */;\n _proto.link = function link(href, title, text) {\n href = cleanUrl(this.options.sanitize, this.options.baseUrl, href);\n if (href === null) {\n return text;\n }\n var out = '
    ';\n return out;\n }\n\n /**\n * @param {string} href\n * @param {string} title\n * @param {string} text\n */;\n _proto.image = function image(href, title, text) {\n href = cleanUrl(this.options.sanitize, this.options.baseUrl, href);\n if (href === null) {\n return text;\n }\n var out = \"\\\"\"' : '>';\n return out;\n };\n _proto.text = function text(_text) {\n return _text;\n };\n return Renderer;\n}();\n\n/**\n * TextRenderer\n * returns only the textual part of the token\n */\nvar TextRenderer = /*#__PURE__*/function () {\n function TextRenderer() {}\n var _proto = TextRenderer.prototype;\n // no need for block level renderers\n _proto.strong = function strong(text) {\n return text;\n };\n _proto.em = function em(text) {\n return text;\n };\n _proto.codespan = function codespan(text) {\n return text;\n };\n _proto.del = function del(text) {\n return text;\n };\n _proto.html = function html(text) {\n return text;\n };\n _proto.text = function text(_text) {\n return _text;\n };\n _proto.link = function link(href, title, text) {\n return '' + text;\n };\n _proto.image = function image(href, title, text) {\n return '' + text;\n };\n _proto.br = function br() {\n return '';\n };\n return TextRenderer;\n}();\n\n/**\n * Slugger generates header id\n */\nvar Slugger = /*#__PURE__*/function () {\n function Slugger() {\n this.seen = {};\n }\n\n /**\n * @param {string} value\n */\n var _proto = Slugger.prototype;\n _proto.serialize = function serialize(value) {\n return value.toLowerCase().trim()\n // remove html tags\n .replace(/<[!\\/a-z].*?>/ig, '')\n // remove unwanted chars\n .replace(/[\\u2000-\\u206F\\u2E00-\\u2E7F\\\\'!\"#$%&()*+,./:;<=>?@[\\]^`{|}~]/g, '').replace(/\\s/g, '-');\n }\n\n /**\n * Finds the next safe (unique) slug to use\n * @param {string} originalSlug\n * @param {boolean} isDryRun\n */;\n _proto.getNextSafeSlug = function getNextSafeSlug(originalSlug, isDryRun) {\n var slug = originalSlug;\n var occurenceAccumulator = 0;\n if (this.seen.hasOwnProperty(slug)) {\n occurenceAccumulator = this.seen[originalSlug];\n do {\n occurenceAccumulator++;\n slug = originalSlug + '-' + occurenceAccumulator;\n } while (this.seen.hasOwnProperty(slug));\n }\n if (!isDryRun) {\n this.seen[originalSlug] = occurenceAccumulator;\n this.seen[slug] = 0;\n }\n return slug;\n }\n\n /**\n * Convert string to unique id\n * @param {object} [options]\n * @param {boolean} [options.dryrun] Generates the next unique slug without\n * updating the internal accumulator.\n */;\n _proto.slug = function slug(value, options) {\n if (options === void 0) {\n options = {};\n }\n var slug = this.serialize(value);\n return this.getNextSafeSlug(slug, options.dryrun);\n };\n return Slugger;\n}();\n\n/**\n * Parsing & Compiling\n */\nvar Parser = /*#__PURE__*/function () {\n function Parser(options) {\n this.options = options || exports.defaults;\n this.options.renderer = this.options.renderer || new Renderer();\n this.renderer = this.options.renderer;\n this.renderer.options = this.options;\n this.textRenderer = new TextRenderer();\n this.slugger = new Slugger();\n }\n\n /**\n * Static Parse Method\n */\n Parser.parse = function parse(tokens, options) {\n var parser = new Parser(options);\n return parser.parse(tokens);\n }\n\n /**\n * Static Parse Inline Method\n */;\n Parser.parseInline = function parseInline(tokens, options) {\n var parser = new Parser(options);\n return parser.parseInline(tokens);\n }\n\n /**\n * Parse Loop\n */;\n var _proto = Parser.prototype;\n _proto.parse = function parse(tokens, top) {\n if (top === void 0) {\n top = true;\n }\n var out = '',\n i,\n j,\n k,\n l2,\n l3,\n row,\n cell,\n header,\n body,\n token,\n ordered,\n start,\n loose,\n itemBody,\n item,\n checked,\n task,\n checkbox,\n ret;\n var l = tokens.length;\n for (i = 0; i < l; i++) {\n token = tokens[i];\n\n // Run any renderer extensions\n if (this.options.extensions && this.options.extensions.renderers && this.options.extensions.renderers[token.type]) {\n ret = this.options.extensions.renderers[token.type].call({\n parser: this\n }, token);\n if (ret !== false || !['space', 'hr', 'heading', 'code', 'table', 'blockquote', 'list', 'html', 'paragraph', 'text'].includes(token.type)) {\n out += ret || '';\n continue;\n }\n }\n switch (token.type) {\n case 'space':\n {\n continue;\n }\n case 'hr':\n {\n out += this.renderer.hr();\n continue;\n }\n case 'heading':\n {\n out += this.renderer.heading(this.parseInline(token.tokens), token.depth, unescape(this.parseInline(token.tokens, this.textRenderer)), this.slugger);\n continue;\n }\n case 'code':\n {\n out += this.renderer.code(token.text, token.lang, token.escaped);\n continue;\n }\n case 'table':\n {\n header = '';\n\n // header\n cell = '';\n l2 = token.header.length;\n for (j = 0; j < l2; j++) {\n cell += this.renderer.tablecell(this.parseInline(token.header[j].tokens), {\n header: true,\n align: token.align[j]\n });\n }\n header += this.renderer.tablerow(cell);\n body = '';\n l2 = token.rows.length;\n for (j = 0; j < l2; j++) {\n row = token.rows[j];\n cell = '';\n l3 = row.length;\n for (k = 0; k < l3; k++) {\n cell += this.renderer.tablecell(this.parseInline(row[k].tokens), {\n header: false,\n align: token.align[k]\n });\n }\n body += this.renderer.tablerow(cell);\n }\n out += this.renderer.table(header, body);\n continue;\n }\n case 'blockquote':\n {\n body = this.parse(token.tokens);\n out += this.renderer.blockquote(body);\n continue;\n }\n case 'list':\n {\n ordered = token.ordered;\n start = token.start;\n loose = token.loose;\n l2 = token.items.length;\n body = '';\n for (j = 0; j < l2; j++) {\n item = token.items[j];\n checked = item.checked;\n task = item.task;\n itemBody = '';\n if (item.task) {\n checkbox = this.renderer.checkbox(checked);\n if (loose) {\n if (item.tokens.length > 0 && item.tokens[0].type === 'paragraph') {\n item.tokens[0].text = checkbox + ' ' + item.tokens[0].text;\n if (item.tokens[0].tokens && item.tokens[0].tokens.length > 0 && item.tokens[0].tokens[0].type === 'text') {\n item.tokens[0].tokens[0].text = checkbox + ' ' + item.tokens[0].tokens[0].text;\n }\n } else {\n item.tokens.unshift({\n type: 'text',\n text: checkbox\n });\n }\n } else {\n itemBody += checkbox;\n }\n }\n itemBody += this.parse(item.tokens, loose);\n body += this.renderer.listitem(itemBody, task, checked);\n }\n out += this.renderer.list(body, ordered, start);\n continue;\n }\n case 'html':\n {\n // TODO parse inline content if parameter markdown=1\n out += this.renderer.html(token.text);\n continue;\n }\n case 'paragraph':\n {\n out += this.renderer.paragraph(this.parseInline(token.tokens));\n continue;\n }\n case 'text':\n {\n body = token.tokens ? this.parseInline(token.tokens) : token.text;\n while (i + 1 < l && tokens[i + 1].type === 'text') {\n token = tokens[++i];\n body += '\\n' + (token.tokens ? this.parseInline(token.tokens) : token.text);\n }\n out += top ? this.renderer.paragraph(body) : body;\n continue;\n }\n default:\n {\n var errMsg = 'Token with \"' + token.type + '\" type was not found.';\n if (this.options.silent) {\n console.error(errMsg);\n return;\n } else {\n throw new Error(errMsg);\n }\n }\n }\n }\n return out;\n }\n\n /**\n * Parse Inline Tokens\n */;\n _proto.parseInline = function parseInline(tokens, renderer) {\n renderer = renderer || this.renderer;\n var out = '',\n i,\n token,\n ret;\n var l = tokens.length;\n for (i = 0; i < l; i++) {\n token = tokens[i];\n\n // Run any renderer extensions\n if (this.options.extensions && this.options.extensions.renderers && this.options.extensions.renderers[token.type]) {\n ret = this.options.extensions.renderers[token.type].call({\n parser: this\n }, token);\n if (ret !== false || !['escape', 'html', 'link', 'image', 'strong', 'em', 'codespan', 'br', 'del', 'text'].includes(token.type)) {\n out += ret || '';\n continue;\n }\n }\n switch (token.type) {\n case 'escape':\n {\n out += renderer.text(token.text);\n break;\n }\n case 'html':\n {\n out += renderer.html(token.text);\n break;\n }\n case 'link':\n {\n out += renderer.link(token.href, token.title, this.parseInline(token.tokens, renderer));\n break;\n }\n case 'image':\n {\n out += renderer.image(token.href, token.title, token.text);\n break;\n }\n case 'strong':\n {\n out += renderer.strong(this.parseInline(token.tokens, renderer));\n break;\n }\n case 'em':\n {\n out += renderer.em(this.parseInline(token.tokens, renderer));\n break;\n }\n case 'codespan':\n {\n out += renderer.codespan(token.text);\n break;\n }\n case 'br':\n {\n out += renderer.br();\n break;\n }\n case 'del':\n {\n out += renderer.del(this.parseInline(token.tokens, renderer));\n break;\n }\n case 'text':\n {\n out += renderer.text(token.text);\n break;\n }\n default:\n {\n var errMsg = 'Token with \"' + token.type + '\" type was not found.';\n if (this.options.silent) {\n console.error(errMsg);\n return;\n } else {\n throw new Error(errMsg);\n }\n }\n }\n }\n return out;\n };\n return Parser;\n}();\n\nvar Hooks = /*#__PURE__*/function () {\n function Hooks(options) {\n this.options = options || exports.defaults;\n }\n var _proto = Hooks.prototype;\n /**\n * Process markdown before marked\n */\n _proto.preprocess = function preprocess(markdown) {\n return markdown;\n }\n\n /**\n * Process HTML after marked is finished\n */;\n _proto.postprocess = function postprocess(html) {\n return html;\n };\n return Hooks;\n}();\nHooks.passThroughHooks = new Set(['preprocess', 'postprocess']);\n\nfunction onError(silent, async, callback) {\n return function (e) {\n e.message += '\\nPlease report this to https://github.com/markedjs/marked.';\n if (silent) {\n var msg = '

    An error occurred:

    ' + escape(e.message + '', true) + '
    ';\n if (async) {\n return Promise.resolve(msg);\n }\n if (callback) {\n callback(null, msg);\n return;\n }\n return msg;\n }\n if (async) {\n return Promise.reject(e);\n }\n if (callback) {\n callback(e);\n return;\n }\n throw e;\n };\n}\nfunction parseMarkdown(lexer, parser) {\n return function (src, opt, callback) {\n if (typeof opt === 'function') {\n callback = opt;\n opt = null;\n }\n var origOpt = _extends({}, opt);\n opt = _extends({}, marked.defaults, origOpt);\n var throwError = onError(opt.silent, opt.async, callback);\n\n // throw error in case of non string input\n if (typeof src === 'undefined' || src === null) {\n return throwError(new Error('marked(): input parameter is undefined or null'));\n }\n if (typeof src !== 'string') {\n return throwError(new Error('marked(): input parameter is of type ' + Object.prototype.toString.call(src) + ', string expected'));\n }\n checkSanitizeDeprecation(opt);\n if (opt.hooks) {\n opt.hooks.options = opt;\n }\n if (callback) {\n var highlight = opt.highlight;\n var tokens;\n try {\n if (opt.hooks) {\n src = opt.hooks.preprocess(src);\n }\n tokens = lexer(src, opt);\n } catch (e) {\n return throwError(e);\n }\n var done = function done(err) {\n var out;\n if (!err) {\n try {\n if (opt.walkTokens) {\n marked.walkTokens(tokens, opt.walkTokens);\n }\n out = parser(tokens, opt);\n if (opt.hooks) {\n out = opt.hooks.postprocess(out);\n }\n } catch (e) {\n err = e;\n }\n }\n opt.highlight = highlight;\n return err ? throwError(err) : callback(null, out);\n };\n if (!highlight || highlight.length < 3) {\n return done();\n }\n delete opt.highlight;\n if (!tokens.length) return done();\n var pending = 0;\n marked.walkTokens(tokens, function (token) {\n if (token.type === 'code') {\n pending++;\n setTimeout(function () {\n highlight(token.text, token.lang, function (err, code) {\n if (err) {\n return done(err);\n }\n if (code != null && code !== token.text) {\n token.text = code;\n token.escaped = true;\n }\n pending--;\n if (pending === 0) {\n done();\n }\n });\n }, 0);\n }\n });\n if (pending === 0) {\n done();\n }\n return;\n }\n if (opt.async) {\n return Promise.resolve(opt.hooks ? opt.hooks.preprocess(src) : src).then(function (src) {\n return lexer(src, opt);\n }).then(function (tokens) {\n return opt.walkTokens ? Promise.all(marked.walkTokens(tokens, opt.walkTokens)).then(function () {\n return tokens;\n }) : tokens;\n }).then(function (tokens) {\n return parser(tokens, opt);\n }).then(function (html) {\n return opt.hooks ? opt.hooks.postprocess(html) : html;\n })[\"catch\"](throwError);\n }\n try {\n if (opt.hooks) {\n src = opt.hooks.preprocess(src);\n }\n var _tokens = lexer(src, opt);\n if (opt.walkTokens) {\n marked.walkTokens(_tokens, opt.walkTokens);\n }\n var html = parser(_tokens, opt);\n if (opt.hooks) {\n html = opt.hooks.postprocess(html);\n }\n return html;\n } catch (e) {\n return throwError(e);\n }\n };\n}\n\n/**\n * Marked\n */\nfunction marked(src, opt, callback) {\n return parseMarkdown(Lexer.lex, Parser.parse)(src, opt, callback);\n}\n\n/**\n * Options\n */\n\nmarked.options = marked.setOptions = function (opt) {\n marked.defaults = _extends({}, marked.defaults, opt);\n changeDefaults(marked.defaults);\n return marked;\n};\nmarked.getDefaults = getDefaults;\nmarked.defaults = exports.defaults;\n\n/**\n * Use Extension\n */\n\nmarked.use = function () {\n var extensions = marked.defaults.extensions || {\n renderers: {},\n childTokens: {}\n };\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n args.forEach(function (pack) {\n // copy options to new object\n var opts = _extends({}, pack);\n\n // set async to true if it was set to true before\n opts.async = marked.defaults.async || opts.async || false;\n\n // ==-- Parse \"addon\" extensions --== //\n if (pack.extensions) {\n pack.extensions.forEach(function (ext) {\n if (!ext.name) {\n throw new Error('extension name required');\n }\n if (ext.renderer) {\n // Renderer extensions\n var prevRenderer = extensions.renderers[ext.name];\n if (prevRenderer) {\n // Replace extension with func to run new extension but fall back if false\n extensions.renderers[ext.name] = function () {\n for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n var ret = ext.renderer.apply(this, args);\n if (ret === false) {\n ret = prevRenderer.apply(this, args);\n }\n return ret;\n };\n } else {\n extensions.renderers[ext.name] = ext.renderer;\n }\n }\n if (ext.tokenizer) {\n // Tokenizer Extensions\n if (!ext.level || ext.level !== 'block' && ext.level !== 'inline') {\n throw new Error(\"extension level must be 'block' or 'inline'\");\n }\n if (extensions[ext.level]) {\n extensions[ext.level].unshift(ext.tokenizer);\n } else {\n extensions[ext.level] = [ext.tokenizer];\n }\n if (ext.start) {\n // Function to check for start of token\n if (ext.level === 'block') {\n if (extensions.startBlock) {\n extensions.startBlock.push(ext.start);\n } else {\n extensions.startBlock = [ext.start];\n }\n } else if (ext.level === 'inline') {\n if (extensions.startInline) {\n extensions.startInline.push(ext.start);\n } else {\n extensions.startInline = [ext.start];\n }\n }\n }\n }\n if (ext.childTokens) {\n // Child tokens to be visited by walkTokens\n extensions.childTokens[ext.name] = ext.childTokens;\n }\n });\n opts.extensions = extensions;\n }\n\n // ==-- Parse \"overwrite\" extensions --== //\n if (pack.renderer) {\n (function () {\n var renderer = marked.defaults.renderer || new Renderer();\n var _loop = function _loop(prop) {\n var prevRenderer = renderer[prop];\n // Replace renderer with func to run extension, but fall back if false\n renderer[prop] = function () {\n for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n args[_key3] = arguments[_key3];\n }\n var ret = pack.renderer[prop].apply(renderer, args);\n if (ret === false) {\n ret = prevRenderer.apply(renderer, args);\n }\n return ret;\n };\n };\n for (var prop in pack.renderer) {\n _loop(prop);\n }\n opts.renderer = renderer;\n })();\n }\n if (pack.tokenizer) {\n (function () {\n var tokenizer = marked.defaults.tokenizer || new Tokenizer();\n var _loop2 = function _loop2(prop) {\n var prevTokenizer = tokenizer[prop];\n // Replace tokenizer with func to run extension, but fall back if false\n tokenizer[prop] = function () {\n for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {\n args[_key4] = arguments[_key4];\n }\n var ret = pack.tokenizer[prop].apply(tokenizer, args);\n if (ret === false) {\n ret = prevTokenizer.apply(tokenizer, args);\n }\n return ret;\n };\n };\n for (var prop in pack.tokenizer) {\n _loop2(prop);\n }\n opts.tokenizer = tokenizer;\n })();\n }\n\n // ==-- Parse Hooks extensions --== //\n if (pack.hooks) {\n (function () {\n var hooks = marked.defaults.hooks || new Hooks();\n var _loop3 = function _loop3(prop) {\n var prevHook = hooks[prop];\n if (Hooks.passThroughHooks.has(prop)) {\n hooks[prop] = function (arg) {\n if (marked.defaults.async) {\n return Promise.resolve(pack.hooks[prop].call(hooks, arg)).then(function (ret) {\n return prevHook.call(hooks, ret);\n });\n }\n var ret = pack.hooks[prop].call(hooks, arg);\n return prevHook.call(hooks, ret);\n };\n } else {\n hooks[prop] = function () {\n for (var _len5 = arguments.length, args = new Array(_len5), _key5 = 0; _key5 < _len5; _key5++) {\n args[_key5] = arguments[_key5];\n }\n var ret = pack.hooks[prop].apply(hooks, args);\n if (ret === false) {\n ret = prevHook.apply(hooks, args);\n }\n return ret;\n };\n }\n };\n for (var prop in pack.hooks) {\n _loop3(prop);\n }\n opts.hooks = hooks;\n })();\n }\n\n // ==-- Parse WalkTokens extensions --== //\n if (pack.walkTokens) {\n var _walkTokens = marked.defaults.walkTokens;\n opts.walkTokens = function (token) {\n var values = [];\n values.push(pack.walkTokens.call(this, token));\n if (_walkTokens) {\n values = values.concat(_walkTokens.call(this, token));\n }\n return values;\n };\n }\n marked.setOptions(opts);\n });\n};\n\n/**\n * Run callback for every token\n */\n\nmarked.walkTokens = function (tokens, callback) {\n var values = [];\n var _loop4 = function _loop4() {\n var token = _step.value;\n values = values.concat(callback.call(marked, token));\n switch (token.type) {\n case 'table':\n {\n for (var _iterator2 = _createForOfIteratorHelperLoose(token.header), _step2; !(_step2 = _iterator2()).done;) {\n var cell = _step2.value;\n values = values.concat(marked.walkTokens(cell.tokens, callback));\n }\n for (var _iterator3 = _createForOfIteratorHelperLoose(token.rows), _step3; !(_step3 = _iterator3()).done;) {\n var row = _step3.value;\n for (var _iterator4 = _createForOfIteratorHelperLoose(row), _step4; !(_step4 = _iterator4()).done;) {\n var _cell = _step4.value;\n values = values.concat(marked.walkTokens(_cell.tokens, callback));\n }\n }\n break;\n }\n case 'list':\n {\n values = values.concat(marked.walkTokens(token.items, callback));\n break;\n }\n default:\n {\n if (marked.defaults.extensions && marked.defaults.extensions.childTokens && marked.defaults.extensions.childTokens[token.type]) {\n // Walk any extensions\n marked.defaults.extensions.childTokens[token.type].forEach(function (childTokens) {\n values = values.concat(marked.walkTokens(token[childTokens], callback));\n });\n } else if (token.tokens) {\n values = values.concat(marked.walkTokens(token.tokens, callback));\n }\n }\n }\n };\n for (var _iterator = _createForOfIteratorHelperLoose(tokens), _step; !(_step = _iterator()).done;) {\n _loop4();\n }\n return values;\n};\n\n/**\n * Parse Inline\n * @param {string} src\n */\nmarked.parseInline = parseMarkdown(Lexer.lexInline, Parser.parseInline);\n\n/**\n * Expose\n */\nmarked.Parser = Parser;\nmarked.parser = Parser.parse;\nmarked.Renderer = Renderer;\nmarked.TextRenderer = TextRenderer;\nmarked.Lexer = Lexer;\nmarked.lexer = Lexer.lex;\nmarked.Tokenizer = Tokenizer;\nmarked.Slugger = Slugger;\nmarked.Hooks = Hooks;\nmarked.parse = marked;\nvar options = marked.options;\nvar setOptions = marked.setOptions;\nvar use = marked.use;\nvar walkTokens = marked.walkTokens;\nvar parseInline = marked.parseInline;\nvar parse = marked;\nvar parser = Parser.parse;\nvar lexer = Lexer.lex;\n\nexports.Hooks = Hooks;\nexports.Lexer = Lexer;\nexports.Parser = Parser;\nexports.Renderer = Renderer;\nexports.Slugger = Slugger;\nexports.TextRenderer = TextRenderer;\nexports.Tokenizer = Tokenizer;\nexports.getDefaults = getDefaults;\nexports.lexer = lexer;\nexports.marked = marked;\nexports.options = options;\nexports.parse = parse;\nexports.parseInline = parseInline;\nexports.parser = parser;\nexports.setOptions = setOptions;\nexports.use = use;\nexports.walkTokens = walkTokens;\n","'use strict';\nvar CodeMirror = require('codemirror');\nrequire('codemirror/addon/edit/continuelist.js');\nrequire('./codemirror/tablist');\nrequire('codemirror/addon/display/fullscreen.js');\nrequire('codemirror/mode/markdown/markdown.js');\nrequire('codemirror/addon/mode/overlay.js');\nrequire('codemirror/addon/display/placeholder.js');\nrequire('codemirror/addon/display/autorefresh.js');\nrequire('codemirror/addon/selection/mark-selection.js');\nrequire('codemirror/addon/search/searchcursor.js');\nrequire('codemirror/mode/gfm/gfm.js');\nrequire('codemirror/mode/xml/xml.js');\nvar CodeMirrorSpellChecker = require('codemirror-spell-checker');\nvar marked = require('marked').marked;\n\n\n// Some variables\nvar isMac = /Mac/.test(navigator.platform);\nvar anchorToExternalRegex = new RegExp(/()+?/g);\n\n// Mapping of actions that can be bound to keyboard shortcuts or toolbar buttons\nvar bindings = {\n 'toggleBold': toggleBold,\n 'toggleItalic': toggleItalic,\n 'drawLink': drawLink,\n 'toggleHeadingSmaller': toggleHeadingSmaller,\n 'toggleHeadingBigger': toggleHeadingBigger,\n 'drawImage': drawImage,\n 'toggleBlockquote': toggleBlockquote,\n 'toggleOrderedList': toggleOrderedList,\n 'toggleUnorderedList': toggleUnorderedList,\n 'toggleCodeBlock': toggleCodeBlock,\n 'togglePreview': togglePreview,\n 'toggleStrikethrough': toggleStrikethrough,\n 'toggleHeading1': toggleHeading1,\n 'toggleHeading2': toggleHeading2,\n 'toggleHeading3': toggleHeading3,\n 'toggleHeading4': toggleHeading4,\n 'toggleHeading5': toggleHeading5,\n 'toggleHeading6': toggleHeading6,\n 'cleanBlock': cleanBlock,\n 'drawTable': drawTable,\n 'drawHorizontalRule': drawHorizontalRule,\n 'undo': undo,\n 'redo': redo,\n 'toggleSideBySide': toggleSideBySide,\n 'toggleFullScreen': toggleFullScreen,\n};\n\nvar shortcuts = {\n 'toggleBold': 'Cmd-B',\n 'toggleItalic': 'Cmd-I',\n 'drawLink': 'Cmd-K',\n 'toggleHeadingSmaller': 'Cmd-H',\n 'toggleHeadingBigger': 'Shift-Cmd-H',\n 'toggleHeading1': 'Ctrl+Alt+1',\n 'toggleHeading2': 'Ctrl+Alt+2',\n 'toggleHeading3': 'Ctrl+Alt+3',\n 'toggleHeading4': 'Ctrl+Alt+4',\n 'toggleHeading5': 'Ctrl+Alt+5',\n 'toggleHeading6': 'Ctrl+Alt+6',\n 'cleanBlock': 'Cmd-E',\n 'drawImage': 'Cmd-Alt-I',\n 'toggleBlockquote': 'Cmd-\\'',\n 'toggleOrderedList': 'Cmd-Alt-L',\n 'toggleUnorderedList': 'Cmd-L',\n 'toggleCodeBlock': 'Cmd-Alt-C',\n 'togglePreview': 'Cmd-P',\n 'toggleSideBySide': 'F9',\n 'toggleFullScreen': 'F11',\n};\n\nvar getBindingName = function (f) {\n for (var key in bindings) {\n if (bindings[key] === f) {\n return key;\n }\n }\n return null;\n};\n\nvar isMobile = function () {\n var check = false;\n (function (a) {\n if (/(android|bb\\d+|meego).+mobile|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i.test(a) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw-(n|u)|c55\\/|capi|ccwa|cdm-|cell|chtm|cldc|cmd-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc-s|devi|dica|dmob|do(c|p)o|ds(12|-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(-|_)|g1 u|g560|gene|gf-5|g-mo|go(\\.w|od)|gr(ad|un)|haie|hcit|hd-(m|p|t)|hei-|hi(pt|ta)|hp( i|ip)|hs-c|ht(c(-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i-(20|go|ma)|i230|iac( |-|\\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\\/)|klon|kpt |kwc-|kyo(c|k)|le(no|xi)|lg( g|\\/(k|l|u)|50|54|-[a-w])|libw|lynx|m1-w|m3ga|m50\\/|ma(te|ui|xo)|mc(01|21|ca)|m-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|-([1-8]|c))|phil|pire|pl(ay|uc)|pn-2|po(ck|rt|se)|prox|psio|pt-g|qa-a|qc(07|12|21|32|60|-[2-7]|i-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h-|oo|p-)|sdk\\/|se(c(-|0|1)|47|mc|nd|ri)|sgh-|shar|sie(-|m)|sk-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h-|v-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl-|tdg-|tel(i|m)|tim-|t-mo|to(pl|sh)|ts(70|m-|m3|m5)|tx-9|up(\\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas-|your|zeto|zte-/i.test(a.substr(0, 4))) check = true;\n })(navigator.userAgent || navigator.vendor || window.opera);\n return check;\n};\n\n/**\n * Modify HTML to add 'target=\"_blank\"' to links so they open in new tabs by default.\n * @param {string} htmlText - HTML to be modified.\n * @return {string} The modified HTML text.\n */\nfunction addAnchorTargetBlank(htmlText) {\n var match;\n while ((match = anchorToExternalRegex.exec(htmlText)) !== null) {\n // With only one capture group in the RegExp, we can safely take the first index from the match.\n var linkString = match[0];\n\n if (linkString.indexOf('target=') === -1) {\n var fixedLinkString = linkString.replace(/>$/, ' target=\"_blank\">');\n htmlText = htmlText.replace(linkString, fixedLinkString);\n }\n }\n return htmlText;\n}\n\n/**\n * Modify HTML to remove the list-style when rendering checkboxes.\n * @param {string} htmlText - HTML to be modified.\n * @return {string} The modified HTML text.\n */\nfunction removeListStyleWhenCheckbox(htmlText) {\n\n var parser = new DOMParser();\n var htmlDoc = parser.parseFromString(htmlText, 'text/html');\n var listItems = htmlDoc.getElementsByTagName('li');\n\n for (var i = 0; i < listItems.length; i++) {\n var listItem = listItems[i];\n\n for (var j = 0; j < listItem.children.length; j++) {\n var listItemChild = listItem.children[j];\n\n if (listItemChild instanceof HTMLInputElement && listItemChild.type === 'checkbox') {\n // From Github: margin: 0 .2em .25em -1.6em;\n listItem.style.marginLeft = '-1.5em';\n listItem.style.listStyleType = 'none';\n }\n }\n }\n\n return htmlDoc.documentElement.innerHTML;\n}\n\n/**\n * Fix shortcut. Mac use Command, others use Ctrl.\n */\nfunction fixShortcut(name) {\n if (isMac) {\n name = name.replace('Ctrl', 'Cmd');\n } else {\n name = name.replace('Cmd', 'Ctrl');\n }\n return name;\n}\n\n/**\n * Create dropdown block\n */\nfunction createToolbarDropdown(options, enableTooltips, shortcuts, parent) {\n var el = createToolbarButton(options, false, enableTooltips, shortcuts, 'button', parent);\n el.classList.add('easymde-dropdown');\n\n el.onclick = function () {\n el.focus();\n };\n\n var content = document.createElement('div');\n content.className = 'easymde-dropdown-content';\n for (var childrenIndex = 0; childrenIndex < options.children.length; childrenIndex++) {\n\n var child = options.children[childrenIndex];\n var childElement;\n\n if (typeof child === 'string' && child in toolbarBuiltInButtons) {\n childElement = createToolbarButton(toolbarBuiltInButtons[child], true, enableTooltips, shortcuts, 'button', parent);\n } else {\n childElement = createToolbarButton(child, true, enableTooltips, shortcuts, 'button', parent);\n }\n\n childElement.addEventListener('click', function (e) { e.stopPropagation(); }, false);\n content.appendChild(childElement);\n }\n el.appendChild(content);\n return el;\n}\n\n/**\n * Create button element for toolbar.\n */\nfunction createToolbarButton(options, enableActions, enableTooltips, shortcuts, markup, parent) {\n options = options || {};\n var el = document.createElement(markup);\n\n // Add 'custom' attributes as early as possible, so that 'official' attributes will never be overwritten.\n if (options.attributes) {\n for (var attribute in options.attributes) {\n if (Object.prototype.hasOwnProperty.call(options.attributes, attribute)) {\n el.setAttribute(attribute, options.attributes[attribute]);\n }\n }\n }\n\n var classNamePrefix = parent.options.toolbarButtonClassPrefix ? parent.options.toolbarButtonClassPrefix + '-' : '';\n el.className = classNamePrefix + options.name;\n el.setAttribute('type', markup);\n enableTooltips = (enableTooltips == undefined) ? true : enableTooltips;\n\n if (options.text) {\n el.innerText = options.text;\n }\n\n // Properly handle custom shortcuts\n if (options.name && options.name in shortcuts) {\n bindings[options.name] = options.action;\n }\n\n if (options.title && enableTooltips) {\n el.title = createTooltip(options.title, options.action, shortcuts);\n\n if (isMac) {\n el.title = el.title.replace('Ctrl', '⌘');\n el.title = el.title.replace('Alt', '⌥');\n }\n }\n\n if (options.title) {\n el.setAttribute('aria-label', options.title);\n }\n\n if (options.noDisable) {\n el.classList.add('no-disable');\n }\n\n if (options.noMobile) {\n el.classList.add('no-mobile');\n }\n\n // Prevent errors if there is no class name in custom options\n var classNameParts = [];\n if (typeof options.className !== 'undefined') {\n classNameParts = options.className.split(' ');\n }\n\n // Provide backwards compatibility with simple-markdown-editor by adding custom classes to the button.\n var iconClasses = [];\n for (var classNameIndex = 0; classNameIndex < classNameParts.length; classNameIndex++) {\n var classNamePart = classNameParts[classNameIndex];\n // Split icon classes from the button.\n // Regex will detect \"fa\", \"fas\", \"fa-something\" and \"fa-some-icon-1\", but not \"fanfare\".\n if (classNamePart.match(/^fa([srlb]|(-[\\w-]*)|$)/)) {\n iconClasses.push(classNamePart);\n } else {\n el.classList.add(classNamePart);\n }\n }\n\n el.tabIndex = -1;\n\n if (iconClasses.length > 0) {\n // Create icon element and append as a child to the button\n var icon = document.createElement('i');\n for (var iconClassIndex = 0; iconClassIndex < iconClasses.length; iconClassIndex++) {\n var iconClass = iconClasses[iconClassIndex];\n icon.classList.add(iconClass);\n }\n el.appendChild(icon);\n }\n\n // If there is a custom icon markup set, use that\n if (typeof options.icon !== 'undefined') {\n el.innerHTML = options.icon;\n }\n\n if (options.action && enableActions) {\n if (typeof options.action === 'function') {\n el.onclick = function (e) {\n e.preventDefault();\n options.action(parent);\n };\n } else if (typeof options.action === 'string') {\n el.onclick = function (e) {\n e.preventDefault();\n window.open(options.action, '_blank');\n };\n }\n }\n\n return el;\n}\n\nfunction createSep() {\n var el = document.createElement('i');\n el.className = 'separator';\n el.innerHTML = '|';\n return el;\n}\n\nfunction createTooltip(title, action, shortcuts) {\n var actionName;\n var tooltip = title;\n\n if (action) {\n actionName = getBindingName(action);\n if (shortcuts[actionName]) {\n tooltip += ' (' + fixShortcut(shortcuts[actionName]) + ')';\n }\n }\n\n return tooltip;\n}\n\n/**\n * The state of CodeMirror at the given position.\n */\nfunction getState(cm, pos) {\n pos = pos || cm.getCursor('start');\n var stat = cm.getTokenAt(pos);\n if (!stat.type) return {};\n\n var types = stat.type.split(' ');\n\n var ret = {},\n data, text;\n for (var i = 0; i < types.length; i++) {\n data = types[i];\n if (data === 'strong') {\n ret.bold = true;\n } else if (data === 'variable-2') {\n text = cm.getLine(pos.line);\n if (/^\\s*\\d+\\.\\s/.test(text)) {\n ret['ordered-list'] = true;\n } else {\n ret['unordered-list'] = true;\n }\n } else if (data === 'atom') {\n ret.quote = true;\n } else if (data === 'em') {\n ret.italic = true;\n } else if (data === 'quote') {\n ret.quote = true;\n } else if (data === 'strikethrough') {\n ret.strikethrough = true;\n } else if (data === 'comment') {\n ret.code = true;\n } else if (data === 'link' && !ret.image) {\n ret.link = true;\n } else if (data === 'image') {\n ret.image = true;\n } else if (data.match(/^header(-[1-6])?$/)) {\n ret[data.replace('header', 'heading')] = true;\n }\n }\n return ret;\n}\n\n\n// Saved overflow setting\nvar saved_overflow = '';\n\n/**\n * Toggle full screen of the editor.\n * @param {EasyMDE} editor\n */\nfunction toggleFullScreen(editor) {\n // Set fullscreen\n var cm = editor.codemirror;\n cm.setOption('fullScreen', !cm.getOption('fullScreen'));\n\n\n // Prevent scrolling on body during fullscreen active\n if (cm.getOption('fullScreen')) {\n saved_overflow = document.body.style.overflow;\n document.body.style.overflow = 'hidden';\n } else {\n document.body.style.overflow = saved_overflow;\n }\n\n var wrapper = cm.getWrapperElement();\n var sidebyside = wrapper.nextSibling;\n\n if (sidebyside.classList.contains('editor-preview-active-side')) {\n if (editor.options.sideBySideFullscreen === false) {\n // if side-by-side not-fullscreen ok, apply classes as needed\n var easyMDEContainer = wrapper.parentNode;\n if (cm.getOption('fullScreen')) {\n easyMDEContainer.classList.remove('sided--no-fullscreen');\n } else {\n easyMDEContainer.classList.add('sided--no-fullscreen');\n }\n } else {\n toggleSideBySide(editor);\n }\n }\n\n if (editor.options.onToggleFullScreen) {\n editor.options.onToggleFullScreen(cm.getOption('fullScreen') || false);\n }\n\n // Remove or set maxHeight\n if (typeof editor.options.maxHeight !== 'undefined') {\n if (cm.getOption('fullScreen')) {\n cm.getScrollerElement().style.removeProperty('height');\n sidebyside.style.removeProperty('height');\n } else {\n cm.getScrollerElement().style.height = editor.options.maxHeight;\n editor.setPreviewMaxHeight();\n }\n }\n\n // Update toolbar class\n editor.toolbar_div.classList.toggle('fullscreen');\n\n // Update toolbar button\n if (editor.toolbarElements && editor.toolbarElements.fullscreen) {\n var toolbarButton = editor.toolbarElements.fullscreen;\n toolbarButton.classList.toggle('active');\n }\n}\n\n\n/**\n * Action for toggling bold.\n * @param {EasyMDE} editor\n */\nfunction toggleBold(editor) {\n _toggleBlock(editor, 'bold', editor.options.blockStyles.bold);\n}\n\n\n/**\n * Action for toggling italic.\n * @param {EasyMDE} editor\n */\nfunction toggleItalic(editor) {\n _toggleBlock(editor, 'italic', editor.options.blockStyles.italic);\n}\n\n\n/**\n * Action for toggling strikethrough.\n * @param {EasyMDE} editor\n */\nfunction toggleStrikethrough(editor) {\n _toggleBlock(editor, 'strikethrough', '~~');\n}\n\n/**\n * Action for toggling code block.\n * @param {EasyMDE} editor\n */\nfunction toggleCodeBlock(editor) {\n var fenceCharsToInsert = editor.options.blockStyles.code;\n\n function fencing_line(line) {\n /* return true, if this is a ``` or ~~~ line */\n if (typeof line !== 'object') {\n throw 'fencing_line() takes a \\'line\\' object (not a line number, or line text). Got: ' + typeof line + ': ' + line;\n }\n return line.styles && line.styles[2] && line.styles[2].indexOf('formatting-code-block') !== -1;\n }\n\n function token_state(token) {\n // base goes an extra level deep when mode backdrops are used, e.g. spellchecker on\n return token.state.base.base || token.state.base;\n }\n\n function code_type(cm, line_num, line, firstTok, lastTok) {\n /*\n * Return \"single\", \"indented\", \"fenced\" or false\n *\n * cm and line_num are required. Others are optional for efficiency\n * To check in the middle of a line, pass in firstTok yourself.\n */\n line = line || cm.getLineHandle(line_num);\n firstTok = firstTok || cm.getTokenAt({\n line: line_num,\n ch: 1,\n });\n lastTok = lastTok || (!!line.text && cm.getTokenAt({\n line: line_num,\n ch: line.text.length - 1,\n }));\n var types = firstTok.type ? firstTok.type.split(' ') : [];\n if (lastTok && token_state(lastTok).indentedCode) {\n // have to check last char, since first chars of first line aren\"t marked as indented\n return 'indented';\n } else if (types.indexOf('comment') === -1) {\n // has to be after \"indented\" check, since first chars of first indented line aren\"t marked as such\n return false;\n } else if (token_state(firstTok).fencedChars || token_state(lastTok).fencedChars || fencing_line(line)) {\n return 'fenced';\n } else {\n return 'single';\n }\n }\n\n function insertFencingAtSelection(cm, cur_start, cur_end, fenceCharsToInsert) {\n var start_line_sel = cur_start.line + 1,\n end_line_sel = cur_end.line + 1,\n sel_multi = cur_start.line !== cur_end.line,\n repl_start = fenceCharsToInsert + '\\n',\n repl_end = '\\n' + fenceCharsToInsert;\n if (sel_multi) {\n end_line_sel++;\n }\n // handle last char including \\n or not\n if (sel_multi && cur_end.ch === 0) {\n repl_end = fenceCharsToInsert + '\\n';\n end_line_sel--;\n }\n _replaceSelection(cm, false, [repl_start, repl_end]);\n cm.setSelection({\n line: start_line_sel,\n ch: 0,\n }, {\n line: end_line_sel,\n ch: 0,\n });\n }\n\n var cm = editor.codemirror,\n cur_start = cm.getCursor('start'),\n cur_end = cm.getCursor('end'),\n tok = cm.getTokenAt({\n line: cur_start.line,\n ch: cur_start.ch || 1,\n }), // avoid ch 0 which is a cursor pos but not token\n line = cm.getLineHandle(cur_start.line),\n is_code = code_type(cm, cur_start.line, line, tok);\n var block_start, block_end, lineCount;\n\n if (is_code === 'single') {\n // similar to some EasyMDE _toggleBlock logic\n var start = line.text.slice(0, cur_start.ch).replace('`', ''),\n end = line.text.slice(cur_start.ch).replace('`', '');\n cm.replaceRange(start + end, {\n line: cur_start.line,\n ch: 0,\n }, {\n line: cur_start.line,\n ch: 99999999999999,\n });\n cur_start.ch--;\n if (cur_start !== cur_end) {\n cur_end.ch--;\n }\n cm.setSelection(cur_start, cur_end);\n cm.focus();\n } else if (is_code === 'fenced') {\n if (cur_start.line !== cur_end.line || cur_start.ch !== cur_end.ch) {\n // use selection\n\n // find the fenced line so we know what type it is (tilde, backticks, number of them)\n for (block_start = cur_start.line; block_start >= 0; block_start--) {\n line = cm.getLineHandle(block_start);\n if (fencing_line(line)) {\n break;\n }\n }\n var fencedTok = cm.getTokenAt({\n line: block_start,\n ch: 1,\n });\n var fence_chars = token_state(fencedTok).fencedChars;\n var start_text, start_line;\n var end_text, end_line;\n // check for selection going up against fenced lines, in which case we don't want to add more fencing\n if (fencing_line(cm.getLineHandle(cur_start.line))) {\n start_text = '';\n start_line = cur_start.line;\n } else if (fencing_line(cm.getLineHandle(cur_start.line - 1))) {\n start_text = '';\n start_line = cur_start.line - 1;\n } else {\n start_text = fence_chars + '\\n';\n start_line = cur_start.line;\n }\n if (fencing_line(cm.getLineHandle(cur_end.line))) {\n end_text = '';\n end_line = cur_end.line;\n if (cur_end.ch === 0) {\n end_line += 1;\n }\n } else if (cur_end.ch !== 0 && fencing_line(cm.getLineHandle(cur_end.line + 1))) {\n end_text = '';\n end_line = cur_end.line + 1;\n } else {\n end_text = fence_chars + '\\n';\n end_line = cur_end.line + 1;\n }\n if (cur_end.ch === 0) {\n // full last line selected, putting cursor at beginning of next\n end_line -= 1;\n }\n cm.operation(function () {\n // end line first, so that line numbers don't change\n cm.replaceRange(end_text, {\n line: end_line,\n ch: 0,\n }, {\n line: end_line + (end_text ? 0 : 1),\n ch: 0,\n });\n cm.replaceRange(start_text, {\n line: start_line,\n ch: 0,\n }, {\n line: start_line + (start_text ? 0 : 1),\n ch: 0,\n });\n });\n cm.setSelection({\n line: start_line + (start_text ? 1 : 0),\n ch: 0,\n }, {\n line: end_line + (start_text ? 1 : -1),\n ch: 0,\n });\n cm.focus();\n } else {\n // no selection, search for ends of this fenced block\n var search_from = cur_start.line;\n if (fencing_line(cm.getLineHandle(cur_start.line))) { // gets a little tricky if cursor is right on a fenced line\n if (code_type(cm, cur_start.line + 1) === 'fenced') {\n block_start = cur_start.line;\n search_from = cur_start.line + 1; // for searching for \"end\"\n } else {\n block_end = cur_start.line;\n search_from = cur_start.line - 1; // for searching for \"start\"\n }\n }\n if (block_start === undefined) {\n for (block_start = search_from; block_start >= 0; block_start--) {\n line = cm.getLineHandle(block_start);\n if (fencing_line(line)) {\n break;\n }\n }\n }\n if (block_end === undefined) {\n lineCount = cm.lineCount();\n for (block_end = search_from; block_end < lineCount; block_end++) {\n line = cm.getLineHandle(block_end);\n if (fencing_line(line)) {\n break;\n }\n }\n }\n cm.operation(function () {\n cm.replaceRange('', {\n line: block_start,\n ch: 0,\n }, {\n line: block_start + 1,\n ch: 0,\n });\n cm.replaceRange('', {\n line: block_end - 1,\n ch: 0,\n }, {\n line: block_end,\n ch: 0,\n });\n });\n cm.focus();\n }\n } else if (is_code === 'indented') {\n if (cur_start.line !== cur_end.line || cur_start.ch !== cur_end.ch) {\n // use selection\n block_start = cur_start.line;\n block_end = cur_end.line;\n if (cur_end.ch === 0) {\n block_end--;\n }\n } else {\n // no selection, search for ends of this indented block\n for (block_start = cur_start.line; block_start >= 0; block_start--) {\n line = cm.getLineHandle(block_start);\n if (line.text.match(/^\\s*$/)) {\n // empty or all whitespace - keep going\n continue;\n } else {\n if (code_type(cm, block_start, line) !== 'indented') {\n block_start += 1;\n break;\n }\n }\n }\n lineCount = cm.lineCount();\n for (block_end = cur_start.line; block_end < lineCount; block_end++) {\n line = cm.getLineHandle(block_end);\n if (line.text.match(/^\\s*$/)) {\n // empty or all whitespace - keep going\n continue;\n } else {\n if (code_type(cm, block_end, line) !== 'indented') {\n block_end -= 1;\n break;\n }\n }\n }\n }\n // if we are going to un-indent based on a selected set of lines, and the next line is indented too, we need to\n // insert a blank line so that the next line(s) continue to be indented code\n var next_line = cm.getLineHandle(block_end + 1),\n next_line_last_tok = next_line && cm.getTokenAt({\n line: block_end + 1,\n ch: next_line.text.length - 1,\n }),\n next_line_indented = next_line_last_tok && token_state(next_line_last_tok).indentedCode;\n if (next_line_indented) {\n cm.replaceRange('\\n', {\n line: block_end + 1,\n ch: 0,\n });\n }\n\n for (var i = block_start; i <= block_end; i++) {\n cm.indentLine(i, 'subtract'); // TODO: this doesn't get tracked in the history, so can't be undone :(\n }\n cm.focus();\n } else {\n // insert code formatting\n var no_sel_and_starting_of_line = (cur_start.line === cur_end.line && cur_start.ch === cur_end.ch && cur_start.ch === 0);\n var sel_multi = cur_start.line !== cur_end.line;\n if (no_sel_and_starting_of_line || sel_multi) {\n insertFencingAtSelection(cm, cur_start, cur_end, fenceCharsToInsert);\n } else {\n _replaceSelection(cm, false, ['`', '`']);\n }\n }\n}\n\n/**\n * Action for toggling blockquote.\n */\nfunction toggleBlockquote(editor) {\n _toggleLine(editor.codemirror, 'quote');\n}\n\n/**\n * Action for toggling heading size: normal -> h1 -> h2 -> h3 -> h4 -> h5 -> h6 -> normal\n */\nfunction toggleHeadingSmaller(editor) {\n _toggleHeading(editor.codemirror, 'smaller');\n}\n\n/**\n * Action for toggling heading size: normal -> h6 -> h5 -> h4 -> h3 -> h2 -> h1 -> normal\n */\nfunction toggleHeadingBigger(editor) {\n _toggleHeading(editor.codemirror, 'bigger');\n}\n\n/**\n * Action for toggling heading size 1\n */\nfunction toggleHeading1(editor) {\n _toggleHeading(editor.codemirror, undefined, 1);\n}\n\n/**\n * Action for toggling heading size 2\n */\nfunction toggleHeading2(editor) {\n _toggleHeading(editor.codemirror, undefined, 2);\n}\n\n/**\n * Action for toggling heading size 3\n */\nfunction toggleHeading3(editor) {\n _toggleHeading(editor.codemirror, undefined, 3);\n}\n\n/**\n * Action for toggling heading size 4\n */\nfunction toggleHeading4(editor) {\n _toggleHeading(editor.codemirror, undefined, 4);\n}\n\n/**\n * Action for toggling heading size 5\n */\nfunction toggleHeading5(editor) {\n _toggleHeading(editor.codemirror, undefined, 5);\n}\n\n/**\n * Action for toggling heading size 6\n */\nfunction toggleHeading6(editor) {\n _toggleHeading(editor.codemirror, undefined, 6);\n}\n\n\n/**\n * Action for toggling ul.\n */\nfunction toggleUnorderedList(editor) {\n var cm = editor.codemirror;\n\n var listStyle = '*'; // Default\n if (['-', '+', '*'].includes(editor.options.unorderedListStyle)) {\n listStyle = editor.options.unorderedListStyle;\n }\n\n _toggleLine(cm, 'unordered-list', listStyle);\n}\n\n\n/**\n * Action for toggling ol.\n */\nfunction toggleOrderedList(editor) {\n _toggleLine(editor.codemirror, 'ordered-list');\n}\n\n/**\n * Action for clean block (remove headline, list, blockquote code, markers)\n */\nfunction cleanBlock(editor) {\n _cleanBlock(editor.codemirror);\n}\n\n/**\n * Action for drawing a link.\n * @param {EasyMDE} editor\n */\nfunction drawLink(editor) {\n var options = editor.options;\n var url = 'https://';\n if (options.promptURLs) {\n var result = prompt(options.promptTexts.link, url);\n if (!result) {\n return false;\n }\n url = escapePromptURL(result);\n }\n _toggleLink(editor, 'link', options.insertTexts.link, url);\n}\n\n/**\n * Action for drawing an img.\n * @param {EasyMDE} editor\n */\nfunction drawImage(editor) {\n var options = editor.options;\n var url = 'https://';\n if (options.promptURLs) {\n var result = prompt(options.promptTexts.image, url);\n if (!result) {\n return false;\n }\n url = escapePromptURL(result);\n }\n _toggleLink(editor, 'image', options.insertTexts.image, url);\n}\n\n/**\n * Encode and escape URLs to prevent breaking up rendered Markdown links.\n * @param {string} url The url of the link or image\n */\nfunction escapePromptURL(url) {\n return encodeURI(url).replace(/([\\\\()])/g, '\\\\$1');\n}\n\n/**\n * Action for opening the browse-file window to upload an image to a server.\n * @param {EasyMDE} editor The EasyMDE object\n */\nfunction drawUploadedImage(editor) {\n // TODO: Draw the image template with a fake url? ie: '![](importing foo.png...)'\n editor.openBrowseFileWindow();\n}\n\n/**\n * Action executed after an image have been successfully imported on the server.\n * @param {EasyMDE} editor The EasyMDE object\n * @param {string} url The url of the uploaded image\n */\nfunction afterImageUploaded(editor, url) {\n var cm = editor.codemirror;\n var stat = getState(cm);\n var options = editor.options;\n var imageName = url.substr(url.lastIndexOf('/') + 1);\n var ext = imageName.substring(imageName.lastIndexOf('.') + 1).replace(/\\?.*$/, '').toLowerCase();\n\n // Check if media is an image\n if (['png', 'jpg', 'jpeg', 'gif', 'svg', 'apng', 'avif', 'webp'].includes(ext)) {\n _replaceSelection(cm, stat.image, options.insertTexts.uploadedImage, url);\n } else {\n var text_link = options.insertTexts.link;\n text_link[0] = '[' + imageName;\n _replaceSelection(cm, stat.link, text_link, url);\n }\n\n // show uploaded image filename for 1000ms\n editor.updateStatusBar('upload-image', editor.options.imageTexts.sbOnUploaded.replace('#image_name#', imageName));\n setTimeout(function () {\n editor.updateStatusBar('upload-image', editor.options.imageTexts.sbInit);\n }, 1000);\n}\n\n/**\n * Action for drawing a table.\n * @param {EasyMDE} editor\n */\nfunction drawTable(editor) {\n var cm = editor.codemirror;\n var stat = getState(cm);\n var options = editor.options;\n _replaceSelection(cm, stat.table, options.insertTexts.table);\n}\n\n/**\n * Action for drawing a horizontal rule.\n * @param {EasyMDE} editor\n */\nfunction drawHorizontalRule(editor) {\n var cm = editor.codemirror;\n var stat = getState(cm);\n var options = editor.options;\n _replaceSelection(cm, stat.image, options.insertTexts.horizontalRule);\n}\n\n\n/**\n * Undo action.\n * @param {EasyMDE} editor\n */\nfunction undo(editor) {\n var cm = editor.codemirror;\n cm.undo();\n cm.focus();\n}\n\n\n/**\n * Redo action.\n * @param {EasyMDE} editor\n */\nfunction redo(editor) {\n var cm = editor.codemirror;\n cm.redo();\n cm.focus();\n}\n\n\n/**\n * Toggle side by side preview\n * @param {EasyMDE} editor\n */\nfunction toggleSideBySide(editor) {\n var cm = editor.codemirror;\n var wrapper = cm.getWrapperElement();\n var preview = wrapper.nextSibling;\n var toolbarButton = editor.toolbarElements && editor.toolbarElements['side-by-side'];\n var useSideBySideListener = false;\n\n var easyMDEContainer = wrapper.parentNode;\n\n if (preview.classList.contains('editor-preview-active-side')) {\n if (editor.options.sideBySideFullscreen === false) {\n // if side-by-side not-fullscreen ok, remove classes when hiding side\n easyMDEContainer.classList.remove('sided--no-fullscreen');\n }\n preview.classList.remove('editor-preview-active-side');\n if (toolbarButton) toolbarButton.classList.remove('active');\n wrapper.classList.remove('CodeMirror-sided');\n } else {\n // When the preview button is clicked for the first time,\n // give some time for the transition from editor.css to fire and the view to slide from right to left,\n // instead of just appearing.\n setTimeout(function () {\n if (!cm.getOption('fullScreen')) {\n if (editor.options.sideBySideFullscreen === false) {\n // if side-by-side not-fullscreen ok, add classes when not fullscreen and showing side\n easyMDEContainer.classList.add('sided--no-fullscreen');\n } else {\n toggleFullScreen(editor);\n }\n }\n preview.classList.add('editor-preview-active-side');\n }, 1);\n if (toolbarButton) toolbarButton.classList.add('active');\n wrapper.classList.add('CodeMirror-sided');\n useSideBySideListener = true;\n }\n\n // Hide normal preview if active\n var previewNormal = wrapper.lastChild;\n if (previewNormal.classList.contains('editor-preview-active')) {\n previewNormal.classList.remove('editor-preview-active');\n var toolbar = editor.toolbarElements.preview;\n var toolbar_div = editor.toolbar_div;\n toolbar.classList.remove('active');\n toolbar_div.classList.remove('disabled-for-preview');\n }\n\n var sideBySideRenderingFunction = function () {\n var newValue = editor.options.previewRender(editor.value(), preview);\n if (newValue != null) {\n preview.innerHTML = newValue;\n }\n };\n\n if (!cm.sideBySideRenderingFunction) {\n cm.sideBySideRenderingFunction = sideBySideRenderingFunction;\n }\n\n if (useSideBySideListener) {\n var newValue = editor.options.previewRender(editor.value(), preview);\n if (newValue != null) {\n preview.innerHTML = newValue;\n }\n cm.on('update', cm.sideBySideRenderingFunction);\n } else {\n cm.off('update', cm.sideBySideRenderingFunction);\n }\n\n // Refresh to fix selection being off (#309)\n cm.refresh();\n}\n\n\n/**\n * Preview action.\n * @param {EasyMDE} editor\n */\nfunction togglePreview(editor) {\n var cm = editor.codemirror;\n var wrapper = cm.getWrapperElement();\n var toolbar_div = editor.toolbar_div;\n var toolbar = editor.options.toolbar ? editor.toolbarElements.preview : false;\n var preview = wrapper.lastChild;\n\n // Turn off side by side if needed\n var sidebyside = cm.getWrapperElement().nextSibling;\n if (sidebyside.classList.contains('editor-preview-active-side'))\n toggleSideBySide(editor);\n\n if (!preview || !preview.classList.contains('editor-preview-full')) {\n\n preview = document.createElement('div');\n preview.className = 'editor-preview-full';\n\n if (editor.options.previewClass) {\n\n if (Array.isArray(editor.options.previewClass)) {\n for (var i = 0; i < editor.options.previewClass.length; i++) {\n preview.classList.add(editor.options.previewClass[i]);\n }\n\n } else if (typeof editor.options.previewClass === 'string') {\n preview.classList.add(editor.options.previewClass);\n }\n }\n\n wrapper.appendChild(preview);\n }\n\n if (preview.classList.contains('editor-preview-active')) {\n preview.classList.remove('editor-preview-active');\n if (toolbar) {\n toolbar.classList.remove('active');\n toolbar_div.classList.remove('disabled-for-preview');\n }\n } else {\n // When the preview button is clicked for the first time,\n // give some time for the transition from editor.css to fire and the view to slide from right to left,\n // instead of just appearing.\n setTimeout(function () {\n preview.classList.add('editor-preview-active');\n }, 1);\n if (toolbar) {\n toolbar.classList.add('active');\n toolbar_div.classList.add('disabled-for-preview');\n }\n }\n\n var preview_result = editor.options.previewRender(editor.value(), preview);\n if (preview_result !== null) {\n preview.innerHTML = preview_result;\n }\n\n}\n\nfunction _replaceSelection(cm, active, startEnd, url) {\n if (cm.getWrapperElement().lastChild.classList.contains('editor-preview-active'))\n return;\n\n var text;\n var start = startEnd[0];\n var end = startEnd[1];\n var startPoint = {},\n endPoint = {};\n Object.assign(startPoint, cm.getCursor('start'));\n Object.assign(endPoint, cm.getCursor('end'));\n if (url) {\n start = start.replace('#url#', url); // url is in start for upload-image\n end = end.replace('#url#', url);\n }\n if (active) {\n text = cm.getLine(startPoint.line);\n start = text.slice(0, startPoint.ch);\n end = text.slice(startPoint.ch);\n cm.replaceRange(start + end, {\n line: startPoint.line,\n ch: 0,\n });\n } else {\n text = cm.getSelection();\n cm.replaceSelection(start + text + end);\n\n startPoint.ch += start.length;\n if (startPoint !== endPoint) {\n endPoint.ch += start.length;\n }\n }\n cm.setSelection(startPoint, endPoint);\n cm.focus();\n}\n\n\nfunction _toggleHeading(cm, direction, size) {\n if (cm.getWrapperElement().lastChild.classList.contains('editor-preview-active'))\n return;\n\n var startPoint = cm.getCursor('start');\n var endPoint = cm.getCursor('end');\n for (var i = startPoint.line; i <= endPoint.line; i++) {\n (function (i) {\n var text = cm.getLine(i);\n var currHeadingLevel = text.search(/[^#]/);\n\n if (direction !== undefined) {\n if (currHeadingLevel <= 0) {\n if (direction == 'bigger') {\n text = '###### ' + text;\n } else {\n text = '# ' + text;\n }\n } else if (currHeadingLevel == 6 && direction == 'smaller') {\n text = text.substr(7);\n } else if (currHeadingLevel == 1 && direction == 'bigger') {\n text = text.substr(2);\n } else {\n if (direction == 'bigger') {\n text = text.substr(1);\n } else {\n text = '#' + text;\n }\n }\n } else {\n if (currHeadingLevel <= 0) {\n text = '#'.repeat(size) + ' ' + text;\n } else if (currHeadingLevel == size) {\n text = text.substr(currHeadingLevel + 1);\n } else {\n text = '#'.repeat(size) + ' ' + text.substr(currHeadingLevel + 1);\n }\n }\n\n cm.replaceRange(text, {\n line: i,\n ch: 0,\n }, {\n line: i,\n ch: 99999999999999,\n });\n })(i);\n }\n cm.focus();\n}\n\n\nfunction _toggleLine(cm, name, liststyle) {\n if (cm.getWrapperElement().lastChild.classList.contains('editor-preview-active'))\n return;\n\n var listRegexp = /^(\\s*)(\\*|-|\\+|\\d*\\.)(\\s+)/;\n var whitespacesRegexp = /^\\s*/;\n\n var stat = getState(cm);\n var startPoint = cm.getCursor('start');\n var endPoint = cm.getCursor('end');\n var repl = {\n 'quote': /^(\\s*)>\\s+/,\n 'unordered-list': listRegexp,\n 'ordered-list': listRegexp,\n };\n\n var _getChar = function (name, i) {\n var map = {\n 'quote': '>',\n 'unordered-list': liststyle,\n 'ordered-list': '%%i.',\n };\n\n return map[name].replace('%%i', i);\n };\n\n var _checkChar = function (name, char) {\n var map = {\n 'quote': '>',\n 'unordered-list': '\\\\' + liststyle,\n 'ordered-list': '\\\\d+.',\n };\n var rt = new RegExp(map[name]);\n\n return char && rt.test(char);\n };\n\n var _toggle = function (name, text, untoggleOnly) {\n var arr = listRegexp.exec(text);\n var char = _getChar(name, line);\n if (arr !== null) {\n if (_checkChar(name, arr[2])) {\n char = '';\n }\n text = arr[1] + char + arr[3] + text.replace(whitespacesRegexp, '').replace(repl[name], '$1');\n } else if (untoggleOnly == false) {\n text = char + ' ' + text;\n }\n return text;\n };\n\n var line = 1;\n for (var i = startPoint.line; i <= endPoint.line; i++) {\n (function (i) {\n var text = cm.getLine(i);\n if (stat[name]) {\n text = text.replace(repl[name], '$1');\n } else {\n // If we're toggling unordered-list formatting, check if the current line\n // is part of an ordered-list, and if so, untoggle that first.\n // Workaround for https://github.com/Ionaru/easy-markdown-editor/issues/92\n if (name == 'unordered-list') {\n text = _toggle('ordered-list', text, true);\n }\n text = _toggle(name, text, false);\n line += 1;\n }\n cm.replaceRange(text, {\n line: i,\n ch: 0,\n }, {\n line: i,\n ch: 99999999999999,\n });\n })(i);\n }\n cm.focus();\n}\n\n/**\n * @param {EasyMDE} editor\n * @param {'link' | 'image'} type\n * @param {string} startEnd\n * @param {string} url\n */\nfunction _toggleLink(editor, type, startEnd, url) {\n if (!editor.codemirror || editor.isPreviewActive()) {\n return;\n }\n\n var cm = editor.codemirror;\n var stat = getState(cm);\n var active = stat[type];\n if (!active) {\n _replaceSelection(cm, active, startEnd, url);\n return;\n }\n\n var startPoint = cm.getCursor('start');\n var endPoint = cm.getCursor('end');\n var text = cm.getLine(startPoint.line);\n var start = text.slice(0, startPoint.ch);\n var end = text.slice(startPoint.ch);\n\n if (type == 'link') {\n start = start.replace(/(.*)[^!]\\[/, '$1');\n } else if (type == 'image') {\n start = start.replace(/(.*)!\\[$/, '$1');\n }\n end = end.replace(/]\\(.*?\\)/, '');\n\n cm.replaceRange(start + end, {\n line: startPoint.line,\n ch: 0,\n }, {\n line: startPoint.line,\n ch: 99999999999999,\n });\n\n startPoint.ch -= startEnd[0].length;\n if (startPoint !== endPoint) {\n endPoint.ch -= startEnd[0].length;\n }\n cm.setSelection(startPoint, endPoint);\n cm.focus();\n}\n\n/**\n * @param {EasyMDE} editor\n */\nfunction _toggleBlock(editor, type, start_chars, end_chars) {\n if (!editor.codemirror || editor.isPreviewActive()) {\n return;\n }\n\n end_chars = (typeof end_chars === 'undefined') ? start_chars : end_chars;\n var cm = editor.codemirror;\n var stat = getState(cm);\n\n var text;\n var start = start_chars;\n var end = end_chars;\n\n var startPoint = cm.getCursor('start');\n var endPoint = cm.getCursor('end');\n\n if (stat[type]) {\n text = cm.getLine(startPoint.line);\n start = text.slice(0, startPoint.ch);\n end = text.slice(startPoint.ch);\n if (type == 'bold') {\n start = start.replace(/(\\*\\*|__)(?![\\s\\S]*(\\*\\*|__))/, '');\n end = end.replace(/(\\*\\*|__)/, '');\n } else if (type == 'italic') {\n start = start.replace(/(\\*|_)(?![\\s\\S]*(\\*|_))/, '');\n end = end.replace(/(\\*|_)/, '');\n } else if (type == 'strikethrough') {\n start = start.replace(/(\\*\\*|~~)(?![\\s\\S]*(\\*\\*|~~))/, '');\n end = end.replace(/(\\*\\*|~~)/, '');\n }\n cm.replaceRange(start + end, {\n line: startPoint.line,\n ch: 0,\n }, {\n line: startPoint.line,\n ch: 99999999999999,\n });\n\n if (type == 'bold' || type == 'strikethrough') {\n startPoint.ch -= 2;\n if (startPoint !== endPoint) {\n endPoint.ch -= 2;\n }\n } else if (type == 'italic') {\n startPoint.ch -= 1;\n if (startPoint !== endPoint) {\n endPoint.ch -= 1;\n }\n }\n } else {\n text = cm.getSelection();\n if (type == 'bold') {\n text = text.split('**').join('');\n text = text.split('__').join('');\n } else if (type == 'italic') {\n text = text.split('*').join('');\n text = text.split('_').join('');\n } else if (type == 'strikethrough') {\n text = text.split('~~').join('');\n }\n cm.replaceSelection(start + text + end);\n\n startPoint.ch += start_chars.length;\n endPoint.ch = startPoint.ch + text.length;\n }\n\n cm.setSelection(startPoint, endPoint);\n cm.focus();\n}\n\nfunction _cleanBlock(cm) {\n if (cm.getWrapperElement().lastChild.classList.contains('editor-preview-active'))\n return;\n\n var startPoint = cm.getCursor('start');\n var endPoint = cm.getCursor('end');\n var text;\n\n for (var line = startPoint.line; line <= endPoint.line; line++) {\n text = cm.getLine(line);\n text = text.replace(/^[ ]*([# ]+|\\*|-|[> ]+|[0-9]+(.|\\)))[ ]*/, '');\n\n cm.replaceRange(text, {\n line: line,\n ch: 0,\n }, {\n line: line,\n ch: 99999999999999,\n });\n }\n}\n\n/**\n * Convert a number of bytes to a human-readable file size. If you desire\n * to add a space between the value and the unit, you need to add this space\n * to the given units.\n * @param bytes {number} A number of bytes, as integer. Ex: 421137\n * @param units {number[]} An array of human-readable units, ie. [' B', ' K', ' MB']\n * @returns string A human-readable file size. Ex: '412 KB'\n */\nfunction humanFileSize(bytes, units) {\n if (Math.abs(bytes) < 1024) {\n return '' + bytes + units[0];\n }\n var u = 0;\n do {\n bytes /= 1024;\n ++u;\n } while (Math.abs(bytes) >= 1024 && u < units.length);\n return '' + bytes.toFixed(1) + units[u];\n}\n\n// Merge the properties of one object into another.\nfunction _mergeProperties(target, source) {\n for (var property in source) {\n if (Object.prototype.hasOwnProperty.call(source, property)) {\n if (source[property] instanceof Array) {\n target[property] = source[property].concat(target[property] instanceof Array ? target[property] : []);\n } else if (\n source[property] !== null &&\n typeof source[property] === 'object' &&\n source[property].constructor === Object\n ) {\n target[property] = _mergeProperties(target[property] || {}, source[property]);\n } else {\n target[property] = source[property];\n }\n }\n }\n\n return target;\n}\n\n// Merge an arbitrary number of objects into one.\nfunction extend(target) {\n for (var i = 1; i < arguments.length; i++) {\n target = _mergeProperties(target, arguments[i]);\n }\n\n return target;\n}\n\n/* The right word count in respect for CJK. */\nfunction wordCount(data) {\n var pattern = /[a-zA-Z0-9_\\u00A0-\\u02AF\\u0392-\\u03c9\\u0410-\\u04F9]+|[\\u4E00-\\u9FFF\\u3400-\\u4dbf\\uf900-\\ufaff\\u3040-\\u309f\\uac00-\\ud7af]+/g;\n var m = data.match(pattern);\n var count = 0;\n if (m === null) return count;\n for (var i = 0; i < m.length; i++) {\n if (m[i].charCodeAt(0) >= 0x4E00) {\n count += m[i].length;\n } else {\n count += 1;\n }\n }\n return count;\n}\n\nvar iconClassMap = {\n 'bold': 'fa fa-bold',\n 'italic': 'fa fa-italic',\n 'strikethrough': 'fa fa-strikethrough',\n 'heading': 'fa fa-header fa-heading',\n 'heading-smaller': 'fa fa-header fa-heading header-smaller',\n 'heading-bigger': 'fa fa-header fa-heading header-bigger',\n 'heading-1': 'fa fa-header fa-heading header-1',\n 'heading-2': 'fa fa-header fa-heading header-2',\n 'heading-3': 'fa fa-header fa-heading header-3',\n 'code': 'fa fa-code',\n 'quote': 'fa fa-quote-left',\n 'ordered-list': 'fa fa-list-ol',\n 'unordered-list': 'fa fa-list-ul',\n 'clean-block': 'fa fa-eraser',\n 'link': 'fa fa-link',\n 'image': 'fa fa-image',\n 'upload-image': 'fa fa-image',\n 'table': 'fa fa-table',\n 'horizontal-rule': 'fa fa-minus',\n 'preview': 'fa fa-eye',\n 'side-by-side': 'fa fa-columns',\n 'fullscreen': 'fa fa-arrows-alt',\n 'guide': 'fa fa-question-circle',\n 'undo': 'fa fa-undo',\n 'redo': 'fa fa-repeat fa-redo',\n};\n\nvar toolbarBuiltInButtons = {\n 'bold': {\n name: 'bold',\n action: toggleBold,\n className: iconClassMap['bold'],\n title: 'Bold',\n default: true,\n },\n 'italic': {\n name: 'italic',\n action: toggleItalic,\n className: iconClassMap['italic'],\n title: 'Italic',\n default: true,\n },\n 'strikethrough': {\n name: 'strikethrough',\n action: toggleStrikethrough,\n className: iconClassMap['strikethrough'],\n title: 'Strikethrough',\n },\n 'heading': {\n name: 'heading',\n action: toggleHeadingSmaller,\n className: iconClassMap['heading'],\n title: 'Heading',\n default: true,\n },\n 'heading-smaller': {\n name: 'heading-smaller',\n action: toggleHeadingSmaller,\n className: iconClassMap['heading-smaller'],\n title: 'Smaller Heading',\n },\n 'heading-bigger': {\n name: 'heading-bigger',\n action: toggleHeadingBigger,\n className: iconClassMap['heading-bigger'],\n title: 'Bigger Heading',\n },\n 'heading-1': {\n name: 'heading-1',\n action: toggleHeading1,\n className: iconClassMap['heading-1'],\n title: 'Big Heading',\n },\n 'heading-2': {\n name: 'heading-2',\n action: toggleHeading2,\n className: iconClassMap['heading-2'],\n title: 'Medium Heading',\n },\n 'heading-3': {\n name: 'heading-3',\n action: toggleHeading3,\n className: iconClassMap['heading-3'],\n title: 'Small Heading',\n },\n 'separator-1': {\n name: 'separator-1',\n },\n 'code': {\n name: 'code',\n action: toggleCodeBlock,\n className: iconClassMap['code'],\n title: 'Code',\n },\n 'quote': {\n name: 'quote',\n action: toggleBlockquote,\n className: iconClassMap['quote'],\n title: 'Quote',\n default: true,\n },\n 'unordered-list': {\n name: 'unordered-list',\n action: toggleUnorderedList,\n className: iconClassMap['unordered-list'],\n title: 'Generic List',\n default: true,\n },\n 'ordered-list': {\n name: 'ordered-list',\n action: toggleOrderedList,\n className: iconClassMap['ordered-list'],\n title: 'Numbered List',\n default: true,\n },\n 'clean-block': {\n name: 'clean-block',\n action: cleanBlock,\n className: iconClassMap['clean-block'],\n title: 'Clean block',\n },\n 'separator-2': {\n name: 'separator-2',\n },\n 'link': {\n name: 'link',\n action: drawLink,\n className: iconClassMap['link'],\n title: 'Create Link',\n default: true,\n },\n 'image': {\n name: 'image',\n action: drawImage,\n className: iconClassMap['image'],\n title: 'Insert Image',\n default: true,\n },\n 'upload-image': {\n name: 'upload-image',\n action: drawUploadedImage,\n className: iconClassMap['upload-image'],\n title: 'Import an image',\n },\n 'table': {\n name: 'table',\n action: drawTable,\n className: iconClassMap['table'],\n title: 'Insert Table',\n },\n 'horizontal-rule': {\n name: 'horizontal-rule',\n action: drawHorizontalRule,\n className: iconClassMap['horizontal-rule'],\n title: 'Insert Horizontal Line',\n },\n 'separator-3': {\n name: 'separator-3',\n },\n 'preview': {\n name: 'preview',\n action: togglePreview,\n className: iconClassMap['preview'],\n noDisable: true,\n title: 'Toggle Preview',\n default: true,\n },\n 'side-by-side': {\n name: 'side-by-side',\n action: toggleSideBySide,\n className: iconClassMap['side-by-side'],\n noDisable: true,\n noMobile: true,\n title: 'Toggle Side by Side',\n default: true,\n },\n 'fullscreen': {\n name: 'fullscreen',\n action: toggleFullScreen,\n className: iconClassMap['fullscreen'],\n noDisable: true,\n noMobile: true,\n title: 'Toggle Fullscreen',\n default: true,\n },\n 'separator-4': {\n name: 'separator-4',\n },\n 'guide': {\n name: 'guide',\n action: 'https://www.markdownguide.org/basic-syntax/',\n className: iconClassMap['guide'],\n noDisable: true,\n title: 'Markdown Guide',\n default: true,\n },\n 'separator-5': {\n name: 'separator-5',\n },\n 'undo': {\n name: 'undo',\n action: undo,\n className: iconClassMap['undo'],\n noDisable: true,\n title: 'Undo',\n },\n 'redo': {\n name: 'redo',\n action: redo,\n className: iconClassMap['redo'],\n noDisable: true,\n title: 'Redo',\n },\n};\n\nvar insertTexts = {\n link: ['[', '](#url#)'],\n image: ['![', '](#url#)'],\n uploadedImage: ['![](#url#)', ''],\n // uploadedImage: ['![](#url#)\\n', ''], // TODO: New line insertion doesn't work here.\n table: ['', '\\n\\n| Column 1 | Column 2 | Column 3 |\\n| -------- | -------- | -------- |\\n| Text | Text | Text |\\n\\n'],\n horizontalRule: ['', '\\n\\n-----\\n\\n'],\n};\n\nvar promptTexts = {\n link: 'URL for the link:',\n image: 'URL of the image:',\n};\n\nvar timeFormat = {\n locale: 'en-US',\n format: {\n hour: '2-digit',\n minute: '2-digit',\n },\n};\n\nvar blockStyles = {\n 'bold': '**',\n 'code': '```',\n 'italic': '*',\n};\n\n/**\n * Texts displayed to the user (mainly on the status bar) for the import image\n * feature. Can be used for customization or internationalization.\n */\nvar imageTexts = {\n sbInit: 'Attach files by drag and dropping or pasting from clipboard.',\n sbOnDragEnter: 'Drop image to upload it.',\n sbOnDrop: 'Uploading image #images_names#...',\n sbProgress: 'Uploading #file_name#: #progress#%',\n sbOnUploaded: 'Uploaded #image_name#',\n sizeUnits: ' B, KB, MB',\n};\n\n/**\n * Errors displayed to the user, using the `errorCallback` option. Can be used for\n * customization or internationalization.\n */\nvar errorMessages = {\n noFileGiven: 'You must select a file.',\n typeNotAllowed: 'This image type is not allowed.',\n fileTooLarge: 'Image #image_name# is too big (#image_size#).\\n' +\n 'Maximum file size is #image_max_size#.',\n importError: 'Something went wrong when uploading the image #image_name#.',\n};\n\n/**\n * Interface of EasyMDE.\n */\nfunction EasyMDE(options) {\n // Handle options parameter\n options = options || {};\n\n // Used later to refer to it\"s parent\n options.parent = this;\n\n // Check if Font Awesome needs to be auto downloaded\n var autoDownloadFA = true;\n\n if (options.autoDownloadFontAwesome === false) {\n autoDownloadFA = false;\n }\n\n if (options.autoDownloadFontAwesome !== true) {\n var styleSheets = document.styleSheets;\n for (var i = 0; i < styleSheets.length; i++) {\n if (!styleSheets[i].href)\n continue;\n\n if (styleSheets[i].href.indexOf('//maxcdn.bootstrapcdn.com/font-awesome/') > -1) {\n autoDownloadFA = false;\n }\n }\n }\n\n if (autoDownloadFA) {\n var link = document.createElement('link');\n link.rel = 'stylesheet';\n link.href = 'https://maxcdn.bootstrapcdn.com/font-awesome/latest/css/font-awesome.min.css';\n document.getElementsByTagName('head')[0].appendChild(link);\n }\n\n\n // Find the textarea to use\n if (options.element) {\n this.element = options.element;\n } else if (options.element === null) {\n // This means that the element option was specified, but no element was found\n console.log('EasyMDE: Error. No element was found.');\n return;\n }\n\n\n // Handle toolbar\n if (options.toolbar === undefined) {\n // Initialize\n options.toolbar = [];\n\n\n // Loop over the built in buttons, to get the preferred order\n for (var key in toolbarBuiltInButtons) {\n if (Object.prototype.hasOwnProperty.call(toolbarBuiltInButtons, key)) {\n if (key.indexOf('separator-') != -1) {\n options.toolbar.push('|');\n }\n\n if (toolbarBuiltInButtons[key].default === true || (options.showIcons && options.showIcons.constructor === Array && options.showIcons.indexOf(key) != -1)) {\n options.toolbar.push(key);\n }\n }\n }\n }\n\n // Editor preview styling class.\n if (!Object.prototype.hasOwnProperty.call(options, 'previewClass')) {\n options.previewClass = 'editor-preview';\n }\n\n // Handle status bar\n if (!Object.prototype.hasOwnProperty.call(options, 'status')) {\n options.status = ['autosave', 'lines', 'words', 'cursor'];\n\n if (options.uploadImage) {\n options.status.unshift('upload-image');\n }\n }\n\n\n // Add default preview rendering function\n if (!options.previewRender) {\n options.previewRender = function (plainText) {\n // Note: \"this\" refers to the options object\n return this.parent.markdown(plainText);\n };\n }\n\n\n // Set default options for parsing config\n options.parsingConfig = extend({\n highlightFormatting: true, // needed for toggleCodeBlock to detect types of code\n }, options.parsingConfig || {});\n\n\n // Merging the insertTexts, with the given options\n options.insertTexts = extend({}, insertTexts, options.insertTexts || {});\n\n\n // Merging the promptTexts, with the given options\n options.promptTexts = extend({}, promptTexts, options.promptTexts || {});\n\n\n // Merging the blockStyles, with the given options\n options.blockStyles = extend({}, blockStyles, options.blockStyles || {});\n\n\n if (options.autosave != undefined) {\n // Merging the Autosave timeFormat, with the given options\n options.autosave.timeFormat = extend({}, timeFormat, options.autosave.timeFormat || {});\n }\n\n options.iconClassMap = extend({}, iconClassMap, options.iconClassMap || {});\n\n // Merging the shortcuts, with the given options\n options.shortcuts = extend({}, shortcuts, options.shortcuts || {});\n\n options.maxHeight = options.maxHeight || undefined;\n\n options.direction = options.direction || 'ltr';\n\n if (typeof options.maxHeight !== 'undefined') {\n // Min and max height are equal if maxHeight is set\n options.minHeight = options.maxHeight;\n } else {\n options.minHeight = options.minHeight || '300px';\n }\n\n options.errorCallback = options.errorCallback || function (errorMessage) {\n alert(errorMessage);\n };\n\n // Import-image default configuration\n options.uploadImage = options.uploadImage || false;\n options.imageMaxSize = options.imageMaxSize || 2097152; // 1024 * 1024 * 2\n options.imageAccept = options.imageAccept || 'image/png, image/jpeg, image/gif, image/avif';\n options.imageTexts = extend({}, imageTexts, options.imageTexts || {});\n options.errorMessages = extend({}, errorMessages, options.errorMessages || {});\n options.imagePathAbsolute = options.imagePathAbsolute || false;\n options.imageCSRFName = options.imageCSRFName || 'csrfmiddlewaretoken';\n options.imageCSRFHeader = options.imageCSRFHeader || false;\n\n\n // Change unique_id to uniqueId for backwards compatibility\n if (options.autosave != undefined && options.autosave.unique_id != undefined && options.autosave.unique_id != '')\n options.autosave.uniqueId = options.autosave.unique_id;\n\n // If overlay mode is specified and combine is not provided, default it to true\n if (options.overlayMode && options.overlayMode.combine === undefined) {\n options.overlayMode.combine = true;\n }\n\n // Update this options\n this.options = options;\n\n\n // Auto render\n this.render();\n\n\n // The codemirror component is only available after rendering\n // so, the setter for the initialValue can only run after\n // the element has been rendered\n if (options.initialValue && (!this.options.autosave || this.options.autosave.foundSavedValue !== true)) {\n this.value(options.initialValue);\n }\n\n if (options.uploadImage) {\n var self = this;\n\n this.codemirror.on('dragenter', function (cm, event) {\n self.updateStatusBar('upload-image', self.options.imageTexts.sbOnDragEnter);\n event.stopPropagation();\n event.preventDefault();\n });\n this.codemirror.on('dragend', function (cm, event) {\n self.updateStatusBar('upload-image', self.options.imageTexts.sbInit);\n event.stopPropagation();\n event.preventDefault();\n });\n this.codemirror.on('dragleave', function (cm, event) {\n self.updateStatusBar('upload-image', self.options.imageTexts.sbInit);\n event.stopPropagation();\n event.preventDefault();\n });\n\n this.codemirror.on('dragover', function (cm, event) {\n self.updateStatusBar('upload-image', self.options.imageTexts.sbOnDragEnter);\n event.stopPropagation();\n event.preventDefault();\n });\n\n this.codemirror.on('drop', function (cm, event) {\n event.stopPropagation();\n event.preventDefault();\n if (options.imageUploadFunction) {\n self.uploadImagesUsingCustomFunction(options.imageUploadFunction, event.dataTransfer.files);\n } else {\n self.uploadImages(event.dataTransfer.files);\n }\n });\n\n this.codemirror.on('paste', function (cm, event) {\n if (options.imageUploadFunction) {\n self.uploadImagesUsingCustomFunction(options.imageUploadFunction, event.clipboardData.files);\n } else {\n self.uploadImages(event.clipboardData.files);\n }\n });\n }\n}\n\n/**\n * Upload asynchronously a list of images to a server.\n *\n * Can be triggered by:\n * - drag&drop;\n * - copy-paste;\n * - the browse-file window (opened when the user clicks on the *upload-image* icon).\n * @param {FileList} files The files to upload the the server.\n * @param [onSuccess] {function} see EasyMDE.prototype.uploadImage\n * @param [onError] {function} see EasyMDE.prototype.uploadImage\n */\nEasyMDE.prototype.uploadImages = function (files, onSuccess, onError) {\n if (files.length === 0) {\n return;\n }\n var names = [];\n for (var i = 0; i < files.length; i++) {\n names.push(files[i].name);\n this.uploadImage(files[i], onSuccess, onError);\n }\n this.updateStatusBar('upload-image', this.options.imageTexts.sbOnDrop.replace('#images_names#', names.join(', ')));\n};\n\n/**\n * Upload asynchronously a list of images to a server.\n *\n * Can be triggered by:\n * - drag&drop;\n * - copy-paste;\n * - the browse-file window (opened when the user clicks on the *upload-image* icon).\n * @param imageUploadFunction {Function} The custom function to upload the image passed in options.\n * @param {FileList} files The files to upload the the server.\n */\nEasyMDE.prototype.uploadImagesUsingCustomFunction = function (imageUploadFunction, files) {\n if (files.length === 0) {\n return;\n }\n var names = [];\n for (var i = 0; i < files.length; i++) {\n names.push(files[i].name);\n this.uploadImageUsingCustomFunction(imageUploadFunction, files[i]);\n }\n this.updateStatusBar('upload-image', this.options.imageTexts.sbOnDrop.replace('#images_names#', names.join(', ')));\n};\n\n/**\n * Update an item in the status bar.\n * @param itemName {string} The name of the item to update (ie. 'upload-image', 'autosave', etc.).\n * @param content {string} the new content of the item to write in the status bar.\n */\nEasyMDE.prototype.updateStatusBar = function (itemName, content) {\n if (!this.gui.statusbar) {\n return;\n }\n\n var matchingClasses = this.gui.statusbar.getElementsByClassName(itemName);\n if (matchingClasses.length === 1) {\n this.gui.statusbar.getElementsByClassName(itemName)[0].textContent = content;\n } else if (matchingClasses.length === 0) {\n console.log('EasyMDE: status bar item ' + itemName + ' was not found.');\n } else {\n console.log('EasyMDE: Several status bar items named ' + itemName + ' was found.');\n }\n};\n\n/**\n * Default markdown render.\n */\nEasyMDE.prototype.markdown = function (text) {\n if (marked) {\n // Initialize\n var markedOptions;\n if (this.options && this.options.renderingConfig && this.options.renderingConfig.markedOptions) {\n markedOptions = this.options.renderingConfig.markedOptions;\n } else {\n markedOptions = {};\n }\n\n // Update options\n if (this.options && this.options.renderingConfig && this.options.renderingConfig.singleLineBreaks === false) {\n markedOptions.breaks = false;\n } else {\n markedOptions.breaks = true;\n }\n\n if (this.options && this.options.renderingConfig && this.options.renderingConfig.codeSyntaxHighlighting === true) {\n\n /* Get HLJS from config or window */\n var hljs = this.options.renderingConfig.hljs || window.hljs;\n\n /* Check if HLJS loaded */\n if (hljs) {\n markedOptions.highlight = function (code, language) {\n if (language && hljs.getLanguage(language)) {\n return hljs.highlight(language, code).value;\n } else {\n return hljs.highlightAuto(code).value;\n }\n };\n }\n }\n\n // Set options\n marked.setOptions(markedOptions);\n\n // Convert the markdown to HTML\n var htmlText = marked.parse(text);\n\n // Sanitize HTML\n if (this.options.renderingConfig && typeof this.options.renderingConfig.sanitizerFunction === 'function') {\n htmlText = this.options.renderingConfig.sanitizerFunction.call(this, htmlText);\n }\n\n // Edit the HTML anchors to add 'target=\"_blank\"' by default.\n htmlText = addAnchorTargetBlank(htmlText);\n\n // Remove list-style when rendering checkboxes\n htmlText = removeListStyleWhenCheckbox(htmlText);\n\n return htmlText;\n }\n};\n\n/**\n * Render editor to the given element.\n */\nEasyMDE.prototype.render = function (el) {\n if (!el) {\n el = this.element || document.getElementsByTagName('textarea')[0];\n }\n\n if (this._rendered && this._rendered === el) {\n // Already rendered.\n return;\n }\n\n this.element = el;\n var options = this.options;\n\n var self = this;\n var keyMaps = {};\n\n for (var key in options.shortcuts) {\n // null stands for \"do not bind this command\"\n if (options.shortcuts[key] !== null && bindings[key] !== null) {\n (function (key) {\n keyMaps[fixShortcut(options.shortcuts[key])] = function () {\n var action = bindings[key];\n if (typeof action === 'function') {\n action(self);\n } else if (typeof action === 'string') {\n window.open(action, '_blank');\n }\n };\n })(key);\n }\n }\n\n keyMaps['Enter'] = 'newlineAndIndentContinueMarkdownList';\n keyMaps['Tab'] = 'tabAndIndentMarkdownList';\n keyMaps['Shift-Tab'] = 'shiftTabAndUnindentMarkdownList';\n keyMaps['Esc'] = function (cm) {\n if (cm.getOption('fullScreen')) toggleFullScreen(self);\n };\n\n this.documentOnKeyDown = function (e) {\n e = e || window.event;\n\n if (e.keyCode == 27) {\n if (self.codemirror.getOption('fullScreen')) toggleFullScreen(self);\n }\n };\n document.addEventListener('keydown', this.documentOnKeyDown, false);\n\n var mode, backdrop;\n\n // CodeMirror overlay mode\n if (options.overlayMode) {\n CodeMirror.defineMode('overlay-mode', function (config) {\n return CodeMirror.overlayMode(CodeMirror.getMode(config, options.spellChecker !== false ? 'spell-checker' : 'gfm'), options.overlayMode.mode, options.overlayMode.combine);\n });\n\n mode = 'overlay-mode';\n backdrop = options.parsingConfig;\n backdrop.gitHubSpice = false;\n } else {\n mode = options.parsingConfig;\n mode.name = 'gfm';\n mode.gitHubSpice = false;\n }\n if (options.spellChecker !== false) {\n mode = 'spell-checker';\n backdrop = options.parsingConfig;\n backdrop.name = 'gfm';\n backdrop.gitHubSpice = false;\n\n if (typeof options.spellChecker === 'function') {\n options.spellChecker({\n codeMirrorInstance: CodeMirror,\n });\n } else {\n CodeMirrorSpellChecker({\n codeMirrorInstance: CodeMirror,\n });\n }\n }\n\n // eslint-disable-next-line no-unused-vars\n function configureMouse(cm, repeat, event) {\n return {\n addNew: false,\n };\n }\n\n this.codemirror = CodeMirror.fromTextArea(el, {\n mode: mode,\n backdrop: backdrop,\n theme: (options.theme != undefined) ? options.theme : 'easymde',\n tabSize: (options.tabSize != undefined) ? options.tabSize : 2,\n indentUnit: (options.tabSize != undefined) ? options.tabSize : 2,\n indentWithTabs: (options.indentWithTabs === false) ? false : true,\n lineNumbers: (options.lineNumbers === true) ? true : false,\n autofocus: (options.autofocus === true) ? true : false,\n extraKeys: keyMaps,\n direction: options.direction,\n lineWrapping: (options.lineWrapping === false) ? false : true,\n allowDropFileTypes: ['text/plain'],\n placeholder: options.placeholder || el.getAttribute('placeholder') || '',\n styleSelectedText: (options.styleSelectedText != undefined) ? options.styleSelectedText : !isMobile(),\n scrollbarStyle: (options.scrollbarStyle != undefined) ? options.scrollbarStyle : 'native',\n configureMouse: configureMouse,\n inputStyle: (options.inputStyle != undefined) ? options.inputStyle : isMobile() ? 'contenteditable' : 'textarea',\n spellcheck: (options.nativeSpellcheck != undefined) ? options.nativeSpellcheck : true,\n autoRefresh: (options.autoRefresh != undefined) ? options.autoRefresh : false,\n });\n\n this.codemirror.getScrollerElement().style.minHeight = options.minHeight;\n\n if (typeof options.maxHeight !== 'undefined') {\n this.codemirror.getScrollerElement().style.height = options.maxHeight;\n }\n\n if (options.forceSync === true) {\n var cm = this.codemirror;\n cm.on('change', function () {\n cm.save();\n });\n }\n\n this.gui = {};\n\n // Wrap Codemirror with container before create toolbar, etc,\n // to use with sideBySideFullscreen option.\n var easyMDEContainer = document.createElement('div');\n easyMDEContainer.classList.add('EasyMDEContainer');\n easyMDEContainer.setAttribute('role', 'application');\n var cmWrapper = this.codemirror.getWrapperElement();\n cmWrapper.parentNode.insertBefore(easyMDEContainer, cmWrapper);\n easyMDEContainer.appendChild(cmWrapper);\n\n if (options.toolbar !== false) {\n this.gui.toolbar = this.createToolbar();\n }\n if (options.status !== false) {\n this.gui.statusbar = this.createStatusbar();\n }\n if (options.autosave != undefined && options.autosave.enabled === true) {\n this.autosave(); // use to load localstorage content\n this.codemirror.on('change', function () {\n clearTimeout(self._autosave_timeout);\n self._autosave_timeout = setTimeout(function () {\n self.autosave();\n }, self.options.autosave.submit_delay || self.options.autosave.delay || 1000);\n });\n }\n\n function calcHeight(naturalWidth, naturalHeight) {\n var height;\n var viewportWidth = window.getComputedStyle(document.querySelector('.CodeMirror-sizer')).width.replace('px', '');\n if (naturalWidth < viewportWidth) {\n height = naturalHeight + 'px';\n } else {\n height = (naturalHeight / naturalWidth * 100) + '%';\n }\n return height;\n }\n\n var _vm = this;\n\n\n function assignImageBlockAttributes(parentEl, img) {\n parentEl.setAttribute('data-img-src', img.url);\n parentEl.setAttribute('style', '--bg-image:url(' + img.url + ');--width:' + img.naturalWidth + 'px;--height:' + calcHeight(img.naturalWidth, img.naturalHeight));\n _vm.codemirror.setSize();\n }\n\n function handleImages() {\n if (!options.previewImagesInEditor) {\n return;\n }\n\n easyMDEContainer.querySelectorAll('.cm-image-marker').forEach(function (e) {\n var parentEl = e.parentElement;\n if (!parentEl.innerText.match(/^!\\[.*?\\]\\(.*\\)/g)) {\n // if img pasted on the same line with other text, don't preview, preview only images on separate line\n return;\n }\n if (!parentEl.hasAttribute('data-img-src')) {\n var srcAttr = parentEl.innerText.match('\\\\((.*)\\\\)'); // might require better parsing according to markdown spec\n if (!window.EMDEimagesCache) {\n window.EMDEimagesCache = {};\n }\n\n if (srcAttr && srcAttr.length >= 2) {\n var keySrc = srcAttr[1];\n\n if (options.imagesPreviewHandler) {\n var newSrc = options.imagesPreviewHandler(srcAttr[1]);\n // defensive check making sure the handler provided by the user returns a string\n if (typeof newSrc === 'string') {\n keySrc = newSrc;\n }\n }\n\n if (!window.EMDEimagesCache[keySrc]) {\n var img = document.createElement('img');\n img.onload = function () {\n window.EMDEimagesCache[keySrc] = {\n naturalWidth: img.naturalWidth,\n naturalHeight: img.naturalHeight,\n url: keySrc,\n };\n assignImageBlockAttributes(parentEl, window.EMDEimagesCache[keySrc]);\n };\n img.src = keySrc;\n } else {\n assignImageBlockAttributes(parentEl, window.EMDEimagesCache[keySrc]);\n }\n }\n }\n });\n }\n\n this.codemirror.on('update', function () {\n handleImages();\n });\n\n this.gui.sideBySide = this.createSideBySide();\n this._rendered = this.element;\n\n if (options.autofocus === true || el.autofocus) {\n this.codemirror.focus();\n }\n\n // Fixes CodeMirror bug (#344)\n var temp_cm = this.codemirror;\n setTimeout(function () {\n temp_cm.refresh();\n }.bind(temp_cm), 0);\n};\n\nEasyMDE.prototype.cleanup = function () {\n document.removeEventListener('keydown', this.documentOnKeyDown);\n};\n\n// Safari, in Private Browsing Mode, looks like it supports localStorage but all calls to setItem throw QuotaExceededError. We're going to detect this and set a variable accordingly.\nfunction isLocalStorageAvailable() {\n if (typeof localStorage === 'object') {\n try {\n localStorage.setItem('smde_localStorage', 1);\n localStorage.removeItem('smde_localStorage');\n } catch (e) {\n return false;\n }\n } else {\n return false;\n }\n\n return true;\n}\n\nEasyMDE.prototype.autosave = function () {\n if (isLocalStorageAvailable()) {\n var easyMDE = this;\n\n if (this.options.autosave.uniqueId == undefined || this.options.autosave.uniqueId == '') {\n console.log('EasyMDE: You must set a uniqueId to use the autosave feature');\n return;\n }\n\n if (this.options.autosave.binded !== true) {\n if (easyMDE.element.form != null && easyMDE.element.form != undefined) {\n easyMDE.element.form.addEventListener('submit', function () {\n clearTimeout(easyMDE.autosaveTimeoutId);\n easyMDE.autosaveTimeoutId = undefined;\n\n localStorage.removeItem('smde_' + easyMDE.options.autosave.uniqueId);\n });\n }\n\n this.options.autosave.binded = true;\n }\n\n if (this.options.autosave.loaded !== true) {\n if (typeof localStorage.getItem('smde_' + this.options.autosave.uniqueId) == 'string' && localStorage.getItem('smde_' + this.options.autosave.uniqueId) != '') {\n this.codemirror.setValue(localStorage.getItem('smde_' + this.options.autosave.uniqueId));\n this.options.autosave.foundSavedValue = true;\n }\n\n this.options.autosave.loaded = true;\n }\n\n var value = easyMDE.value();\n if (value !== '') {\n localStorage.setItem('smde_' + this.options.autosave.uniqueId, value);\n } else {\n localStorage.removeItem('smde_' + this.options.autosave.uniqueId);\n }\n\n var el = document.getElementById('autosaved');\n if (el != null && el != undefined && el != '') {\n var d = new Date();\n var dd = new Intl.DateTimeFormat([this.options.autosave.timeFormat.locale, 'en-US'], this.options.autosave.timeFormat.format).format(d);\n var save = this.options.autosave.text == undefined ? 'Autosaved: ' : this.options.autosave.text;\n\n el.innerHTML = save + dd;\n }\n } else {\n console.log('EasyMDE: localStorage not available, cannot autosave');\n }\n};\n\nEasyMDE.prototype.clearAutosavedValue = function () {\n if (isLocalStorageAvailable()) {\n if (this.options.autosave == undefined || this.options.autosave.uniqueId == undefined || this.options.autosave.uniqueId == '') {\n console.log('EasyMDE: You must set a uniqueId to clear the autosave value');\n return;\n }\n\n localStorage.removeItem('smde_' + this.options.autosave.uniqueId);\n } else {\n console.log('EasyMDE: localStorage not available, cannot autosave');\n }\n};\n\n/**\n * Open the browse-file window to upload an image to a server.\n * @param [onSuccess] {function} see EasyMDE.prototype.uploadImage\n * @param [onError] {function} see EasyMDE.prototype.uploadImage\n */\nEasyMDE.prototype.openBrowseFileWindow = function (onSuccess, onError) {\n var self = this;\n var imageInput = this.gui.toolbar.getElementsByClassName('imageInput')[0];\n imageInput.click(); //dispatchEvent(new MouseEvent('click')); // replaced with click() for IE11 compatibility.\n function onChange(event) {\n if (self.options.imageUploadFunction) {\n self.uploadImagesUsingCustomFunction(self.options.imageUploadFunction, event.target.files);\n } else {\n self.uploadImages(event.target.files, onSuccess, onError);\n }\n imageInput.removeEventListener('change', onChange);\n }\n\n imageInput.addEventListener('change', onChange);\n};\n\n/**\n * Upload an image to the server.\n *\n * @param file {File} The image to upload, as a HTML5 File object (https://developer.mozilla.org/en-US/docs/Web/API/File)\n * @param [onSuccess] {function} A callback function to execute after the image has been successfully uploaded, with one parameter:\n * - url (string): The URL of the uploaded image.\n * @param [onError] {function} A callback function to execute when the image upload fails, with one parameter:\n * - error (string): the detailed error to display to the user (based on messages from options.errorMessages).\n */\nEasyMDE.prototype.uploadImage = function (file, onSuccess, onError) {\n var self = this;\n onSuccess = onSuccess || function onSuccess(imageUrl) {\n afterImageUploaded(self, imageUrl);\n };\n\n function onErrorSup(errorMessage) {\n // show error on status bar and reset after 10000ms\n self.updateStatusBar('upload-image', errorMessage);\n\n setTimeout(function () {\n self.updateStatusBar('upload-image', self.options.imageTexts.sbInit);\n }, 10000);\n\n // run custom error handler\n if (onError && typeof onError === 'function') {\n onError(errorMessage);\n }\n // run error handler from options, this alerts the message.\n self.options.errorCallback(errorMessage);\n }\n\n function fillErrorMessage(errorMessage) {\n var units = self.options.imageTexts.sizeUnits.split(',');\n return errorMessage\n .replace('#image_name#', file.name)\n .replace('#image_size#', humanFileSize(file.size, units))\n .replace('#image_max_size#', humanFileSize(self.options.imageMaxSize, units));\n }\n\n if (file.size > this.options.imageMaxSize) {\n onErrorSup(fillErrorMessage(this.options.errorMessages.fileTooLarge));\n return;\n }\n\n var formData = new FormData();\n formData.append('image', file);\n\n // insert CSRF body token if provided in config.\n if (self.options.imageCSRFToken && !self.options.imageCSRFHeader) {\n formData.append(self.options.imageCSRFName, self.options.imageCSRFToken);\n }\n\n var request = new XMLHttpRequest();\n request.upload.onprogress = function (event) {\n if (event.lengthComputable) {\n var progress = '' + Math.round((event.loaded * 100) / event.total);\n self.updateStatusBar('upload-image', self.options.imageTexts.sbProgress.replace('#file_name#', file.name).replace('#progress#', progress));\n }\n };\n request.open('POST', this.options.imageUploadEndpoint);\n\n // insert CSRF header token if provided in config.\n if (self.options.imageCSRFToken && self.options.imageCSRFHeader) {\n request.setRequestHeader(self.options.imageCSRFName, self.options.imageCSRFToken);\n }\n\n request.onload = function () {\n try {\n var response = JSON.parse(this.responseText);\n } catch (error) {\n console.error('EasyMDE: The server did not return a valid json.');\n onErrorSup(fillErrorMessage(self.options.errorMessages.importError));\n return;\n }\n if (this.status === 200 && response && !response.error && response.data && response.data.filePath) {\n onSuccess((self.options.imagePathAbsolute ? '' : (window.location.origin + '/')) + response.data.filePath);\n } else {\n if (response.error && response.error in self.options.errorMessages) { // preformatted error message\n onErrorSup(fillErrorMessage(self.options.errorMessages[response.error]));\n } else if (response.error) { // server side generated error message\n onErrorSup(fillErrorMessage(response.error));\n } else { //unknown error\n console.error('EasyMDE: Received an unexpected response after uploading the image.'\n + this.status + ' (' + this.statusText + ')');\n onErrorSup(fillErrorMessage(self.options.errorMessages.importError));\n }\n }\n };\n\n request.onerror = function (event) {\n console.error('EasyMDE: An unexpected error occurred when trying to upload the image.'\n + event.target.status + ' (' + event.target.statusText + ')');\n onErrorSup(self.options.errorMessages.importError);\n };\n\n request.send(formData);\n\n};\n\n/**\n * Upload an image to the server using a custom upload function.\n *\n * @param imageUploadFunction {Function} The custom function to upload the image passed in options\n * @param file {File} The image to upload, as a HTML5 File object (https://developer.mozilla.org/en-US/docs/Web/API/File).\n */\nEasyMDE.prototype.uploadImageUsingCustomFunction = function (imageUploadFunction, file) {\n var self = this;\n\n function onSuccess(imageUrl) {\n afterImageUploaded(self, imageUrl);\n }\n\n function onError(errorMessage) {\n var filledErrorMessage = fillErrorMessage(errorMessage);\n // show error on status bar and reset after 10000ms\n self.updateStatusBar('upload-image', filledErrorMessage);\n\n setTimeout(function () {\n self.updateStatusBar('upload-image', self.options.imageTexts.sbInit);\n }, 10000);\n\n // run error handler from options, this alerts the message.\n self.options.errorCallback(filledErrorMessage);\n }\n\n function fillErrorMessage(errorMessage) {\n var units = self.options.imageTexts.sizeUnits.split(',');\n return errorMessage\n .replace('#image_name#', file.name)\n .replace('#image_size#', humanFileSize(file.size, units))\n .replace('#image_max_size#', humanFileSize(self.options.imageMaxSize, units));\n }\n\n imageUploadFunction.apply(this, [file, onSuccess, onError]);\n};\n\nEasyMDE.prototype.setPreviewMaxHeight = function () {\n var cm = this.codemirror;\n var wrapper = cm.getWrapperElement();\n var preview = wrapper.nextSibling;\n\n // Calc preview max height\n var paddingTop = parseInt(window.getComputedStyle(wrapper).paddingTop);\n var borderTopWidth = parseInt(window.getComputedStyle(wrapper).borderTopWidth);\n var optionsMaxHeight = parseInt(this.options.maxHeight);\n var wrapperMaxHeight = optionsMaxHeight + paddingTop * 2 + borderTopWidth * 2;\n var previewMaxHeight = wrapperMaxHeight.toString() + 'px';\n\n preview.style.height = previewMaxHeight;\n};\n\nEasyMDE.prototype.createSideBySide = function () {\n var cm = this.codemirror;\n var wrapper = cm.getWrapperElement();\n var preview = wrapper.nextSibling;\n\n if (!preview || !preview.classList.contains('editor-preview-side')) {\n preview = document.createElement('div');\n preview.className = 'editor-preview-side';\n\n if (this.options.previewClass) {\n\n if (Array.isArray(this.options.previewClass)) {\n for (var i = 0; i < this.options.previewClass.length; i++) {\n preview.classList.add(this.options.previewClass[i]);\n }\n\n } else if (typeof this.options.previewClass === 'string') {\n preview.classList.add(this.options.previewClass);\n }\n }\n\n wrapper.parentNode.insertBefore(preview, wrapper.nextSibling);\n }\n\n if (typeof this.options.maxHeight !== 'undefined') {\n this.setPreviewMaxHeight();\n }\n\n if (this.options.syncSideBySidePreviewScroll === false) return preview;\n // Syncs scroll editor -> preview\n var cScroll = false;\n var pScroll = false;\n cm.on('scroll', function (v) {\n if (cScroll) {\n cScroll = false;\n return;\n }\n pScroll = true;\n var height = v.getScrollInfo().height - v.getScrollInfo().clientHeight;\n var ratio = parseFloat(v.getScrollInfo().top) / height;\n var move = (preview.scrollHeight - preview.clientHeight) * ratio;\n preview.scrollTop = move;\n });\n\n // Syncs scroll preview -> editor\n preview.onscroll = function () {\n if (pScroll) {\n pScroll = false;\n return;\n }\n cScroll = true;\n var height = preview.scrollHeight - preview.clientHeight;\n var ratio = parseFloat(preview.scrollTop) / height;\n var move = (cm.getScrollInfo().height - cm.getScrollInfo().clientHeight) * ratio;\n cm.scrollTo(0, move);\n };\n return preview;\n};\n\nEasyMDE.prototype.createToolbar = function (items) {\n items = items || this.options.toolbar;\n\n if (!items || items.length === 0) {\n return;\n }\n var i;\n for (i = 0; i < items.length; i++) {\n if (toolbarBuiltInButtons[items[i]] != undefined) {\n items[i] = toolbarBuiltInButtons[items[i]];\n }\n }\n\n var bar = document.createElement('div');\n bar.className = 'editor-toolbar';\n bar.setAttribute('role', 'toolbar');\n\n var self = this;\n\n var toolbarData = {};\n self.toolbar = items;\n\n for (i = 0; i < items.length; i++) {\n if (items[i].name == 'guide' && self.options.toolbarGuideIcon === false)\n continue;\n\n if (self.options.hideIcons && self.options.hideIcons.indexOf(items[i].name) != -1)\n continue;\n\n // Fullscreen does not work well on mobile devices (even tablets)\n // In the future, hopefully this can be resolved\n if ((items[i].name == 'fullscreen' || items[i].name == 'side-by-side') && isMobile())\n continue;\n\n\n // Don't include trailing separators\n if (items[i] === '|') {\n var nonSeparatorIconsFollow = false;\n\n for (var x = (i + 1); x < items.length; x++) {\n if (items[x] !== '|' && (!self.options.hideIcons || self.options.hideIcons.indexOf(items[x].name) == -1)) {\n nonSeparatorIconsFollow = true;\n }\n }\n\n if (!nonSeparatorIconsFollow)\n continue;\n }\n\n\n // Create the icon and append to the toolbar\n (function (item) {\n var el;\n if (item === '|') {\n el = createSep();\n } else if (item.children) {\n el = createToolbarDropdown(item, self.options.toolbarTips, self.options.shortcuts, self);\n } else {\n el = createToolbarButton(item, true, self.options.toolbarTips, self.options.shortcuts, 'button', self);\n }\n\n\n toolbarData[item.name || item] = el;\n bar.appendChild(el);\n\n // Create the input element (ie. ), used among\n // with the 'import-image' icon to open the browse-file window.\n if (item.name === 'upload-image') {\n var imageInput = document.createElement('input');\n imageInput.className = 'imageInput';\n imageInput.type = 'file';\n imageInput.multiple = true;\n imageInput.name = 'image';\n imageInput.accept = self.options.imageAccept;\n imageInput.style.display = 'none';\n imageInput.style.opacity = 0;\n bar.appendChild(imageInput);\n }\n })(items[i]);\n }\n\n self.toolbar_div = bar;\n self.toolbarElements = toolbarData;\n\n var cm = this.codemirror;\n cm.on('cursorActivity', function () {\n var stat = getState(cm);\n\n for (var key in toolbarData) {\n (function (key) {\n var el = toolbarData[key];\n if (stat[key]) {\n el.classList.add('active');\n } else if (key != 'fullscreen' && key != 'side-by-side') {\n el.classList.remove('active');\n }\n })(key);\n }\n });\n\n var cmWrapper = cm.getWrapperElement();\n cmWrapper.parentNode.insertBefore(bar, cmWrapper);\n return bar;\n};\n\nEasyMDE.prototype.createStatusbar = function (status) {\n // Initialize\n status = status || this.options.status;\n var options = this.options;\n var cm = this.codemirror;\n\n // Make sure the status variable is valid\n if (!status || status.length === 0) {\n return;\n }\n\n // Set up the built-in items\n var items = [];\n var i, onUpdate, onActivity, defaultValue;\n\n for (i = 0; i < status.length; i++) {\n // Reset some values\n onUpdate = undefined;\n onActivity = undefined;\n defaultValue = undefined;\n\n\n // Handle if custom or not\n if (typeof status[i] === 'object') {\n items.push({\n className: status[i].className,\n defaultValue: status[i].defaultValue,\n onUpdate: status[i].onUpdate,\n onActivity: status[i].onActivity,\n });\n } else {\n var name = status[i];\n\n if (name === 'words') {\n defaultValue = function (el) {\n el.innerHTML = wordCount(cm.getValue());\n };\n onUpdate = function (el) {\n el.innerHTML = wordCount(cm.getValue());\n };\n } else if (name === 'lines') {\n defaultValue = function (el) {\n el.innerHTML = cm.lineCount();\n };\n onUpdate = function (el) {\n el.innerHTML = cm.lineCount();\n };\n } else if (name === 'cursor') {\n defaultValue = function (el) {\n el.innerHTML = '1:1';\n };\n onActivity = function (el) {\n var pos = cm.getCursor();\n var posLine = pos.line + 1;\n var posColumn = pos.ch + 1;\n el.innerHTML = posLine + ':' + posColumn;\n };\n } else if (name === 'autosave') {\n defaultValue = function (el) {\n if (options.autosave != undefined && options.autosave.enabled === true) {\n el.setAttribute('id', 'autosaved');\n }\n };\n } else if (name === 'upload-image') {\n defaultValue = function (el) {\n el.innerHTML = options.imageTexts.sbInit;\n };\n }\n\n items.push({\n className: name,\n defaultValue: defaultValue,\n onUpdate: onUpdate,\n onActivity: onActivity,\n });\n }\n }\n\n\n // Create element for the status bar\n var bar = document.createElement('div');\n bar.className = 'editor-statusbar';\n\n\n // Create a new span for each item\n for (i = 0; i < items.length; i++) {\n // Store in temporary variable\n var item = items[i];\n\n\n // Create span element\n var el = document.createElement('span');\n el.className = item.className;\n\n\n // Ensure the defaultValue is a function\n if (typeof item.defaultValue === 'function') {\n item.defaultValue(el);\n }\n\n\n // Ensure the onUpdate is a function\n if (typeof item.onUpdate === 'function') {\n // Create a closure around the span of the current action, then execute the onUpdate handler\n this.codemirror.on('update', (function (el, item) {\n return function () {\n item.onUpdate(el);\n };\n }(el, item)));\n }\n if (typeof item.onActivity === 'function') {\n // Create a closure around the span of the current action, then execute the onActivity handler\n this.codemirror.on('cursorActivity', (function (el, item) {\n return function () {\n item.onActivity(el);\n };\n }(el, item)));\n }\n\n\n // Append the item to the status bar\n bar.appendChild(el);\n }\n\n\n // Insert the status bar into the DOM\n var cmWrapper = this.codemirror.getWrapperElement();\n cmWrapper.parentNode.insertBefore(bar, cmWrapper.nextSibling);\n return bar;\n};\n\n/**\n * Get or set the text content.\n */\nEasyMDE.prototype.value = function (val) {\n var cm = this.codemirror;\n if (val === undefined) {\n return cm.getValue();\n } else {\n cm.getDoc().setValue(val);\n if (this.isPreviewActive()) {\n var wrapper = cm.getWrapperElement();\n var preview = wrapper.lastChild;\n var preview_result = this.options.previewRender(val, preview);\n if (preview_result !== null) {\n preview.innerHTML = preview_result;\n }\n\n }\n return this;\n }\n};\n\n\n/**\n * Bind static methods for exports.\n */\nEasyMDE.toggleBold = toggleBold;\nEasyMDE.toggleItalic = toggleItalic;\nEasyMDE.toggleStrikethrough = toggleStrikethrough;\nEasyMDE.toggleBlockquote = toggleBlockquote;\nEasyMDE.toggleHeadingSmaller = toggleHeadingSmaller;\nEasyMDE.toggleHeadingBigger = toggleHeadingBigger;\nEasyMDE.toggleHeading1 = toggleHeading1;\nEasyMDE.toggleHeading2 = toggleHeading2;\nEasyMDE.toggleHeading3 = toggleHeading3;\nEasyMDE.toggleHeading4 = toggleHeading4;\nEasyMDE.toggleHeading5 = toggleHeading5;\nEasyMDE.toggleHeading6 = toggleHeading6;\nEasyMDE.toggleCodeBlock = toggleCodeBlock;\nEasyMDE.toggleUnorderedList = toggleUnorderedList;\nEasyMDE.toggleOrderedList = toggleOrderedList;\nEasyMDE.cleanBlock = cleanBlock;\nEasyMDE.drawLink = drawLink;\nEasyMDE.drawImage = drawImage;\nEasyMDE.drawUploadedImage = drawUploadedImage;\nEasyMDE.drawTable = drawTable;\nEasyMDE.drawHorizontalRule = drawHorizontalRule;\nEasyMDE.undo = undo;\nEasyMDE.redo = redo;\nEasyMDE.togglePreview = togglePreview;\nEasyMDE.toggleSideBySide = toggleSideBySide;\nEasyMDE.toggleFullScreen = toggleFullScreen;\n\n/**\n * Bind instance methods for exports.\n */\nEasyMDE.prototype.toggleBold = function () {\n toggleBold(this);\n};\nEasyMDE.prototype.toggleItalic = function () {\n toggleItalic(this);\n};\nEasyMDE.prototype.toggleStrikethrough = function () {\n toggleStrikethrough(this);\n};\nEasyMDE.prototype.toggleBlockquote = function () {\n toggleBlockquote(this);\n};\nEasyMDE.prototype.toggleHeadingSmaller = function () {\n toggleHeadingSmaller(this);\n};\nEasyMDE.prototype.toggleHeadingBigger = function () {\n toggleHeadingBigger(this);\n};\nEasyMDE.prototype.toggleHeading1 = function () {\n toggleHeading1(this);\n};\nEasyMDE.prototype.toggleHeading2 = function () {\n toggleHeading2(this);\n};\nEasyMDE.prototype.toggleHeading3 = function () {\n toggleHeading3(this);\n};\nEasyMDE.prototype.toggleHeading4 = function () {\n toggleHeading4(this);\n};\nEasyMDE.prototype.toggleHeading5 = function () {\n toggleHeading5(this);\n};\nEasyMDE.prototype.toggleHeading6 = function () {\n toggleHeading6(this);\n};\nEasyMDE.prototype.toggleCodeBlock = function () {\n toggleCodeBlock(this);\n};\nEasyMDE.prototype.toggleUnorderedList = function () {\n toggleUnorderedList(this);\n};\nEasyMDE.prototype.toggleOrderedList = function () {\n toggleOrderedList(this);\n};\nEasyMDE.prototype.cleanBlock = function () {\n cleanBlock(this);\n};\nEasyMDE.prototype.drawLink = function () {\n drawLink(this);\n};\nEasyMDE.prototype.drawImage = function () {\n drawImage(this);\n};\nEasyMDE.prototype.drawUploadedImage = function () {\n drawUploadedImage(this);\n};\nEasyMDE.prototype.drawTable = function () {\n drawTable(this);\n};\nEasyMDE.prototype.drawHorizontalRule = function () {\n drawHorizontalRule(this);\n};\nEasyMDE.prototype.undo = function () {\n undo(this);\n};\nEasyMDE.prototype.redo = function () {\n redo(this);\n};\nEasyMDE.prototype.togglePreview = function () {\n togglePreview(this);\n};\nEasyMDE.prototype.toggleSideBySide = function () {\n toggleSideBySide(this);\n};\nEasyMDE.prototype.toggleFullScreen = function () {\n toggleFullScreen(this);\n};\n\nEasyMDE.prototype.isPreviewActive = function () {\n var cm = this.codemirror;\n var wrapper = cm.getWrapperElement();\n var preview = wrapper.lastChild;\n\n return preview.classList.contains('editor-preview-active');\n};\n\nEasyMDE.prototype.isSideBySideActive = function () {\n var cm = this.codemirror;\n var wrapper = cm.getWrapperElement();\n var preview = wrapper.nextSibling;\n\n return preview.classList.contains('editor-preview-active-side');\n};\n\nEasyMDE.prototype.isFullscreenActive = function () {\n var cm = this.codemirror;\n\n return cm.getOption('fullScreen');\n};\n\nEasyMDE.prototype.getState = function () {\n var cm = this.codemirror;\n\n return getState(cm);\n};\n\nEasyMDE.prototype.toTextArea = function () {\n var cm = this.codemirror;\n var wrapper = cm.getWrapperElement();\n var easyMDEContainer = wrapper.parentNode;\n\n if (easyMDEContainer) {\n if (this.gui.toolbar) {\n easyMDEContainer.removeChild(this.gui.toolbar);\n }\n if (this.gui.statusbar) {\n easyMDEContainer.removeChild(this.gui.statusbar);\n }\n if (this.gui.sideBySide) {\n easyMDEContainer.removeChild(this.gui.sideBySide);\n }\n }\n\n // Unwrap easyMDEcontainer before codemirror toTextArea() call\n easyMDEContainer.parentNode.insertBefore(wrapper, easyMDEContainer);\n easyMDEContainer.remove();\n\n cm.toTextArea();\n\n if (this.autosaveTimeoutId) {\n clearTimeout(this.autosaveTimeoutId);\n this.autosaveTimeoutId = undefined;\n this.clearAutosavedValue();\n }\n};\n\nmodule.exports = EasyMDE;\n"],"names":["global","factory","module","this","userAgent","platform","gecko","ie_upto10","ie_11up","edge","ie","ie_version","webkit","qtwebkit","chrome","chrome_version","presto","safari","mac_geMountainLion","phantom","ios","android","mobile","mac","chromeOS","windows","presto_version","flipCtrlCmd","captureRightClick","classTest","cls","rmClass","node","current","match","after","removeChildren","count","removeChildrenAndAdd","parent","e","elt","tag","content","className","style","i","eltP","range","start","end","endNode","r","contains","child","activeElt","rootNode","doc","activeElement","addClass","joinClasses","a","b","as","selectInput","cm","root","element","win","bind","f","args","copyObj","obj","target","overwrite","prop","countColumn","string","tabSize","startIndex","startValue","n","nextTab","Delayed","self","ms","time","indexOf","array","scrollerGap","Pass","sel_dontScroll","sel_mouse","sel_move","findColumn","goal","pos","col","skipped","spaceStrs","spaceStr","lst","arr","map","out","insertSorted","value","score","priority","nothing","createObj","base","props","inst","nonASCIISingleCaseWordChar","isWordCharBasic","ch","isWordChar","helper","isEmpty","extendingChars","isExtendingChar","skipExtendingChars","str","dir","findFirst","pred","from","to","midF","mid","iterateBidiSections","order","found","part","bidiOther","getBidiPartAt","sticky","cur","bidiOrdering","lowTypes","arabicTypes","charType","code","bidiRE","isNeutral","isStrong","countsAsLeft","countsAsNum","BidiSpan","level","direction","outerType","len","types","i$1","prev","type","i$2","type$1","i$3","prev$1","type$2","i$4","type$3","replace","j","i$5","cur$1","type$4","i$6","end$1","before","replace$1","j$1","m","i$7","at","isRTL","j$2","nstart","getOrder","line","noHandlers","on","emitter","getHandlers","off","index","signal","handlers","signalDOMEvent","override","e_defaultPrevented","signalCursorActivity","set","hasHandler","eventMixin","ctor","e_preventDefault","e_stopPropagation","e_stop","e_target","e_button","dragAndDrop","div","zwspSupported","zeroWidthElement","measure","test","badBidiRects","hasBadBidiRects","txt","r0","r1","splitLinesAuto","result","l","nl","rt","hasSelection","te","hasCopyEvent","badZoomedRects","hasBadZoomedRects","normal","fromRange","modes","mimeModes","defineMode","name","mode","defineMIME","mime","spec","resolveMode","getMode","options","mfactory","modeObj","modeExtensions","exts","prop$1","extendMode","properties","copyState","state","nstate","val","innerMode","info","startState","a1","a2","StringStream","lineOracle","ok","pattern","consume","caseInsensitive","cased","substr","inner","oracle","getLine","chunk","sz","getBetween","text","getLines","updateLineHeight","height","diff","lineNo","no","lineAtHeight","h","outer","lh","isLine","lineNumberFor","Pos","cmp","equalCursorPos","copyPos","x","maxPos","minPos","clipLine","clipPos","last","clipToLen","linelen","clipPosArray","SavedContext","lookAhead","Context","saved","copy","highlightLine","context","forceToEnd","st","lineClasses","runMode","loop","o","overlay","i_end","getLineStyles","updateFrontier","getContextBefore","resetState","precise","display","findStartLine","processLine","startAt","stream","callBlankLine","readToken","Token","takeToken","asArray","tokens","extractLineClasses","output","lineClass","flattenSpans","curStart","curStyle","mName","minindent","minline","lim","search","indented","retreatFrontier","sawReadOnlySpans","sawCollapsedSpans","seeReadOnlySpans","seeCollapsedSpans","MarkedSpan","marker","getMarkedSpanFor","spans","span","removeMarkedSpan","addMarkedSpan","op","inThisOp","markedSpansBefore","old","startCh","isInsert","nw","startsBefore","endsAfter","markedSpansAfter","endCh","stretchSpansOverChange","change","oldFirst","oldLast","first","sameLine","offset","span$1","found$1","clearEmptySpans","newMarkers","gap","gapMarkers","removeReadOnlyRanges","markers","mark","parts","mk","p","newParts","dfrom","dto","detachMarkedSpans","attachMarkedSpans","extraLeft","extraRight","compareCollapsedMarkers","lenDiff","aPos","bPos","fromCmp","toCmp","collapsedSpanAtSide","sps","sp","collapsedSpanAtStart","collapsedSpanAtEnd","collapsedSpanAround","conflictingCollapsedRange","visualLine","merged","visualLineEnd","visualLineContinued","lines","visualLineNo","lineN","vis","visualLineEndNo","lineIsHidden","lineIsHiddenInner","heightAtLine","lineObj","lineLength","findMaxLine","d","Line","markedSpans","estimateHeight","updateLine","estHeight","cleanUpLine","styleToClassCache","styleToClassCacheWithMode","interpretTokenStyle","cache","buildLineContent","lineView","builder","buildToken","buildTokenBadBidi","allowFrontierUpdate","insertLineContent","defaultSpecialCharPlaceholder","token","startStyle","endStyle","css","attributes","displayText","splitSpaces","special","mustWrap","txt$1","tabWidth","fullStyle","attr","trailingBefore","spaceBefore","buildCollapsedSpan","size","ignoreWidget","widget","styles","allText","nextChange","spanStyle","spanEndStyle","spanStartStyle","collapsed","foundBookmarks","endStyles","upto","tokenText","LineView","buildViewArray","nextPos","view","operationGroup","pushOperation","fireCallbacksForOps","group","callbacks","finishOperation","endCb","orphanDelayedCallbacks","signalLater","list","fireOrphanDelayed","delayed","updateLineForChanges","dims","updateLineText","updateLineGutter","updateLineClasses","updateLineWidgets","ensureLineWrapped","updateLineBackground","wrap","getLineContent","ext","built","textClass","wrap$1","gutterWrap","k","id","isWidget","next","insertLineWidgets","buildLineElement","insertLineWidgetsFor","allowAbove","ws","positionLineWidget","width","widgetHeight","parentStyle","eventInWidget","paddingTop","paddingVert","paddingH","data","scrollGap","displayWidth","displayHeight","ensureLineHeights","rect","wrapping","curWidth","heights","rects","mapFromLineView","updateExternalMeasurement","measureChar","bias","measureCharPrepared","prepareMeasureForLine","findViewForLine","findViewIndex","getDimensions","prepared","varHeight","key","measureCharInner","nullRect","nodeAndOffsetInLineMap","collapse","mStart","mEnd","getUsefulRect","place","maybeUpdateRectForZooming","rSpan","charWidth","rtop","rbot","top","bot","scaleX","scaleY","clearLineMeasurementCacheFor","clearLineMeasurementCache","clearCaches","pageScrollX","pageScrollY","widgetTopHeight","ref","widgets","intoCoordSystem","includeWidgets","yOff","lOff","xOff","fromCoordSystem","coords","left","localBox","lineSpaceBox","charCoords","cursorCoords","preparedMeasure","get","right","getBidi","partPos","invert","other","estimateCoords","PosWithInfo","outside","xRel","coordsChar","y","coordsCharInner","rangeEnd","wrappedLineExtent","begin","wrappedLineExtentChar","targetTop","boxIsAfter","box","ltr","coordsBidiPartWrapped","coordsBidiPart","chAround","boxAround","baseX","atLeft","atStart","_lineNo","closestDist","endX","dist","measureText","textHeight","anchor","pre","gutterLeft","compensateForHScroll","th","perLine","widgetsHeight","estimateLineHeights","est","posFromMouse","liberal","forRect","space","colDiff","regChange","lendiff","resetView","cut","viewCuttingPoint","cut$1","cutTop","cutBot","regLineChange","oldN","newN","adjustView","countDirtyView","dirty","updateSelection","prepareSelection","primary","curFragment","selFragment","customCursor","head","drawSelectionCursor","drawSelectionRange","cursor","charPos","otherCursor","cmpCoords","fragment","padding","leftSide","rightSide","docLTR","add","bottom","drawForLine","fromArg","toArg","lineLen","wrapX","side","extent","fromPos","toPos","openStart","openEnd","openLeft","openRight","topLeft","topRight","botLeft","botRight","sFrom","sTo","fromLine","toLine","singleVLine","leftEnd","rightStart","restartBlink","onBlur","ensureFocus","onFocus","delayBlurEvent","updateHeightsInViewport","prevBottom","viewTop","oldHeight","mustScroll","updateWidgetHeight","chWidth","w","visibleLines","viewport","ensureFrom","ensureTo","maybeScrollWindow","doScroll","scrollNode","scrollPosIntoView","margin","limit","changed","endCoords","scrollPos","calculateScrollPos","startTop","startLeft","updateScrollTop","setScrollLeft","scrollIntoView","snapMargin","screentop","screen","docBottom","atTop","atBottom","newTop","gutterSpace","screenleft","screenw","tooWide","addToScrollTop","resolveScrollToPos","ensureCursorVisible","scrollToCoords","scrollToRange","scrollToCoordsRange","sPos","updateDisplaySimple","setScrollTop","startWorker","forceScroll","isScroller","alignHorizontally","measureForScrollbars","gutterW","docH","NativeScrollbars","scroll","vert","horiz","needsH","needsV","sWidth","totalHeight","totalWidth","bar","delay","maybeDisable","NullScrollbars","updateScrollbars","startWidth","startHeight","updateScrollbarsInner","sizes","scrollbarModel","initScrollbars","axis","nextOpId","startOperation","endOperation","endOperations","ops","endOperation_R1","endOperation_W1","endOperation_R2","endOperation_W2","endOperation_finish","maybeClipScrollbars","DisplayUpdate","updateDisplayIfNeeded","takeFocus","setDocumentHeight","postUpdateDisplay","hidden","unhidden","runInOp","operation","methodOp","docMethodOp","highlightWorker","changedLines","oldStyles","highlighted","oldCls","newCls","ischange","force","selectionSnapshot","active","sel","restoreSelection","snapshot","update","maybeUpdateLineNumberWidth","different","toUpdate","selSnapshot","patchDisplay","barMeasure","updateNumbersFrom","lineNumbers","container","rm","updateNumber","updateGutterSpace","comp","align","innerW","getGutters","gutters","sawLineNumbers","renderGutters","specs","gElt","updateGutters","Display","input","wheelSamples","wheelPixelsPerUnit","wheelEventDelta","dx","dy","wheelEventPixels","delta","onScrollWheel","pixelsPerUnit","canScrollX","canScrollY","pixels","movedX","movedY","sample","Selection","ranges","primIndex","here","there","Range","normalizeSelection","mayTouch","prim","inv","simpleSelection","changeEnd","adjustForChange","computeSelAfterChange","offsetPos","computeReplacedSel","changes","hint","oldPrev","newPrev","loadMode","resetModeState","isWholeLineUpdate","updateDoc","spansFor","linesFor","firstLine","lastLine","lastText","lastSpans","nlines","added","added$1","added$2","linkedDocs","sharedHistOnly","propagate","skip","sharedHist","rel","shared","attachDoc","setDirectionClass","directionChanged","History","historyChangeFromChange","histChange","attachLocalSpans","clearSelectionEvents","lastChangeEvent","hist","addChangeToHistory","selAfter","opId","pushSelectionToHistory","selectionEventCanBeMerged","origin","addSelectionToHistory","dest","existing","removeClearedSpans","getOldSpans","mergeOldSpans","stretched","oldCur","stretchCur","copyHistoryArray","events","newGroup","instantiateSel","event","newChanges","extendRange","extend","posBefore","extendSelection","setSelection","extendSelections","heads","newSel","replaceOneSelection","setSimpleSelection","filterSelectionChange","setSelectionReplaceHistory","done","setSelectionNoUndo","setSelectionInner","skipAtomicInSelection","reCheckSelection","mayClear","newAnchor","skipAtomic","newHead","skipAtomicInner","oldPos","preventCursorLeft","preventCursorRight","near","movePos","far","selectAll","filterChange","makeChange","ignoreReadOnly","split","makeChangeInner","makeChangeSingleDoc","rebased","rebaseHist","makeChangeFromHistory","allowSelectionOnly","suppress","source","antiChanges","filter","returned","shiftDoc","distance","shift","makeChangeSingleDocInEditor","recomputeMaxLength","checkWidthStart","changesHandler","changeHandler","replaceRange","assign","rebaseHistSelSingle","rebaseHistArray","sub","changeLine","handle","changeType","LeafChunk","BranchChunk","children","remaining","leaf","me","spilled","sibling","myIndex","used","LineWidget","opt","adjustScrollWhenAboveVisible","this$1","oldH","addLineWidget","aboveVisible","nextMarkerId","TextMarker","withOp","min","max","visual","dHeight","markText","markTextShared","curLine","updateMaxLine","SharedTextMarker","findSharedMarkers","copySharedMarkers","mFrom","mTo","subMark","detachSharedMarkers","linked","subMarker","nextDocId","Doc","lineSep","dup","undone","forceSplit","gen","histData","gutterID","where","realOpts","sepSize","copyHistory","CodeMirror","link","splitIds","lastDrop","onDrop","clearDragCursor","files","read","markAsReadAndPasteIfAllFilesAreRead","t","readTextFromFile","file","reader","text$1","selected","onDragStart","img","onDragOver","frag","forEachCodeMirror","byClass","editors","globalsRegistered","ensureGlobalHandlers","registerGlobalHandlers","resizeTimer","onResize","keyNames","keyMap","normalizeKeyName","alt","ctrl","cmd","mod","normalizeKeyMap","keymap","keyname","keys","lookupKey","getKeyMap","isModifierKey","addModifierNames","noShift","keyName","deleteNearSelection","compute","kill","toKill","replaced","moveCharLogically","moveLogically","endOfLine","visually","moveInStorageOrder","prep","moveVisually","bidi","mv","getWrappedLineExtent","searchInVisualLine","getRes","res","nextCh","commands","leftPos","rightPos","lineStart","lineStartSmart","lineEnd","spaces","sels","firstNonWS","inWS","doHandleBinding","bound","dropShift","prevShift","lookupKeyForEditor","stopSeq","dispatchKey","seq","dispatchKeyInner","handleKeyBinding","handleCharBinding","lastStoppedKey","onKeyDown","handled","showCrossHair","lineDiv","up","onKeyUp","onKeyPress","keyCode","charCode","DOUBLECLICK_DELAY","PastClick","button","lastClick","lastDoubleClick","clickRepeat","now","onMouseDown","clickInGutter","repeat","handleMappedButton","leftButtonDown","configureMouse","option","behavior","contained","leftButtonStartDrag","leftButtonSelect","moved","dragEnd","mouseMove","dragStart","e2","rangeForUnit","unit","ourRange","ourIndex","startSel","lastPos","extendTo","startCol","posCol","oldRange","ranges$1","bidiSimplify","editorSize","counter","curCount","visible","move","anchorLine","boundary","headIndex","usePart","gutterEvent","prevent","mX","mY","lineBox","g","gutter","onContextMenu","contextMenuInGutter","themeChanged","Init","defaults","optionHandlers","defineOptions","deflt","notOnInit","newBreaks","wrappingChanged","integer","dragDropChanged","wasOn","funcs","toggle","registerEventHandlers","initHooks","word","touchFinished","prevTouch","finishTouch","isMouseLikeTouchEvent","touch","farAway","inp","indentLine","how","aggressive","curSpace","curSpaceString","indentation","indentString","pos$1","lastCopied","setLastCopied","newLastCopied","applyTextInput","inserted","deleted","recent","paste","textLines","multiPaste","updateInput","changeEvent","triggerElectric","handlePaste","pasted","copyableRanges","lineRange","disableBrowserMagic","field","spellcheck","autocorrect","autocapitalize","hiddenTextarea","addEditorMethods","helpers","maps","overlays","newRanges","help","vspace","hspace","amount","findPosH","goalColumn","findPosV","goals","headPos","startChar","check","scroller","interpret","phraseText","phrases","predicate","origDir","lineDir","findNextLine","moveOnce","boundToLine","astral","sawType","pageSize","moveAmount","ContentEditableInput","belongsToInput","onCopyCut","kludge","hadFocus","label","curAnchor","domToPos","curFocus","posToDOM","rng","poll","isInGutter","fromIndex","fromNode","toIndex","toNode","newText","domTextBetween","oldText","cutFront","cutEnd","oldTop","maxCutFront","newBot","oldBot","maxCutEnd","chFrom","chTo","scan","badPos","bad","closing","extraLinebreak","recognizeMarker","close","addText","walk","cmText","markerID","isBlock","lineNode","locateNodeInLineView","wrapper","textNode","topNode","find","curNode","dist$1","TextareaInput","prepareCopyCut","_display","opts","wrapOff","lineOff","drawn","typing","missed","prevInput","same","reset","oldCSS","oldWrapperCSS","wrapperBox","oldScrollY","rehide","prepareSelectAllHack","extval","mouseup","fromTextArea","textarea","hasFocus","save","realSubmit","form","wrappedSubmit","addLegacyProps","dontDelegate","method","func","require$$0","listRE","emptyListRE","unorderedListRE","replacements","eolState","inList","inQuote","cursorBeforeBullet","endOfQuote","endOfList","indent","numbered","bullet","incrementRemainingMarkdownListNumbers","startLine","skipCount","startItem","startIndent","nextLineNumber","nextLine","nextItem","nextIndent","newNumber","nextNumber","itemNumber","setFullscreen","setNormal","htmlConfig","xmlConfig","editorConf","config_","indentUnit","config","setStyle","inText","chain","parser","inBlock","doctype","inTag","baseState","inAttribute","quote","closure","terminator","depth","lower","tagName","startOfLine","popContext","maybePopContext","nextTagName","parentTagName","tagNameState","closeTagNameState","attrState","closeState","closeStateErr","_stream","attrEqState","tagStart","attrValueState","attrContinuedState","baseIndent","textAfter","fullLine","tagAfter","grabbers","cx","filename","dot","require$$1","require$$2","cmCfg","modeCfg","htmlMode","htmlModeMissing","tokenTypes","tokenType","hrRE","taskListRE","atxHeaderRE","setextHeaderRE","textRE","fencedCodeRE","linkDefRE","punctuation","expandedTab","switchInline","switchBlock","lineIsEmpty","blankLine","htmlBlock","exit","inlineNormal","blockNormal","firstTokenOnLine","prevLineLineIsEmpty","prevLineIsIndentedCode","prevLineIsHr","prevLineIsList","maxNonCodeIndentation","lineIndentation","allowsInlineContinuation","isHr","getType","listType","local","footnoteLink","currListInd","hasExitedList","maxFencedEndInd","returnType","listMod","handleText","taskOpen","matchCh","regex","previousFormatting","formattingEscape","linkHref","linkInline","atts","leftFlanking","rightFlanking","setEm","setStrong","retType","getLinkHrefInside","linkRE","endChar","returnState","footnoteLinkInside","footnoteUrl","s","combine","baseToken","overlayToken","onChange","onComposition","clearPlaceholder","setPlaceholder","placeHolder","empty","stopListening","startListening","_cm","onCursorActivity","clear","CHUNK_SIZE","coverRange","addAt","endLine","atEnd","coverStart","coverEnd","regexpFlags","regexp","flags","ensureFlags","maybeMultiline","searchRegexpForward","searchRegexpForwardMultiline","inside","lastMatchIn","endMargin","newMatch","searchRegexpBackward","searchRegexpBackwardMultiline","chunkSize","doFold","noFold","adjustPos","orig","folded","foldFunc","searchStringForward","query","caseFold","fold","cutFrom","endString","searchStringBackward","topString","SearchCursor","reverse","urlRE","modeConfig","codeDepth","gfmOverlay","difference","markdownConfig","__viteBrowserExternal","Typo","dictionary","affData","wordsData","settings","path","_len","_jlen","setup","readDataFile","setAffData","setWordsData","url","setFunc","response","rule","ruleText","expressionText","character","charset","async","promise","req","resolve","reject","require","fs","rules","subline","numEntries","lineParts","definitionParts","ruleType","ruleCode","combineable","entries","charactersToRemove","additionParts","charactersToAdd","continuationClasses","regexToMatch","entry","dictionaryTable","addWord","ruleCodesArray","newWords","ii","_iilen","newWord","combineCode","combineRule","otherNewWords","iii","_iiilen","otherNewWord","textCodes","continuationRule","aWord","trimmedWord","capitalizedWord","uncapitalizedWord","ruleCodes","flag","wordFlags","memoizedLimit","replacementEntry","correctedWord","alphaArray","alphaHash","edits1","words","known_only","rv","_edit","alphabetLength","lettercase","replacementLetter","correct","ed1","ed2","weighted_corrections","ed1word","sorted_corrections","sorter","a_val","b_val","capitalization_scheme","working_limit","CodeMirrorSpellChecker","xhr_aff","xhr_dic","rx_word","spellChecker","_defineProperties","descriptor","_toPropertyKey","_createClass","Constructor","protoProps","staticProps","_extends","_unsupportedIterableToArray","minLen","_arrayLikeToArray","arr2","_createForOfIteratorHelperLoose","allowArrayLike","it","_toPrimitive","arg","getDefaults","exports","changeDefaults","newDefaults","escapeTest","escapeReplace","escapeTestNoEncode","escapeReplaceNoEncode","escapeReplacements","getEscapeReplacement","escape","html","encode","unescapeTest","unescape","_","caret","edit","nonWordAndColonTest","originIndependentUrl","cleanUrl","sanitize","href","prot","resolveUrl","baseUrls","justDomain","protocol","domain","rtrim","relativeBase","noopTest","splitCells","tableRow","row","escaped","curr","cells","c","suffLen","currChar","findClosingBracket","checkSanitizeDeprecation","repeatString","outputLink","cap","raw","lexer","title","indentCodeCompensation","matchIndentToCode","indentToCode","matchIndentInNode","indentInNode","Tokenizer","_proto","src","trimmed","istask","ischecked","endsWithBlankLine","rawLine","itemContents","endEarly","bull","isordered","itemRegex","nextBulletRegex","hrRegex","fencesBeginRegex","headingBeginRegex","spacers","hasMultipleLineBreaks","item","trimmedUrl","rtrimSlash","lastParenIndex","linkLen","links","maskedSrc","prevChar","nextChar","lLength","rDelim","rLength","delimTotal","midDelimTotal","endReg","_text","hasNonSpaceChars","hasSpaceCharsOnBothEnds","mangle","prevCapZero","smartypants","block","inline","Lexer","_this","leading","tabs","lastToken","cutSrc","lastParagraphClipped","extTokenizer","tempSrc","tempStart","getStartIndex","errMsg","_this2","keepPrevChar","Renderer","_code","infostring","lang","_html","slugger","body","ordered","startatt","checked","header","TextRenderer","Slugger","originalSlug","isDryRun","slug","occurenceAccumulator","Parser","l2","l3","cell","loose","itemBody","task","checkbox","ret","renderer","Hooks","markdown","onError","silent","callback","msg","parseMarkdown","origOpt","marked","throwError","highlight","err","pending","_tokens","extensions","_key","pack","prevRenderer","_len2","_key2","_loop","_len3","_key3","tokenizer","_loop2","prevTokenizer","_len4","_key4","hooks","_loop3","prevHook","_len5","_key5","_walkTokens","values","_loop4","_step","_iterator2","_step2","_iterator3","_step3","_iterator4","_step4","_cell","childTokens","_iterator","setOptions","use","walkTokens","parseInline","parse","require$$12","require$$13","isMac","anchorToExternalRegex","bindings","toggleBold","toggleItalic","drawLink","toggleHeadingSmaller","toggleHeadingBigger","drawImage","toggleBlockquote","toggleOrderedList","toggleUnorderedList","toggleCodeBlock","togglePreview","toggleStrikethrough","toggleHeading1","toggleHeading2","toggleHeading3","toggleHeading4","toggleHeading5","toggleHeading6","cleanBlock","drawTable","drawHorizontalRule","undo","redo","toggleSideBySide","toggleFullScreen","shortcuts","getBindingName","isMobile","addAnchorTargetBlank","htmlText","linkString","fixedLinkString","removeListStyleWhenCheckbox","htmlDoc","listItems","listItem","listItemChild","fixShortcut","createToolbarDropdown","enableTooltips","el","createToolbarButton","childrenIndex","childElement","toolbarBuiltInButtons","enableActions","markup","attribute","classNamePrefix","createTooltip","classNameParts","iconClasses","classNameIndex","classNamePart","icon","iconClassIndex","iconClass","createSep","action","actionName","tooltip","getState","stat","saved_overflow","editor","sidebyside","easyMDEContainer","toolbarButton","_toggleBlock","fenceCharsToInsert","fencing_line","token_state","code_type","line_num","firstTok","lastTok","insertFencingAtSelection","cur_start","cur_end","start_line_sel","end_line_sel","sel_multi","repl_start","repl_end","_replaceSelection","tok","is_code","block_start","block_end","lineCount","fencedTok","fence_chars","start_text","start_line","end_text","end_line","search_from","next_line","next_line_last_tok","next_line_indented","no_sel_and_starting_of_line","_toggleLine","_toggleHeading","listStyle","_cleanBlock","escapePromptURL","_toggleLink","drawUploadedImage","afterImageUploaded","imageName","text_link","preview","useSideBySideListener","previewNormal","toolbar","toolbar_div","sideBySideRenderingFunction","newValue","preview_result","startEnd","startPoint","endPoint","currHeadingLevel","liststyle","listRegexp","whitespacesRegexp","repl","_getChar","_checkChar","char","_toggle","untoggleOnly","start_chars","end_chars","humanFileSize","bytes","units","u","_mergeProperties","property","wordCount","iconClassMap","insertTexts","promptTexts","timeFormat","blockStyles","imageTexts","errorMessages","EasyMDE","autoDownloadFA","styleSheets","plainText","errorMessage","onSuccess","names","imageUploadFunction","itemName","matchingClasses","markedOptions","hljs","language","keyMaps","backdrop","cmWrapper","calcHeight","naturalWidth","naturalHeight","viewportWidth","_vm","assignImageBlockAttributes","parentEl","handleImages","srcAttr","keySrc","newSrc","temp_cm","isLocalStorageAvailable","easyMDE","dd","imageInput","imageUrl","onErrorSup","fillErrorMessage","formData","request","progress","filledErrorMessage","borderTopWidth","optionsMaxHeight","wrapperMaxHeight","previewMaxHeight","cScroll","pScroll","ratio","items","toolbarData","nonSeparatorIconsFollow","status","onUpdate","onActivity","defaultValue","posLine","posColumn","easymde"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,14,15,16,17]}