diff --git a/bower.json b/bower.json
index 5560045e..84571630 100644
--- a/bower.json
+++ b/bower.json
@@ -1,6 +1,6 @@
{
"name": "stackedit",
- "version": "3.1.9",
+ "version": "3.1.10",
"description": "StackEdit is a free, open-source Markdown editor based on PageDown, the Markdown library used by Stack Overflow and the other Stack Exchange sites.",
"dependencies": {
"bootstrap": "v3.0.0",
diff --git a/package.json b/package.json
index 76a062e4..5a25ea05 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "stackedit",
- "version": "3.1.9",
+ "version": "3.1.10",
"private": true,
"description": "StackEdit is a free, open-source Markdown editor based on PageDown, the Markdown library used by Stack Overflow and the other Stack Exchange sites.",
"main": "res/main.js",
diff --git a/public/cache.manifest b/public/cache.manifest
index fad08076..66ebe551 100644
--- a/public/cache.manifest
+++ b/public/cache.manifest
@@ -1,5 +1,5 @@
CACHE MANIFEST
-#Date Sun Feb 16 2014 16:48:09
+#Date Wed Mar 19 2014 23:13:17
CACHE:
res/worker.js
@@ -11,6 +11,8 @@ libs/MathJax/images/MenuArrow-15.png
libs/MathJax/jax/output/HTML-CSS/jax.js
#DynamicResourcesBegin
+res-min/font/Inconsolata-Bold-webfont.woff
+res-min/font/Inconsolata-Regular-webfont.woff
res-min/font/OpenSans-Bold-webfont.svg
res-min/font/OpenSans-Bold-webfont.woff
res-min/font/OpenSans-BoldItalic-webfont.svg
diff --git a/public/res-min/main.js b/public/res-min/main.js
index 7654d044..d2a535e5 100644
--- a/public/res-min/main.js
+++ b/public/res-min/main.js
@@ -212,6 +212,36 @@ Example usage:
\p{Cn}
*/
+/* ***** BEGIN LICENSE BLOCK *****
+ * Distributed under the BSD license:
+ *
+ * Copyright (c) 2012, Ajax.org B.V.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of Ajax.org B.V. nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
/*!
* XRegExp-All 3.0.0-pre
*
@@ -4548,12 +4578,16 @@ function printStackTrace(e) {
};
}
}), define("ace/lib/oop", [ "require", "exports", "module" ], function(e, t) {
- t.inherits = function() {
- var e = function() {};
- return function(t, n) {
- e.prototype = n.prototype, t.super_ = n.prototype, t.prototype = new e(), t.prototype.constructor = t;
- };
- }(), t.mixin = function(e, t) {
+ t.inherits = function(e, t) {
+ e.super_ = t, e.prototype = Object.create(t.prototype, {
+ constructor: {
+ value: e,
+ enumerable: !1,
+ writable: !0,
+ configurable: !0
+ }
+ });
+ }, t.mixin = function(e, t) {
for (var n in t) e[n] = t[n];
return e;
}, t.implement = function(e, n) {
@@ -4561,7 +4595,7 @@ function printStackTrace(e) {
};
}), define("ace/lib/keys", [ "require", "exports", "module", "./oop" ], function(e, t) {
var n = e("./oop"), i = function() {
- var e = {
+ var e, t, i = {
MODIFIER_KEYS: {
16: "Shift",
17: "Ctrl",
@@ -4573,6 +4607,7 @@ function printStackTrace(e) {
alt: 2,
option: 2,
shift: 4,
+ "super": 8,
meta: 8,
command: 8,
cmd: 8
@@ -4674,12 +4709,10 @@ function printStackTrace(e) {
222: "'"
}
};
- for (var t in e.FUNCTION_KEYS) {
- var i = e.FUNCTION_KEYS[t].toLowerCase();
- e[i] = parseInt(t, 10);
- }
- return n.mixin(e, e.MODIFIER_KEYS), n.mixin(e, e.PRINTABLE_KEYS), n.mixin(e, e.FUNCTION_KEYS),
- e.enter = e["return"], e.escape = e.esc, e.del = e["delete"], e[173] = "-", e;
+ for (t in i.FUNCTION_KEYS) e = i.FUNCTION_KEYS[t].toLowerCase(), i[e] = parseInt(t, 10);
+ for (t in i.PRINTABLE_KEYS) e = i.PRINTABLE_KEYS[t].toLowerCase(), i[e] = parseInt(t, 10);
+ return n.mixin(i, i.MODIFIER_KEYS), n.mixin(i, i.PRINTABLE_KEYS), n.mixin(i, i.FUNCTION_KEYS),
+ i.enter = i["return"], i.escape = i.esc, i.del = i["delete"], i[173] = "-", i;
}();
n.mixin(t, i), t.keyCodeToString = function(e) {
return (i[e] || String.fromCharCode(e)).toLowerCase();
@@ -4693,7 +4726,7 @@ function printStackTrace(e) {
return t.isMac ? t.OS.MAC : t.isLinux ? t.OS.LINUX : t.OS.WINDOWS;
}, "object" == typeof navigator) {
var n = (navigator.platform.match(/mac|win|linux/i) || [ "other" ])[0].toLowerCase(), i = navigator.userAgent;
- t.isWin = "win" == n, t.isMac = "mac" == n, t.isLinux = "linux" == n, t.isIE = ("Microsoft Internet Explorer" == navigator.appName || navigator.appName.indexOf("MSAppHost") >= 0) && parseFloat(navigator.userAgent.match(/MSIE ([0-9]+[\.0-9]+)/)[1]),
+ t.isWin = "win" == n, t.isMac = "mac" == n, t.isLinux = "linux" == n, t.isIE = ("Microsoft Internet Explorer" == navigator.appName || navigator.appName.indexOf("MSAppHost") >= 0) && parseFloat(navigator.userAgent.match(/(?:Trident\/[0-9]+[\.0-9]+;.*rv:|MSIE )([0-9]+[\.0-9]+)/)[1]),
t.isOldIE = t.isIE && t.isIE < 9, t.isGecko = t.isMozilla = window.controllers && "Gecko" === window.navigator.product,
t.isOldGecko = t.isGecko && parseInt((navigator.userAgent.match(/rv\:(\d+)/) || [])[1], 10) < 4,
t.isOpera = window.opera && "[object Opera]" == Object.prototype.toString.call(window.opera),
@@ -4734,9 +4767,9 @@ function printStackTrace(e) {
default:
a = 8;
}
- n = 0;
+ n = -1;
}
- return 8 & a && (91 === n || 93 === n) && (n = 0), a || 13 !== n || !t.location && 3 !== t.keyLocation || (e(t, a, -n),
+ return 8 & a && (91 === n || 93 === n) && (n = -1), a || 13 !== n || !t.location && 3 !== t.keyLocation || (e(t, a, -n),
!t.defaultPrevented) ? a || n in i.FUNCTION_KEYS || n in i.PRINTABLE_KEYS ? e(t, a, n) : !1 : void 0;
}
var i = e("./keys"), o = e("./useragent");
@@ -4768,17 +4801,25 @@ function printStackTrace(e) {
n && n(e), i && i(e), t.removeListener(document, "mousemove", n, !0), t.removeListener(document, "mouseup", o, !0),
t.removeListener(document, "dragstart", o, !0);
}
- t.addListener(document, "mousemove", n, !0), t.addListener(document, "mouseup", o, !0),
- t.addListener(document, "dragstart", o, !0);
+ return t.addListener(document, "mousemove", n, !0), t.addListener(document, "mouseup", o, !0),
+ t.addListener(document, "dragstart", o, !0), o;
}, t.addMouseWheelListener = function(e, n) {
- if ("onmousewheel" in e) {
- var i = 8;
- t.addListener(e, "mousewheel", function(e) {
- void 0 !== e.wheelDeltaX ? (e.wheelX = -e.wheelDeltaX / i, e.wheelY = -e.wheelDeltaY / i) : (e.wheelX = 0,
- e.wheelY = -e.wheelDelta / i), n(e);
- });
- } else "onwheel" in e ? t.addListener(e, "wheel", function(e) {
- e.wheelX = 5 * (e.deltaX || 0), e.wheelY = 5 * (e.deltaY || 0), n(e);
+ "onmousewheel" in e ? t.addListener(e, "mousewheel", function(e) {
+ var t = 8;
+ void 0 !== e.wheelDeltaX ? (e.wheelX = -e.wheelDeltaX / t, e.wheelY = -e.wheelDeltaY / t) : (e.wheelX = 0,
+ e.wheelY = -e.wheelDelta / t), n(e);
+ }) : "onwheel" in e ? t.addListener(e, "wheel", function(e) {
+ var t = .35;
+ switch (e.deltaMode) {
+ case e.DOM_DELTA_PIXEL:
+ e.wheelX = e.deltaX * t || 0, e.wheelY = e.deltaY * t || 0;
+ break;
+
+ case e.DOM_DELTA_LINE:
+ case e.DOM_DELTA_PAGE:
+ e.wheelX = 5 * (e.deltaX || 0), e.wheelY = 5 * (e.deltaY || 0);
+ }
+ n(e);
}) : t.addListener(e, "DOMMouseScroll", function(e) {
e.axis && e.axis == e.HORIZONTAL_AXIS ? (e.wheelX = 5 * (e.detail || 0), e.wheelY = 0) : (e.wheelX = 0,
e.wheelY = 5 * (e.detail || 0)), n(e);
@@ -4841,7 +4882,9 @@ function printStackTrace(e) {
setTimeout(e, 17);
};
}), define("ace/lib/lang", [ "require", "exports", "module" ], function(e, t) {
- t.stringReverse = function(e) {
+ t.last = function(e) {
+ return e[e.length - 1];
+ }, t.stringReverse = function(e) {
return e.split("").reverse().join("");
}, t.stringRepeat = function(e, t) {
for (var n = ""; t > 0; ) 1 & t && (n += e), (t >>= 1) && (e += e);
@@ -4860,10 +4903,12 @@ function printStackTrace(e) {
for (var t = [], n = 0, i = e.length; i > n; n++) t[n] = e[n] && "object" == typeof e[n] ? this.copyObject(e[n]) : e[n];
return t;
}, t.deepCopy = function(e) {
- if ("object" != typeof e) return e;
- var t = e.constructor();
- for (var n in e) t[n] = "object" == typeof e[n] ? this.deepCopy(e[n]) : e[n];
- return t;
+ if ("object" != typeof e || !e) return e;
+ var n = e.constructor;
+ if (n === RegExp) return e;
+ var i = n();
+ for (var o in e) i[o] = "object" == typeof e[o] ? t.deepCopy(e[o]) : e[o];
+ return i;
}, t.arrayToMap = function(e) {
for (var t = {}, n = 0; n < e.length; n++) t[e[n]] = 1;
return t;
@@ -4895,16 +4940,18 @@ function printStackTrace(e) {
return this.cancel(), e(), i;
}, i.cancel = function() {
return clearTimeout(t), t = null, i;
+ }, i.isPending = function() {
+ return t;
}, i;
}, t.delayedCall = function(e, t) {
var n = null, i = function() {
n = null, e();
}, o = function(e) {
- n && clearTimeout(n), n = setTimeout(i, e || t);
+ null == n && (n = setTimeout(i, e || t));
};
- return o.delay = o, o.schedule = function(e) {
- null == n && (n = setTimeout(i, e || 0));
- }, o.call = function() {
+ return o.delay = function(e) {
+ n && clearTimeout(n), n = setTimeout(i, e || t);
+ }, o.schedule = o, o.call = function() {
this.cancel(), e();
}, o.cancel = function() {
n && clearTimeout(n), n = null;
@@ -5000,7 +5047,9 @@ function printStackTrace(e) {
return T;
};
var D = !1, _ = function(e) {
- T && (e = T(e), T = null), f ? (a(), e && t.onPaste(e), f = !1) : e == d.charAt(0) ? D && t.execCommand("del", {
+ T && (e = T(e), T = null), f ? (a(), e && t.onPaste(e), f = !1) : e == d.charAt(0) ? D ? t.execCommand("del", {
+ source: "ace"
+ }) : t.execCommand("backspace", {
source: "ace"
}) : (e.substring(0, 2) == d ? e = e.substr(2) : e.charAt(0) == d.charAt(0) ? e = e.substr(1) : e.charAt(e.length - 1) == d.charAt(0) && (e = e.slice(0, -1)),
e.charAt(e.length - 1) == d.charAt(0) && (e = e.slice(0, -1)), e && t.onTextInput(e)),
@@ -5056,10 +5105,11 @@ function printStackTrace(e) {
}
});
var R = function() {
- g || (g = {}, t.onCompositionStart(), setTimeout(B, 0), t.on("mousedown", P), t.selection.isEmpty() || (t.insert(""),
- t.session.markUndoGroup(), t.selection.clearSelection()), t.session.markUndoGroup());
+ !g && t.onCompositionStart && (g = {}, t.onCompositionStart(), setTimeout(B, 0),
+ t.on("mousedown", P), t.selection.isEmpty() || (t.insert(""), t.session.markUndoGroup(),
+ t.selection.clearSelection()), t.session.markUndoGroup());
}, B = function() {
- if (g) {
+ if (g && t.onCompositionUpdate) {
var e = u.value.replace(/\x01/g, "");
if (g.lastValue !== e && (t.onCompositionUpdate(e), g.lastValue && t.undo(), g.lastValue = e,
g.lastValue)) {
@@ -5069,19 +5119,21 @@ function printStackTrace(e) {
}
}
}, P = function(e) {
- var n = g;
- g = !1;
- var i = setTimeout(function() {
- i = null;
- var e = u.value.replace(/\x01/g, "");
- g || (e == n.lastValue ? l() : !n.lastValue && e && (l(), _(e)));
- });
- T = function(e) {
- return i && clearTimeout(i), e = e.replace(/\x01/g, ""), e == n.lastValue ? "" : (n.lastValue && i && t.undo(),
- e);
- }, t.onCompositionEnd(), t.removeListener("mousedown", P), "compositionend" == e.type && n.range && t.selection.setRange(n.range);
+ if (t.onCompositionEnd) {
+ var n = g;
+ g = !1;
+ var i = setTimeout(function() {
+ i = null;
+ var e = u.value.replace(/\x01/g, "");
+ g || (e == n.lastValue ? l() : !n.lastValue && e && (l(), _(e)));
+ });
+ T = function(e) {
+ return i && clearTimeout(i), e = e.replace(/\x01/g, ""), e == n.lastValue ? "" : (n.lastValue && i && t.undo(),
+ e);
+ }, t.onCompositionEnd(), t.removeListener("mousedown", P), "compositionend" == e.type && n.range && t.selection.setRange(n.range);
+ }
}, N = r.delayedCall(B, 50);
- n.addListener(u, "compositionstart", R), i.isGecko ? n.addListener(u, "text", function() {
+ if (n.addListener(u, "compositionstart", R), i.isGecko ? n.addListener(u, "text", function() {
N.schedule();
}) : (n.addListener(u, "keyup", function() {
N.schedule();
@@ -5102,9 +5154,12 @@ function printStackTrace(e) {
};
p(e), "mousedown" == e.type && (t.renderer.$keepTextAreaAtCursor && (t.renderer.$keepTextAreaAtCursor = null),
i.isWin && n.capture(t.container, p, c));
- }, this.onContextMenuClose = c, (!i.isGecko || i.isMac) && n.addListener(u, "contextmenu", function(e) {
- t.textInput.onContextMenu(e), c();
- });
+ }, this.onContextMenuClose = c, !i.isGecko || i.isMac) {
+ var O = function(e) {
+ t.textInput.onContextMenu(e), c();
+ };
+ n.addListener(t.renderer.scroller, "contextmenu", O), n.addListener(u, "contextmenu", O);
+ }
};
t.TextInput = a;
}), define("ace/mouse/default_handlers", [ "require", "exports", "module", "../lib/dom", "../lib/event", "../lib/useragent" ], function(e, t) {
@@ -5144,17 +5199,15 @@ function printStackTrace(e) {
return s && (i.moveCursorToPosition(n), i.selection.clearSelection()), i.textInput.onContextMenu(e.domEvent),
void 0;
}
- return !t || i.isFocused() || (i.focus(), !this.$focusTimout || this.$clickSelection || i.inMultiSelectMode) ? (!t || this.$clickSelection || e.getShiftKey() || i.inMultiSelectMode ? this.startSelect(n) : t && (this.mousedownEvent.time = new Date().getTime(),
- this.startSelect(n)), this.captureMouse(e), e.preventDefault()) : (this.mousedownEvent.time = new Date().getTime(),
+ return !t || i.isFocused() || (i.focus(), !this.$focusTimout || this.$clickSelection || i.inMultiSelectMode) ? (!t || this.$clickSelection || e.getShiftKey() || i.inMultiSelectMode ? this.startSelect(n) : t && (this.mousedownEvent.time = Date.now(),
+ this.startSelect(n)), this.captureMouse(e), e.preventDefault()) : (this.mousedownEvent.time = Date.now(),
this.setState("focusWait"), this.captureMouse(e), void 0);
}, this.startSelect = function(e) {
e = e || this.editor.renderer.screenToTextCoordinates(this.x, this.y);
- var t = this.editor;
- setTimeout(function() {
- this.mousedownEvent.getShiftKey() ? t.selection.selectToPosition(e) : this.$clickSelection || (t.moveCursorToPosition(e),
- t.selection.clearSelection());
- }.bind(this), 0), t.container.setCapture && t.container.setCapture(), t.setStyle("ace_selecting"),
- this.setState("select");
+ var t = this.editor, n = this.mousedownEvent.getShiftKey();
+ n ? t.selection.selectToPosition(e) : this.$clickSelection || (t.moveCursorToPosition(e),
+ t.selection.clearSelection()), t.renderer.scroller.setCapture && t.renderer.scroller.setCapture(),
+ t.setStyle("ace_selecting"), this.setState("select");
}, this.select = function() {
var e, t = this.editor, n = t.renderer.screenToTextCoordinates(this.x, this.y);
if (this.$clickSelection) {
@@ -5180,60 +5233,85 @@ function printStackTrace(e) {
}
n.selection.selectToPosition(i), n.renderer.scrollCursorIntoView();
}, this.selectEnd = this.selectAllEnd = this.selectByWordsEnd = this.selectByLinesEnd = function() {
- this.editor.unsetStyle("ace_selecting"), this.editor.container.releaseCapture && this.editor.container.releaseCapture();
+ this.editor.unsetStyle("ace_selecting"), this.editor.renderer.scroller.releaseCapture && this.editor.renderer.scroller.releaseCapture();
}, this.focusWait = function() {
- var e = i(this.mousedownEvent.x, this.mousedownEvent.y, this.x, this.y), t = new Date().getTime();
+ var e = i(this.mousedownEvent.x, this.mousedownEvent.y, this.x, this.y), t = Date.now();
(e > r || t - this.mousedownEvent.time > this.$focusTimout) && this.startSelect(this.mousedownEvent.getDocumentPosition());
}, this.onDoubleClick = function(e) {
var t = e.getDocumentPosition(), n = this.editor, i = n.session, o = i.getBracketRange(t);
- return o ? (o.isEmpty() && (o.start.column--, o.end.column++), this.$clickSelection = o,
- this.setState("select"), void 0) : (this.$clickSelection = n.selection.getWordRange(t.row, t.column),
- this.setState("selectByWords"), void 0);
+ o ? (o.isEmpty() && (o.start.column--, o.end.column++), this.setState("select")) : (o = n.selection.getWordRange(t.row, t.column),
+ this.setState("selectByWords")), this.$clickSelection = o, this[this.state] && this[this.state](e);
}, this.onTripleClick = function(e) {
var t = e.getDocumentPosition(), n = this.editor;
- this.setState("selectByLines"), this.$clickSelection = n.selection.getLineRange(t.row);
+ this.setState("selectByLines"), this.$clickSelection = n.selection.getLineRange(t.row),
+ this[this.state] && this[this.state](e);
}, this.onQuadClick = function() {
var e = this.editor;
e.selectAll(), this.$clickSelection = e.getSelectionRange(), this.setState("selectAll");
}, this.onMouseWheel = function(e) {
- if (!e.getShiftKey() && !e.getAccelKey()) {
+ if (!e.getAccelKey()) {
+ e.getShiftKey() && e.wheelY && !e.wheelX && (e.wheelX = e.wheelY, e.wheelY = 0);
var t = e.domEvent.timeStamp, n = t - (this.$lastScrollTime || 0), i = this.editor, o = i.renderer.isScrollableBy(e.wheelX * e.speed, e.wheelY * e.speed);
return o || 200 > n ? (this.$lastScrollTime = t, i.renderer.scrollBy(e.wheelX * e.speed, e.wheelY * e.speed),
e.stop()) : void 0;
}
};
}).call(n.prototype), t.DefaultHandlers = n;
-}), define("ace/mouse/default_gutter_handler", [ "require", "exports", "module", "../lib/dom", "../lib/event" ], function(e, t) {
+}), define("ace/tooltip", [ "require", "exports", "module", "./lib/oop", "./lib/dom" ], function(e, t) {
+ function n(e) {
+ this.isOpen = !1, this.$element = null, this.$parentNode = e;
+ }
+ e("./lib/oop");
+ var i = e("./lib/dom");
+ (function() {
+ this.$init = function() {
+ return this.$element = i.createElement("div"), this.$element.className = "ace_tooltip",
+ this.$element.style.display = "none", this.$parentNode.appendChild(this.$element),
+ this.$element;
+ }, this.getElement = function() {
+ return this.$element || this.$init();
+ }, this.setText = function(e) {
+ i.setInnerText(this.getElement(), e);
+ }, this.setHtml = function(e) {
+ this.getElement().innerHTML = e;
+ }, this.setPosition = function(e, t) {
+ this.getElement().style.left = e + "px", this.getElement().style.top = t + "px";
+ }, this.setClassName = function(e) {
+ i.addCssClass(this.getElement(), e);
+ }, this.show = function(e, t, n) {
+ null != e && this.setText(e), null != t && null != n && this.setPosition(t, n),
+ this.isOpen || (this.getElement().style.display = "block", this.isOpen = !0);
+ }, this.hide = function() {
+ this.isOpen && (this.getElement().style.display = "none", this.isOpen = !1);
+ }, this.getHeight = function() {
+ return this.getElement().offsetHeight;
+ }, this.getWidth = function() {
+ return this.getElement().offsetWidth;
+ };
+ }).call(n.prototype), t.Tooltip = n;
+}), define("ace/mouse/default_gutter_handler", [ "require", "exports", "module", "../lib/dom", "../lib/oop", "../lib/event", "../tooltip" ], function(e, t) {
function n(e) {
function t() {
- d = i.createElement("div"), d.className = "ace_gutter-tooltip", d.style.display = "none",
- a.container.appendChild(d);
+ var t = d.getDocumentPosition().row, i = l.$annotations[t];
+ if (!i) return n();
+ var o = a.session.getLength();
+ if (t == o) {
+ var s = a.renderer.pixelToScreenCoordinates(0, d.y).row, u = d.$pos;
+ if (s > a.session.documentToScreenRow(u.row, u.column)) return n();
+ }
+ if (h != i) if (h = i.text.join("
"), c.setHtml(h), c.show(), a.on("mousewheel", n),
+ e.$tooltipFollowsMouse) r(d); else {
+ var p = l.$cells[t].element, f = p.getBoundingClientRect(), g = c.getElement().style;
+ g.left = f.right + "px", g.top = f.bottom + "px";
+ }
}
function n() {
- d || t();
- var e = u.getDocumentPosition().row, n = l.$annotations[e];
- if (!n) return r();
- var i = a.session.getLength();
- if (e == i) {
- var o = a.renderer.pixelToScreenCoordinates(0, u.y).row, c = u.$pos;
- if (o > a.session.documentToScreenRow(c.row, c.column)) return r();
- }
- h != n && (h = n.text.join("
"), d.style.display = "block", d.innerHTML = h,
- a.on("mousewheel", r), s(u));
+ u && (u = clearTimeout(u)), h && (c.hide(), h = null, a.removeEventListener("mousewheel", n));
}
- function r() {
- c && (c = clearTimeout(c)), h && (d.style.display = "none", h = null, a.removeEventListener("mousewheel", r));
+ function r(e) {
+ c.setPosition(e.x, e.y);
}
- function s(e) {
- var t = a.renderer.$gutter.getBoundingClientRect();
- if (d.style.left = e.x + 15 + "px", e.y + 3 * a.renderer.lineHeight + 15 < t.bottom) d.style.bottom = "",
- d.style.top = e.y + 15 + "px"; else {
- d.style.top = "";
- var n = window.innerHeight || document.documentElement.clientHeight;
- d.style.bottom = n - e.y + 5 + "px";
- }
- }
- var a = e.editor, l = a.renderer.$gutterLayer;
+ var a = e.editor, l = a.renderer.$gutterLayer, c = new i(a.container);
e.editor.setDefaultHandler("guttermousedown", function(t) {
if (a.isFocused() && 0 == t.getButton()) {
var n = l.getRegion(t);
@@ -5247,20 +5325,29 @@ function printStackTrace(e) {
}
}
});
- var c, u, d, h;
- e.editor.setDefaultHandler("guttermousemove", function(t) {
- var o = t.domEvent.target || t.domEvent.srcElement;
- return i.hasCssClass(o, "ace_fold-widget") ? r() : (h && s(t), u = t, c || (c = setTimeout(function() {
- c = null, u && !e.isMousePressed ? n() : r();
+ var u, d, h;
+ e.editor.setDefaultHandler("guttermousemove", function(i) {
+ var s = i.domEvent.target || i.domEvent.srcElement;
+ return o.hasCssClass(s, "ace_fold-widget") ? n() : (h && e.$tooltipFollowsMouse && r(i),
+ d = i, u || (u = setTimeout(function() {
+ u = null, d && !e.isMousePressed ? t() : n();
}, 50)), void 0);
- }), o.addListener(a.renderer.$gutter, "mouseout", function() {
- u = null, h && !c && (c = setTimeout(function() {
- c = null, r();
+ }), s.addListener(a.renderer.$gutter, "mouseout", function() {
+ d = null, h && !u && (u = setTimeout(function() {
+ u = null, n();
}, 50));
- }), a.on("changeSession", r);
+ }), a.on("changeSession", n);
}
- var i = e("../lib/dom"), o = e("../lib/event");
- t.GutterHandler = n;
+ function i(e) {
+ a.call(this, e);
+ }
+ var o = e("../lib/dom"), r = e("../lib/oop"), s = e("../lib/event"), a = e("../tooltip").Tooltip;
+ r.inherits(i, a), function() {
+ this.setPosition = function(e, t) {
+ var n = window.innerWidth || document.documentElement.clientWidth, i = window.innerHeight || document.documentElement.clientHeight, o = this.getWidth(), r = this.getHeight();
+ e += 15, t += 15, e + o > n && (e -= e + o - n), t + r > i && (t -= 20 + r), a.prototype.setPosition.call(this, e, t);
+ };
+ }.call(i.prototype), t.GutterHandler = n;
}), define("ace/mouse/mouse_event", [ "require", "exports", "module", "../lib/event", "../lib/useragent" ], function(e, t) {
var n = e("../lib/event"), i = e("../lib/useragent"), o = t.MouseEvent = function(e, t) {
this.domEvent = e, this.editor = t, this.x = this.clientX = e.clientX, this.y = this.clientY = e.clientY,
@@ -5297,18 +5384,18 @@ function printStackTrace(e) {
}), define("ace/mouse/dragdrop_handler", [ "require", "exports", "module", "../lib/dom", "../lib/event", "../lib/useragent" ], function(e, t) {
function n(e) {
function t(e, t) {
- var n = new Date().getTime(), o = !t || e.row != t.row, r = !t || e.column != t.column;
- if (!F || o || r) m.$blockScrolling += 1, m.moveCursorToPosition(e), m.$blockScrolling -= 1,
- F = n, T = {
+ var n = Date.now(), o = !t || e.row != t.row, r = !t || e.column != t.column;
+ if (!T || o || r) m.$blockScrolling += 1, m.moveCursorToPosition(e), m.$blockScrolling -= 1,
+ T = n, D = {
x: w,
y: C
}; else {
- var s = i(T.x, T.y, w, C);
- s > c ? F = null : n - F >= l && (m.renderer.scrollCursorIntoView(), F = null);
+ var s = i(D.x, D.y, w, C);
+ s > c ? T = null : n - T >= l && (m.renderer.scrollCursorIntoView(), T = null);
}
}
function n(e, t) {
- var n = new Date().getTime(), i = m.renderer.layerConfig.lineHeight, o = m.renderer.layerConfig.characterWidth, r = m.renderer.scroller.getBoundingClientRect(), s = {
+ var n = Date.now(), i = m.renderer.layerConfig.lineHeight, o = m.renderer.layerConfig.characterWidth, r = m.renderer.scroller.getBoundingClientRect(), s = {
x: {
left: w - r.left,
right: r.right - w
@@ -5323,7 +5410,7 @@ function printStackTrace(e) {
};
2 >= l / o && (u.column += s.x.left < s.x.right ? -3 : 2), 1 >= c / i && (u.row += s.y.top < s.y.bottom ? -1 : 1);
var d = e.row != u.row, h = e.column != u.column, p = !t || e.row != t.row;
- d || h && !p ? A ? n - A >= a && m.renderer.scrollCursorIntoView(u) : A = n : A = null;
+ d || h && !p ? F ? n - F >= a && m.renderer.scrollCursorIntoView(u) : F = n : F = null;
}
function u() {
var e = E;
@@ -5331,15 +5418,17 @@ function printStackTrace(e) {
}
function d() {
S = m.selection.toOrientedRange(), y = m.session.addMarker(S, "ace_selection", m.getSelectionStyle()),
- m.clearSelection(), clearInterval(x), x = setInterval(u, 20), _ = 0, r.addListener(document, "mousemove", p);
+ m.clearSelection(), m.isFocused() && m.renderer.$cursorLayer.setBlinking(!1), clearInterval(x),
+ x = setInterval(u, 20), L = 0, r.addListener(document, "mousemove", p);
}
function h() {
clearInterval(x), m.session.removeMarker(y), y = null, m.$blockScrolling += 1, m.selection.fromOrientedRange(S),
- m.$blockScrolling -= 1, S = null, _ = 0, A = null, F = null, r.removeListener(document, "mousemove", p);
+ m.$blockScrolling -= 1, m.isFocused() && !A && m.renderer.$cursorLayer.setBlinking(!m.getReadOnly()),
+ S = null, L = 0, F = null, T = null, r.removeListener(document, "mousemove", p);
}
function p() {
- null == L && (L = setTimeout(function() {
- null != L && y && h();
+ null == I && (I = setTimeout(function() {
+ null != I && y && h();
}, 20));
}
function f(e) {
@@ -5359,44 +5448,42 @@ function printStackTrace(e) {
}
var m = e.editor, v = o.createElement("img");
v.src = "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==",
- s.isOpera && (v.style.cssText = "width:1px;height:1px;position:fixed;top:0;left:0;z-index:2147483647;opacity:0;visibility:hidden",
- m.container.appendChild(v));
+ s.isOpera && (v.style.cssText = "width:1px;height:1px;position:fixed;top:0;left:0;z-index:2147483647;opacity:0;");
var b = [ "dragWait", "dragWaitEnd", "startDrag", "dragReadyEnd", "onMouseDrag" ];
b.forEach(function(t) {
e[t] = this[t];
}, this), m.addEventListener("mousedown", this.onMouseDown.bind(e));
- var y, w, C, x, S, E, k, A, F, T, D = m.container, _ = 0;
+ var y, w, C, x, S, E, k, A, F, T, D, _ = m.container, L = 0;
this.onDragStart = function(e) {
- if (this.cancelDrag || !D.draggable) {
+ if (this.cancelDrag || !_.draggable) {
var t = this;
return setTimeout(function() {
t.startSelect(), t.captureMouse(e);
}, 0), e.preventDefault();
}
- s.isOpera && (v.style.visibility = "visible", setTimeout(function() {
- v.style.visibility = "hidden";
- }, 0)), S = m.getSelectionRange();
+ S = m.getSelectionRange();
var n = e.dataTransfer;
- n.effectAllowed = m.getReadOnly() ? "copy" : "copyMove", n.setDragImage && n.setDragImage(v, 0, 0),
- n.clearData(), n.setData("Text", m.session.getTextRange()), this.setState("drag");
+ n.effectAllowed = m.getReadOnly() ? "copy" : "copyMove", s.isOpera && (m.container.appendChild(v),
+ v._top = v.offsetTop), n.setDragImage && n.setDragImage(v, 0, 0), s.isOpera && m.container.removeChild(v),
+ n.clearData(), n.setData("Text", m.session.getTextRange()), A = !0, this.setState("drag");
}, this.onDragEnd = function(e) {
- if (D.draggable = !1, this.setState(null), !m.getReadOnly()) {
+ if (_.draggable = !1, A = !1, this.setState(null), !m.getReadOnly()) {
var t = e.dataTransfer.dropEffect;
k || "move" != t || m.session.remove(m.getSelectionRange()), m.renderer.$cursorLayer.setBlinking(!0);
}
this.editor.unsetStyle("ace_dragging");
}, this.onDragEnter = function(e) {
- return !m.getReadOnly() && f(e.dataTransfer) ? (y || d(), _++, e.dataTransfer.dropEffect = k = g(e),
+ return !m.getReadOnly() && f(e.dataTransfer) ? (y || d(), L++, e.dataTransfer.dropEffect = k = g(e),
r.preventDefault(e)) : void 0;
}, this.onDragOver = function(e) {
- return !m.getReadOnly() && f(e.dataTransfer) ? (y || (d(), _++), null !== L && (L = null),
+ return !m.getReadOnly() && f(e.dataTransfer) ? (y || (d(), L++), null !== I && (I = null),
w = e.clientX, C = e.clientY, e.dataTransfer.dropEffect = k = g(e), r.preventDefault(e)) : void 0;
}, this.onDragLeave = function(e) {
- return _--, 0 >= _ && y ? (h(), k = null, r.preventDefault(e)) : void 0;
+ return L--, 0 >= L && y ? (h(), k = null, r.preventDefault(e)) : void 0;
}, this.onDrop = function(e) {
if (y) {
- var t = e.dataTransfer, n = "drag" == this.state;
- if (n) switch (k) {
+ var t = e.dataTransfer;
+ if (A) switch (k) {
case "move":
S = S.contains(E.row, E.column) ? {
start: E,
@@ -5407,18 +5494,18 @@ function printStackTrace(e) {
case "copy":
S = m.moveText(S, E, !0);
} else {
- var i = t.getData("Text");
+ var n = t.getData("Text");
S = {
start: E,
- end: m.session.insert(E, i)
+ end: m.session.insert(E, n)
}, m.focus(), k = null;
}
return h(), r.preventDefault(e);
}
- }, r.addListener(D, "dragstart", this.onDragStart.bind(e)), r.addListener(D, "dragend", this.onDragEnd.bind(e)),
- r.addListener(D, "dragenter", this.onDragEnter.bind(e)), r.addListener(D, "dragover", this.onDragOver.bind(e)),
- r.addListener(D, "dragleave", this.onDragLeave.bind(e)), r.addListener(D, "drop", this.onDrop.bind(e));
- var L = null;
+ }, r.addListener(_, "dragstart", this.onDragStart.bind(e)), r.addListener(_, "dragend", this.onDragEnd.bind(e)),
+ r.addListener(_, "dragenter", this.onDragEnter.bind(e)), r.addListener(_, "dragover", this.onDragOver.bind(e)),
+ r.addListener(_, "dragleave", this.onDragLeave.bind(e)), r.addListener(_, "drop", this.onDrop.bind(e));
+ var I = null;
}
function i(e, t, n, i) {
return Math.sqrt(Math.pow(n - e, 2) + Math.pow(i - t, 2));
@@ -5426,7 +5513,7 @@ function printStackTrace(e) {
var o = e("../lib/dom"), r = e("../lib/event"), s = e("../lib/useragent"), a = 200, l = 200, c = 5;
(function() {
this.dragWait = function() {
- var e = new Date().getTime() - this.mousedownEvent.time;
+ var e = Date.now() - this.mousedownEvent.time;
e > this.editor.getDragDelay() && this.startDrag();
}, this.dragWaitEnd = function() {
var e = this.editor.container;
@@ -5454,11 +5541,12 @@ function printStackTrace(e) {
this.mousedownEvent = e;
var t = this.editor, n = e.inSelection(), i = e.getButton(), o = e.domEvent.detail || 1;
if (1 === o && 0 === i && n) {
- this.mousedownEvent.time = new Date().getTime();
+ if (e.editor.inMultiSelectMode && (e.getAccelKey() || e.getShiftKey())) return;
+ this.mousedownEvent.time = Date.now();
var r = e.domEvent.target || e.domEvent.srcElement;
if ("unselectable" in r && (r.unselectable = "on"), t.getDragDelay()) {
if (s.isWebKit) {
- self.cancelDrag = !0;
+ this.cancelDrag = !0;
var a = t.container;
a.draggable = !0;
}
@@ -5705,21 +5793,22 @@ function printStackTrace(e) {
this.x = e.x, this.y = e.y, this.isMousePressed = !0;
var o = this.editor.renderer;
o.$keepTextAreaAtCursor && (o.$keepTextAreaAtCursor = null);
- var r = this, s = function(e) {
- r.x = e.clientX, r.y = e.clientY, t && t(e);
- }, a = function(e) {
- clearInterval(c), l(), r[r.state + "End"] && r[r.state + "End"](e), r.$clickSelection = null,
+ var r = this, a = function(e) {
+ r.x = e.clientX, r.y = e.clientY, t && t(e), r.mouseEvent = new s(e, r.editor),
+ r.$mouseMoved = !0;
+ }, l = function(e) {
+ clearInterval(u), c(), r[r.state + "End"] && r[r.state + "End"](e), r.$clickSelection = null,
null == o.$keepTextAreaAtCursor && (o.$keepTextAreaAtCursor = !0, o.$moveTextAreaToCursor()),
- r.isMousePressed = !1, r.onMouseEvent("mouseup", e);
- }, l = function() {
- r[r.state] && r[r.state]();
+ r.isMousePressed = !1, r.$onCaptureMouseMove = r.releaseMouse = null, r.onMouseEvent("mouseup", e);
+ }, c = function() {
+ r[r.state] && r[r.state](), r.$mouseMoved = !1;
};
if (i.isOldIE && "dblclick" == e.domEvent.type) return setTimeout(function() {
- a(e);
+ l(e);
});
- n.capture(this.editor.container, s, a);
- var c = setInterval(l, 20);
- };
+ r.$onCaptureMouseMove = a, r.releaseMouse = n.capture(this.editor.container, a, l);
+ var u = setInterval(c, 20);
+ }, this.releaseMouse = null;
}).call(c.prototype), l.defineOptions(c.prototype, "mouseHandler", {
scrollSpeed: {
initialValue: 2
@@ -5732,6 +5821,9 @@ function printStackTrace(e) {
},
focusTimout: {
initialValue: 0
+ },
+ tooltipFollowsMouse: {
+ initialValue: !0
}
}), t.MouseHandler = c;
}), define("ace/mouse/fold_handler", [ "require", "exports", "module" ], function(e, t) {
@@ -5751,7 +5843,8 @@ function printStackTrace(e) {
if ("foldWidgets" == n) {
var i = t.getDocumentPosition().row, o = e.session, r = o.getParentFoldRangeData(i, !0), s = r.range || r.firstRange;
if (s) {
- var i = s.start.row, a = o.getFoldAt(i, o.getLine(i).length, 1);
+ i = s.start.row;
+ var a = o.getFoldAt(i, o.getLine(i).length, 1);
a ? o.removeFold(a) : (o.addFold("...", s), e.renderer.scrollCursorIntoView({
row: s.start.row,
column: 0
@@ -5780,6 +5873,7 @@ function printStackTrace(e) {
}
}, this.addKeyboardHandler = function(e, t) {
if (e) {
+ "function" != typeof e || e.handleKeyboard || (e.handleKeyboard = e);
var n = this.$handlers.indexOf(e);
-1 != n && this.$handlers.splice(n, 1), void 0 == t ? this.$handlers.push(e) : this.$handlers.splice(t, 0, e),
-1 == n && e.attach && e.attach(this.$editor);
@@ -5895,8 +5989,9 @@ function printStackTrace(e) {
}, this.collapseRows = function() {
return 0 == this.end.column ? new i(this.start.row, 0, Math.max(this.start.row, this.end.row - 1), 0) : new i(this.start.row, 0, this.end.row, 0);
}, this.toScreenRange = function(e) {
- var t = e.documentToScreenPosition(this.start), n = e.documentToScreenPosition(this.end);
- return new i(t.row, t.column, n.row, n.column);
+ var t = e.documentToScreenPosition(this.start), n = e.documentToScreenPosition(this.end), o = new i(t.row, t.column, n.row, n.column);
+ return o.start.columnOffset = t.columnOffset, o.end.columnOffset = n.columnOffset,
+ o;
}, this.moveBy = function(e, t) {
this.start.row += e, this.start.column += t, this.end.row += e, this.end.column += t;
};
@@ -6094,11 +6189,14 @@ function printStackTrace(e) {
this.session.$selectLongWords ? this.moveCursorLongWordRight() : this.moveCursorShortWordRight();
}, this.moveCursorWordLeft = function() {
this.session.$selectLongWords ? this.moveCursorLongWordLeft() : this.moveCursorShortWordLeft();
- }, this.moveCursorBy = function(e, t) {
- var n = this.session.documentToScreenPosition(this.lead.row, this.lead.column);
- 0 === t && (this.$desiredColumn ? n.column = this.$desiredColumn : this.$desiredColumn = n.column);
- var i = this.session.screenToDocumentPosition(n.row + e, n.column);
- this.moveCursorTo(i.row, i.column + t, 0 === t);
+ }, this.moveCursorBy = function(e, t, n) {
+ var i, o = this.session.documentToScreenPosition(this.lead.row, this.lead.column);
+ void 0 !== n && 0 !== e ? (i = n.$textLayer.textWidth(this.lead.row, o.column, o.columnOffset),
+ o.column = 0, 0 === t && (this.$desiredColumn ? i = this.$desiredColumn : this.$desiredColumn = i)) : 0 === t && (this.$desiredColumn ? o.column = this.$desiredColumn : this.$desiredColumn = o.column);
+ var r = this.session.screenToDocumentPosition(o.row + e, o.column);
+ 0 !== e && 0 === t && r.row === this.lead.row && r.column === this.lead.column && this.session.lineWidgets && this.session.lineWidgets[r.row] && r.row++,
+ void 0 !== n && 0 !== e && (r.column += n.$findColumn(r.row, i, r.column, r.rowLength)),
+ this.moveCursorTo(r.row, r.column + t, 0 === t);
}, this.moveCursorToPosition = function(e) {
this.moveCursorTo(e.row, e.column);
}, this.moveCursorTo = function(e, t, n) {
@@ -6215,7 +6313,9 @@ function printStackTrace(e) {
var i = t.slice(0);
t = i[0];
} else var i = [];
- var o = t || "start", r = this.states[o], s = this.matchMappings[o], a = this.regExps[o];
+ var o = t || "start", r = this.states[o];
+ r || (o = "start", r = this.states[o]);
+ var s = this.matchMappings[o], a = this.regExps[o];
a.lastIndex = 0;
for (var l, c = [], u = 0, d = {
type: null,
@@ -6257,7 +6357,7 @@ function printStackTrace(e) {
break;
}
}
- return d.type && c.push(d), {
+ return d.type && c.push(d), i.length > 1 && i[0] !== o && i.unshift(o), {
tokens: c,
state: i.length ? i : o
};
@@ -6286,7 +6386,7 @@ function printStackTrace(e) {
}, this.getRules = function() {
return this.$rules;
}, this.embedRules = function(e, t, i, o, r) {
- var s = new e().getRules();
+ var s = "function" == typeof e ? new e().getRules() : e;
if (o) for (var a = 0; a < o.length; a++) o[a] = t + o[a]; else {
o = [];
for (var l in s) o.push(t + l);
@@ -6297,9 +6397,9 @@ function printStackTrace(e) {
return this.$embeds;
};
var e = function(e, t) {
- return "start" != e && t.unshift(this.nextState, e), this.nextState;
+ return ("start" != e || t.length) && t.unshift(this.nextState, e), this.nextState;
}, t = function(e, t) {
- return t[0] !== e ? "start" : (t.shift(), t.shift());
+ return t.shift(), t.shift() || "start";
};
this.normalizeRules = function() {
function n(r) {
@@ -6461,7 +6561,7 @@ function printStackTrace(e) {
};
(function() {
this.tokenRe = new RegExp("^[" + r.packages.L + r.packages.Mn + r.packages.Mc + r.packages.Nd + r.packages.Pc + "\\$_]+", "g"),
- this.nonTokenRe = new RegExp("^(?:[^" + r.packages.L + r.packages.Mn + r.packages.Mc + r.packages.Nd + r.packages.Pc + "\\$_]|s])+", "g"),
+ this.nonTokenRe = new RegExp("^(?:[^" + r.packages.L + r.packages.Mn + r.packages.Mc + r.packages.Nd + r.packages.Pc + "\\$_]|\\s])+", "g"),
this.getTokenizer = function() {
return this.$tokenizer || (this.$highlightRules = new this.HighlightRules(), this.$tokenizer = new n(this.$highlightRules.getRules())),
this.$tokenizer;
@@ -6561,7 +6661,7 @@ function printStackTrace(e) {
}, this.createModeDelegates = function(e) {
this.$embeds = [], this.$modes = {};
for (var t in e) e[t] && (this.$embeds.push(t), this.$modes[t] = new e[t]());
- for (var n = [ "toggleCommentLines", "getNextLineIndent", "checkOutdent", "autoOutdent", "transformAction", "getCompletions" ], t = 0; t < n.length; t++) !function(e) {
+ for (var n = [ "toggleBlockComment", "toggleCommentLines", "getNextLineIndent", "checkOutdent", "autoOutdent", "transformAction", "getCompletions" ], t = 0; t < n.length; t++) !function(e) {
var i = n[t], o = e[i];
e[n[t]] = function() {
return this.$delegator(i, arguments, o);
@@ -6610,7 +6710,7 @@ function printStackTrace(e) {
meta: "keyword"
};
});
- };
+ }, this.$id = "ace/mode/text";
}).call(c.prototype), t.Mode = c;
}), define("ace/anchor", [ "require", "exports", "module", "./lib/oop", "./lib/event_emitter" ], function(e, t) {
var n = e("./lib/oop"), i = e("./lib/event_emitter").EventEmitter, o = t.Anchor = function(e, t, n) {
@@ -6640,7 +6740,7 @@ function printStackTrace(e) {
row: this.row,
column: this.column
};
- this.row = i.row, this.column = i.column, this._emit("change", {
+ this.row = i.row, this.column = i.column, this._signal("change", {
old: o,
value: i
});
@@ -6745,7 +6845,7 @@ function printStackTrace(e) {
range: r,
lines: t
};
- return this._emit("change", {
+ return this._signal("change", {
data: s
}), n || r.end;
}, this.insertNewLine = function(e) {
@@ -6760,7 +6860,7 @@ function printStackTrace(e) {
range: o.fromPoints(e, n),
text: this.getNewLineCharacter()
};
- return this._emit("change", {
+ return this._signal("change", {
data: i
}), n;
}, this.insertInLine = function(e, t) {
@@ -6775,11 +6875,11 @@ function printStackTrace(e) {
range: o.fromPoints(e, i),
text: t
};
- return this._emit("change", {
+ return this._signal("change", {
data: r
}), i;
}, this.remove = function(e) {
- if (!e instanceof o && (e = o.fromPoints(e.start, e.end)), e.start = this.$clipPosition(e.start),
+ if (e instanceof o || (e = o.fromPoints(e.start, e.end)), e.start = this.$clipPosition(e.start),
e.end = this.$clipPosition(e.end), e.isEmpty()) return e.start;
var t = e.start.row, n = e.end.row;
if (e.isMultiLine()) {
@@ -6797,7 +6897,7 @@ function printStackTrace(e) {
range: i,
text: s
};
- return this._emit("change", {
+ return this._signal("change", {
data: l
}), i.start;
}
@@ -6810,7 +6910,7 @@ function printStackTrace(e) {
nl: this.getNewLineCharacter(),
lines: i
};
- return this._emit("change", {
+ return this._signal("change", {
data: r
}), i;
}, this.removeNewLine = function(e) {
@@ -6821,11 +6921,11 @@ function printStackTrace(e) {
range: i,
text: this.getNewLineCharacter()
};
- this._emit("change", {
+ this._signal("change", {
data: s
});
}, this.replace = function(e, t) {
- if (!e instanceof o && (e = o.fromPoints(e.start, e.end)), 0 == t.length && e.isEmpty()) return e.start;
+ if (e instanceof o || (e = o.fromPoints(e.start, e.end)), 0 == t.length && e.isEmpty()) return e.start;
if (t == this.getTextRange(e)) return e.end;
if (this.remove(e), t) var n = this.insert(e.start, t); else n = e.start;
return n;
@@ -6882,7 +6982,7 @@ function printStackTrace(e) {
first: e,
last: t
};
- this._emit("update", {
+ this._signal("update", {
data: n
});
}, this.start = function(e) {
@@ -7196,12 +7296,17 @@ function printStackTrace(e) {
}
}
return t.column -= 1, n.column += 1, o;
- }, this.getAllFolds = function() {
- function e(e) {
- t.push(e);
- }
- for (var t = [], n = this.$foldData, i = 0; i < n.length; i++) for (var o = 0; o < n[i].folds.length; o++) e(n[i].folds[o]);
+ }, this.getFoldsInRangeList = function(e) {
+ if (Array.isArray(e)) {
+ var t = [];
+ e.forEach(function(e) {
+ t = t.concat(this.getFoldsInRange(e));
+ }, this);
+ } else var t = this.getFoldsInRange(e);
return t;
+ }, this.getAllFolds = function() {
+ for (var e = [], t = this.$foldData, n = 0; n < t.length; n++) for (var i = 0; i < t[n].folds.length; i++) e.push(t[n].folds[i]);
+ return e;
}, this.getFoldStringAt = function(e, t, n, i) {
if (i = i || this.getFoldLine(e), !i) return null;
for (var o, r, s = {
@@ -7318,8 +7423,9 @@ function printStackTrace(e) {
}, this.unfold = function(e, t) {
var n, o;
if (null == e ? (n = new i(0, 0, this.getLength(), 0), t = !0) : n = "number" == typeof e ? new i(e, 0, e, this.getLine(e).length) : "row" in e ? i.fromPoints(e, e) : e,
- o = this.getFoldsInRange(n), t) this.removeFolds(o); else for (;o.length; ) this.expandFolds(o),
- o = this.getFoldsInRange(n);
+ o = this.getFoldsInRangeList(n), t) this.removeFolds(o); else for (var r = o; r.length; ) this.expandFolds(r),
+ r = this.getFoldsInRangeList(n);
+ return o.length ? o : void 0;
}, this.isRowFolded = function(e, t) {
return !!this.getFoldLine(e, t);
}, this.getRowFoldEnd = function(e, t) {
@@ -7395,14 +7501,19 @@ function printStackTrace(e) {
}, this.foldAll = function(e, t, n) {
void 0 == n && (n = 1e5);
var i = this.foldWidgets;
- t = t || this.getLength(), e = e || 0;
- for (var o = e; t > o; o++) if (null == i[o] && (i[o] = this.getFoldWidget(o)),
- "start" == i[o]) {
- var r = this.getFoldWidgetRange(o), s = r.end.row;
- if (r && r.isMultiLine() && t >= s && r.start.row >= e) try {
- var a = this.addFold("...", r);
- a.collapseChildren = n, o = s;
- } catch (l) {}
+ if (i) {
+ t = t || this.getLength(), e = e || 0;
+ for (var o = e; t > o; o++) if (null == i[o] && (i[o] = this.getFoldWidget(o)),
+ "start" == i[o]) {
+ var r = this.getFoldWidgetRange(o);
+ if (r && r.isMultiLine() && r.end.row <= t && r.start.row >= e) {
+ o = r.end.row;
+ try {
+ var s = this.addFold("...", r);
+ s && (s.collapseChildren = n);
+ } catch (a) {}
+ }
+ }
}
}, this.$foldStyles = {
manual: 1,
@@ -7440,22 +7551,43 @@ function printStackTrace(e) {
firstRange: i
};
}, this.onFoldWidgetClick = function(e, t) {
- var n = this.getFoldWidget(e), i = this.getLine(e);
t = t.domEvent;
- var o = t.shiftKey, r = t.ctrlKey || t.metaKey, s = t.altKey, a = "end" === n ? -1 : 1, l = this.getFoldAt(e, -1 === a ? 0 : i.length, a);
- if (l) return o || r ? this.removeFold(l) : this.expandFold(l), void 0;
- var c = this.getFoldWidgetRange(e);
- if (c && !c.isMultiLine() && (l = this.getFoldAt(c.start.row, c.start.column, 1),
- l && c.isEqual(l.range))) return this.removeFold(l), void 0;
- if (s) {
- var u = this.getParentFoldRangeData(e);
- if (u.range) var d = u.range.start.row + 1, h = u.range.end.row;
- this.foldAll(d, h, r ? 1e4 : 0);
- } else if (o) {
- var h = c ? c.end.row : this.getLength();
- this.foldAll(e + 1, c.end.row, r ? 1e4 : 0);
- } else c && (r && (c.collapseChildren = 1e4), this.addFold("...", c));
- c || ((t.target || t.srcElement).className += " ace_invalid");
+ var n = {
+ children: t.shiftKey,
+ all: t.ctrlKey || t.metaKey,
+ siblings: t.altKey
+ }, i = this.$toggleFoldWidget(e, n);
+ if (!i) {
+ var o = t.target || t.srcElement;
+ o && /ace_fold-widget/.test(o.className) && (o.className += " ace_invalid");
+ }
+ }, this.$toggleFoldWidget = function(e, t) {
+ if (this.getFoldWidget) {
+ var n = this.getFoldWidget(e), i = this.getLine(e), o = "end" === n ? -1 : 1, r = this.getFoldAt(e, -1 === o ? 0 : i.length, o);
+ if (r) return t.children || t.all ? this.removeFold(r) : this.expandFold(r), void 0;
+ var s = this.getFoldWidgetRange(e, !0);
+ if (s && !s.isMultiLine() && (r = this.getFoldAt(s.start.row, s.start.column, 1),
+ r && s.isEqual(r.range))) return this.removeFold(r), void 0;
+ if (t.siblings) {
+ var a = this.getParentFoldRangeData(e);
+ if (a.range) var l = a.range.start.row + 1, c = a.range.end.row;
+ this.foldAll(l, c, t.all ? 1e4 : 0);
+ } else t.children ? (c = s ? s.end.row : this.getLength(), this.foldAll(e + 1, s.end.row, t.all ? 1e4 : 0)) : s && (t.all && (s.collapseChildren = 1e4),
+ this.addFold("...", s));
+ return s;
+ }
+ }, this.toggleFoldWidget = function() {
+ var e = this.selection.getCursor().row;
+ e = this.getRowFoldStart(e);
+ var t = this.$toggleFoldWidget(e, {});
+ if (!t) {
+ var n = this.getParentFoldRangeData(e, !0);
+ if (t = n.range || n.firstRange) {
+ e = t.start.row;
+ var i = this.getFoldAt(e, this.getLine(e).length, 1);
+ i ? this.removeFold(i) : this.addFold("...", t);
+ }
+ }
}, this.updateFoldWidgets = function(e) {
var t = e.data, n = t.range, i = n.start.row, o = n.end.row - i;
if (0 === o) this.foldWidgets[i] = null; else if ("removeText" == t.action || "removeLines" == t.action) this.foldWidgets.splice(i, o + 1, null); else {
@@ -7550,12 +7682,9 @@ function printStackTrace(e) {
return this.join("\n");
}, this.on("changeFold", this.onChangeFold.bind(this)), this.$onChange = this.onChange.bind(this),
"object" == typeof e && e.getLine || (e = new c(e)), this.setDocument(e), this.selection = new s(this),
- o.resetOptions(this), this.setMode(t), o._emit("session", this);
+ o.resetOptions(this), this.setMode(t), o._signal("session", this);
};
(function() {
- function t(e) {
- return 4352 > e ? !1 : e >= 4352 && 4447 >= e || e >= 4515 && 4519 >= e || e >= 4602 && 4607 >= e || e >= 9001 && 9002 >= e || e >= 11904 && 11929 >= e || e >= 11931 && 12019 >= e || e >= 12032 && 12245 >= e || e >= 12272 && 12283 >= e || e >= 12288 && 12350 >= e || e >= 12353 && 12438 >= e || e >= 12441 && 12543 >= e || e >= 12549 && 12589 >= e || e >= 12593 && 12686 >= e || e >= 12688 && 12730 >= e || e >= 12736 && 12771 >= e || e >= 12784 && 12830 >= e || e >= 12832 && 12871 >= e || e >= 12880 && 13054 >= e || e >= 13056 && 19903 >= e || e >= 19968 && 42124 >= e || e >= 42128 && 42182 >= e || e >= 43360 && 43388 >= e || e >= 44032 && 55203 >= e || e >= 55216 && 55238 >= e || e >= 55243 && 55291 >= e || e >= 63744 && 64255 >= e || e >= 65040 && 65049 >= e || e >= 65072 && 65106 >= e || e >= 65108 && 65126 >= e || e >= 65128 && 65131 >= e || e >= 65281 && 65376 >= e || e >= 65504 && 65510 >= e;
- }
n.implement(this, r), this.setDocument = function(e) {
this.doc && this.doc.removeListener("change", this.$onChange), this.doc = e, e.on("change", this.$onChange),
this.bgTokenizer && this.bgTokenizer.setDocument(this.getDocument()), this.resetCaches();
@@ -7587,7 +7716,7 @@ function printStackTrace(e) {
this.$fromUndo || !this.$undoManager || t.ignore || (this.$deltasDoc.push(t), n && 0 != n.length && this.$deltasFold.push({
action: "removeFolds",
folds: n
- }), this.$informUndoManager.schedule()), this.bgTokenizer.$updateOnChange(t), this._emit("change", e);
+ }), this.$informUndoManager.schedule()), this.bgTokenizer.$updateOnChange(t), this._signal("change", e);
}, this.setValue = function(e) {
this.doc.setValue(e), this.selection.moveCursorTo(0, 0), this.selection.clearSelection(),
this.$resetRowCache(0), this.$deltas = [], this.$deltasDoc = [], this.$deltasFold = [],
@@ -7651,22 +7780,22 @@ function printStackTrace(e) {
this.setOverwrite(!this.$overwrite);
}, this.addGutterDecoration = function(e, t) {
this.$decorations[e] || (this.$decorations[e] = ""), this.$decorations[e] += " " + t,
- this._emit("changeBreakpoint", {});
+ this._signal("changeBreakpoint", {});
}, this.removeGutterDecoration = function(e, t) {
- this.$decorations[e] = (this.$decorations[e] || "").replace(" " + t, ""), this._emit("changeBreakpoint", {});
+ this.$decorations[e] = (this.$decorations[e] || "").replace(" " + t, ""), this._signal("changeBreakpoint", {});
}, this.getBreakpoints = function() {
return this.$breakpoints;
}, this.setBreakpoints = function(e) {
this.$breakpoints = [];
for (var t = 0; t < e.length; t++) this.$breakpoints[e[t]] = "ace_breakpoint";
- this._emit("changeBreakpoint", {});
+ this._signal("changeBreakpoint", {});
}, this.clearBreakpoints = function() {
- this.$breakpoints = [], this._emit("changeBreakpoint", {});
+ this.$breakpoints = [], this._signal("changeBreakpoint", {});
}, this.setBreakpoint = function(e, t) {
void 0 === t && (t = "ace_breakpoint"), t ? this.$breakpoints[e] = t : delete this.$breakpoints[e],
- this._emit("changeBreakpoint", {});
+ this._signal("changeBreakpoint", {});
}, this.clearBreakpoint = function(e) {
- delete this.$breakpoints[e], this._emit("changeBreakpoint", {});
+ delete this.$breakpoints[e], this._signal("changeBreakpoint", {});
}, this.addMarker = function(e, t, n, i) {
var o = this.$markerId++, r = {
range: e,
@@ -7676,19 +7805,19 @@ function printStackTrace(e) {
inFront: !!i,
id: o
};
- return i ? (this.$frontMarkers[o] = r, this._emit("changeFrontMarker")) : (this.$backMarkers[o] = r,
- this._emit("changeBackMarker")), o;
+ return i ? (this.$frontMarkers[o] = r, this._signal("changeFrontMarker")) : (this.$backMarkers[o] = r,
+ this._signal("changeBackMarker")), o;
}, this.addDynamicMarker = function(e, t) {
if (e.update) {
var n = this.$markerId++;
- return e.id = n, e.inFront = !!t, t ? (this.$frontMarkers[n] = e, this._emit("changeFrontMarker")) : (this.$backMarkers[n] = e,
- this._emit("changeBackMarker")), e;
+ return e.id = n, e.inFront = !!t, t ? (this.$frontMarkers[n] = e, this._signal("changeFrontMarker")) : (this.$backMarkers[n] = e,
+ this._signal("changeBackMarker")), e;
}
}, this.removeMarker = function(e) {
var t = this.$frontMarkers[e] || this.$backMarkers[e];
if (t) {
var n = t.inFront ? this.$frontMarkers : this.$backMarkers;
- t && (delete n[e], this._emit(t.inFront ? "changeFrontMarker" : "changeBackMarker"));
+ t && (delete n[e], this._signal(t.inFront ? "changeFrontMarker" : "changeBackMarker"));
}
}, this.getMarkers = function(e) {
return e ? this.$frontMarkers : this.$backMarkers;
@@ -7703,7 +7832,7 @@ function printStackTrace(e) {
var o = new l(e, 0, t, 1/0);
return o.id = this.addMarker(o, n, "fullLine", i), o;
}, this.setAnnotations = function(e) {
- this.$annotations = e, this._emit("changeAnnotation", {});
+ this.$annotations = e, this._signal("changeAnnotation", {});
}, this.getAnnotations = function() {
return this.$annotations || [];
}, this.clearAnnotations = function() {
@@ -7735,7 +7864,7 @@ function printStackTrace(e) {
return this.$useWorker;
}, this.onReloadTokenizer = function(e) {
var t = e.data;
- this.bgTokenizer.start(t.first), this._emit("tokenizerUpdate", e);
+ this.bgTokenizer.start(t.first), this._signal("tokenizerUpdate", e);
}, this.$modes = {}, this.$mode = null, this.$modeId = null, this.setMode = function(e, t) {
if (e && "object" == typeof e) {
if (e.getTokenizer) return this.$onChangeMode(e);
@@ -7760,12 +7889,12 @@ function printStackTrace(e) {
this.bgTokenizer = new u(n);
var o = this;
this.bgTokenizer.addEventListener("update", function(e) {
- o._emit("tokenizerUpdate", e);
+ o._signal("tokenizerUpdate", e);
});
}
this.bgTokenizer.setDocument(this.getDocument()), this.tokenRe = e.tokenRe, this.nonTokenRe = e.nonTokenRe,
- this.$options.wrapMethod.set.call(this, this.$wrapMethod), t || (this.$setFolding(e.foldingRules),
- this._emit("changeMode"), this.bgTokenizer.start(0));
+ t || (this.$options.wrapMethod.set.call(this, this.$wrapMethod), this.$setFolding(e.foldingRules),
+ this.bgTokenizer.start(0), this._emit("changeMode"));
}
}, this.$stopWorker = function() {
this.$worker && this.$worker.terminate(), this.$worker = null;
@@ -7786,7 +7915,13 @@ function printStackTrace(e) {
}, this.getScrollLeft = function() {
return this.$scrollLeft;
}, this.getScreenWidth = function() {
- return this.$computeWidth(), this.screenWidth;
+ return this.$computeWidth(), this.lineWidgets ? Math.max(this.getLineWidgetMaxWidth(), this.screenWidth) : this.screenWidth;
+ }, this.getLineWidgetMaxWidth = function() {
+ if (null != this.lineWidgetsWidth) return this.lineWidgetsWidth;
+ var e = 0;
+ return this.lineWidgets.forEach(function(t) {
+ t && t.screenWidth > e && (e = t.screenWidth);
+ }), this.lineWidgetWidth = e;
}, this.$computeWidth = function(e) {
if (this.$modified || e) {
if (this.$modified = !1, this.$useWrapMode) return this.screenWidth = this.$wrapLimit;
@@ -7939,7 +8074,7 @@ function printStackTrace(e) {
for (var n = 0; t > n; n++) this.$wrapData.push([]);
this.$updateWrapData(0, t - 1);
}
- this._emit("changeWrapMode");
+ this._signal("changeWrapMode");
}
}, this.getUseWrapMode = function() {
return this.$useWrapMode;
@@ -7947,7 +8082,7 @@ function printStackTrace(e) {
(this.$wrapLimitRange.min !== e || this.$wrapLimitRange.max !== t) && (this.$wrapLimitRange = {
min: e,
max: t
- }, this.$modified = !0, this._emit("changeWrapMode"));
+ }, this.$modified = !0, this._signal("changeWrapMode"));
}, this.adjustWrapLimit = function(e, t) {
var n = this.$wrapLimitRange;
n.max < 0 && (n = {
@@ -7957,7 +8092,7 @@ function printStackTrace(e) {
var i = this.$constrainWrapLimit(e, n.min, n.max);
return i != this.$wrapLimit && i > 1 ? (this.$wrapLimit = i, this.$modified = !0,
this.$useWrapMode && (this.$updateWrapData(0, this.getLength() - 1), this.$resetRowCache(0),
- this._emit("changeWrapLimit")), !0) : !1;
+ this._signal("changeWrapLimit")), !0) : !1;
}, this.$constrainWrapLimit = function(e, t, n) {
return t && (e = Math.max(t, e)), n && (e = Math.min(n, e)), e;
}, this.getWrapLimit = function() {
@@ -8017,48 +8152,46 @@ function printStackTrace(e) {
}, this.$updateRowLengthCache = function(e, t) {
this.$rowLengthCache[e] = null, this.$rowLengthCache[t] = null;
}, this.$updateWrapData = function(e, t) {
- var n, i, o = this.doc.getAllLines(), r = this.getTabSize(), s = this.$wrapData, a = this.$wrapLimit, l = e;
- for (t = Math.min(t, o.length - 1); t >= l; ) i = this.getFoldLine(l, i), i ? (n = [],
+ var n, i, o = this.doc.getAllLines(), r = this.getTabSize(), a = this.$wrapData, l = this.$wrapLimit, u = e;
+ for (t = Math.min(t, o.length - 1); t >= u; ) i = this.getFoldLine(u, i), i ? (n = [],
i.walk(function(e, t, i, r) {
- var s;
+ var a;
if (null != e) {
- s = this.$getDisplayTokens(e, n.length), s[0] = h;
- for (var a = 1; a < s.length; a++) s[a] = p;
- } else s = this.$getDisplayTokens(o[t].substring(r, i), n.length);
- n = n.concat(s);
- }.bind(this), i.end.row, o[i.end.row].length + 1), s[i.start.row] = this.$computeWrapSplits(n, a, r),
- l = i.end.row + 1) : (n = this.$getDisplayTokens(o[l]), s[l] = this.$computeWrapSplits(n, a, r),
- l++);
+ a = this.$getDisplayTokens(e, n.length), a[0] = s;
+ for (var l = 1; l < a.length; l++) a[l] = c;
+ } else a = this.$getDisplayTokens(o[t].substring(r, i), n.length);
+ n = n.concat(a);
+ }.bind(this), i.end.row, o[i.end.row].length + 1), a[i.start.row] = this.$computeWrapSplits(n, l, r),
+ u = i.end.row + 1) : (n = this.$getDisplayTokens(o[u]), a[u] = this.$computeWrapSplits(n, l, r),
+ u++);
};
- var s = 1, c = 2, h = 3, p = 4, f = 9, g = 10, m = 11, v = 12;
+ var t = 1, s = 3, c = 4, h = 9, p = 10, f = 11, g = 12;
this.$computeWrapSplits = function(e, t) {
function n(t) {
var n = e.slice(r, t), o = n.length;
n.join("").replace(/12/g, function() {
o -= 1;
- }).replace(/2/g, function() {
- o -= 1;
- }), s += o, i.push(s), r = t;
+ }), a += o, i.push(a), r = t;
}
if (0 == e.length) return [];
- for (var i = [], o = e.length, r = 0, s = 0, a = this.$wrapAsCode; o - r > t; ) {
- var l = r + t;
- if (e[l - 1] >= g && e[l] >= g) n(l); else if (e[l] != h && e[l] != p) {
- for (var c = Math.max(l - (a ? 10 : t - (t >> 2)), r - 1); l > c && e[l] < h; ) l--;
- if (a) {
- for (;l > c && e[l] < h; ) l--;
- for (;l > c && e[l] == f; ) l--;
- } else for (;l > c && e[l] < g; ) l--;
- l > c ? n(++l) : (l = r + t, n(l));
+ for (var i = [], o = e.length, r = 0, a = 0, l = this.$wrapAsCode; o - r > t; ) {
+ var u = r + t;
+ if (e[u - 1] >= p && e[u] >= p) n(u); else if (e[u] != s && e[u] != c) {
+ for (var d = Math.max(u - (l ? 10 : t - (t >> 2)), r - 1); u > d && e[u] < s; ) u--;
+ if (l) {
+ for (;u > d && e[u] < s; ) u--;
+ for (;u > d && e[u] == h; ) u--;
+ } else for (;u > d && e[u] < p; ) u--;
+ u > d ? n(++u) : (u = r + t, n(u));
} else {
- for (l; l != r - 1 && e[l] != h; l--) ;
- if (l > r) {
- n(l);
+ for (u; u != r - 1 && e[u] != s; u--) ;
+ if (u > r) {
+ n(u);
continue;
}
- for (l = r + t; l < e.length && e[l] == p; l++) ;
- if (l == e.length) break;
- n(l);
+ for (u = r + t; u < e.length && e[u] == c; u++) ;
+ if (u == e.length) break;
+ n(u);
}
}
return i;
@@ -8066,21 +8199,24 @@ function printStackTrace(e) {
var i, o = [];
n = n || 0;
for (var r = 0; r < e.length; r++) {
- var a = e.charCodeAt(r);
- if (9 == a) {
- i = this.getScreenTabSize(o.length + n), o.push(m);
- for (var l = 1; i > l; l++) o.push(v);
- } else 32 == a ? o.push(g) : a > 39 && 48 > a || a > 57 && 64 > a ? o.push(f) : a >= 4352 && t(a) ? o.push(s, c) : o.push(s);
+ var s = e.charCodeAt(r);
+ if (9 == s) {
+ i = this.getScreenTabSize(o.length + n), o.push(f);
+ for (var a = 1; i > a; a++) o.push(g);
+ } else 32 == s ? o.push(p) : s > 39 && 48 > s || s > 57 && 64 > s ? o.push(h) : o.push(t);
}
return o;
- }, this.$getStringScreenWidth = function(e, n, i) {
- if (0 == n) return [ 0, 0 ];
- null == n && (n = 1/0), i = i || 0;
- var o, r;
- for (r = 0; r < e.length && (o = e.charCodeAt(r), i += 9 == o ? this.getScreenTabSize(i) : o >= 4352 && t(o) ? 2 : 1,
- !(i > n)); r++) ;
- return [ i, r ];
- }, this.getRowLength = function(e) {
+ }, this.$getStringScreenWidth = function(e, t, n) {
+ if (0 == t) return [ 0, 0 ];
+ null == t && (t = 1/0), n = n || 0;
+ var i, o;
+ for (o = 0; o < e.length && (i = e.charCodeAt(o), 9 == i && (n += this.getScreenTabSize(n)),
+ n += 1, !(n > t)); o++) ;
+ return [ n, o ];
+ }, this.lineWidgets = null, this.getRowLength = function(e) {
+ if (this.lineWidgets) var t = this.lineWidgets[e] && this.lineWidgets[e].rowCount || 0; else t = 0;
+ return this.$useWrapMode && this.$wrapData[e] ? this.$wrapData[e].length + 1 + t : 1 + t;
+ }, this.getRowLineCount = function(e) {
return this.$useWrapMode && this.$wrapData[e] ? this.$wrapData[e].length + 1 : 1;
}, this.getScreenLastRowColumn = function(e) {
var t = this.screenToDocumentPosition(e, Number.MAX_VALUE);
@@ -8107,23 +8243,28 @@ function printStackTrace(e) {
var n, i, o = 0, r = 0, s = 0, a = 0, l = this.$screenRowCache, c = this.$getRowCacheIndex(l, e), u = l.length;
if (u && c >= 0) var s = l[c], o = this.$docRowCache[c], d = e > l[u - 1]; else var d = !u;
for (var h = this.getLength() - 1, p = this.getNextFoldLine(o), f = p ? p.start.row : 1/0; e >= s && (a = this.getRowLength(o),
- !(s + a - 1 >= e || o >= h)); ) s += a, o++, o > f && (o = p.end.row + 1, p = this.getNextFoldLine(o, p),
+ !(s + a > e || o >= h)); ) s += a, o++, o > f && (o = p.end.row + 1, p = this.getNextFoldLine(o, p),
f = p ? p.start.row : 1/0), d && (this.$docRowCache.push(o), this.$screenRowCache.push(s));
if (p && p.start.row <= o) n = this.getFoldDisplayLine(p), o = p.start.row; else {
if (e >= s + a || o > h) return {
row: h,
- column: this.getLine(h).length
+ column: this.getLine(h).length,
+ rowLength: i
};
n = this.getLine(o), p = null;
}
if (this.$useWrapMode) {
var g = this.$wrapData[o];
- g && (i = g[e - s], e > s && g.length && (r = g[e - s - 1] || g[g.length - 1], n = n.substring(r)));
+ if (g) {
+ var m = Math.floor(e - s);
+ i = g[m], m > 0 && g.length && (r = g[m - 1] || g[g.length - 1], n = n.substring(r));
+ }
}
return r += this.$getStringScreenWidth(n, t)[1], this.$useWrapMode && r >= i && (r = i - 1),
p ? p.idxToPosition(r) : {
row: o,
- column: r
+ column: r,
+ rowLength: i
};
}, this.documentToScreenPosition = function(e, t) {
if ("undefined" == typeof t) var n = this.$clipPositionToDocument(e.row, e.column); else n = this.$clipPositionToDocument(e, t);
@@ -8140,14 +8281,17 @@ function printStackTrace(e) {
i += this.getRowLength(a), a = s, d && (this.$docRowCache.push(a), this.$screenRowCache.push(i));
}
var f = "";
- if (h && a >= p ? (f = this.getFoldDisplayLine(h, e, t), o = h.start.row) : (f = this.getLine(e).substring(0, t),
- o = e), this.$useWrapMode) {
- for (var g = this.$wrapData[o], m = 0; f.length >= g[m]; ) i++, m++;
- f = f.substring(g[m - 1] || 0, f.length);
+ h && a >= p ? (f = this.getFoldDisplayLine(h, e, t), o = h.start.row) : (f = this.getLine(e).substring(0, t),
+ o = e);
+ var g = 0;
+ if (this.$useWrapMode) {
+ for (var m = this.$wrapData[o], v = 0; f.length >= m[v]; ) g = m[v], i++, v++;
+ f = f.substring(m[v - 1] || 0, f.length);
}
return {
row: i,
- column: this.$getStringScreenWidth(f)[0]
+ column: this.$getStringScreenWidth(f)[0],
+ columnOffset: g
};
}, this.documentToScreenColumn = function(e, t) {
return this.documentToScreenPosition(e, t).column;
@@ -8160,7 +8304,7 @@ function printStackTrace(e) {
e = this.getLength();
for (var s = this.$foldData, o = 0; o < s.length; o++) t = s[o], e -= t.end.row - t.start.row;
}
- return e;
+ return this.lineWidgets && (e += this.$getWidgetScreenLength()), e;
};
}).call(h.prototype), e("./edit_session/folding").Folding.call(h.prototype), e("./edit_session/bracket_match").BracketMatch.call(h.prototype),
o.defineOptions(h.prototype, "session", {
@@ -8176,19 +8320,20 @@ function printStackTrace(e) {
}
},
get: function() {
- return this.getUseWrapMode() ? this.getWrapLimitRange().min || "free" : "off";
+ return this.getUseWrapMode() ? -1 == this.$wrap ? "printMargin" : this.getWrapLimitRange().min ? this.$wrap : "free" : "off";
},
handlesSet: !0
},
wrapMethod: {
set: function(e) {
- this.$wrapAsCode = "auto" == e ? "text" != this.$mode.type : "text" != e;
+ e = "auto" == e ? "text" != this.$mode.type : "text" != e, e != this.$wrapAsCode && (this.$wrapAsCode = e,
+ this.$useWrapMode && (this.$modified = !0, this.$resetRowCache(0), this.$updateWrapData(0, this.getLength() - 1)));
},
initialValue: "auto"
},
firstLineNumber: {
set: function() {
- this._emit("changeBreakpoint");
+ this._signal("changeBreakpoint");
},
initialValue: 1
},
@@ -8204,14 +8349,14 @@ function printStackTrace(e) {
tabSize: {
set: function(e) {
isNaN(e) || this.$tabSize === e || (this.$modified = !0, this.$rowLengthCache = [],
- this.$tabSize = e, this._emit("changeTabSize"));
+ this.$tabSize = e, this._signal("changeTabSize"));
},
initialValue: 4,
handlesSet: !0
},
overwrite: {
set: function() {
- this._emit("changeOverwrite");
+ this._signal("changeOverwrite");
},
initialValue: !1
},
@@ -8223,6 +8368,14 @@ function printStackTrace(e) {
return this.doc.getNewLineMode();
},
handlesSet: !0
+ },
+ mode: {
+ set: function(e) {
+ this.setMode(e);
+ },
+ get: function() {
+ return this.$modeId;
+ }
}
}), t.EditSession = h;
}), define("ace/search", [ "require", "exports", "module", "./lib/lang", "./lib/oop", "./range" ], function(e, t) {
@@ -8252,19 +8405,23 @@ function printStackTrace(e) {
if (!t.needle) return [];
this.$assembleRegExp(t);
var i = t.range, r = i ? e.getLines(i.start.row, i.end.row) : e.doc.getAllLines(), s = [], a = t.re;
- if (t.$isMultiLine) for (var l = a.length, c = r.length - l, u = a.offset || 0; c >= u; u++) {
- for (var d = 0; l > d && -1 != r[u + d].search(a[d]); d++) ;
- var h = r[u], p = r[u + l - 1], f = h.match(a[0])[0].length, g = p.match(a[l - 1])[0].length;
- s.push(new o(u, h.length - f, u + l - 1, g));
- } else for (var m = 0; m < r.length; m++) for (var v = n.getMatchOffsets(r[m], a), d = 0; d < v.length; d++) {
- var b = v[d];
- s.push(new o(m, b.offset, m, b.offset + b.length));
+ if (t.$isMultiLine) {
+ var l, c = a.length, u = r.length - c;
+ e: for (var d = a.offset || 0; u >= d; d++) {
+ for (var h = 0; c > h; h++) if (-1 == r[d + h].search(a[h])) continue e;
+ var p = r[d], f = r[d + c - 1], g = p.length - p.match(a[0])[0].length, m = f.match(a[c - 1])[0].length;
+ l && l.end.row === d && l.end.column > g || (s.push(l = new o(d, g, d + c - 1, m)),
+ c > 2 && (d = d + c - 2));
+ }
+ } else for (var v = 0; v < r.length; v++) for (var b = n.getMatchOffsets(r[v], a), h = 0; h < b.length; h++) {
+ var y = b[h];
+ s.push(new o(v, y.offset, v, y.offset + y.length));
}
if (i) {
- for (var y = i.start.column, w = i.start.column, m = 0, d = s.length - 1; d > m && s[m].start.column < y && s[m].start.row == i.start.row; ) m++;
- for (;d > m && s[d].end.column > w && s[d].end.row == i.end.row; ) d--;
- for (s = s.slice(m, d + 1), m = 0, d = s.length; d > m; m++) s[m].start.row += i.start.row,
- s[m].end.row += i.start.row;
+ for (var w = i.start.column, C = i.start.column, v = 0, h = s.length - 1; h > v && s[v].start.column < w && s[v].start.row == i.start.row; ) v++;
+ for (;h > v && s[h].end.column > C && s[h].end.row == i.end.row; ) h--;
+ for (s = s.slice(v, h + 1), v = 0, h = s.length; h > v; v++) s[v].start.row += i.start.row,
+ s[v].end.row += i.start.row;
}
return s;
}, this.replace = function(e, t) {
@@ -8390,7 +8547,7 @@ function printStackTrace(e) {
if ("string" == typeof n) return this.bindKey(n, t);
"function" == typeof n && (n = {
exec: n
- }), n.name || (n.name = t), this.addCommand(n);
+ }), "object" == typeof n && (n.name || (n.name = t), this.addCommand(n));
}
}, this);
}, this.removeCommands = function(e) {
@@ -8833,7 +8990,7 @@ function printStackTrace(e) {
this._signal("input", {}), this.session.bgTokenizer && this.session.bgTokenizer.scheduleStart();
}.bind(this)), this.on("change", function(e, t) {
t._$emitInputEvent.schedule(31);
- }), this.setSession(t || new u("")), m.resetOptions(this), m._emit("editor", this);
+ }), this.setSession(t || new u("")), m.resetOptions(this), m._signal("editor", this);
};
(function() {
n.implement(this, p), this.$initOperationListeners = function() {
@@ -8843,14 +9000,14 @@ function printStackTrace(e) {
this.selections = [], this.commands.on("exec", function(t) {
this.startOperation(t);
var n = t.command;
- if ("fileJump" == n.group) {
+ if ("fileJump" == n.aceCommandGroup) {
var i = this.prevOp;
- i && "fileJump" == i.command.group || (this.lastFileJumpPos = e(this.selections));
+ i && "fileJump" == i.command.aceCommandGroup || (this.lastFileJumpPos = e(this.selections));
} else this.lastFileJumpPos = null;
}.bind(this), !0), this.commands.on("afterExec", function(e) {
var t = e.command;
- return "fileJump" == t.group && this.lastFileJumpPos && !this.curOp.selectionChanged ? (this.selection.fromJSON(this.lastFileJumpPos),
- void 0) : (this.endOperation(e), void 0);
+ "fileJump" == t.aceCommandGroup && this.lastFileJumpPos && !this.curOp.selectionChanged && this.selection.fromJSON(this.lastFileJumpPos),
+ this.endOperation(e);
}.bind(this), !0), this.$opResetTimer = o.delayedCall(this.endOperation.bind(this)),
this.on("change", function() {
this.curOp || this.startOperation(), this.curOp.docChanged = !0;
@@ -8864,10 +9021,33 @@ function printStackTrace(e) {
}
e || (this.previousCommand = null, e = {}), this.$opResetTimer.schedule(), this.curOp = {
command: e.command || {},
- args: e.args
- }, this.selections.push(this.selection.toJSON());
+ args: e.args,
+ scrollTop: this.renderer.scrollTop
+ };
+ var t = this.curOp.command;
+ t && t.scrollIntoView && this.$blockScrolling++, this.selections.push(this.selection.toJSON());
}, this.endOperation = function() {
- this.curOp && (this.prevOp = this.curOp, this.curOp = null);
+ if (this.curOp) {
+ var e = this.curOp.command;
+ if (e && e.scrollIntoView) {
+ switch (this.$blockScrolling--, e.scrollIntoView) {
+ case "center":
+ this.renderer.scrollCursorIntoView(null, .5);
+ break;
+
+ case "animate":
+ case "cursor":
+ this.renderer.scrollCursorIntoView();
+ break;
+
+ case "selectionPart":
+ var t = this.selection.getRange(), n = this.renderer.layerConfig;
+ (t.start.row >= n.lastRow || t.end.row <= n.firstRow) && this.renderer.scrollSelectionIntoView(this.selection.anchor, this.selection.lead);
+ }
+ "animate" == e.scrollIntoView && this.renderer.animateScrolling(this.curOp.scrollTop);
+ }
+ this.prevOp = this.curOp, this.curOp = null;
+ }
}, this.$historyTracker = function(e) {
if (this.$mergeUndoDeltas) {
var t = this.prevOp, n = [ "backspace", "del", "insertstring" ], i = t.command && e.command.name == t.command.name;
@@ -8905,28 +9085,28 @@ function printStackTrace(e) {
var n = this.session.getSelection();
n.removeEventListener("changeCursor", this.$onCursorChange), n.removeEventListener("changeSelection", this.$onSelectionChange);
}
- this.session = e, this.$onDocumentChange = this.onDocumentChange.bind(this), e.addEventListener("change", this.$onDocumentChange),
- this.renderer.setSession(e), this.$onChangeMode = this.onChangeMode.bind(this),
- e.addEventListener("changeMode", this.$onChangeMode), this.$onTokenizerUpdate = this.onTokenizerUpdate.bind(this),
- e.addEventListener("tokenizerUpdate", this.$onTokenizerUpdate), this.$onChangeTabSize = this.renderer.onChangeTabSize.bind(this.renderer),
- e.addEventListener("changeTabSize", this.$onChangeTabSize), this.$onChangeWrapLimit = this.onChangeWrapLimit.bind(this),
- e.addEventListener("changeWrapLimit", this.$onChangeWrapLimit), this.$onChangeWrapMode = this.onChangeWrapMode.bind(this),
- e.addEventListener("changeWrapMode", this.$onChangeWrapMode), this.$onChangeFold = this.onChangeFold.bind(this),
- e.addEventListener("changeFold", this.$onChangeFold), this.$onChangeFrontMarker = this.onChangeFrontMarker.bind(this),
- this.session.addEventListener("changeFrontMarker", this.$onChangeFrontMarker), this.$onChangeBackMarker = this.onChangeBackMarker.bind(this),
- this.session.addEventListener("changeBackMarker", this.$onChangeBackMarker), this.$onChangeBreakpoint = this.onChangeBreakpoint.bind(this),
- this.session.addEventListener("changeBreakpoint", this.$onChangeBreakpoint), this.$onChangeAnnotation = this.onChangeAnnotation.bind(this),
- this.session.addEventListener("changeAnnotation", this.$onChangeAnnotation), this.$onCursorChange = this.onCursorChange.bind(this),
- this.session.addEventListener("changeOverwrite", this.$onCursorChange), this.$onScrollTopChange = this.onScrollTopChange.bind(this),
- this.session.addEventListener("changeScrollTop", this.$onScrollTopChange), this.$onScrollLeftChange = this.onScrollLeftChange.bind(this),
- this.session.addEventListener("changeScrollLeft", this.$onScrollLeftChange), this.selection = e.getSelection(),
- this.selection.addEventListener("changeCursor", this.$onCursorChange), this.$onSelectionChange = this.onSelectionChange.bind(this),
- this.selection.addEventListener("changeSelection", this.$onSelectionChange), this.onChangeMode(),
- this.$blockScrolling += 1, this.onCursorChange(), this.$blockScrolling -= 1, this.onScrollTopChange(),
- this.onScrollLeftChange(), this.onSelectionChange(), this.onChangeFrontMarker(),
+ this.session = e, e.$renderer = this.renderer, this.$onDocumentChange = this.onDocumentChange.bind(this),
+ e.addEventListener("change", this.$onDocumentChange), this.renderer.setSession(e),
+ this.$onChangeMode = this.onChangeMode.bind(this), e.addEventListener("changeMode", this.$onChangeMode),
+ this.$onTokenizerUpdate = this.onTokenizerUpdate.bind(this), e.addEventListener("tokenizerUpdate", this.$onTokenizerUpdate),
+ this.$onChangeTabSize = this.renderer.onChangeTabSize.bind(this.renderer), e.addEventListener("changeTabSize", this.$onChangeTabSize),
+ this.$onChangeWrapLimit = this.onChangeWrapLimit.bind(this), e.addEventListener("changeWrapLimit", this.$onChangeWrapLimit),
+ this.$onChangeWrapMode = this.onChangeWrapMode.bind(this), e.addEventListener("changeWrapMode", this.$onChangeWrapMode),
+ this.$onChangeFold = this.onChangeFold.bind(this), e.addEventListener("changeFold", this.$onChangeFold),
+ this.$onChangeFrontMarker = this.onChangeFrontMarker.bind(this), this.session.addEventListener("changeFrontMarker", this.$onChangeFrontMarker),
+ this.$onChangeBackMarker = this.onChangeBackMarker.bind(this), this.session.addEventListener("changeBackMarker", this.$onChangeBackMarker),
+ this.$onChangeBreakpoint = this.onChangeBreakpoint.bind(this), this.session.addEventListener("changeBreakpoint", this.$onChangeBreakpoint),
+ this.$onChangeAnnotation = this.onChangeAnnotation.bind(this), this.session.addEventListener("changeAnnotation", this.$onChangeAnnotation),
+ this.$onCursorChange = this.onCursorChange.bind(this), this.session.addEventListener("changeOverwrite", this.$onCursorChange),
+ this.$onScrollTopChange = this.onScrollTopChange.bind(this), this.session.addEventListener("changeScrollTop", this.$onScrollTopChange),
+ this.$onScrollLeftChange = this.onScrollLeftChange.bind(this), this.session.addEventListener("changeScrollLeft", this.$onScrollLeftChange),
+ this.selection = e.getSelection(), this.selection.addEventListener("changeCursor", this.$onCursorChange),
+ this.$onSelectionChange = this.onSelectionChange.bind(this), this.selection.addEventListener("changeSelection", this.$onSelectionChange),
+ this.onChangeMode(), this.$blockScrolling += 1, this.onCursorChange(), this.$blockScrolling -= 1,
+ this.onScrollTopChange(), this.onScrollLeftChange(), this.onSelectionChange(), this.onChangeFrontMarker(),
this.onChangeBackMarker(), this.onChangeBreakpoint(), this.onChangeAnnotation(),
this.session.getUseWrapMode() && this.renderer.adjustWrapLimit(), this.renderer.updateFull(),
- this._emit("changeSession", {
+ this._signal("changeSession", {
session: e,
oldSession: t
});
@@ -8985,7 +9165,7 @@ function printStackTrace(e) {
}, this.onDocumentChange = function(e) {
var t, n = e.data, i = n.range;
t = i.start.row == i.end.row && "insertLines" != n.action && "removeLines" != n.action ? i.end.row : 1/0,
- this.renderer.updateLines(i.start.row, t), this._emit("change", e), this.$cursorChange();
+ this.renderer.updateLines(i.start.row, t), this._signal("change", e), this.$cursorChange();
}, this.onTokenizerUpdate = function(e) {
var t = e.data;
this.renderer.updateLines(t.first, t.last);
@@ -8995,7 +9175,7 @@ function printStackTrace(e) {
this.renderer.scrollToX(this.session.getScrollLeft());
}, this.onCursorChange = function() {
this.$cursorChange(), this.$blockScrolling || this.renderer.scrollCursorIntoView(),
- this.$highlightBrackets(), this.$updateHighlightActiveLine(), this._emit("changeSelection");
+ this.$highlightBrackets(), this.$updateHighlightActiveLine(), this._signal("changeSelection");
}, this.$updateHighlightActiveLine = function() {
var e, t = this.getSession();
if (this.$highlightActiveLine && ("line" == this.$selectionStyle && this.selection.isMultiLine() || (e = this.getCursorPosition()),
@@ -9004,7 +9184,7 @@ function printStackTrace(e) {
var n = new h(e.row, e.column, e.row, 1/0);
n.id = t.addMarker(n, "ace_active-line", "screenLine"), t.$highlightLineMarker = n;
} else e && (t.$highlightLineMarker.start.row = e.row, t.$highlightLineMarker.end.row = e.row,
- t.$highlightLineMarker.start.column = e.column, t._emit("changeBackMarker"));
+ t.$highlightLineMarker.start.column = e.column, t._signal("changeBackMarker"));
}, this.onSelectionChange = function() {
var e = this.session;
if (e.$selectionMarker && e.removeMarker(e.$selectionMarker), e.$selectionMarker = null,
@@ -9013,7 +9193,7 @@ function printStackTrace(e) {
e.$selectionMarker = e.addMarker(t, "ace_selection", n);
}
var i = this.$highlightSelectedWord && this.$getSelectionHighLightRegexp();
- this.session.highlight(i), this._emit("changeSelection");
+ this.session.highlight(i), this._signal("changeSelection");
}, this.$getSelectionHighLightRegexp = function() {
var e = this.session, t = this.getSelectionRange();
if (!t.isEmpty() && !t.isMultiLine()) {
@@ -9054,7 +9234,12 @@ function printStackTrace(e) {
}, this.onCut = function() {
this.commands.exec("cut", this);
}, this.onPaste = function(e) {
- this.$readOnly || (this._emit("paste", e), this.insert(e));
+ if (!this.$readOnly) {
+ var t = {
+ text: e
+ };
+ this._signal("paste", t), this.insert(t.text, !0);
+ }
}, this.execCommand = function(e, t) {
this.commands.exec(e, this, t);
}, this.insert = function(e) {
@@ -9170,7 +9355,7 @@ function printStackTrace(e) {
var t = this.getSelectionRange();
if (this.getBehavioursEnabled()) {
var n = this.session, i = n.getState(t.start.row), o = n.getMode().transformAction(i, "deletion", this, n, t);
- if (0 == t.end.column) {
+ if (0 === t.end.column) {
var r = n.getTextRange(t);
if ("\n" == r[r.length - 1]) {
var s = n.getLine(t.end.row);
@@ -9325,11 +9510,8 @@ function printStackTrace(e) {
var r = t.rangeList.ranges;
t.rangeList.detach(this.session);
for (var s = r.length; s--; ) {
- for (var a = s, i = r[s].collapseRows(), l = i.end.row, c = i.start.row; s--; ) {
- var i = r[s].collapseRows();
- if (!(c - i.end.row <= 1)) break;
- c = i.end.row;
- }
+ for (var a = s, i = r[s].collapseRows(), l = i.end.row, c = i.start.row; s-- && (i = r[s].collapseRows(),
+ c - i.end.row <= 1); ) c = i.end.row;
s++;
for (var o = e.call(this, c, l); a >= s; ) r[a].moveBy(o, 0), a--;
}
@@ -9338,8 +9520,8 @@ function printStackTrace(e) {
}, this.$getSelectedRows = function() {
var e = this.getSelectionRange().collapseRows();
return {
- first: e.start.row,
- last: e.end.row
+ first: this.session.getRowFoldStart(e.start.row),
+ last: this.session.getRowFoldEnd(e.end.row)
};
}, this.onCompositionStart = function() {
this.renderer.showComposition(this.getCursorPosition());
@@ -9359,9 +9541,9 @@ function printStackTrace(e) {
return this.renderer.getScrollBottomRow() - this.renderer.getScrollTopRow() + 1;
}, this.$moveByPage = function(e, t) {
var n = this.renderer, i = this.renderer.layerConfig, o = e * Math.floor(i.height / i.lineHeight);
- this.$blockScrolling++, 1 == t ? this.selection.$moveSelection(function() {
+ this.$blockScrolling++, t === !0 ? this.selection.$moveSelection(function() {
this.moveCursorBy(o, 0);
- }) : 0 == t && (this.selection.moveCursorBy(o, 0), this.selection.clearSelection()),
+ }) : t === !1 && (this.selection.moveCursorBy(o, 0), this.selection.clearSelection()),
this.$blockScrolling--;
var r = n.scrollTop;
n.scrollBy(0, o * i.lineHeight), null != t && n.scrollCursorIntoView(null, .5),
@@ -9431,13 +9613,13 @@ function printStackTrace(e) {
var t = this.selection.anchor.getPosition();
return this.moveCursorToPosition(t);
}
- this.selection.clearSelection(), e = e || 1, this.selection.moveCursorBy(-e, 0);
+ this.selection.clearSelection(), e = e || 1, this.selection.moveCursorBy(-e, 0, this.renderer);
}, this.navigateDown = function(e) {
if (this.selection.isMultiLine() && this.selection.isBackwards()) {
var t = this.selection.anchor.getPosition();
return this.moveCursorToPosition(t);
}
- this.selection.clearSelection(), e = e || 1, this.selection.moveCursorBy(e, 0);
+ this.selection.clearSelection(), e = e || 1, this.selection.moveCursorBy(e, 0, this.renderer);
}, this.navigateLeft = function(e) {
if (this.selection.isEmpty()) for (e = e || 1; e--; ) this.selection.moveCursorLeft(); else {
var t = this.getSelectionRange().start;
@@ -9455,11 +9637,9 @@ function printStackTrace(e) {
}, this.navigateLineEnd = function() {
this.selection.moveCursorLineEnd(), this.clearSelection();
}, this.navigateFileEnd = function() {
- var e = this.renderer.scrollTop;
- this.selection.moveCursorFileEnd(), this.clearSelection(), this.renderer.animateScrolling(e);
+ this.selection.moveCursorFileEnd(), this.clearSelection();
}, this.navigateFileStart = function() {
- var e = this.renderer.scrollTop;
- this.selection.moveCursorFileStart(), this.clearSelection(), this.renderer.animateScrolling(e);
+ this.selection.moveCursorFileStart(), this.clearSelection();
}, this.navigateWordRight = function() {
this.selection.moveCursorWordRight(), this.clearSelection();
}, this.navigateWordLeft = function() {
@@ -9511,7 +9691,7 @@ function printStackTrace(e) {
this.$blockScrolling += 1, this.session.unfold(e), this.selection.setSelectionRange(e),
this.$blockScrolling -= 1;
var n = this.renderer.scrollTop;
- this.renderer.scrollSelectionIntoView(e.start, e.end, .5), 0 != t && this.renderer.animateScrolling(n);
+ this.renderer.scrollSelectionIntoView(e.start, e.end, .5), t !== !1 && this.renderer.animateScrolling(n);
}, this.undo = function() {
this.$blockScrolling++, this.session.getUndoManager().undo(), this.$blockScrolling--,
this.renderer.scrollCursorIntoView(null, .5);
@@ -9519,9 +9699,9 @@ function printStackTrace(e) {
this.$blockScrolling++, this.session.getUndoManager().redo(), this.$blockScrolling--,
this.renderer.scrollCursorIntoView(null, .5);
}, this.destroy = function() {
- this.renderer.destroy(), this._emit("destroy", this);
+ this.renderer.destroy(), this._signal("destroy", this);
}, this.setAutoScrollEditorIntoView = function(e) {
- if (e !== !1) {
+ if (e) {
var t, n = this, i = !1;
this.$scrollAnchor || (this.$scrollAnchor = document.createElement("div"));
var o = this.$scrollAnchor;
@@ -9539,7 +9719,7 @@ function printStackTrace(e) {
}
});
this.setAutoScrollEditorIntoView = function(e) {
- e !== !0 && (delete this.setAutoScrollEditorIntoView, this.removeEventListener("changeSelection", r),
+ e || (delete this.setAutoScrollEditorIntoView, this.removeEventListener("changeSelection", r),
this.renderer.removeEventListener("afterRender", a), this.renderer.removeEventListener("beforeRender", s));
};
}
@@ -9550,7 +9730,7 @@ function printStackTrace(e) {
}).call(v.prototype), m.defineOptions(v.prototype, "editor", {
selectionStyle: {
set: function(e) {
- this.onSelectionChange(), this._emit("changeSelectionStyle", {
+ this.onSelectionChange(), this._signal("changeSelectionStyle", {
data: e
});
},
@@ -9591,6 +9771,11 @@ function printStackTrace(e) {
wrapBehavioursEnabled: {
initialValue: !0
},
+ autoScrollEditorIntoView: {
+ set: function(e) {
+ this.setAutoScrollEditorIntoView(e);
+ }
+ },
hScrollBarAlwaysVisible: "renderer",
vScrollBarAlwaysVisible: "renderer",
highlightGutterLine: "renderer",
@@ -9601,6 +9786,7 @@ function printStackTrace(e) {
printMargin: "renderer",
fadeFoldWidgets: "renderer",
showFoldWidgets: "renderer",
+ showLineNumbers: "renderer",
showGutter: "renderer",
displayIndentGuides: "renderer",
fontSize: "renderer",
@@ -9609,10 +9795,12 @@ function printStackTrace(e) {
minLines: "renderer",
scrollPastEnd: "renderer",
fixedWidthGutter: "renderer",
+ theme: "renderer",
scrollSpeed: "$mouseHandler",
dragDelay: "$mouseHandler",
dragEnabled: "$mouseHandler",
focusTimout: "$mouseHandler",
+ tooltipFollowsMouse: "$mouseHandler",
firstLineNumber: "session",
overwrite: "session",
newLineMode: "session",
@@ -9620,7 +9808,8 @@ function printStackTrace(e) {
useSoftTabs: "session",
tabSize: "session",
wrap: "session",
- foldStyle: "session"
+ foldStyle: "session",
+ mode: "session"
}), t.Editor = v;
}), define("ace/undomanager", [ "require", "exports", "module" ], function(e, t) {
var n = function() {
@@ -9629,7 +9818,7 @@ function printStackTrace(e) {
(function() {
this.execute = function(e) {
var t = e.args[0];
- this.$doc = e.args[1], e.merge && this.hasUndo() && (t = this.$undoStack.pop().concat(t)),
+ this.$doc = e.args[1], e.merge && this.hasUndo() && (this.dirtyCounter--, t = this.$undoStack.pop().concat(t)),
this.$undoStack.push(t), this.$redoStack = [], this.dirtyCounter < 0 && (this.dirtyCounter = 0/0),
this.dirtyCounter++;
}, this.undo = function(e) {
@@ -9671,61 +9860,71 @@ function printStackTrace(e) {
this.session.removeGutterDecoration(e, t);
}, this.setAnnotations = function(e) {
this.$annotations = [];
- for (var t, n, i = 0; i < e.length; i++) {
- var r = e[i], n = r.row, t = this.$annotations[n];
- t || (t = this.$annotations[n] = {
+ for (var t = 0; t < e.length; t++) {
+ var n = e[t], i = n.row, r = this.$annotations[i];
+ r || (r = this.$annotations[i] = {
text: []
});
- var s = r.text;
- s = s ? o.escapeHTML(s) : r.html || "", -1 === t.text.indexOf(s) && t.text.push(s);
- var a = r.type;
- "error" == a ? t.className = " ace_error" : "warning" == a && " ace_error" != t.className ? t.className = " ace_warning" : "info" != a || t.className || (t.className = " ace_info");
+ var s = n.text;
+ s = s ? o.escapeHTML(s) : n.html || "", -1 === r.text.indexOf(s) && r.text.push(s);
+ var a = n.type;
+ "error" == a ? r.className = " ace_error" : "warning" == a && " ace_error" != r.className ? r.className = " ace_warning" : "info" != a || r.className || (r.className = " ace_info");
}
}, this.$updateAnnotations = function(e) {
if (this.$annotations.length) {
var t = e.data, n = t.range, i = n.start.row, o = n.end.row - i;
if (0 === o) ; else if ("removeText" == t.action || "removeLines" == t.action) this.$annotations.splice(i, o + 1, null); else {
- var r = Array(o + 1);
+ var r = new Array(o + 1);
r.unshift(i, 1), this.$annotations.splice.apply(this.$annotations, r);
}
}
}, this.update = function(e) {
- for (var t = e.firstRow, i = e.lastRow, o = this.session.getNextFoldLine(t), r = o ? o.start.row : 1/0, s = this.$showFoldWidgets && this.session.foldWidgets, a = this.session.$breakpoints, l = this.session.$decorations, c = this.session.$firstLineNumber, u = 0, d = null, h = -1, p = t; ;) {
- if (p > r && (p = o.end.row + 1, o = this.session.getNextFoldLine(p, o), r = o ? o.start.row : 1/0),
- p > i) {
- for (;this.$cells.length > h + 1; ) d = this.$cells.pop(), this.element.removeChild(d.element);
+ for (var t = this.session, i = e.firstRow, o = Math.min(e.lastRow + 1, t.getLength() - 1), r = t.getNextFoldLine(i), s = r ? r.start.row : 1/0, a = this.$showFoldWidgets && t.foldWidgets, l = t.$breakpoints, c = t.$decorations, u = t.$firstLineNumber, d = 0, h = t.gutterRenderer || this.$renderer, p = null, f = -1, g = i; ;) {
+ if (g > s && (g = r.end.row + 1, r = t.getNextFoldLine(g, r), s = r ? r.start.row : 1/0),
+ g > o) {
+ for (;this.$cells.length > f + 1; ) p = this.$cells.pop(), this.element.removeChild(p.element);
break;
}
- d = this.$cells[++h], d || (d = {
+ p = this.$cells[++f], p || (p = {
element: null,
textNode: null,
foldWidget: null
- }, d.element = n.createElement("div"), d.textNode = document.createTextNode(""),
- d.element.appendChild(d.textNode), this.element.appendChild(d.element), this.$cells[h] = d);
- var f = "ace_gutter-cell ";
- a[p] && (f += a[p]), l[p] && (f += l[p]), this.$annotations[p] && (f += this.$annotations[p].className),
- d.element.className != f && (d.element.className = f);
- var g = this.session.getRowLength(p) * e.lineHeight + "px";
- g != d.element.style.height && (d.element.style.height = g);
- var m = u = p + c;
- if (m != d.textNode.data && (d.textNode.data = m), s) {
- var v = s[p];
- null == v && (v = s[p] = this.session.getFoldWidget(p));
+ }, p.element = n.createElement("div"), p.textNode = document.createTextNode(""),
+ p.element.appendChild(p.textNode), this.element.appendChild(p.element), this.$cells[f] = p);
+ var m = "ace_gutter-cell ";
+ l[g] && (m += l[g]), c[g] && (m += c[g]), this.$annotations[g] && (m += this.$annotations[g].className),
+ p.element.className != m && (p.element.className = m);
+ var v = t.getRowLength(g) * e.lineHeight + "px";
+ if (v != p.element.style.height && (p.element.style.height = v), a) {
+ var b = a[g];
+ null == b && (b = a[g] = t.getFoldWidget(g));
}
- if (v) {
- d.foldWidget || (d.foldWidget = n.createElement("span"), d.element.appendChild(d.foldWidget));
- var f = "ace_fold-widget ace_" + v;
- f += "start" == v && p == r && p < o.end.row ? " ace_closed" : " ace_open", d.foldWidget.className != f && (d.foldWidget.className = f);
- var g = e.lineHeight + "px";
- d.foldWidget.style.height != g && (d.foldWidget.style.height = g);
- } else null != d.foldWidget && (d.element.removeChild(d.foldWidget), d.foldWidget = null);
- p++;
+ if (b) {
+ p.foldWidget || (p.foldWidget = n.createElement("span"), p.element.appendChild(p.foldWidget));
+ var m = "ace_fold-widget ace_" + b;
+ m += "start" == b && g == s && g < r.end.row ? " ace_closed" : " ace_open", p.foldWidget.className != m && (p.foldWidget.className = m);
+ var v = e.lineHeight + "px";
+ p.foldWidget.style.height != v && (p.foldWidget.style.height = v);
+ } else p.foldWidget && (p.element.removeChild(p.foldWidget), p.foldWidget = null);
+ var y = d = h ? h.getText(t, g) : g + u;
+ y != p.textNode.data && (p.textNode.data = y), g++;
}
- this.element.style.height = e.minHeight + "px", (this.$fixedWidth || this.session.$useWrapMode) && (u = this.session.getLength());
- var b = u.toString().length * e.characterWidth, y = this.$padding || this.$computePadding();
- b += y.left + y.right, b === this.gutterWidth || isNaN(b) || (this.gutterWidth = b,
- this.element.style.width = Math.ceil(this.gutterWidth) + "px", this._emit("changeGutterWidth", b));
- }, this.$fixedWidth = !1, this.$showFoldWidgets = !0, this.setShowFoldWidgets = function(e) {
+ this.element.style.height = e.minHeight + "px", (this.$fixedWidth || t.$useWrapMode) && (d = t.getLength() + u);
+ var w = h ? h.getWidth(t, d, e) : d.toString().length * e.characterWidth, C = this.$padding || this.$computePadding();
+ w += C.left + C.right, w === this.gutterWidth || isNaN(w) || (this.gutterWidth = w,
+ this.element.style.width = Math.ceil(this.gutterWidth) + "px", this._emit("changeGutterWidth", w));
+ }, this.$fixedWidth = !1, this.$showLineNumbers = !0, this.$renderer = "", this.setShowLineNumbers = function(e) {
+ this.$renderer = !e && {
+ getWidth: function() {
+ return "";
+ },
+ getText: function() {
+ return "";
+ }
+ };
+ }, this.getShowLineNumbers = function() {
+ return this.$showLineNumbers;
+ }, this.$showFoldWidgets = !0, this.setShowFoldWidgets = function(e) {
e ? n.addCssClass(this.element, "ace_folding-enabled") : n.removeCssClass(this.element, "ace_folding-enabled"),
this.$showFoldWidgets = e, this.$padding = null;
}, this.getShowFoldWidgets = function() {
@@ -9764,38 +9963,42 @@ function printStackTrace(e) {
var o = this.markers[n];
if (o.range) {
var r = o.range.clipRows(e.firstRow, e.lastRow);
- if (!r.isEmpty()) if (r = r.toScreenRange(this.session), o.renderer) {
- var s = this.$getTop(r.start.row, e), a = this.$padding + r.start.column * e.characterWidth;
- o.renderer(t, r, a, s, e);
- } else "fullLine" == o.type ? this.drawFullLineMarker(t, r, o.clazz, e) : "screenLine" == o.type ? this.drawScreenLineMarker(t, r, o.clazz, e) : r.isMultiLine() ? "text" == o.type ? this.drawTextMarker(t, r, o.clazz, e) : this.drawMultiLineMarker(t, r, o.clazz, e) : this.drawSingleLineMarker(t, r, o.clazz + " ace_start", e);
+ if (!r.isEmpty()) {
+ var s = r;
+ if (r = r.toScreenRange(this.session), o.renderer) {
+ var a = this.$getTop(r.start.row, e), l = this.$padding + e.textWidth(s.start.row, r.start.column, r.start.columnOffset);
+ o.renderer(t, r, l, a, e);
+ } else "fullLine" == o.type ? this.drawFullLineMarker(t, s, r, o.clazz, e) : "screenLine" == o.type ? this.drawScreenLineMarker(t, s, r, o.clazz, e) : r.isMultiLine() ? "text" == o.type ? this.drawTextMarker(t, s, r, o.clazz, e) : this.drawMultiLineMarker(t, s, r, o.clazz, e) : this.drawSingleLineMarker(t, s, r, o.clazz + " ace_start", e);
+ }
} else o.update(t, this, this.session, e);
}
this.element = i.setInnerHtml(this.element, t.join(""));
}
}, this.$getTop = function(e, t) {
return (e - t.firstRowScreen) * t.lineHeight;
- }, this.drawTextMarker = function(e, t, i, o, r) {
- var s = t.start.row, a = new n(s, t.start.column, s, this.session.getScreenLastRowColumn(s));
- for (this.drawSingleLineMarker(e, a, i + " ace_start", o, 1, r), s = t.end.row,
- a = new n(s, 0, s, t.end.column), this.drawSingleLineMarker(e, a, i, o, 0, r), s = t.start.row + 1; s < t.end.row; s++) a.start.row = s,
- a.end.row = s, a.end.column = this.session.getScreenLastRowColumn(s), this.drawSingleLineMarker(e, a, i, o, 1, r);
- }, this.drawMultiLineMarker = function(e, t, n, i, o) {
- var r = this.$padding, s = i.lineHeight, a = this.$getTop(t.start.row, i), l = r + t.start.column * i.characterWidth;
- o = o || "", e.push("
"),
- a = this.$getTop(t.end.row, i);
- var c = t.end.column * i.characterWidth;
- e.push(""),
- s = (t.end.row - t.start.row - 1) * i.lineHeight, 0 > s || (a = this.$getTop(t.start.row + 1, i),
- e.push(""));
- }, this.drawSingleLineMarker = function(e, t, n, i, o, r) {
- var s = i.lineHeight, a = (t.end.column + (o || 0) - t.start.column) * i.characterWidth, l = this.$getTop(t.start.row, i), c = this.$padding + t.start.column * i.characterWidth;
- e.push("");
- }, this.drawFullLineMarker = function(e, t, n, i, o) {
- var r = this.$getTop(t.start.row, i), s = i.lineHeight;
- t.start.row != t.end.row && (s += this.$getTop(t.end.row, i) - r), e.push("");
- }, this.drawScreenLineMarker = function(e, t, n, i, o) {
- var r = this.$getTop(t.start.row, i), s = i.lineHeight;
- e.push("");
+ }, this.drawTextMarker = function(e, t, i, o, r, s) {
+ var a = i.start.row, l = new n(a, i.start.column, a, this.session.getScreenLastRowColumn(a));
+ for (this.drawSingleLineMarker(e, t, l, o + " ace_start", r, 1, s), a = i.end.row,
+ l = new n(a, 0, a, i.end.column), this.drawSingleLineMarker(e, t, l, o, r, 0, s),
+ a = i.start.row + 1; a < i.end.row; a++) l.start.row = a, l.end.row = a, l.end.column = this.session.getScreenLastRowColumn(a),
+ this.drawSingleLineMarker(e, t, l, o, r, 1, s);
+ }, this.drawMultiLineMarker = function(e, t, n, i, o, r) {
+ var s = this.$padding, a = o.lineHeight, l = o.textWidth(t.start.row, n.start.column, n.start.columnOffset), c = s + l, u = o.width - l, d = this.$getTop(n.start.row, o);
+ r = r || "", e.push(""),
+ d = this.$getTop(n.end.row, o);
+ var u = o.textWidth(t.end.row, n.end.column, n.end.columnOffset);
+ e.push(""),
+ a = (n.end.row - n.start.row - 1) * o.lineHeight, 0 > a || (d = this.$getTop(n.start.row + 1, o),
+ e.push(""));
+ }, this.drawSingleLineMarker = function(e, t, n, i, o, r, s) {
+ var a = o.lineHeight, l = o.textWidth(t.start.row, n.start.column, n.start.columnOffset), c = o.textWidth(t.start.row, n.end.column + (r || 0), n.start.columnOffset) - l, u = this.$getTop(n.start.row, o), d = this.$padding + l;
+ e.push("");
+ }, this.drawFullLineMarker = function(e, t, n, i, o, r) {
+ var s = this.$getTop(n.start.row, o), a = o.lineHeight;
+ n.start.row != n.end.row && (a += this.$getTop(n.end.row, o) - s), e.push("");
+ }, this.drawScreenLineMarker = function(e, t, n, i, o, r) {
+ var s = this.$getTop(n.start.row, o), a = o.lineHeight;
+ e.push("");
};
}).call(o.prototype), t.Marker = o;
}), define("ace/layer/text", [ "require", "exports", "module", "../lib/oop", "../lib/dom", "../lib/lang", "../lib/useragent", "../lib/event_emitter" ], function(e, t) {
@@ -9909,7 +10112,8 @@ function printStackTrace(e) {
var d = s[a++];
if (d) {
var h = [];
- this.$renderLine(h, l, !this.$useLineGroups(), l == u ? c : !1), i.setInnerHtml(d, h.join(""));
+ this.$renderLine(h, l, !this.$useLineGroups(), l == u ? c : !1), d.style.height = e.lineHeight * this.session.getRowLength(l) + "px",
+ i.setInnerHtml(d, h.join(""));
}
l++;
}
@@ -9934,7 +10138,7 @@ function printStackTrace(e) {
r > n) break;
var l = i.createElement("div"), c = [];
if (this.$renderLine(c, r, !1, r == a ? s : !1), l.innerHTML = c.join(""), this.$useLineGroups()) l.className = "ace_line_group",
- o.appendChild(l); else for (var u = l.childNodes; u.length; ) o.appendChild(u[0]);
+ o.appendChild(l), l.style.height = e.lineHeight * this.session.getRowLength(r) + "px"; else for (;l.firstChild; ) o.appendChild(l.firstChild);
r++;
}
return o;
@@ -9943,8 +10147,9 @@ function printStackTrace(e) {
for (var t = [], n = e.firstRow, o = e.lastRow, r = n, s = this.session.getNextFoldLine(r), a = s ? s.start.row : 1/0; ;) {
if (r > a && (r = s.end.row + 1, s = this.session.getNextFoldLine(r, s), a = s ? s.start.row : 1/0),
r > o) break;
- this.$useLineGroups() && t.push(""), this.$renderLine(t, r, !1, r == a ? s : !1),
- this.$useLineGroups() && t.push("
"), r++;
+ this.$useLineGroups() && t.push(""),
+ this.$renderLine(t, r, !1, r == a ? s : !1), this.$useLineGroups() && t.push("
"),
+ r++;
}
this.element = i.setInnerHtml(this.element, t.join(""));
}, this.$textToken = {
@@ -9952,7 +10157,7 @@ function printStackTrace(e) {
rparen: !0,
lparen: !0
}, this.$renderToken = function(e, t, n, i) {
- var r = this, s = /\t|&|<|( +)|([\x00-\x1f\x80-\xa0\u1680\u180E\u2000-\u200f\u2028\u2029\u202F\u205F\u3000\uFEFF])|[\u1100-\u115F\u11A3-\u11A7\u11FA-\u11FF\u2329-\u232A\u2E80-\u2E99\u2E9B-\u2EF3\u2F00-\u2FD5\u2FF0-\u2FFB\u3000-\u303E\u3041-\u3096\u3099-\u30FF\u3105-\u312D\u3131-\u318E\u3190-\u31BA\u31C0-\u31E3\u31F0-\u321E\u3220-\u3247\u3250-\u32FE\u3300-\u4DBF\u4E00-\uA48C\uA490-\uA4C6\uA960-\uA97C\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFAFF\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE66\uFE68-\uFE6B\uFF01-\uFF60\uFFE0-\uFFE6]/g, a = function(e, n, i, s) {
+ var r = this, s = /\t|&|<|( +)|([\x00-\x1f\x80-\xa0\u1680\u180E\u2000-\u200f\u2028\u2029\u202F\u205F\uFEFF])]/g, a = function(e, n, i, s) {
if (n) return r.showInvisibles ? "" + o.stringRepeat(r.SPACE_CHAR, e.length) + "" : o.stringRepeat("Â ", e.length);
if ("&" == e) return "&";
if ("<" == e) return "<";
@@ -9960,12 +10165,7 @@ function printStackTrace(e) {
var a = r.session.getScreenTabSize(t + s);
return t += a - 1, r.$tabStrings[a];
}
- if (" " == e) {
- var l = r.showInvisibles ? "ace_cjk ace_invisible" : "ace_cjk", c = r.showInvisibles ? r.SPACE_CHAR : "";
- return t += 1, "" + c + "";
- }
- return i ? "" + r.SPACE_CHAR + "" : (t += 1,
- "" + e + "");
+ return i ? "" + r.SPACE_CHAR + "" : void 0;
}, l = i.replace(s, a);
if (this.$textToken[n.type]) e.push(l); else {
var c = "ace_" + n.type.replace(/\./g, " ace_"), u = "";
@@ -9973,6 +10173,51 @@ function printStackTrace(e) {
e.push("", l, "");
}
return t + i.length;
+ }, this.$measureText = function(e, t, n) {
+ var i = [];
+ t += n;
+ for (var o = 0, s = 0; t > o && s < e.length; ) {
+ var a = e[s++], l = this, c = /\t|&|<|( +)|([\v\f \u00a0\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u200b\u2028\u2029\u3000])/g, u = function(e, t, i, o) {
+ if (32 == e.charCodeAt(0)) return new Array(e.length + 1).join(" ");
+ if (" " == e) {
+ var s = l.session.getScreenTabSize(n + o);
+ return n += s - 1, l.$tabStrings[s];
+ }
+ if ("&" == e) return r.isOldGecko ? "&" : "&";
+ if ("<" == e) return "<";
+ if (e.match(/[\v\f \u00a0\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u200b\u2028\u2029\u3000]/)) {
+ if (l.showInvisibles) {
+ var a = new Array(e.length + 1).join(l.SPACE_CHAR);
+ return "" + a + "";
+ }
+ return " ";
+ }
+ }, d = a.value, h = n - o;
+ if (h = h > 0 ? h : 0, o += d.length, !(n > o)) {
+ o > t ? d = d.substring(h, d.length - (o - t)) : h && (d = d.substring(h));
+ var p = d.replace(c, u);
+ if (this.$textToken[a.type]) i.push(p); else {
+ var f = "ace_" + a.type.replace(/\./g, " ace_");
+ i.push("", p, "");
+ }
+ }
+ }
+ var g = document.createElement("div"), m = g.style;
+ m.position = "absolute", m.top = "-1000px", g.className = "ace_line", g.innerHTML = i.join(""),
+ this.element.appendChild(g);
+ var v = g.offsetWidth;
+ return this.element.removeChild(g), v;
+ }, this.textWidth = function(e, t, n) {
+ n = n || 0;
+ var i = this.session.getTokens(e), o = i.widthCache && i.widthCache[t] && i.widthCache[t][n];
+ if (o) {
+ if (i.widthCache.rowHeight == this.getLineHeight()) return o;
+ delete i.widthCache;
+ }
+ var r = this.$measureText(i, t, n);
+ return i.widthCache || (i.widthCache = {
+ rowHeight: this.getLineHeight()
+ }), i.widthCache[t] || (i.widthCache[t] = {}), i.widthCache[t][n] = r, r;
}, this.renderIndentGuide = function(e, t, n) {
var i = t.search(this.$indentGuideRe);
return 0 >= i || i >= n ? t : " " == t[0] ? (i -= i % this.tabSize, e.push(o.stringRepeat(this.$tabStrings[" "], i / this.tabSize)),
@@ -9998,7 +10243,7 @@ function printStackTrace(e) {
for (var r = 1; r < t.length; r++) i = t[r], o = i.value, n = this.$renderToken(e, n, i, o);
}, this.$renderLine = function(e, t, n, i) {
if (i || 0 == i || (i = this.session.getFoldLine(t)), i) var o = this.$getFoldLineTokens(t, i); else var o = this.session.getTokens(t);
- if (n || e.push(""),
+ if (n || e.push("
"),
o.length) {
var r = this.session.getRowSplitData(t);
r && r.length ? this.$renderWrappedLine(e, o, r, n) : this.$renderSimpleLine(e, o);
@@ -10039,13 +10284,19 @@ function printStackTrace(e) {
};
}).call(a.prototype), t.Text = a;
}), define("ace/layer/cursor", [ "require", "exports", "module", "../lib/dom" ], function(e, t) {
- var n = e("../lib/dom"), i = function(e) {
- this.element = n.createElement("div"), this.element.className = "ace_layer ace_cursor-layer",
- e.appendChild(this.element), this.isVisible = !1, this.isBlinking = !0, this.blinkInterval = 1e3,
- this.smoothBlinking = !1, this.cursors = [], this.cursor = this.addCursor(), n.addCssClass(this.element, "ace_hidden-cursors");
+ var n, i = e("../lib/dom"), o = function(e) {
+ this.element = i.createElement("div"), this.element.className = "ace_layer ace_cursor-layer",
+ e.appendChild(this.element), void 0 === n && (n = "opacity" in this.element), this.isVisible = !1,
+ this.isBlinking = !0, this.blinkInterval = 1e3, this.smoothBlinking = !1, this.cursors = [],
+ this.cursor = this.addCursor(), i.addCssClass(this.element, "ace_hidden-cursors"),
+ this.$updateCursors = this.$updateVisibility.bind(this);
};
(function() {
- this.$padding = 0, this.setPadding = function(e) {
+ this.$updateVisibility = function(e) {
+ for (var t = this.cursors, n = t.length; n--; ) t[n].style.visibility = e ? "" : "hidden";
+ }, this.$updateOpacity = function(e) {
+ for (var t = this.cursors, n = t.length; n--; ) t[n].style.opacity = e ? "" : "0";
+ }, this.$padding = 0, this.setPadding = function(e) {
this.$padding = e;
}, this.setSession = function(e) {
this.session = e;
@@ -10054,10 +10305,11 @@ function printStackTrace(e) {
}, this.setBlinkInterval = function(e) {
e != this.blinkInterval && (this.blinkInterval = e, this.restartTimer());
}, this.setSmoothBlinking = function(e) {
- e != this.smoothBlinking && (this.smoothBlinking = e, e ? n.addCssClass(this.element, "ace_smooth-blinking") : n.removeCssClass(this.element, "ace_smooth-blinking"),
+ e == this.smoothBlinking || n || (this.smoothBlinking = e, i.setCssClass(this.element, "ace_smooth-blinking", e),
+ this.$updateCursors(!0), this.$updateCursors = (e ? this.$updateOpacity : this.$updateVisibility).bind(this),
this.restartTimer());
}, this.addCursor = function() {
- var e = n.createElement("div");
+ var e = i.createElement("div");
return e.className = "ace_cursor", this.element.appendChild(e), this.cursors.push(e),
e;
}, this.removeCursor = function() {
@@ -10066,25 +10318,24 @@ function printStackTrace(e) {
return e.parentNode.removeChild(e), e;
}
}, this.hideCursor = function() {
- this.isVisible = !1, n.addCssClass(this.element, "ace_hidden-cursors"), this.restartTimer();
+ this.isVisible = !1, i.addCssClass(this.element, "ace_hidden-cursors"), this.restartTimer();
}, this.showCursor = function() {
- this.isVisible = !0, n.removeCssClass(this.element, "ace_hidden-cursors"), this.restartTimer();
+ this.isVisible = !0, i.removeCssClass(this.element, "ace_hidden-cursors"), this.restartTimer();
}, this.restartTimer = function() {
- clearInterval(this.intervalId), clearTimeout(this.timeoutId), this.smoothBlinking && n.removeCssClass(this.element, "ace_smooth-blinking");
- for (var e = this.cursors.length; e--; ) this.cursors[e].style.opacity = "";
- if (this.isBlinking && this.blinkInterval && this.isVisible) {
+ var e = this.$updateCursors;
+ if (clearInterval(this.intervalId), clearTimeout(this.timeoutId), this.smoothBlinking && i.removeCssClass(this.element, "ace_smooth-blinking"),
+ e(!0), this.isBlinking && this.blinkInterval && this.isVisible) {
this.smoothBlinking && setTimeout(function() {
- n.addCssClass(this.element, "ace_smooth-blinking");
+ i.addCssClass(this.element, "ace_smooth-blinking");
}.bind(this));
var t = function() {
this.timeoutId = setTimeout(function() {
- for (var e = this.cursors.length; e--; ) this.cursors[e].style.opacity = 0;
- }.bind(this), .6 * this.blinkInterval);
+ e(!1);
+ }, .6 * this.blinkInterval);
}.bind(this);
this.intervalId = setInterval(function() {
- for (var e = this.cursors.length; e--; ) this.cursors[e].style.opacity = "";
- t();
- }.bind(this), this.blinkInterval), t();
+ e(!0), t();
+ }, this.blinkInterval), t();
}
}, this.getPixelPosition = function(e, t) {
if (!this.config || !this.session) return {
@@ -10092,10 +10343,11 @@ function printStackTrace(e) {
top: 0
};
e || (e = this.session.selection.getCursor());
- var n = this.session.documentToScreenPosition(e), i = this.$padding + n.column * this.config.characterWidth, o = (n.row - (t ? this.config.firstRowScreen : 0)) * this.config.lineHeight;
+ var n = this.session.documentToScreenPosition(e), i = this.config.textWidth(e.row, n.column, n.columnOffset), o = this.$padding + i, r = (n.row - (t ? this.config.firstRowScreen : 0)) * this.config.lineHeight, s = this.config.textWidth(e.row, n.column + 1, n.columnOffset) - i || this.config.characterWidth;
return {
- left: i,
- top: o
+ left: o,
+ top: r,
+ width: s
};
}, this.update = function(e) {
this.config = e;
@@ -10107,75 +10359,80 @@ function printStackTrace(e) {
var r = this.getPixelPosition(t[n].cursor, !0);
if (!((r.top > e.height + e.offset || r.top < -e.offset) && n > 1)) {
var s = (this.cursors[i++] || this.addCursor()).style;
- s.left = r.left + "px", s.top = r.top + "px", s.width = e.characterWidth + "px",
- s.height = e.lineHeight + "px";
+ s.left = r.left + "px", s.top = r.top + "px", s.width = r.width + "px", s.height = e.lineHeight + "px";
}
}
for (;this.cursors.length > i; ) this.removeCursor();
var a = this.session.getOverwrite();
this.$setOverwrite(a), this.$pixelPos = r, this.restartTimer();
}, this.$setOverwrite = function(e) {
- e != this.overwrite && (this.overwrite = e, e ? n.addCssClass(this.element, "ace_overwrite-cursors") : n.removeCssClass(this.element, "ace_overwrite-cursors"));
+ e != this.overwrite && (this.overwrite = e, e ? i.addCssClass(this.element, "ace_overwrite-cursors") : i.removeCssClass(this.element, "ace_overwrite-cursors"));
}, this.destroy = function() {
clearInterval(this.intervalId), clearTimeout(this.timeoutId);
};
- }).call(i.prototype), t.Cursor = i;
+ }).call(o.prototype), t.Cursor = o;
}), define("ace/scrollbar", [ "require", "exports", "module", "./lib/oop", "./lib/dom", "./lib/event", "./lib/event_emitter" ], function(e, t) {
- var n = e("./lib/oop"), i = e("./lib/dom"), o = e("./lib/event"), r = e("./lib/event_emitter").EventEmitter, s = function(e, t) {
- this.element = i.createElement("div"), this.element.className = "ace_scrollbar",
+ var n = e("./lib/oop"), i = e("./lib/dom"), o = e("./lib/event"), r = e("./lib/event_emitter").EventEmitter, s = function(e) {
+ this.element = i.createElement("div"), this.element.className = "ace_scrollbar ace_scrollbar" + this.classSuffix,
this.inner = i.createElement("div"), this.inner.className = "ace_scrollbar-inner",
- this.element.appendChild(this.inner), e.appendChild(this.element), t.$scrollbarWidth = this.width = i.scrollbarWidth(e.ownerDocument),
- t.$scrollbarWidth = this.width = i.scrollbarWidth(e.ownerDocument), this.fullWidth = this.width,
- this.inner.style.width = this.element.style.width = (this.width || 15) + 5 + "px",
- this.setVisible(!1), this.element.style.overflowY = "scroll", o.addListener(this.element, "scroll", this.onScrollV.bind(this)),
- o.addListener(this.element, "mousedown", o.preventDefault);
- }, a = function(e, t) {
- this.element = i.createElement("div"), this.element.className = "ace_scrollbar-h",
- this.inner = i.createElement("div"), this.inner.className = "ace_scrollbar-inner",
- this.element.appendChild(this.inner), e.appendChild(this.element), this.height = t.$scrollbarWidth,
- this.fullHeight = this.height, this.inner.style.height = this.element.style.height = (this.height || 15) + 5 + "px",
- this.setVisible(!1), this.element.style.overflowX = "scroll", o.addListener(this.element, "scroll", this.onScrollH.bind(this)),
+ this.element.appendChild(this.inner), e.appendChild(this.element), this.setVisible(!1),
+ this.skipEvent = !1, o.addListener(this.element, "scroll", this.onScroll.bind(this)),
o.addListener(this.element, "mousedown", o.preventDefault);
};
(function() {
n.implement(this, r), this.setVisible = function(e) {
- e ? (this.element.style.display = "", this.fullWidth && (this.width = this.fullWidth),
- this.fullHeight && (this.height = this.fullHeight)) : (this.element.style.display = "none",
- this.height = this.width = 0);
- }, this.onScrollV = function() {
+ this.element.style.display = e ? "" : "none", this.isVisible = e;
+ };
+ }).call(s.prototype);
+ var a = function(e, t) {
+ s.call(this, e), this.scrollTop = 0, t.$scrollbarWidth = this.width = i.scrollbarWidth(e.ownerDocument),
+ this.inner.style.width = this.element.style.width = (this.width || 15) + 5 + "px";
+ };
+ n.inherits(a, s), function() {
+ this.classSuffix = "-v", this.onScroll = function() {
this.skipEvent || (this.scrollTop = this.element.scrollTop, this._emit("scroll", {
data: this.scrollTop
})), this.skipEvent = !1;
- }, this.onScrollH = function() {
+ }, this.getWidth = function() {
+ return this.isVisible ? this.width : 0;
+ }, this.setHeight = function(e) {
+ this.element.style.height = e + "px";
+ }, this.setInnerHeight = function(e) {
+ this.inner.style.height = e + "px";
+ }, this.setScrollHeight = function(e) {
+ this.inner.style.height = e + "px";
+ }, this.setScrollTop = function(e) {
+ this.scrollTop != e && (this.skipEvent = !0, this.scrollTop = this.element.scrollTop = e);
+ };
+ }.call(a.prototype);
+ var l = function(e, t) {
+ s.call(this, e), this.scrollLeft = 0, this.height = t.$scrollbarWidth, this.inner.style.height = this.element.style.height = (this.height || 15) + 5 + "px";
+ };
+ n.inherits(l, s), function() {
+ this.classSuffix = "-h", this.onScroll = function() {
this.skipEvent || (this.scrollLeft = this.element.scrollLeft, this._emit("scroll", {
data: this.scrollLeft
})), this.skipEvent = !1;
- }, this.getWidth = function() {
- return this.width;
}, this.getHeight = function() {
- return this.height;
- }, this.setHeight = function(e) {
- this.element.style.height = e + "px";
+ return this.isVisible ? this.height : 0;
}, this.setWidth = function(e) {
this.element.style.width = e + "px";
- }, this.setInnerHeight = function(e) {
- this.inner.style.height = e + "px";
}, this.setInnerWidth = function(e) {
this.inner.style.width = e + "px";
- }, this.setScrollTop = function(e) {
- this.scrollTop != e && (this.skipEvent = !0, this.scrollTop = this.element.scrollTop = e);
+ }, this.setScrollWidth = function(e) {
+ this.inner.style.width = e + "px";
}, this.setScrollLeft = function(e) {
this.scrollLeft != e && (this.skipEvent = !0, this.scrollLeft = this.element.scrollLeft = e);
};
- }).call(s.prototype), a.prototype = s.prototype, t.ScrollBar = s, t.ScrollBarV = s,
- t.ScrollBarH = a;
+ }.call(l.prototype), t.ScrollBar = a, t.ScrollBarV = a, t.ScrollBarH = l, t.VScrollBar = a,
+ t.HScrollBar = l;
}), define("ace/renderloop", [ "require", "exports", "module", "./lib/event" ], function(e, t) {
var n = e("./lib/event"), i = function(e, t) {
this.onRender = e, this.pending = !1, this.changes = 0, this.window = t || window;
};
(function() {
this.schedule = function(e) {
- if (this.changes = this.changes | e, !this.pending) {
+ if (this.changes = this.changes | e, !this.pending && this.changes) {
this.pending = !0;
var t = this;
n.nextFrame(function() {
@@ -10194,7 +10451,7 @@ function printStackTrace(e) {
}(), define("ace/virtual_renderer", [ "require", "exports", "module", "./lib/oop", "./lib/dom", "./lib/useragent", "./config", "./layer/gutter", "./layer/marker", "./layer/text", "./layer/cursor", "./scrollbar", "./scrollbar", "./renderloop", "./lib/event_emitter", "./requirejs/text!./css/editor.css" ], function(e, t) {
var n = e("./lib/oop"), i = e("./lib/dom");
e("./lib/useragent");
- var o = e("./config"), r = e("./layer/gutter").Gutter, s = e("./layer/marker").Marker, a = e("./layer/text").Text, l = e("./layer/cursor").Cursor, c = e("./scrollbar").ScrollBarH, u = e("./scrollbar").ScrollBarV, d = e("./renderloop").RenderLoop, h = e("./lib/event_emitter").EventEmitter, p = e("./requirejs/text!./css/editor.css");
+ var o = e("./config"), r = e("./layer/gutter").Gutter, s = e("./layer/marker").Marker, a = e("./layer/text").Text, l = e("./layer/cursor").Cursor, c = e("./scrollbar").HScrollBar, u = e("./scrollbar").VScrollBar, d = e("./renderloop").RenderLoop, h = e("./lib/event_emitter").EventEmitter, p = e("./requirejs/text!./css/editor.css");
i.importCssString(p, "ace_editor");
var f = function(e, t) {
var n = this;
@@ -10216,12 +10473,14 @@ function printStackTrace(e) {
row: 0,
column: 0
}, this.$textLayer.addEventListener("changeCharacterSize", function() {
- n.updateCharacterSize(), n.onResize(!0), n._signal("changeCharacterSize");
+ n.updateCharacterSize(), n.onResize(!0, n.gutterWidth, n.$size.width, n.$size.height),
+ n._signal("changeCharacterSize");
}), this.$size = {
width: 0,
height: 0,
scrollerHeight: 0,
- scrollerWidth: 0
+ scrollerWidth: 0,
+ $dirty: !0
}, this.layerConfig = {
width: 1,
padding: 0,
@@ -10230,6 +10489,9 @@ function printStackTrace(e) {
lastRow: 0,
lineHeight: 0,
characterWidth: 0,
+ textWidth: function() {
+ return 1;
+ },
minHeight: 1,
maxHeight: 1,
offset: 0,
@@ -10255,9 +10517,9 @@ function printStackTrace(e) {
this.layerConfig.lineHeight = this.lineHeight = this.$textLayer.getLineHeight(),
this.$updatePrintMargin();
}, this.setSession = function(e) {
- this.session = e, this.scroller.className = "ace_scroller", this.$cursorLayer.setSession(e),
- this.$markerBack.setSession(e), this.$markerFront.setSession(e), this.$gutterLayer.setSession(e),
- this.$textLayer.setSession(e), this.$loop.schedule(this.CHANGE_FULL);
+ this.session = e, this.scrollMargin.top && e.getScrollTop() <= 0 && e.setScrollTop(-this.scrollMargin.top),
+ this.$cursorLayer.setSession(e), this.$markerBack.setSession(e), this.$markerFront.setSession(e),
+ this.$gutterLayer.setSession(e), this.$textLayer.setSession(e), this.$loop.schedule(this.CHANGE_FULL);
}, this.updateLines = function(e, t) {
void 0 === t && (t = 1/0), this.$changedLines ? (this.$changedLines.firstRow > e && (this.$changedLines.firstRow = e),
this.$changedLines.lastRow < t && (this.$changedLines.lastRow = t)) : this.$changedLines = {
@@ -10272,35 +10534,38 @@ function printStackTrace(e) {
e ? this.$renderChanges(this.CHANGE_FULL, !0) : this.$loop.schedule(this.CHANGE_FULL);
}, this.updateFontSize = function() {
this.$textLayer.checkForSizeChanges();
- }, this.$changes = 0, this.onResize = function(e, t, n, i) {
+ }, this.$changes = 0, this.$updateSizeAsync = function() {
+ this.$loop.pending ? this.$size.$dirty = !0 : this.onResize();
+ }, this.onResize = function(e, t, n, i) {
if (!(this.resizing > 2)) {
this.resizing > 0 ? this.resizing++ : this.resizing = e ? 1 : 0;
var o = this.container;
i || (i = o.clientHeight || o.scrollHeight), n || (n = o.clientWidth || o.scrollWidth);
var r = this.$updateCachedSize(e, t, n, i);
if (!this.$size.scrollerHeight || !n && !i) return this.resizing = 0;
- e && (this.$gutterLayer.$padding = null), e ? this.$renderChanges(r, !0) : this.$loop.schedule(r | this.$changes),
+ e && (this.$gutterLayer.$padding = null), e ? this.$renderChanges(r | this.$changes, !0) : this.$loop.schedule(r | this.$changes),
this.resizing && (this.resizing = 0);
}
}, this.$updateCachedSize = function(e, t, n, i) {
+ i -= this.$extraHeight || 0;
var o = 0, r = this.$size, s = {
width: r.width,
height: r.height,
scrollerHeight: r.scrollerHeight,
scrollerWidth: r.scrollerWidth
};
- return i && (e || r.height != i) && (r.height = i, o = this.CHANGE_SIZE, r.scrollerHeight = r.height,
+ return i && (e || r.height != i) && (r.height = i, o |= this.CHANGE_SIZE, r.scrollerHeight = r.height,
this.$horizScroll && (r.scrollerHeight -= this.scrollBarH.getHeight()), this.scrollBarV.element.style.bottom = this.scrollBarH.getHeight() + "px",
- this.session && (this.session.setScrollTop(this.getScrollTop()), o |= this.CHANGE_SCROLL)),
- n && (e || r.width != n) && (o = this.CHANGE_SIZE, r.width = n, null == t && (t = this.$showGutter ? this.$gutter.offsetWidth : 0),
- this.gutterWidth = t, this.scrollBarH.element.style.left = this.scroller.style.left = t + "px",
- r.scrollerWidth = Math.max(0, n - t - this.scrollBarV.getWidth()), this.scrollBarH.element.style.right = this.scroller.style.right = this.scrollBarV.getWidth() + "px",
+ o |= this.CHANGE_SCROLL), n && (e || r.width != n) && (o |= this.CHANGE_SIZE, r.width = n,
+ null == t && (t = this.$showGutter ? this.$gutter.offsetWidth : 0), this.gutterWidth = t,
+ this.scrollBarH.element.style.left = this.scroller.style.left = t + "px", r.scrollerWidth = Math.max(0, n - t - this.scrollBarV.getWidth()),
+ this.scrollBarH.element.style.right = this.scroller.style.right = this.scrollBarV.getWidth() + "px",
this.scroller.style.bottom = this.scrollBarH.getHeight() + "px", (this.session && this.session.getUseWrapMode() && this.adjustWrapLimit() || e) && (o |= this.CHANGE_FULL)),
- o && this._signal("resize", s), o;
+ r.$dirty = !n || !i, o && this._signal("resize", s), o;
}, this.onGutterResize = function() {
var e = this.$showGutter ? this.$gutter.offsetWidth : 0;
e != this.gutterWidth && (this.$changes |= this.$updateCachedSize(!0, e, this.$size.width, this.$size.height)),
- this.session.getUseWrapMode() && this.adjustWrapLimit() ? this.$loop.schedule(this.CHANGE_FULL) : (this.$computeLayerConfig(),
+ this.session.getUseWrapMode() && this.adjustWrapLimit() ? this.$loop.schedule(this.CHANGE_FULL) : this.$size.$dirty ? this.$loop.schedule(this.CHANGE_FULL) : (this.$computeLayerConfig(),
this.$loop.schedule(this.CHANGE_MARKER));
}, this.adjustWrapLimit = function() {
var e = this.$size.scrollerWidth - 2 * this.$padding, t = Math.floor(e / this.characterWidth);
@@ -10395,7 +10660,8 @@ function printStackTrace(e) {
}, this.setScrollMargin = function(e, t, n, i) {
var o = this.scrollMargin;
o.top = 0 | e, o.bottom = 0 | t, o.right = 0 | i, o.left = 0 | n, o.v = o.top + o.bottom,
- o.h = o.left + o.right, this.updateFull();
+ o.h = o.left + o.right, o.top && this.scrollTop <= 0 && this.session && this.session.setScrollTop(o.top),
+ this.updateFull();
}, this.getHScrollBarAlwaysVisible = function() {
return this.$hScrollBarAlwaysVisible;
}, this.setHScrollBarAlwaysVisible = function(e) {
@@ -10405,35 +10671,41 @@ function printStackTrace(e) {
}, this.setVScrollBarAlwaysVisible = function(e) {
this.setOption("vScrollBarAlwaysVisible", e);
}, this.$updateScrollBarV = function() {
- this.scrollBarV.setInnerHeight(this.layerConfig.maxHeight + this.scrollMargin.v),
+ this.scrollBarV.setScrollHeight(this.layerConfig.maxHeight + this.scrollMargin.v),
this.scrollBarV.setScrollTop(this.scrollTop + this.scrollMargin.top);
}, this.$updateScrollBarH = function() {
- this.scrollBarH.setInnerWidth(this.layerConfig.width + 2 * this.$padding + this.scrollMargin.h),
+ this.scrollBarH.setScrollWidth(this.layerConfig.width + 2 * this.$padding + this.scrollMargin.h),
this.scrollBarH.setScrollLeft(this.scrollLeft + this.scrollMargin.left);
+ }, this.$frozen = !1, this.freeze = function() {
+ this.$frozen = !0;
+ }, this.unfreeze = function() {
+ this.$frozen = !1;
}, this.$renderChanges = function(e, t) {
- return this.$changes && (e |= this.$changes, this.$changes = 0), this.session && this.container.offsetWidth && (e || t) ? this.$size.width ? (this.lineHeight || this.$textLayer.checkForSizeChanges(),
- this._signal("beforeRender"), (e & this.CHANGE_FULL || e & this.CHANGE_SIZE || e & this.CHANGE_TEXT || e & this.CHANGE_LINES || e & this.CHANGE_SCROLL || e & this.CHANGE_H_SCROLL) && (e |= this.$computeLayerConfig()),
- e & this.CHANGE_H_SCROLL && (this.$updateScrollBarH(), this.content.style.marginLeft = -this.scrollLeft + "px",
+ if (this.$changes && (e |= this.$changes, this.$changes = 0), !this.session || !this.container.offsetWidth || this.$frozen || !e && !t) return this.$changes |= e,
+ void 0;
+ if (this.$size.$dirty) return this.$changes |= e, this.onResize(!0);
+ this.lineHeight || this.$textLayer.checkForSizeChanges(), this._signal("beforeRender");
+ var n = this.layerConfig;
+ return (e & this.CHANGE_FULL || e & this.CHANGE_SIZE || e & this.CHANGE_TEXT || e & this.CHANGE_LINES || e & this.CHANGE_SCROLL || e & this.CHANGE_H_SCROLL) && (e |= this.$computeLayerConfig(),
+ n = this.layerConfig, this.$updateScrollBarV(), e & this.CHANGE_H_SCROLL && this.$updateScrollBarH(),
+ this.$gutterLayer.element.style.marginTop = -n.offset + "px", this.content.style.marginTop = -n.offset + "px",
+ this.content.style.width = n.width + 2 * this.$padding + "px", this.content.style.height = n.minHeight + "px"),
+ e & this.CHANGE_H_SCROLL && (this.content.style.marginLeft = -this.scrollLeft + "px",
this.scroller.className = this.scrollLeft <= 0 ? "ace_scroller" : "ace_scroller ace_scroll-left"),
- e & this.CHANGE_FULL ? (this.$updateScrollBarV(), this.$updateScrollBarH(), this.$textLayer.update(this.layerConfig),
- this.$showGutter && this.$gutterLayer.update(this.layerConfig), this.$markerBack.update(this.layerConfig),
- this.$markerFront.update(this.layerConfig), this.$cursorLayer.update(this.layerConfig),
+ e & this.CHANGE_FULL ? (this.$textLayer.update(n), this.$showGutter && this.$gutterLayer.update(n),
+ this.$markerBack.update(n), this.$markerFront.update(n), this.$cursorLayer.update(n),
this.$moveTextAreaToCursor(), this.$highlightGutterLine && this.$updateGutterLineHighlight(),
- this._signal("afterRender"), void 0) : e & this.CHANGE_SCROLL ? (this.$updateScrollBarV(),
- e & this.CHANGE_TEXT || e & this.CHANGE_LINES ? this.$textLayer.update(this.layerConfig) : this.$textLayer.scrollLines(this.layerConfig),
- this.$showGutter && this.$gutterLayer.update(this.layerConfig), this.$markerBack.update(this.layerConfig),
- this.$markerFront.update(this.layerConfig), this.$cursorLayer.update(this.layerConfig),
- this.$highlightGutterLine && this.$updateGutterLineHighlight(), this.$moveTextAreaToCursor(),
- this._signal("afterRender"), void 0) : (e & this.CHANGE_TEXT ? (this.$textLayer.update(this.layerConfig),
- this.$showGutter && this.$gutterLayer.update(this.layerConfig)) : e & this.CHANGE_LINES ? (this.$updateLines() || e & this.CHANGE_GUTTER && this.$showGutter) && this.$gutterLayer.update(this.layerConfig) : (e & this.CHANGE_TEXT || e & this.CHANGE_GUTTER) && this.$showGutter && this.$gutterLayer.update(this.layerConfig),
- e & this.CHANGE_CURSOR && (this.$cursorLayer.update(this.layerConfig), this.$moveTextAreaToCursor(),
- this.$highlightGutterLine && this.$updateGutterLineHighlight()), e & (this.CHANGE_MARKER | this.CHANGE_MARKER_FRONT) && this.$markerFront.update(this.layerConfig),
- e & (this.CHANGE_MARKER | this.CHANGE_MARKER_BACK) && this.$markerBack.update(this.layerConfig),
- (e & this.CHANGE_SIZE || e & this.CHANGE_LINES) && (this.$updateScrollBarV(), this.$updateScrollBarH()),
- this._signal("afterRender"), void 0)) : (this.$changes |= e, this.onResize(!0)) : (this.$changes |= e,
- void 0);
- }, this.$autosize = function(e) {
- var e = this.session.getScreenLength() * this.lineHeight, t = this.$maxLines * this.lineHeight, n = Math.max((this.$minLines || 1) * this.lineHeight, Math.min(t, e)), i = e > t;
+ this._signal("afterRender"), void 0) : e & this.CHANGE_SCROLL ? (e & this.CHANGE_TEXT || e & this.CHANGE_LINES ? this.$textLayer.update(n) : this.$textLayer.scrollLines(n),
+ this.$showGutter && this.$gutterLayer.update(n), this.$markerBack.update(n), this.$markerFront.update(n),
+ this.$cursorLayer.update(n), this.$highlightGutterLine && this.$updateGutterLineHighlight(),
+ this.$moveTextAreaToCursor(), this._signal("afterRender"), void 0) : (e & this.CHANGE_TEXT ? (this.$textLayer.update(n),
+ this.$showGutter && this.$gutterLayer.update(n)) : e & this.CHANGE_LINES ? (this.$updateLines() || e & this.CHANGE_GUTTER && this.$showGutter) && this.$gutterLayer.update(n) : (e & this.CHANGE_TEXT || e & this.CHANGE_GUTTER) && this.$showGutter && this.$gutterLayer.update(n),
+ e & this.CHANGE_CURSOR && (this.$cursorLayer.update(n), this.$moveTextAreaToCursor(),
+ this.$highlightGutterLine && this.$updateGutterLineHighlight()), e & (this.CHANGE_MARKER | this.CHANGE_MARKER_FRONT) && this.$markerFront.update(n),
+ e & (this.CHANGE_MARKER | this.CHANGE_MARKER_BACK) && this.$markerBack.update(n),
+ this._signal("afterRender"), void 0);
+ }, this.$autosize = function() {
+ var e = this.session.getScreenLength() * this.lineHeight, t = this.$maxLines * this.lineHeight, n = Math.max((this.$minLines || 1) * this.lineHeight, Math.min(t, e)) + this.scrollMargin.v + (this.$extraHeight || 0), i = e > t;
if (n != this.desiredHeight || this.$size.height != this.desiredHeight || i != this.$vScroll) {
i != this.$vScroll && (this.$vScroll = i, this.scrollBarV.setVisible(i));
var o = this.container.clientWidth;
@@ -10442,35 +10714,35 @@ function printStackTrace(e) {
}
}, this.$computeLayerConfig = function() {
this.$maxLines && this.lineHeight > 1 && this.$autosize();
- var e = this.session, t = this.$size.height <= 2 * this.lineHeight, n = this.session.getScreenLength(), i = n * this.lineHeight, o = this.scrollTop % this.lineHeight, r = this.$size.scrollerHeight + this.lineHeight, s = this.$getLongestLine(), a = !t && (this.$hScrollBarAlwaysVisible || this.$size.scrollerWidth - s - 2 * this.$padding < 0), l = this.$horizScroll !== a;
- l && (this.$horizScroll = a, this.scrollBarH.setVisible(a)), !this.$maxLines && this.$scrollPastEnd && this.scrollTop > i - this.$size.scrollerHeight && (i += Math.min((this.$size.scrollerHeight - this.lineHeight) * this.$scrollPastEnd, this.scrollTop - i + this.$size.scrollerHeight));
- var c = !t && (this.$vScrollBarAlwaysVisible || this.$size.scrollerHeight - i < 0), u = this.$vScroll !== c;
- u && (this.$vScroll = c, this.scrollBarV.setVisible(c)), this.session.setScrollTop(Math.max(-this.scrollMargin.top, Math.min(this.scrollTop, i - this.$size.scrollerHeight + this.scrollMargin.v))),
- this.session.setScrollLeft(Math.max(-this.scrollMargin.left, Math.min(this.scrollLeft, s + 2 * this.$padding - this.$size.scrollerWidth + this.scrollMargin.h)));
- var d, h, p = Math.ceil(r / this.lineHeight) - 1, f = Math.max(0, Math.round((this.scrollTop - o) / this.lineHeight)), g = f + p, m = this.lineHeight;
- f = e.screenToDocumentRow(f, 0);
- var v = e.getFoldLine(f);
- v && (f = v.start.row), d = e.documentToScreenRow(f, 0), h = e.getRowLength(f) * m,
- g = Math.min(e.screenToDocumentRow(g, 0), e.getLength() - 1), r = this.$size.scrollerHeight + e.getRowLength(g) * m + h,
- o = this.scrollTop - d * m;
- var b = 0;
- return (l || u) && (b = this.$updateCachedSize(!0, this.gutterWidth, this.$size.width, this.$size.height),
- this._signal("scrollbarVisibilityChanged"), u && (s = this.$getLongestLine())),
+ var e = this.session, t = this.$size, n = t.height <= 2 * this.lineHeight, i = this.session.getScreenLength(), o = i * this.lineHeight, r = this.scrollTop % this.lineHeight, s = t.scrollerHeight + this.lineHeight, a = this.$getLongestLine(), l = !n && (this.$hScrollBarAlwaysVisible || t.scrollerWidth - a - 2 * this.$padding < 0), c = this.$horizScroll !== l;
+ c && (this.$horizScroll = l, this.scrollBarH.setVisible(l)), !this.$maxLines && this.$scrollPastEnd && this.scrollTop > o - t.scrollerHeight && (o += Math.min((t.scrollerHeight - this.lineHeight) * this.$scrollPastEnd, this.scrollTop - o + t.scrollerHeight));
+ var u = !n && (this.$vScrollBarAlwaysVisible || t.scrollerHeight - o < 0), d = this.$vScroll !== u;
+ d && (this.$vScroll = u, this.scrollBarV.setVisible(u)), this.session.setScrollTop(Math.max(-this.scrollMargin.top, Math.min(this.scrollTop, o - t.scrollerHeight + this.scrollMargin.bottom))),
+ this.session.setScrollLeft(Math.max(-this.scrollMargin.left, Math.min(this.scrollLeft, a + 2 * this.$padding - t.scrollerWidth + this.scrollMargin.right)));
+ var h, p, f = Math.ceil(s / this.lineHeight) - 1, g = Math.max(0, Math.round((this.scrollTop - r) / this.lineHeight)), m = g + f, v = this.lineHeight;
+ g = e.screenToDocumentRow(g, 0);
+ var b = e.getFoldLine(g);
+ b && (g = b.start.row), h = e.documentToScreenRow(g, 0), p = e.getRowLength(g) * v,
+ m = Math.min(e.screenToDocumentRow(m, 0), e.getLength() - 1), s = t.scrollerHeight + e.getRowLength(m) * v + p,
+ r = this.scrollTop - h * v;
+ var y = 0;
+ return this.layerConfig.width != a && (y = this.CHANGE_H_SCROLL), (c || d) && (y = this.$updateCachedSize(!0, this.gutterWidth, t.width, t.height),
+ this._signal("scrollbarVisibilityChanged"), d && (a = this.$getLongestLine())),
this.layerConfig = {
- width: s,
+ width: a,
padding: this.$padding,
- firstRow: f,
- firstRowScreen: d,
- lastRow: g,
- lineHeight: m,
+ firstRow: g,
+ firstRowScreen: h,
+ lastRow: m,
+ lineHeight: v,
characterWidth: this.characterWidth,
- minHeight: r,
- maxHeight: i,
- offset: o,
+ textWidth: this.$textLayer.textWidth.bind(this.$textLayer),
+ minHeight: s,
+ maxHeight: o,
+ offset: r,
+ gutterOffset: Math.ceil((r + t.height - t.scrollerHeight) / v),
height: this.$size.scrollerHeight
- }, this.$gutterLayer.element.style.marginTop = -o + "px", this.content.style.marginTop = -o + "px",
- this.content.style.width = s + 2 * this.$padding + "px", this.content.style.height = r + "px",
- b;
+ }, y;
}, this.$updateLines = function() {
var e = this.$changedLines.firstRow, t = this.$changedLines.lastRow;
this.$changedLines = null;
@@ -10500,15 +10772,15 @@ function printStackTrace(e) {
this.$cursorLayer.showCursor();
}, this.scrollSelectionIntoView = function(e, t, n) {
this.scrollCursorIntoView(e, n), this.scrollCursorIntoView(t, n);
- }, this.scrollCursorIntoView = function(e, t) {
+ }, this.scrollCursorIntoView = function(e, t, n) {
if (0 !== this.$size.scrollerHeight) {
- var n = this.$cursorLayer.getPixelPosition(e), i = n.left, o = n.top, r = this.$scrollAnimation ? this.session.getScrollTop() : this.scrollTop;
- r > o ? (t && (o -= t * this.$size.scrollerHeight), 0 == o ? o = -this.scrollMargin.top : 0 == o && (o = +this.scrollMargin.bottom),
- this.session.setScrollTop(o)) : r + this.$size.scrollerHeight < o + this.lineHeight && (t && (o += t * this.$size.scrollerHeight),
- this.session.setScrollTop(o + this.lineHeight - this.$size.scrollerHeight));
- var s = this.scrollLeft;
- s > i ? (i < this.$padding + 2 * this.layerConfig.characterWidth && (i = -this.scrollMargin.left),
- this.session.setScrollLeft(i)) : s + this.$size.scrollerWidth < i + this.characterWidth ? this.session.setScrollLeft(Math.round(i + this.characterWidth - this.$size.scrollerWidth)) : s <= this.$padding && i - s < this.characterWidth && this.session.setScrollLeft(0);
+ var i = this.$cursorLayer.getPixelPosition(e), o = i.left, r = i.top, s = n && n.top || 0, a = n && n.bottom || 0, l = this.$scrollAnimation ? this.session.getScrollTop() : this.scrollTop;
+ l + s > r ? (t && (r -= t * this.$size.scrollerHeight), 0 === r && (r = -this.scrollMargin.top),
+ this.session.setScrollTop(r)) : l + this.$size.scrollerHeight - a < r + this.lineHeight && (t && (r += t * this.$size.scrollerHeight),
+ this.session.setScrollTop(r + this.lineHeight - this.$size.scrollerHeight));
+ var c = this.scrollLeft;
+ c > o ? (o < this.$padding + 2 * this.layerConfig.characterWidth && (o = -this.scrollMargin.left),
+ this.session.setScrollLeft(o)) : c + this.$size.scrollerWidth < o + this.characterWidth ? this.session.setScrollLeft(Math.round(o + this.characterWidth - this.$size.scrollerWidth)) : c <= this.$padding && o - c < this.characterWidth && this.session.setScrollLeft(0);
}
}, this.getScrollTop = function() {
return this.session.getScrollTop();
@@ -10555,7 +10827,8 @@ function printStackTrace(e) {
from: e,
to: n,
steps: r
- }, clearInterval(this.$timer), i.session.setScrollTop(r.shift()), this.$timer = setInterval(function() {
+ }, clearInterval(this.$timer), i.session.setScrollTop(r.shift()), i.session.$scrollTop = n,
+ this.$timer = setInterval(function() {
r.length ? (i.session.setScrollTop(r.shift()), i.session.$scrollTop = n) : null != n ? (i.session.$scrollTop = -1,
i.session.setScrollTop(n), n = null) : (i.$timer = clearInterval(i.$timer), i.$scrollAnimation = null,
t && t());
@@ -10579,9 +10852,21 @@ function printStackTrace(e) {
column: r,
side: i - r > 0 ? 1 : -1
};
+ }, this.$findColumn = function(e, t, n, i) {
+ var o = 0;
+ for (i = i ? i - n - 1 : this.session.getLine(e).length - n; ;) {
+ if (0 >= i) return null;
+ if (1 == i - o) {
+ var r = this.$textLayer.textWidth(e, o, n), s = this.$textLayer.textWidth(e, i, n);
+ return Math.abs(r - t) < Math.abs(s - t) ? o : i;
+ }
+ var a = o + (i - o >> 1), l = this.$textLayer.textWidth(e, a, n);
+ if (l == t) return a;
+ l > t ? i = a : o = a;
+ }
}, this.screenToTextCoordinates = function(e, t) {
- var n = this.scroller.getBoundingClientRect(), i = Math.round((e + this.scrollLeft - n.left - this.$padding) / this.characterWidth), o = Math.floor((t + this.scrollTop - n.top) / this.lineHeight);
- return this.session.screenToDocumentPosition(o, Math.max(i, 0));
+ var n = this.scroller.getBoundingClientRect(), o = (t + this.scrollTop - n.top) / this.lineHeight, r = e + this.scroller.scrollLeft - n.left - this.$padding - i.getPageScrollLeft(), s = this.session.screenToDocumentPosition(o, 0);
+ return s.column += this.$findColumn(s.row, r, s.column, s.rowLength), s;
}, this.textToScreenCoordinates = function(e, t) {
var n = this.scroller.getBoundingClientRect(), i = this.session.documentToScreenPosition(e, t), o = this.$padding + Math.round(i.column * this.characterWidth), r = i.row * this.lineHeight;
return {
@@ -10605,30 +10890,32 @@ function printStackTrace(e) {
this.textarea.style.cssText = this.$composition.cssText, this.$composition = null);
}, this.setTheme = function(e, t) {
function n(n) {
- if (r.$themeValue != e) return t && t();
+ if (r.$themeId != e) return t && t();
if (n.cssClass) {
- i.importCssString(n.cssText, n.cssClass, r.container.ownerDocument), r.theme && i.removeCssClass(r.container, r.theme.cssClass),
- r.$theme = n.cssClass, r.theme = n, i.addCssClass(r.container, n.cssClass), i.setCssClass(r.container, "ace_dark", n.isDark);
- var o = "padding" in n ? n.padding : 4;
- r.$padding && o != r.$padding && r.setPadding(o), r.$size && (r.$size.width = 0,
- r.onResize()), r._dispatchEvent("themeLoaded", {
+ i.importCssString(n.cssText, n.cssClass, r.container.ownerDocument), r.theme && i.removeCssClass(r.container, r.theme.cssClass);
+ var o = "padding" in n ? n.padding : "padding" in (r.theme || {}) ? 4 : r.$padding;
+ r.$padding && o != r.$padding && r.setPadding(o), r.$theme = n.cssClass, r.theme = n,
+ i.addCssClass(r.container, n.cssClass), i.setCssClass(r.container, "ace_dark", n.isDark),
+ r.$size && (r.$size.width = 0, r.$updateSizeAsync()), r._dispatchEvent("themeLoaded", {
theme: n
}), t && t();
}
}
var r = this;
- if (this.$themeValue = e, r._dispatchEvent("themeChange", {
+ if (this.$themeId = e, r._dispatchEvent("themeChange", {
theme: e
}), e && "string" != typeof e) n(e); else {
- var s = e || "ace/theme/textmate";
+ var s = e || this.$options.theme.initialValue;
o.loadModule([ "theme", s ], n);
}
}, this.getTheme = function() {
- return this.$themeValue;
+ return this.$themeId;
}, this.setStyle = function(e, t) {
- i.setCssClass(this.container, e, 0 != t);
+ i.setCssClass(this.container, e, t !== !1);
}, this.unsetStyle = function(e) {
i.removeCssClass(this.container, e);
+ }, this.setCursorStyle = function(e) {
+ this.content.style.cursor != e && (this.content.style.cursor = e);
}, this.setMouseCursor = function(e) {
this.content.style.cursor = e;
}, this.destroy = function() {
@@ -10683,6 +10970,12 @@ function printStackTrace(e) {
},
initialValue: !0
},
+ showLineNumbers: {
+ set: function(e) {
+ this.$gutterLayer.setShowLineNumbers(e), this.$loop.schedule(this.CHANGE_GUTTER);
+ },
+ initialValue: !0
+ },
displayIndentGuides: {
set: function(e) {
this.$textLayer.setDisplayIndentGuides(e) && this.$loop.schedule(this.CHANGE_TEXT);
@@ -10743,6 +11036,16 @@ function printStackTrace(e) {
set: function(e) {
this.$gutterLayer.$fixedWidth = !!e, this.$loop.schedule(this.CHANGE_GUTTER);
}
+ },
+ theme: {
+ set: function(e) {
+ this.setTheme(e);
+ },
+ get: function() {
+ return this.$themeId || this.theme;
+ },
+ initialValue: "./theme/textmate",
+ handlesSet: !0
}
}), t.VirtualRenderer = f;
}), define("ace/mouse/multi_select_handler", [ "require", "exports", "module", "../lib/event" ], function(e, t) {
@@ -10786,10 +11089,10 @@ function printStackTrace(e) {
l.addSelectionMarker(k);
}
var A = c.rangeList.rangeAtPoint(d);
- l.once("mouseup", function() {
+ l.$blockScrolling++, l.once("mouseup", function() {
var e = c.toOrientedRange();
A && e.isEmpty() && n(A.cursor, e.cursor) ? c.substractPoint(e.cursor) : (k && (l.removeSelectionMarker(k),
- c.addRange(k)), c.addRange(e));
+ c.addRange(k)), c.addRange(e)), l.$blockScrolling--;
});
}
}
@@ -10951,7 +11254,7 @@ function printStackTrace(e) {
}
e.cursor || (e.cursor = e.end);
var i = this.rangeList.add(e);
- return this.$onAddRange(e), i.length && this.$onRemoveRange(i), this.rangeCount > 1 && !this.inMultiSelectMode && (this._emit("multiSelect"),
+ return this.$onAddRange(e), i.length && this.$onRemoveRange(i), this.rangeCount > 1 && !this.inMultiSelectMode && (this._signal("multiSelect"),
this.inMultiSelectMode = !0, this.session.$undoSelect = !1, this.rangeList.attach(this.session)),
t || this.fromOrientedRange(e);
}
@@ -10966,7 +11269,7 @@ function printStackTrace(e) {
var e = this.rangeList.merge();
e.length ? this.$onRemoveRange(e) : this.ranges[0] && this.fromOrientedRange(this.ranges[0]);
}, this.$onAddRange = function(e) {
- this.rangeCount = this.rangeList.ranges.length, this.ranges.unshift(e), this._emit("addRange", {
+ this.rangeCount = this.rangeList.ranges.length, this.ranges.unshift(e), this._signal("addRange", {
range: e
});
}, this.$onRemoveRange = function(e) {
@@ -10978,10 +11281,10 @@ function printStackTrace(e) {
var i = this.ranges.indexOf(e[n]);
this.ranges.splice(i, 1);
}
- this._emit("removeRange", {
+ this._signal("removeRange", {
ranges: e
}), 0 == this.rangeCount && this.inMultiSelectMode && (this.inMultiSelectMode = !1,
- this._emit("singleSelect"), this.session.$undoSelect = !0, this.rangeList.detach(this.session)),
+ this._signal("singleSelect"), this.session.$undoSelect = !0, this.rangeList.detach(this.session)),
t = t || this.ranges[0], t && !t.isEqual(this.getRange()) && this.fromOrientedRange(t);
}, this.$initRangeList = function() {
this.rangeList || (this.rangeList = new s(), this.ranges = [], this.rangeCount = 0);
@@ -11109,12 +11412,15 @@ function printStackTrace(e) {
return e;
}, this.onPaste = function(e) {
if (!this.$readOnly) {
- if (this._signal("paste", e), !this.inMultiSelectMode || this.inVirtualSelectionMode) return this.insert(e);
- var t = e.split(/\r\n|\r|\n/), n = this.selection.rangeList.ranges;
- if (t.length > n.length || t.length < 2 || !t[1]) return this.commands.exec("insertstring", this, e);
- for (var i = n.length; i--; ) {
- var o = n[i];
- o.isEmpty() || this.session.remove(o), this.session.insert(o.start, t[i]);
+ var t = {
+ text: e
+ };
+ if (this._signal("paste", t), e = t.text, !this.inMultiSelectMode || this.inVirtualSelectionMode) return this.insert(e);
+ var n = e.split(/\r\n|\r|\n/), i = this.selection.rangeList.ranges;
+ if (n.length > i.length || n.length < 2 || !n[1]) return this.commands.exec("insertstring", this, e);
+ for (var o = i.length; o--; ) {
+ var r = i[o];
+ r.isEmpty() || this.session.remove(r), this.session.insert(r.start, n[o]);
}
}
}, this.findAll = function(e, t, n) {
@@ -11163,12 +11469,12 @@ function printStackTrace(e) {
}
}, this.selectMore = function(e, t) {
var i = this.session, o = i.multiSelect, r = o.toOrientedRange();
- if (r.isEmpty()) {
- var r = i.getWordRange(r.start.row, r.start.column);
- return r.cursor = -1 == e ? r.start : r.end, this.multiSelect.addRange(r), void 0;
- }
+ r.isEmpty() && (r = i.getWordRange(r.start.row, r.start.column), r.cursor = -1 == e ? r.start : r.end,
+ this.multiSelect.addRange(r));
var s = i.getTextRange(r), a = n(i, s, e);
- a && (a.cursor = -1 == e ? a.start : a.end, this.multiSelect.addRange(a)), t && this.multiSelect.substractPoint(r.cursor);
+ a && (a.cursor = -1 == e ? a.start : a.end, this.$blockScrolling += 1, this.session.unfold(a),
+ this.multiSelect.addRange(a), this.$blockScrolling -= 1, this.renderer.scrollCursorIntoView(null, .5)),
+ t && this.multiSelect.substractPoint(r.cursor);
}, this.alignCursors = function() {
var e = this.session, t = e.multiSelect, n = t.ranges;
if (n.length) {
@@ -11186,30 +11492,40 @@ function printStackTrace(e) {
t.start.column = t.end.column = r, t.start.row = t.end.row = i.row, t.cursor = t.end;
}), t.fromOrientedRange(n[0]), this.renderer.updateCursor(), this.renderer.updateBackMarkers();
} else {
- var c = this.selection.getRange(), u = c.start.row, h = c.end.row, p = this.session.doc.removeLines(u, h);
- p = this.$reAlignText(p), this.session.doc.insertLines(u, p), c.start.column = 0,
- c.end.column = p[p.length - 1].length, this.selection.setRange(c);
+ var c = this.selection.getRange(), u = c.start.row, h = c.end.row, p = u == h;
+ if (p) {
+ var f, g = this.session.getLength();
+ do f = this.session.getLine(h); while (/[=:]/.test(f) && ++h < g);
+ do f = this.session.getLine(u); while (/[=:]/.test(f) && --u > 0);
+ 0 > u && (u = 0), h >= g && (h = g - 1);
+ }
+ var m = this.session.doc.removeLines(u, h);
+ m = this.$reAlignText(m, p), this.session.doc.insert({
+ row: u,
+ column: 0
+ }, m.join("\n") + "\n"), p || (c.start.column = 0, c.end.column = m[m.length - 1].length),
+ this.selection.setRange(c);
}
- }, this.$reAlignText = function(e) {
- function t(e) {
+ }, this.$reAlignText = function(e, t) {
+ function n(e) {
return d.stringRepeat(" ", e);
}
- function n(e) {
- return e[2] ? t(r) + e[2] + t(s - e[2].length + a) + e[4].replace(/^([=:])\s+/, "$1 ") : e[0];
- }
function i(e) {
- return e[2] ? t(r + s - e[2].length) + e[2] + t(a, " ") + e[4].replace(/^([=:])\s+/, "$1 ") : e[0];
+ return e[2] ? n(s) + e[2] + n(a - e[2].length + l) + e[4].replace(/^([=:])\s+/, "$1 ") : e[0];
}
function o(e) {
- return e[2] ? t(r) + e[2] + t(a) + e[4].replace(/^([=:])\s+/, "$1 ") : e[0];
+ return e[2] ? n(s + a - e[2].length) + e[2] + n(l, " ") + e[4].replace(/^([=:])\s+/, "$1 ") : e[0];
}
- var r, s, a, l = !0, c = !0;
+ function r(e) {
+ return e[2] ? n(s) + e[2] + n(l) + e[4].replace(/^([=:])\s+/, "$1 ") : e[0];
+ }
+ var s, a, l, c = !0, u = !0;
return e.map(function(e) {
var t = e.match(/(\s*)(.*?)(\s*)([=:].*)/);
- return t ? null == r ? (r = t[1].length, s = t[2].length, a = t[3].length, t) : (r + s + a != t[1].length + t[2].length + t[3].length && (c = !1),
- r != t[1].length && (l = !1), r > t[1].length && (r = t[1].length), s < t[2].length && (s = t[2].length),
- a > t[3].length && (a = t[3].length), t) : [ e ];
- }).map(l ? c ? i : n : o);
+ return t ? null == s ? (s = t[1].length, a = t[2].length, l = t[3].length, t) : (s + a + l != t[1].length + t[2].length + t[3].length && (u = !1),
+ s != t[1].length && (c = !1), s > t[1].length && (s = t[1].length), a < t[2].length && (a = t[2].length),
+ l > t[3].length && (l = t[3].length), t) : [ e ];
+ }).map(t ? i : c ? u ? o : i : r);
};
}).call(m.prototype), t.onSessionChange = function(e) {
var t = e.session;
@@ -11231,31 +11547,33 @@ function printStackTrace(e) {
}
});
}), define("ace/worker/worker_client", [ "require", "exports", "module", "../lib/oop", "../lib/event_emitter", "../config" ], function(e, t) {
- var n = e("../lib/oop"), i = e("../lib/event_emitter").EventEmitter, o = e("../config"), r = function(t, n, i) {
- this.$sendDeltaQueue = this.$sendDeltaQueue.bind(this), this.changeListener = this.changeListener.bind(this),
- this.onMessage = this.onMessage.bind(this), this.onError = this.onError.bind(this),
- e.nameToUrl && !e.toUrl && (e.toUrl = e.nameToUrl);
- var r;
- if (o.get("packaged") || !e.toUrl) r = o.moduleUrl(n, "worker"); else {
+ var n = e("../lib/oop"), i = e("../lib/event_emitter").EventEmitter, o = e("../config"), r = function(t, n, i, r) {
+ if (this.$sendDeltaQueue = this.$sendDeltaQueue.bind(this), this.changeListener = this.changeListener.bind(this),
+ this.onMessage = this.onMessage.bind(this), e.nameToUrl && !e.toUrl && (e.toUrl = e.nameToUrl),
+ o.get("packaged") || !e.toUrl) r = r || o.moduleUrl(n, "worker"); else {
var s = this.$normalizePath;
- r = s(e.toUrl("ace/worker/worker.js", null, "_"));
+ r = r || s(e.toUrl("ace/worker/worker.js", null, "_"));
var a = {};
t.forEach(function(t) {
a[t] = s(e.toUrl(t, null, "_").replace(/(\.js)?(\?.*)?$/, ""));
});
}
- this.$worker = new Worker(r), this.$worker.postMessage({
+ try {
+ this.$worker = new Worker(r);
+ } catch (l) {
+ if (!(l instanceof window.DOMException)) throw l;
+ var c = this.$workerBlob(r), u = window.URL || window.webkitURL, d = u.createObjectURL(c);
+ this.$worker = new Worker(d), u.revokeObjectURL(d);
+ }
+ this.$worker.postMessage({
init: !0,
tlns: a,
module: n,
classname: i
- }), this.callbackId = 1, this.callbacks = {}, this.$worker.onerror = this.onError,
- this.$worker.onmessage = this.onMessage;
+ }), this.callbackId = 1, this.callbacks = {}, this.$worker.onmessage = this.onMessage;
};
(function() {
- n.implement(this, i), this.onError = function(e) {
- throw window.console && console.log && console.log(e), e;
- }, this.onMessage = function(e) {
+ n.implement(this, i), this.onMessage = function(e) {
var t = e.data;
switch (t.type) {
case "log":
@@ -11263,7 +11581,7 @@ function printStackTrace(e) {
break;
case "event":
- this._emit(t.name, {
+ this._signal(t.name, {
data: t.data
});
break;
@@ -11275,8 +11593,9 @@ function printStackTrace(e) {
}, this.$normalizePath = function(e) {
return location.host ? (e = e.replace(/^[a-z]+:\/\/[^\/]+/, ""), e = location.protocol + "//" + location.host + ("/" == e.charAt(0) ? "" : location.pathname.replace(/\/[^\/]*$/, "")) + "/" + e.replace(/^[\/]+/, "")) : e;
}, this.terminate = function() {
- this._emit("terminate", {}), this.deltaQueue = null, this.$worker.terminate(), this.$worker = null,
- this.$doc.removeEventListener("change", this.changeListener), this.$doc = null;
+ this._signal("terminate", {}), this.deltaQueue = null, this.$worker.terminate(),
+ this.$worker = null, this.$doc.removeEventListener("change", this.changeListener),
+ this.$doc = null;
}, this.send = function(e, t) {
this.$worker.postMessage({
command: e,
@@ -11302,12 +11621,23 @@ function printStackTrace(e) {
e.on("change", this.changeListener);
}, this.changeListener = function(e) {
this.deltaQueue ? this.deltaQueue.push(e.data) : (this.deltaQueue = [ e.data ],
- setTimeout(this.$sendDeltaQueue, 1));
+ setTimeout(this.$sendDeltaQueue, 0));
}, this.$sendDeltaQueue = function() {
var e = this.deltaQueue;
e && (this.deltaQueue = null, e.length > 20 && e.length > this.$doc.getLength() >> 1 ? this.call("setValue", [ this.$doc.getValue() ]) : this.emit("change", {
data: e
}));
+ }, this.$workerBlob = function(e) {
+ var t = 'importScripts("' + e + '");';
+ try {
+ var n = new Blob([ t ], {
+ type: "application/javascript"
+ });
+ } catch (i) {
+ var o = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder, r = new o();
+ r.append(t), n = r.getBlob("application/javascript");
+ }
+ return n;
};
}).call(r.prototype);
var s = function(e, t, n) {
@@ -11319,7 +11649,7 @@ function printStackTrace(e) {
};
var l = function() {
var e = a.messageBuffer.shift();
- e.command ? r[e.command].apply(r, e.args) : e.event && s._emit(e.event, e.data);
+ e.command ? r[e.command].apply(r, e.args) : e.event && s._signal(e.event, e.data);
};
s.postMessage = function(e) {
a.onMessage({
@@ -11475,7 +11805,7 @@ function printStackTrace(e) {
}, a = e.$findClosingBracket(t, s, r);
if (a) {
var l = e.foldWidgets[a.row];
- return null == l && (l = this.getFoldWidget(e, a.row)), "start" == l && a.row > s.row && (a.row--,
+ return null == l && (l = e.getFoldWidget(a.row)), "start" == l && a.row > s.row && (a.row--,
a.column = e.getLine(a.row).length), n.fromPoints(s, a);
}
}, this.closingBracketBlock = function(e, t, i, o) {
@@ -11490,11 +11820,215 @@ function printStackTrace(e) {
t.isDark = !1, t.cssClass = "ace-tm", t.cssText = e("../requirejs/text!./textmate.css");
var n = e("../lib/dom");
n.importCssString(t.cssText, t.cssClass);
-}), define("ace/ace", [ "require", "exports", "module", "./lib/fixoldbrowsers", "./lib/dom", "./lib/event", "./editor", "./edit_session", "./undomanager", "./virtual_renderer", "./multi_select", "./worker/worker_client", "./keyboard/hash_handler", "./placeholder", "./mode/folding/fold_mode", "./theme/textmate", "./config" ], function(e, t) {
+}), define("ace/line_widgets", [ "require", "exports", "module", "./lib/oop", "./lib/dom", "./range" ], function(e, t) {
+ function n(e) {
+ this.session = e, this.session.widgetManager = this, this.session.getRowLength = this.getRowLength,
+ this.session.$getWidgetScreenLength = this.$getWidgetScreenLength, this.updateOnChange = this.updateOnChange.bind(this),
+ this.renderWidgets = this.renderWidgets.bind(this), this.measureWidgets = this.measureWidgets.bind(this),
+ this.session._changedWidgets = [], this.detach = this.detach.bind(this), this.session.on("change", this.updateOnChange);
+ }
+ e("./lib/oop");
+ var i = e("./lib/dom");
+ e("./range").Range, function() {
+ this.getRowLength = function(e) {
+ var t;
+ return t = this.lineWidgets ? this.lineWidgets[e] && this.lineWidgets[e].rowCount || 0 : 0,
+ this.$useWrapMode && this.$wrapData[e] ? this.$wrapData[e].length + 1 + t : 1 + t;
+ }, this.$getWidgetScreenLength = function() {
+ var e = 0;
+ return this.lineWidgets.forEach(function(t) {
+ t && t.rowCount && (e += t.rowCount);
+ }), e;
+ }, this.attach = function(e) {
+ e.widgetManager && e.widgetManager != this && e.widgetManager.detach(), this.editor != e && (this.detach(),
+ this.editor = e, this.editor.on("changeSession", this.detach), e.widgetManager = this,
+ e.setOption("enableLineWidgets", !0), e.renderer.on("beforeRender", this.measureWidgets),
+ e.renderer.on("afterRender", this.renderWidgets));
+ }, this.detach = function(e) {
+ if (!e || e.session != this.session) {
+ var t = this.editor;
+ if (t) {
+ t.off("changeSession", this.detach), this.editor = null, t.widgetManager = null,
+ t.renderer.off("beforeRender", this.measureWidgets), t.renderer.off("afterRender", this.renderWidgets);
+ var n = this.session.lineWidgets;
+ n && n.forEach(function(e) {
+ e && e.el && e.el.parentNode && (e._inDocument = !1, e.el.parentNode.removeChild(e.el));
+ });
+ }
+ }
+ }, this.updateOnChange = function(e) {
+ var t = this.session.lineWidgets;
+ if (t) {
+ var n = e.data, i = n.range, o = i.start.row, r = i.end.row - o;
+ if (0 === r) ; else if ("removeText" == n.action || "removeLines" == n.action) {
+ var s = t.splice(o + 1, r);
+ s.forEach(function(e) {
+ e && this.removeLineWidget(e);
+ }, this), this.$updateRows();
+ } else {
+ var a = new Array(r);
+ a.unshift(o, 0), t.splice.apply(t, a), this.$updateRows();
+ }
+ }
+ }, this.$updateRows = function() {
+ var e = this.session.lineWidgets;
+ if (e) {
+ var t = !0;
+ e.forEach(function(e, n) {
+ e && (t = !1, e.row = n);
+ }), t && (this.session.lineWidgets = null);
+ }
+ }, this.addLineWidget = function(e) {
+ this.session.lineWidgets || (this.session.lineWidgets = new Array(this.session.getLength())),
+ this.session.lineWidgets[e.row] = e;
+ var t = this.editor.renderer;
+ return e.html && !e.el && (e.el = i.createElement("div"), e.el.innerHTML = e.html),
+ e.el && (i.addCssClass(e.el, "ace_lineWidgetContainer"), e.el.style.position = "absolute",
+ e.el.style.zIndex = 5, t.container.appendChild(e.el), e._inDocument = !0), e.coverGutter || (e.el.style.zIndex = 3),
+ e.pixelHeight || (e.pixelHeight = e.el.offsetHeight), null == e.rowCount && (e.rowCount = e.pixelHeight / t.layerConfig.lineHeight),
+ this.session._emit("changeFold", {
+ data: {
+ start: {
+ row: e.row
+ }
+ }
+ }), this.$updateRows(), this.renderWidgets(null, t), e;
+ }, this.removeLineWidget = function(e) {
+ if (e._inDocument = !1, e.el && e.el.parentNode && e.el.parentNode.removeChild(e.el),
+ e.editor && e.editor.destroy) try {
+ e.editor.destroy();
+ } catch (t) {}
+ this.session.lineWidgets && (this.session.lineWidgets[e.row] = void 0), this.session._emit("changeFold", {
+ data: {
+ start: {
+ row: e.row
+ }
+ }
+ }), this.$updateRows();
+ }, this.onWidgetChanged = function(e) {
+ this.session._changedWidgets.push(e), this.editor && this.editor.renderer.updateFull();
+ }, this.measureWidgets = function(e, t) {
+ var n = this.session._changedWidgets, i = t.layerConfig;
+ if (n && n.length) {
+ for (var o = 1/0, r = 0; r < n.length; r++) {
+ var s = n[r];
+ s._inDocument || (s._inDocument = !0, t.container.appendChild(s.el)), s.h = s.el.offsetHeight,
+ s.fixedWidth || (s.w = s.el.offsetWidth, s.screenWidth = Math.ceil(s.w / i.characterWidth));
+ var a = s.h / i.lineHeight;
+ s.coverLine && (a -= this.session.getRowLineCount(s.row), 0 > a && (a = 0)), s.rowCount != a && (s.rowCount = a,
+ s.row < o && (o = s.row));
+ }
+ 1/0 != o && (this.session._emit("changeFold", {
+ data: {
+ start: {
+ row: o
+ }
+ }
+ }), this.session.lineWidgetWidth = null), this.session._changedWidgets = [];
+ }
+ }, this.renderWidgets = function(e, t) {
+ var n = t.layerConfig, i = this.session.lineWidgets;
+ if (i) {
+ for (var o = Math.min(this.firstRow, n.firstRow), r = Math.max(this.lastRow, n.lastRow, i.length); o > 0 && !i[o]; ) o--;
+ this.firstRow = n.firstRow, this.lastRow = n.lastRow, t.$cursorLayer.config = n;
+ for (var s = o; r >= s; s++) {
+ var a = i[s];
+ if (a && a.el) {
+ a._inDocument || (a._inDocument = !0, t.container.appendChild(a.el));
+ var l = t.$cursorLayer.getPixelPosition({
+ row: s,
+ column: 0
+ }, !0).top;
+ a.coverLine || (l += n.lineHeight * this.session.getRowLineCount(a.row)), a.el.style.top = l - n.offset + "px";
+ var c = a.coverGutter ? 0 : t.gutterWidth;
+ a.fixedWidth || (c -= t.scrollLeft), a.el.style.left = c + "px", a.el.style.right = a.fixedWidth ? t.scrollBar.getWidth() + "px" : "";
+ }
+ }
+ }
+ };
+ }.call(n.prototype), t.LineWidgets = n;
+}), define("ace/ext/error_marker", [ "require", "exports", "module", "ace/line_widgets", "ace/lib/dom", "ace/range" ], function(e, t) {
+ function n(e, t, n) {
+ for (var i = 0, o = e.length - 1; o >= i; ) {
+ var r = i + o >> 1, s = n(t, e[r]);
+ if (s > 0) i = r + 1; else {
+ if (!(0 > s)) return r;
+ o = r - 1;
+ }
+ }
+ return -(i + 1);
+ }
+ function i(e, t, i) {
+ var o = e.getAnnotations().sort(s.comparePoints);
+ if (o.length) {
+ var r = n(o, {
+ row: t,
+ column: -1
+ }, s.comparePoints);
+ 0 > r && (r = -r - 1), r >= o.length - 1 ? r = i > 0 ? 0 : o.length - 1 : 0 === r && 0 > i && (r = o.length - 1);
+ var a = o[r];
+ if (a && i) {
+ if (a.row === t) {
+ do a = o[r += i]; while (a && a.row === t);
+ if (!a) return o.slice();
+ }
+ var l = [];
+ t = a.row;
+ do l[0 > i ? "unshift" : "push"](a), a = o[r += i]; while (a && a.row == t);
+ return l.length && l;
+ }
+ }
+ }
+ var o = e("ace/line_widgets").LineWidgets, r = e("ace/lib/dom"), s = e("ace/range").Range;
+ t.showErrorMarker = function(e, t) {
+ var n = e.session;
+ n.widgetManager || (n.widgetManager = new o(n), n.widgetManager.attach(e));
+ var s = e.getCursorPosition(), a = s.row, l = n.lineWidgets && n.lineWidgets[a];
+ l ? l.destroy() : a -= t;
+ var c, u = i(n, a, t);
+ if (u) {
+ var d = u[0];
+ s.column = (d.pos && "number" != typeof d.column ? d.pos.sc : d.column) || 0, s.row = d.row,
+ c = e.renderer.$gutterLayer.$annotations[s.row];
+ } else {
+ if (l) return;
+ c = {
+ text: [ "Looks good!" ],
+ className: "ace_ok"
+ };
+ }
+ e.session.unfold(s.row), e.selection.moveCursorToPosition(s), e.selection.clearSelection();
+ var h = {
+ row: s.row,
+ fixedWidth: !0,
+ coverGutter: !0,
+ el: r.createElement("div")
+ }, p = h.el.appendChild(r.createElement("div")), f = h.el.appendChild(r.createElement("div"));
+ f.className = "error_widget_arrow " + c.className;
+ var g = e.renderer.$cursorLayer.getPixelPosition(s).left;
+ f.style.left = g + e.renderer.gutterWidth - 5 + "px", h.el.className = "error_widget_wrapper",
+ p.className = "error_widget " + c.className, p.innerHTML = c.text.join("
");
+ var m = {
+ handleKeyboard: function(e, t, n) {
+ return 0 === t && "esc" === n ? (h.destroy(), !0) : void 0;
+ }
+ };
+ h.destroy = function() {
+ e.$mouseHandler.isMousePressed || (e.keyBinding.removeKeyboardHandler(m), n.widgetManager.removeLineWidget(h),
+ e.off("changeSelection", h.destroy), e.off("changeSession", h.destroy), e.off("mouseup", h.destroy),
+ e.off("change", h.destroy));
+ }, e.keyBinding.addKeyboardHandler(m), e.on("changeSelection", h.destroy), e.on("changeSession", h.destroy),
+ e.on("mouseup", h.destroy), e.on("change", h.destroy), e.session.widgetManager.addLineWidget(h),
+ h.el.onmousedown = e.focus.bind(e), e.renderer.scrollCursorIntoView(null, .5, {
+ bottom: h.el.offsetHeight
+ });
+ }, r.importCssString(" .error_widget_wrapper { background: inherit; color: inherit; border:none } .error_widget { border-top: solid 2px; border-bottom: solid 2px; margin: 5px 0; padding: 10px 40px; white-space: pre-wrap; } .error_widget.ace_error, .error_widget_arrow.ace_error{ border-color: #ff5a5a } .error_widget.ace_warning, .error_widget_arrow.ace_warning{ border-color: #F1D817 } .error_widget.ace_info, .error_widget_arrow.ace_info{ border-color: #5a5a5a } .error_widget.ace_ok, .error_widget_arrow.ace_ok{ border-color: #5aaa5a } .error_widget_arrow { position: absolute; border: solid 5px; border-top-color: transparent!important; border-right-color: transparent!important; border-left-color: transparent!important; top: -5px; }", "");
+}), define("ace/ace", [ "require", "exports", "module", "./lib/fixoldbrowsers", "./lib/dom", "./lib/event", "./editor", "./edit_session", "./undomanager", "./virtual_renderer", "./multi_select", "./worker/worker_client", "./keyboard/hash_handler", "./placeholder", "./mode/folding/fold_mode", "./theme/textmate", "./ext/error_marker", "./config" ], function(e, t) {
e("./lib/fixoldbrowsers");
var n = e("./lib/dom"), i = e("./lib/event"), o = e("./editor").Editor, r = e("./edit_session").EditSession, s = e("./undomanager").UndoManager, a = e("./virtual_renderer").VirtualRenderer, l = e("./multi_select").MultiSelect;
e("./worker/worker_client"), e("./keyboard/hash_handler"), e("./placeholder"), e("./mode/folding/fold_mode"),
- e("./theme/textmate"), t.config = e("./config"), t.require = e, t.edit = function(e) {
+ e("./theme/textmate"), e("./ext/error_marker"), t.config = e("./config"), t.require = e,
+ t.edit = function(e) {
if ("string" == typeof e) {
var r = e, e = document.getElementById(r);
if (!e) throw new Error("ace.edit can't find div #" + r);
@@ -11520,7 +12054,7 @@ function printStackTrace(e) {
return e;
}), define("constants", [], function() {
var e = {};
- return e.VERSION = "3.1.9", e.MAIN_URL = "https://stackedit.io/", e.GOOGLE_ANALYTICS_ACCOUNT_ID = "UA-39556145-1",
+ return e.VERSION = "3.1.10", e.MAIN_URL = "https://stackedit.io/", e.GOOGLE_ANALYTICS_ACCOUNT_ID = "UA-39556145-1",
e.GOOGLE_API_KEY = "AIzaSyAeCU8CGcSkn0z9js6iocHuPBX4f_mMWkw", e.GOOGLE_DRIVE_APP_ID = "241271498917",
e.DROPBOX_APP_KEY = "lq6mwopab8wskas", e.DROPBOX_APP_SECRET = "851fgnucpezy84t",
e.DROPBOX_RESTRICTED_APP_KEY = "sw0hlixhr8q1xk0", e.DROPBOX_RESTRICTED_APP_SECRET = "1r808p2xygs6lbg",
@@ -21873,47 +22407,33 @@ function() {
if (Math.abs(n - d) <= 9) return;
if (m = !1, d = n, i = e(n, p, f), i = t.min([ i, u.prop("scrollHeight") - u.outerHeight() ]),
Math.abs(i - o) <= 9) return h = o, void 0;
- u.stop("scrollLinkFx", !0).animate({
- scrollTop: i
+ w.stop("scrollLinkFx", !0).css("value", 0).animate({
+ value: i - o
}, {
easing: "easeOutSine",
duration: 200,
queue: "scrollLinkFx",
step: function(e) {
- y = !0, h = o + e;
+ y = !0, h = o + e, u.scrollTop(h);
},
done: function() {
- setTimeout(function() {
+ t.defer(function() {
y = !1;
- }, 100);
+ });
}
}).dequeue("scrollLinkFx");
} else if (v === !0) {
if (Math.abs(o - h) <= 9) return;
if (v = !1, h = o, i = e(o, f, p), window.lightMode ? i = t.min([ i, l.prop("scrollHeight") - l.outerHeight() ]) : (i = t.min([ i, r.session.getScreenLength() * r.renderer.lineHeight + r.renderer.scrollMargin.bottom - r.renderer.$size.scrollerHeight ]),
0 > i && (i = 0)), Math.abs(i - n) <= 9) return d = n, void 0;
- window.lightMode ? l.stop("scrollLinkFx", !0).animate({
- scrollTop: i
- }, {
- easing: "easeOutSine",
- duration: 200,
- queue: "scrollLinkFx",
- step: function(e) {
- b = !0, d = n + e;
- },
- done: function() {
- setTimeout(function() {
- b = !1;
- }, 100);
- }
- }).dequeue("scrollLinkFx") : w.stop("scrollLinkFx", !0).css("value", 0).animate({
+ w.stop("scrollLinkFx", !0).css("value", 0).animate({
value: i - n
}, {
easing: "easeOutSine",
duration: 200,
queue: "scrollLinkFx",
step: function(e) {
- b = !0, d = n + e, r.session.setScrollTop(d);
+ b = !0, d = n + e, window.lightMode || r.session.setScrollTop(d), window.lightMode && l.scrollTop(d);
},
done: function() {
t.defer(function() {
@@ -27733,7 +28253,7 @@ function() {
}(), define("pagedown-light", function() {}), define("ace/mode/css_highlight_rules", [ "require", "exports", "module", "../lib/oop", "../lib/lang", "./text_highlight_rules" ], function(e, t) {
var n = e("../lib/oop");
e("../lib/lang");
- var i = e("./text_highlight_rules").TextHighlightRules, o = t.supportType = "animation-fill-mode|alignment-adjust|alignment-baseline|animation-delay|animation-direction|animation-duration|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|animation|appearance|azimuth|backface-visibility|background-attachment|background-break|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|background|baseline-shift|binding|bleed|bookmark-label|bookmark-level|bookmark-state|bookmark-target|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|border|bottom|box-align|box-decoration-break|box-direction|box-flex-group|box-flex|box-lines|box-ordinal-group|box-orient|box-pack|box-shadow|box-sizing|break-after|break-before|break-inside|caption-side|clear|clip|color-profile|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|crop|cue-after|cue-before|cue|cursor|direction|display|dominant-baseline|drop-initial-after-adjust|drop-initial-after-align|drop-initial-before-adjust|drop-initial-before-align|drop-initial-size|drop-initial-value|elevation|empty-cells|fit|fit-position|float-offset|float|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|font|grid-columns|grid-rows|hanging-punctuation|height|hyphenate-after|hyphenate-before|hyphenate-character|hyphenate-lines|hyphenate-resource|hyphens|icon|image-orientation|image-rendering|image-resolution|inline-box-align|left|letter-spacing|line-height|line-stacking-ruby|line-stacking-shift|line-stacking-strategy|line-stacking|list-style-image|list-style-position|list-style-type|list-style|margin-bottom|margin-left|margin-right|margin-top|margin|mark-after|mark-before|mark|marks|marquee-direction|marquee-play-count|marquee-speed|marquee-style|max-height|max-width|min-height|min-width|move-to|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|orphans|outline-color|outline-offset|outline-style|outline-width|outline|overflow-style|overflow-x|overflow-y|overflow|padding-bottom|padding-left|padding-right|padding-top|padding|page-break-after|page-break-before|page-break-inside|page-policy|page|pause-after|pause-before|pause|perspective-origin|perspective|phonemes|pitch-range|pitch|play-during|position|presentation-level|punctuation-trim|quotes|rendering-intent|resize|rest-after|rest-before|rest|richness|right|rotation-point|rotation|ruby-align|ruby-overhang|ruby-position|ruby-span|size|speak-header|speak-numeral|speak-punctuation|speak|speech-rate|stress|string-set|table-layout|target-name|target-new|target-position|target|text-align-last|text-align|text-decoration|text-emphasis|text-height|text-indent|text-justify|text-outline|text-shadow|text-transform|text-wrap|top|transform-origin|transform-style|transform|transition-delay|transition-duration|transition-property|transition-timing-function|transition|unicode-bidi|vertical-align|visibility|voice-balance|voice-duration|voice-family|voice-pitch-range|voice-pitch|voice-rate|voice-stress|voice-volume|volume|white-space-collapse|white-space|widows|width|word-break|word-spacing|word-wrap|z-index", r = t.supportFunction = "rgb|rgba|url|attr|counter|counters", s = t.supportConstant = "absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero", a = t.supportConstantColor = "aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow", l = t.supportConstantFonts = "arial|century|comic|courier|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace", c = t.numRe = "\\-?(?:(?:[0-9]+)|(?:[0-9]*\\.[0-9]+))", u = t.pseudoElements = "(\\:+)\\b(after|before|first-letter|first-line|moz-selection|selection)\\b", d = t.pseudoClasses = "(:)\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\b", h = function() {
+ var i = e("./text_highlight_rules").TextHighlightRules, o = t.supportType = "animation-fill-mode|alignment-adjust|alignment-baseline|animation-delay|animation-direction|animation-duration|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|animation|appearance|azimuth|backface-visibility|background-attachment|background-break|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|background|baseline-shift|binding|bleed|bookmark-label|bookmark-level|bookmark-state|bookmark-target|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|border|bottom|box-align|box-decoration-break|box-direction|box-flex-group|box-flex|box-lines|box-ordinal-group|box-orient|box-pack|box-shadow|box-sizing|break-after|break-before|break-inside|caption-side|clear|clip|color-profile|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|crop|cue-after|cue-before|cue|cursor|direction|display|dominant-baseline|drop-initial-after-adjust|drop-initial-after-align|drop-initial-before-adjust|drop-initial-before-align|drop-initial-size|drop-initial-value|elevation|empty-cells|fit|fit-position|float-offset|float|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|font|grid-columns|grid-rows|hanging-punctuation|height|hyphenate-after|hyphenate-before|hyphenate-character|hyphenate-lines|hyphenate-resource|hyphens|icon|image-orientation|image-rendering|image-resolution|inline-box-align|left|letter-spacing|line-height|line-stacking-ruby|line-stacking-shift|line-stacking-strategy|line-stacking|list-style-image|list-style-position|list-style-type|list-style|margin-bottom|margin-left|margin-right|margin-top|margin|mark-after|mark-before|mark|marks|marquee-direction|marquee-play-count|marquee-speed|marquee-style|max-height|max-width|min-height|min-width|move-to|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|orphans|outline-color|outline-offset|outline-style|outline-width|outline|overflow-style|overflow-x|overflow-y|overflow|padding-bottom|padding-left|padding-right|padding-top|padding|page-break-after|page-break-before|page-break-inside|page-policy|page|pause-after|pause-before|pause|perspective-origin|perspective|phonemes|pitch-range|pitch|play-during|pointer-events|position|presentation-level|punctuation-trim|quotes|rendering-intent|resize|rest-after|rest-before|rest|richness|right|rotation-point|rotation|ruby-align|ruby-overhang|ruby-position|ruby-span|size|speak-header|speak-numeral|speak-punctuation|speak|speech-rate|stress|string-set|table-layout|target-name|target-new|target-position|target|text-align-last|text-align|text-decoration|text-emphasis|text-height|text-indent|text-justify|text-outline|text-shadow|text-transform|text-wrap|top|transform-origin|transform-style|transform|transition-delay|transition-duration|transition-property|transition-timing-function|transition|unicode-bidi|vertical-align|visibility|voice-balance|voice-duration|voice-family|voice-pitch-range|voice-pitch|voice-rate|voice-stress|voice-volume|volume|white-space-collapse|white-space|widows|width|word-break|word-spacing|word-wrap|z-index", r = t.supportFunction = "rgb|rgba|url|attr|counter|counters", s = t.supportConstant = "absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero", a = t.supportConstantColor = "aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow", l = t.supportConstantFonts = "arial|century|comic|courier|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace", c = t.numRe = "\\-?(?:(?:[0-9]+)|(?:[0-9]*\\.[0-9]+))", u = t.pseudoElements = "(\\:+)\\b(after|before|first-letter|first-line|moz-selection|selection)\\b", d = t.pseudoClasses = "(:)\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\b", h = function() {
var e = this.createKeywordMapper({
"support.function": r,
"support.constant": s,
@@ -28003,14 +28523,14 @@ function() {
regex: "\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)"
}, {
token: "string.regexp",
- regex: "/\\w*",
+ regex: "/[sxngimy]*",
next: "no_regex"
}, {
token: "invalid",
regex: /\{\d+\b,?\d*\}[+*]|[+*$^?][+*]|[$^][?]|\?{3,}/
}, {
token: "constant.language.escape",
- regex: /\(\?[:=!]|\)|\{\d+\b,?\d*\}|[+*]\?|[()$^+*?]/
+ regex: /\(\?[:=!]|\)|\{\d+\b,?\d*\}|[+*]\?|[()$^+*?.]/
}, {
token: "constant.language.delimiter",
regex: /\|/
@@ -28296,7 +28816,7 @@ function() {
token: "constant.language.escape",
regex: "(?:[0-9]+;)|(?:[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)"
}, {
- token: "invalid.illegal",
+ token: "text",
regex: "&"
} ],
string: [ {
@@ -30079,8 +30599,8 @@ function() {
void 0 !== a && (a.setVisible(!1), t(".modal-backdrop, .picker").remove());
}
var a, l = [], u = new c();
- u.timeout = n.ASYNC_TASK_LONG_TIMEOUT, d(u), ("doc" == i || "folder" == i) && h(u, "gdrive", r),
- g(u), u.onRun(function() {
+ u.timeout = n.ASYNC_TASK_LONG_TIMEOUT, d(u), "doc" == i || "folder" == i ? h(u, "gdrive", r) : (r = "google.picasa0",
+ h(u, "picasa", r)), g(u), u.onRun(function() {
var e = v[r], c = new google.picker.PickerBuilder();
c.setAppId(n.GOOGLE_DRIVE_APP_ID);
var d;
@@ -30091,7 +30611,8 @@ function() {
d.setParent("root"), d.setIncludeFolders(!0), d.setSelectFolderEnabled(!0), d.setMimeTypes("application/vnd.google-apps.folder"),
c.enableFeature(google.picker.Feature.NAV_HIDDEN), c.addView(d), e && e.token && c.setOAuthToken(e.token.access_token)) : "img" == i && (d = new google.picker.PhotosView(),
d.setType("flat"), c.addView(d), d = new google.picker.PhotosView(), d.setType("ofuser"),
- c.addView(d), c.addView(google.picker.ViewId.PHOTO_UPLOAD)), c.setCallback(function(e) {
+ c.addView(d), c.addView(google.picker.ViewId.PHOTO_UPLOAD), e && e.token && c.setOAuthToken(e.token.access_token)),
+ c.setCallback(function(e) {
(e.action == google.picker.Action.PICKED || e.action == google.picker.Action.CANCEL) && (e.action == google.picker.Action.PICKED && (l = e.docs),
s(), u.chain());
}), a = c.build(), t(o.createBackdrop()).click(function() {
diff --git a/public/res-min/themes/default.css b/public/res-min/themes/default.css
index fe952740..35041b49 100644
--- a/public/res-min/themes/default.css
+++ b/public/res-min/themes/default.css
@@ -1231,28 +1231,29 @@ kbd{padding:0.1em 0.6em;border:1px solid rgba(22,32,41,0.25);-webkit-box-shadow:
.icon-provider-gplus{background-position:-144px 0}
body.rtl #wmd-input,body.rtl #preview-contents,body.rtl .input-file-title,body.rtl .search-bar input,body.rtl .modal-document-manager input,body.rtl .container{direction:rtl}
body.pdf{font-family:"DejaVu Sans"}body.pdf code,body.pdf pre{font-family:"DejaVu Sans Mono"}
-.ace_editor{position:relative;overflow:hidden;font-family:'Monaco','Menlo','Ubuntu Mono','Consolas','source-code-pro',monospace;font-size:12px;line-height:normal;color:black;-ms-user-select:none;-moz-user-select:none;-webkit-user-select:none;user-select:none}
-.ace_scroller{position:absolute;overflow:hidden;top:0;bottom:0;background-color:inherit}
-.ace_content{position:absolute;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;cursor:text}
+.ace_editor{position:relative;overflow:hidden;font-family:'Monaco','Menlo','Ubuntu Mono','Consolas','source-code-pro',monospace;font-size:12px;line-height:normal;direction:ltr}
+.ace_scroller{position:absolute;overflow:hidden;top:0;bottom:0;background-color:inherit;-ms-user-select:none;-moz-user-select:none;-webkit-user-select:none;user-select:none}
+.ace_content{position:absolute;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;cursor:text;min-width:100%}
.ace_dragging,.ace_dragging *{cursor:move !important}
.ace_dragging .ace_scroller:before{position:absolute;top:0;left:0;right:0;bottom:0;content:'';background:rgba(250,250,250,0.01);z-index:1000}
.ace_dragging.ace_dark .ace_scroller:before{background:rgba(0,0,0,0.01)}
.ace_selecting,.ace_selecting *{cursor:text !important}
-.ace_gutter{position:absolute;overflow:hidden;width:auto;top:0;bottom:0;left:0;cursor:default;z-index:4}
+.ace_gutter{position:absolute;overflow:hidden;width:auto;top:0;bottom:0;left:0;cursor:default;z-index:4;-ms-user-select:none;-moz-user-select:none;-webkit-user-select:none;user-select:none}
.ace_gutter-active-line{position:absolute;left:0;right:0}
.ace_scroller.ace_scroll-left{box-shadow:17px 0 16px -16px rgba(0,0,0,0.4) inset}
.ace_gutter-cell{padding-left:19px;padding-right:6px;background-repeat:no-repeat}
-.ace_gutter-cell.ace_error{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QUM2OEZDQTQ4RTU0MTFFMUEzM0VFRTM2RUY1M0RBMjYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QUM2OEZDQTU4RTU0MTFFMUEzM0VFRTM2RUY1M0RBMjYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpBQzY4RkNBMjhFNTQxMUUxQTMzRUVFMzZFRjUzREEyNiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpBQzY4RkNBMzhFNTQxMUUxQTMzRUVFMzZFRjUzREEyNiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PkgXxbAAAAJbSURBVHjapFNNaBNBFH4zs5vdZLP5sQmNpT82QY209heh1ioWisaDRcSKF0WKJ0GQnrzrxasHsR6EnlrwD0TagxJabaVEpFYxLWlLSS822tr87m66ccfd2GKyVhA6MMybgfe97/vmPUQphd0sZjto9XIn9OOsvlu2nkqRzVU+6vvlzPf8W6bk8dxQ0NPbxAALgCgg2JkaQuhzQau/El0zbmUA7U0Es8v2CiYmKQJHGO1QICCLoqilMhkmurDAyapKgqItezi/USRdJqEYY4D5jCy03ht2yMkkvL91jTTX10qzyyu2hruPRN7jgbH+EOsXcMLgYiThEgAMhABW85oqy1DXdRIdvP1AHJ2acQXvDIrVHcdQNrEKNYSVMSZGMjEzIIAwDXIo+6G/FxcGnzkC3T2oMhLjre49sBB+RRcHLqdafK6sYdE/GGBwU1VpFNj0aN8pJbe+BkZyevUrvLl6Xmm0W9IuTc0DxrDNAJd5oEvI/KRsNC3bQyNjPO9yQ1YHcfj2QvfQc/5TUhJTBc2iM0U7AWDQtc1nJHvD/cfO2s7jaGkiTEfa/Ep8coLu7zmNmh8+dc5lZDuUeFAGUNA/OY6JVaypQ0vjr7XYjUvJM37vt+j1vuTK5DgVfVUoTjVe+y3/LxMxY2GgU+CSLy4cpfsYorRXuXIOi0Vt40h67uZFTdIo6nLaZcwUJWAzwNS0tBnqqKzQDnjdG/iPyZxo46HaKUpbvYkj8qYRTZsBhge+JHhZyh0x9b95JqjVJkT084kZIPwu/mPWqPgfQ5jXh2+92Ay7HedfAgwA6KDWafb4w3cAAAAASUVORK5CYII=");background-repeat:no-repeat;background-position:2px center}
-.ace_gutter-cell.ace_warning{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QUM2OEZDQTg4RTU0MTFFMUEzM0VFRTM2RUY1M0RBMjYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QUM2OEZDQTk4RTU0MTFFMUEzM0VFRTM2RUY1M0RBMjYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpBQzY4RkNBNjhFNTQxMUUxQTMzRUVFMzZFRjUzREEyNiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpBQzY4RkNBNzhFNTQxMUUxQTMzRUVFMzZFRjUzREEyNiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pgd7PfIAAAGmSURBVHjaYvr//z8DJZiJgUIANoCRkREb9gLiSVAaQx4OQM7AAkwd7XU2/v++/rOttdYGEB9dASEvOMydGKfH8Gv/p4XTkvRBfLxeQAP+1cUhXopyvzhP7P/IoSj7g7Mw09cNKO6J1QQ0L4gICPIv/veg/8W+JdFvQNLHVsW9/nmn9zk7B+cCkDwhL7gt6knSZnx9/LuCEOcvkIAMP+cvto9nfqyZmmUAksfnBUtbM60gX/3/kgyv3/xSFOL5DZT+L8vP+Yfh5cvfPvp/xUHyQHXGyAYwgpwBjZYFT3Y1OEl/OfCH4ffv3wzc4iwMvNIsDJ+f/mH4+vIPAxsb631WW0Yln6ZpQLXdMK/DXGDflh+sIv37EivD5x//Gb7+YWT4y86sl7BCCkSD+Z++/1dkvsFRl+HnD1Rvje4F8whjMXmGj58YGf5zsDMwcnAwfPvKcml62DsQDeaDxN+/Y0qwlpEHqrdB94IRNIDUgfgfKJChGK4OikEW3gTiXUB950ASLFAF54AC94A0G9QAfOnmF9DCDzABFqS08IHYDIScdijOjQABBgC+/9awBH96jwAAAABJRU5ErkJggg==");background-position:2px center}
-.ace_gutter-cell.ace_info{background-image:url("data:image/gif;base64,R0lGODlhEAAQAMQAAAAAAEFBQVJSUl5eXmRkZGtra39/f4WFhYmJiZGRkaampry8vMPDw8zMzNXV1dzc3OTk5Orq6vDw8P///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAkAABQALAAAAAAQABAAAAUuICWOZGmeaBml5XGwFCQSBGyXRSAwtqQIiRuiwIM5BoYVbEFIyGCQoeJGrVptIQA7");background-position:2px center}
-.ace_dark .ace_gutter-cell.ace_info{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpGRTk5MTVGREIxNDkxMUUxOTc5Q0FFREQyMTNGMjBFQyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpGRTk5MTVGRUIxNDkxMUUxOTc5Q0FFREQyMTNGMjBFQyI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkZFOTkxNUZCQjE0OTExRTE5NzlDQUVERDIxM0YyMEVDIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkZFOTkxNUZDQjE0OTExRTE5NzlDQUVERDIxM0YyMEVDIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+SIDkjAAAAJ1JREFUeNpi/P//PwMlgImBQkB7A6qrq/+DMC55FkIGKCoq4pVnpFkgTp069f/+/fv/r1u37r+tre1/kg0A+ptn9uzZYLaRkRHpLvjw4cNXWVlZhufPnzOcO3eOdAO0tbVPAjHDmzdvGA4fPsxIsgGSkpJmv379Ynj37h2DjIyMCMkG3LhxQ/T27dsMampqDHZ2dq/pH41DxwCAAAMAFdc68dUsFZgAAAAASUVORK5CYII=")}
-.ace_scrollbar{position:absolute;overflow-x:hidden;overflow-y:auto;right:0;top:0;bottom:0;z-index:6}
+.ace_gutter-cell.ace_error{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABOFBMVEX/////////QRswFAb/Ui4wFAYwFAYwFAaWGAfDRymzOSH/PxswFAb/SiUwFAYwFAbUPRvjQiDllog5HhHdRybsTi3/Tyv9Tir+Syj/UC3////XurebMBIwFAb/RSHbPx/gUzfdwL3kzMivKBAwFAbbvbnhPx66NhowFAYwFAaZJg8wFAaxKBDZurf/RB6mMxb/SCMwFAYwFAbxQB3+RB4wFAb/Qhy4Oh+4QifbNRcwFAYwFAYwFAb/QRzdNhgwFAYwFAbav7v/Uy7oaE68MBK5LxLewr/r2NXewLswFAaxJw4wFAbkPRy2PyYwFAaxKhLm1tMwFAazPiQwFAaUGAb/QBrfOx3bvrv/VC/maE4wFAbRPBq6MRO8Qynew8Dp2tjfwb0wFAbx6eju5+by6uns4uH9/f36+vr/GkHjAAAAYnRSTlMAGt+64rnWu/bo8eAA4InH3+DwoN7j4eLi4xP99Nfg4+b+/u9B/eDs1MD1mO7+4PHg2MXa347g7vDizMLN4eG+Pv7i5evs/v79yu7S3/DV7/498Yv24eH+4ufQ3Ozu/v7+y13sRqwAAADLSURBVHjaZc/XDsFgGIBhtDrshlitmk2IrbHFqL2pvXf/+78DPokj7+Fz9qpU/9UXJIlhmPaTaQ6QPaz0mm+5gwkgovcV6GZzd5JtCQwgsxoHOvJO15kleRLAnMgHFIESUEPmawB9ngmelTtipwwfASilxOLyiV5UVUyVAfbG0cCPHig+GBkzAENHS0AstVF6bacZIOzgLmxsHbt2OecNgJC83JERmePUYq8ARGkJx6XtFsdddBQgZE2nPR6CICZhawjA4Fb/chv+399kfR+MMMDGOQAAAABJRU5ErkJggg==");background-repeat:no-repeat;background-position:2px center}
+.ace_gutter-cell.ace_warning{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAmVBMVEX///8AAAD///8AAAAAAABPSzb/5sAAAAB/blH/73z/ulkAAAAAAAD85pkAAAAAAAACAgP/vGz/rkDerGbGrV7/pkQICAf////e0IsAAAD/oED/qTvhrnUAAAD/yHD/njcAAADuv2r/nz//oTj/p064oGf/zHAAAAA9Nir/tFIAAAD/tlTiuWf/tkIAAACynXEAAAAAAAAtIRW7zBpBAAAAM3RSTlMAABR1m7RXO8Ln31Z36zT+neXe5OzooRDfn+TZ4p3h2hTf4t3k3ucyrN1K5+Xaks52Sfs9CXgrAAAAjklEQVR42o3PbQ+CIBQFYEwboPhSYgoYunIqqLn6/z8uYdH8Vmdnu9vz4WwXgN/xTPRD2+sgOcZjsge/whXZgUaYYvT8QnuJaUrjrHUQreGczuEafQCO/SJTufTbroWsPgsllVhq3wJEk2jUSzX3CUEDJC84707djRc5MTAQxoLgupWRwW6UB5fS++NV8AbOZgnsC7BpEAAAAABJRU5ErkJggg==");background-position:2px center}
+.ace_gutter-cell.ace_info{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAAAAAA6mKC9AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAAJ0Uk5TAAB2k804AAAAPklEQVQY02NgIB68QuO3tiLznjAwpKTgNyDbMegwisCHZUETUZV0ZqOquBpXj2rtnpSJT1AEnnRmL2OgGgAAIKkRQap2htgAAAAASUVORK5CYII=");background-position:2px center}
+.ace_dark .ace_gutter-cell.ace_info{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAJFBMVEUAAAChoaGAgIAqKiq+vr6tra1ZWVmUlJSbm5s8PDxubm56enrdgzg3AAAAAXRSTlMAQObYZgAAAClJREFUeNpjYMAPdsMYHegyJZFQBlsUlMFVCWUYKkAZMxZAGdxlDMQBAG+TBP4B6RyJAAAAAElFTkSuQmCC")}
+.ace_scrollbar{position:absolute;right:0;bottom:0;z-index:6}
.ace_scrollbar-inner{position:absolute;cursor:text;left:0;top:0}
-.ace_scrollbar-h{position:absolute;overflow-x:auto;overflow-y:hidden;right:0;left:0;bottom:0;z-index:6}
+.ace_scrollbar-v{overflow-x:hidden;overflow-y:scroll;top:0}
+.ace_scrollbar-h{overflow-x:scroll;overflow-y:hidden;left:0}
.ace_print-margin{position:absolute;height:100%}
-.ace_text-input{position:absolute;z-index:0;width:0.5em;height:1em;opacity:0;background:transparent;-moz-appearance:none;appearance:none;border:none;resize:none;outline:none;overflow:hidden;font:inherit;padding:0 1px;margin:0 -1px;text-indent:-1em}
+.ace_text-input{position:absolute;z-index:0;width:0.5em;height:1em;opacity:0;background:transparent;-moz-appearance:none;appearance:none;border:none;resize:none;outline:none;overflow:hidden;font:inherit;padding:0 1px;margin:0 -1px;text-indent:-1em;-ms-user-select:text;-moz-user-select:text;-webkit-user-select:text;user-select:text}
.ace_text-input.ace_composition{background:#f8f8f8;color:#111;z-index:1000;opacity:1;text-indent:0}
-.ace_layer{z-index:1;position:absolute;overflow:hidden;white-space:nowrap;height:100%;width:100%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;pointer-events:none}
+.ace_layer{z-index:1;position:absolute;overflow:hidden;white-space:pre;height:100%;width:100%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;pointer-events:none}
.ace_gutter-layer{position:relative;width:auto;text-align:right;pointer-events:auto}
.ace_text-layer{font:inherit !important}
.ace_cjk{display:inline-block;text-align:center}
@@ -1262,22 +1263,20 @@ body.pdf{font-family:"DejaVu Sans"}body.pdf code,body.pdf pre{font-family:"DejaV
.ace_overwrite-cursors .ace_cursor{border-left-width:0px;border-bottom:1px solid}
.ace_hidden-cursors .ace_cursor{opacity:0.2}
.ace_smooth-blinking .ace_cursor{-moz-transition:opacity 0.18s;-webkit-transition:opacity 0.18s;-o-transition:opacity 0.18s;-ms-transition:opacity 0.18s;transition:opacity 0.18s}
-.ace_cursor[style*="opacity: 0"]{-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"}
.ace_editor.ace_multiselect .ace_cursor{border-left-width:1px}
-.ace_line{white-space:nowrap}
.ace_marker-layer .ace_step,.ace_marker-layer .ace_stack{position:absolute;z-index:3}
.ace_marker-layer .ace_selection{position:absolute;z-index:5}
.ace_marker-layer .ace_bracket{position:absolute;z-index:6}
.ace_marker-layer .ace_active-line{position:absolute;z-index:2}
.ace_marker-layer .ace_selected-word{position:absolute;z-index:4;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}
-.ace_line .ace_fold{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;display:inline-block;height:11px;margin-top:-2px;vertical-align:middle;background-image:url("data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%11%00%00%00%09%08%06%00%00%00%D4%E8%C7%0C%00%00%03%1EiCCPICC%20Profile%00%00x%01%85T%DFk%D3P%14%FE%DAe%9D%B0%E1%8B%3Ag%11%09%3Eh%91ndStC%9C%B6kW%BA%CDZ%EA6%B7!H%9B%A6m%5C%9A%C6%24%ED~%B0%07%D9%8Bo%3A%C5w%F1%07%3E%F9%07%0C%D9%83o%7B%92%0D%C6%14a%F8%AC%88%22L%F6%22%B3%9E%9B4M'S%03%B9%F7%BB%DF%F9%EE9'%E7%E4%5E%A0%F9qZ%D3%14%2F%0F%14USO%C5%C2%FC%C4%E4%14%DF%F2%01%5E%1CC%2B%FChM%8B%86%16J%26G%40%0F%D3%B2y%EF%B3%F3%0E%1E%C6lt%EEo%DF%AB%FEc%D5%9A%95%0C%11%F0%1C%20%BE%945%C4%22%E1Y%A0i%5C%D4t%13%E0%D6%89%EF%9D15%C2%CDLsX%A7%04%09%1Fg8oc%81%E1%8C%8D%23%96f45%40%9A%09%C2%07%C5B%3AK%B8%408%98i%E0%F3%0D%D8%CE%81%14%E4'%26%A9%92.%8B%3C%ABER%2F%E5dE%B2%0C%F6%F0%1Fs%83%F2_%B0%A8%94%E9%9B%AD%E7%10%8Dm%9A%19N%D1%7C%8A%DE%1F9%7Dp%8C%E6%00%D5%C1%3F_%18%BDA%B8%9DpX6%E3%A35~B%CD%24%AE%11%26%BD%E7%EEti%98%EDe%9A%97Y)%12%25%1C%24%BCbT%AE3li%E6%0B%03%89%9A%E6%D3%ED%F4P%92%B0%9F4%BF43Y%F3%E3%EDP%95%04%EB1%C5%F5%F6KF%F4%BA%BD%D7%DB%91%93%07%E35%3E%A7)%D6%7F%40%FE%BD%F7%F5r%8A%E5y%92%F0%EB%B4%1E%8D%D5%F4%5B%92%3AV%DB%DB%E4%CD%A6%23%C3%C4wQ%3F%03HB%82%8E%1Cd(%E0%91B%0Ca%9Ac%C4%AA%F8L%16%19%22J%A4%D2itTy%B28%D6%3B(%93%96%ED%1CGx%C9_%0E%B8%5E%16%F5%5B%B2%B8%F6%E0%FB%9E%DD%25%D7%8E%BC%15%85%C5%B7%A3%D8Q%ED%B5%81%E9%BA%B2%13%9A%1B%7Fua%A5%A3n%E17%B9%E5%9B%1Bm%AB%0B%08Q%FE%8A%E5%B1H%5Ee%CAO%82Q%D7u6%E6%90S%97%FCu%0B%CF2%94%EE%25v%12X%0C%BA%AC%F0%5E%F8*l%0AO%85%17%C2%97%BF%D4%C8%CE%DE%AD%11%CB%80q%2C%3E%AB%9ES%CD%C6%EC%25%D2L%D2%EBd%B8%BF%8A%F5B%C6%18%F9%901CZ%9D%BE%24M%9C%8A9%F2%DAP%0B'%06w%82%EB%E6%E2%5C%2F%D7%07%9E%BB%CC%5D%E1%FA%B9%08%AD.r%23%8E%C2%17%F5E%7C!%F0%BE3%BE%3E_%B7o%88a%A7%DB%BE%D3d%EB%A31Z%EB%BB%D3%91%BA%A2%B1z%94%8F%DB'%F6%3D%8E%AA%13%19%B2%B1%BE%B1~V%08%2B%B4%A2cjJ%B3tO%00%03%25mN%97%F3%05%93%EF%11%84%0B%7C%88%AE-%89%8F%ABbW%90O%2B%0Ao%99%0C%5E%97%0CI%AFH%D9.%B0%3B%8F%ED%03%B6S%D6%5D%E6i_s9%F3*p%E9%1B%FD%C3%EB.7U%06%5E%19%C0%D1s.%17%A03u%E4%09%B0%7C%5E%2C%EB%15%DB%1F%3C%9E%B7%80%91%3B%DBc%AD%3Dma%BA%8B%3EV%AB%DBt.%5B%1E%01%BB%0F%AB%D5%9F%CF%AA%D5%DD%E7%E4%7F%0Bx%A3%FC%06%A9%23%0A%D6%C2%A1_2%00%00%00%09pHYs%00%00%0B%13%00%00%0B%13%01%00%9A%9C%18%00%00%00%B5IDAT(%15%A5%91%3D%0E%02!%10%85ac%E1%05%D6%CE%D6%C6%CE%D2%E8%ED%CD%DE%C0%C6%D6N.%E0V%F8%3D%9Ca%891XH%C2%BE%D9y%3F%90!%E6%9C%C3%BFk%E5%011%C6-%F5%C8N%04%DF%BD%FF%89%DFt%83DN%60%3E%F3%AB%A0%DE%1A%5Dg%BE%10Q%97%1B%40%9C%A8o%10%8F%5E%828%B4%1B%60%87%F6%02%26%85%1Ch%1E%C1%2B%5Bk%FF%86%EE%B7j%09%9A%DA%9B%ACe%A3%F9%EC%DA!9%B4%D5%A6%81%86%86%98%CC%3C%5B%40%FA%81%B3%E9%CB%23%94%C16Azo%05%D4%E1%C1%95a%3B%8A'%A0%E8%CC%17%22%85%1D%BA%00%A2%FA%DC%0A%94%D1%D1%8D%8B%3A%84%17B%C7%60%1A%25Z%FC%8D%00%00%00%00IEND%AEB%60%82"),url("data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%05%00%00%007%08%06%00%00%00%C4%DD%80C%00%00%03%1EiCCPICC%20Profile%00%00x%01%85T%DFk%D3P%14%FE%DAe%9D%B0%E1%8B%3Ag%11%09%3Eh%91ndStC%9C%B6kW%BA%CDZ%EA6%B7!H%9B%A6m%5C%9A%C6%24%ED~%B0%07%D9%8Bo%3A%C5w%F1%07%3E%F9%07%0C%D9%83o%7B%92%0D%C6%14a%F8%AC%88%22L%F6%22%B3%9E%9B4M'S%03%B9%F7%BB%DF%F9%EE9'%E7%E4%5E%A0%F9qZ%D3%14%2F%0F%14USO%C5%C2%FC%C4%E4%14%DF%F2%01%5E%1CC%2B%FChM%8B%86%16J%26G%40%0F%D3%B2y%EF%B3%F3%0E%1E%C6lt%EEo%DF%AB%FEc%D5%9A%95%0C%11%F0%1C%20%BE%945%C4%22%E1Y%A0i%5C%D4t%13%E0%D6%89%EF%9D15%C2%CDLsX%A7%04%09%1Fg8oc%81%E1%8C%8D%23%96f45%40%9A%09%C2%07%C5B%3AK%B8%408%98i%E0%F3%0D%D8%CE%81%14%E4'%26%A9%92.%8B%3C%ABER%2F%E5dE%B2%0C%F6%F0%1Fs%83%F2_%B0%A8%94%E9%9B%AD%E7%10%8Dm%9A%19N%D1%7C%8A%DE%1F9%7Dp%8C%E6%00%D5%C1%3F_%18%BDA%B8%9DpX6%E3%A35~B%CD%24%AE%11%26%BD%E7%EEti%98%EDe%9A%97Y)%12%25%1C%24%BCbT%AE3li%E6%0B%03%89%9A%E6%D3%ED%F4P%92%B0%9F4%BF43Y%F3%E3%EDP%95%04%EB1%C5%F5%F6KF%F4%BA%BD%D7%DB%91%93%07%E35%3E%A7)%D6%7F%40%FE%BD%F7%F5r%8A%E5y%92%F0%EB%B4%1E%8D%D5%F4%5B%92%3AV%DB%DB%E4%CD%A6%23%C3%C4wQ%3F%03HB%82%8E%1Cd(%E0%91B%0Ca%9Ac%C4%AA%F8L%16%19%22J%A4%D2itTy%B28%D6%3B(%93%96%ED%1CGx%C9_%0E%B8%5E%16%F5%5B%B2%B8%F6%E0%FB%9E%DD%25%D7%8E%BC%15%85%C5%B7%A3%D8Q%ED%B5%81%E9%BA%B2%13%9A%1B%7Fua%A5%A3n%E17%B9%E5%9B%1Bm%AB%0B%08Q%FE%8A%E5%B1H%5Ee%CAO%82Q%D7u6%E6%90S%97%FCu%0B%CF2%94%EE%25v%12X%0C%BA%AC%F0%5E%F8*l%0AO%85%17%C2%97%BF%D4%C8%CE%DE%AD%11%CB%80q%2C%3E%AB%9ES%CD%C6%EC%25%D2L%D2%EBd%B8%BF%8A%F5B%C6%18%F9%901CZ%9D%BE%24M%9C%8A9%F2%DAP%0B'%06w%82%EB%E6%E2%5C%2F%D7%07%9E%BB%CC%5D%E1%FA%B9%08%AD.r%23%8E%C2%17%F5E%7C!%F0%BE3%BE%3E_%B7o%88a%A7%DB%BE%D3d%EB%A31Z%EB%BB%D3%91%BA%A2%B1z%94%8F%DB'%F6%3D%8E%AA%13%19%B2%B1%BE%B1~V%08%2B%B4%A2cjJ%B3tO%00%03%25mN%97%F3%05%93%EF%11%84%0B%7C%88%AE-%89%8F%ABbW%90O%2B%0Ao%99%0C%5E%97%0CI%AFH%D9.%B0%3B%8F%ED%03%B6S%D6%5D%E6i_s9%F3*p%E9%1B%FD%C3%EB.7U%06%5E%19%C0%D1s.%17%A03u%E4%09%B0%7C%5E%2C%EB%15%DB%1F%3C%9E%B7%80%91%3B%DBc%AD%3Dma%BA%8B%3EV%AB%DBt.%5B%1E%01%BB%0F%AB%D5%9F%CF%AA%D5%DD%E7%E4%7F%0Bx%A3%FC%06%A9%23%0A%D6%C2%A1_2%00%00%00%09pHYs%00%00%0B%13%00%00%0B%13%01%00%9A%9C%18%00%00%00%3AIDAT8%11c%FC%FF%FF%7F%18%03%1A%60%01%F2%3F%A0%891%80%04%FF%11-%F8%17%9BJ%E2%05%B1ZD%81v%26t%E7%80%F8%A3%82h%A12%1A%20%A3%01%02%0F%01%BA%25%06%00%19%C0%0D%AEF%D5%3ES%00%00%00%00IEND%AEB%60%82");background-repeat:no-repeat,repeat-x;background-position:center center, top left;color:transparent;border:1px solid black;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;cursor:pointer;pointer-events:auto}
-.ace_fold:hover{background-image:url("data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%11%00%00%00%09%08%06%00%00%00%D4%E8%C7%0C%00%00%03%1EiCCPICC%20Profile%00%00x%01%85T%DFk%D3P%14%FE%DAe%9D%B0%E1%8B%3Ag%11%09%3Eh%91ndStC%9C%B6kW%BA%CDZ%EA6%B7!H%9B%A6m%5C%9A%C6%24%ED~%B0%07%D9%8Bo%3A%C5w%F1%07%3E%F9%07%0C%D9%83o%7B%92%0D%C6%14a%F8%AC%88%22L%F6%22%B3%9E%9B4M'S%03%B9%F7%BB%DF%F9%EE9'%E7%E4%5E%A0%F9qZ%D3%14%2F%0F%14USO%C5%C2%FC%C4%E4%14%DF%F2%01%5E%1CC%2B%FChM%8B%86%16J%26G%40%0F%D3%B2y%EF%B3%F3%0E%1E%C6lt%EEo%DF%AB%FEc%D5%9A%95%0C%11%F0%1C%20%BE%945%C4%22%E1Y%A0i%5C%D4t%13%E0%D6%89%EF%9D15%C2%CDLsX%A7%04%09%1Fg8oc%81%E1%8C%8D%23%96f45%40%9A%09%C2%07%C5B%3AK%B8%408%98i%E0%F3%0D%D8%CE%81%14%E4'%26%A9%92.%8B%3C%ABER%2F%E5dE%B2%0C%F6%F0%1Fs%83%F2_%B0%A8%94%E9%9B%AD%E7%10%8Dm%9A%19N%D1%7C%8A%DE%1F9%7Dp%8C%E6%00%D5%C1%3F_%18%BDA%B8%9DpX6%E3%A35~B%CD%24%AE%11%26%BD%E7%EEti%98%EDe%9A%97Y)%12%25%1C%24%BCbT%AE3li%E6%0B%03%89%9A%E6%D3%ED%F4P%92%B0%9F4%BF43Y%F3%E3%EDP%95%04%EB1%C5%F5%F6KF%F4%BA%BD%D7%DB%91%93%07%E35%3E%A7)%D6%7F%40%FE%BD%F7%F5r%8A%E5y%92%F0%EB%B4%1E%8D%D5%F4%5B%92%3AV%DB%DB%E4%CD%A6%23%C3%C4wQ%3F%03HB%82%8E%1Cd(%E0%91B%0Ca%9Ac%C4%AA%F8L%16%19%22J%A4%D2itTy%B28%D6%3B(%93%96%ED%1CGx%C9_%0E%B8%5E%16%F5%5B%B2%B8%F6%E0%FB%9E%DD%25%D7%8E%BC%15%85%C5%B7%A3%D8Q%ED%B5%81%E9%BA%B2%13%9A%1B%7Fua%A5%A3n%E17%B9%E5%9B%1Bm%AB%0B%08Q%FE%8A%E5%B1H%5Ee%CAO%82Q%D7u6%E6%90S%97%FCu%0B%CF2%94%EE%25v%12X%0C%BA%AC%F0%5E%F8*l%0AO%85%17%C2%97%BF%D4%C8%CE%DE%AD%11%CB%80q%2C%3E%AB%9ES%CD%C6%EC%25%D2L%D2%EBd%B8%BF%8A%F5B%C6%18%F9%901CZ%9D%BE%24M%9C%8A9%F2%DAP%0B'%06w%82%EB%E6%E2%5C%2F%D7%07%9E%BB%CC%5D%E1%FA%B9%08%AD.r%23%8E%C2%17%F5E%7C!%F0%BE3%BE%3E_%B7o%88a%A7%DB%BE%D3d%EB%A31Z%EB%BB%D3%91%BA%A2%B1z%94%8F%DB'%F6%3D%8E%AA%13%19%B2%B1%BE%B1~V%08%2B%B4%A2cjJ%B3tO%00%03%25mN%97%F3%05%93%EF%11%84%0B%7C%88%AE-%89%8F%ABbW%90O%2B%0Ao%99%0C%5E%97%0CI%AFH%D9.%B0%3B%8F%ED%03%B6S%D6%5D%E6i_s9%F3*p%E9%1B%FD%C3%EB.7U%06%5E%19%C0%D1s.%17%A03u%E4%09%B0%7C%5E%2C%EB%15%DB%1F%3C%9E%B7%80%91%3B%DBc%AD%3Dma%BA%8B%3EV%AB%DBt.%5B%1E%01%BB%0F%AB%D5%9F%CF%AA%D5%DD%E7%E4%7F%0Bx%A3%FC%06%A9%23%0A%D6%C2%A1_2%00%00%00%09pHYs%00%00%0B%13%00%00%0B%13%01%00%9A%9C%18%00%00%00%B5IDAT(%15%A5%91%3D%0E%02!%10%85ac%E1%05%D6%CE%D6%C6%CE%D2%E8%ED%CD%DE%C0%C6%D6N.%E0V%F8%3D%9Ca%891XH%C2%BE%D9y%3F%90!%E6%9C%C3%BFk%E5%011%C6-%F5%C8N%04%DF%BD%FF%89%DFt%83DN%60%3E%F3%AB%A0%DE%1A%5Dg%BE%10Q%97%1B%40%9C%A8o%10%8F%5E%828%B4%1B%60%87%F6%02%26%85%1Ch%1E%C1%2B%5Bk%FF%86%EE%B7j%09%9A%DA%9B%ACe%A3%F9%EC%DA!9%B4%D5%A6%81%86%86%98%CC%3C%5B%40%FA%81%B3%E9%CB%23%94%C16Azo%05%D4%E1%C1%95a%3B%8A'%A0%E8%CC%17%22%85%1D%BA%00%A2%FA%DC%0A%94%D1%D1%8D%8B%3A%84%17B%C7%60%1A%25Z%FC%8D%00%00%00%00IEND%AEB%60%82"),url("data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%05%00%00%007%08%06%00%00%00%C4%DD%80C%00%00%03%1EiCCPICC%20Profile%00%00x%01%85T%DFk%D3P%14%FE%DAe%9D%B0%E1%8B%3Ag%11%09%3Eh%91ndStC%9C%B6kW%BA%CDZ%EA6%B7!H%9B%A6m%5C%9A%C6%24%ED~%B0%07%D9%8Bo%3A%C5w%F1%07%3E%F9%07%0C%D9%83o%7B%92%0D%C6%14a%F8%AC%88%22L%F6%22%B3%9E%9B4M'S%03%B9%F7%BB%DF%F9%EE9'%E7%E4%5E%A0%F9qZ%D3%14%2F%0F%14USO%C5%C2%FC%C4%E4%14%DF%F2%01%5E%1CC%2B%FChM%8B%86%16J%26G%40%0F%D3%B2y%EF%B3%F3%0E%1E%C6lt%EEo%DF%AB%FEc%D5%9A%95%0C%11%F0%1C%20%BE%945%C4%22%E1Y%A0i%5C%D4t%13%E0%D6%89%EF%9D15%C2%CDLsX%A7%04%09%1Fg8oc%81%E1%8C%8D%23%96f45%40%9A%09%C2%07%C5B%3AK%B8%408%98i%E0%F3%0D%D8%CE%81%14%E4'%26%A9%92.%8B%3C%ABER%2F%E5dE%B2%0C%F6%F0%1Fs%83%F2_%B0%A8%94%E9%9B%AD%E7%10%8Dm%9A%19N%D1%7C%8A%DE%1F9%7Dp%8C%E6%00%D5%C1%3F_%18%BDA%B8%9DpX6%E3%A35~B%CD%24%AE%11%26%BD%E7%EEti%98%EDe%9A%97Y)%12%25%1C%24%BCbT%AE3li%E6%0B%03%89%9A%E6%D3%ED%F4P%92%B0%9F4%BF43Y%F3%E3%EDP%95%04%EB1%C5%F5%F6KF%F4%BA%BD%D7%DB%91%93%07%E35%3E%A7)%D6%7F%40%FE%BD%F7%F5r%8A%E5y%92%F0%EB%B4%1E%8D%D5%F4%5B%92%3AV%DB%DB%E4%CD%A6%23%C3%C4wQ%3F%03HB%82%8E%1Cd(%E0%91B%0Ca%9Ac%C4%AA%F8L%16%19%22J%A4%D2itTy%B28%D6%3B(%93%96%ED%1CGx%C9_%0E%B8%5E%16%F5%5B%B2%B8%F6%E0%FB%9E%DD%25%D7%8E%BC%15%85%C5%B7%A3%D8Q%ED%B5%81%E9%BA%B2%13%9A%1B%7Fua%A5%A3n%E17%B9%E5%9B%1Bm%AB%0B%08Q%FE%8A%E5%B1H%5Ee%CAO%82Q%D7u6%E6%90S%97%FCu%0B%CF2%94%EE%25v%12X%0C%BA%AC%F0%5E%F8*l%0AO%85%17%C2%97%BF%D4%C8%CE%DE%AD%11%CB%80q%2C%3E%AB%9ES%CD%C6%EC%25%D2L%D2%EBd%B8%BF%8A%F5B%C6%18%F9%901CZ%9D%BE%24M%9C%8A9%F2%DAP%0B'%06w%82%EB%E6%E2%5C%2F%D7%07%9E%BB%CC%5D%E1%FA%B9%08%AD.r%23%8E%C2%17%F5E%7C!%F0%BE3%BE%3E_%B7o%88a%A7%DB%BE%D3d%EB%A31Z%EB%BB%D3%91%BA%A2%B1z%94%8F%DB'%F6%3D%8E%AA%13%19%B2%B1%BE%B1~V%08%2B%B4%A2cjJ%B3tO%00%03%25mN%97%F3%05%93%EF%11%84%0B%7C%88%AE-%89%8F%ABbW%90O%2B%0Ao%99%0C%5E%97%0CI%AFH%D9.%B0%3B%8F%ED%03%B6S%D6%5D%E6i_s9%F3*p%E9%1B%FD%C3%EB.7U%06%5E%19%C0%D1s.%17%A03u%E4%09%B0%7C%5E%2C%EB%15%DB%1F%3C%9E%B7%80%91%3B%DBc%AD%3Dma%BA%8B%3EV%AB%DBt.%5B%1E%01%BB%0F%AB%D5%9F%CF%AA%D5%DD%E7%E4%7F%0Bx%A3%FC%06%A9%23%0A%D6%C2%A1_2%00%00%00%09pHYs%00%00%0B%13%00%00%0B%13%01%00%9A%9C%18%00%00%003IDAT8%11c%FC%FF%FF%7F%3E%03%1A%60%01%F2%3F%A3%891%80%04%FFQ%26%F8w%C0%B43%A1%DB%0C%E2%8F%0A%A2%85%CAh%80%8C%06%08%3C%04%E8%96%18%00%A3S%0D%CD%CF%D8%C1%9D%00%00%00%00IEND%AEB%60%82");background-repeat:no-repeat,repeat-x;background-position:center center, top left}
-.ace_gutter-tooltip{background-color:#FFF;background-image:-webkit-linear-gradient(top, transparent, rgba(0,0,0,0.1));background-image:linear-gradient(to bottom, transparent, rgba(0,0,0,0.1));border:1px solid gray;border-radius:1px;box-shadow:0 1px 2px rgba(0,0,0,0.3);color:black;display:inline-block;max-width:500px;padding:4px;position:fixed;z-index:999999;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;cursor:default;white-space:pre-line;word-wrap:break-word;line-height:normal;font-style:normal;font-weight:normal;letter-spacing:normal}
+.ace_line .ace_fold{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;display:inline-block;height:11px;margin-top:-2px;vertical-align:middle;background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII="),url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACJJREFUeNpi+P//fxgTAwPDBxDxD078RSX+YeEyDFMCIMAAI3INmXiwf2YAAAAASUVORK5CYII=");background-repeat:no-repeat,repeat-x;background-position:center center, top left;color:transparent;border:1px solid black;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;cursor:pointer;pointer-events:auto}
+.ace_fold:hover{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII="),url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACBJREFUeNpi+P//fz4TAwPDZxDxD5X4i5fLMEwJgAADAEPVDbjNw87ZAAAAAElFTkSuQmCC")}
+.ace_tooltip{background-color:#FFF;background-image:-webkit-linear-gradient(top, transparent, rgba(0,0,0,0.1));background-image:linear-gradient(to bottom, transparent, rgba(0,0,0,0.1));border:1px solid gray;border-radius:1px;box-shadow:0 1px 2px rgba(0,0,0,0.3);color:black;display:block;max-width:100%;padding:3px 4px;position:fixed;z-index:999999;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;cursor:default;white-space:pre;word-wrap:break-word;line-height:normal;font-style:normal;font-weight:normal;letter-spacing:normal;pointer-events:none}
.ace_folding-enabled>.ace_gutter-cell{padding-right:13px}
-.ace_fold-widget{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;margin:0 -12px 0 1px;display:none;width:11px;vertical-align:top;background-image:url("data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%05%00%00%00%05%08%06%00%00%00%8Do%26%E5%00%00%004IDATx%DAe%8A%B1%0D%000%0C%C2%F2%2CK%96%BC%D0%8F9%81%88H%E9%D0%0E%96%C0%10%92%3E%02%80%5E%82%E4%A9*-%EEsw%C8%CC%11%EE%96w%D8%DC%E9*Eh%0C%151(%00%00%00%00IEND%AEB%60%82");background-repeat:no-repeat;background-position:center;border-radius:3px;border:1px solid transparent;cursor:pointer}
+.ace_fold-widget{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;margin:0 -12px 0 1px;display:none;width:11px;vertical-align:top;background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42mWKsQ0AMAzC8ixLlrzQjzmBiEjp0A6WwBCSPgKAXoLkqSot7nN3yMwR7pZ32NzpKkVoDBUxKAAAAABJRU5ErkJggg==");background-repeat:no-repeat;background-position:center;border-radius:3px;border:1px solid transparent;cursor:pointer}
.ace_folding-enabled .ace_fold-widget{display:inline-block}
-.ace_fold-widget.ace_end{background-image:url("data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%05%00%00%00%05%08%06%00%00%00%8Do%26%E5%00%00%004IDATx%DAm%C7%C1%09%000%08C%D1%8C%ECE%C8E(%8E%EC%02)%1EZJ%F1%C1'%04%07I%E1%E5%EE%CAL%F5%A2%99%99%22%E2%D6%1FU%B5%FE0%D9x%A7%26Wz5%0E%D5%00%00%00%00IEND%AEB%60%82")}
-.ace_fold-widget.ace_closed{background-image:url("data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%03%00%00%00%06%08%06%00%00%00%06%E5%24%0C%00%00%009IDATx%DA5%CA%C1%09%000%08%03%C0%AC*(%3E%04%C1%0D%BA%B1%23%A4Uh%E0%20%81%C0%CC%F8%82%81%AA%A2%AArGfr%88%08%11%11%1C%DD%7D%E0%EE%5B%F6%F6%CB%B8%05Q%2F%E9tai%D9%00%00%00%00IEND%AEB%60%82")}
+.ace_fold-widget.ace_end{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42m3HwQkAMAhD0YzsRchFKI7sAikeWkrxwScEB0nh5e7KTPWimZki4tYfVbX+MNl4pyZXejUO1QAAAABJRU5ErkJggg==")}
+.ace_fold-widget.ace_closed{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAGCAYAAAAG5SQMAAAAOUlEQVR42jXKwQkAMAgDwKwqKD4EwQ26sSOkVWjgIIHAzPiCgaqiqnJHZnKICBERHN194O5b9vbLuAVRL+l0YWnZAAAAAElFTkSuQmCCXA==")}
.ace_fold-widget:hover{border:1px solid rgba(0,0,0,0.3);background-color:rgba(255,255,255,0.2);-moz-box-shadow:0 1px 1px rgba(255,255,255,0.7);-webkit-box-shadow:0 1px 1px rgba(255,255,255,0.7);box-shadow:0 1px 1px rgba(255,255,255,0.7)}
.ace_fold-widget:active{border:1px solid rgba(0,0,0,0.4);background-color:rgba(0,0,0,0.05);-moz-box-shadow:0 1px 1px rgba(255,255,255,0.8);-webkit-box-shadow:0 1px 1px rgba(255,255,255,0.8);box-shadow:0 1px 1px rgba(255,255,255,0.8)}
.ace_dark .ace_fold-widget{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHklEQVQIW2P4//8/AzoGEQ7oGCaLLAhWiSwB146BAQCSTPYocqT0AAAAAElFTkSuQmCC")}
@@ -1294,7 +1293,7 @@ body.pdf{font-family:"DejaVu Sans"}body.pdf code,body.pdf pre{font-family:"DejaV
.ace_italic{font-style:italic}
.ace_error-marker{background-color:rgba(255,0,0,0.2);position:absolute;z-index:9}
.ace_highlight-marker{background-color:rgba(255,255,0,0.2);position:absolute;z-index:8}
-.ace_search{background-color:#ddd;border:1px solid #cbcbcb;border-top:0 none;max-width:297px;overflow:hidden;margin:0;padding:4px;padding-right:6px;padding-bottom:0;position:absolute;top:0px;z-index:99}
+.ace_search{background-color:#ddd;border:1px solid #cbcbcb;border-top:0 none;max-width:297px;overflow:hidden;margin:0;padding:4px;padding-right:6px;padding-bottom:0;position:absolute;top:0px;z-index:99;white-space:normal}
.ace_search.left{border-left:0 none;border-radius:0px 0px 5px 0px;left:0}
.ace_search.right{border-radius:0px 0px 0px 5px;border-right:0 none;right:0}
.ace_search_form,.ace_replace_form{border-radius:3px;border:1px solid #cbcbcb;float:left;margin-bottom:4px;overflow:hidden}
@@ -1318,7 +1317,7 @@ body.pdf{font-family:"DejaVu Sans"}body.pdf code,body.pdf pre{font-family:"DejaV
.ace-tm .ace_gutter{background:#f0f0f0;color:#333}
.ace-tm .ace_print-margin{width:1px;background:#e8e8e8}
.ace-tm .ace_fold{background-color:#6B72E6}
-.ace-tm{background-color:#FFFFFF}
+.ace-tm{background-color:#FFFFFF;color:black}
.ace-tm .ace_cursor{color:black}
.ace-tm .ace_invisible{color:#bfbfbf}
.ace-tm .ace_storage,.ace-tm .ace_keyword{color:blue}
diff --git a/public/res-min/themes/gray.css b/public/res-min/themes/gray.css
index aaa196ff..22c95735 100644
--- a/public/res-min/themes/gray.css
+++ b/public/res-min/themes/gray.css
@@ -1231,28 +1231,29 @@ kbd{padding:0.1em 0.6em;border:1px solid rgba(32,32,32,0.25);-webkit-box-shadow:
.icon-provider-gplus{background-position:-144px 0}
body.rtl #wmd-input,body.rtl #preview-contents,body.rtl .input-file-title,body.rtl .search-bar input,body.rtl .modal-document-manager input,body.rtl .container{direction:rtl}
body.pdf{font-family:"DejaVu Sans"}body.pdf code,body.pdf pre{font-family:"DejaVu Sans Mono"}
-.ace_editor{position:relative;overflow:hidden;font-family:'Monaco','Menlo','Ubuntu Mono','Consolas','source-code-pro',monospace;font-size:12px;line-height:normal;color:black;-ms-user-select:none;-moz-user-select:none;-webkit-user-select:none;user-select:none}
-.ace_scroller{position:absolute;overflow:hidden;top:0;bottom:0;background-color:inherit}
-.ace_content{position:absolute;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;cursor:text}
+.ace_editor{position:relative;overflow:hidden;font-family:'Monaco','Menlo','Ubuntu Mono','Consolas','source-code-pro',monospace;font-size:12px;line-height:normal;direction:ltr}
+.ace_scroller{position:absolute;overflow:hidden;top:0;bottom:0;background-color:inherit;-ms-user-select:none;-moz-user-select:none;-webkit-user-select:none;user-select:none}
+.ace_content{position:absolute;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;cursor:text;min-width:100%}
.ace_dragging,.ace_dragging *{cursor:move !important}
.ace_dragging .ace_scroller:before{position:absolute;top:0;left:0;right:0;bottom:0;content:'';background:rgba(250,250,250,0.01);z-index:1000}
.ace_dragging.ace_dark .ace_scroller:before{background:rgba(0,0,0,0.01)}
.ace_selecting,.ace_selecting *{cursor:text !important}
-.ace_gutter{position:absolute;overflow:hidden;width:auto;top:0;bottom:0;left:0;cursor:default;z-index:4}
+.ace_gutter{position:absolute;overflow:hidden;width:auto;top:0;bottom:0;left:0;cursor:default;z-index:4;-ms-user-select:none;-moz-user-select:none;-webkit-user-select:none;user-select:none}
.ace_gutter-active-line{position:absolute;left:0;right:0}
.ace_scroller.ace_scroll-left{box-shadow:17px 0 16px -16px rgba(0,0,0,0.4) inset}
.ace_gutter-cell{padding-left:19px;padding-right:6px;background-repeat:no-repeat}
-.ace_gutter-cell.ace_error{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QUM2OEZDQTQ4RTU0MTFFMUEzM0VFRTM2RUY1M0RBMjYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QUM2OEZDQTU4RTU0MTFFMUEzM0VFRTM2RUY1M0RBMjYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpBQzY4RkNBMjhFNTQxMUUxQTMzRUVFMzZFRjUzREEyNiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpBQzY4RkNBMzhFNTQxMUUxQTMzRUVFMzZFRjUzREEyNiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PkgXxbAAAAJbSURBVHjapFNNaBNBFH4zs5vdZLP5sQmNpT82QY209heh1ioWisaDRcSKF0WKJ0GQnrzrxasHsR6EnlrwD0TagxJabaVEpFYxLWlLSS822tr87m66ccfd2GKyVhA6MMybgfe97/vmPUQphd0sZjto9XIn9OOsvlu2nkqRzVU+6vvlzPf8W6bk8dxQ0NPbxAALgCgg2JkaQuhzQau/El0zbmUA7U0Es8v2CiYmKQJHGO1QICCLoqilMhkmurDAyapKgqItezi/USRdJqEYY4D5jCy03ht2yMkkvL91jTTX10qzyyu2hruPRN7jgbH+EOsXcMLgYiThEgAMhABW85oqy1DXdRIdvP1AHJ2acQXvDIrVHcdQNrEKNYSVMSZGMjEzIIAwDXIo+6G/FxcGnzkC3T2oMhLjre49sBB+RRcHLqdafK6sYdE/GGBwU1VpFNj0aN8pJbe+BkZyevUrvLl6Xmm0W9IuTc0DxrDNAJd5oEvI/KRsNC3bQyNjPO9yQ1YHcfj2QvfQc/5TUhJTBc2iM0U7AWDQtc1nJHvD/cfO2s7jaGkiTEfa/Ep8coLu7zmNmh8+dc5lZDuUeFAGUNA/OY6JVaypQ0vjr7XYjUvJM37vt+j1vuTK5DgVfVUoTjVe+y3/LxMxY2GgU+CSLy4cpfsYorRXuXIOi0Vt40h67uZFTdIo6nLaZcwUJWAzwNS0tBnqqKzQDnjdG/iPyZxo46HaKUpbvYkj8qYRTZsBhge+JHhZyh0x9b95JqjVJkT084kZIPwu/mPWqPgfQ5jXh2+92Ay7HedfAgwA6KDWafb4w3cAAAAASUVORK5CYII=");background-repeat:no-repeat;background-position:2px center}
-.ace_gutter-cell.ace_warning{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QUM2OEZDQTg4RTU0MTFFMUEzM0VFRTM2RUY1M0RBMjYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QUM2OEZDQTk4RTU0MTFFMUEzM0VFRTM2RUY1M0RBMjYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpBQzY4RkNBNjhFNTQxMUUxQTMzRUVFMzZFRjUzREEyNiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpBQzY4RkNBNzhFNTQxMUUxQTMzRUVFMzZFRjUzREEyNiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pgd7PfIAAAGmSURBVHjaYvr//z8DJZiJgUIANoCRkREb9gLiSVAaQx4OQM7AAkwd7XU2/v++/rOttdYGEB9dASEvOMydGKfH8Gv/p4XTkvRBfLxeQAP+1cUhXopyvzhP7P/IoSj7g7Mw09cNKO6J1QQ0L4gICPIv/veg/8W+JdFvQNLHVsW9/nmn9zk7B+cCkDwhL7gt6knSZnx9/LuCEOcvkIAMP+cvto9nfqyZmmUAksfnBUtbM60gX/3/kgyv3/xSFOL5DZT+L8vP+Yfh5cvfPvp/xUHyQHXGyAYwgpwBjZYFT3Y1OEl/OfCH4ffv3wzc4iwMvNIsDJ+f/mH4+vIPAxsb631WW0Yln6ZpQLXdMK/DXGDflh+sIv37EivD5x//Gb7+YWT4y86sl7BCCkSD+Z++/1dkvsFRl+HnD1Rvje4F8whjMXmGj58YGf5zsDMwcnAwfPvKcml62DsQDeaDxN+/Y0qwlpEHqrdB94IRNIDUgfgfKJChGK4OikEW3gTiXUB950ASLFAF54AC94A0G9QAfOnmF9DCDzABFqS08IHYDIScdijOjQABBgC+/9awBH96jwAAAABJRU5ErkJggg==");background-position:2px center}
-.ace_gutter-cell.ace_info{background-image:url("data:image/gif;base64,R0lGODlhEAAQAMQAAAAAAEFBQVJSUl5eXmRkZGtra39/f4WFhYmJiZGRkaampry8vMPDw8zMzNXV1dzc3OTk5Orq6vDw8P///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAkAABQALAAAAAAQABAAAAUuICWOZGmeaBml5XGwFCQSBGyXRSAwtqQIiRuiwIM5BoYVbEFIyGCQoeJGrVptIQA7");background-position:2px center}
-.ace_dark .ace_gutter-cell.ace_info{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpGRTk5MTVGREIxNDkxMUUxOTc5Q0FFREQyMTNGMjBFQyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpGRTk5MTVGRUIxNDkxMUUxOTc5Q0FFREQyMTNGMjBFQyI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkZFOTkxNUZCQjE0OTExRTE5NzlDQUVERDIxM0YyMEVDIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkZFOTkxNUZDQjE0OTExRTE5NzlDQUVERDIxM0YyMEVDIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+SIDkjAAAAJ1JREFUeNpi/P//PwMlgImBQkB7A6qrq/+DMC55FkIGKCoq4pVnpFkgTp069f/+/fv/r1u37r+tre1/kg0A+ptn9uzZYLaRkRHpLvjw4cNXWVlZhufPnzOcO3eOdAO0tbVPAjHDmzdvGA4fPsxIsgGSkpJmv379Ynj37h2DjIyMCMkG3LhxQ/T27dsMampqDHZ2dq/pH41DxwCAAAMAFdc68dUsFZgAAAAASUVORK5CYII=")}
-.ace_scrollbar{position:absolute;overflow-x:hidden;overflow-y:auto;right:0;top:0;bottom:0;z-index:6}
+.ace_gutter-cell.ace_error{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABOFBMVEX/////////QRswFAb/Ui4wFAYwFAYwFAaWGAfDRymzOSH/PxswFAb/SiUwFAYwFAbUPRvjQiDllog5HhHdRybsTi3/Tyv9Tir+Syj/UC3////XurebMBIwFAb/RSHbPx/gUzfdwL3kzMivKBAwFAbbvbnhPx66NhowFAYwFAaZJg8wFAaxKBDZurf/RB6mMxb/SCMwFAYwFAbxQB3+RB4wFAb/Qhy4Oh+4QifbNRcwFAYwFAYwFAb/QRzdNhgwFAYwFAbav7v/Uy7oaE68MBK5LxLewr/r2NXewLswFAaxJw4wFAbkPRy2PyYwFAaxKhLm1tMwFAazPiQwFAaUGAb/QBrfOx3bvrv/VC/maE4wFAbRPBq6MRO8Qynew8Dp2tjfwb0wFAbx6eju5+by6uns4uH9/f36+vr/GkHjAAAAYnRSTlMAGt+64rnWu/bo8eAA4InH3+DwoN7j4eLi4xP99Nfg4+b+/u9B/eDs1MD1mO7+4PHg2MXa347g7vDizMLN4eG+Pv7i5evs/v79yu7S3/DV7/498Yv24eH+4ufQ3Ozu/v7+y13sRqwAAADLSURBVHjaZc/XDsFgGIBhtDrshlitmk2IrbHFqL2pvXf/+78DPokj7+Fz9qpU/9UXJIlhmPaTaQ6QPaz0mm+5gwkgovcV6GZzd5JtCQwgsxoHOvJO15kleRLAnMgHFIESUEPmawB9ngmelTtipwwfASilxOLyiV5UVUyVAfbG0cCPHig+GBkzAENHS0AstVF6bacZIOzgLmxsHbt2OecNgJC83JERmePUYq8ARGkJx6XtFsdddBQgZE2nPR6CICZhawjA4Fb/chv+399kfR+MMMDGOQAAAABJRU5ErkJggg==");background-repeat:no-repeat;background-position:2px center}
+.ace_gutter-cell.ace_warning{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAmVBMVEX///8AAAD///8AAAAAAABPSzb/5sAAAAB/blH/73z/ulkAAAAAAAD85pkAAAAAAAACAgP/vGz/rkDerGbGrV7/pkQICAf////e0IsAAAD/oED/qTvhrnUAAAD/yHD/njcAAADuv2r/nz//oTj/p064oGf/zHAAAAA9Nir/tFIAAAD/tlTiuWf/tkIAAACynXEAAAAAAAAtIRW7zBpBAAAAM3RSTlMAABR1m7RXO8Ln31Z36zT+neXe5OzooRDfn+TZ4p3h2hTf4t3k3ucyrN1K5+Xaks52Sfs9CXgrAAAAjklEQVR42o3PbQ+CIBQFYEwboPhSYgoYunIqqLn6/z8uYdH8Vmdnu9vz4WwXgN/xTPRD2+sgOcZjsge/whXZgUaYYvT8QnuJaUrjrHUQreGczuEafQCO/SJTufTbroWsPgsllVhq3wJEk2jUSzX3CUEDJC84707djRc5MTAQxoLgupWRwW6UB5fS++NV8AbOZgnsC7BpEAAAAABJRU5ErkJggg==");background-position:2px center}
+.ace_gutter-cell.ace_info{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAAAAAA6mKC9AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAAJ0Uk5TAAB2k804AAAAPklEQVQY02NgIB68QuO3tiLznjAwpKTgNyDbMegwisCHZUETUZV0ZqOquBpXj2rtnpSJT1AEnnRmL2OgGgAAIKkRQap2htgAAAAASUVORK5CYII=");background-position:2px center}
+.ace_dark .ace_gutter-cell.ace_info{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAJFBMVEUAAAChoaGAgIAqKiq+vr6tra1ZWVmUlJSbm5s8PDxubm56enrdgzg3AAAAAXRSTlMAQObYZgAAAClJREFUeNpjYMAPdsMYHegyJZFQBlsUlMFVCWUYKkAZMxZAGdxlDMQBAG+TBP4B6RyJAAAAAElFTkSuQmCC")}
+.ace_scrollbar{position:absolute;right:0;bottom:0;z-index:6}
.ace_scrollbar-inner{position:absolute;cursor:text;left:0;top:0}
-.ace_scrollbar-h{position:absolute;overflow-x:auto;overflow-y:hidden;right:0;left:0;bottom:0;z-index:6}
+.ace_scrollbar-v{overflow-x:hidden;overflow-y:scroll;top:0}
+.ace_scrollbar-h{overflow-x:scroll;overflow-y:hidden;left:0}
.ace_print-margin{position:absolute;height:100%}
-.ace_text-input{position:absolute;z-index:0;width:0.5em;height:1em;opacity:0;background:transparent;-moz-appearance:none;appearance:none;border:none;resize:none;outline:none;overflow:hidden;font:inherit;padding:0 1px;margin:0 -1px;text-indent:-1em}
+.ace_text-input{position:absolute;z-index:0;width:0.5em;height:1em;opacity:0;background:transparent;-moz-appearance:none;appearance:none;border:none;resize:none;outline:none;overflow:hidden;font:inherit;padding:0 1px;margin:0 -1px;text-indent:-1em;-ms-user-select:text;-moz-user-select:text;-webkit-user-select:text;user-select:text}
.ace_text-input.ace_composition{background:#f8f8f8;color:#111;z-index:1000;opacity:1;text-indent:0}
-.ace_layer{z-index:1;position:absolute;overflow:hidden;white-space:nowrap;height:100%;width:100%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;pointer-events:none}
+.ace_layer{z-index:1;position:absolute;overflow:hidden;white-space:pre;height:100%;width:100%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;pointer-events:none}
.ace_gutter-layer{position:relative;width:auto;text-align:right;pointer-events:auto}
.ace_text-layer{font:inherit !important}
.ace_cjk{display:inline-block;text-align:center}
@@ -1262,22 +1263,20 @@ body.pdf{font-family:"DejaVu Sans"}body.pdf code,body.pdf pre{font-family:"DejaV
.ace_overwrite-cursors .ace_cursor{border-left-width:0px;border-bottom:1px solid}
.ace_hidden-cursors .ace_cursor{opacity:0.2}
.ace_smooth-blinking .ace_cursor{-moz-transition:opacity 0.18s;-webkit-transition:opacity 0.18s;-o-transition:opacity 0.18s;-ms-transition:opacity 0.18s;transition:opacity 0.18s}
-.ace_cursor[style*="opacity: 0"]{-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"}
.ace_editor.ace_multiselect .ace_cursor{border-left-width:1px}
-.ace_line{white-space:nowrap}
.ace_marker-layer .ace_step,.ace_marker-layer .ace_stack{position:absolute;z-index:3}
.ace_marker-layer .ace_selection{position:absolute;z-index:5}
.ace_marker-layer .ace_bracket{position:absolute;z-index:6}
.ace_marker-layer .ace_active-line{position:absolute;z-index:2}
.ace_marker-layer .ace_selected-word{position:absolute;z-index:4;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}
-.ace_line .ace_fold{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;display:inline-block;height:11px;margin-top:-2px;vertical-align:middle;background-image:url("data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%11%00%00%00%09%08%06%00%00%00%D4%E8%C7%0C%00%00%03%1EiCCPICC%20Profile%00%00x%01%85T%DFk%D3P%14%FE%DAe%9D%B0%E1%8B%3Ag%11%09%3Eh%91ndStC%9C%B6kW%BA%CDZ%EA6%B7!H%9B%A6m%5C%9A%C6%24%ED~%B0%07%D9%8Bo%3A%C5w%F1%07%3E%F9%07%0C%D9%83o%7B%92%0D%C6%14a%F8%AC%88%22L%F6%22%B3%9E%9B4M'S%03%B9%F7%BB%DF%F9%EE9'%E7%E4%5E%A0%F9qZ%D3%14%2F%0F%14USO%C5%C2%FC%C4%E4%14%DF%F2%01%5E%1CC%2B%FChM%8B%86%16J%26G%40%0F%D3%B2y%EF%B3%F3%0E%1E%C6lt%EEo%DF%AB%FEc%D5%9A%95%0C%11%F0%1C%20%BE%945%C4%22%E1Y%A0i%5C%D4t%13%E0%D6%89%EF%9D15%C2%CDLsX%A7%04%09%1Fg8oc%81%E1%8C%8D%23%96f45%40%9A%09%C2%07%C5B%3AK%B8%408%98i%E0%F3%0D%D8%CE%81%14%E4'%26%A9%92.%8B%3C%ABER%2F%E5dE%B2%0C%F6%F0%1Fs%83%F2_%B0%A8%94%E9%9B%AD%E7%10%8Dm%9A%19N%D1%7C%8A%DE%1F9%7Dp%8C%E6%00%D5%C1%3F_%18%BDA%B8%9DpX6%E3%A35~B%CD%24%AE%11%26%BD%E7%EEti%98%EDe%9A%97Y)%12%25%1C%24%BCbT%AE3li%E6%0B%03%89%9A%E6%D3%ED%F4P%92%B0%9F4%BF43Y%F3%E3%EDP%95%04%EB1%C5%F5%F6KF%F4%BA%BD%D7%DB%91%93%07%E35%3E%A7)%D6%7F%40%FE%BD%F7%F5r%8A%E5y%92%F0%EB%B4%1E%8D%D5%F4%5B%92%3AV%DB%DB%E4%CD%A6%23%C3%C4wQ%3F%03HB%82%8E%1Cd(%E0%91B%0Ca%9Ac%C4%AA%F8L%16%19%22J%A4%D2itTy%B28%D6%3B(%93%96%ED%1CGx%C9_%0E%B8%5E%16%F5%5B%B2%B8%F6%E0%FB%9E%DD%25%D7%8E%BC%15%85%C5%B7%A3%D8Q%ED%B5%81%E9%BA%B2%13%9A%1B%7Fua%A5%A3n%E17%B9%E5%9B%1Bm%AB%0B%08Q%FE%8A%E5%B1H%5Ee%CAO%82Q%D7u6%E6%90S%97%FCu%0B%CF2%94%EE%25v%12X%0C%BA%AC%F0%5E%F8*l%0AO%85%17%C2%97%BF%D4%C8%CE%DE%AD%11%CB%80q%2C%3E%AB%9ES%CD%C6%EC%25%D2L%D2%EBd%B8%BF%8A%F5B%C6%18%F9%901CZ%9D%BE%24M%9C%8A9%F2%DAP%0B'%06w%82%EB%E6%E2%5C%2F%D7%07%9E%BB%CC%5D%E1%FA%B9%08%AD.r%23%8E%C2%17%F5E%7C!%F0%BE3%BE%3E_%B7o%88a%A7%DB%BE%D3d%EB%A31Z%EB%BB%D3%91%BA%A2%B1z%94%8F%DB'%F6%3D%8E%AA%13%19%B2%B1%BE%B1~V%08%2B%B4%A2cjJ%B3tO%00%03%25mN%97%F3%05%93%EF%11%84%0B%7C%88%AE-%89%8F%ABbW%90O%2B%0Ao%99%0C%5E%97%0CI%AFH%D9.%B0%3B%8F%ED%03%B6S%D6%5D%E6i_s9%F3*p%E9%1B%FD%C3%EB.7U%06%5E%19%C0%D1s.%17%A03u%E4%09%B0%7C%5E%2C%EB%15%DB%1F%3C%9E%B7%80%91%3B%DBc%AD%3Dma%BA%8B%3EV%AB%DBt.%5B%1E%01%BB%0F%AB%D5%9F%CF%AA%D5%DD%E7%E4%7F%0Bx%A3%FC%06%A9%23%0A%D6%C2%A1_2%00%00%00%09pHYs%00%00%0B%13%00%00%0B%13%01%00%9A%9C%18%00%00%00%B5IDAT(%15%A5%91%3D%0E%02!%10%85ac%E1%05%D6%CE%D6%C6%CE%D2%E8%ED%CD%DE%C0%C6%D6N.%E0V%F8%3D%9Ca%891XH%C2%BE%D9y%3F%90!%E6%9C%C3%BFk%E5%011%C6-%F5%C8N%04%DF%BD%FF%89%DFt%83DN%60%3E%F3%AB%A0%DE%1A%5Dg%BE%10Q%97%1B%40%9C%A8o%10%8F%5E%828%B4%1B%60%87%F6%02%26%85%1Ch%1E%C1%2B%5Bk%FF%86%EE%B7j%09%9A%DA%9B%ACe%A3%F9%EC%DA!9%B4%D5%A6%81%86%86%98%CC%3C%5B%40%FA%81%B3%E9%CB%23%94%C16Azo%05%D4%E1%C1%95a%3B%8A'%A0%E8%CC%17%22%85%1D%BA%00%A2%FA%DC%0A%94%D1%D1%8D%8B%3A%84%17B%C7%60%1A%25Z%FC%8D%00%00%00%00IEND%AEB%60%82"),url("data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%05%00%00%007%08%06%00%00%00%C4%DD%80C%00%00%03%1EiCCPICC%20Profile%00%00x%01%85T%DFk%D3P%14%FE%DAe%9D%B0%E1%8B%3Ag%11%09%3Eh%91ndStC%9C%B6kW%BA%CDZ%EA6%B7!H%9B%A6m%5C%9A%C6%24%ED~%B0%07%D9%8Bo%3A%C5w%F1%07%3E%F9%07%0C%D9%83o%7B%92%0D%C6%14a%F8%AC%88%22L%F6%22%B3%9E%9B4M'S%03%B9%F7%BB%DF%F9%EE9'%E7%E4%5E%A0%F9qZ%D3%14%2F%0F%14USO%C5%C2%FC%C4%E4%14%DF%F2%01%5E%1CC%2B%FChM%8B%86%16J%26G%40%0F%D3%B2y%EF%B3%F3%0E%1E%C6lt%EEo%DF%AB%FEc%D5%9A%95%0C%11%F0%1C%20%BE%945%C4%22%E1Y%A0i%5C%D4t%13%E0%D6%89%EF%9D15%C2%CDLsX%A7%04%09%1Fg8oc%81%E1%8C%8D%23%96f45%40%9A%09%C2%07%C5B%3AK%B8%408%98i%E0%F3%0D%D8%CE%81%14%E4'%26%A9%92.%8B%3C%ABER%2F%E5dE%B2%0C%F6%F0%1Fs%83%F2_%B0%A8%94%E9%9B%AD%E7%10%8Dm%9A%19N%D1%7C%8A%DE%1F9%7Dp%8C%E6%00%D5%C1%3F_%18%BDA%B8%9DpX6%E3%A35~B%CD%24%AE%11%26%BD%E7%EEti%98%EDe%9A%97Y)%12%25%1C%24%BCbT%AE3li%E6%0B%03%89%9A%E6%D3%ED%F4P%92%B0%9F4%BF43Y%F3%E3%EDP%95%04%EB1%C5%F5%F6KF%F4%BA%BD%D7%DB%91%93%07%E35%3E%A7)%D6%7F%40%FE%BD%F7%F5r%8A%E5y%92%F0%EB%B4%1E%8D%D5%F4%5B%92%3AV%DB%DB%E4%CD%A6%23%C3%C4wQ%3F%03HB%82%8E%1Cd(%E0%91B%0Ca%9Ac%C4%AA%F8L%16%19%22J%A4%D2itTy%B28%D6%3B(%93%96%ED%1CGx%C9_%0E%B8%5E%16%F5%5B%B2%B8%F6%E0%FB%9E%DD%25%D7%8E%BC%15%85%C5%B7%A3%D8Q%ED%B5%81%E9%BA%B2%13%9A%1B%7Fua%A5%A3n%E17%B9%E5%9B%1Bm%AB%0B%08Q%FE%8A%E5%B1H%5Ee%CAO%82Q%D7u6%E6%90S%97%FCu%0B%CF2%94%EE%25v%12X%0C%BA%AC%F0%5E%F8*l%0AO%85%17%C2%97%BF%D4%C8%CE%DE%AD%11%CB%80q%2C%3E%AB%9ES%CD%C6%EC%25%D2L%D2%EBd%B8%BF%8A%F5B%C6%18%F9%901CZ%9D%BE%24M%9C%8A9%F2%DAP%0B'%06w%82%EB%E6%E2%5C%2F%D7%07%9E%BB%CC%5D%E1%FA%B9%08%AD.r%23%8E%C2%17%F5E%7C!%F0%BE3%BE%3E_%B7o%88a%A7%DB%BE%D3d%EB%A31Z%EB%BB%D3%91%BA%A2%B1z%94%8F%DB'%F6%3D%8E%AA%13%19%B2%B1%BE%B1~V%08%2B%B4%A2cjJ%B3tO%00%03%25mN%97%F3%05%93%EF%11%84%0B%7C%88%AE-%89%8F%ABbW%90O%2B%0Ao%99%0C%5E%97%0CI%AFH%D9.%B0%3B%8F%ED%03%B6S%D6%5D%E6i_s9%F3*p%E9%1B%FD%C3%EB.7U%06%5E%19%C0%D1s.%17%A03u%E4%09%B0%7C%5E%2C%EB%15%DB%1F%3C%9E%B7%80%91%3B%DBc%AD%3Dma%BA%8B%3EV%AB%DBt.%5B%1E%01%BB%0F%AB%D5%9F%CF%AA%D5%DD%E7%E4%7F%0Bx%A3%FC%06%A9%23%0A%D6%C2%A1_2%00%00%00%09pHYs%00%00%0B%13%00%00%0B%13%01%00%9A%9C%18%00%00%00%3AIDAT8%11c%FC%FF%FF%7F%18%03%1A%60%01%F2%3F%A0%891%80%04%FF%11-%F8%17%9BJ%E2%05%B1ZD%81v%26t%E7%80%F8%A3%82h%A12%1A%20%A3%01%02%0F%01%BA%25%06%00%19%C0%0D%AEF%D5%3ES%00%00%00%00IEND%AEB%60%82");background-repeat:no-repeat,repeat-x;background-position:center center, top left;color:transparent;border:1px solid black;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;cursor:pointer;pointer-events:auto}
-.ace_fold:hover{background-image:url("data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%11%00%00%00%09%08%06%00%00%00%D4%E8%C7%0C%00%00%03%1EiCCPICC%20Profile%00%00x%01%85T%DFk%D3P%14%FE%DAe%9D%B0%E1%8B%3Ag%11%09%3Eh%91ndStC%9C%B6kW%BA%CDZ%EA6%B7!H%9B%A6m%5C%9A%C6%24%ED~%B0%07%D9%8Bo%3A%C5w%F1%07%3E%F9%07%0C%D9%83o%7B%92%0D%C6%14a%F8%AC%88%22L%F6%22%B3%9E%9B4M'S%03%B9%F7%BB%DF%F9%EE9'%E7%E4%5E%A0%F9qZ%D3%14%2F%0F%14USO%C5%C2%FC%C4%E4%14%DF%F2%01%5E%1CC%2B%FChM%8B%86%16J%26G%40%0F%D3%B2y%EF%B3%F3%0E%1E%C6lt%EEo%DF%AB%FEc%D5%9A%95%0C%11%F0%1C%20%BE%945%C4%22%E1Y%A0i%5C%D4t%13%E0%D6%89%EF%9D15%C2%CDLsX%A7%04%09%1Fg8oc%81%E1%8C%8D%23%96f45%40%9A%09%C2%07%C5B%3AK%B8%408%98i%E0%F3%0D%D8%CE%81%14%E4'%26%A9%92.%8B%3C%ABER%2F%E5dE%B2%0C%F6%F0%1Fs%83%F2_%B0%A8%94%E9%9B%AD%E7%10%8Dm%9A%19N%D1%7C%8A%DE%1F9%7Dp%8C%E6%00%D5%C1%3F_%18%BDA%B8%9DpX6%E3%A35~B%CD%24%AE%11%26%BD%E7%EEti%98%EDe%9A%97Y)%12%25%1C%24%BCbT%AE3li%E6%0B%03%89%9A%E6%D3%ED%F4P%92%B0%9F4%BF43Y%F3%E3%EDP%95%04%EB1%C5%F5%F6KF%F4%BA%BD%D7%DB%91%93%07%E35%3E%A7)%D6%7F%40%FE%BD%F7%F5r%8A%E5y%92%F0%EB%B4%1E%8D%D5%F4%5B%92%3AV%DB%DB%E4%CD%A6%23%C3%C4wQ%3F%03HB%82%8E%1Cd(%E0%91B%0Ca%9Ac%C4%AA%F8L%16%19%22J%A4%D2itTy%B28%D6%3B(%93%96%ED%1CGx%C9_%0E%B8%5E%16%F5%5B%B2%B8%F6%E0%FB%9E%DD%25%D7%8E%BC%15%85%C5%B7%A3%D8Q%ED%B5%81%E9%BA%B2%13%9A%1B%7Fua%A5%A3n%E17%B9%E5%9B%1Bm%AB%0B%08Q%FE%8A%E5%B1H%5Ee%CAO%82Q%D7u6%E6%90S%97%FCu%0B%CF2%94%EE%25v%12X%0C%BA%AC%F0%5E%F8*l%0AO%85%17%C2%97%BF%D4%C8%CE%DE%AD%11%CB%80q%2C%3E%AB%9ES%CD%C6%EC%25%D2L%D2%EBd%B8%BF%8A%F5B%C6%18%F9%901CZ%9D%BE%24M%9C%8A9%F2%DAP%0B'%06w%82%EB%E6%E2%5C%2F%D7%07%9E%BB%CC%5D%E1%FA%B9%08%AD.r%23%8E%C2%17%F5E%7C!%F0%BE3%BE%3E_%B7o%88a%A7%DB%BE%D3d%EB%A31Z%EB%BB%D3%91%BA%A2%B1z%94%8F%DB'%F6%3D%8E%AA%13%19%B2%B1%BE%B1~V%08%2B%B4%A2cjJ%B3tO%00%03%25mN%97%F3%05%93%EF%11%84%0B%7C%88%AE-%89%8F%ABbW%90O%2B%0Ao%99%0C%5E%97%0CI%AFH%D9.%B0%3B%8F%ED%03%B6S%D6%5D%E6i_s9%F3*p%E9%1B%FD%C3%EB.7U%06%5E%19%C0%D1s.%17%A03u%E4%09%B0%7C%5E%2C%EB%15%DB%1F%3C%9E%B7%80%91%3B%DBc%AD%3Dma%BA%8B%3EV%AB%DBt.%5B%1E%01%BB%0F%AB%D5%9F%CF%AA%D5%DD%E7%E4%7F%0Bx%A3%FC%06%A9%23%0A%D6%C2%A1_2%00%00%00%09pHYs%00%00%0B%13%00%00%0B%13%01%00%9A%9C%18%00%00%00%B5IDAT(%15%A5%91%3D%0E%02!%10%85ac%E1%05%D6%CE%D6%C6%CE%D2%E8%ED%CD%DE%C0%C6%D6N.%E0V%F8%3D%9Ca%891XH%C2%BE%D9y%3F%90!%E6%9C%C3%BFk%E5%011%C6-%F5%C8N%04%DF%BD%FF%89%DFt%83DN%60%3E%F3%AB%A0%DE%1A%5Dg%BE%10Q%97%1B%40%9C%A8o%10%8F%5E%828%B4%1B%60%87%F6%02%26%85%1Ch%1E%C1%2B%5Bk%FF%86%EE%B7j%09%9A%DA%9B%ACe%A3%F9%EC%DA!9%B4%D5%A6%81%86%86%98%CC%3C%5B%40%FA%81%B3%E9%CB%23%94%C16Azo%05%D4%E1%C1%95a%3B%8A'%A0%E8%CC%17%22%85%1D%BA%00%A2%FA%DC%0A%94%D1%D1%8D%8B%3A%84%17B%C7%60%1A%25Z%FC%8D%00%00%00%00IEND%AEB%60%82"),url("data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%05%00%00%007%08%06%00%00%00%C4%DD%80C%00%00%03%1EiCCPICC%20Profile%00%00x%01%85T%DFk%D3P%14%FE%DAe%9D%B0%E1%8B%3Ag%11%09%3Eh%91ndStC%9C%B6kW%BA%CDZ%EA6%B7!H%9B%A6m%5C%9A%C6%24%ED~%B0%07%D9%8Bo%3A%C5w%F1%07%3E%F9%07%0C%D9%83o%7B%92%0D%C6%14a%F8%AC%88%22L%F6%22%B3%9E%9B4M'S%03%B9%F7%BB%DF%F9%EE9'%E7%E4%5E%A0%F9qZ%D3%14%2F%0F%14USO%C5%C2%FC%C4%E4%14%DF%F2%01%5E%1CC%2B%FChM%8B%86%16J%26G%40%0F%D3%B2y%EF%B3%F3%0E%1E%C6lt%EEo%DF%AB%FEc%D5%9A%95%0C%11%F0%1C%20%BE%945%C4%22%E1Y%A0i%5C%D4t%13%E0%D6%89%EF%9D15%C2%CDLsX%A7%04%09%1Fg8oc%81%E1%8C%8D%23%96f45%40%9A%09%C2%07%C5B%3AK%B8%408%98i%E0%F3%0D%D8%CE%81%14%E4'%26%A9%92.%8B%3C%ABER%2F%E5dE%B2%0C%F6%F0%1Fs%83%F2_%B0%A8%94%E9%9B%AD%E7%10%8Dm%9A%19N%D1%7C%8A%DE%1F9%7Dp%8C%E6%00%D5%C1%3F_%18%BDA%B8%9DpX6%E3%A35~B%CD%24%AE%11%26%BD%E7%EEti%98%EDe%9A%97Y)%12%25%1C%24%BCbT%AE3li%E6%0B%03%89%9A%E6%D3%ED%F4P%92%B0%9F4%BF43Y%F3%E3%EDP%95%04%EB1%C5%F5%F6KF%F4%BA%BD%D7%DB%91%93%07%E35%3E%A7)%D6%7F%40%FE%BD%F7%F5r%8A%E5y%92%F0%EB%B4%1E%8D%D5%F4%5B%92%3AV%DB%DB%E4%CD%A6%23%C3%C4wQ%3F%03HB%82%8E%1Cd(%E0%91B%0Ca%9Ac%C4%AA%F8L%16%19%22J%A4%D2itTy%B28%D6%3B(%93%96%ED%1CGx%C9_%0E%B8%5E%16%F5%5B%B2%B8%F6%E0%FB%9E%DD%25%D7%8E%BC%15%85%C5%B7%A3%D8Q%ED%B5%81%E9%BA%B2%13%9A%1B%7Fua%A5%A3n%E17%B9%E5%9B%1Bm%AB%0B%08Q%FE%8A%E5%B1H%5Ee%CAO%82Q%D7u6%E6%90S%97%FCu%0B%CF2%94%EE%25v%12X%0C%BA%AC%F0%5E%F8*l%0AO%85%17%C2%97%BF%D4%C8%CE%DE%AD%11%CB%80q%2C%3E%AB%9ES%CD%C6%EC%25%D2L%D2%EBd%B8%BF%8A%F5B%C6%18%F9%901CZ%9D%BE%24M%9C%8A9%F2%DAP%0B'%06w%82%EB%E6%E2%5C%2F%D7%07%9E%BB%CC%5D%E1%FA%B9%08%AD.r%23%8E%C2%17%F5E%7C!%F0%BE3%BE%3E_%B7o%88a%A7%DB%BE%D3d%EB%A31Z%EB%BB%D3%91%BA%A2%B1z%94%8F%DB'%F6%3D%8E%AA%13%19%B2%B1%BE%B1~V%08%2B%B4%A2cjJ%B3tO%00%03%25mN%97%F3%05%93%EF%11%84%0B%7C%88%AE-%89%8F%ABbW%90O%2B%0Ao%99%0C%5E%97%0CI%AFH%D9.%B0%3B%8F%ED%03%B6S%D6%5D%E6i_s9%F3*p%E9%1B%FD%C3%EB.7U%06%5E%19%C0%D1s.%17%A03u%E4%09%B0%7C%5E%2C%EB%15%DB%1F%3C%9E%B7%80%91%3B%DBc%AD%3Dma%BA%8B%3EV%AB%DBt.%5B%1E%01%BB%0F%AB%D5%9F%CF%AA%D5%DD%E7%E4%7F%0Bx%A3%FC%06%A9%23%0A%D6%C2%A1_2%00%00%00%09pHYs%00%00%0B%13%00%00%0B%13%01%00%9A%9C%18%00%00%003IDAT8%11c%FC%FF%FF%7F%3E%03%1A%60%01%F2%3F%A3%891%80%04%FFQ%26%F8w%C0%B43%A1%DB%0C%E2%8F%0A%A2%85%CAh%80%8C%06%08%3C%04%E8%96%18%00%A3S%0D%CD%CF%D8%C1%9D%00%00%00%00IEND%AEB%60%82");background-repeat:no-repeat,repeat-x;background-position:center center, top left}
-.ace_gutter-tooltip{background-color:#FFF;background-image:-webkit-linear-gradient(top, transparent, rgba(0,0,0,0.1));background-image:linear-gradient(to bottom, transparent, rgba(0,0,0,0.1));border:1px solid gray;border-radius:1px;box-shadow:0 1px 2px rgba(0,0,0,0.3);color:black;display:inline-block;max-width:500px;padding:4px;position:fixed;z-index:999999;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;cursor:default;white-space:pre-line;word-wrap:break-word;line-height:normal;font-style:normal;font-weight:normal;letter-spacing:normal}
+.ace_line .ace_fold{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;display:inline-block;height:11px;margin-top:-2px;vertical-align:middle;background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII="),url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACJJREFUeNpi+P//fxgTAwPDBxDxD078RSX+YeEyDFMCIMAAI3INmXiwf2YAAAAASUVORK5CYII=");background-repeat:no-repeat,repeat-x;background-position:center center, top left;color:transparent;border:1px solid black;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;cursor:pointer;pointer-events:auto}
+.ace_fold:hover{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII="),url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACBJREFUeNpi+P//fz4TAwPDZxDxD5X4i5fLMEwJgAADAEPVDbjNw87ZAAAAAElFTkSuQmCC")}
+.ace_tooltip{background-color:#FFF;background-image:-webkit-linear-gradient(top, transparent, rgba(0,0,0,0.1));background-image:linear-gradient(to bottom, transparent, rgba(0,0,0,0.1));border:1px solid gray;border-radius:1px;box-shadow:0 1px 2px rgba(0,0,0,0.3);color:black;display:block;max-width:100%;padding:3px 4px;position:fixed;z-index:999999;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;cursor:default;white-space:pre;word-wrap:break-word;line-height:normal;font-style:normal;font-weight:normal;letter-spacing:normal;pointer-events:none}
.ace_folding-enabled>.ace_gutter-cell{padding-right:13px}
-.ace_fold-widget{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;margin:0 -12px 0 1px;display:none;width:11px;vertical-align:top;background-image:url("data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%05%00%00%00%05%08%06%00%00%00%8Do%26%E5%00%00%004IDATx%DAe%8A%B1%0D%000%0C%C2%F2%2CK%96%BC%D0%8F9%81%88H%E9%D0%0E%96%C0%10%92%3E%02%80%5E%82%E4%A9*-%EEsw%C8%CC%11%EE%96w%D8%DC%E9*Eh%0C%151(%00%00%00%00IEND%AEB%60%82");background-repeat:no-repeat;background-position:center;border-radius:3px;border:1px solid transparent;cursor:pointer}
+.ace_fold-widget{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;margin:0 -12px 0 1px;display:none;width:11px;vertical-align:top;background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42mWKsQ0AMAzC8ixLlrzQjzmBiEjp0A6WwBCSPgKAXoLkqSot7nN3yMwR7pZ32NzpKkVoDBUxKAAAAABJRU5ErkJggg==");background-repeat:no-repeat;background-position:center;border-radius:3px;border:1px solid transparent;cursor:pointer}
.ace_folding-enabled .ace_fold-widget{display:inline-block}
-.ace_fold-widget.ace_end{background-image:url("data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%05%00%00%00%05%08%06%00%00%00%8Do%26%E5%00%00%004IDATx%DAm%C7%C1%09%000%08C%D1%8C%ECE%C8E(%8E%EC%02)%1EZJ%F1%C1'%04%07I%E1%E5%EE%CAL%F5%A2%99%99%22%E2%D6%1FU%B5%FE0%D9x%A7%26Wz5%0E%D5%00%00%00%00IEND%AEB%60%82")}
-.ace_fold-widget.ace_closed{background-image:url("data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%03%00%00%00%06%08%06%00%00%00%06%E5%24%0C%00%00%009IDATx%DA5%CA%C1%09%000%08%03%C0%AC*(%3E%04%C1%0D%BA%B1%23%A4Uh%E0%20%81%C0%CC%F8%82%81%AA%A2%AArGfr%88%08%11%11%1C%DD%7D%E0%EE%5B%F6%F6%CB%B8%05Q%2F%E9tai%D9%00%00%00%00IEND%AEB%60%82")}
+.ace_fold-widget.ace_end{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42m3HwQkAMAhD0YzsRchFKI7sAikeWkrxwScEB0nh5e7KTPWimZki4tYfVbX+MNl4pyZXejUO1QAAAABJRU5ErkJggg==")}
+.ace_fold-widget.ace_closed{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAGCAYAAAAG5SQMAAAAOUlEQVR42jXKwQkAMAgDwKwqKD4EwQ26sSOkVWjgIIHAzPiCgaqiqnJHZnKICBERHN194O5b9vbLuAVRL+l0YWnZAAAAAElFTkSuQmCCXA==")}
.ace_fold-widget:hover{border:1px solid rgba(0,0,0,0.3);background-color:rgba(255,255,255,0.2);-moz-box-shadow:0 1px 1px rgba(255,255,255,0.7);-webkit-box-shadow:0 1px 1px rgba(255,255,255,0.7);box-shadow:0 1px 1px rgba(255,255,255,0.7)}
.ace_fold-widget:active{border:1px solid rgba(0,0,0,0.4);background-color:rgba(0,0,0,0.05);-moz-box-shadow:0 1px 1px rgba(255,255,255,0.8);-webkit-box-shadow:0 1px 1px rgba(255,255,255,0.8);box-shadow:0 1px 1px rgba(255,255,255,0.8)}
.ace_dark .ace_fold-widget{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHklEQVQIW2P4//8/AzoGEQ7oGCaLLAhWiSwB146BAQCSTPYocqT0AAAAAElFTkSuQmCC")}
@@ -1294,7 +1293,7 @@ body.pdf{font-family:"DejaVu Sans"}body.pdf code,body.pdf pre{font-family:"DejaV
.ace_italic{font-style:italic}
.ace_error-marker{background-color:rgba(255,0,0,0.2);position:absolute;z-index:9}
.ace_highlight-marker{background-color:rgba(255,255,0,0.2);position:absolute;z-index:8}
-.ace_search{background-color:#ddd;border:1px solid #cbcbcb;border-top:0 none;max-width:297px;overflow:hidden;margin:0;padding:4px;padding-right:6px;padding-bottom:0;position:absolute;top:0px;z-index:99}
+.ace_search{background-color:#ddd;border:1px solid #cbcbcb;border-top:0 none;max-width:297px;overflow:hidden;margin:0;padding:4px;padding-right:6px;padding-bottom:0;position:absolute;top:0px;z-index:99;white-space:normal}
.ace_search.left{border-left:0 none;border-radius:0px 0px 5px 0px;left:0}
.ace_search.right{border-radius:0px 0px 0px 5px;border-right:0 none;right:0}
.ace_search_form,.ace_replace_form{border-radius:3px;border:1px solid #cbcbcb;float:left;margin-bottom:4px;overflow:hidden}
@@ -1318,7 +1317,7 @@ body.pdf{font-family:"DejaVu Sans"}body.pdf code,body.pdf pre{font-family:"DejaV
.ace-tm .ace_gutter{background:#f0f0f0;color:#333}
.ace-tm .ace_print-margin{width:1px;background:#e8e8e8}
.ace-tm .ace_fold{background-color:#6B72E6}
-.ace-tm{background-color:#FFFFFF}
+.ace-tm{background-color:#FFFFFF;color:black}
.ace-tm .ace_cursor{color:black}
.ace-tm .ace_invisible{color:#bfbfbf}
.ace-tm .ace_storage,.ace-tm .ace_keyword{color:blue}
diff --git a/public/res-min/themes/night.css b/public/res-min/themes/night.css
index 9cc82b2e..e41060d1 100644
--- a/public/res-min/themes/night.css
+++ b/public/res-min/themes/night.css
@@ -1231,28 +1231,29 @@ kbd{padding:0.1em 0.6em;border:1px solid rgba(159,159,159,0.4);-webkit-box-shado
.icon-provider-gplus{background-position:-144px 0}
body.rtl #wmd-input,body.rtl #preview-contents,body.rtl .input-file-title,body.rtl .search-bar input,body.rtl .modal-document-manager input,body.rtl .container{direction:rtl}
body.pdf{font-family:"DejaVu Sans"}body.pdf code,body.pdf pre{font-family:"DejaVu Sans Mono"}
-.ace_editor{position:relative;overflow:hidden;font-family:'Monaco','Menlo','Ubuntu Mono','Consolas','source-code-pro',monospace;font-size:12px;line-height:normal;color:black;-ms-user-select:none;-moz-user-select:none;-webkit-user-select:none;user-select:none}
-.ace_scroller{position:absolute;overflow:hidden;top:0;bottom:0;background-color:inherit}
-.ace_content{position:absolute;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;cursor:text}
+.ace_editor{position:relative;overflow:hidden;font-family:'Monaco','Menlo','Ubuntu Mono','Consolas','source-code-pro',monospace;font-size:12px;line-height:normal;direction:ltr}
+.ace_scroller{position:absolute;overflow:hidden;top:0;bottom:0;background-color:inherit;-ms-user-select:none;-moz-user-select:none;-webkit-user-select:none;user-select:none}
+.ace_content{position:absolute;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;cursor:text;min-width:100%}
.ace_dragging,.ace_dragging *{cursor:move !important}
.ace_dragging .ace_scroller:before{position:absolute;top:0;left:0;right:0;bottom:0;content:'';background:rgba(250,250,250,0.01);z-index:1000}
.ace_dragging.ace_dark .ace_scroller:before{background:rgba(0,0,0,0.01)}
.ace_selecting,.ace_selecting *{cursor:text !important}
-.ace_gutter{position:absolute;overflow:hidden;width:auto;top:0;bottom:0;left:0;cursor:default;z-index:4}
+.ace_gutter{position:absolute;overflow:hidden;width:auto;top:0;bottom:0;left:0;cursor:default;z-index:4;-ms-user-select:none;-moz-user-select:none;-webkit-user-select:none;user-select:none}
.ace_gutter-active-line{position:absolute;left:0;right:0}
.ace_scroller.ace_scroll-left{box-shadow:17px 0 16px -16px rgba(0,0,0,0.4) inset}
.ace_gutter-cell{padding-left:19px;padding-right:6px;background-repeat:no-repeat}
-.ace_gutter-cell.ace_error{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QUM2OEZDQTQ4RTU0MTFFMUEzM0VFRTM2RUY1M0RBMjYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QUM2OEZDQTU4RTU0MTFFMUEzM0VFRTM2RUY1M0RBMjYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpBQzY4RkNBMjhFNTQxMUUxQTMzRUVFMzZFRjUzREEyNiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpBQzY4RkNBMzhFNTQxMUUxQTMzRUVFMzZFRjUzREEyNiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PkgXxbAAAAJbSURBVHjapFNNaBNBFH4zs5vdZLP5sQmNpT82QY209heh1ioWisaDRcSKF0WKJ0GQnrzrxasHsR6EnlrwD0TagxJabaVEpFYxLWlLSS822tr87m66ccfd2GKyVhA6MMybgfe97/vmPUQphd0sZjto9XIn9OOsvlu2nkqRzVU+6vvlzPf8W6bk8dxQ0NPbxAALgCgg2JkaQuhzQau/El0zbmUA7U0Es8v2CiYmKQJHGO1QICCLoqilMhkmurDAyapKgqItezi/USRdJqEYY4D5jCy03ht2yMkkvL91jTTX10qzyyu2hruPRN7jgbH+EOsXcMLgYiThEgAMhABW85oqy1DXdRIdvP1AHJ2acQXvDIrVHcdQNrEKNYSVMSZGMjEzIIAwDXIo+6G/FxcGnzkC3T2oMhLjre49sBB+RRcHLqdafK6sYdE/GGBwU1VpFNj0aN8pJbe+BkZyevUrvLl6Xmm0W9IuTc0DxrDNAJd5oEvI/KRsNC3bQyNjPO9yQ1YHcfj2QvfQc/5TUhJTBc2iM0U7AWDQtc1nJHvD/cfO2s7jaGkiTEfa/Ep8coLu7zmNmh8+dc5lZDuUeFAGUNA/OY6JVaypQ0vjr7XYjUvJM37vt+j1vuTK5DgVfVUoTjVe+y3/LxMxY2GgU+CSLy4cpfsYorRXuXIOi0Vt40h67uZFTdIo6nLaZcwUJWAzwNS0tBnqqKzQDnjdG/iPyZxo46HaKUpbvYkj8qYRTZsBhge+JHhZyh0x9b95JqjVJkT084kZIPwu/mPWqPgfQ5jXh2+92Ay7HedfAgwA6KDWafb4w3cAAAAASUVORK5CYII=");background-repeat:no-repeat;background-position:2px center}
-.ace_gutter-cell.ace_warning{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QUM2OEZDQTg4RTU0MTFFMUEzM0VFRTM2RUY1M0RBMjYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QUM2OEZDQTk4RTU0MTFFMUEzM0VFRTM2RUY1M0RBMjYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpBQzY4RkNBNjhFNTQxMUUxQTMzRUVFMzZFRjUzREEyNiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpBQzY4RkNBNzhFNTQxMUUxQTMzRUVFMzZFRjUzREEyNiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pgd7PfIAAAGmSURBVHjaYvr//z8DJZiJgUIANoCRkREb9gLiSVAaQx4OQM7AAkwd7XU2/v++/rOttdYGEB9dASEvOMydGKfH8Gv/p4XTkvRBfLxeQAP+1cUhXopyvzhP7P/IoSj7g7Mw09cNKO6J1QQ0L4gICPIv/veg/8W+JdFvQNLHVsW9/nmn9zk7B+cCkDwhL7gt6knSZnx9/LuCEOcvkIAMP+cvto9nfqyZmmUAksfnBUtbM60gX/3/kgyv3/xSFOL5DZT+L8vP+Yfh5cvfPvp/xUHyQHXGyAYwgpwBjZYFT3Y1OEl/OfCH4ffv3wzc4iwMvNIsDJ+f/mH4+vIPAxsb631WW0Yln6ZpQLXdMK/DXGDflh+sIv37EivD5x//Gb7+YWT4y86sl7BCCkSD+Z++/1dkvsFRl+HnD1Rvje4F8whjMXmGj58YGf5zsDMwcnAwfPvKcml62DsQDeaDxN+/Y0qwlpEHqrdB94IRNIDUgfgfKJChGK4OikEW3gTiXUB950ASLFAF54AC94A0G9QAfOnmF9DCDzABFqS08IHYDIScdijOjQABBgC+/9awBH96jwAAAABJRU5ErkJggg==");background-position:2px center}
-.ace_gutter-cell.ace_info{background-image:url("data:image/gif;base64,R0lGODlhEAAQAMQAAAAAAEFBQVJSUl5eXmRkZGtra39/f4WFhYmJiZGRkaampry8vMPDw8zMzNXV1dzc3OTk5Orq6vDw8P///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAkAABQALAAAAAAQABAAAAUuICWOZGmeaBml5XGwFCQSBGyXRSAwtqQIiRuiwIM5BoYVbEFIyGCQoeJGrVptIQA7");background-position:2px center}
-.ace_dark .ace_gutter-cell.ace_info{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpGRTk5MTVGREIxNDkxMUUxOTc5Q0FFREQyMTNGMjBFQyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpGRTk5MTVGRUIxNDkxMUUxOTc5Q0FFREQyMTNGMjBFQyI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkZFOTkxNUZCQjE0OTExRTE5NzlDQUVERDIxM0YyMEVDIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkZFOTkxNUZDQjE0OTExRTE5NzlDQUVERDIxM0YyMEVDIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+SIDkjAAAAJ1JREFUeNpi/P//PwMlgImBQkB7A6qrq/+DMC55FkIGKCoq4pVnpFkgTp069f/+/fv/r1u37r+tre1/kg0A+ptn9uzZYLaRkRHpLvjw4cNXWVlZhufPnzOcO3eOdAO0tbVPAjHDmzdvGA4fPsxIsgGSkpJmv379Ynj37h2DjIyMCMkG3LhxQ/T27dsMampqDHZ2dq/pH41DxwCAAAMAFdc68dUsFZgAAAAASUVORK5CYII=")}
-.ace_scrollbar{position:absolute;overflow-x:hidden;overflow-y:auto;right:0;top:0;bottom:0;z-index:6}
+.ace_gutter-cell.ace_error{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABOFBMVEX/////////QRswFAb/Ui4wFAYwFAYwFAaWGAfDRymzOSH/PxswFAb/SiUwFAYwFAbUPRvjQiDllog5HhHdRybsTi3/Tyv9Tir+Syj/UC3////XurebMBIwFAb/RSHbPx/gUzfdwL3kzMivKBAwFAbbvbnhPx66NhowFAYwFAaZJg8wFAaxKBDZurf/RB6mMxb/SCMwFAYwFAbxQB3+RB4wFAb/Qhy4Oh+4QifbNRcwFAYwFAYwFAb/QRzdNhgwFAYwFAbav7v/Uy7oaE68MBK5LxLewr/r2NXewLswFAaxJw4wFAbkPRy2PyYwFAaxKhLm1tMwFAazPiQwFAaUGAb/QBrfOx3bvrv/VC/maE4wFAbRPBq6MRO8Qynew8Dp2tjfwb0wFAbx6eju5+by6uns4uH9/f36+vr/GkHjAAAAYnRSTlMAGt+64rnWu/bo8eAA4InH3+DwoN7j4eLi4xP99Nfg4+b+/u9B/eDs1MD1mO7+4PHg2MXa347g7vDizMLN4eG+Pv7i5evs/v79yu7S3/DV7/498Yv24eH+4ufQ3Ozu/v7+y13sRqwAAADLSURBVHjaZc/XDsFgGIBhtDrshlitmk2IrbHFqL2pvXf/+78DPokj7+Fz9qpU/9UXJIlhmPaTaQ6QPaz0mm+5gwkgovcV6GZzd5JtCQwgsxoHOvJO15kleRLAnMgHFIESUEPmawB9ngmelTtipwwfASilxOLyiV5UVUyVAfbG0cCPHig+GBkzAENHS0AstVF6bacZIOzgLmxsHbt2OecNgJC83JERmePUYq8ARGkJx6XtFsdddBQgZE2nPR6CICZhawjA4Fb/chv+399kfR+MMMDGOQAAAABJRU5ErkJggg==");background-repeat:no-repeat;background-position:2px center}
+.ace_gutter-cell.ace_warning{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAmVBMVEX///8AAAD///8AAAAAAABPSzb/5sAAAAB/blH/73z/ulkAAAAAAAD85pkAAAAAAAACAgP/vGz/rkDerGbGrV7/pkQICAf////e0IsAAAD/oED/qTvhrnUAAAD/yHD/njcAAADuv2r/nz//oTj/p064oGf/zHAAAAA9Nir/tFIAAAD/tlTiuWf/tkIAAACynXEAAAAAAAAtIRW7zBpBAAAAM3RSTlMAABR1m7RXO8Ln31Z36zT+neXe5OzooRDfn+TZ4p3h2hTf4t3k3ucyrN1K5+Xaks52Sfs9CXgrAAAAjklEQVR42o3PbQ+CIBQFYEwboPhSYgoYunIqqLn6/z8uYdH8Vmdnu9vz4WwXgN/xTPRD2+sgOcZjsge/whXZgUaYYvT8QnuJaUrjrHUQreGczuEafQCO/SJTufTbroWsPgsllVhq3wJEk2jUSzX3CUEDJC84707djRc5MTAQxoLgupWRwW6UB5fS++NV8AbOZgnsC7BpEAAAAABJRU5ErkJggg==");background-position:2px center}
+.ace_gutter-cell.ace_info{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAAAAAA6mKC9AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAAJ0Uk5TAAB2k804AAAAPklEQVQY02NgIB68QuO3tiLznjAwpKTgNyDbMegwisCHZUETUZV0ZqOquBpXj2rtnpSJT1AEnnRmL2OgGgAAIKkRQap2htgAAAAASUVORK5CYII=");background-position:2px center}
+.ace_dark .ace_gutter-cell.ace_info{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAJFBMVEUAAAChoaGAgIAqKiq+vr6tra1ZWVmUlJSbm5s8PDxubm56enrdgzg3AAAAAXRSTlMAQObYZgAAAClJREFUeNpjYMAPdsMYHegyJZFQBlsUlMFVCWUYKkAZMxZAGdxlDMQBAG+TBP4B6RyJAAAAAElFTkSuQmCC")}
+.ace_scrollbar{position:absolute;right:0;bottom:0;z-index:6}
.ace_scrollbar-inner{position:absolute;cursor:text;left:0;top:0}
-.ace_scrollbar-h{position:absolute;overflow-x:auto;overflow-y:hidden;right:0;left:0;bottom:0;z-index:6}
+.ace_scrollbar-v{overflow-x:hidden;overflow-y:scroll;top:0}
+.ace_scrollbar-h{overflow-x:scroll;overflow-y:hidden;left:0}
.ace_print-margin{position:absolute;height:100%}
-.ace_text-input{position:absolute;z-index:0;width:0.5em;height:1em;opacity:0;background:transparent;-moz-appearance:none;appearance:none;border:none;resize:none;outline:none;overflow:hidden;font:inherit;padding:0 1px;margin:0 -1px;text-indent:-1em}
+.ace_text-input{position:absolute;z-index:0;width:0.5em;height:1em;opacity:0;background:transparent;-moz-appearance:none;appearance:none;border:none;resize:none;outline:none;overflow:hidden;font:inherit;padding:0 1px;margin:0 -1px;text-indent:-1em;-ms-user-select:text;-moz-user-select:text;-webkit-user-select:text;user-select:text}
.ace_text-input.ace_composition{background:#f8f8f8;color:#111;z-index:1000;opacity:1;text-indent:0}
-.ace_layer{z-index:1;position:absolute;overflow:hidden;white-space:nowrap;height:100%;width:100%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;pointer-events:none}
+.ace_layer{z-index:1;position:absolute;overflow:hidden;white-space:pre;height:100%;width:100%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;pointer-events:none}
.ace_gutter-layer{position:relative;width:auto;text-align:right;pointer-events:auto}
.ace_text-layer{font:inherit !important}
.ace_cjk{display:inline-block;text-align:center}
@@ -1262,22 +1263,20 @@ body.pdf{font-family:"DejaVu Sans"}body.pdf code,body.pdf pre{font-family:"DejaV
.ace_overwrite-cursors .ace_cursor{border-left-width:0px;border-bottom:1px solid}
.ace_hidden-cursors .ace_cursor{opacity:0.2}
.ace_smooth-blinking .ace_cursor{-moz-transition:opacity 0.18s;-webkit-transition:opacity 0.18s;-o-transition:opacity 0.18s;-ms-transition:opacity 0.18s;transition:opacity 0.18s}
-.ace_cursor[style*="opacity: 0"]{-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"}
.ace_editor.ace_multiselect .ace_cursor{border-left-width:1px}
-.ace_line{white-space:nowrap}
.ace_marker-layer .ace_step,.ace_marker-layer .ace_stack{position:absolute;z-index:3}
.ace_marker-layer .ace_selection{position:absolute;z-index:5}
.ace_marker-layer .ace_bracket{position:absolute;z-index:6}
.ace_marker-layer .ace_active-line{position:absolute;z-index:2}
.ace_marker-layer .ace_selected-word{position:absolute;z-index:4;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}
-.ace_line .ace_fold{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;display:inline-block;height:11px;margin-top:-2px;vertical-align:middle;background-image:url("data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%11%00%00%00%09%08%06%00%00%00%D4%E8%C7%0C%00%00%03%1EiCCPICC%20Profile%00%00x%01%85T%DFk%D3P%14%FE%DAe%9D%B0%E1%8B%3Ag%11%09%3Eh%91ndStC%9C%B6kW%BA%CDZ%EA6%B7!H%9B%A6m%5C%9A%C6%24%ED~%B0%07%D9%8Bo%3A%C5w%F1%07%3E%F9%07%0C%D9%83o%7B%92%0D%C6%14a%F8%AC%88%22L%F6%22%B3%9E%9B4M'S%03%B9%F7%BB%DF%F9%EE9'%E7%E4%5E%A0%F9qZ%D3%14%2F%0F%14USO%C5%C2%FC%C4%E4%14%DF%F2%01%5E%1CC%2B%FChM%8B%86%16J%26G%40%0F%D3%B2y%EF%B3%F3%0E%1E%C6lt%EEo%DF%AB%FEc%D5%9A%95%0C%11%F0%1C%20%BE%945%C4%22%E1Y%A0i%5C%D4t%13%E0%D6%89%EF%9D15%C2%CDLsX%A7%04%09%1Fg8oc%81%E1%8C%8D%23%96f45%40%9A%09%C2%07%C5B%3AK%B8%408%98i%E0%F3%0D%D8%CE%81%14%E4'%26%A9%92.%8B%3C%ABER%2F%E5dE%B2%0C%F6%F0%1Fs%83%F2_%B0%A8%94%E9%9B%AD%E7%10%8Dm%9A%19N%D1%7C%8A%DE%1F9%7Dp%8C%E6%00%D5%C1%3F_%18%BDA%B8%9DpX6%E3%A35~B%CD%24%AE%11%26%BD%E7%EEti%98%EDe%9A%97Y)%12%25%1C%24%BCbT%AE3li%E6%0B%03%89%9A%E6%D3%ED%F4P%92%B0%9F4%BF43Y%F3%E3%EDP%95%04%EB1%C5%F5%F6KF%F4%BA%BD%D7%DB%91%93%07%E35%3E%A7)%D6%7F%40%FE%BD%F7%F5r%8A%E5y%92%F0%EB%B4%1E%8D%D5%F4%5B%92%3AV%DB%DB%E4%CD%A6%23%C3%C4wQ%3F%03HB%82%8E%1Cd(%E0%91B%0Ca%9Ac%C4%AA%F8L%16%19%22J%A4%D2itTy%B28%D6%3B(%93%96%ED%1CGx%C9_%0E%B8%5E%16%F5%5B%B2%B8%F6%E0%FB%9E%DD%25%D7%8E%BC%15%85%C5%B7%A3%D8Q%ED%B5%81%E9%BA%B2%13%9A%1B%7Fua%A5%A3n%E17%B9%E5%9B%1Bm%AB%0B%08Q%FE%8A%E5%B1H%5Ee%CAO%82Q%D7u6%E6%90S%97%FCu%0B%CF2%94%EE%25v%12X%0C%BA%AC%F0%5E%F8*l%0AO%85%17%C2%97%BF%D4%C8%CE%DE%AD%11%CB%80q%2C%3E%AB%9ES%CD%C6%EC%25%D2L%D2%EBd%B8%BF%8A%F5B%C6%18%F9%901CZ%9D%BE%24M%9C%8A9%F2%DAP%0B'%06w%82%EB%E6%E2%5C%2F%D7%07%9E%BB%CC%5D%E1%FA%B9%08%AD.r%23%8E%C2%17%F5E%7C!%F0%BE3%BE%3E_%B7o%88a%A7%DB%BE%D3d%EB%A31Z%EB%BB%D3%91%BA%A2%B1z%94%8F%DB'%F6%3D%8E%AA%13%19%B2%B1%BE%B1~V%08%2B%B4%A2cjJ%B3tO%00%03%25mN%97%F3%05%93%EF%11%84%0B%7C%88%AE-%89%8F%ABbW%90O%2B%0Ao%99%0C%5E%97%0CI%AFH%D9.%B0%3B%8F%ED%03%B6S%D6%5D%E6i_s9%F3*p%E9%1B%FD%C3%EB.7U%06%5E%19%C0%D1s.%17%A03u%E4%09%B0%7C%5E%2C%EB%15%DB%1F%3C%9E%B7%80%91%3B%DBc%AD%3Dma%BA%8B%3EV%AB%DBt.%5B%1E%01%BB%0F%AB%D5%9F%CF%AA%D5%DD%E7%E4%7F%0Bx%A3%FC%06%A9%23%0A%D6%C2%A1_2%00%00%00%09pHYs%00%00%0B%13%00%00%0B%13%01%00%9A%9C%18%00%00%00%B5IDAT(%15%A5%91%3D%0E%02!%10%85ac%E1%05%D6%CE%D6%C6%CE%D2%E8%ED%CD%DE%C0%C6%D6N.%E0V%F8%3D%9Ca%891XH%C2%BE%D9y%3F%90!%E6%9C%C3%BFk%E5%011%C6-%F5%C8N%04%DF%BD%FF%89%DFt%83DN%60%3E%F3%AB%A0%DE%1A%5Dg%BE%10Q%97%1B%40%9C%A8o%10%8F%5E%828%B4%1B%60%87%F6%02%26%85%1Ch%1E%C1%2B%5Bk%FF%86%EE%B7j%09%9A%DA%9B%ACe%A3%F9%EC%DA!9%B4%D5%A6%81%86%86%98%CC%3C%5B%40%FA%81%B3%E9%CB%23%94%C16Azo%05%D4%E1%C1%95a%3B%8A'%A0%E8%CC%17%22%85%1D%BA%00%A2%FA%DC%0A%94%D1%D1%8D%8B%3A%84%17B%C7%60%1A%25Z%FC%8D%00%00%00%00IEND%AEB%60%82"),url("data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%05%00%00%007%08%06%00%00%00%C4%DD%80C%00%00%03%1EiCCPICC%20Profile%00%00x%01%85T%DFk%D3P%14%FE%DAe%9D%B0%E1%8B%3Ag%11%09%3Eh%91ndStC%9C%B6kW%BA%CDZ%EA6%B7!H%9B%A6m%5C%9A%C6%24%ED~%B0%07%D9%8Bo%3A%C5w%F1%07%3E%F9%07%0C%D9%83o%7B%92%0D%C6%14a%F8%AC%88%22L%F6%22%B3%9E%9B4M'S%03%B9%F7%BB%DF%F9%EE9'%E7%E4%5E%A0%F9qZ%D3%14%2F%0F%14USO%C5%C2%FC%C4%E4%14%DF%F2%01%5E%1CC%2B%FChM%8B%86%16J%26G%40%0F%D3%B2y%EF%B3%F3%0E%1E%C6lt%EEo%DF%AB%FEc%D5%9A%95%0C%11%F0%1C%20%BE%945%C4%22%E1Y%A0i%5C%D4t%13%E0%D6%89%EF%9D15%C2%CDLsX%A7%04%09%1Fg8oc%81%E1%8C%8D%23%96f45%40%9A%09%C2%07%C5B%3AK%B8%408%98i%E0%F3%0D%D8%CE%81%14%E4'%26%A9%92.%8B%3C%ABER%2F%E5dE%B2%0C%F6%F0%1Fs%83%F2_%B0%A8%94%E9%9B%AD%E7%10%8Dm%9A%19N%D1%7C%8A%DE%1F9%7Dp%8C%E6%00%D5%C1%3F_%18%BDA%B8%9DpX6%E3%A35~B%CD%24%AE%11%26%BD%E7%EEti%98%EDe%9A%97Y)%12%25%1C%24%BCbT%AE3li%E6%0B%03%89%9A%E6%D3%ED%F4P%92%B0%9F4%BF43Y%F3%E3%EDP%95%04%EB1%C5%F5%F6KF%F4%BA%BD%D7%DB%91%93%07%E35%3E%A7)%D6%7F%40%FE%BD%F7%F5r%8A%E5y%92%F0%EB%B4%1E%8D%D5%F4%5B%92%3AV%DB%DB%E4%CD%A6%23%C3%C4wQ%3F%03HB%82%8E%1Cd(%E0%91B%0Ca%9Ac%C4%AA%F8L%16%19%22J%A4%D2itTy%B28%D6%3B(%93%96%ED%1CGx%C9_%0E%B8%5E%16%F5%5B%B2%B8%F6%E0%FB%9E%DD%25%D7%8E%BC%15%85%C5%B7%A3%D8Q%ED%B5%81%E9%BA%B2%13%9A%1B%7Fua%A5%A3n%E17%B9%E5%9B%1Bm%AB%0B%08Q%FE%8A%E5%B1H%5Ee%CAO%82Q%D7u6%E6%90S%97%FCu%0B%CF2%94%EE%25v%12X%0C%BA%AC%F0%5E%F8*l%0AO%85%17%C2%97%BF%D4%C8%CE%DE%AD%11%CB%80q%2C%3E%AB%9ES%CD%C6%EC%25%D2L%D2%EBd%B8%BF%8A%F5B%C6%18%F9%901CZ%9D%BE%24M%9C%8A9%F2%DAP%0B'%06w%82%EB%E6%E2%5C%2F%D7%07%9E%BB%CC%5D%E1%FA%B9%08%AD.r%23%8E%C2%17%F5E%7C!%F0%BE3%BE%3E_%B7o%88a%A7%DB%BE%D3d%EB%A31Z%EB%BB%D3%91%BA%A2%B1z%94%8F%DB'%F6%3D%8E%AA%13%19%B2%B1%BE%B1~V%08%2B%B4%A2cjJ%B3tO%00%03%25mN%97%F3%05%93%EF%11%84%0B%7C%88%AE-%89%8F%ABbW%90O%2B%0Ao%99%0C%5E%97%0CI%AFH%D9.%B0%3B%8F%ED%03%B6S%D6%5D%E6i_s9%F3*p%E9%1B%FD%C3%EB.7U%06%5E%19%C0%D1s.%17%A03u%E4%09%B0%7C%5E%2C%EB%15%DB%1F%3C%9E%B7%80%91%3B%DBc%AD%3Dma%BA%8B%3EV%AB%DBt.%5B%1E%01%BB%0F%AB%D5%9F%CF%AA%D5%DD%E7%E4%7F%0Bx%A3%FC%06%A9%23%0A%D6%C2%A1_2%00%00%00%09pHYs%00%00%0B%13%00%00%0B%13%01%00%9A%9C%18%00%00%00%3AIDAT8%11c%FC%FF%FF%7F%18%03%1A%60%01%F2%3F%A0%891%80%04%FF%11-%F8%17%9BJ%E2%05%B1ZD%81v%26t%E7%80%F8%A3%82h%A12%1A%20%A3%01%02%0F%01%BA%25%06%00%19%C0%0D%AEF%D5%3ES%00%00%00%00IEND%AEB%60%82");background-repeat:no-repeat,repeat-x;background-position:center center, top left;color:transparent;border:1px solid black;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;cursor:pointer;pointer-events:auto}
-.ace_fold:hover{background-image:url("data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%11%00%00%00%09%08%06%00%00%00%D4%E8%C7%0C%00%00%03%1EiCCPICC%20Profile%00%00x%01%85T%DFk%D3P%14%FE%DAe%9D%B0%E1%8B%3Ag%11%09%3Eh%91ndStC%9C%B6kW%BA%CDZ%EA6%B7!H%9B%A6m%5C%9A%C6%24%ED~%B0%07%D9%8Bo%3A%C5w%F1%07%3E%F9%07%0C%D9%83o%7B%92%0D%C6%14a%F8%AC%88%22L%F6%22%B3%9E%9B4M'S%03%B9%F7%BB%DF%F9%EE9'%E7%E4%5E%A0%F9qZ%D3%14%2F%0F%14USO%C5%C2%FC%C4%E4%14%DF%F2%01%5E%1CC%2B%FChM%8B%86%16J%26G%40%0F%D3%B2y%EF%B3%F3%0E%1E%C6lt%EEo%DF%AB%FEc%D5%9A%95%0C%11%F0%1C%20%BE%945%C4%22%E1Y%A0i%5C%D4t%13%E0%D6%89%EF%9D15%C2%CDLsX%A7%04%09%1Fg8oc%81%E1%8C%8D%23%96f45%40%9A%09%C2%07%C5B%3AK%B8%408%98i%E0%F3%0D%D8%CE%81%14%E4'%26%A9%92.%8B%3C%ABER%2F%E5dE%B2%0C%F6%F0%1Fs%83%F2_%B0%A8%94%E9%9B%AD%E7%10%8Dm%9A%19N%D1%7C%8A%DE%1F9%7Dp%8C%E6%00%D5%C1%3F_%18%BDA%B8%9DpX6%E3%A35~B%CD%24%AE%11%26%BD%E7%EEti%98%EDe%9A%97Y)%12%25%1C%24%BCbT%AE3li%E6%0B%03%89%9A%E6%D3%ED%F4P%92%B0%9F4%BF43Y%F3%E3%EDP%95%04%EB1%C5%F5%F6KF%F4%BA%BD%D7%DB%91%93%07%E35%3E%A7)%D6%7F%40%FE%BD%F7%F5r%8A%E5y%92%F0%EB%B4%1E%8D%D5%F4%5B%92%3AV%DB%DB%E4%CD%A6%23%C3%C4wQ%3F%03HB%82%8E%1Cd(%E0%91B%0Ca%9Ac%C4%AA%F8L%16%19%22J%A4%D2itTy%B28%D6%3B(%93%96%ED%1CGx%C9_%0E%B8%5E%16%F5%5B%B2%B8%F6%E0%FB%9E%DD%25%D7%8E%BC%15%85%C5%B7%A3%D8Q%ED%B5%81%E9%BA%B2%13%9A%1B%7Fua%A5%A3n%E17%B9%E5%9B%1Bm%AB%0B%08Q%FE%8A%E5%B1H%5Ee%CAO%82Q%D7u6%E6%90S%97%FCu%0B%CF2%94%EE%25v%12X%0C%BA%AC%F0%5E%F8*l%0AO%85%17%C2%97%BF%D4%C8%CE%DE%AD%11%CB%80q%2C%3E%AB%9ES%CD%C6%EC%25%D2L%D2%EBd%B8%BF%8A%F5B%C6%18%F9%901CZ%9D%BE%24M%9C%8A9%F2%DAP%0B'%06w%82%EB%E6%E2%5C%2F%D7%07%9E%BB%CC%5D%E1%FA%B9%08%AD.r%23%8E%C2%17%F5E%7C!%F0%BE3%BE%3E_%B7o%88a%A7%DB%BE%D3d%EB%A31Z%EB%BB%D3%91%BA%A2%B1z%94%8F%DB'%F6%3D%8E%AA%13%19%B2%B1%BE%B1~V%08%2B%B4%A2cjJ%B3tO%00%03%25mN%97%F3%05%93%EF%11%84%0B%7C%88%AE-%89%8F%ABbW%90O%2B%0Ao%99%0C%5E%97%0CI%AFH%D9.%B0%3B%8F%ED%03%B6S%D6%5D%E6i_s9%F3*p%E9%1B%FD%C3%EB.7U%06%5E%19%C0%D1s.%17%A03u%E4%09%B0%7C%5E%2C%EB%15%DB%1F%3C%9E%B7%80%91%3B%DBc%AD%3Dma%BA%8B%3EV%AB%DBt.%5B%1E%01%BB%0F%AB%D5%9F%CF%AA%D5%DD%E7%E4%7F%0Bx%A3%FC%06%A9%23%0A%D6%C2%A1_2%00%00%00%09pHYs%00%00%0B%13%00%00%0B%13%01%00%9A%9C%18%00%00%00%B5IDAT(%15%A5%91%3D%0E%02!%10%85ac%E1%05%D6%CE%D6%C6%CE%D2%E8%ED%CD%DE%C0%C6%D6N.%E0V%F8%3D%9Ca%891XH%C2%BE%D9y%3F%90!%E6%9C%C3%BFk%E5%011%C6-%F5%C8N%04%DF%BD%FF%89%DFt%83DN%60%3E%F3%AB%A0%DE%1A%5Dg%BE%10Q%97%1B%40%9C%A8o%10%8F%5E%828%B4%1B%60%87%F6%02%26%85%1Ch%1E%C1%2B%5Bk%FF%86%EE%B7j%09%9A%DA%9B%ACe%A3%F9%EC%DA!9%B4%D5%A6%81%86%86%98%CC%3C%5B%40%FA%81%B3%E9%CB%23%94%C16Azo%05%D4%E1%C1%95a%3B%8A'%A0%E8%CC%17%22%85%1D%BA%00%A2%FA%DC%0A%94%D1%D1%8D%8B%3A%84%17B%C7%60%1A%25Z%FC%8D%00%00%00%00IEND%AEB%60%82"),url("data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%05%00%00%007%08%06%00%00%00%C4%DD%80C%00%00%03%1EiCCPICC%20Profile%00%00x%01%85T%DFk%D3P%14%FE%DAe%9D%B0%E1%8B%3Ag%11%09%3Eh%91ndStC%9C%B6kW%BA%CDZ%EA6%B7!H%9B%A6m%5C%9A%C6%24%ED~%B0%07%D9%8Bo%3A%C5w%F1%07%3E%F9%07%0C%D9%83o%7B%92%0D%C6%14a%F8%AC%88%22L%F6%22%B3%9E%9B4M'S%03%B9%F7%BB%DF%F9%EE9'%E7%E4%5E%A0%F9qZ%D3%14%2F%0F%14USO%C5%C2%FC%C4%E4%14%DF%F2%01%5E%1CC%2B%FChM%8B%86%16J%26G%40%0F%D3%B2y%EF%B3%F3%0E%1E%C6lt%EEo%DF%AB%FEc%D5%9A%95%0C%11%F0%1C%20%BE%945%C4%22%E1Y%A0i%5C%D4t%13%E0%D6%89%EF%9D15%C2%CDLsX%A7%04%09%1Fg8oc%81%E1%8C%8D%23%96f45%40%9A%09%C2%07%C5B%3AK%B8%408%98i%E0%F3%0D%D8%CE%81%14%E4'%26%A9%92.%8B%3C%ABER%2F%E5dE%B2%0C%F6%F0%1Fs%83%F2_%B0%A8%94%E9%9B%AD%E7%10%8Dm%9A%19N%D1%7C%8A%DE%1F9%7Dp%8C%E6%00%D5%C1%3F_%18%BDA%B8%9DpX6%E3%A35~B%CD%24%AE%11%26%BD%E7%EEti%98%EDe%9A%97Y)%12%25%1C%24%BCbT%AE3li%E6%0B%03%89%9A%E6%D3%ED%F4P%92%B0%9F4%BF43Y%F3%E3%EDP%95%04%EB1%C5%F5%F6KF%F4%BA%BD%D7%DB%91%93%07%E35%3E%A7)%D6%7F%40%FE%BD%F7%F5r%8A%E5y%92%F0%EB%B4%1E%8D%D5%F4%5B%92%3AV%DB%DB%E4%CD%A6%23%C3%C4wQ%3F%03HB%82%8E%1Cd(%E0%91B%0Ca%9Ac%C4%AA%F8L%16%19%22J%A4%D2itTy%B28%D6%3B(%93%96%ED%1CGx%C9_%0E%B8%5E%16%F5%5B%B2%B8%F6%E0%FB%9E%DD%25%D7%8E%BC%15%85%C5%B7%A3%D8Q%ED%B5%81%E9%BA%B2%13%9A%1B%7Fua%A5%A3n%E17%B9%E5%9B%1Bm%AB%0B%08Q%FE%8A%E5%B1H%5Ee%CAO%82Q%D7u6%E6%90S%97%FCu%0B%CF2%94%EE%25v%12X%0C%BA%AC%F0%5E%F8*l%0AO%85%17%C2%97%BF%D4%C8%CE%DE%AD%11%CB%80q%2C%3E%AB%9ES%CD%C6%EC%25%D2L%D2%EBd%B8%BF%8A%F5B%C6%18%F9%901CZ%9D%BE%24M%9C%8A9%F2%DAP%0B'%06w%82%EB%E6%E2%5C%2F%D7%07%9E%BB%CC%5D%E1%FA%B9%08%AD.r%23%8E%C2%17%F5E%7C!%F0%BE3%BE%3E_%B7o%88a%A7%DB%BE%D3d%EB%A31Z%EB%BB%D3%91%BA%A2%B1z%94%8F%DB'%F6%3D%8E%AA%13%19%B2%B1%BE%B1~V%08%2B%B4%A2cjJ%B3tO%00%03%25mN%97%F3%05%93%EF%11%84%0B%7C%88%AE-%89%8F%ABbW%90O%2B%0Ao%99%0C%5E%97%0CI%AFH%D9.%B0%3B%8F%ED%03%B6S%D6%5D%E6i_s9%F3*p%E9%1B%FD%C3%EB.7U%06%5E%19%C0%D1s.%17%A03u%E4%09%B0%7C%5E%2C%EB%15%DB%1F%3C%9E%B7%80%91%3B%DBc%AD%3Dma%BA%8B%3EV%AB%DBt.%5B%1E%01%BB%0F%AB%D5%9F%CF%AA%D5%DD%E7%E4%7F%0Bx%A3%FC%06%A9%23%0A%D6%C2%A1_2%00%00%00%09pHYs%00%00%0B%13%00%00%0B%13%01%00%9A%9C%18%00%00%003IDAT8%11c%FC%FF%FF%7F%3E%03%1A%60%01%F2%3F%A3%891%80%04%FFQ%26%F8w%C0%B43%A1%DB%0C%E2%8F%0A%A2%85%CAh%80%8C%06%08%3C%04%E8%96%18%00%A3S%0D%CD%CF%D8%C1%9D%00%00%00%00IEND%AEB%60%82");background-repeat:no-repeat,repeat-x;background-position:center center, top left}
-.ace_gutter-tooltip{background-color:#FFF;background-image:-webkit-linear-gradient(top, transparent, rgba(0,0,0,0.1));background-image:linear-gradient(to bottom, transparent, rgba(0,0,0,0.1));border:1px solid gray;border-radius:1px;box-shadow:0 1px 2px rgba(0,0,0,0.3);color:black;display:inline-block;max-width:500px;padding:4px;position:fixed;z-index:999999;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;cursor:default;white-space:pre-line;word-wrap:break-word;line-height:normal;font-style:normal;font-weight:normal;letter-spacing:normal}
+.ace_line .ace_fold{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;display:inline-block;height:11px;margin-top:-2px;vertical-align:middle;background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII="),url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACJJREFUeNpi+P//fxgTAwPDBxDxD078RSX+YeEyDFMCIMAAI3INmXiwf2YAAAAASUVORK5CYII=");background-repeat:no-repeat,repeat-x;background-position:center center, top left;color:transparent;border:1px solid black;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;cursor:pointer;pointer-events:auto}
+.ace_fold:hover{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII="),url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACBJREFUeNpi+P//fz4TAwPDZxDxD5X4i5fLMEwJgAADAEPVDbjNw87ZAAAAAElFTkSuQmCC")}
+.ace_tooltip{background-color:#FFF;background-image:-webkit-linear-gradient(top, transparent, rgba(0,0,0,0.1));background-image:linear-gradient(to bottom, transparent, rgba(0,0,0,0.1));border:1px solid gray;border-radius:1px;box-shadow:0 1px 2px rgba(0,0,0,0.3);color:black;display:block;max-width:100%;padding:3px 4px;position:fixed;z-index:999999;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;cursor:default;white-space:pre;word-wrap:break-word;line-height:normal;font-style:normal;font-weight:normal;letter-spacing:normal;pointer-events:none}
.ace_folding-enabled>.ace_gutter-cell{padding-right:13px}
-.ace_fold-widget{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;margin:0 -12px 0 1px;display:none;width:11px;vertical-align:top;background-image:url("data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%05%00%00%00%05%08%06%00%00%00%8Do%26%E5%00%00%004IDATx%DAe%8A%B1%0D%000%0C%C2%F2%2CK%96%BC%D0%8F9%81%88H%E9%D0%0E%96%C0%10%92%3E%02%80%5E%82%E4%A9*-%EEsw%C8%CC%11%EE%96w%D8%DC%E9*Eh%0C%151(%00%00%00%00IEND%AEB%60%82");background-repeat:no-repeat;background-position:center;border-radius:3px;border:1px solid transparent;cursor:pointer}
+.ace_fold-widget{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;margin:0 -12px 0 1px;display:none;width:11px;vertical-align:top;background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42mWKsQ0AMAzC8ixLlrzQjzmBiEjp0A6WwBCSPgKAXoLkqSot7nN3yMwR7pZ32NzpKkVoDBUxKAAAAABJRU5ErkJggg==");background-repeat:no-repeat;background-position:center;border-radius:3px;border:1px solid transparent;cursor:pointer}
.ace_folding-enabled .ace_fold-widget{display:inline-block}
-.ace_fold-widget.ace_end{background-image:url("data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%05%00%00%00%05%08%06%00%00%00%8Do%26%E5%00%00%004IDATx%DAm%C7%C1%09%000%08C%D1%8C%ECE%C8E(%8E%EC%02)%1EZJ%F1%C1'%04%07I%E1%E5%EE%CAL%F5%A2%99%99%22%E2%D6%1FU%B5%FE0%D9x%A7%26Wz5%0E%D5%00%00%00%00IEND%AEB%60%82")}
-.ace_fold-widget.ace_closed{background-image:url("data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%03%00%00%00%06%08%06%00%00%00%06%E5%24%0C%00%00%009IDATx%DA5%CA%C1%09%000%08%03%C0%AC*(%3E%04%C1%0D%BA%B1%23%A4Uh%E0%20%81%C0%CC%F8%82%81%AA%A2%AArGfr%88%08%11%11%1C%DD%7D%E0%EE%5B%F6%F6%CB%B8%05Q%2F%E9tai%D9%00%00%00%00IEND%AEB%60%82")}
+.ace_fold-widget.ace_end{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42m3HwQkAMAhD0YzsRchFKI7sAikeWkrxwScEB0nh5e7KTPWimZki4tYfVbX+MNl4pyZXejUO1QAAAABJRU5ErkJggg==")}
+.ace_fold-widget.ace_closed{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAGCAYAAAAG5SQMAAAAOUlEQVR42jXKwQkAMAgDwKwqKD4EwQ26sSOkVWjgIIHAzPiCgaqiqnJHZnKICBERHN194O5b9vbLuAVRL+l0YWnZAAAAAElFTkSuQmCCXA==")}
.ace_fold-widget:hover{border:1px solid rgba(0,0,0,0.3);background-color:rgba(255,255,255,0.2);-moz-box-shadow:0 1px 1px rgba(255,255,255,0.7);-webkit-box-shadow:0 1px 1px rgba(255,255,255,0.7);box-shadow:0 1px 1px rgba(255,255,255,0.7)}
.ace_fold-widget:active{border:1px solid rgba(0,0,0,0.4);background-color:rgba(0,0,0,0.05);-moz-box-shadow:0 1px 1px rgba(255,255,255,0.8);-webkit-box-shadow:0 1px 1px rgba(255,255,255,0.8);box-shadow:0 1px 1px rgba(255,255,255,0.8)}
.ace_dark .ace_fold-widget{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHklEQVQIW2P4//8/AzoGEQ7oGCaLLAhWiSwB146BAQCSTPYocqT0AAAAAElFTkSuQmCC")}
@@ -1294,7 +1293,7 @@ body.pdf{font-family:"DejaVu Sans"}body.pdf code,body.pdf pre{font-family:"DejaV
.ace_italic{font-style:italic}
.ace_error-marker{background-color:rgba(255,0,0,0.2);position:absolute;z-index:9}
.ace_highlight-marker{background-color:rgba(255,255,0,0.2);position:absolute;z-index:8}
-.ace_search{background-color:#ddd;border:1px solid #cbcbcb;border-top:0 none;max-width:297px;overflow:hidden;margin:0;padding:4px;padding-right:6px;padding-bottom:0;position:absolute;top:0px;z-index:99}
+.ace_search{background-color:#ddd;border:1px solid #cbcbcb;border-top:0 none;max-width:297px;overflow:hidden;margin:0;padding:4px;padding-right:6px;padding-bottom:0;position:absolute;top:0px;z-index:99;white-space:normal}
.ace_search.left{border-left:0 none;border-radius:0px 0px 5px 0px;left:0}
.ace_search.right{border-radius:0px 0px 0px 5px;border-right:0 none;right:0}
.ace_search_form,.ace_replace_form{border-radius:3px;border:1px solid #cbcbcb;float:left;margin-bottom:4px;overflow:hidden}
@@ -1318,7 +1317,7 @@ body.pdf{font-family:"DejaVu Sans"}body.pdf code,body.pdf pre{font-family:"DejaV
.ace-tm .ace_gutter{background:#f0f0f0;color:#333}
.ace-tm .ace_print-margin{width:1px;background:#e8e8e8}
.ace-tm .ace_fold{background-color:#6B72E6}
-.ace-tm{background-color:#FFFFFF}
+.ace-tm{background-color:#FFFFFF;color:black}
.ace-tm .ace_cursor{color:black}
.ace-tm .ace_invisible{color:#bfbfbf}
.ace-tm .ace_storage,.ace-tm .ace_keyword{color:blue}
diff --git a/public/res-min/themes/school.css b/public/res-min/themes/school.css
index 9fdfbd3e..076cb0c9 100644
--- a/public/res-min/themes/school.css
+++ b/public/res-min/themes/school.css
@@ -1231,28 +1231,29 @@ kbd{padding:0.1em 0.6em;border:1px solid rgba(17,33,48,0.25);-webkit-box-shadow:
.icon-provider-gplus{background-position:-144px 0}
body.rtl #wmd-input,body.rtl #preview-contents,body.rtl .input-file-title,body.rtl .search-bar input,body.rtl .modal-document-manager input,body.rtl .container{direction:rtl}
body.pdf{font-family:"DejaVu Sans"}body.pdf code,body.pdf pre{font-family:"DejaVu Sans Mono"}
-.ace_editor{position:relative;overflow:hidden;font-family:'Monaco','Menlo','Ubuntu Mono','Consolas','source-code-pro',monospace;font-size:12px;line-height:normal;color:black;-ms-user-select:none;-moz-user-select:none;-webkit-user-select:none;user-select:none}
-.ace_scroller{position:absolute;overflow:hidden;top:0;bottom:0;background-color:inherit}
-.ace_content{position:absolute;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;cursor:text}
+.ace_editor{position:relative;overflow:hidden;font-family:'Monaco','Menlo','Ubuntu Mono','Consolas','source-code-pro',monospace;font-size:12px;line-height:normal;direction:ltr}
+.ace_scroller{position:absolute;overflow:hidden;top:0;bottom:0;background-color:inherit;-ms-user-select:none;-moz-user-select:none;-webkit-user-select:none;user-select:none}
+.ace_content{position:absolute;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;cursor:text;min-width:100%}
.ace_dragging,.ace_dragging *{cursor:move !important}
.ace_dragging .ace_scroller:before{position:absolute;top:0;left:0;right:0;bottom:0;content:'';background:rgba(250,250,250,0.01);z-index:1000}
.ace_dragging.ace_dark .ace_scroller:before{background:rgba(0,0,0,0.01)}
.ace_selecting,.ace_selecting *{cursor:text !important}
-.ace_gutter{position:absolute;overflow:hidden;width:auto;top:0;bottom:0;left:0;cursor:default;z-index:4}
+.ace_gutter{position:absolute;overflow:hidden;width:auto;top:0;bottom:0;left:0;cursor:default;z-index:4;-ms-user-select:none;-moz-user-select:none;-webkit-user-select:none;user-select:none}
.ace_gutter-active-line{position:absolute;left:0;right:0}
.ace_scroller.ace_scroll-left{box-shadow:17px 0 16px -16px rgba(0,0,0,0.4) inset}
.ace_gutter-cell{padding-left:19px;padding-right:6px;background-repeat:no-repeat}
-.ace_gutter-cell.ace_error{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QUM2OEZDQTQ4RTU0MTFFMUEzM0VFRTM2RUY1M0RBMjYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QUM2OEZDQTU4RTU0MTFFMUEzM0VFRTM2RUY1M0RBMjYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpBQzY4RkNBMjhFNTQxMUUxQTMzRUVFMzZFRjUzREEyNiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpBQzY4RkNBMzhFNTQxMUUxQTMzRUVFMzZFRjUzREEyNiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PkgXxbAAAAJbSURBVHjapFNNaBNBFH4zs5vdZLP5sQmNpT82QY209heh1ioWisaDRcSKF0WKJ0GQnrzrxasHsR6EnlrwD0TagxJabaVEpFYxLWlLSS822tr87m66ccfd2GKyVhA6MMybgfe97/vmPUQphd0sZjto9XIn9OOsvlu2nkqRzVU+6vvlzPf8W6bk8dxQ0NPbxAALgCgg2JkaQuhzQau/El0zbmUA7U0Es8v2CiYmKQJHGO1QICCLoqilMhkmurDAyapKgqItezi/USRdJqEYY4D5jCy03ht2yMkkvL91jTTX10qzyyu2hruPRN7jgbH+EOsXcMLgYiThEgAMhABW85oqy1DXdRIdvP1AHJ2acQXvDIrVHcdQNrEKNYSVMSZGMjEzIIAwDXIo+6G/FxcGnzkC3T2oMhLjre49sBB+RRcHLqdafK6sYdE/GGBwU1VpFNj0aN8pJbe+BkZyevUrvLl6Xmm0W9IuTc0DxrDNAJd5oEvI/KRsNC3bQyNjPO9yQ1YHcfj2QvfQc/5TUhJTBc2iM0U7AWDQtc1nJHvD/cfO2s7jaGkiTEfa/Ep8coLu7zmNmh8+dc5lZDuUeFAGUNA/OY6JVaypQ0vjr7XYjUvJM37vt+j1vuTK5DgVfVUoTjVe+y3/LxMxY2GgU+CSLy4cpfsYorRXuXIOi0Vt40h67uZFTdIo6nLaZcwUJWAzwNS0tBnqqKzQDnjdG/iPyZxo46HaKUpbvYkj8qYRTZsBhge+JHhZyh0x9b95JqjVJkT084kZIPwu/mPWqPgfQ5jXh2+92Ay7HedfAgwA6KDWafb4w3cAAAAASUVORK5CYII=");background-repeat:no-repeat;background-position:2px center}
-.ace_gutter-cell.ace_warning{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QUM2OEZDQTg4RTU0MTFFMUEzM0VFRTM2RUY1M0RBMjYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QUM2OEZDQTk4RTU0MTFFMUEzM0VFRTM2RUY1M0RBMjYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpBQzY4RkNBNjhFNTQxMUUxQTMzRUVFMzZFRjUzREEyNiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpBQzY4RkNBNzhFNTQxMUUxQTMzRUVFMzZFRjUzREEyNiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pgd7PfIAAAGmSURBVHjaYvr//z8DJZiJgUIANoCRkREb9gLiSVAaQx4OQM7AAkwd7XU2/v++/rOttdYGEB9dASEvOMydGKfH8Gv/p4XTkvRBfLxeQAP+1cUhXopyvzhP7P/IoSj7g7Mw09cNKO6J1QQ0L4gICPIv/veg/8W+JdFvQNLHVsW9/nmn9zk7B+cCkDwhL7gt6knSZnx9/LuCEOcvkIAMP+cvto9nfqyZmmUAksfnBUtbM60gX/3/kgyv3/xSFOL5DZT+L8vP+Yfh5cvfPvp/xUHyQHXGyAYwgpwBjZYFT3Y1OEl/OfCH4ffv3wzc4iwMvNIsDJ+f/mH4+vIPAxsb631WW0Yln6ZpQLXdMK/DXGDflh+sIv37EivD5x//Gb7+YWT4y86sl7BCCkSD+Z++/1dkvsFRl+HnD1Rvje4F8whjMXmGj58YGf5zsDMwcnAwfPvKcml62DsQDeaDxN+/Y0qwlpEHqrdB94IRNIDUgfgfKJChGK4OikEW3gTiXUB950ASLFAF54AC94A0G9QAfOnmF9DCDzABFqS08IHYDIScdijOjQABBgC+/9awBH96jwAAAABJRU5ErkJggg==");background-position:2px center}
-.ace_gutter-cell.ace_info{background-image:url("data:image/gif;base64,R0lGODlhEAAQAMQAAAAAAEFBQVJSUl5eXmRkZGtra39/f4WFhYmJiZGRkaampry8vMPDw8zMzNXV1dzc3OTk5Orq6vDw8P///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAkAABQALAAAAAAQABAAAAUuICWOZGmeaBml5XGwFCQSBGyXRSAwtqQIiRuiwIM5BoYVbEFIyGCQoeJGrVptIQA7");background-position:2px center}
-.ace_dark .ace_gutter-cell.ace_info{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpGRTk5MTVGREIxNDkxMUUxOTc5Q0FFREQyMTNGMjBFQyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpGRTk5MTVGRUIxNDkxMUUxOTc5Q0FFREQyMTNGMjBFQyI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkZFOTkxNUZCQjE0OTExRTE5NzlDQUVERDIxM0YyMEVDIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkZFOTkxNUZDQjE0OTExRTE5NzlDQUVERDIxM0YyMEVDIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+SIDkjAAAAJ1JREFUeNpi/P//PwMlgImBQkB7A6qrq/+DMC55FkIGKCoq4pVnpFkgTp069f/+/fv/r1u37r+tre1/kg0A+ptn9uzZYLaRkRHpLvjw4cNXWVlZhufPnzOcO3eOdAO0tbVPAjHDmzdvGA4fPsxIsgGSkpJmv379Ynj37h2DjIyMCMkG3LhxQ/T27dsMampqDHZ2dq/pH41DxwCAAAMAFdc68dUsFZgAAAAASUVORK5CYII=")}
-.ace_scrollbar{position:absolute;overflow-x:hidden;overflow-y:auto;right:0;top:0;bottom:0;z-index:6}
+.ace_gutter-cell.ace_error{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABOFBMVEX/////////QRswFAb/Ui4wFAYwFAYwFAaWGAfDRymzOSH/PxswFAb/SiUwFAYwFAbUPRvjQiDllog5HhHdRybsTi3/Tyv9Tir+Syj/UC3////XurebMBIwFAb/RSHbPx/gUzfdwL3kzMivKBAwFAbbvbnhPx66NhowFAYwFAaZJg8wFAaxKBDZurf/RB6mMxb/SCMwFAYwFAbxQB3+RB4wFAb/Qhy4Oh+4QifbNRcwFAYwFAYwFAb/QRzdNhgwFAYwFAbav7v/Uy7oaE68MBK5LxLewr/r2NXewLswFAaxJw4wFAbkPRy2PyYwFAaxKhLm1tMwFAazPiQwFAaUGAb/QBrfOx3bvrv/VC/maE4wFAbRPBq6MRO8Qynew8Dp2tjfwb0wFAbx6eju5+by6uns4uH9/f36+vr/GkHjAAAAYnRSTlMAGt+64rnWu/bo8eAA4InH3+DwoN7j4eLi4xP99Nfg4+b+/u9B/eDs1MD1mO7+4PHg2MXa347g7vDizMLN4eG+Pv7i5evs/v79yu7S3/DV7/498Yv24eH+4ufQ3Ozu/v7+y13sRqwAAADLSURBVHjaZc/XDsFgGIBhtDrshlitmk2IrbHFqL2pvXf/+78DPokj7+Fz9qpU/9UXJIlhmPaTaQ6QPaz0mm+5gwkgovcV6GZzd5JtCQwgsxoHOvJO15kleRLAnMgHFIESUEPmawB9ngmelTtipwwfASilxOLyiV5UVUyVAfbG0cCPHig+GBkzAENHS0AstVF6bacZIOzgLmxsHbt2OecNgJC83JERmePUYq8ARGkJx6XtFsdddBQgZE2nPR6CICZhawjA4Fb/chv+399kfR+MMMDGOQAAAABJRU5ErkJggg==");background-repeat:no-repeat;background-position:2px center}
+.ace_gutter-cell.ace_warning{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAmVBMVEX///8AAAD///8AAAAAAABPSzb/5sAAAAB/blH/73z/ulkAAAAAAAD85pkAAAAAAAACAgP/vGz/rkDerGbGrV7/pkQICAf////e0IsAAAD/oED/qTvhrnUAAAD/yHD/njcAAADuv2r/nz//oTj/p064oGf/zHAAAAA9Nir/tFIAAAD/tlTiuWf/tkIAAACynXEAAAAAAAAtIRW7zBpBAAAAM3RSTlMAABR1m7RXO8Ln31Z36zT+neXe5OzooRDfn+TZ4p3h2hTf4t3k3ucyrN1K5+Xaks52Sfs9CXgrAAAAjklEQVR42o3PbQ+CIBQFYEwboPhSYgoYunIqqLn6/z8uYdH8Vmdnu9vz4WwXgN/xTPRD2+sgOcZjsge/whXZgUaYYvT8QnuJaUrjrHUQreGczuEafQCO/SJTufTbroWsPgsllVhq3wJEk2jUSzX3CUEDJC84707djRc5MTAQxoLgupWRwW6UB5fS++NV8AbOZgnsC7BpEAAAAABJRU5ErkJggg==");background-position:2px center}
+.ace_gutter-cell.ace_info{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAAAAAA6mKC9AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAAJ0Uk5TAAB2k804AAAAPklEQVQY02NgIB68QuO3tiLznjAwpKTgNyDbMegwisCHZUETUZV0ZqOquBpXj2rtnpSJT1AEnnRmL2OgGgAAIKkRQap2htgAAAAASUVORK5CYII=");background-position:2px center}
+.ace_dark .ace_gutter-cell.ace_info{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAJFBMVEUAAAChoaGAgIAqKiq+vr6tra1ZWVmUlJSbm5s8PDxubm56enrdgzg3AAAAAXRSTlMAQObYZgAAAClJREFUeNpjYMAPdsMYHegyJZFQBlsUlMFVCWUYKkAZMxZAGdxlDMQBAG+TBP4B6RyJAAAAAElFTkSuQmCC")}
+.ace_scrollbar{position:absolute;right:0;bottom:0;z-index:6}
.ace_scrollbar-inner{position:absolute;cursor:text;left:0;top:0}
-.ace_scrollbar-h{position:absolute;overflow-x:auto;overflow-y:hidden;right:0;left:0;bottom:0;z-index:6}
+.ace_scrollbar-v{overflow-x:hidden;overflow-y:scroll;top:0}
+.ace_scrollbar-h{overflow-x:scroll;overflow-y:hidden;left:0}
.ace_print-margin{position:absolute;height:100%}
-.ace_text-input{position:absolute;z-index:0;width:0.5em;height:1em;opacity:0;background:transparent;-moz-appearance:none;appearance:none;border:none;resize:none;outline:none;overflow:hidden;font:inherit;padding:0 1px;margin:0 -1px;text-indent:-1em}
+.ace_text-input{position:absolute;z-index:0;width:0.5em;height:1em;opacity:0;background:transparent;-moz-appearance:none;appearance:none;border:none;resize:none;outline:none;overflow:hidden;font:inherit;padding:0 1px;margin:0 -1px;text-indent:-1em;-ms-user-select:text;-moz-user-select:text;-webkit-user-select:text;user-select:text}
.ace_text-input.ace_composition{background:#f8f8f8;color:#111;z-index:1000;opacity:1;text-indent:0}
-.ace_layer{z-index:1;position:absolute;overflow:hidden;white-space:nowrap;height:100%;width:100%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;pointer-events:none}
+.ace_layer{z-index:1;position:absolute;overflow:hidden;white-space:pre;height:100%;width:100%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;pointer-events:none}
.ace_gutter-layer{position:relative;width:auto;text-align:right;pointer-events:auto}
.ace_text-layer{font:inherit !important}
.ace_cjk{display:inline-block;text-align:center}
@@ -1262,22 +1263,20 @@ body.pdf{font-family:"DejaVu Sans"}body.pdf code,body.pdf pre{font-family:"DejaV
.ace_overwrite-cursors .ace_cursor{border-left-width:0px;border-bottom:1px solid}
.ace_hidden-cursors .ace_cursor{opacity:0.2}
.ace_smooth-blinking .ace_cursor{-moz-transition:opacity 0.18s;-webkit-transition:opacity 0.18s;-o-transition:opacity 0.18s;-ms-transition:opacity 0.18s;transition:opacity 0.18s}
-.ace_cursor[style*="opacity: 0"]{-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"}
.ace_editor.ace_multiselect .ace_cursor{border-left-width:1px}
-.ace_line{white-space:nowrap}
.ace_marker-layer .ace_step,.ace_marker-layer .ace_stack{position:absolute;z-index:3}
.ace_marker-layer .ace_selection{position:absolute;z-index:5}
.ace_marker-layer .ace_bracket{position:absolute;z-index:6}
.ace_marker-layer .ace_active-line{position:absolute;z-index:2}
.ace_marker-layer .ace_selected-word{position:absolute;z-index:4;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}
-.ace_line .ace_fold{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;display:inline-block;height:11px;margin-top:-2px;vertical-align:middle;background-image:url("data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%11%00%00%00%09%08%06%00%00%00%D4%E8%C7%0C%00%00%03%1EiCCPICC%20Profile%00%00x%01%85T%DFk%D3P%14%FE%DAe%9D%B0%E1%8B%3Ag%11%09%3Eh%91ndStC%9C%B6kW%BA%CDZ%EA6%B7!H%9B%A6m%5C%9A%C6%24%ED~%B0%07%D9%8Bo%3A%C5w%F1%07%3E%F9%07%0C%D9%83o%7B%92%0D%C6%14a%F8%AC%88%22L%F6%22%B3%9E%9B4M'S%03%B9%F7%BB%DF%F9%EE9'%E7%E4%5E%A0%F9qZ%D3%14%2F%0F%14USO%C5%C2%FC%C4%E4%14%DF%F2%01%5E%1CC%2B%FChM%8B%86%16J%26G%40%0F%D3%B2y%EF%B3%F3%0E%1E%C6lt%EEo%DF%AB%FEc%D5%9A%95%0C%11%F0%1C%20%BE%945%C4%22%E1Y%A0i%5C%D4t%13%E0%D6%89%EF%9D15%C2%CDLsX%A7%04%09%1Fg8oc%81%E1%8C%8D%23%96f45%40%9A%09%C2%07%C5B%3AK%B8%408%98i%E0%F3%0D%D8%CE%81%14%E4'%26%A9%92.%8B%3C%ABER%2F%E5dE%B2%0C%F6%F0%1Fs%83%F2_%B0%A8%94%E9%9B%AD%E7%10%8Dm%9A%19N%D1%7C%8A%DE%1F9%7Dp%8C%E6%00%D5%C1%3F_%18%BDA%B8%9DpX6%E3%A35~B%CD%24%AE%11%26%BD%E7%EEti%98%EDe%9A%97Y)%12%25%1C%24%BCbT%AE3li%E6%0B%03%89%9A%E6%D3%ED%F4P%92%B0%9F4%BF43Y%F3%E3%EDP%95%04%EB1%C5%F5%F6KF%F4%BA%BD%D7%DB%91%93%07%E35%3E%A7)%D6%7F%40%FE%BD%F7%F5r%8A%E5y%92%F0%EB%B4%1E%8D%D5%F4%5B%92%3AV%DB%DB%E4%CD%A6%23%C3%C4wQ%3F%03HB%82%8E%1Cd(%E0%91B%0Ca%9Ac%C4%AA%F8L%16%19%22J%A4%D2itTy%B28%D6%3B(%93%96%ED%1CGx%C9_%0E%B8%5E%16%F5%5B%B2%B8%F6%E0%FB%9E%DD%25%D7%8E%BC%15%85%C5%B7%A3%D8Q%ED%B5%81%E9%BA%B2%13%9A%1B%7Fua%A5%A3n%E17%B9%E5%9B%1Bm%AB%0B%08Q%FE%8A%E5%B1H%5Ee%CAO%82Q%D7u6%E6%90S%97%FCu%0B%CF2%94%EE%25v%12X%0C%BA%AC%F0%5E%F8*l%0AO%85%17%C2%97%BF%D4%C8%CE%DE%AD%11%CB%80q%2C%3E%AB%9ES%CD%C6%EC%25%D2L%D2%EBd%B8%BF%8A%F5B%C6%18%F9%901CZ%9D%BE%24M%9C%8A9%F2%DAP%0B'%06w%82%EB%E6%E2%5C%2F%D7%07%9E%BB%CC%5D%E1%FA%B9%08%AD.r%23%8E%C2%17%F5E%7C!%F0%BE3%BE%3E_%B7o%88a%A7%DB%BE%D3d%EB%A31Z%EB%BB%D3%91%BA%A2%B1z%94%8F%DB'%F6%3D%8E%AA%13%19%B2%B1%BE%B1~V%08%2B%B4%A2cjJ%B3tO%00%03%25mN%97%F3%05%93%EF%11%84%0B%7C%88%AE-%89%8F%ABbW%90O%2B%0Ao%99%0C%5E%97%0CI%AFH%D9.%B0%3B%8F%ED%03%B6S%D6%5D%E6i_s9%F3*p%E9%1B%FD%C3%EB.7U%06%5E%19%C0%D1s.%17%A03u%E4%09%B0%7C%5E%2C%EB%15%DB%1F%3C%9E%B7%80%91%3B%DBc%AD%3Dma%BA%8B%3EV%AB%DBt.%5B%1E%01%BB%0F%AB%D5%9F%CF%AA%D5%DD%E7%E4%7F%0Bx%A3%FC%06%A9%23%0A%D6%C2%A1_2%00%00%00%09pHYs%00%00%0B%13%00%00%0B%13%01%00%9A%9C%18%00%00%00%B5IDAT(%15%A5%91%3D%0E%02!%10%85ac%E1%05%D6%CE%D6%C6%CE%D2%E8%ED%CD%DE%C0%C6%D6N.%E0V%F8%3D%9Ca%891XH%C2%BE%D9y%3F%90!%E6%9C%C3%BFk%E5%011%C6-%F5%C8N%04%DF%BD%FF%89%DFt%83DN%60%3E%F3%AB%A0%DE%1A%5Dg%BE%10Q%97%1B%40%9C%A8o%10%8F%5E%828%B4%1B%60%87%F6%02%26%85%1Ch%1E%C1%2B%5Bk%FF%86%EE%B7j%09%9A%DA%9B%ACe%A3%F9%EC%DA!9%B4%D5%A6%81%86%86%98%CC%3C%5B%40%FA%81%B3%E9%CB%23%94%C16Azo%05%D4%E1%C1%95a%3B%8A'%A0%E8%CC%17%22%85%1D%BA%00%A2%FA%DC%0A%94%D1%D1%8D%8B%3A%84%17B%C7%60%1A%25Z%FC%8D%00%00%00%00IEND%AEB%60%82"),url("data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%05%00%00%007%08%06%00%00%00%C4%DD%80C%00%00%03%1EiCCPICC%20Profile%00%00x%01%85T%DFk%D3P%14%FE%DAe%9D%B0%E1%8B%3Ag%11%09%3Eh%91ndStC%9C%B6kW%BA%CDZ%EA6%B7!H%9B%A6m%5C%9A%C6%24%ED~%B0%07%D9%8Bo%3A%C5w%F1%07%3E%F9%07%0C%D9%83o%7B%92%0D%C6%14a%F8%AC%88%22L%F6%22%B3%9E%9B4M'S%03%B9%F7%BB%DF%F9%EE9'%E7%E4%5E%A0%F9qZ%D3%14%2F%0F%14USO%C5%C2%FC%C4%E4%14%DF%F2%01%5E%1CC%2B%FChM%8B%86%16J%26G%40%0F%D3%B2y%EF%B3%F3%0E%1E%C6lt%EEo%DF%AB%FEc%D5%9A%95%0C%11%F0%1C%20%BE%945%C4%22%E1Y%A0i%5C%D4t%13%E0%D6%89%EF%9D15%C2%CDLsX%A7%04%09%1Fg8oc%81%E1%8C%8D%23%96f45%40%9A%09%C2%07%C5B%3AK%B8%408%98i%E0%F3%0D%D8%CE%81%14%E4'%26%A9%92.%8B%3C%ABER%2F%E5dE%B2%0C%F6%F0%1Fs%83%F2_%B0%A8%94%E9%9B%AD%E7%10%8Dm%9A%19N%D1%7C%8A%DE%1F9%7Dp%8C%E6%00%D5%C1%3F_%18%BDA%B8%9DpX6%E3%A35~B%CD%24%AE%11%26%BD%E7%EEti%98%EDe%9A%97Y)%12%25%1C%24%BCbT%AE3li%E6%0B%03%89%9A%E6%D3%ED%F4P%92%B0%9F4%BF43Y%F3%E3%EDP%95%04%EB1%C5%F5%F6KF%F4%BA%BD%D7%DB%91%93%07%E35%3E%A7)%D6%7F%40%FE%BD%F7%F5r%8A%E5y%92%F0%EB%B4%1E%8D%D5%F4%5B%92%3AV%DB%DB%E4%CD%A6%23%C3%C4wQ%3F%03HB%82%8E%1Cd(%E0%91B%0Ca%9Ac%C4%AA%F8L%16%19%22J%A4%D2itTy%B28%D6%3B(%93%96%ED%1CGx%C9_%0E%B8%5E%16%F5%5B%B2%B8%F6%E0%FB%9E%DD%25%D7%8E%BC%15%85%C5%B7%A3%D8Q%ED%B5%81%E9%BA%B2%13%9A%1B%7Fua%A5%A3n%E17%B9%E5%9B%1Bm%AB%0B%08Q%FE%8A%E5%B1H%5Ee%CAO%82Q%D7u6%E6%90S%97%FCu%0B%CF2%94%EE%25v%12X%0C%BA%AC%F0%5E%F8*l%0AO%85%17%C2%97%BF%D4%C8%CE%DE%AD%11%CB%80q%2C%3E%AB%9ES%CD%C6%EC%25%D2L%D2%EBd%B8%BF%8A%F5B%C6%18%F9%901CZ%9D%BE%24M%9C%8A9%F2%DAP%0B'%06w%82%EB%E6%E2%5C%2F%D7%07%9E%BB%CC%5D%E1%FA%B9%08%AD.r%23%8E%C2%17%F5E%7C!%F0%BE3%BE%3E_%B7o%88a%A7%DB%BE%D3d%EB%A31Z%EB%BB%D3%91%BA%A2%B1z%94%8F%DB'%F6%3D%8E%AA%13%19%B2%B1%BE%B1~V%08%2B%B4%A2cjJ%B3tO%00%03%25mN%97%F3%05%93%EF%11%84%0B%7C%88%AE-%89%8F%ABbW%90O%2B%0Ao%99%0C%5E%97%0CI%AFH%D9.%B0%3B%8F%ED%03%B6S%D6%5D%E6i_s9%F3*p%E9%1B%FD%C3%EB.7U%06%5E%19%C0%D1s.%17%A03u%E4%09%B0%7C%5E%2C%EB%15%DB%1F%3C%9E%B7%80%91%3B%DBc%AD%3Dma%BA%8B%3EV%AB%DBt.%5B%1E%01%BB%0F%AB%D5%9F%CF%AA%D5%DD%E7%E4%7F%0Bx%A3%FC%06%A9%23%0A%D6%C2%A1_2%00%00%00%09pHYs%00%00%0B%13%00%00%0B%13%01%00%9A%9C%18%00%00%00%3AIDAT8%11c%FC%FF%FF%7F%18%03%1A%60%01%F2%3F%A0%891%80%04%FF%11-%F8%17%9BJ%E2%05%B1ZD%81v%26t%E7%80%F8%A3%82h%A12%1A%20%A3%01%02%0F%01%BA%25%06%00%19%C0%0D%AEF%D5%3ES%00%00%00%00IEND%AEB%60%82");background-repeat:no-repeat,repeat-x;background-position:center center, top left;color:transparent;border:1px solid black;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;cursor:pointer;pointer-events:auto}
-.ace_fold:hover{background-image:url("data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%11%00%00%00%09%08%06%00%00%00%D4%E8%C7%0C%00%00%03%1EiCCPICC%20Profile%00%00x%01%85T%DFk%D3P%14%FE%DAe%9D%B0%E1%8B%3Ag%11%09%3Eh%91ndStC%9C%B6kW%BA%CDZ%EA6%B7!H%9B%A6m%5C%9A%C6%24%ED~%B0%07%D9%8Bo%3A%C5w%F1%07%3E%F9%07%0C%D9%83o%7B%92%0D%C6%14a%F8%AC%88%22L%F6%22%B3%9E%9B4M'S%03%B9%F7%BB%DF%F9%EE9'%E7%E4%5E%A0%F9qZ%D3%14%2F%0F%14USO%C5%C2%FC%C4%E4%14%DF%F2%01%5E%1CC%2B%FChM%8B%86%16J%26G%40%0F%D3%B2y%EF%B3%F3%0E%1E%C6lt%EEo%DF%AB%FEc%D5%9A%95%0C%11%F0%1C%20%BE%945%C4%22%E1Y%A0i%5C%D4t%13%E0%D6%89%EF%9D15%C2%CDLsX%A7%04%09%1Fg8oc%81%E1%8C%8D%23%96f45%40%9A%09%C2%07%C5B%3AK%B8%408%98i%E0%F3%0D%D8%CE%81%14%E4'%26%A9%92.%8B%3C%ABER%2F%E5dE%B2%0C%F6%F0%1Fs%83%F2_%B0%A8%94%E9%9B%AD%E7%10%8Dm%9A%19N%D1%7C%8A%DE%1F9%7Dp%8C%E6%00%D5%C1%3F_%18%BDA%B8%9DpX6%E3%A35~B%CD%24%AE%11%26%BD%E7%EEti%98%EDe%9A%97Y)%12%25%1C%24%BCbT%AE3li%E6%0B%03%89%9A%E6%D3%ED%F4P%92%B0%9F4%BF43Y%F3%E3%EDP%95%04%EB1%C5%F5%F6KF%F4%BA%BD%D7%DB%91%93%07%E35%3E%A7)%D6%7F%40%FE%BD%F7%F5r%8A%E5y%92%F0%EB%B4%1E%8D%D5%F4%5B%92%3AV%DB%DB%E4%CD%A6%23%C3%C4wQ%3F%03HB%82%8E%1Cd(%E0%91B%0Ca%9Ac%C4%AA%F8L%16%19%22J%A4%D2itTy%B28%D6%3B(%93%96%ED%1CGx%C9_%0E%B8%5E%16%F5%5B%B2%B8%F6%E0%FB%9E%DD%25%D7%8E%BC%15%85%C5%B7%A3%D8Q%ED%B5%81%E9%BA%B2%13%9A%1B%7Fua%A5%A3n%E17%B9%E5%9B%1Bm%AB%0B%08Q%FE%8A%E5%B1H%5Ee%CAO%82Q%D7u6%E6%90S%97%FCu%0B%CF2%94%EE%25v%12X%0C%BA%AC%F0%5E%F8*l%0AO%85%17%C2%97%BF%D4%C8%CE%DE%AD%11%CB%80q%2C%3E%AB%9ES%CD%C6%EC%25%D2L%D2%EBd%B8%BF%8A%F5B%C6%18%F9%901CZ%9D%BE%24M%9C%8A9%F2%DAP%0B'%06w%82%EB%E6%E2%5C%2F%D7%07%9E%BB%CC%5D%E1%FA%B9%08%AD.r%23%8E%C2%17%F5E%7C!%F0%BE3%BE%3E_%B7o%88a%A7%DB%BE%D3d%EB%A31Z%EB%BB%D3%91%BA%A2%B1z%94%8F%DB'%F6%3D%8E%AA%13%19%B2%B1%BE%B1~V%08%2B%B4%A2cjJ%B3tO%00%03%25mN%97%F3%05%93%EF%11%84%0B%7C%88%AE-%89%8F%ABbW%90O%2B%0Ao%99%0C%5E%97%0CI%AFH%D9.%B0%3B%8F%ED%03%B6S%D6%5D%E6i_s9%F3*p%E9%1B%FD%C3%EB.7U%06%5E%19%C0%D1s.%17%A03u%E4%09%B0%7C%5E%2C%EB%15%DB%1F%3C%9E%B7%80%91%3B%DBc%AD%3Dma%BA%8B%3EV%AB%DBt.%5B%1E%01%BB%0F%AB%D5%9F%CF%AA%D5%DD%E7%E4%7F%0Bx%A3%FC%06%A9%23%0A%D6%C2%A1_2%00%00%00%09pHYs%00%00%0B%13%00%00%0B%13%01%00%9A%9C%18%00%00%00%B5IDAT(%15%A5%91%3D%0E%02!%10%85ac%E1%05%D6%CE%D6%C6%CE%D2%E8%ED%CD%DE%C0%C6%D6N.%E0V%F8%3D%9Ca%891XH%C2%BE%D9y%3F%90!%E6%9C%C3%BFk%E5%011%C6-%F5%C8N%04%DF%BD%FF%89%DFt%83DN%60%3E%F3%AB%A0%DE%1A%5Dg%BE%10Q%97%1B%40%9C%A8o%10%8F%5E%828%B4%1B%60%87%F6%02%26%85%1Ch%1E%C1%2B%5Bk%FF%86%EE%B7j%09%9A%DA%9B%ACe%A3%F9%EC%DA!9%B4%D5%A6%81%86%86%98%CC%3C%5B%40%FA%81%B3%E9%CB%23%94%C16Azo%05%D4%E1%C1%95a%3B%8A'%A0%E8%CC%17%22%85%1D%BA%00%A2%FA%DC%0A%94%D1%D1%8D%8B%3A%84%17B%C7%60%1A%25Z%FC%8D%00%00%00%00IEND%AEB%60%82"),url("data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%05%00%00%007%08%06%00%00%00%C4%DD%80C%00%00%03%1EiCCPICC%20Profile%00%00x%01%85T%DFk%D3P%14%FE%DAe%9D%B0%E1%8B%3Ag%11%09%3Eh%91ndStC%9C%B6kW%BA%CDZ%EA6%B7!H%9B%A6m%5C%9A%C6%24%ED~%B0%07%D9%8Bo%3A%C5w%F1%07%3E%F9%07%0C%D9%83o%7B%92%0D%C6%14a%F8%AC%88%22L%F6%22%B3%9E%9B4M'S%03%B9%F7%BB%DF%F9%EE9'%E7%E4%5E%A0%F9qZ%D3%14%2F%0F%14USO%C5%C2%FC%C4%E4%14%DF%F2%01%5E%1CC%2B%FChM%8B%86%16J%26G%40%0F%D3%B2y%EF%B3%F3%0E%1E%C6lt%EEo%DF%AB%FEc%D5%9A%95%0C%11%F0%1C%20%BE%945%C4%22%E1Y%A0i%5C%D4t%13%E0%D6%89%EF%9D15%C2%CDLsX%A7%04%09%1Fg8oc%81%E1%8C%8D%23%96f45%40%9A%09%C2%07%C5B%3AK%B8%408%98i%E0%F3%0D%D8%CE%81%14%E4'%26%A9%92.%8B%3C%ABER%2F%E5dE%B2%0C%F6%F0%1Fs%83%F2_%B0%A8%94%E9%9B%AD%E7%10%8Dm%9A%19N%D1%7C%8A%DE%1F9%7Dp%8C%E6%00%D5%C1%3F_%18%BDA%B8%9DpX6%E3%A35~B%CD%24%AE%11%26%BD%E7%EEti%98%EDe%9A%97Y)%12%25%1C%24%BCbT%AE3li%E6%0B%03%89%9A%E6%D3%ED%F4P%92%B0%9F4%BF43Y%F3%E3%EDP%95%04%EB1%C5%F5%F6KF%F4%BA%BD%D7%DB%91%93%07%E35%3E%A7)%D6%7F%40%FE%BD%F7%F5r%8A%E5y%92%F0%EB%B4%1E%8D%D5%F4%5B%92%3AV%DB%DB%E4%CD%A6%23%C3%C4wQ%3F%03HB%82%8E%1Cd(%E0%91B%0Ca%9Ac%C4%AA%F8L%16%19%22J%A4%D2itTy%B28%D6%3B(%93%96%ED%1CGx%C9_%0E%B8%5E%16%F5%5B%B2%B8%F6%E0%FB%9E%DD%25%D7%8E%BC%15%85%C5%B7%A3%D8Q%ED%B5%81%E9%BA%B2%13%9A%1B%7Fua%A5%A3n%E17%B9%E5%9B%1Bm%AB%0B%08Q%FE%8A%E5%B1H%5Ee%CAO%82Q%D7u6%E6%90S%97%FCu%0B%CF2%94%EE%25v%12X%0C%BA%AC%F0%5E%F8*l%0AO%85%17%C2%97%BF%D4%C8%CE%DE%AD%11%CB%80q%2C%3E%AB%9ES%CD%C6%EC%25%D2L%D2%EBd%B8%BF%8A%F5B%C6%18%F9%901CZ%9D%BE%24M%9C%8A9%F2%DAP%0B'%06w%82%EB%E6%E2%5C%2F%D7%07%9E%BB%CC%5D%E1%FA%B9%08%AD.r%23%8E%C2%17%F5E%7C!%F0%BE3%BE%3E_%B7o%88a%A7%DB%BE%D3d%EB%A31Z%EB%BB%D3%91%BA%A2%B1z%94%8F%DB'%F6%3D%8E%AA%13%19%B2%B1%BE%B1~V%08%2B%B4%A2cjJ%B3tO%00%03%25mN%97%F3%05%93%EF%11%84%0B%7C%88%AE-%89%8F%ABbW%90O%2B%0Ao%99%0C%5E%97%0CI%AFH%D9.%B0%3B%8F%ED%03%B6S%D6%5D%E6i_s9%F3*p%E9%1B%FD%C3%EB.7U%06%5E%19%C0%D1s.%17%A03u%E4%09%B0%7C%5E%2C%EB%15%DB%1F%3C%9E%B7%80%91%3B%DBc%AD%3Dma%BA%8B%3EV%AB%DBt.%5B%1E%01%BB%0F%AB%D5%9F%CF%AA%D5%DD%E7%E4%7F%0Bx%A3%FC%06%A9%23%0A%D6%C2%A1_2%00%00%00%09pHYs%00%00%0B%13%00%00%0B%13%01%00%9A%9C%18%00%00%003IDAT8%11c%FC%FF%FF%7F%3E%03%1A%60%01%F2%3F%A3%891%80%04%FFQ%26%F8w%C0%B43%A1%DB%0C%E2%8F%0A%A2%85%CAh%80%8C%06%08%3C%04%E8%96%18%00%A3S%0D%CD%CF%D8%C1%9D%00%00%00%00IEND%AEB%60%82");background-repeat:no-repeat,repeat-x;background-position:center center, top left}
-.ace_gutter-tooltip{background-color:#FFF;background-image:-webkit-linear-gradient(top, transparent, rgba(0,0,0,0.1));background-image:linear-gradient(to bottom, transparent, rgba(0,0,0,0.1));border:1px solid gray;border-radius:1px;box-shadow:0 1px 2px rgba(0,0,0,0.3);color:black;display:inline-block;max-width:500px;padding:4px;position:fixed;z-index:999999;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;cursor:default;white-space:pre-line;word-wrap:break-word;line-height:normal;font-style:normal;font-weight:normal;letter-spacing:normal}
+.ace_line .ace_fold{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;display:inline-block;height:11px;margin-top:-2px;vertical-align:middle;background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII="),url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACJJREFUeNpi+P//fxgTAwPDBxDxD078RSX+YeEyDFMCIMAAI3INmXiwf2YAAAAASUVORK5CYII=");background-repeat:no-repeat,repeat-x;background-position:center center, top left;color:transparent;border:1px solid black;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;cursor:pointer;pointer-events:auto}
+.ace_fold:hover{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII="),url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACBJREFUeNpi+P//fz4TAwPDZxDxD5X4i5fLMEwJgAADAEPVDbjNw87ZAAAAAElFTkSuQmCC")}
+.ace_tooltip{background-color:#FFF;background-image:-webkit-linear-gradient(top, transparent, rgba(0,0,0,0.1));background-image:linear-gradient(to bottom, transparent, rgba(0,0,0,0.1));border:1px solid gray;border-radius:1px;box-shadow:0 1px 2px rgba(0,0,0,0.3);color:black;display:block;max-width:100%;padding:3px 4px;position:fixed;z-index:999999;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;cursor:default;white-space:pre;word-wrap:break-word;line-height:normal;font-style:normal;font-weight:normal;letter-spacing:normal;pointer-events:none}
.ace_folding-enabled>.ace_gutter-cell{padding-right:13px}
-.ace_fold-widget{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;margin:0 -12px 0 1px;display:none;width:11px;vertical-align:top;background-image:url("data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%05%00%00%00%05%08%06%00%00%00%8Do%26%E5%00%00%004IDATx%DAe%8A%B1%0D%000%0C%C2%F2%2CK%96%BC%D0%8F9%81%88H%E9%D0%0E%96%C0%10%92%3E%02%80%5E%82%E4%A9*-%EEsw%C8%CC%11%EE%96w%D8%DC%E9*Eh%0C%151(%00%00%00%00IEND%AEB%60%82");background-repeat:no-repeat;background-position:center;border-radius:3px;border:1px solid transparent;cursor:pointer}
+.ace_fold-widget{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;margin:0 -12px 0 1px;display:none;width:11px;vertical-align:top;background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42mWKsQ0AMAzC8ixLlrzQjzmBiEjp0A6WwBCSPgKAXoLkqSot7nN3yMwR7pZ32NzpKkVoDBUxKAAAAABJRU5ErkJggg==");background-repeat:no-repeat;background-position:center;border-radius:3px;border:1px solid transparent;cursor:pointer}
.ace_folding-enabled .ace_fold-widget{display:inline-block}
-.ace_fold-widget.ace_end{background-image:url("data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%05%00%00%00%05%08%06%00%00%00%8Do%26%E5%00%00%004IDATx%DAm%C7%C1%09%000%08C%D1%8C%ECE%C8E(%8E%EC%02)%1EZJ%F1%C1'%04%07I%E1%E5%EE%CAL%F5%A2%99%99%22%E2%D6%1FU%B5%FE0%D9x%A7%26Wz5%0E%D5%00%00%00%00IEND%AEB%60%82")}
-.ace_fold-widget.ace_closed{background-image:url("data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%03%00%00%00%06%08%06%00%00%00%06%E5%24%0C%00%00%009IDATx%DA5%CA%C1%09%000%08%03%C0%AC*(%3E%04%C1%0D%BA%B1%23%A4Uh%E0%20%81%C0%CC%F8%82%81%AA%A2%AArGfr%88%08%11%11%1C%DD%7D%E0%EE%5B%F6%F6%CB%B8%05Q%2F%E9tai%D9%00%00%00%00IEND%AEB%60%82")}
+.ace_fold-widget.ace_end{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42m3HwQkAMAhD0YzsRchFKI7sAikeWkrxwScEB0nh5e7KTPWimZki4tYfVbX+MNl4pyZXejUO1QAAAABJRU5ErkJggg==")}
+.ace_fold-widget.ace_closed{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAGCAYAAAAG5SQMAAAAOUlEQVR42jXKwQkAMAgDwKwqKD4EwQ26sSOkVWjgIIHAzPiCgaqiqnJHZnKICBERHN194O5b9vbLuAVRL+l0YWnZAAAAAElFTkSuQmCCXA==")}
.ace_fold-widget:hover{border:1px solid rgba(0,0,0,0.3);background-color:rgba(255,255,255,0.2);-moz-box-shadow:0 1px 1px rgba(255,255,255,0.7);-webkit-box-shadow:0 1px 1px rgba(255,255,255,0.7);box-shadow:0 1px 1px rgba(255,255,255,0.7)}
.ace_fold-widget:active{border:1px solid rgba(0,0,0,0.4);background-color:rgba(0,0,0,0.05);-moz-box-shadow:0 1px 1px rgba(255,255,255,0.8);-webkit-box-shadow:0 1px 1px rgba(255,255,255,0.8);box-shadow:0 1px 1px rgba(255,255,255,0.8)}
.ace_dark .ace_fold-widget{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHklEQVQIW2P4//8/AzoGEQ7oGCaLLAhWiSwB146BAQCSTPYocqT0AAAAAElFTkSuQmCC")}
@@ -1294,7 +1293,7 @@ body.pdf{font-family:"DejaVu Sans"}body.pdf code,body.pdf pre{font-family:"DejaV
.ace_italic{font-style:italic}
.ace_error-marker{background-color:rgba(255,0,0,0.2);position:absolute;z-index:9}
.ace_highlight-marker{background-color:rgba(255,255,0,0.2);position:absolute;z-index:8}
-.ace_search{background-color:#ddd;border:1px solid #cbcbcb;border-top:0 none;max-width:297px;overflow:hidden;margin:0;padding:4px;padding-right:6px;padding-bottom:0;position:absolute;top:0px;z-index:99}
+.ace_search{background-color:#ddd;border:1px solid #cbcbcb;border-top:0 none;max-width:297px;overflow:hidden;margin:0;padding:4px;padding-right:6px;padding-bottom:0;position:absolute;top:0px;z-index:99;white-space:normal}
.ace_search.left{border-left:0 none;border-radius:0px 0px 5px 0px;left:0}
.ace_search.right{border-radius:0px 0px 0px 5px;border-right:0 none;right:0}
.ace_search_form,.ace_replace_form{border-radius:3px;border:1px solid #cbcbcb;float:left;margin-bottom:4px;overflow:hidden}
@@ -1318,7 +1317,7 @@ body.pdf{font-family:"DejaVu Sans"}body.pdf code,body.pdf pre{font-family:"DejaV
.ace-tm .ace_gutter{background:#f0f0f0;color:#333}
.ace-tm .ace_print-margin{width:1px;background:#e8e8e8}
.ace-tm .ace_fold{background-color:#6B72E6}
-.ace-tm{background-color:#FFFFFF}
+.ace-tm{background-color:#FFFFFF;color:black}
.ace-tm .ace_cursor{color:black}
.ace-tm .ace_invisible{color:#bfbfbf}
.ace-tm .ace_storage,.ace-tm .ace_keyword{color:blue}
diff --git a/public/res/constants.js b/public/res/constants.js
index fd4ce601..939c7589 100644
--- a/public/res/constants.js
+++ b/public/res/constants.js
@@ -1,6 +1,6 @@
define([], function() {
var constants = {};
- constants.VERSION = "3.1.9";
+ constants.VERSION = "3.1.10";
constants.MAIN_URL = "https://stackedit.io/";
constants.GOOGLE_ANALYTICS_ACCOUNT_ID = "UA-39556145-1";