Merge "[internal #1848537] Upgrade scripts to use Python3"
diff --git a/htdocs/Libs/AJV/ajv.min.js b/htdocs/Libs/AJV/ajv.min.js
index 6dd7203..087c4b7 100644
--- a/htdocs/Libs/AJV/ajv.min.js
+++ b/htdocs/Libs/AJV/ajv.min.js
@@ -1,6 +1,3 @@
-/* Ajv JSON-schema validator */
-!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var r;r="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,r.Ajv=e()}}(function(){var define,module,exports;return function e(r,t,a){function s(i,n){if(!t[i]){if(!r[i]){var l="function"==typeof require&&require;if(!n&&l)return l(i,!0);if(o)return o(i,!0);var h=new Error("Cannot find module '"+i+"'");throw h.code="MODULE_NOT_FOUND",h}var u=t[i]={exports:{}};r[i][0].call(u.exports,function(e){var t=r[i][1][e];return s(t?t:e)},u,u.exports,e,r,t,a)}return t[i].exports}for(var o="function"==typeof require&&require,i=0;a.length>i;i++)s(a[i]);return s}({1:[function(e,r,t){(function(e){!function(a){function s(e){throw new RangeError(q[e])}function o(e,r){for(var t=e.length,a=[];t--;)a[t]=r(e[t]);return a}function i(e,r){var t=e.split("@"),a="";t.length>1&&(a=t[0]+"@",e=t[1]),e=e.replace(A,".");var s=e.split("."),i=o(s,r).join(".");return a+i}function n(e){for(var r,t,a=[],s=0,o=e.length;o>s;)r=e.charCodeAt(s++),r>=55296&&56319>=r&&o>s?(t=e.charCodeAt(s++),56320==(64512&t)?a.push(((1023&r)<<10)+(1023&t)+65536):(a.push(r),s--)):a.push(r);return a}function l(e){return o(e,function(e){var r="";return e>65535&&(e-=65536,r+=D(e>>>10&1023|55296),e=56320|1023&e),r+=D(e)}).join("")}function h(e){return 10>e-48?e-22:26>e-65?e-65:26>e-97?e-97:j}function u(e,r){return e+22+75*(26>e)-((0!=r)<<5)}function c(e,r,t){var a=0;for(e=t?C(e/S):e>>1,e+=C(e/r);e>L*x>>1;a+=j)e=C(e/L);return C(a+(L+1)*e/(e+R))}function f(e){var r,t,a,o,i,n,u,f,d,p,m=[],v=e.length,y=0,P=O,g=w;for(t=e.lastIndexOf(_),0>t&&(t=0),a=0;t>a;++a)e.charCodeAt(a)>=128&&s("not-basic"),m.push(e.charCodeAt(a));for(o=t>0?t+1:0;v>o;){for(i=y,n=1,u=j;o>=v&&s("invalid-input"),f=h(e.charCodeAt(o++)),(f>=j||f>C((E-y)/n))&&s("overflow"),y+=f*n,d=g>=u?$:u>=g+x?x:u-g,!(d>f);u+=j)p=j-d,n>C(E/p)&&s("overflow"),n*=p;r=m.length+1,g=c(y-i,r,0==i),C(y/r)>E-P&&s("overflow"),P+=C(y/r),y%=r,m.splice(y++,0,P)}return l(m)}function d(e){var r,t,a,o,i,l,h,f,d,p,m,v,y,P,g,b=[];for(e=n(e),v=e.length,r=O,t=0,i=w,l=0;v>l;++l)m=e[l],128>m&&b.push(D(m));for(a=o=b.length,o&&b.push(_);v>a;){for(h=E,l=0;v>l;++l)m=e[l],m>=r&&h>m&&(h=m);for(y=a+1,h-r>C((E-t)/y)&&s("overflow"),t+=(h-r)*y,r=h,l=0;v>l;++l)if(m=e[l],r>m&&++t>E&&s("overflow"),m==r){for(f=t,d=j;p=i>=d?$:d>=i+x?x:d-i,!(p>f);d+=j)g=f-p,P=j-p,b.push(D(u(p+g%P,0))),f=C(g/P);b.push(D(u(f,0))),i=c(t,y,a==o),t=0,++a}++t,++r}return b.join("")}function p(e){return i(e,function(e){return k.test(e)?f(e.slice(4).toLowerCase()):e})}function m(e){return i(e,function(e){return I.test(e)?"xn--"+d(e):e})}var v="object"==typeof t&&t&&!t.nodeType&&t,y="object"==typeof r&&r&&!r.nodeType&&r,P="object"==typeof e&&e;(P.global===P||P.window===P||P.self===P)&&(a=P);var g,b,E=2147483647,j=36,$=1,x=26,R=38,S=700,w=72,O=128,_="-",k=/^xn--/,I=/[^\x20-\x7E]/,A=/[\x2E\u3002\uFF0E\uFF61]/g,q={overflow:"Overflow: input needs wider integers to process","not-basic":"Illegal input >= 0x80 (not a basic code point)","invalid-input":"Invalid input"},L=j-$,C=Math.floor,D=String.fromCharCode;if(g={version:"1.3.2",ucs2:{decode:n,encode:l},decode:f,encode:d,toASCII:m,toUnicode:p},"function"==typeof define&&"object"==typeof define.amd&&define.amd)define("punycode",function(){return g});else if(v&&y)if(r.exports==v)y.exports=g;else for(b in g)g.hasOwnProperty(b)&&(v[b]=g[b]);else a.punycode=g}(this)}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],2:[function(e,r,t){"use strict";function a(e,r){return Object.prototype.hasOwnProperty.call(e,r)}r.exports=function(e,r,t,o){r=r||"&",t=t||"=";var i={};if("string"!=typeof e||0===e.length)return i;var n=/\+/g;e=e.split(r);var l=1e3;o&&"number"==typeof o.maxKeys&&(l=o.maxKeys);var h=e.length;l>0&&h>l&&(h=l);for(var u=0;h>u;++u){var c,f,d,p,m=e[u].replace(n,"%20"),v=m.indexOf(t);v>=0?(c=m.substr(0,v),f=m.substr(v+1)):(c=m,f=""),d=decodeURIComponent(c),p=decodeURIComponent(f),a(i,d)?s(i[d])?i[d].push(p):i[d]=[i[d],p]:i[d]=p}return i};var s=Array.isArray||function(e){return"[object Array]"===Object.prototype.toString.call(e)}},{}],3:[function(e,r,t){"use strict";function a(e,r){if(e.map)return e.map(r);for(var t=[],a=0;e.length>a;a++)t.push(r(e[a],a));return t}var s=function(e){switch(typeof e){case"string":return e;case"boolean":return e?"true":"false";case"number":return isFinite(e)?e:"";default:return""}};r.exports=function(e,r,t,n){return r=r||"&",t=t||"=",null===e&&(e=void 0),"object"==typeof e?a(i(e),function(i){var n=encodeURIComponent(s(i))+t;return o(e[i])?a(e[i],function(e){return n+encodeURIComponent(s(e))}).join(r):n+encodeURIComponent(s(e[i]))}).join(r):n?encodeURIComponent(s(n))+t+encodeURIComponent(s(e)):""};var o=Array.isArray||function(e){return"[object Array]"===Object.prototype.toString.call(e)},i=Object.keys||function(e){var r=[];for(var t in e)Object.prototype.hasOwnProperty.call(e,t)&&r.push(t);return r}},{}],4:[function(e,r,t){"use strict";t.decode=t.parse=e("./decode"),t.encode=t.stringify=e("./encode")},{"./decode":2,"./encode":3}],5:[function(e,r,t){"use strict";function a(){this.protocol=null,this.slashes=null,this.auth=null,this.host=null,this.port=null,this.hostname=null,this.hash=null,this.search=null,this.query=null,this.pathname=null,this.path=null,this.href=null}function s(e,r,t){if(e&&h.isObject(e)&&e instanceof a)return e;var s=new a;return s.parse(e,r,t),s}function o(e){return h.isString(e)&&(e=s(e)),e instanceof a?e.format():a.prototype.format.call(e)}function i(e,r){return s(e,!1,!0).resolve(r)}function n(e,r){return e?s(e,!1,!0).resolveObject(r):r}var l=e("punycode"),h=e("./util");t.parse=s,t.resolve=i,t.resolveObject=n,t.format=o,t.Url=a;var u=/^([a-z0-9.+-]+:)/i,c=/:[0-9]*$/,f=/^(\/\/?(?!\/)[^\?\s]*)(\?[^\s]*)?$/,d=["<",">",'"',"`"," ","\r","\n","	"],p=["{","}","|","\\","^","`"].concat(d),m=["'"].concat(p),v=["%","/","?",";","#"].concat(m),y=["/","?","#"],P=255,g=/^[+a-z0-9A-Z_-]{0,63}$/,b=/^([+a-z0-9A-Z_-]{0,63})(.*)$/,E={javascript:!0,"javascript:":!0},j={javascript:!0,"javascript:":!0},$={http:!0,https:!0,ftp:!0,gopher:!0,file:!0,"http:":!0,"https:":!0,"ftp:":!0,"gopher:":!0,"file:":!0},x=e("querystring");a.prototype.parse=function(e,r,t){if(!h.isString(e))throw new TypeError("Parameter 'url' must be a string, not "+typeof e);var a=e.indexOf("?"),s=-1!==a&&a<e.indexOf("#")?"?":"#",o=e.split(s),i=/\\/g;o[0]=o[0].replace(i,"/"),e=o.join(s);var n=e;if(n=n.trim(),!t&&1===e.split("#").length){var c=f.exec(n);if(c)return this.path=n,this.href=n,this.pathname=c[1],c[2]?(this.search=c[2],this.query=r?x.parse(this.search.substr(1)):this.search.substr(1)):r&&(this.search="",this.query={}),this}var d=u.exec(n);if(d){d=d[0];var p=d.toLowerCase();this.protocol=p,n=n.substr(d.length)}if(t||d||n.match(/^\/\/[^@\/]+@[^@\/]+/)){var R="//"===n.substr(0,2);!R||d&&j[d]||(n=n.substr(2),this.slashes=!0)}if(!j[d]&&(R||d&&!$[d])){for(var S=-1,w=0;y.length>w;w++){var O=n.indexOf(y[w]);-1!==O&&(-1===S||S>O)&&(S=O)}var _,k;k=-1===S?n.lastIndexOf("@"):n.lastIndexOf("@",S),-1!==k&&(_=n.slice(0,k),n=n.slice(k+1),this.auth=decodeURIComponent(_)),S=-1;for(var w=0;v.length>w;w++){var O=n.indexOf(v[w]);-1!==O&&(-1===S||S>O)&&(S=O)}-1===S&&(S=n.length),this.host=n.slice(0,S),n=n.slice(S),this.parseHost(),this.hostname=this.hostname||"";var I="["===this.hostname[0]&&"]"===this.hostname[this.hostname.length-1];if(!I)for(var A=this.hostname.split(/\./),w=0,q=A.length;q>w;w++){var L=A[w];if(L&&!L.match(g)){for(var C="",D=0,U=L.length;U>D;D++)C+=L.charCodeAt(D)>127?"x":L[D];if(!C.match(g)){var z=A.slice(0,w),M=A.slice(w+1),T=L.match(b);T&&(z.push(T[1]),M.unshift(T[2])),M.length&&(n="/"+M.join(".")+n),this.hostname=z.join(".");break}}}this.hostname=this.hostname.length>P?"":this.hostname.toLowerCase(),I||(this.hostname=l.toASCII(this.hostname));var Q=this.port?":"+this.port:"",H=this.hostname||"";this.host=H+Q,this.href+=this.host,I&&(this.hostname=this.hostname.substr(1,this.hostname.length-2),"/"!==n[0]&&(n="/"+n))}if(!E[p])for(var w=0,q=m.length;q>w;w++){var N=m[w];if(-1!==n.indexOf(N)){var V=encodeURIComponent(N);V===N&&(V=escape(N)),n=n.split(N).join(V)}}var F=n.indexOf("#");-1!==F&&(this.hash=n.substr(F),n=n.slice(0,F));var G=n.indexOf("?");if(-1!==G?(this.search=n.substr(G),this.query=n.substr(G+1),r&&(this.query=x.parse(this.query)),n=n.slice(0,G)):r&&(this.search="",this.query={}),n&&(this.pathname=n),$[p]&&this.hostname&&!this.pathname&&(this.pathname="/"),this.pathname||this.search){var Q=this.pathname||"",K=this.search||"";this.path=Q+K}return this.href=this.format(),this},a.prototype.format=function(){var e=this.auth||"";e&&(e=encodeURIComponent(e),e=e.replace(/%3A/i,":"),e+="@");var r=this.protocol||"",t=this.pathname||"",a=this.hash||"",s=!1,o="";this.host?s=e+this.host:this.hostname&&(s=e+(-1===this.hostname.indexOf(":")?this.hostname:"["+this.hostname+"]"),this.port&&(s+=":"+this.port)),this.query&&h.isObject(this.query)&&Object.keys(this.query).length&&(o=x.stringify(this.query));var i=this.search||o&&"?"+o||"";return r&&":"!==r.substr(-1)&&(r+=":"),this.slashes||(!r||$[r])&&s!==!1?(s="//"+(s||""),t&&"/"!==t.charAt(0)&&(t="/"+t)):s||(s=""),a&&"#"!==a.charAt(0)&&(a="#"+a),i&&"?"!==i.charAt(0)&&(i="?"+i),t=t.replace(/[?#]/g,function(e){return encodeURIComponent(e)}),i=i.replace("#","%23"),r+s+t+i+a},a.prototype.resolve=function(e){return this.resolveObject(s(e,!1,!0)).format()},a.prototype.resolveObject=function(e){if(h.isString(e)){var r=new a;r.parse(e,!1,!0),e=r}for(var t=new a,s=Object.keys(this),o=0;s.length>o;o++){var i=s[o];t[i]=this[i]}if(t.hash=e.hash,""===e.href)return t.href=t.format(),t;if(e.slashes&&!e.protocol){for(var n=Object.keys(e),l=0;n.length>l;l++){var u=n[l];"protocol"!==u&&(t[u]=e[u])}return $[t.protocol]&&t.hostname&&!t.pathname&&(t.path=t.pathname="/"),t.href=t.format(),t}if(e.protocol&&e.protocol!==t.protocol){if(!$[e.protocol]){for(var c=Object.keys(e),f=0;c.length>f;f++){var d=c[f];t[d]=e[d]}return t.href=t.format(),t}if(t.protocol=e.protocol,e.host||j[e.protocol])t.pathname=e.pathname;else{for(var p=(e.pathname||"").split("/");p.length&&!(e.host=p.shift()););e.host||(e.host=""),e.hostname||(e.hostname=""),""!==p[0]&&p.unshift(""),2>p.length&&p.unshift(""),t.pathname=p.join("/")}if(t.search=e.search,t.query=e.query,t.host=e.host||"",t.auth=e.auth,t.hostname=e.hostname||e.host,t.port=e.port,t.pathname||t.search){var m=t.pathname||"",v=t.search||"";t.path=m+v}return t.slashes=t.slashes||e.slashes,t.href=t.format(),t}var y=t.pathname&&"/"===t.pathname.charAt(0),P=e.host||e.pathname&&"/"===e.pathname.charAt(0),g=P||y||t.host&&e.pathname,b=g,E=t.pathname&&t.pathname.split("/")||[],p=e.pathname&&e.pathname.split("/")||[],x=t.protocol&&!$[t.protocol];if(x&&(t.hostname="",t.port=null,t.host&&(""===E[0]?E[0]=t.host:E.unshift(t.host)),t.host="",e.protocol&&(e.hostname=null,e.port=null,e.host&&(""===p[0]?p[0]=e.host:p.unshift(e.host)),e.host=null),g=g&&(""===p[0]||""===E[0])),P)t.host=e.host||""===e.host?e.host:t.host,t.hostname=e.hostname||""===e.hostname?e.hostname:t.hostname,t.search=e.search,t.query=e.query,E=p;else if(p.length)E||(E=[]),E.pop(),E=E.concat(p),t.search=e.search,t.query=e.query;else if(!h.isNullOrUndefined(e.search)){if(x){t.hostname=t.host=E.shift();var R=t.host&&t.host.indexOf("@")>0?t.host.split("@"):!1;R&&(t.auth=R.shift(),t.host=t.hostname=R.shift())}return t.search=e.search,t.query=e.query,h.isNull(t.pathname)&&h.isNull(t.search)||(t.path=(t.pathname?t.pathname:"")+(t.search?t.search:"")),t.href=t.format(),t}if(!E.length)return t.pathname=null,t.path=t.search?"/"+t.search:null,t.href=t.format(),t;for(var S=E.slice(-1)[0],w=(t.host||e.host||E.length>1)&&("."===S||".."===S)||""===S,O=0,_=E.length;_>=0;_--)S=E[_],"."===S?E.splice(_,1):".."===S?(E.splice(_,1),O++):O&&(E.splice(_,1),O--);if(!g&&!b)for(;O--;O)E.unshift("..");!g||""===E[0]||E[0]&&"/"===E[0].charAt(0)||E.unshift(""),w&&"/"!==E.join("/").substr(-1)&&E.push("");var k=""===E[0]||E[0]&&"/"===E[0].charAt(0);if(x){t.hostname=t.host=k?"":E.length?E.shift():"";var R=t.host&&t.host.indexOf("@")>0?t.host.split("@"):!1;R&&(t.auth=R.shift(),t.host=t.hostname=R.shift())}return g=g||t.host&&E.length,g&&!k&&E.unshift(""),E.length?t.pathname=E.join("/"):(t.pathname=null,t.path=null),h.isNull(t.pathname)&&h.isNull(t.search)||(t.path=(t.pathname?t.pathname:"")+(t.search?t.search:"")),t.auth=e.auth||t.auth,t.slashes=t.slashes||e.slashes,t.href=t.format(),t},a.prototype.parseHost=function(){var e=this.host,r=c.exec(e);r&&(r=r[0],":"!==r&&(this.port=r.substr(1)),e=e.substr(0,e.length-r.length)),e&&(this.hostname=e)}},{"./util":6,punycode:1,querystring:4}],6:[function(e,r,t){"use strict";r.exports={isString:function(e){return"string"==typeof e},isObject:function(e){return"object"==typeof e&&null!==e},isNull:function(e){return null===e},isNullOrUndefined:function(e){return null==e}}},{}],7:[function(e,r,t){"use strict";r.exports=function(e,r){function t(e,r,a){function o(a){function o(a,o){if(a)r(a);else{if(!s._refs[i]&&!s._schemas[i])try{s.addSchema(o,i)}catch(n){return void r(n)}t(e,r)}}var i=a.missingSchema;if(s._refs[i]||s._schemas[i])return r(new Error("Schema "+i+" is loaded but"+a.missingRef+"cannot be resolved"));var n=s._loadingSchemas[i];n?"function"==typeof n?s._loadingSchemas[i]=[n,o]:n[n.length]=o:(s._loadingSchemas[i]=o,s.opts.loadSchema(i,function(e,r){var t=s._loadingSchemas[i];if(delete s._loadingSchemas[i],"function"==typeof t)t(e,r);else for(var a=0;t.length>a;a++)t[a](e,r)}))}function i(e,t){a?setTimeout(function(){r(e,t)}):r(e,t)}var n;try{n=s.compile(e)}catch(l){return void(l.missingSchema?o(l):i(l))}i(null,n)}var a,s=this;try{a=this._addSchema(e)}catch(o){return void setTimeout(function(){r(o)})}if(a.validate)setTimeout(function(){r(null,a.validate)});else{if("function"!=typeof this.opts.loadSchema)throw new Error("options.loadSchema should be a function");t(e,r,!0)}}},{}],8:[function(e,r,t){"use strict";var a=r.exports=function(){this._cache={}};a.prototype.put=function(e,r){this._cache[e]=r},a.prototype.get=function(e){return this._cache[e]},a.prototype.del=function(e){delete this._cache[e]}},{}],9:[function(e,r,t){"use strict";r.exports={$ref:e("../dotjs/ref"),allOf:e("../dotjs/allOf"),anyOf:e("../dotjs/anyOf"),dependencies:e("../dotjs/dependencies"),"enum":e("../dotjs/enum"),format:e("../dotjs/format"),items:e("../dotjs/items"),maximum:e("../dotjs/_limit"),minimum:e("../dotjs/_limit"),maxItems:e("../dotjs/_limitItems"),minItems:e("../dotjs/_limitItems"),maxLength:e("../dotjs/_limitLength"),minLength:e("../dotjs/_limitLength"),maxProperties:e("../dotjs/_limitProperties"),minProperties:e("../dotjs/_limitProperties"),multipleOf:e("../dotjs/multipleOf"),not:e("../dotjs/not"),oneOf:e("../dotjs/oneOf"),pattern:e("../dotjs/pattern"),properties:e("../dotjs/properties"),required:e("../dotjs/required"),uniqueItems:e("../dotjs/uniqueItems"),validate:e("../dotjs/validate")}},{"../dotjs/_limit":18,"../dotjs/_limitItems":19,"../dotjs/_limitLength":20,"../dotjs/_limitProperties":21,"../dotjs/allOf":22,"../dotjs/anyOf":23,"../dotjs/dependencies":25,"../dotjs/enum":26,"../dotjs/format":27,"../dotjs/items":28,"../dotjs/multipleOf":29,"../dotjs/not":30,"../dotjs/oneOf":31,"../dotjs/pattern":32,"../dotjs/properties":33,"../dotjs/ref":34,"../dotjs/required":35,"../dotjs/uniqueItems":37,"../dotjs/validate":38}],10:[function(e,r,t){"use strict";r.exports=function a(e,r){if(e===r)return!0;var t,s=Array.isArray(e),o=Array.isArray(r);if(s&&o){if(e.length!=r.length)return!1;for(t=0;e.length>t;t++)if(!a(e[t],r[t]))return!1;return!0}if(s!=o)return!1;if(e&&r&&"object"==typeof e&&"object"==typeof r){var i=Object.keys(e);if(i.length!==Object.keys(r).length)return!1;for(t=0;i.length>t;t++)if(void 0===r[i[t]])return!1;for(t=0;i.length>t;t++)if(!a(e[i[t]],r[i[t]]))return!1;return!0}return!1}},{}],11:[function(e,r,t){"use strict";function a(e){e="full"==e?"full":"fast";var r=d.copy(a[e]);for(var t in a.compare)r[t]={validate:r[t],compare:a.compare[t]};return r}function s(e){var r=e.match(p);if(!r)return!1;var t=+r[1],a=+r[2];return t>=1&&12>=t&&a>=1&&m[t]>=a}function o(e,r){var t=e.match(v);if(!t)return!1;var a=t[1],s=t[2],o=t[3],i=t[5];return 23>=a&&59>=s&&59>=o&&(!r||i)}function i(e){var r=e.split(j);return s(r[0])&&o(r[1],!0)}function n(e){return 255>=e.length&&y.test(e)}function l(e){return $.test(e)&&P.test(e)}function h(e){try{return new RegExp(e),!0}catch(r){return!1}}function u(e,r){return e&&r?e>r?1:r>e?-1:e===r?0:void 0:void 0}function c(e,r){return e&&r&&(e=e.match(v),r=r.match(v),e&&r)?(e=e[1]+e[2]+e[3]+(e[4]||""),r=r[1]+r[2]+r[3]+(r[4]||""),e>r?1:r>e?-1:e===r?0:void 0):void 0}function f(e,r){if(e&&r){e=e.split(j),r=r.split(j);var t=u(e[0],r[0]);if(void 0!==t)return t||c(e[1],r[1])}}var d=e("./util"),p=/^\d\d\d\d-(\d\d)-(\d\d)$/,m=[0,31,29,31,30,31,30,31,31,30,31,30,31],v=/^(\d\d):(\d\d):(\d\d)(\.\d+)?(z|[+-]\d\d:\d\d)?$/i,y=/^[a-z](?:(?:[-0-9a-z]{0,61})?[0-9a-z])?(\.[a-z](?:(?:[-0-9a-z]{0,61})?[0-9a-z])?)*$/i,P=/^(?:[a-z][a-z0-9+\-.]*:)?(?:\/?\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:]|%[0-9a-f]{2})*@)?(?:\[(?:(?:(?:(?:[0-9a-f]{1,4}:){6}|::(?:[0-9a-f]{1,4}:){5}|(?:[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){4}|(?:(?:[0-9a-f]{1,4}:){0,1}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){3}|(?:(?:[0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){2}|(?:(?:[0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:|(?:(?:[0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::)(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?))|(?:(?:[0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(?:(?:[0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::)|[Vv][0-9a-f]+\.[a-z0-9\-._~!$&'()*+,;=:]+)\]|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)|(?:[a-z0-9\-._~!$&'()*+,;=]|%[0-9a-f]{2})*)(?::\d*)?(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*|\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*)?|(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*)(?:\?(?:[a-z0-9\-._~!$&'()*+,;=:@\/?]|%[0-9a-f]{2})*)?(?:\#(?:[a-z0-9\-._~!$&'()*+,;=:@\/?]|%[0-9a-f]{2})*)?$/i,g=/^(?:urn\:uuid\:)?[0-9a-f]{8}-(?:[0-9a-f]{4}-){3}[0-9a-f]{12}$/i,b=/^(?:\/(?:[^~\/]|~0|~1)+)*(?:\/)?$|^\#(?:\/(?:[a-z0-9_\-\.!$&'()*+,;:=@]|%[0-9a-f]{2}|~0|~1)+)*(?:\/)?$/i,E=/^(?:0|[1-9][0-9]*)(?:\#|(?:\/(?:[^~\/]|~0|~1)+)*(?:\/)?)$/;r.exports=a,a.fast={date:/^\d\d\d\d-[0-1]\d-[0-3]\d$/,time:/^[0-2]\d:[0-5]\d:[0-5]\d(?:\.\d+)?(?:z|[+-]\d\d:\d\d)?$/i,"date-time":/^\d\d\d\d-[0-1]\d-[0-3]\d[t\s][0-2]\d:[0-5]\d:[0-5]\d(?:\.\d+)?(?:z|[+-]\d\d:\d\d)$/i,uri:/^(?:[a-z][a-z0-9+-.]*)?(?:\:|\/)\/?[^\s]*$/i,email:/^[a-z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*$/i,hostname:y,ipv4:/^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$/,ipv6:/^\s*(?:(?:(?:[0-9a-f]{1,4}:){7}(?:[0-9a-f]{1,4}|:))|(?:(?:[0-9a-f]{1,4}:){6}(?::[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){5}(?:(?:(?::[0-9a-f]{1,4}){1,2})|:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){4}(?:(?:(?::[0-9a-f]{1,4}){1,3})|(?:(?::[0-9a-f]{1,4})?:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){3}(?:(?:(?::[0-9a-f]{1,4}){1,4})|(?:(?::[0-9a-f]{1,4}){0,2}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){2}(?:(?:(?::[0-9a-f]{1,4}){1,5})|(?:(?::[0-9a-f]{1,4}){0,3}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){1}(?:(?:(?::[0-9a-f]{1,4}){1,6})|(?:(?::[0-9a-f]{1,4}){0,4}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?::(?:(?:(?::[0-9a-f]{1,4}){1,7})|(?:(?::[0-9a-f]{1,4}){0,5}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(?:%.+)?\s*$/i,regex:h,uuid:g,"json-pointer":b,"relative-json-pointer":E},a.full={date:s,time:o,"date-time":i,uri:l,email:/^[a-z0-9!#$%&'*+\/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&''*+\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i,hostname:n,ipv4:/^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$/,ipv6:/^\s*(?:(?:(?:[0-9a-f]{1,4}:){7}(?:[0-9a-f]{1,4}|:))|(?:(?:[0-9a-f]{1,4}:){6}(?::[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){5}(?:(?:(?::[0-9a-f]{1,4}){1,2})|:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){4}(?:(?:(?::[0-9a-f]{1,4}){1,3})|(?:(?::[0-9a-f]{1,4})?:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){3}(?:(?:(?::[0-9a-f]{1,4}){1,4})|(?:(?::[0-9a-f]{1,4}){0,2}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){2}(?:(?:(?::[0-9a-f]{1,4}){1,5})|(?:(?::[0-9a-f]{1,4}){0,3}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){1}(?:(?:(?::[0-9a-f]{1,4}){1,6})|(?:(?::[0-9a-f]{1,4}){0,4}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?::(?:(?:(?::[0-9a-f]{1,4}){1,7})|(?:(?::[0-9a-f]{1,4}){0,5}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(?:%.+)?\s*$/i,regex:h,uuid:g,"json-pointer":b,"relative-json-pointer":E},a.compare={date:u,time:c,"date-time":f};var j=/t|\s/i,$=/\/|\:/},{"./util":16}],12:[function(require,module,exports){"use strict";function compile(schema,root,localRefs,baseId){function localCompile(_schema,_root,localRefs,baseId){var isRoot=!_root||_root&&_root.schema==_schema;if(_root.schema!=root.schema)return compile.call(self,_schema,_root,localRefs,baseId);var validateCode=validateGenerator({isTop:!0,schema:_schema,isRoot:isRoot,baseId:baseId,root:_root,schemaPath:"",errSchemaPath:"#",errorPath:'""',RULES:RULES,validate:validateGenerator,util:util,resolve:resolve,resolveRef:resolveRef,usePattern:usePattern,useDefault:useDefault,useCustomRule:useCustomRule,opts:self.opts,formats:formats,self:self});if(validateCode=vars(refVal,refValCode)+vars(patterns,patternCode)+vars(defaults,defaultCode)+vars(customRules,customRuleCode)+validateCode,self.opts.beautify){var opts=self.opts.beautify===!0?{indent_size:2}:self.opts.beautify;beautify?validateCode=beautify(validateCode,opts):console.error('"npm install js-beautify" to use beautify option')}var validate;try{eval(validateCode),refVal[0]=validate}catch(e){throw console.log("Error compiling schema, function code:",validateCode),e}return validate.schema=_schema,validate.errors=null,validate.refs=refs,validate.refVal=refVal,validate.root=isRoot?validate:_root,validate}function resolveRef(e,r,t){r=resolve.url(e,r);var a,s,o=refs[r];if(void 0!==o)return a=refVal[o],s="refVal["+o+"]",resolvedRef(a,s);if(!t){var i=root.refs[r];if(void 0!==i)return a=root.refVal[i],s=addLocalRef(r,a),resolvedRef(a,s)}s=addLocalRef(r);var n=resolve.call(self,localCompile,root,r);if(!n){var l=localRefs&&localRefs[r];l&&(n=resolve.inlineRef(l,self.opts.inlineRefs)?l:compile.call(self,l,root,localRefs,e))}return n?(replaceLocalRef(r,n),resolvedRef(n,s)):void 0}function addLocalRef(e,r){var t=refVal.length;return refVal[t]=r,refs[e]=t,"refVal"+t}function replaceLocalRef(e,r){var t=refs[e];refVal[t]=r}function resolvedRef(e,r){return"object"==typeof e?{schema:e,code:r}:r}function usePattern(e){var r=patternsHash[e];return void 0===r&&(r=patternsHash[e]=patterns.length,patterns[r]=e),"pattern"+r}function useDefault(e){switch(typeof e){case"boolean":case"number":return""+e;case"string":return util.toQuotedString(e);case"object":if(null===e)return"null";var r=stableStringify(e),t=defaultsHash[r];return void 0===t&&(t=defaultsHash[r]=defaults.length,defaults[t]=e),"default"+t}}function useCustomRule(e,r,t,a){var s,o=e.definition.compile,i=e.definition.inline,n=e.definition.macro;o?s=o.call(self,r,t):n?(s=n.call(self,r,t),self.opts.validateSchema!==!1&&self.validateSchema(s,!0)):s=i?i.call(self,a,e.keyword,r,t):e.definition.validate;var l=customRules.length;return customRules[l]=s,{code:"customRule"+l,validate:s}}var self=this,refVal=[void 0],refs={},patterns=[],patternsHash={},defaults=[],defaultsHash={},customRules=[],customRulesHash={};root=root||{schema:schema,refVal:refVal,refs:refs};var formats=this._formats,RULES=this.RULES;return localCompile(schema,root,localRefs,baseId)}function patternCode(e,r){return"var pattern"+e+" = new RegExp("+util.toQuotedString(r[e])+");"}function defaultCode(e){return"var default"+e+" = defaults["+e+"];"}function refValCode(e,r){return r[e]?"var refVal"+e+" = refVal["+e+"];":""}function customRuleCode(e){return"var customRule"+e+" = customRules["+e+"];"}function vars(e,r){if(!e.length)return"";for(var t="",a=0;e.length>a;a++)t+=r(a,e);return t}var resolve=require("./resolve"),util=require("./util"),equal=require("./equal"),stableStringify=require("json-stable-stringify"),beautify=function(){try{return require("js-beautify").js_beautify}catch(e){}}(),validateGenerator=require("../dotjs/validate");module.exports=compile;var ucs2length=util.ucs2length},{"../dotjs/validate":38,"./equal":10,"./resolve":13,"./util":16,"json-stable-stringify":43}],13:[function(e,r,t){"use strict";function a(e,r,t){var o=this._refs[t];if("string"==typeof o){if(!this._refs[o])return a.call(this,e,r,o);o=this._refs[o]}if(o=o||this._schemas[t],o instanceof P)return n(o.schema,this.opts.inlineRefs)?o.schema:o.validate||this._compile(o);var i,l,h,u=s.call(this,r,t);return u&&(i=u.schema,r=u.root,h=u.baseId),i instanceof P?l=i.validate||e.call(this,i.schema,r,void 0,h):i&&(l=n(i,this.opts.inlineRefs)?i:e.call(this,i,r,void 0,h)),l}function s(e,r){var t=m.parse(r,!1,!0),a=c(t),s=u(e.schema.id);if(a!==s){var n=f(a),l=this._refs[n];if("string"==typeof l)return o.call(this,e,l,t);if(l instanceof P)l.validate||this._compile(l),e=l;else if(l=this._schemas[n],l instanceof P){if(l.validate||this._compile(l),n==f(r))return{schema:l,root:e,baseId:s};e=l}if(!e.schema)return;s=u(e.schema.id)}return i.call(this,t,s,e.schema,e)}function o(e,r,t){var a=s.call(this,e,r);if(a){var o=a.schema,n=a.baseId;return e=a.root,o.id&&(n=d(n,o.id)),i.call(this,t,n,o,e)}}function i(e,r,t,a){if(e.hash=e.hash||"","#/"==e.hash.slice(0,2)){for(var o=e.hash.split("/"),i=1;o.length>i;i++){var n=o[i];if(n){if(n=y.unescapeFragment(n),t=t[n],!t)break;if(t.id&&!g[n]&&(r=d(r,t.id)),t.$ref){var l=d(r,t.$ref),h=s.call(this,a,l);h&&(t=h.schema,a=h.root,r=h.baseId)}}}return t&&t!=a.schema?{schema:t,root:a,baseId:r}:void 0}}function n(e,r){return void 0===r?l(e):r?h(e)<=r:void 0}function l(e){var r;if(Array.isArray(e)){for(var t=0;e.length>t;t++)if(r=e[t],"object"==typeof r&&!l(r))return!1}else for(var a in e){if("$ref"==a)return!1;if(r=e[a],"object"==typeof r&&!l(r))return!1}return!0}function h(e){var r,t=0;if(Array.isArray(e)){for(var a=0;e.length>a;a++)if(r=e[a],"object"==typeof r&&(t+=h(r)),t==1/0)return 1/0}else for(var s in e){if("$ref"==s)return 1/0;if(b[s])t++;else if(r=e[s],"object"==typeof r&&(t+=h(r)+1),t==1/0)return 1/0}return t}function u(e,r){r!==!1&&(e=f(e));var t=m.parse(e,!1,!0);return c(t)}function c(e){return(e.protocol||"")+(e.protocol?"//":"")+(e.host||"")+(e.path||"")+"#"}function f(e){return e?e.replace(E,""):""}function d(e,r){return r=f(r),m.resolve(e,r)}function p(e){function r(e,t,s){if(Array.isArray(e))for(var o=0;e.length>o;o++)r.call(this,e[o],t+"/"+o,s);else if(e&&"object"==typeof e){if("string"==typeof e.id){var i=s=s?m.resolve(s,e.id):f(e.id),n=this._refs[i];if("string"==typeof n&&(n=this._refs[n]),n&&n.schema){if(!v(e,n.schema))throw new Error('id "'+i+'" resolves to more than one schema')}else if(i!=f(t))if("#"==i[0]){if(a[i]&&!v(e,a[i]))throw new Error('id "'+i+'" resolves to more than one schema');a[i]=e}else this._refs[i]=t}for(var l in e)r.call(this,e[l],t+"/"+y.escapeFragment(l),s)}}var t=f(e.id),a={};return r.call(this,e,u(t,!1),t),a}var m=e("url"),v=e("./equal"),y=e("./util"),P=e("./schema_obj");r.exports=a,a.normalizeId=f,a.fullPath=u,a.url=d,a.ids=p,a.inlineRef=n;var g=y.toHash(["properties","patternProperties","enum","dependencies","definitions"]),b=y.toHash(["type","format","pattern","maxLength","minLength","maxProperties","minProperties","maxItems","minItems","maximum","minimum","uniqueItems","multipleOf","required","enum"]),E=/#\/?$/},{"./equal":10,"./schema_obj":15,"./util":16,url:5}],14:[function(e,r,t){"use strict";var a=e("./_rules"),s=e("./util");r.exports=function(){var e=[{type:"number",rules:["maximum","minimum","multipleOf"]},{type:"string",rules:["maxLength","minLength","pattern","format"]},{type:"array",rules:["maxItems","minItems","uniqueItems","items"]},{type:"object",rules:["maxProperties","minProperties","required","dependencies","properties"]},{rules:["$ref","enum","not","anyOf","oneOf","allOf"]}];return e.all=["type","additionalProperties","patternProperties"],e.keywords=["additionalItems","$schema","id","title","description","default"],e.types=["number","integer","string","array","object","boolean","null"],e.forEach(function(r){r.rules=r.rules.map(function(r){return e.all.push(r),{keyword:r,code:a[r]}})}),e.keywords=s.toHash(e.all.concat(e.keywords)),e.all=s.toHash(e.all),e.types=s.toHash(e.types),e}},{"./_rules":9,"./util":16}],15:[function(e,r,t){"use strict";function a(e){s.copy(e,this)}var s=e("./util");r.exports=a},{"./util":16}],16:[function(e,r,t){"use strict";function a(e,r){r=r||{};for(var t in e)r[t]=e[t];return r}function s(e,r,t){var a=t?" !== ":" === ",s=t?" || ":" && ",o=t?"!":"",i=t?"":"!";switch(e){case"null":return r+a+"null";case"array":return o+"Array.isArray("+r+")";case"object":return"("+o+r+s+"typeof "+r+a+'"object"'+s+i+"Array.isArray("+r+"))";case"integer":return"(typeof "+r+a+'"number"'+s+i+"("+r+" % 1))";default:return"typeof "+r+a+'"'+e+'"'}}function o(e,r){switch(e.length){case 1:return s(e[0],r,!0);default:var t="",a=i(e);a.array&&a.object&&(t=a["null"]?"(":"(!"+r+" || ",t+="typeof "+r+' !== "object")',delete a["null"],delete a.array,delete a.object),a.number&&delete a.integer;for(var o in a)t+=(t?" && ":"")+s(o,r,!0);return t}}function i(e){for(var r={},t=0;e.length>t;t++)r[e[t]]=!0;return r}function n(e){return"number"==typeof e?"["+e+"]":x.test(e)?"."+e:"['"+e.replace(R,"\\$&")+"']"}function l(e){return e.replace(R,"\\$&")}function h(e){for(var r,t=0,a=e.length,s=0;a>s;)t++,r=e.charCodeAt(s++),r>=55296&&56319>=r&&a>s&&(r=e.charCodeAt(s),56320==(64512&r)&&s++);return t}function u(e,r){r+="[^0-9]";var t=e.match(new RegExp(r,"g"));return t?t.length:0}function c(e,r,t){return r+="([^0-9])",t=t.replace(/\$/g,"$$$$"),e.replace(new RegExp(r,"g"),t+"$1")}function f(e){return e.replace(S,"").replace(w,"").replace(O,"if (!($1))")}function d(e){var r=e.match(_);return r&&2===r.length?e.replace(k,"").replace(I,A):e}function p(e,r){for(var t in e)if(r[t])return!0}function m(e){return"'"+l(e)+"'"}function v(e,r,t,a){var s=t?"'/' + "+r+(a?"":".replace(/~/g, '~0').replace(/\\//g, '~1')"):a?"'[' + "+r+" + ']'":"'[\\'' + "+r+" + '\\']'";return g(e,s)}function y(e,r,t){var a=m(t?"/"+j(r):n(r));return g(e,a)}function P(e,r,t){var a=e.match(q);if(!a)throw new Error("Invalid relative JSON-pointer: "+e);var s=+a[1],o=a[2];if("#"==o){if(s>=r)throw new Error("Cannot access property/index "+s+" levels up, current level is "+r);return t[r-s]}if(s>r)throw new Error("Cannot access data "+s+" levels up, current level is "+r);var i="data"+(r-s||"");if(!o)return i;for(var l=i,h=o.split("/"),u=0;h.length>u;u++){var c=h[u];c&&(i+=n($(c)),l+=" && "+i)}return l}function g(e,r){return'""'==e?r:(e+" + "+r).replace(/' \+ '/g,"")}function b(e){return $(decodeURIComponent(e));
-}function E(e){return encodeURIComponent(j(e))}function j(e){return e.replace(/~/g,"~0").replace(/\//g,"~1")}function $(e){return e.replace(/~1/g,"/").replace(/~0/g,"~")}r.exports={copy:a,checkDataType:s,checkDataTypes:o,toHash:i,getProperty:n,escapeQuotes:l,ucs2length:h,varOccurences:u,varReplace:c,cleanUpCode:f,cleanUpVarErrors:d,schemaHasRules:p,stableStringify:e("json-stable-stringify"),toQuotedString:m,getPathExpr:v,getPath:y,getData:P,unescapeFragment:b,escapeFragment:E,escapeJsonPointer:j};var x=/^[a-z$_][a-z$_0-9]*$/i,R=/'|\\/g,S=/else\s*{\s*}/g,w=/if\s*\([^)]+\)\s*\{\s*\}(?!\s*else)/g,O=/if\s*\(([^)]+)\)\s*\{\s*\}\s*else(?!\s*if)/g,_=/[^v\.]errors/g,k=/var errors = 0;|var vErrors = null;|validate.errors = vErrors;/g,I="return errors === 0;",A="validate.errors = null; return true;",q=/^([0-9]+)(#|\/(?:[^~]|~0|~1)*)?$/},{"json-stable-stringify":43}],17:[function(e,r,t){"use strict";r.exports=function(e,r){var t,a=" ",s=e.level,o=e.dataLevel,i=e.schema[r],n=e.schemaPath+"."+r,l=e.errSchemaPath+"/"+r,h=!e.opts.allErrors,u="data"+(o||""),c="valid"+s;if(a+="var "+c+" = undefined;",e.opts.format===!1)return a+=" "+c+" = true; ";var f=e.schema.format,d=e.opts.v5&&f.$data,p="";if(d){var m=e.util.getData(f.$data,o,e.dataPathArr),v="format"+s,y="compare"+s;a+=" var "+v+" = formats["+m+"] , "+y+" = "+v+" && "+v+".compare;"}else{var v=e.formats[f];if(!v||!v.compare)return a+="  "+c+" = true; ";var y="formats"+e.util.getProperty(f)+".compare"}var P="formatMaximum"==r,g="exclusiveFormat"+(P?"Maximum":"Minimum"),b=e.schema[g],E=e.opts.v5&&b&&b.$data,j=P?"<":">",$="result"+s,x=e.opts.v5&&i.$data,R=x?e.util.getData(i.$data,o,e.dataPathArr):i;if(x&&(a+=" var schema"+s+" = "+R+"; ",R="schema"+s),E){var S=e.util.getData(b.$data,o,e.dataPathArr),w="exclusive"+s,O="op"+s,_="' + "+O+" + '";a+=" var schemaExcl"+s+" = "+S+"; ",S="schemaExcl"+s,a+=" if (typeof "+S+" != 'boolean' && "+S+" !== undefined) { "+c+" = false; ";var t=g,k=k||[];k.push(a),a="",e.createErrors!==!1?(a+=" { keyword: '"+(t||"_exclusiveFormatLimit")+"' , dataPath: (dataPath || '') + "+e.errorPath+' , schemaPath: "'+l+'" , params: {} ',e.opts.messages!==!1&&(a+=" , message: '"+g+" should be boolean' "),e.opts.verbose&&(a+=" , schema: validate.schema"+n+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+u+" "),a+=" } "):a+=" {} ";var I=a;a=k.pop(),a+=!e.compositeRule&&h?" validate.errors = ["+I+"]; return false; ":" var err = "+I+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",a+=" }  ",h&&(p+="}",a+=" else { "),x&&(a+=" if ("+R+" === undefined) "+c+" = true; else if (typeof "+R+" != 'string') "+c+" = false; else { ",p+="}"),d&&(a+=" if (!"+y+") "+c+" = true; else { ",p+="}"),a+=" var "+$+" = "+y+"("+u+",  ",a+=x?""+R:""+e.util.toQuotedString(i),a+=" ); if ("+$+" === undefined) "+c+" = false; var exclusive"+s+" = "+S+" === true; if ("+c+" === undefined) { "+c+" = exclusive"+s+" ? "+$+" "+j+" 0 : "+$+" "+j+"= 0; } if (!"+c+") var op"+s+" = exclusive"+s+" ? '"+j+"' : '"+j+"=';"}else{var w=b===!0,_=j;w||(_+="=");var O="'"+_+"'";x&&(a+=" if ("+R+" === undefined) "+c+" = true; else if (typeof "+R+" != 'string') "+c+" = false; else { ",p+="}"),d&&(a+=" if (!"+y+") "+c+" = true; else { ",p+="}"),a+=" var "+$+" = "+y+"("+u+",  ",a+=x?""+R:""+e.util.toQuotedString(i),a+=" ); if ("+$+" === undefined) "+c+" = false; if ("+c+" === undefined) "+c+" = "+$+" "+j,w||(a+="="),a+=" 0;"}a+=""+p+"if (!"+c+") { ";var t=r,k=k||[];k.push(a),a="",e.createErrors!==!1?(a+=" { keyword: '"+(t||"_formatLimit")+"' , dataPath: (dataPath || '') + "+e.errorPath+' , schemaPath: "'+l+'" , params: { limit:  ',a+=x?""+R:""+e.util.toQuotedString(i),a+="  } ",e.opts.messages!==!1&&(a+=" , message: 'should be "+_+' "',a+=x?"' + "+R+" + '":""+e.util.escapeQuotes(i),a+="\"' "),e.opts.verbose&&(a+=" , schema:  ",a+=x?"validate.schema"+n:""+e.util.toQuotedString(i),a+="         , parentSchema: validate.schema"+e.schemaPath+" , data: "+u+" "),a+=" } "):a+=" {} ";var I=a;return a=k.pop(),a+=!e.compositeRule&&h?" validate.errors = ["+I+"]; return false; ":" var err = "+I+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",a+="}"}},{}],18:[function(e,r,t){"use strict";r.exports=function(e,r){var t,a=" ",s=e.level,o=e.dataLevel,i=e.schema[r],n=e.schemaPath+"."+r,l=e.errSchemaPath+"/"+r,h=!e.opts.allErrors,u="data"+(o||""),c=e.opts.v5&&i.$data,f=c?e.util.getData(i.$data,o,e.dataPathArr):i;c&&(a+=" var schema"+s+" = "+f+"; ",f="schema"+s);var d="maximum"==r,p=d?"exclusiveMaximum":"exclusiveMinimum",m=e.schema[p],v=e.opts.v5&&m&&m.$data,y=d?"<":">",P=d?">":"<";if(v){var g=e.util.getData(m.$data,o,e.dataPathArr),b="exclusive"+s,E="op"+s,j="' + "+E+" + '";a+=" var schemaExcl"+s+" = "+g+"; ",g="schemaExcl"+s,a+=" var exclusive"+s+"; if (typeof "+g+" != 'boolean' && typeof "+g+" != 'undefined') { ";var t=p,$=$||[];$.push(a),a="",e.createErrors!==!1?(a+=" { keyword: '"+(t||"_exclusiveLimit")+"' , dataPath: (dataPath || '') + "+e.errorPath+' , schemaPath: "'+l+'" , params: {} ',e.opts.messages!==!1&&(a+=" , message: '"+p+" should be boolean' "),e.opts.verbose&&(a+=" , schema: validate.schema"+n+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+u+" "),a+=" } "):a+=" {} ";var x=a;a=$.pop(),a+=!e.compositeRule&&h?" validate.errors = ["+x+"]; return false; ":" var err = "+x+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",a+=" } else if( ",c&&(a+=" ("+f+" !== undefined && typeof "+f+" != 'number') || "),a+=" ((exclusive"+s+" = "+g+" === true) ? "+u+" "+P+"= "+f+" : "+u+" "+P+" "+f+")) { var op"+s+" = exclusive"+s+" ? '"+y+"' : '"+y+"=';"}else{var b=m===!0,j=y;b||(j+="=");var E="'"+j+"'";a+=" if ( ",c&&(a+=" ("+f+" !== undefined && typeof "+f+" != 'number') || "),a+=" "+u+" "+P,b&&(a+="="),a+=" "+f+") {"}var t=r,$=$||[];$.push(a),a="",e.createErrors!==!1?(a+=" { keyword: '"+(t||"_limit")+"' , dataPath: (dataPath || '') + "+e.errorPath+' , schemaPath: "'+l+'" , params: { comparison: '+E+", limit: "+f+", exclusive: "+b+" } ",e.opts.messages!==!1&&(a+=" , message: 'should be "+j+" ",a+=c?"' + "+f:""+i+"'"),e.opts.verbose&&(a+=" , schema:  ",a+=c?"validate.schema"+n:""+i,a+="         , parentSchema: validate.schema"+e.schemaPath+" , data: "+u+" "),a+=" } "):a+=" {} ";var x=a;return a=$.pop(),a+=!e.compositeRule&&h?" validate.errors = ["+x+"]; return false; ":" var err = "+x+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",a+=" } ",h&&(a+=" else { "),a}},{}],19:[function(e,r,t){"use strict";r.exports=function(e,r){var t,a=" ",s=e.level,o=e.dataLevel,i=e.schema[r],n=e.schemaPath+"."+r,l=e.errSchemaPath+"/"+r,h=!e.opts.allErrors,u="data"+(o||""),c=e.opts.v5&&i.$data,f=c?e.util.getData(i.$data,o,e.dataPathArr):i;c&&(a+=" var schema"+s+" = "+f+"; ",f="schema"+s);var d="maxItems"==r?">":"<";a+="if ( ",c&&(a+=" ("+f+" !== undefined && typeof "+f+" != 'number') || "),a+=" "+u+".length "+d+" "+f+") { ";var t=r,p=p||[];p.push(a),a="",e.createErrors!==!1?(a+=" { keyword: '"+(t||"_limitItems")+"' , dataPath: (dataPath || '') + "+e.errorPath+' , schemaPath: "'+l+'" , params: { limit: '+f+" } ",e.opts.messages!==!1&&(a+=" , message: 'should NOT have ",a+="maxItems"==r?"more":"less",a+=" than ",a+=c?"' + "+f+" + '":""+i,a+=" items' "),e.opts.verbose&&(a+=" , schema:  ",a+=c?"validate.schema"+n:""+i,a+="         , parentSchema: validate.schema"+e.schemaPath+" , data: "+u+" "),a+=" } "):a+=" {} ";var m=a;return a=p.pop(),a+=!e.compositeRule&&h?" validate.errors = ["+m+"]; return false; ":" var err = "+m+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",a+="} ",h&&(a+=" else { "),a}},{}],20:[function(e,r,t){"use strict";r.exports=function(e,r){var t,a=" ",s=e.level,o=e.dataLevel,i=e.schema[r],n=e.schemaPath+"."+r,l=e.errSchemaPath+"/"+r,h=!e.opts.allErrors,u="data"+(o||""),c=e.opts.v5&&i.$data,f=c?e.util.getData(i.$data,o,e.dataPathArr):i;c&&(a+=" var schema"+s+" = "+f+"; ",f="schema"+s);var d="maxLength"==r?">":"<";a+="if ( ",c&&(a+=" ("+f+" !== undefined && typeof "+f+" != 'number') || "),a+=e.opts.unicode===!1?" "+u+".length ":" ucs2length("+u+") ",a+=" "+d+" "+f+") { ";var t=r,p=p||[];p.push(a),a="",e.createErrors!==!1?(a+=" { keyword: '"+(t||"_limitLength")+"' , dataPath: (dataPath || '') + "+e.errorPath+' , schemaPath: "'+l+'" , params: { limit: '+f+" } ",e.opts.messages!==!1&&(a+=" , message: 'should NOT be ",a+="maxLength"==r?"longer":"shorter",a+=" than ",a+=c?"' + "+f+" + '":""+i,a+=" characters' "),e.opts.verbose&&(a+=" , schema:  ",a+=c?"validate.schema"+n:""+i,a+="         , parentSchema: validate.schema"+e.schemaPath+" , data: "+u+" "),a+=" } "):a+=" {} ";var m=a;return a=p.pop(),a+=!e.compositeRule&&h?" validate.errors = ["+m+"]; return false; ":" var err = "+m+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",a+="} ",h&&(a+=" else { "),a}},{}],21:[function(e,r,t){"use strict";r.exports=function(e,r){var t,a=" ",s=e.level,o=e.dataLevel,i=e.schema[r],n=e.schemaPath+"."+r,l=e.errSchemaPath+"/"+r,h=!e.opts.allErrors,u="data"+(o||""),c=e.opts.v5&&i.$data,f=c?e.util.getData(i.$data,o,e.dataPathArr):i;c&&(a+=" var schema"+s+" = "+f+"; ",f="schema"+s);var d="maxProperties"==r?">":"<";a+="if ( ",c&&(a+=" ("+f+" !== undefined && typeof "+f+" != 'number') || "),a+=" Object.keys("+u+").length "+d+" "+f+") { ";var t=r,p=p||[];p.push(a),a="",e.createErrors!==!1?(a+=" { keyword: '"+(t||"_limitProperties")+"' , dataPath: (dataPath || '') + "+e.errorPath+' , schemaPath: "'+l+'" , params: { limit: '+f+" } ",e.opts.messages!==!1&&(a+=" , message: 'should NOT have ",a+="maxProperties"==r?"more":"less",a+=" than ",a+=c?"' + "+f+" + '":""+i,a+=" properties' "),e.opts.verbose&&(a+=" , schema:  ",a+=c?"validate.schema"+n:""+i,a+="         , parentSchema: validate.schema"+e.schemaPath+" , data: "+u+" "),a+=" } "):a+=" {} ";var m=a;return a=p.pop(),a+=!e.compositeRule&&h?" validate.errors = ["+m+"]; return false; ":" var err = "+m+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",a+="} ",h&&(a+=" else { "),a}},{}],22:[function(e,r,t){"use strict";r.exports=function(e,r){var t=" ",a=e.schema[r],s=e.schemaPath+"."+r,o=e.errSchemaPath+"/"+r,i=!e.opts.allErrors,n=e.util.copy(e),l="";n.level++;var h=a;if(h)for(var u,c=-1,f=h.length-1;f>c;)u=h[c+=1],e.util.schemaHasRules(u,e.RULES.all)&&(n.schema=u,n.schemaPath=s+"["+c+"]",n.errSchemaPath=o+"/"+c,t+=" "+e.validate(n)+"  ",i&&(t+=" if (valid"+n.level+") { ",l+="}"));return i&&(t+=" "+l.slice(0,-1)),t=e.util.cleanUpCode(t)}},{}],23:[function(e,r,t){"use strict";r.exports=function(e,r){var t,a=" ",s=e.level,o=e.dataLevel,i=e.schema[r],n=e.schemaPath+"."+r,l=e.errSchemaPath+"/"+r,h=!e.opts.allErrors,u="data"+(o||""),c="valid"+s,f="errs__"+s,d=e.util.copy(e),p="";d.level++;var m=i.every(function(r){return e.util.schemaHasRules(r,e.RULES.all)});if(m){a+=" var "+f+" = errors; var "+c+" = false;  ";var v=e.compositeRule;e.compositeRule=d.compositeRule=!0;var y=i;if(y)for(var P,g=-1,b=y.length-1;b>g;)P=y[g+=1],d.schema=P,d.schemaPath=n+"["+g+"]",d.errSchemaPath=l+"/"+g,a+=" "+e.validate(d)+" "+c+" = "+c+" || valid"+d.level+"; if (!"+c+") { ",p+="}";e.compositeRule=d.compositeRule=v,a+=" "+p+" if (!"+c+") {  var err =   ",e.createErrors!==!1?(a+=" { keyword: '"+(t||"anyOf")+"' , dataPath: (dataPath || '') + "+e.errorPath+' , schemaPath: "'+l+'" , params: {} ',e.opts.messages!==!1&&(a+=" , message: 'should match some schema in anyOf' "),e.opts.verbose&&(a+=" , schema: validate.schema"+n+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+u+" "),a+=" } "):a+=" {} ",a+=";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } else {  errors = "+f+"; if (vErrors !== null) { if ("+f+") vErrors.length = "+f+"; else vErrors = null; } ",e.opts.allErrors&&(a+=" } "),a=e.util.cleanUpCode(a)}else h&&(a+=" if (true) { ");return a}},{}],24:[function(e,r,t){"use strict";r.exports=function(e,r){var t,a=" ",s=e.level,o=e.dataLevel,i=e.schema[r],n=e.schemaPath+"."+r,l=e.errSchemaPath+"/"+r,h=!e.opts.allErrors,u="data"+(o||""),c="valid"+s,f=e.opts.v5&&i.$data,d=f?e.util.getData(i.$data,o,e.dataPathArr):i;f&&(a+=" var schema"+s+" = "+d+"; ",d="schema"+s),f||(a+=" var schema"+s+" = validate.schema"+n+";"),a+="var "+c+" = equal("+u+", schema"+s+"); if (!"+c+") {   ";var p=p||[];p.push(a),a="",e.createErrors!==!1?(a+=" { keyword: '"+(t||"constant")+"' , dataPath: (dataPath || '') + "+e.errorPath+' , schemaPath: "'+l+'" , params: {} ',e.opts.messages!==!1&&(a+=" , message: 'should be equal to constant' "),e.opts.verbose&&(a+=" , schema: validate.schema"+n+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+u+" "),a+=" } "):a+=" {} ";var m=a;return a=p.pop(),a+=!e.compositeRule&&h?" validate.errors = ["+m+"]; return false; ":" var err = "+m+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",a+=" }"}},{}],25:[function(e,r,t){"use strict";r.exports=function(e,r){var t,a=" ",s=e.level,o=e.dataLevel,i=e.schema[r],n=e.schemaPath+"."+r,l=e.errSchemaPath+"/"+r,h=!e.opts.allErrors,u="data"+(o||""),c="errs__"+s,f=e.util.copy(e),d="";f.level++;var p={},m={};for(g in i){var v=i[g],y=Array.isArray(v)?m:p;y[g]=v}a+="var "+c+" = errors;";var P=e.errorPath;a+="var missing"+s+";";for(var g in m){y=m[g],a+=" if ("+u+e.util.getProperty(g)+" !== undefined && ( ";var b=y;if(b)for(var E,j=-1,$=b.length-1;$>j;){E=b[j+=1],j&&(a+=" || ");var x=e.util.getProperty(E);a+=" ( "+u+x+" === undefined && (missing"+s+" = "+e.util.toQuotedString(e.opts.jsonPointers?E:x)+") ) "}a+=")) {  ";var R="missing"+s,S="' + "+R+" + '";e.opts._errorDataPathProperty&&(e.errorPath=e.opts.jsonPointers?e.util.getPathExpr(P,R,!0):P+" + "+R);var w=w||[];w.push(a),a="",e.createErrors!==!1?(a+=" { keyword: '"+(t||"dependencies")+"' , dataPath: (dataPath || '') + "+e.errorPath+' , schemaPath: "'+l+"\" , params: { property: '"+e.util.escapeQuotes(g)+"', missingProperty: '"+S+"', depsCount: "+y.length+", deps: '"+e.util.escapeQuotes(1==y.length?y[0]:y.join(", "))+"' } ",e.opts.messages!==!1&&(a+=" , message: 'should have ",a+=1==y.length?"property "+e.util.escapeQuotes(y[0]):"properties "+e.util.escapeQuotes(y.join(", ")),a+=" when property "+e.util.escapeQuotes(g)+" is present' "),e.opts.verbose&&(a+=" , schema: validate.schema"+n+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+u+" "),a+=" } "):a+=" {} ";var O=a;a=w.pop(),a+=!e.compositeRule&&h?" validate.errors = ["+O+"]; return false; ":" var err = "+O+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",a+=" }   ",h&&(d+="}",a+=" else { ")}e.errorPath=P;for(var g in p){var v=p[g];e.util.schemaHasRules(v,e.RULES.all)&&(a+=" valid"+f.level+" = true; if ("+u+"['"+g+"'] !== undefined) { ",f.schema=v,f.schemaPath=n+e.util.getProperty(g),f.errSchemaPath=l+"/"+e.util.escapeFragment(g),a+=" "+e.validate(f)+" }  ",h&&(a+=" if (valid"+f.level+") { ",d+="}"))}return h&&(a+="   "+d+" if ("+c+" == errors) {"),a=e.util.cleanUpCode(a)}},{}],26:[function(e,r,t){"use strict";r.exports=function(e,r){var t,a=" ",s=e.level,o=e.dataLevel,i=e.schema[r],n=e.schemaPath+"."+r,l=e.errSchemaPath+"/"+r,h=!e.opts.allErrors,u="data"+(o||""),c="valid"+s,f=e.opts.v5&&i.$data,d=f?e.util.getData(i.$data,o,e.dataPathArr):i;f&&(a+=" var schema"+s+" = "+d+"; ",d="schema"+s);var p="i"+s;f||(a+=" var schema"+s+" = validate.schema"+n+";"),a+="var "+c+";",f&&(a+=" if (schema"+s+" === undefined) "+c+" = true; else if (!Array.isArray(schema"+s+")) "+c+" = false; else {"),a+=""+c+" = false;for (var "+p+"=0; "+p+"<schema"+s+".length; "+p+"++) if (equal("+u+", schema"+s+"["+p+"])) { "+c+" = true; break; }",f&&(a+="  }  "),a+=" if (!"+c+") {   ";var m=m||[];m.push(a),a="",e.createErrors!==!1?(a+=" { keyword: '"+(t||"enum")+"' , dataPath: (dataPath || '') + "+e.errorPath+' , schemaPath: "'+l+'" , params: {} ',e.opts.messages!==!1&&(a+=" , message: 'should be equal to one of values' "),e.opts.verbose&&(a+=" , schema: validate.schema"+n+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+u+" "),a+=" } "):a+=" {} ";var v=a;return a=m.pop(),a+=!e.compositeRule&&h?" validate.errors = ["+v+"]; return false; ":" var err = "+v+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",a+=" }",h&&(a+=" else { "),a}},{}],27:[function(e,r,t){"use strict";r.exports=function(e,r){var t,a=" ",s=e.level,o=e.dataLevel,i=e.schema[r],n=e.schemaPath+"."+r,l=e.errSchemaPath+"/"+r,h=!e.opts.allErrors,u="data"+(o||"");if(e.opts.format===!1)return h&&(a+=" if (true) { "),a;var c=e.opts.v5&&i.$data,f=c?e.util.getData(i.$data,o,e.dataPathArr):i;if(c&&(a+=" var schema"+s+" = "+f+"; ",f="schema"+s),c){var d="format"+s;a+=" var "+d+" = formats["+f+"]; var isObject"+s+" = typeof "+d+" == 'object' && !("+d+" instanceof RegExp) && "+d+".validate; if (isObject"+s+") "+d+" = "+d+".validate;   if (  ",c&&(a+=" ("+f+" !== undefined && typeof "+f+" != 'string') || "),a+=" ("+d+" && !(typeof "+d+" == 'function' ? "+d+"("+u+") : "+d+".test("+u+")))) {"}else{var d=e.formats[i];if(!d)return h&&(a+=" if (true) { "),a;var p="object"==typeof d&&!(d instanceof RegExp)&&d.validate;p&&(d=d.validate),a+=" if (! ";var m="formats"+e.util.getProperty(i);p&&(m+=".validate"),a+="function"==typeof d?" "+m+"("+u+") ":" "+m+".test("+u+") ",a+=") {"}var v=v||[];v.push(a),a="",e.createErrors!==!1?(a+=" { keyword: '"+(t||"format")+"' , dataPath: (dataPath || '') + "+e.errorPath+' , schemaPath: "'+l+'" , params: { format:  ',a+=c?""+f:""+e.util.toQuotedString(i),a+="  } ",e.opts.messages!==!1&&(a+=" , message: 'should match format \"",a+=c?"' + "+f+" + '":""+e.util.escapeQuotes(i),a+="\"' "),e.opts.verbose&&(a+=" , schema:  ",a+=c?"validate.schema"+n:""+e.util.toQuotedString(i),a+="         , parentSchema: validate.schema"+e.schemaPath+" , data: "+u+" "),a+=" } "):a+=" {} ";var y=a;return a=v.pop(),a+=!e.compositeRule&&h?" validate.errors = ["+y+"]; return false; ":" var err = "+y+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",a+=" } ",h&&(a+=" else { "),a}},{}],28:[function(e,r,t){"use strict";r.exports=function(e,r){var t,a=" ",s=e.level,o=e.dataLevel,i=e.schema[r],n=e.schemaPath+"."+r,l=e.errSchemaPath+"/"+r,h=!e.opts.allErrors,u="data"+(o||""),c="valid"+s,f="errs__"+s,d=e.util.copy(e),p="";d.level++;var m=d.dataLevel=e.dataLevel+1,v="data"+m;if(a+="var "+f+" = errors;var "+c+";",Array.isArray(i)){var y=e.schema.additionalItems;if(y===!1){a+=" "+c+" = "+u+".length <= "+i.length+"; ";var P=l;l=e.errSchemaPath+"/additionalItems",a+="  if (!"+c+") {   ";var g=g||[];g.push(a),a="",e.createErrors!==!1?(a+=" { keyword: '"+(t||"additionalItems")+"' , dataPath: (dataPath || '') + "+e.errorPath+' , schemaPath: "'+l+'" , params: { limit: '+i.length+" } ",e.opts.messages!==!1&&(a+=" , message: 'should NOT have more than "+i.length+" items' "),e.opts.verbose&&(a+=" , schema: false , parentSchema: validate.schema"+e.schemaPath+" , data: "+u+" "),a+=" } "):a+=" {} ";var b=a;a=g.pop(),a+=!e.compositeRule&&h?" validate.errors = ["+b+"]; return false; ":" var err = "+b+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",a+=" } ",l=P,h&&(p+="}",a+=" else { ")}var E=i;if(E)for(var j,$=-1,x=E.length-1;x>$;)if(j=E[$+=1],e.util.schemaHasRules(j,e.RULES.all)){a+=" valid"+d.level+" = true; if ("+u+".length > "+$+") { ";var R=u+"["+$+"]";d.schema=j,d.schemaPath=n+"["+$+"]",d.errSchemaPath=l+"/"+$,d.errorPath=e.util.getPathExpr(e.errorPath,$,e.opts.jsonPointers,!0),e.opts.v5&&(d.dataPathArr[m]=$);var S=e.validate(d);a+=e.util.varOccurences(S,v)<2?" "+e.util.varReplace(S,v,R)+" ":" var "+v+" = "+R+"; "+S+" ",a+=" }  ",h&&(a+=" if (valid"+d.level+") { ",p+="}")}if("object"==typeof y&&e.util.schemaHasRules(y,e.RULES.all)){d.schema=y,d.schemaPath=e.schemaPath+".additionalItems",d.errSchemaPath=e.errSchemaPath+"/additionalItems",a+=" valid"+d.level+" = true; if ("+u+".length > "+i.length+") {  for (var i"+s+" = "+i.length+"; i"+s+" < "+u+".length; i"+s+"++) { ",d.errorPath=e.util.getPathExpr(e.errorPath,"i"+s,e.opts.jsonPointers,!0);var R=u+"[i"+s+"]";e.opts.v5&&(d.dataPathArr[m]="i"+s);var S=e.validate(d);a+=e.util.varOccurences(S,v)<2?" "+e.util.varReplace(S,v,R)+" ":" var "+v+" = "+R+"; "+S+" ",h&&(a+=" if (!valid"+d.level+") break; "),a+=" } }  ",h&&(a+=" if (valid"+d.level+") { ",p+="}")}}else if(e.util.schemaHasRules(i,e.RULES.all)){d.schema=i,d.schemaPath=n,d.errSchemaPath=l,a+="  for (var i"+s+" = 0; i"+s+" < "+u+".length; i"+s+"++) { ",d.errorPath=e.util.getPathExpr(e.errorPath,"i"+s,e.opts.jsonPointers,!0);var R=u+"[i"+s+"]";e.opts.v5&&(d.dataPathArr[m]="i"+s);var S=e.validate(d);a+=e.util.varOccurences(S,v)<2?" "+e.util.varReplace(S,v,R)+" ":" var "+v+" = "+R+"; "+S+" ",h&&(a+=" if (!valid"+d.level+") break; "),a+=" }  ",h&&(a+=" if (valid"+d.level+") { ",p+="}")}return h&&(a+=" "+p+" if ("+f+" == errors) {"),a=e.util.cleanUpCode(a)}},{}],29:[function(e,r,t){"use strict";r.exports=function(e,r){var t,a=" ",s=e.level,o=e.dataLevel,i=e.schema[r],n=e.schemaPath+"."+r,l=e.errSchemaPath+"/"+r,h=!e.opts.allErrors,u="data"+(o||""),c=e.opts.v5&&i.$data,f=c?e.util.getData(i.$data,o,e.dataPathArr):i;c&&(a+=" var schema"+s+" = "+f+"; ",f="schema"+s),a+="var division"+s+";if (",c&&(a+=" "+f+" !== undefined && ( typeof "+f+" != 'number' || "),a+=" (division"+s+" = "+u+" / "+f+", ",a+=e.opts.multipleOfPrecision?" Math.abs(Math.round(division"+s+") - division"+s+") > 1e-"+e.opts.multipleOfPrecision+" ":" division"+s+" !== parseInt(division"+s+") ",a+=" ) ",c&&(a+="  )  "),a+=" ) {   ";var d=d||[];d.push(a),a="",e.createErrors!==!1?(a+=" { keyword: '"+(t||"multipleOf")+"' , dataPath: (dataPath || '') + "+e.errorPath+' , schemaPath: "'+l+'" , params: { multipleOf: '+f+" } ",e.opts.messages!==!1&&(a+=" , message: 'should be multiple of ",a+=c?"' + "+f:""+i+"'"),e.opts.verbose&&(a+=" , schema:  ",a+=c?"validate.schema"+n:""+i,a+="         , parentSchema: validate.schema"+e.schemaPath+" , data: "+u+" "),a+=" } "):a+=" {} ";var p=a;return a=d.pop(),a+=!e.compositeRule&&h?" validate.errors = ["+p+"]; return false; ":" var err = "+p+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",a+="} ",h&&(a+=" else { "),a}},{}],30:[function(e,r,t){"use strict";r.exports=function(e,r){var t,a=" ",s=e.level,o=e.dataLevel,i=e.schema[r],n=e.schemaPath+"."+r,l=e.errSchemaPath+"/"+r,h=!e.opts.allErrors,u="data"+(o||""),c="errs__"+s,f=e.util.copy(e);if(f.level++,e.util.schemaHasRules(i,e.RULES.all)){f.schema=i,f.schemaPath=n,f.errSchemaPath=l,a+=" var "+c+" = errors;  ";var d=e.compositeRule;e.compositeRule=f.compositeRule=!0,f.createErrors=!1,a+=" "+e.validate(f)+" ",f.createErrors=!0,e.compositeRule=f.compositeRule=d,a+=" if (valid"+f.level+") {   ";var p=p||[];p.push(a),a="",e.createErrors!==!1?(a+=" { keyword: '"+(t||"not")+"' , dataPath: (dataPath || '') + "+e.errorPath+' , schemaPath: "'+l+'" , params: {} ',e.opts.messages!==!1&&(a+=" , message: 'should NOT be valid' "),e.opts.verbose&&(a+=" , schema: validate.schema"+n+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+u+" "),a+=" } "):a+=" {} ";var m=a;a=p.pop(),a+=!e.compositeRule&&h?" validate.errors = ["+m+"]; return false; ":" var err = "+m+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",a+=" } else {  errors = "+c+"; if (vErrors !== null) { if ("+c+") vErrors.length = "+c+"; else vErrors = null; } ",e.opts.allErrors&&(a+=" } ")}else a+="  var err =   ",e.createErrors!==!1?(a+=" { keyword: '"+(t||"not")+"' , dataPath: (dataPath || '') + "+e.errorPath+' , schemaPath: "'+l+'" , params: {} ',e.opts.messages!==!1&&(a+=" , message: 'should NOT be valid' "),e.opts.verbose&&(a+=" , schema: validate.schema"+n+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+u+" "),a+=" } "):a+=" {} ",a+=";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",h&&(a+=" if (false) { ");return a}},{}],31:[function(e,r,t){"use strict";r.exports=function(e,r){var t,a=" ",s=e.level,o=e.dataLevel,i=e.schema[r],n=e.schemaPath+"."+r,l=e.errSchemaPath+"/"+r,h=!e.opts.allErrors,u="data"+(o||""),c="valid"+s,f="errs__"+s,d=e.util.copy(e),p="";d.level++,a+="var "+f+" = errors;var prevValid"+s+" = false;var "+c+" = false; ";var m=e.compositeRule;e.compositeRule=d.compositeRule=!0;var v=i;if(v)for(var y,P=-1,g=v.length-1;g>P;)y=v[P+=1],e.util.schemaHasRules(y,e.RULES.all)?(d.schema=y,d.schemaPath=n+"["+P+"]",d.errSchemaPath=l+"/"+P,a+=" "+e.validate(d)+" "):a+=" var valid"+d.level+" = true; ",P&&(a+=" if (valid"+d.level+" && prevValid"+s+") "+c+" = false; else { ",p+="}"),a+=" if (valid"+d.level+") "+c+" = prevValid"+s+" = true;";e.compositeRule=d.compositeRule=m,a+=""+p+"if (!"+c+") {   ";var b=b||[];b.push(a),a="",e.createErrors!==!1?(a+=" { keyword: '"+(t||"oneOf")+"' , dataPath: (dataPath || '') + "+e.errorPath+' , schemaPath: "'+l+'" , params: {} ',e.opts.messages!==!1&&(a+=" , message: 'should match exactly one schema in oneOf' "),e.opts.verbose&&(a+=" , schema: validate.schema"+n+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+u+" "),a+=" } "):a+=" {} ";var E=a;return a=b.pop(),a+=!e.compositeRule&&h?" validate.errors = ["+E+"]; return false; ":" var err = "+E+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",a+="} else {  errors = "+f+"; if (vErrors !== null) { if ("+f+") vErrors.length = "+f+"; else vErrors = null; }",e.opts.allErrors&&(a+=" } "),a}},{}],32:[function(e,r,t){"use strict";r.exports=function(e,r){var t,a=" ",s=e.level,o=e.dataLevel,i=e.schema[r],n=e.schemaPath+"."+r,l=e.errSchemaPath+"/"+r,h=!e.opts.allErrors,u="data"+(o||""),c=e.opts.v5&&i.$data,f=c?e.util.getData(i.$data,o,e.dataPathArr):i;c&&(a+=" var schema"+s+" = "+f+"; ",f="schema"+s);var d=c?"(new RegExp("+f+"))":e.usePattern(i);a+="if ( ",c&&(a+=" ("+f+" !== undefined && typeof "+f+" != 'string') || "),a+=" !"+d+".test("+u+") ) {   ";var p=p||[];p.push(a),a="",e.createErrors!==!1?(a+=" { keyword: '"+(t||"pattern")+"' , dataPath: (dataPath || '') + "+e.errorPath+' , schemaPath: "'+l+'" , params: { pattern:  ',a+=c?""+f:""+e.util.toQuotedString(i),a+="  } ",e.opts.messages!==!1&&(a+=" , message: 'should match pattern \"",a+=c?"' + "+f+" + '":""+e.util.escapeQuotes(i),a+="\"' "),e.opts.verbose&&(a+=" , schema:  ",a+=c?"validate.schema"+n:""+e.util.toQuotedString(i),a+="         , parentSchema: validate.schema"+e.schemaPath+" , data: "+u+" "),a+=" } "):a+=" {} ";var m=a;return a=p.pop(),a+=!e.compositeRule&&h?" validate.errors = ["+m+"]; return false; ":" var err = "+m+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",a+="} ",h&&(a+=" else { "),a}},{}],33:[function(e,r,t){"use strict";r.exports=function(e,r){var t,a=" ",s=e.level,o=e.dataLevel,i=e.schema[r],n=e.schemaPath+"."+r,l=e.errSchemaPath+"/"+r,h=!e.opts.allErrors,u="data"+(o||""),c="valid"+s,f="errs__"+s,d=e.util.copy(e),p="";d.level++;var m=d.dataLevel=e.dataLevel+1,v="data"+m,y=Object.keys(i||{}),P=e.schema.patternProperties||{},g=Object.keys(P),b=e.schema.additionalProperties,E=y.length||g.length,j=b===!1,$="object"==typeof b&&Object.keys(b).length,x=e.opts.removeAdditional,R=j||$||x,S=e.schema.required;if(S&&(!e.opts.v5||!S.$data)&&e.opts.loopRequired>S.length)var w=e.util.toHash(S);if(e.opts.v5)var O=e.schema.patternGroups||{},_=Object.keys(O);if(a+="var "+f+" = errors;var valid"+d.level+" = true;",R){if(a+=" for (var key"+s+" in "+u+") { ",E){if(a+=" var isAdditional"+s+" = !(false ",y.length)if(y.length>5)a+=" || validate.schema"+n+"[key"+s+"] ";else{var k=y;if(k)for(var I,A=-1,q=k.length-1;q>A;)I=k[A+=1],a+=" || key"+s+" == "+e.util.toQuotedString(I)+" "}if(g.length){var L=g;if(L)for(var C,D=-1,U=L.length-1;U>D;)C=L[D+=1],a+=" || "+e.usePattern(C)+".test(key"+s+") "}if(e.opts.v5&&_&&_.length){var z=_;if(z)for(var M,D=-1,T=z.length-1;T>D;)M=z[D+=1],a+=" || "+e.usePattern(M)+".test(key"+s+") "}a+=" ); if (isAdditional"+s+") { "}if("all"==x)a+=" delete "+u+"[key"+s+"]; ";else{var Q=e.errorPath,H="' + key"+s+" + '";if(e.opts._errorDataPathProperty&&(e.errorPath=e.util.getPathExpr(e.errorPath,"key"+s,e.opts.jsonPointers)),j)if(x)a+=" delete "+u+"[key"+s+"]; ";else{a+=" valid"+d.level+" = false; ";var N=l;l=e.errSchemaPath+"/additionalProperties";var V=V||[];V.push(a),a="",e.createErrors!==!1?(a+=" { keyword: '"+(t||"additionalProperties")+"' , dataPath: (dataPath || '') + "+e.errorPath+' , schemaPath: "'+l+"\" , params: { additionalProperty: '"+H+"' } ",e.opts.messages!==!1&&(a+=" , message: 'should NOT have additional properties' "),e.opts.verbose&&(a+=" , schema: false , parentSchema: validate.schema"+e.schemaPath+" , data: "+u+" "),a+=" } "):a+=" {} ";var F=a;a=V.pop(),a+=!e.compositeRule&&h?" validate.errors = ["+F+"]; return false; ":" var err = "+F+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",l=N,h&&(a+=" break; ")}else if($)if("failing"==x){a+=" var "+f+" = errors;  ";var G=e.compositeRule;e.compositeRule=d.compositeRule=!0,d.schema=b,d.schemaPath=e.schemaPath+".additionalProperties",d.errSchemaPath=e.errSchemaPath+"/additionalProperties",d.errorPath=e.opts._errorDataPathProperty?e.errorPath:e.util.getPathExpr(e.errorPath,"key"+s,e.opts.jsonPointers);var K=u+"[key"+s+"]";e.opts.v5&&(d.dataPathArr[m]="key"+s);var J=e.validate(d);a+=e.util.varOccurences(J,v)<2?" "+e.util.varReplace(J,v,K)+" ":" var "+v+" = "+K+"; "+J+" ",a+=" if (!valid"+d.level+") { errors = "+f+"; if (validate.errors !== null) { if (errors) validate.errors.length = errors; else validate.errors = null; } delete "+u+"[key"+s+"]; }  ",e.compositeRule=d.compositeRule=G}else{d.schema=b,d.schemaPath=e.schemaPath+".additionalProperties",d.errSchemaPath=e.errSchemaPath+"/additionalProperties",d.errorPath=e.opts._errorDataPathProperty?e.errorPath:e.util.getPathExpr(e.errorPath,"key"+s,e.opts.jsonPointers);var K=u+"[key"+s+"]";e.opts.v5&&(d.dataPathArr[m]="key"+s);var J=e.validate(d);a+=e.util.varOccurences(J,v)<2?" "+e.util.varReplace(J,v,K)+" ":" var "+v+" = "+K+"; "+J+" ",h&&(a+=" if (!valid"+d.level+") break; ")}e.errorPath=Q}E&&(a+=" } "),a+=" }  ",h&&(a+=" if (valid"+d.level+") { ",p+="}")}var B=e.opts.useDefaults&&!e.compositeRule;if(y.length){var Z=y;if(Z)for(var I,W=-1,X=Z.length-1;X>W;){I=Z[W+=1];var Y=i[I];if(e.util.schemaHasRules(Y,e.RULES.all)){var ee=e.util.getProperty(I),K=u+ee,re=B&&void 0!==Y["default"];d.schema=Y,d.schemaPath=n+ee,d.errSchemaPath=l+"/"+e.util.escapeFragment(I),d.errorPath=e.util.getPath(e.errorPath,I,e.opts.jsonPointers),e.opts.v5&&(d.dataPathArr[m]=e.util.toQuotedString(I));var J=e.validate(d);if(e.util.varOccurences(J,v)<2){J=e.util.varReplace(J,v,K);var te=K}else{var te=v;a+=" var "+v+" = "+K+"; "}if(re)a+=" "+J+" ";else{if(w&&w[I]){a+=" if ("+te+" === undefined) { valid"+d.level+" = false; ";var Q=e.errorPath,N=l,ae=e.util.escapeQuotes(I);e.opts._errorDataPathProperty&&(e.errorPath=e.util.getPath(Q,I,e.opts.jsonPointers)),l=e.errSchemaPath+"/required";var V=V||[];V.push(a),a="",e.createErrors!==!1?(a+=" { keyword: '"+(t||"required")+"' , dataPath: (dataPath || '') + "+e.errorPath+' , schemaPath: "'+l+"\" , params: { missingProperty: '"+ae+"' } ",e.opts.messages!==!1&&(a+=" , message: '",a+=e.opts._errorDataPathProperty?"is a required property":"should have required property \\'"+ae+"\\'",a+="' "),e.opts.verbose&&(a+=" , schema: validate.schema"+n+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+u+" "),a+=" } "):a+=" {} ";var F=a;a=V.pop(),a+=!e.compositeRule&&h?" validate.errors = ["+F+"]; return false; ":" var err = "+F+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",l=N,e.errorPath=Q,a+=" } else { "}else a+=h?" if ("+te+" === undefined) { valid"+d.level+" = true; } else { ":" if ("+te+" !== undefined) { ";a+=" "+J+" } "}}h&&(a+=" if (valid"+d.level+") { ",p+="}")}}var se=g;if(se)for(var C,oe=-1,ie=se.length-1;ie>oe;){C=se[oe+=1];var Y=P[C];if(e.util.schemaHasRules(Y,e.RULES.all)){d.schema=Y,d.schemaPath=e.schemaPath+".patternProperties"+e.util.getProperty(C),d.errSchemaPath=e.errSchemaPath+"/patternProperties/"+e.util.escapeFragment(C),
-a+=" for (var key"+s+" in "+u+") { if ("+e.usePattern(C)+".test(key"+s+")) { ",d.errorPath=e.util.getPathExpr(e.errorPath,"key"+s,e.opts.jsonPointers);var K=u+"[key"+s+"]";e.opts.v5&&(d.dataPathArr[m]="key"+s);var J=e.validate(d);a+=e.util.varOccurences(J,v)<2?" "+e.util.varReplace(J,v,K)+" ":" var "+v+" = "+K+"; "+J+" ",h&&(a+=" if (!valid"+d.level+") break; "),a+=" } ",h&&(a+=" else valid"+d.level+" = true; "),a+=" }  ",h&&(a+=" if (valid"+d.level+") { ",p+="}")}}if(e.opts.v5){var ne=_;if(ne)for(var M,le=-1,he=ne.length-1;he>le;){M=ne[le+=1];var ue=O[M],Y=ue.schema;if(e.util.schemaHasRules(Y,e.RULES.all)){d.schema=Y,d.schemaPath=e.schemaPath+".patternGroups"+e.util.getProperty(M)+".schema",d.errSchemaPath=e.errSchemaPath+"/patternGroups/"+e.util.escapeFragment(M)+"/schema",a+=" var pgPropCount"+s+" = 0; for (var key"+s+" in "+u+") { if ("+e.usePattern(M)+".test(key"+s+")) { pgPropCount"+s+"++; ",d.errorPath=e.util.getPathExpr(e.errorPath,"key"+s,e.opts.jsonPointers);var K=u+"[key"+s+"]";e.opts.v5&&(d.dataPathArr[m]="key"+s);var J=e.validate(d);a+=e.util.varOccurences(J,v)<2?" "+e.util.varReplace(J,v,K)+" ":" var "+v+" = "+K+"; "+J+" ",h&&(a+=" if (!valid"+d.level+") break; "),a+=" } ",h&&(a+=" else valid"+d.level+" = true; "),a+=" }  ",h&&(a+=" if (valid"+d.level+") { ",p+="}");var ce=ue.minimum,fe=ue.maximum;if(void 0!==ce||void 0!==fe){a+=" var "+c+" = true; ";var N=l;if(void 0!==ce){var de=ce,pe="minimum",me="less";a+=" "+c+" = pgPropCount"+s+" >= "+ce+"; ",l=e.errSchemaPath+"/patternGroups/minimum",a+="  if (!"+c+") {   ";var V=V||[];V.push(a),a="",e.createErrors!==!1?(a+=" { keyword: '"+(t||"patternGroups")+"' , dataPath: (dataPath || '') + "+e.errorPath+' , schemaPath: "'+l+"\" , params: { reason: '"+pe+"', limit: "+de+", pattern: '"+e.util.escapeQuotes(M)+"' } ",e.opts.messages!==!1&&(a+=" , message: 'should NOT have "+me+" than "+de+' properties matching pattern "'+e.util.escapeQuotes(M)+"\"' "),e.opts.verbose&&(a+=" , schema: validate.schema"+n+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+u+" "),a+=" } "):a+=" {} ";var F=a;a=V.pop(),a+=!e.compositeRule&&h?" validate.errors = ["+F+"]; return false; ":" var err = "+F+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",a+=" } ",void 0!==fe&&(a+=" else ")}if(void 0!==fe){var de=fe,pe="maximum",me="more";a+=" "+c+" = pgPropCount"+s+" <= "+fe+"; ",l=e.errSchemaPath+"/patternGroups/maximum",a+="  if (!"+c+") {   ";var V=V||[];V.push(a),a="",e.createErrors!==!1?(a+=" { keyword: '"+(t||"patternGroups")+"' , dataPath: (dataPath || '') + "+e.errorPath+' , schemaPath: "'+l+"\" , params: { reason: '"+pe+"', limit: "+de+", pattern: '"+e.util.escapeQuotes(M)+"' } ",e.opts.messages!==!1&&(a+=" , message: 'should NOT have "+me+" than "+de+' properties matching pattern "'+e.util.escapeQuotes(M)+"\"' "),e.opts.verbose&&(a+=" , schema: validate.schema"+n+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+u+" "),a+=" } "):a+=" {} ";var F=a;a=V.pop(),a+=!e.compositeRule&&h?" validate.errors = ["+F+"]; return false; ":" var err = "+F+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",a+=" } "}l=N,h&&(a+=" if ("+c+") { ",p+="}")}}}}return h&&(a+=" "+p+" if ("+f+" == errors) {"),a=e.util.cleanUpCode(a)}},{}],34:[function(e,r,t){"use strict";r.exports=function(e,r){var t,a=" ",s=e.dataLevel,o=e.schema[r],i=e.errSchemaPath+"/"+r,n=!e.opts.allErrors,l="data"+(s||"");if("#"==o||"#/"==o)e.isRoot?(a+="  if (! validate("+l+", (dataPath || '')",'""'!=e.errorPath&&(a+=" + "+e.errorPath),a+=") ) { if (vErrors === null) vErrors = validate.errors; else vErrors = vErrors.concat(validate.errors); errors = vErrors.length; } ",n&&(a+=" else { ")):(a+="  if (! root.refVal[0]("+l+", (dataPath || '')",'""'!=e.errorPath&&(a+=" + "+e.errorPath),a+=") ) { if (vErrors === null) vErrors = root.refVal[0].errors; else vErrors = vErrors.concat(root.refVal[0].errors); errors = vErrors.length; } ",n&&(a+=" else { "));else{var h=e.resolveRef(e.baseId,o,e.isRoot);if(void 0===h){var u="can't resolve reference "+o+" from id "+e.baseId;if("fail"==e.opts.missingRefs){console.log(u);var c=c||[];c.push(a),a="",e.createErrors!==!1?(a+=" { keyword: '"+(t||"$ref")+"' , dataPath: (dataPath || '') + "+e.errorPath+' , schemaPath: "'+i+"\" , params: { ref: '"+e.util.escapeQuotes(o)+"' } ",e.opts.messages!==!1&&(a+=" , message: 'can\\'t resolve reference "+e.util.escapeQuotes(o)+"' "),e.opts.verbose&&(a+=" , schema: "+e.util.toQuotedString(o)+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+l+" "),a+=" } "):a+=" {} ";var f=a;a=c.pop(),a+=!e.compositeRule&&n?" validate.errors = ["+f+"]; return false; ":" var err = "+f+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",n&&(a+=" if (false) { ")}else{if("ignore"!=e.opts.missingRefs){var d=new Error(u);throw d.missingRef=e.resolve.url(e.baseId,o),d.missingSchema=e.resolve.normalizeId(e.resolve.fullPath(d.missingRef)),d}console.log(u),n&&(a+=" if (true) { ")}}else if("string"==typeof h)a+="  if (! "+h+"("+l+", (dataPath || '')",'""'!=e.errorPath&&(a+=" + "+e.errorPath),a+=") ) { if (vErrors === null) vErrors = "+h+".errors; else vErrors = vErrors.concat("+h+".errors); errors = vErrors.length; } ",n&&(a+=" else { ");else{var p=e.util.copy(e);p.level++,p.schema=h.schema,p.schemaPath="",p.errSchemaPath=o;var m=e.validate(p).replace(/validate\.schema/g,h.code);a+=" "+m+" ",n&&(a+=" if (valid"+p.level+") { ")}}return a}},{}],35:[function(e,r,t){"use strict";r.exports=function(e,r){var t,a=" ",s=e.level,o=e.dataLevel,i=e.schema[r],n=e.schemaPath+"."+r,l=e.errSchemaPath+"/"+r,h=!e.opts.allErrors,u="data"+(o||""),c="valid"+s,f=e.opts.v5&&i.$data,d=f?e.util.getData(i.$data,o,e.dataPathArr):i;if(f&&(a+=" var schema"+s+" = "+d+"; ",d="schema"+s),!f)if(e.opts.loopRequired>i.length&&e.schema.properties&&Object.keys(e.schema.properties).length){var p=[],m=i;if(m)for(var v,y=-1,P=m.length-1;P>y;){v=m[y+=1];var g=e.schema.properties[v];g&&e.util.schemaHasRules(g,e.RULES.all)||(p[p.length]=v)}}else var p=i;if(f||p.length){var b=e.errorPath,E=f||p.length>=e.opts.loopRequired;if(h)if(a+=" var missing"+s+"; ",E){f||(a+=" var schema"+s+" = validate.schema"+n+"; ");var j="i"+s,$="schema"+s+"["+j+"]",x="' + "+$+" + '";e.opts._errorDataPathProperty&&(e.errorPath=e.util.getPathExpr(b,$,e.opts.jsonPointers)),a+=" var "+c+" = true; ",f&&(a+=" if (schema"+s+" === undefined) "+c+" = true; else if (!Array.isArray(schema"+s+")) "+c+" = false; else {"),a+=" for (var "+j+" = 0; "+j+" < schema"+s+".length; "+j+"++) { "+c+" = "+u+"[schema"+s+"["+j+"]] !== undefined; if (!"+c+") break; } ",f&&(a+="  }  "),a+="  if (!"+c+") {   ";var R=R||[];R.push(a),a="",e.createErrors!==!1?(a+=" { keyword: '"+(t||"required")+"' , dataPath: (dataPath || '') + "+e.errorPath+' , schemaPath: "'+l+"\" , params: { missingProperty: '"+x+"' } ",e.opts.messages!==!1&&(a+=" , message: '",a+=e.opts._errorDataPathProperty?"is a required property":"should have required property \\'"+x+"\\'",a+="' "),e.opts.verbose&&(a+=" , schema: validate.schema"+n+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+u+" "),a+=" } "):a+=" {} ";var S=a;a=R.pop(),a+=!e.compositeRule&&h?" validate.errors = ["+S+"]; return false; ":" var err = "+S+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",a+=" } else { "}else{a+=" if ( ";var w=p;if(w)for(var O,j=-1,_=w.length-1;_>j;){O=w[j+=1],j&&(a+=" || ");var k=e.util.getProperty(O);a+=" ( "+u+k+" === undefined && (missing"+s+" = "+e.util.toQuotedString(e.opts.jsonPointers?O:k)+") ) "}a+=") {  ";var $="missing"+s,x="' + "+$+" + '";e.opts._errorDataPathProperty&&(e.errorPath=e.opts.jsonPointers?e.util.getPathExpr(b,$,!0):b+" + "+$);var R=R||[];R.push(a),a="",e.createErrors!==!1?(a+=" { keyword: '"+(t||"required")+"' , dataPath: (dataPath || '') + "+e.errorPath+' , schemaPath: "'+l+"\" , params: { missingProperty: '"+x+"' } ",e.opts.messages!==!1&&(a+=" , message: '",a+=e.opts._errorDataPathProperty?"is a required property":"should have required property \\'"+x+"\\'",a+="' "),e.opts.verbose&&(a+=" , schema: validate.schema"+n+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+u+" "),a+=" } "):a+=" {} ";var S=a;a=R.pop(),a+=!e.compositeRule&&h?" validate.errors = ["+S+"]; return false; ":" var err = "+S+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",a+=" } else { "}else if(E){f||(a+=" var schema"+s+" = validate.schema"+n+"; ");var j="i"+s,$="schema"+s+"["+j+"]",x="' + "+$+" + '";e.opts._errorDataPathProperty&&(e.errorPath=e.util.getPathExpr(b,$,e.opts.jsonPointers)),f&&(a+=" if (schema"+s+" && !Array.isArray(schema"+s+")) {  var err =   ",e.createErrors!==!1?(a+=" { keyword: '"+(t||"required")+"' , dataPath: (dataPath || '') + "+e.errorPath+' , schemaPath: "'+l+"\" , params: { missingProperty: '"+x+"' } ",e.opts.messages!==!1&&(a+=" , message: '",a+=e.opts._errorDataPathProperty?"is a required property":"should have required property \\'"+x+"\\'",a+="' "),e.opts.verbose&&(a+=" , schema: validate.schema"+n+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+u+" "),a+=" } "):a+=" {} ",a+=";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } else if (schema"+s+" !== undefined) { "),a+=" for (var "+j+" = 0; "+j+" < schema"+s+".length; "+j+"++) { if ("+u+"[schema"+s+"["+j+"]] === undefined) {  var err =   ",e.createErrors!==!1?(a+=" { keyword: '"+(t||"required")+"' , dataPath: (dataPath || '') + "+e.errorPath+' , schemaPath: "'+l+"\" , params: { missingProperty: '"+x+"' } ",e.opts.messages!==!1&&(a+=" , message: '",a+=e.opts._errorDataPathProperty?"is a required property":"should have required property \\'"+x+"\\'",a+="' "),e.opts.verbose&&(a+=" , schema: validate.schema"+n+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+u+" "),a+=" } "):a+=" {} ",a+=";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } } ",f&&(a+="  }  ")}else{var I=p;if(I)for(var v,j=-1,A=I.length-1;A>j;){v=I[j+=1];var k=e.util.getProperty(v),x=e.util.escapeQuotes(v);e.opts._errorDataPathProperty&&(e.errorPath=e.util.getPath(b,v,e.opts.jsonPointers)),a+=" if ("+u+k+" === undefined) {  var err =   ",e.createErrors!==!1?(a+=" { keyword: '"+(t||"required")+"' , dataPath: (dataPath || '') + "+e.errorPath+' , schemaPath: "'+l+"\" , params: { missingProperty: '"+x+"' } ",e.opts.messages!==!1&&(a+=" , message: '",a+=e.opts._errorDataPathProperty?"is a required property":"should have required property \\'"+x+"\\'",a+="' "),e.opts.verbose&&(a+=" , schema: validate.schema"+n+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+u+" "),a+=" } "):a+=" {} ",a+=";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } "}}e.errorPath=b}else h&&(a+=" if (true) {");return a}},{}],36:[function(e,r,t){"use strict";r.exports=function(e,r){var t,a=" ",s=e.level,o=e.dataLevel,i=e.schema[r],n=e.schemaPath+"."+r,l=e.errSchemaPath+"/"+r,h=!e.opts.allErrors,u="data"+(o||""),c="valid"+s,f="errs__"+s,d=e.util.copy(e),p="";d.level++;var m,v="ifPassed"+e.level;a+="var "+v+";";var y=i;if(y)for(var P,g=-1,b=y.length-1;b>g;){if(P=y[g+=1],g&&!m&&(a+=" if (!"+v+") { ",p+="}"),P["if"]&&e.util.schemaHasRules(P["if"],e.RULES.all)){a+=" var "+f+" = errors;   ";var E=e.compositeRule;if(e.compositeRule=d.compositeRule=!0,d.createErrors=!1,d.schema=P["if"],d.schemaPath=n+"["+g+"].if",d.errSchemaPath=l+"/"+g+"/if",a+=" "+e.validate(d)+" ",d.createErrors=!0,e.compositeRule=d.compositeRule=E,a+=" "+v+" = valid"+d.level+"; if ("+v+") {  ","boolean"==typeof P.then){if(P.then===!1){var j=j||[];j.push(a),a="",e.createErrors!==!1?(a+=" { keyword: '"+(t||"switch")+"' , dataPath: (dataPath || '') + "+e.errorPath+' , schemaPath: "'+l+'" , params: { caseIndex: '+g+" } ",e.opts.messages!==!1&&(a+=" , message: 'should pass \"switch\" keyword validation' "),e.opts.verbose&&(a+=" , schema: validate.schema"+n+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+u+" "),a+=" } "):a+=" {} ";var $=a;a=j.pop(),a+=!e.compositeRule&&h?" validate.errors = ["+$+"]; return false; ":" var err = "+$+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; "}a+=" var valid"+d.level+" = "+P.then+"; "}else d.schema=P.then,d.schemaPath=n+"["+g+"].then",d.errSchemaPath=l+"/"+g+"/then",a+=" "+e.validate(d)+" ";a+="  } else {  errors = "+f+"; if (vErrors !== null) { if ("+f+") vErrors.length = "+f+"; else vErrors = null; } } "}else if(a+=" "+v+" = true;  ","boolean"==typeof P.then){if(P.then===!1){var j=j||[];j.push(a),a="",e.createErrors!==!1?(a+=" { keyword: '"+(t||"switch")+"' , dataPath: (dataPath || '') + "+e.errorPath+' , schemaPath: "'+l+'" , params: { caseIndex: '+g+" } ",e.opts.messages!==!1&&(a+=" , message: 'should pass \"switch\" keyword validation' "),e.opts.verbose&&(a+=" , schema: validate.schema"+n+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+u+" "),a+=" } "):a+=" {} ";var $=a;a=j.pop(),a+=!e.compositeRule&&h?" validate.errors = ["+$+"]; return false; ":" var err = "+$+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; "}a+=" var valid"+d.level+" = "+P.then+"; "}else d.schema=P.then,d.schemaPath=n+"["+g+"].then",d.errSchemaPath=l+"/"+g+"/then",a+=" "+e.validate(d)+" ";m=P["continue"]}return a+=""+p+"var "+c+" = valid"+d.level+"; ",a=e.util.cleanUpCode(a)}},{}],37:[function(e,r,t){"use strict";r.exports=function(e,r){var t,a=" ",s=e.level,o=e.dataLevel,i=e.schema[r],n=e.schemaPath+"."+r,l=e.errSchemaPath+"/"+r,h=!e.opts.allErrors,u="data"+(o||""),c="valid"+s,f=e.opts.v5&&i.$data,d=f?e.util.getData(i.$data,o,e.dataPathArr):i;if(f&&(a+=" var schema"+s+" = "+d+"; ",d="schema"+s),(i||f)&&e.opts.uniqueItems!==!1){f&&(a+=" var "+c+"; if ("+d+" === false || "+d+" === undefined) "+c+" = true; else if (typeof "+d+" != 'boolean') "+c+" = false; else { "),a+=" var "+c+" = true; if ("+u+".length > 1) { var i = "+u+".length, j; outer: for (;i--;) { for (j = i; j--;) { if (equal("+u+"[i], "+u+"[j])) { "+c+" = false; break outer; } } } } ",f&&(a+="  }  "),a+=" if (!"+c+") {   ";var p=p||[];p.push(a),a="",e.createErrors!==!1?(a+=" { keyword: '"+(t||"uniqueItems")+"' , dataPath: (dataPath || '') + "+e.errorPath+' , schemaPath: "'+l+'" , params: { i: i, j: j } ',e.opts.messages!==!1&&(a+=" , message: 'should NOT have duplicate items (items ## ' + j + ' and ' + i + ' are identical)' "),e.opts.verbose&&(a+=" , schema:  ",a+=f?"validate.schema"+n:""+i,a+="         , parentSchema: validate.schema"+e.schemaPath+" , data: "+u+" "),a+=" } "):a+=" {} ";var m=a;a=p.pop(),a+=!e.compositeRule&&h?" validate.errors = ["+m+"]; return false; ":" var err = "+m+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",a+=" } ",h&&(a+=" else { ")}else h&&(a+=" if (true) { ");return a}},{}],38:[function(e,r,t){"use strict";r.exports=function(e,r){function t(e){for(var r=0;e.rules.length>r;r++)if(a(e.rules[r]))return!0}function a(r){return void 0!==e.schema[r.keyword]||"properties"==r.keyword&&(e.schema.additionalProperties===!1||"object"==typeof e.schema.additionalProperties||e.schema.patternProperties&&Object.keys(e.schema.patternProperties).length||e.opts.v5&&e.schema.patternGroups&&Object.keys(e.schema.patternGroups).length)}var s="";if(e.isTop){var o=e.isTop,i=e.level=0,n=e.dataLevel=0,l="data";e.rootId=e.resolve.fullPath(e.root.schema.id),e.baseId=e.baseId||e.rootId,delete e.isTop,e.opts.v5&&(e.dataPathArr=[void 0]),s+=" validate = function (data, dataPath) { 'use strict'; var vErrors = null; ",s+=" var errors = 0;     "}else{var i=e.level,n=e.dataLevel,l="data"+(n||"");e.schema.id&&(e.baseId=e.resolve.url(e.baseId,e.schema.id)),s+=" var errs_"+i+" = errors;"}var h,u="valid"+i,c=!e.opts.allErrors,f="",d="",p=e.schema.type,m=e.RULES;if(m)for(var v,y=-1,P=m.length-1;P>y;)if(v=m[y+=1],t(v)){if(v.type&&(s+=" if ("+e.util.checkDataType(v.type,l)+") { "),e.opts.useDefaults&&!e.compositeRule)if("object"==v.type&&e.schema.properties){var g=e.schema.properties,b=Object.keys(g),E=b;if(E)for(var j,$=-1,x=E.length-1;x>$;){j=E[$+=1];var R=g[j];if(void 0!==R["default"]){var S=l+e.util.getProperty(j);s+="  if ("+S+" === undefined) "+S+" = "+e.useDefault(R["default"])+"; "}}}else if("array"==v.type&&Array.isArray(e.schema.items)){var w=e.schema.items;if(w)for(var R,O=-1,_=w.length-1;_>O;)if(R=w[O+=1],void 0!==R["default"]){var S=l+"["+O+"]";s+="  if ("+S+" === undefined) "+S+" = "+e.useDefault(R["default"])+"; "}}var k=v.rules;if(k)for(var I,A=-1,q=k.length-1;q>A;)if(I=k[A+=1],a(I)){if(I.custom){var g=e.schema[I.keyword],L=e.useCustomRule(I,g,e.schema,e),C=L.code+".errors",D=e.schemaPath+"."+I.keyword,U=e.errSchemaPath+"/"+I.keyword,z="errs"+i,O="i"+i,M="ruleErr"+i,T=I.definition,Q=T.inline,H=T.macro;if(Q||H||(s+=""+C+" = null;"),s+="var "+z+" = errors;",Q&&T.statements)s+=" "+L.validate;else if(H){var N=e.util.copy(e);N.level++,N.schema=L.validate,N.schemaPath="";var V=e.compositeRule;e.compositeRule=N.compositeRule=!0;var F=e.validate(N).replace(/validate\.schema/g,L.code);e.compositeRule=N.compositeRule=V,s+=" "+F}s+="if (! ",Q?s+=T.statements?" valid"+i+" ":" ("+L.validate+") ":H?s+=" valid"+N.level+" ":(s+=" "+L.code+".call(self ",T.compile?s+=" , "+l+" ":(s+=" , validate.schema"+D+" , "+l+" ",L.validate.length>2&&(s+=" , validate.schema"+e.schemaPath+" ")),s+=" ) "),s+=") { ",h=I.keyword;var G=G||[];G.push(s),s="";var G=G||[];G.push(s),s="",e.createErrors!==!1?(s+=" { keyword: '"+(h||"custom")+"' , dataPath: (dataPath || '') + "+e.errorPath+' , schemaPath: "'+U+"\" , params: { keyword: '"+I.keyword+"' } ",e.opts.messages!==!1&&(s+=" , message: 'should pass \""+I.keyword+"\" keyword validation' "),e.opts.verbose&&(s+=" , schema: validate.schema"+D+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+l+" "),s+=" } "):s+=" {} ";var K=s;s=G.pop(),s+=!e.compositeRule&&c?" validate.errors = ["+K+"]; return false; ":" var err = "+K+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ";var J=s;s=G.pop(),Q?T.errors?"full"!=T.errors&&(s+="  for (var "+O+"="+z+"; "+O+"<errors; "+O+"++) { var "+M+" = vErrors["+O+"]; if ("+M+".dataPath === undefined) { "+M+".dataPath = (dataPath || '') + "+e.errorPath+"; } ",e.opts.verbose&&(s+=" "+M+".schema = validate.schema"+D+"; "+M+".data = "+l+"; "),s+=" } "):T.errors===!1?s+=" "+J+" ":(s+=" if ("+z+" == errors) { "+J+" } else {  for (var "+O+"="+z+"; "+O+"<errors; "+O+"++) { var "+M+" = vErrors["+O+"]; if ("+M+".dataPath === undefined) { "+M+".dataPath = (dataPath || '') + "+e.errorPath+"; } ",e.opts.verbose&&(s+=" "+M+".schema = validate.schema"+D+"; "+M+".data = "+l+"; "),s+=" } } "):H?(s+="   var err =   ",e.createErrors!==!1?(s+=" { keyword: '"+(h||"custom")+"' , dataPath: (dataPath || '') + "+e.errorPath+' , schemaPath: "'+U+"\" , params: { keyword: '"+I.keyword+"' } ",e.opts.messages!==!1&&(s+=" , message: 'should pass \""+I.keyword+"\" keyword validation' "),e.opts.verbose&&(s+=" , schema: validate.schema"+D+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+l+" "),s+=" } "):s+=" {} ",s+=";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",!e.compositeRule&&c&&(s+=" validate.errors = vErrors; return false ")):(s+=" if (Array.isArray("+C+")) { if (vErrors === null) vErrors = "+C+"; else vErrors.concat("+C+"); errors = vErrors.length;  for (var "+O+"="+z+"; "+O+"<errors; "+O+"++) { var "+M+" = vErrors["+O+"];  "+M+".dataPath = (dataPath || '') + "+e.errorPath+";  ",e.opts.verbose&&(s+=" "+M+".schema = validate.schema"+D+"; "+M+".data = "+l+"; "),s+=" } } else { "+J+" } "),h=void 0,s+=" } ",c&&(s+=" else { ")}else s+=" "+I.code(e,I.keyword)+" ";c&&(f+="}")}if(c&&(s+=" "+f+" ",f=""),v.type&&(s+=" } ",p&&p===v.type)){var B=!0;s+=" else { ";var D=e.schemaPath+".type",U=e.errSchemaPath+"/type",G=G||[];G.push(s),s="",e.createErrors!==!1?(s+=" { keyword: '"+(h||"type")+"' , dataPath: (dataPath || '') + "+e.errorPath+' , schemaPath: "'+U+"\" , params: { type: '",s+=Z?""+p.join(","):""+p,s+="' } ",e.opts.messages!==!1&&(s+=" , message: 'should be ",s+=Z?""+p.join(","):""+p,s+="' "),e.opts.verbose&&(s+=" , schema: validate.schema"+D+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+l+" "),s+=" } "):s+=" {} ";var K=s;s=G.pop(),s+=!e.compositeRule&&c?" validate.errors = ["+K+"]; return false; ":" var err = "+K+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",s+=" } "}c&&(s+=" if (errors === ",s+=o?"0":"errs_"+i,s+=") { ",d+="}")}if(p&&!B){var D=e.schemaPath+".type",U=e.errSchemaPath+"/type",Z=Array.isArray(p),W=Z?"checkDataTypes":"checkDataType";s+=" if ("+e.util[W](p,l,!0)+") {   ";var G=G||[];G.push(s),s="",e.createErrors!==!1?(s+=" { keyword: '"+(h||"type")+"' , dataPath: (dataPath || '') + "+e.errorPath+' , schemaPath: "'+U+"\" , params: { type: '",s+=Z?""+p.join(","):""+p,s+="' } ",e.opts.messages!==!1&&(s+=" , message: 'should be ",s+=Z?""+p.join(","):""+p,s+="' "),e.opts.verbose&&(s+=" , schema: validate.schema"+D+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+l+" "),s+=" } "):s+=" {} ";var K=s;s=G.pop(),s+=!e.compositeRule&&c?" validate.errors = ["+K+"]; return false; ":" var err = "+K+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",s+=" }"}return c&&(s+=" "+d+" "),o?(s+=" validate.errors = vErrors; ",s+=" return errors === 0;       ",s+=" }"):s+=" var "+u+" = errors === errs_"+i+";",s=e.util.cleanUpCode(s),o&&c&&(s=e.util.cleanUpVarErrors(s)),s}},{}],39:[function(e,r,t){"use strict";var a=/^[a-z_$][a-z0-9_$]*$/i;r.exports=function(e,r){function t(e,r,t){for(var a,s=0;o.RULES.length>s;s++){var i=o.RULES[s];if(i.type==r){a=i;break}}a||(a={type:r,rules:[]},o.RULES.push(a));var n={keyword:e,definition:t,custom:!0};a.rules.push(n)}function s(e){if(!o.RULES.types[e])throw new Error("Unknown type "+e)}var o=this;if(this.RULES.keywords[e])throw new Error("Keyword "+e+" is already defined");if(!a.test(e))throw new Error("Keyword "+e+" is not a valid identifier");if(r){var i=r.type;if(Array.isArray(i)){var n,l=i.length;for(n=0;l>n;n++)s(i[n]);for(n=0;l>n;n++)t(e,i[n],r)}else i&&s(i),t(e,i,r)}this.RULES.keywords[e]=!0,this.RULES.all[e]=!0}},{}],40:[function(e,r,t){r.exports={id:"http://json-schema.org/draft-04/schema#",$schema:"http://json-schema.org/draft-04/schema#",description:"Core schema meta-schema",definitions:{schemaArray:{type:"array",minItems:1,items:{$ref:"#"}},positiveInteger:{type:"integer",minimum:0},positiveIntegerDefault0:{allOf:[{$ref:"#/definitions/positiveInteger"},{"default":0}]},simpleTypes:{"enum":["array","boolean","integer","null","number","object","string"]},stringArray:{type:"array",items:{type:"string"},minItems:1,uniqueItems:!0}},type:"object",properties:{id:{type:"string",format:"uri"},$schema:{type:"string",format:"uri"},title:{type:"string"},description:{type:"string"},"default":{},multipleOf:{type:"number",minimum:0,exclusiveMinimum:!0},maximum:{type:"number"},exclusiveMaximum:{type:"boolean","default":!1},minimum:{type:"number"},exclusiveMinimum:{type:"boolean","default":!1},maxLength:{$ref:"#/definitions/positiveInteger"},minLength:{$ref:"#/definitions/positiveIntegerDefault0"},pattern:{type:"string",format:"regex"},additionalItems:{anyOf:[{type:"boolean"},{$ref:"#"}],"default":{}},items:{anyOf:[{$ref:"#"},{$ref:"#/definitions/schemaArray"}],"default":{}},maxItems:{$ref:"#/definitions/positiveInteger"},minItems:{$ref:"#/definitions/positiveIntegerDefault0"},uniqueItems:{type:"boolean","default":!1},maxProperties:{$ref:"#/definitions/positiveInteger"},minProperties:{$ref:"#/definitions/positiveIntegerDefault0"},required:{$ref:"#/definitions/stringArray"},additionalProperties:{anyOf:[{type:"boolean"},{$ref:"#"}],"default":{}},definitions:{type:"object",additionalProperties:{$ref:"#"},"default":{}},properties:{type:"object",additionalProperties:{$ref:"#"},"default":{}},patternProperties:{type:"object",additionalProperties:{$ref:"#"},"default":{}},dependencies:{type:"object",additionalProperties:{anyOf:[{$ref:"#"},{$ref:"#/definitions/stringArray"}]}},"enum":{type:"array",minItems:1,uniqueItems:!0},type:{anyOf:[{$ref:"#/definitions/simpleTypes"},{type:"array",items:{$ref:"#/definitions/simpleTypes"},minItems:1,uniqueItems:!0}]},allOf:{$ref:"#/definitions/schemaArray"},anyOf:{$ref:"#/definitions/schemaArray"},oneOf:{$ref:"#/definitions/schemaArray"},not:{$ref:"#"}},dependencies:{exclusiveMaximum:["maximum"],exclusiveMinimum:["minimum"]},"default":{}}},{}],41:[function(e,r,t){r.exports={id:"https://raw.githubusercontent.com/epoberezkin/ajv/master/lib/refs/json-schema-v5.json#",$schema:"http://json-schema.org/draft-04/schema#",description:"Core schema meta-schema (v5 proposals)",definitions:{schemaArray:{type:"array",minItems:1,items:{$ref:"#"}},positiveInteger:{type:"integer",minimum:0},positiveIntegerDefault0:{allOf:[{$ref:"#/definitions/positiveInteger"},{"default":0}]},simpleTypes:{"enum":["array","boolean","integer","null","number","object","string"]},stringArray:{type:"array",items:{type:"string"},minItems:1,uniqueItems:!0},$data:{type:"object",required:["$data"],properties:{$data:{type:"string",format:"relative-json-pointer"}},additionalProperties:!1}},type:"object",properties:{id:{type:"string",format:"uri"},$schema:{type:"string",format:"uri"},title:{type:"string"},description:{type:"string"},"default":{},multipleOf:{anyOf:[{type:"number",minimum:0,exclusiveMinimum:!0},{$ref:"#/definitions/$data"}]},maximum:{anyOf:[{type:"number"},{$ref:"#/definitions/$data"}]},exclusiveMaximum:{anyOf:[{type:"boolean","default":!1},{$ref:"#/definitions/$data"}]},minimum:{anyOf:[{type:"number"},{$ref:"#/definitions/$data"}]},exclusiveMinimum:{anyOf:[{type:"boolean","default":!1},{$ref:"#/definitions/$data"}]},maxLength:{anyOf:[{$ref:"#/definitions/positiveInteger"},{$ref:"#/definitions/$data"}]},minLength:{anyOf:[{$ref:"#/definitions/positiveIntegerDefault0"},{$ref:"#/definitions/$data"}]},pattern:{anyOf:[{type:"string",format:"regex"},{$ref:"#/definitions/$data"}]},additionalItems:{anyOf:[{type:"boolean"},{$ref:"#"},{$ref:"#/definitions/$data"}],"default":{}},items:{anyOf:[{$ref:"#"},{$ref:"#/definitions/schemaArray"}],"default":{}},maxItems:{anyOf:[{$ref:"#/definitions/positiveInteger"},{$ref:"#/definitions/$data"}]},minItems:{anyOf:[{$ref:"#/definitions/positiveIntegerDefault0"},{$ref:"#/definitions/$data"}]},uniqueItems:{anyOf:[{type:"boolean","default":!1},{$ref:"#/definitions/$data"}]},maxProperties:{anyOf:[{$ref:"#/definitions/positiveInteger"},{$ref:"#/definitions/$data"}]},minProperties:{anyOf:[{$ref:"#/definitions/positiveIntegerDefault0"},{$ref:"#/definitions/$data"}]},required:{anyOf:[{$ref:"#/definitions/stringArray"},{$ref:"#/definitions/$data"}]},additionalProperties:{anyOf:[{type:"boolean"},{$ref:"#"},{$ref:"#/definitions/$data"}],"default":{}},definitions:{type:"object",additionalProperties:{$ref:"#"},"default":{}},properties:{type:"object",additionalProperties:{$ref:"#"},"default":{}},patternProperties:{type:"object",additionalProperties:{$ref:"#"},"default":{}},dependencies:{type:"object",additionalProperties:{anyOf:[{$ref:"#"},{$ref:"#/definitions/stringArray"}]}},"enum":{anyOf:[{type:"array",minItems:1,uniqueItems:!0},{$ref:"#/definitions/$data"}]},type:{anyOf:[{$ref:"#/definitions/simpleTypes"},{type:"array",items:{$ref:"#/definitions/simpleTypes"},minItems:1,uniqueItems:!0}]},allOf:{$ref:"#/definitions/schemaArray"},anyOf:{$ref:"#/definitions/schemaArray"},oneOf:{$ref:"#/definitions/schemaArray"},not:{$ref:"#"},format:{anyOf:[{type:"string"},{$ref:"#/definitions/$data"}]},formatMaximum:{anyOf:[{type:"string"},{$ref:"#/definitions/$data"}]},formatMinimum:{anyOf:[{type:"string"},{$ref:"#/definitions/$data"}]},exclusiveFormatMaximum:{anyOf:[{type:"boolean","default":!1},{$ref:"#/definitions/$data"}]},exclusiveFormatMinimum:{anyOf:[{type:"boolean","default":!1},{$ref:"#/definitions/$data"}]},constant:{anyOf:[{},{$ref:"#/definitions/$data"}]},contains:{$ref:"#"},patternGroups:{type:"object",additionalProperties:{type:"object",required:["schema"],properties:{maximum:{anyOf:[{$ref:"#/definitions/positiveInteger"},{$ref:"#/definitions/$data"}]},minimum:{anyOf:[{$ref:"#/definitions/positiveIntegerDefault0"},{$ref:"#/definitions/$data"}]},schema:{$ref:"#"}},additionalProperties:!1},"default":{}},"switch":{type:"array",items:{required:["then"],properties:{"if":{$ref:"#"},then:{anyOf:[{type:"boolean"},{$ref:"#"}]},"continue":{type:"boolean"}},additionalProperties:!1,dependencies:{"continue":["if"]}}}},dependencies:{exclusiveMaximum:["maximum"],exclusiveMinimum:["minimum"],formatMaximum:["format"],formatMinimum:["format"],exclusiveFormatMaximum:["formatMaximum"],exclusiveFormatMinimum:["formatMinimum"]},"default":{}}},{}],42:[function(e,r,t){"use strict";function a(r){if(r.opts.meta!==!1){var t=e("./refs/json-schema-v5.json");r.addMetaSchema(t,o)}r.addKeyword("constant",{inline:e("./dotjs/constant"),statements:!0,errors:"full"}),r.addKeyword("contains",{type:"array",macro:s});var a=e("./dotjs/_formatLimit");r.addKeyword("formatMaximum",{type:"string",inline:a,statements:!0,errors:"full"}),r.addKeyword("formatMinimum",{type:"string",inline:a,statements:!0,errors:"full"}),r.addKeyword("exclusiveFormatMaximum"),r.addKeyword("exclusiveFormatMinimum"),r.addKeyword("patternGroups"),r.addKeyword("switch",{inline:e("./dotjs/switch"),statements:!0,errors:"full"})}function s(e){return{not:{items:{not:e}}}}var o="https://raw.githubusercontent.com/epoberezkin/ajv/master/lib/refs/json-schema-v5.json";r.exports={enable:a,META_SCHEMA_ID:o}},{"./dotjs/_formatLimit":17,"./dotjs/constant":24,"./dotjs/switch":36,"./refs/json-schema-v5.json":41}],43:[function(e,r,t){var a="undefined"!=typeof JSON?JSON:e("jsonify");r.exports=function(e,r){r||(r={}),"function"==typeof r&&(r={cmp:r});var t=r.space||"";"number"==typeof t&&(t=Array(t+1).join(" "));var i="boolean"==typeof r.cycles?r.cycles:!1,n=r.replacer||function(e,r){return r},l=r.cmp&&function(e){return function(r){return function(t,a){var s={key:t,value:r[t]},o={key:a,value:r[a]};return e(s,o)}}}(r.cmp),h=[];return function u(e,r,c,f){var d=t?"\n"+new Array(f+1).join(t):"",p=t?": ":":";if(c&&c.toJSON&&"function"==typeof c.toJSON&&(c=c.toJSON()),c=n.call(e,r,c),void 0!==c){if("object"!=typeof c||null===c)return a.stringify(c);if(s(c)){for(var m=[],v=0;c.length>v;v++){var y=u(c,v,c[v],f+1)||a.stringify(null);m.push(d+t+y)}return"["+m.join(",")+d+"]"}if(-1!==h.indexOf(c)){if(i)return a.stringify("__cycle__");throw new TypeError("Converting circular structure to JSON")}h.push(c);for(var P=o(c).sort(l&&l(c)),m=[],v=0;P.length>v;v++){var r=P[v],g=u(c,r,c[r],f+1);if(g){var b=a.stringify(r)+p+g;m.push(d+t+b)}}return"{"+m.join(",")+d+"}"}}({"":e},"",e,0)};var s=Array.isArray||function(e){return"[object Array]"==={}.toString.call(e)},o=Object.keys||function(e){var r=Object.prototype.hasOwnProperty||function(){return!0},t=[];for(var a in e)r.call(e,a)&&t.push(a);return t}},{jsonify:44}],44:[function(e,r,t){t.parse=e("./lib/parse"),t.stringify=e("./lib/stringify")},{"./lib/parse":45,"./lib/stringify":46}],45:[function(e,r,t){var a,s,o,i,n={'"':'"',"\\":"\\","/":"/",b:"\b",f:"\f",n:"\n",r:"\r",t:"	"},l=function(e){throw{name:"SyntaxError",message:e,at:a,text:o}},h=function(e){return e&&e!==s&&l("Expected '"+e+"' instead of '"+s+"'"),s=o.charAt(a),a+=1,s},u=function(){var e,r="";for("-"===s&&(r="-",h("-"));s>="0"&&"9">=s;)r+=s,h();if("."===s)for(r+=".";h()&&s>="0"&&"9">=s;)r+=s;if("e"===s||"E"===s)for(r+=s,h(),("-"===s||"+"===s)&&(r+=s,h());s>="0"&&"9">=s;)r+=s,h();return e=+r,isFinite(e)?e:void l("Bad number")},c=function(){var e,r,t,a="";if('"'===s)for(;h();){if('"'===s)return h(),a;if("\\"===s)if(h(),"u"===s){for(t=0,r=0;4>r&&(e=parseInt(h(),16),isFinite(e));r+=1)t=16*t+e;a+=String.fromCharCode(t)}else{if("string"!=typeof n[s])break;a+=n[s]}else a+=s}l("Bad string")},f=function(){for(;s&&" ">=s;)h()},d=function(){switch(s){case"t":return h("t"),h("r"),h("u"),h("e"),!0;case"f":return h("f"),h("a"),h("l"),h("s"),h("e"),!1;case"n":return h("n"),
-h("u"),h("l"),h("l"),null}l("Unexpected '"+s+"'")},p=function(){var e=[];if("["===s){if(h("["),f(),"]"===s)return h("]"),e;for(;s;){if(e.push(i()),f(),"]"===s)return h("]"),e;h(","),f()}}l("Bad array")},m=function(){var e,r={};if("{"===s){if(h("{"),f(),"}"===s)return h("}"),r;for(;s;){if(e=c(),f(),h(":"),Object.hasOwnProperty.call(r,e)&&l('Duplicate key "'+e+'"'),r[e]=i(),f(),"}"===s)return h("}"),r;h(","),f()}}l("Bad object")};i=function(){switch(f(),s){case"{":return m();case"[":return p();case'"':return c();case"-":return u();default:return s>="0"&&"9">=s?u():d()}},r.exports=function(e,r){var t;return o=e,a=0,s=" ",t=i(),f(),s&&l("Syntax error"),"function"==typeof r?function n(e,t){var a,s,o=e[t];if(o&&"object"==typeof o)for(a in o)Object.prototype.hasOwnProperty.call(o,a)&&(s=n(o,a),void 0!==s?o[a]=s:delete o[a]);return r.call(e,t,o)}({"":t},""):t}},{}],46:[function(e,r,t){function a(e){return l.lastIndex=0,l.test(e)?'"'+e.replace(l,function(e){var r=h[e];return"string"==typeof r?r:"\\u"+("0000"+e.charCodeAt(0).toString(16)).slice(-4)})+'"':'"'+e+'"'}function s(e,r){var t,l,h,u,c,f=o,d=r[e];switch(d&&"object"==typeof d&&"function"==typeof d.toJSON&&(d=d.toJSON(e)),"function"==typeof n&&(d=n.call(r,e,d)),typeof d){case"string":return a(d);case"number":return isFinite(d)?String(d):"null";case"boolean":case"null":return String(d);case"object":if(!d)return"null";if(o+=i,c=[],"[object Array]"===Object.prototype.toString.apply(d)){for(u=d.length,t=0;u>t;t+=1)c[t]=s(t,d)||"null";return h=0===c.length?"[]":o?"[\n"+o+c.join(",\n"+o)+"\n"+f+"]":"["+c.join(",")+"]",o=f,h}if(n&&"object"==typeof n)for(u=n.length,t=0;u>t;t+=1)l=n[t],"string"==typeof l&&(h=s(l,d),h&&c.push(a(l)+(o?": ":":")+h));else for(l in d)Object.prototype.hasOwnProperty.call(d,l)&&(h=s(l,d),h&&c.push(a(l)+(o?": ":":")+h));return h=0===c.length?"{}":o?"{\n"+o+c.join(",\n"+o)+"\n"+f+"}":"{"+c.join(",")+"}",o=f,h}}var o,i,n,l=/[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,h={"\b":"\\b","	":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"};r.exports=function(e,r,t){var a;if(o="",i="","number"==typeof t)for(a=0;t>a;a+=1)i+=" ";else"string"==typeof t&&(i=t);if(n=r,r&&"function"!=typeof r&&("object"!=typeof r||"number"!=typeof r.length))throw new Error("JSON.stringify");return s("",{"":e})}},{}],ajv:[function(e,r,t){"use strict";function a(e){return d.test(e)}function Ajv(r){function t(e,r){var t;if("string"==typeof e){if(t=P(e),!t)throw new Error('no schema with key or ref "'+e+'"')}else{var a=E(e);t=a.validate||j(a)}var s=t(r);return O.errors=t.errors,s}function p(e){var r=E(e);return r.validate||j(r)}function m(e,r,t,a){if(Array.isArray(e))for(var s=0;e.length>s;s++)m(e[s]);else{r=o.normalizeId(r||e.id),w(r);var i=O._schemas[r]=E(e,t,!0);i.meta=a}}function v(e,r,t){m(e,r,t,!0)}function y(e,r){var s=e.$schema||(O.opts.v5?c.META_SCHEMA_ID:f),o=O._formats.uri;O._formats.uri="function"==typeof o?a:d;var i=t(s,e);if(O._formats.uri=o,!i&&r){var n="schema is invalid:"+$();if("log"!=O.opts.validateSchema)throw new Error(n);console.error(n)}return i}function P(e){var r=g(e);switch(typeof r){case"object":return r.validate||j(r);case"string":return P(r)}}function g(e){return e=o.normalizeId(e),O._schemas[e]||O._refs[e]}function b(e){switch(typeof e){case"string":var r=g(e);O._cache.del(r.jsonStr),delete O._schemas[e],delete O._refs[e];break;case"object":var t=l(e);O._cache.del(t);var a=e.id;a&&(a=o.normalizeId(a),delete O._refs[a])}}function E(e,r,t){if("object"!=typeof e)throw new Error("schema should be object");var a=l(e),s=O._cache.get(a);if(s)return s;t=t||O.opts.addUsedSchema!==!1;var i=o.normalizeId(e.id);i&&t&&w(i),O.opts.validateSchema===!1||r||y(e,!0);var h=o.ids.call(O,e),u=new n({id:i,schema:e,localRefs:h,jsonStr:a});return"#"!=i[0]&&t&&(O._refs[i]=u),O._cache.put(a,u),u}function j(e,r){function t(){var r=e.validate,a=r.apply(null,arguments);return t.errors=r.errors,a}if(e.compiling)return e.validate=t,t.schema=e.schema,t.errors=null,t.root=r?r:t,t;e.compiling=!0;var a=O.opts.removeAdditional,o=O.opts.useDefaults;e.meta&&(a&&(O.opts.removeAdditional=!1),o&&(O.opts.useDefaults=!1));var i;try{i=s.call(O,e.schema,r,e.localRefs)}finally{e.compiling=!1,a&&(O.opts.removeAdditional=a),o&&(O.opts.useDefaults=o)}return e.validate=i,e.refs=i.refs,e.refVal=i.refVal,e.root=i.root,i}function $(e,r){if(e=e||O.errors,!e)return"No errors";r=r||{};for(var t=r.separator||", ",a=r.dataVar||"data",s="",o=0;e.length>o;o++){var i=e[o];i&&(s+=a+i.dataPath+" "+i.message+t)}return s.slice(0,-t.length)}function x(e,r){"string"==typeof r&&(r=new RegExp(r)),O._formats[e]=r}function R(){if(O.opts.meta!==!1){var r=e("./refs/json-schema-draft-04.json");v(r,f,!0),O._refs["http://json-schema.org/schema"]=f}var t=O.opts.schemas;if(t)if(Array.isArray(t))m(t);else for(var a in t)m(t[a],a)}function S(){for(var e in O.opts.formats){var r=O.opts.formats[e];x(e,r)}}function w(e){if(O._schemas[e]||O._refs[e])throw new Error('schema with key or id "'+e+'" already exists')}if(!(this instanceof Ajv))return new Ajv(r);var O=this;this.opts=r||{},this._schemas={},this._refs={},this._formats=h(this.opts.format),this._cache=this.opts.cache||new i,this._loadingSchemas={},this.RULES=u(),this.validate=t,this.compile=p,this.addSchema=m,this.addMetaSchema=v,this.validateSchema=y,this.getSchema=P,this.removeSchema=b,this.addFormat=x,this.errorsText=$,this._addSchema=E,this._compile=j,R(),this.opts.formats&&S(),"property"==this.opts.errorDataPath&&(this.opts._errorDataPathProperty=!0),this.opts.v5&&c.enable(this),this.opts.loopRequired=this.opts.loopRequired||1/0}var s=e("./compile"),o=e("./compile/resolve"),i=e("./cache"),n=e("./compile/schema_obj"),l=e("json-stable-stringify"),h=e("./compile/formats"),u=e("./compile/rules"),c=e("./v5");r.exports=Ajv,Ajv.prototype.compileAsync=e("./async"),Ajv.prototype.addKeyword=e("./keyword");var f="http://json-schema.org/draft-04/schema",d=/^(?:(?:[a-z][a-z0-9+-.]*:)?\/\/)?[^\s]*$/i},{"./async":7,"./cache":8,"./compile":12,"./compile/formats":11,"./compile/resolve":13,"./compile/rules":14,"./compile/schema_obj":15,"./keyword":39,"./refs/json-schema-draft-04.json":40,"./v5":42,"json-stable-stringify":43}]},{},[])("ajv")});
+/* ajv 6.12.3: Another JSON Schema Validator */
+!function(e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).Ajv=e()}(function(){return function o(i,n,l){function c(r,e){if(!n[r]){if(!i[r]){var t="function"==typeof require&&require;if(!e&&t)return t(r,!0);if(u)return u(r,!0);var a=new Error("Cannot find module '"+r+"'");throw a.code="MODULE_NOT_FOUND",a}var s=n[r]={exports:{}};i[r][0].call(s.exports,function(e){return c(i[r][1][e]||e)},s,s.exports,o,i,n,l)}return n[r].exports}for(var u="function"==typeof require&&require,e=0;e<l.length;e++)c(l[e]);return c}({1:[function(e,r,t){"use strict";var a=r.exports=function(){this._cache={}};a.prototype.put=function(e,r){this._cache[e]=r},a.prototype.get=function(e){return this._cache[e]},a.prototype.del=function(e){delete this._cache[e]},a.prototype.clear=function(){this._cache={}}},{}],2:[function(e,r,t){"use strict";var a=e("./error_classes").MissingRef;function s(r,n,t){var l=this;if("function"!=typeof this._opts.loadSchema)throw new Error("options.loadSchema should be a function");"function"==typeof n&&(t=n,n=void 0);var e=c(r).then(function(){var e=l._addSchema(r,void 0,n);return e.validate||function o(i){try{return l._compile(i)}catch(e){if(e instanceof a)return r(e);throw e}function r(e){var r=e.missingSchema;if(s(r))throw new Error("Schema "+r+" is loaded but "+e.missingRef+" cannot be resolved");var t=l._loadingSchemas[r];return t||(t=l._loadingSchemas[r]=l._opts.loadSchema(r)).then(a,a),t.then(function(e){if(!s(r))return c(e).then(function(){s(r)||l.addSchema(e,r,void 0,n)})}).then(function(){return o(i)});function a(){delete l._loadingSchemas[r]}function s(e){return l._refs[e]||l._schemas[e]}}}(e)});return t&&e.then(function(e){t(null,e)},t),e;function c(e){var r=e.$schema;return r&&!l.getSchema(r)?s.call(l,{$ref:r},!0):Promise.resolve()}}r.exports=s},{"./error_classes":3}],3:[function(e,r,t){"use strict";var a=e("./resolve");function s(e,r,t){this.message=t||s.message(e,r),this.missingRef=a.url(e,r),this.missingSchema=a.normalizeId(a.fullPath(this.missingRef))}function o(e){return e.prototype=Object.create(Error.prototype),e.prototype.constructor=e}r.exports={Validation:o(function(e){this.message="validation failed",this.errors=e,this.ajv=this.validation=!0}),MissingRef:o(s)},s.message=function(e,r){return"can't resolve reference "+r+" from id "+e}},{"./resolve":6}],4:[function(e,r,t){"use strict";var a=e("./util"),o=/^(\d\d\d\d)-(\d\d)-(\d\d)$/,i=[0,31,28,31,30,31,30,31,31,30,31,30,31],n=/^(\d\d):(\d\d):(\d\d)(\.\d+)?(z|[+-]\d\d(?::?\d\d)?)?$/i,s=/^(?=.{1,253}\.?$)[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[-0-9a-z]{0,61}[0-9a-z])?)*\.?$/i,l=/^(?:[a-z][a-z0-9+\-.]*:)(?:\/?\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:]|%[0-9a-f]{2})*@)?(?:\[(?:(?:(?:(?:[0-9a-f]{1,4}:){6}|::(?:[0-9a-f]{1,4}:){5}|(?:[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){4}|(?:(?:[0-9a-f]{1,4}:){0,1}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){3}|(?:(?:[0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){2}|(?:(?:[0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:|(?:(?:[0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::)(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?))|(?:(?:[0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(?:(?:[0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::)|[Vv][0-9a-f]+\.[a-z0-9\-._~!$&'()*+,;=:]+)\]|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)|(?:[a-z0-9\-._~!$&'()*+,;=]|%[0-9a-f]{2})*)(?::\d*)?(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*|\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*)?|(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*)(?:\?(?:[a-z0-9\-._~!$&'()*+,;=:@/?]|%[0-9a-f]{2})*)?(?:#(?:[a-z0-9\-._~!$&'()*+,;=:@/?]|%[0-9a-f]{2})*)?$/i,c=/^(?:(?:[^\x00-\x20"'<>%\\^`{|}]|%[0-9a-f]{2})|\{[+#./;?&=,!@|]?(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?(?:,(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?)*\})*$/i,u=/^(?:(?:http[s\u017F]?|ftp):\/\/)(?:(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+(?::(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*)?@)?(?:(?!10(?:\.[0-9]{1,3}){3})(?!127(?:\.[0-9]{1,3}){3})(?!169\.254(?:\.[0-9]{1,3}){2})(?!192\.168(?:\.[0-9]{1,3}){2})(?!172\.(?:1[6-9]|2[0-9]|3[01])(?:\.[0-9]{1,3}){2})(?:[1-9][0-9]?|1[0-9][0-9]|2[01][0-9]|22[0-3])(?:\.(?:1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])){2}(?:\.(?:[1-9][0-9]?|1[0-9][0-9]|2[0-4][0-9]|25[0-4]))|(?:(?:(?:[0-9KSa-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+-?)*(?:[0-9KSa-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+)(?:\.(?:(?:[0-9KSa-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+-?)*(?:[0-9KSa-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+)*(?:\.(?:(?:[KSa-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]){2,})))(?::[0-9]{2,5})?(?:\/(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*)?$/i,h=/^(?:urn:uuid:)?[0-9a-f]{8}-(?:[0-9a-f]{4}-){3}[0-9a-f]{12}$/i,d=/^(?:\/(?:[^~/]|~0|~1)*)*$/,p=/^#(?:\/(?:[a-z0-9_\-.!$&'()*+,;:=@]|%[0-9a-f]{2}|~0|~1)*)*$/i,f=/^(?:0|[1-9][0-9]*)(?:#|(?:\/(?:[^~/]|~0|~1)*)*)$/;function m(e){return a.copy(m[e="full"==e?"full":"fast"])}function v(e){var r=e.match(o);if(!r)return!1;var t,a=+r[2],s=+r[3];return 1<=a&&a<=12&&1<=s&&s<=(2!=a||((t=+r[1])%4!=0||t%100==0&&t%400!=0)?i[a]:29)}function y(e,r){var t=e.match(n);if(!t)return!1;var a=t[1],s=t[2],o=t[3];return(a<=23&&s<=59&&o<=59||23==a&&59==s&&60==o)&&(!r||t[5])}(r.exports=m).fast={date:/^\d\d\d\d-[0-1]\d-[0-3]\d$/,time:/^(?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)?$/i,"date-time":/^\d\d\d\d-[0-1]\d-[0-3]\d[t\s](?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)$/i,uri:/^(?:[a-z][a-z0-9+-.]*:)(?:\/?\/)?[^\s]*$/i,"uri-reference":/^(?:(?:[a-z][a-z0-9+-.]*:)?\/?\/)?(?:[^\\\s#][^\s#]*)?(?:#[^\\\s]*)?$/i,"uri-template":c,url:u,email:/^[a-z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*$/i,hostname:s,ipv4:/^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$/,ipv6:/^\s*(?:(?:(?:[0-9a-f]{1,4}:){7}(?:[0-9a-f]{1,4}|:))|(?:(?:[0-9a-f]{1,4}:){6}(?::[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){5}(?:(?:(?::[0-9a-f]{1,4}){1,2})|:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){4}(?:(?:(?::[0-9a-f]{1,4}){1,3})|(?:(?::[0-9a-f]{1,4})?:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){3}(?:(?:(?::[0-9a-f]{1,4}){1,4})|(?:(?::[0-9a-f]{1,4}){0,2}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){2}(?:(?:(?::[0-9a-f]{1,4}){1,5})|(?:(?::[0-9a-f]{1,4}){0,3}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){1}(?:(?:(?::[0-9a-f]{1,4}){1,6})|(?:(?::[0-9a-f]{1,4}){0,4}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?::(?:(?:(?::[0-9a-f]{1,4}){1,7})|(?:(?::[0-9a-f]{1,4}){0,5}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(?:%.+)?\s*$/i,regex:w,uuid:h,"json-pointer":d,"json-pointer-uri-fragment":p,"relative-json-pointer":f},m.full={date:v,time:y,"date-time":function(e){var r=e.split(g);return 2==r.length&&v(r[0])&&y(r[1],!0)},uri:function(e){return P.test(e)&&l.test(e)},"uri-reference":/^(?:[a-z][a-z0-9+\-.]*:)?(?:\/?\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:]|%[0-9a-f]{2})*@)?(?:\[(?:(?:(?:(?:[0-9a-f]{1,4}:){6}|::(?:[0-9a-f]{1,4}:){5}|(?:[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){4}|(?:(?:[0-9a-f]{1,4}:){0,1}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){3}|(?:(?:[0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){2}|(?:(?:[0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:|(?:(?:[0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::)(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?))|(?:(?:[0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(?:(?:[0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::)|[Vv][0-9a-f]+\.[a-z0-9\-._~!$&'()*+,;=:]+)\]|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)|(?:[a-z0-9\-._~!$&'"()*+,;=]|%[0-9a-f]{2})*)(?::\d*)?(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*|\/(?:(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*)?|(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*)?(?:\?(?:[a-z0-9\-._~!$&'"()*+,;=:@/?]|%[0-9a-f]{2})*)?(?:#(?:[a-z0-9\-._~!$&'"()*+,;=:@/?]|%[0-9a-f]{2})*)?$/i,"uri-template":c,url:u,email:/^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i,hostname:s,ipv4:/^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$/,ipv6:/^\s*(?:(?:(?:[0-9a-f]{1,4}:){7}(?:[0-9a-f]{1,4}|:))|(?:(?:[0-9a-f]{1,4}:){6}(?::[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){5}(?:(?:(?::[0-9a-f]{1,4}){1,2})|:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){4}(?:(?:(?::[0-9a-f]{1,4}){1,3})|(?:(?::[0-9a-f]{1,4})?:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){3}(?:(?:(?::[0-9a-f]{1,4}){1,4})|(?:(?::[0-9a-f]{1,4}){0,2}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){2}(?:(?:(?::[0-9a-f]{1,4}){1,5})|(?:(?::[0-9a-f]{1,4}){0,3}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){1}(?:(?:(?::[0-9a-f]{1,4}){1,6})|(?:(?::[0-9a-f]{1,4}){0,4}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?::(?:(?:(?::[0-9a-f]{1,4}){1,7})|(?:(?::[0-9a-f]{1,4}){0,5}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(?:%.+)?\s*$/i,regex:w,uuid:h,"json-pointer":d,"json-pointer-uri-fragment":p,"relative-json-pointer":f};var g=/t|\s/i;var P=/\/|:/;var E=/[^\\]\\Z/;function w(e){if(E.test(e))return!1;try{return new RegExp(e),!0}catch(e){return!1}}},{"./util":10}],5:[function(e,r,t){"use strict";var R=e("./resolve"),$=e("./util"),j=e("./error_classes"),D=e("fast-json-stable-stringify"),O=e("../dotjs/validate"),I=$.ucs2length,A=e("fast-deep-equal"),k=j.Validation;function C(e,c,u,r){var d=this,p=this._opts,h=[void 0],f={},l=[],t={},m=[],a={},v=[],s=function(e,r,t){var a=L.call(this,e,r,t);return 0<=a?{index:a,compiling:!0}:{index:a=this._compilations.length,compiling:!(this._compilations[a]={schema:e,root:r,baseId:t})}}.call(this,e,c=c||{schema:e,refVal:h,refs:f},r),o=this._compilations[s.index];if(s.compiling)return o.callValidate=P;var y=this._formats,g=this.RULES;try{var i=E(e,c,u,r);o.validate=i;var n=o.callValidate;return n&&(n.schema=i.schema,n.errors=null,n.refs=i.refs,n.refVal=i.refVal,n.root=i.root,n.$async=i.$async,p.sourceCode&&(n.source=i.source)),i}finally{(function(e,r,t){var a=L.call(this,e,r,t);0<=a&&this._compilations.splice(a,1)}).call(this,e,c,r)}function P(){var e=o.validate,r=e.apply(this,arguments);return P.errors=e.errors,r}function E(e,r,t,a){var s=!r||r&&r.schema==e;if(r.schema!=c.schema)return C.call(d,e,r,t,a);var o=!0===e.$async,i=O({isTop:!0,schema:e,isRoot:s,baseId:a,root:r,schemaPath:"",errSchemaPath:"#",errorPath:'""',MissingRefError:j.MissingRef,RULES:g,validate:O,util:$,resolve:R,resolveRef:w,usePattern:_,useDefault:F,useCustomRule:x,opts:p,formats:y,logger:d.logger,self:d}),i=Q(h,T)+Q(l,N)+Q(m,z)+Q(v,q)+i;p.processCode&&(i=p.processCode(i,e));try{var n=new Function("self","RULES","formats","root","refVal","defaults","customRules","equal","ucs2length","ValidationError",i)(d,g,y,c,h,m,v,A,I,k);h[0]=n}catch(e){throw d.logger.error("Error compiling schema, function code:",i),e}return n.schema=e,n.errors=null,n.refs=f,n.refVal=h,n.root=s?n:r,o&&(n.$async=!0),!0===p.sourceCode&&(n.source={code:i,patterns:l,defaults:m}),n}function w(e,r,t){r=R.url(e,r);var a,s,o=f[r];if(void 0!==o)return S(a=h[o],s="refVal["+o+"]");if(!t&&c.refs){var i=c.refs[r];if(void 0!==i)return S(a=c.refVal[i],s=b(r,a))}s=b(r);var n,l=R.call(d,E,c,r);if(void 0!==l||(n=u&&u[r])&&(l=R.inlineRef(n,p.inlineRefs)?n:C.call(d,n,c,u,e)),void 0!==l)return S(h[f[r]]=l,s);delete f[r]}function b(e,r){var t=h.length;return h[t]=r,"refVal"+(f[e]=t)}function S(e,r){return"object"==typeof e||"boolean"==typeof e?{code:r,schema:e,inline:!0}:{code:r,$async:e&&!!e.$async}}function _(e){var r=t[e];return void 0===r&&(r=t[e]=l.length,l[r]=e),"pattern"+r}function F(e){switch(typeof e){case"boolean":case"number":return""+e;case"string":return $.toQuotedString(e);case"object":if(null===e)return"null";var r=D(e),t=a[r];return void 0===t&&(t=a[r]=m.length,m[t]=e),"default"+t}}function x(e,r,t,a){if(!1!==d._opts.validateSchema){var s=e.definition.dependencies;if(s&&!s.every(function(e){return Object.prototype.hasOwnProperty.call(t,e)}))throw new Error("parent schema must have all required keywords: "+s.join(","));var o=e.definition.validateSchema;if(o)if(!o(r)){var i="keyword schema is invalid: "+d.errorsText(o.errors);if("log"!=d._opts.validateSchema)throw new Error(i);d.logger.error(i)}}var n,l=e.definition.compile,c=e.definition.inline,u=e.definition.macro;if(l)n=l.call(d,r,t,a);else if(u)n=u.call(d,r,t,a),!1!==p.validateSchema&&d.validateSchema(n,!0);else if(c)n=c.call(d,a,e.keyword,r,t);else if(!(n=e.definition.validate))return;if(void 0===n)throw new Error('custom keyword "'+e.keyword+'"failed to compile');var h=v.length;return{code:"customRule"+h,validate:v[h]=n}}}function L(e,r,t){for(var a=0;a<this._compilations.length;a++){var s=this._compilations[a];if(s.schema==e&&s.root==r&&s.baseId==t)return a}return-1}function N(e,r){return"var pattern"+e+" = new RegExp("+$.toQuotedString(r[e])+");"}function z(e){return"var default"+e+" = defaults["+e+"];"}function T(e,r){return void 0===r[e]?"":"var refVal"+e+" = refVal["+e+"];"}function q(e){return"var customRule"+e+" = customRules["+e+"];"}function Q(e,r){if(!e.length)return"";for(var t="",a=0;a<e.length;a++)t+=r(a,e);return t}r.exports=C},{"../dotjs/validate":38,"./error_classes":3,"./resolve":6,"./util":10,"fast-deep-equal":42,"fast-json-stable-stringify":43}],6:[function(e,r,t){"use strict";var m=e("uri-js"),v=e("fast-deep-equal"),y=e("./util"),l=e("./schema_obj"),a=e("json-schema-traverse");function c(e,r,t){var a=this._refs[t];if("string"==typeof a){if(!this._refs[a])return c.call(this,e,r,a);a=this._refs[a]}if((a=a||this._schemas[t])instanceof l)return d(a.schema,this._opts.inlineRefs)?a.schema:a.validate||this._compile(a);var s,o,i,n=u.call(this,r,t);return n&&(s=n.schema,r=n.root,i=n.baseId),s instanceof l?o=s.validate||e.call(this,s.schema,r,void 0,i):void 0!==s&&(o=d(s,this._opts.inlineRefs)?s:e.call(this,s,r,void 0,i)),o}function u(e,r){var t=m.parse(r),a=p(t),s=g(this._getId(e.schema));if(0===Object.keys(e.schema).length||a!==s){var o=P(a),i=this._refs[o];if("string"==typeof i)return function(e,r,t){var a=u.call(this,e,r);if(a){var s=a.schema,o=a.baseId;e=a.root;var i=this._getId(s);return i&&(o=f(o,i)),n.call(this,t,o,s,e)}}.call(this,e,i,t);if(i instanceof l)i.validate||this._compile(i),e=i;else{if(!((i=this._schemas[o])instanceof l))return;if(i.validate||this._compile(i),o==P(r))return{schema:i,root:e,baseId:s};e=i}if(!e.schema)return;s=g(this._getId(e.schema))}return n.call(this,t,s,e.schema,e)}(r.exports=c).normalizeId=P,c.fullPath=g,c.url=f,c.ids=function(e){var r=P(this._getId(e)),h={"":r},d={"":g(r,!1)},p={},f=this;return a(e,{allKeys:!0},function(e,r,t,a,s,o,i){if(""!==r){var n=f._getId(e),l=h[a],c=d[a]+"/"+s;if(void 0!==i&&(c+="/"+("number"==typeof i?i:y.escapeFragment(i))),"string"==typeof n){n=l=P(l?m.resolve(l,n):n);var u=f._refs[n];if("string"==typeof u&&(u=f._refs[u]),u&&u.schema){if(!v(e,u.schema))throw new Error('id "'+n+'" resolves to more than one schema')}else if(n!=P(c))if("#"==n[0]){if(p[n]&&!v(e,p[n]))throw new Error('id "'+n+'" resolves to more than one schema');p[n]=e}else f._refs[n]=c}h[r]=l,d[r]=c}}),p},c.inlineRef=d,c.schema=u;var h=y.toHash(["properties","patternProperties","enum","dependencies","definitions"]);function n(e,r,t,a){if(e.fragment=e.fragment||"","/"==e.fragment.slice(0,1)){for(var s=e.fragment.split("/"),o=1;o<s.length;o++){var i,n,l,c=s[o];if(c){if(void 0===(t=t[c=y.unescapeFragment(c)]))break;h[c]||((l=this._getId(t))&&(r=f(r,l)),t.$ref&&(i=f(r,t.$ref),(n=u.call(this,a,i))&&(t=n.schema,a=n.root,r=n.baseId)))}}return void 0!==t&&t!==a.schema?{schema:t,root:a,baseId:r}:void 0}}var i=y.toHash(["type","format","pattern","maxLength","minLength","maxProperties","minProperties","maxItems","minItems","maximum","minimum","uniqueItems","multipleOf","required","enum"]);function d(e,r){return!1!==r&&(void 0===r||!0===r?function e(r){var t;if(Array.isArray(r)){for(var a=0;a<r.length;a++)if("object"==typeof(t=r[a])&&!e(t))return!1}else for(var s in r){if("$ref"==s)return!1;if("object"==typeof(t=r[s])&&!e(t))return!1}return!0}(e):r?function e(r){var t,a=0;if(Array.isArray(r)){for(var s=0;s<r.length;s++)if("object"==typeof(t=r[s])&&(a+=e(t)),a==1/0)return 1/0}else for(var o in r){if("$ref"==o)return 1/0;if(i[o])a++;else if("object"==typeof(t=r[o])&&(a+=e(t)+1),a==1/0)return 1/0}return a}(e)<=r:void 0)}function g(e,r){return!1!==r&&(e=P(e)),p(m.parse(e))}function p(e){return m.serialize(e).split("#")[0]+"#"}var s=/#\/?$/;function P(e){return e?e.replace(s,""):""}function f(e,r){return r=P(r),m.resolve(e,r)}},{"./schema_obj":8,"./util":10,"fast-deep-equal":42,"json-schema-traverse":44,"uri-js":45}],7:[function(e,r,t){"use strict";var o=e("../dotjs"),i=e("./util").toHash;r.exports=function(){var a=[{type:"number",rules:[{maximum:["exclusiveMaximum"]},{minimum:["exclusiveMinimum"]},"multipleOf","format"]},{type:"string",rules:["maxLength","minLength","pattern","format"]},{type:"array",rules:["maxItems","minItems","items","contains","uniqueItems"]},{type:"object",rules:["maxProperties","minProperties","required","dependencies","propertyNames",{properties:["additionalProperties","patternProperties"]}]},{rules:["$ref","const","enum","not","anyOf","oneOf","allOf","if"]}],s=["type","$comment"];return a.all=i(s),a.types=i(["number","integer","string","array","object","boolean","null"]),a.forEach(function(e){e.rules=e.rules.map(function(e){var r,t;return"object"==typeof e&&(t=e[r=Object.keys(e)[0]],e=r,t.forEach(function(e){s.push(e),a.all[e]=!0})),s.push(e),a.all[e]={keyword:e,code:o[e],implements:t}}),a.all.$comment={keyword:"$comment",code:o.$comment},e.type&&(a.types[e.type]=e)}),a.keywords=i(s.concat(["$schema","$id","id","$data","$async","title","description","default","definitions","examples","readOnly","writeOnly","contentMediaType","contentEncoding","additionalItems","then","else"])),a.custom={},a}},{"../dotjs":27,"./util":10}],8:[function(e,r,t){"use strict";var a=e("./util");r.exports=function(e){a.copy(e,this)}},{"./util":10}],9:[function(e,r,t){"use strict";r.exports=function(e){for(var r,t=0,a=e.length,s=0;s<a;)t++,55296<=(r=e.charCodeAt(s++))&&r<=56319&&s<a&&56320==(64512&(r=e.charCodeAt(s)))&&s++;return t}},{}],10:[function(e,r,t){"use strict";function i(e,r,t,a){var s=a?" !== ":" === ",o=a?" || ":" && ",i=a?"!":"",n=a?"":"!";switch(e){case"null":return r+s+"null";case"array":return i+"Array.isArray("+r+")";case"object":return"("+i+r+o+"typeof "+r+s+'"object"'+o+n+"Array.isArray("+r+"))";case"integer":return"(typeof "+r+s+'"number"'+o+n+"("+r+" % 1)"+o+r+s+r+(t?o+i+"isFinite("+r+")":"")+")";case"number":return"(typeof "+r+s+'"'+e+'"'+(t?o+i+"isFinite("+r+")":"")+")";default:return"typeof "+r+s+'"'+e+'"'}}r.exports={copy:function(e,r){for(var t in r=r||{},e)r[t]=e[t];return r},checkDataType:i,checkDataTypes:function(e,r,t){switch(e.length){case 1:return i(e[0],r,t,!0);default:var a="",s=n(e);for(var o in s.array&&s.object&&(a=s.null?"(":"(!"+r+" || ",a+="typeof "+r+' !== "object")',delete s.null,delete s.array,delete s.object),s.number&&delete s.integer,s)a+=(a?" && ":"")+i(o,r,t,!0);return a}},coerceToTypes:function(e,r){if(Array.isArray(r)){for(var t=[],a=0;a<r.length;a++){var s=r[a];(o[s]||"array"===e&&"array"===s)&&(t[t.length]=s)}if(t.length)return t}else{if(o[r])return[r];if("array"===e&&"array"===r)return["array"]}},toHash:n,getProperty:h,escapeQuotes:l,equal:e("fast-deep-equal"),ucs2length:e("./ucs2length"),varOccurences:function(e,r){r+="[^0-9]";var t=e.match(new RegExp(r,"g"));return t?t.length:0},varReplace:function(e,r,t){return r+="([^0-9])",t=t.replace(/\$/g,"$$$$"),e.replace(new RegExp(r,"g"),t+"$1")},schemaHasRules:function(e,r){if("boolean"==typeof e)return!e;for(var t in e)if(r[t])return!0},schemaHasRulesExcept:function(e,r,t){if("boolean"==typeof e)return!e&&"not"!=t;for(var a in e)if(a!=t&&r[a])return!0},schemaUnknownRules:function(e,r){if("boolean"==typeof e)return;for(var t in e)if(!r[t])return t},toQuotedString:c,getPathExpr:function(e,r,t,a){return u(e,t?"'/' + "+r+(a?"":".replace(/~/g, '~0').replace(/\\//g, '~1')"):a?"'[' + "+r+" + ']'":"'[\\'' + "+r+" + '\\']'")},getPath:function(e,r,t){var a=c(t?"/"+f(r):h(r));return u(e,a)},getData:function(e,r,t){var a,s,o,i;if(""===e)return"rootData";if("/"==e[0]){if(!d.test(e))throw new Error("Invalid JSON-pointer: "+e);s=e,o="rootData"}else{if(!(i=e.match(p)))throw new Error("Invalid JSON-pointer: "+e);if(a=+i[1],"#"==(s=i[2])){if(r<=a)throw new Error("Cannot access property/index "+a+" levels up, current level is "+r);return t[r-a]}if(r<a)throw new Error("Cannot access data "+a+" levels up, current level is "+r);if(o="data"+(r-a||""),!s)return o}for(var n=o,l=s.split("/"),c=0;c<l.length;c++){var u=l[c];u&&(o+=h(m(u)),n+=" && "+o)}return n},unescapeFragment:function(e){return m(decodeURIComponent(e))},unescapeJsonPointer:m,escapeFragment:function(e){return encodeURIComponent(f(e))},escapeJsonPointer:f};var o=n(["string","number","integer","boolean","null"]);function n(e){for(var r={},t=0;t<e.length;t++)r[e[t]]=!0;return r}var a=/^[a-z$_][a-z$_0-9]*$/i,s=/'|\\/g;function h(e){return"number"==typeof e?"["+e+"]":a.test(e)?"."+e:"['"+l(e)+"']"}function l(e){return e.replace(s,"\\$&").replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/\f/g,"\\f").replace(/\t/g,"\\t")}function c(e){return"'"+l(e)+"'"}var d=/^\/(?:[^~]|~0|~1)*$/,p=/^([0-9]+)(#|\/(?:[^~]|~0|~1)*)?$/;function u(e,r){return'""'==e?r:(e+" + "+r).replace(/([^\\])' \+ '/g,"$1")}function f(e){return e.replace(/~/g,"~0").replace(/\//g,"~1")}function m(e){return e.replace(/~1/g,"/").replace(/~0/g,"~")}},{"./ucs2length":9,"fast-deep-equal":42}],11:[function(e,r,t){"use strict";var l=["multipleOf","maximum","exclusiveMaximum","minimum","exclusiveMinimum","maxLength","minLength","pattern","additionalItems","maxItems","minItems","uniqueItems","maxProperties","minProperties","required","additionalProperties","enum","format","const"];r.exports=function(e,r){for(var t=0;t<r.length;t++){e=JSON.parse(JSON.stringify(e));for(var a=r[t].split("/"),s=e,o=1;o<a.length;o++)s=s[a[o]];for(o=0;o<l.length;o++){var i=l[o],n=s[i];n&&(s[i]={anyOf:[n,{$ref:"https://raw.githubusercontent.com/ajv-validator/ajv/master/lib/refs/data.json#"}]})}}return e}},{}],12:[function(e,r,t){"use strict";var a=e("./refs/json-schema-draft-07.json");r.exports={$id:"https://github.com/ajv-validator/ajv/blob/master/lib/definition_schema.js",definitions:{simpleTypes:a.definitions.simpleTypes},type:"object",dependencies:{schema:["validate"],$data:["validate"],statements:["inline"],valid:{not:{required:["macro"]}}},properties:{type:a.properties.type,schema:{type:"boolean"},statements:{type:"boolean"},dependencies:{type:"array",items:{type:"string"}},metaSchema:{type:"object"},modifying:{type:"boolean"},valid:{type:"boolean"},$data:{type:"boolean"},async:{type:"boolean"},errors:{anyOf:[{type:"boolean"},{const:"full"}]}}}},{"./refs/json-schema-draft-07.json":41}],13:[function(e,r,t){"use strict";r.exports=function(e,r){var t,a,s,o,i,n,l,c=" ",u=e.level,h=e.dataLevel,d=e.schema[r],p=e.schemaPath+e.util.getProperty(r),f=e.errSchemaPath+"/"+r,m=!e.opts.allErrors,v="data"+(h||""),y=e.opts.$data&&d&&d.$data,g=y?(c+=" var schema"+u+" = "+e.util.getData(d.$data,h,e.dataPathArr)+"; ","schema"+u):d,P="maximum"==r,E=P?"exclusiveMaximum":"exclusiveMinimum",w=e.schema[E],b=e.opts.$data&&w&&w.$data,S=P?"<":">",_=P?">":"<",F=void 0;if(!y&&"number"!=typeof d&&void 0!==d)throw new Error(r+" must be number");if(!b&&void 0!==w&&"number"!=typeof w&&"boolean"!=typeof w)throw new Error(E+" must be number or boolean");b?(o="exclIsNumber"+u,i="' + "+(n="op"+u)+" + '",c+=" var schemaExcl"+u+" = "+(t=e.util.getData(w.$data,h,e.dataPathArr))+"; ",F=E,(l=l||[]).push(c+=" var "+(a="exclusive"+u)+"; var "+(s="exclType"+u)+" = typeof "+(t="schemaExcl"+u)+"; if ("+s+" != 'boolean' && "+s+" != 'undefined' && "+s+" != 'number') { "),c="",!1!==e.createErrors?(c+=" { keyword: '"+(F||"_exclusiveLimit")+"' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(f)+" , params: {} ",!1!==e.opts.messages&&(c+=" , message: '"+E+" should be boolean' "),e.opts.verbose&&(c+=" , schema: validate.schema"+p+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+v+" "),c+=" } "):c+=" {} ",x=c,c=l.pop(),c+=!e.compositeRule&&m?e.async?" throw new ValidationError(["+x+"]); ":" validate.errors = ["+x+"]; return false; ":" var err = "+x+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",c+=" } else if ( ",y&&(c+=" ("+g+" !== undefined && typeof "+g+" != 'number') || "),c+=" "+s+" == 'number' ? ( ("+a+" = "+g+" === undefined || "+t+" "+S+"= "+g+") ? "+v+" "+_+"= "+t+" : "+v+" "+_+" "+g+" ) : ( ("+a+" = "+t+" === true) ? "+v+" "+_+"= "+g+" : "+v+" "+_+" "+g+" ) || "+v+" !== "+v+") { var op"+u+" = "+a+" ? '"+S+"' : '"+S+"='; ",void 0===d&&(f=e.errSchemaPath+"/"+(F=E),g=t,y=b)):(i=S,(o="number"==typeof w)&&y?(n="'"+i+"'",c+=" if ( ",y&&(c+=" ("+g+" !== undefined && typeof "+g+" != 'number') || "),c+=" ( "+g+" === undefined || "+w+" "+S+"= "+g+" ? "+v+" "+_+"= "+w+" : "+v+" "+_+" "+g+" ) || "+v+" !== "+v+") { "):(o&&void 0===d?(a=!0,f=e.errSchemaPath+"/"+(F=E),g=w,_+="="):(o&&(g=Math[P?"min":"max"](w,d)),w===(!o||g)?(a=!0,f=e.errSchemaPath+"/"+(F=E),_+="="):(a=!1,i+="=")),n="'"+i+"'",c+=" if ( ",y&&(c+=" ("+g+" !== undefined && typeof "+g+" != 'number') || "),c+=" "+v+" "+_+" "+g+" || "+v+" !== "+v+") { ")),F=F||r,(l=l||[]).push(c),c="",!1!==e.createErrors?(c+=" { keyword: '"+(F||"_limit")+"' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(f)+" , params: { comparison: "+n+", limit: "+g+", exclusive: "+a+" } ",!1!==e.opts.messages&&(c+=" , message: 'should be "+i+" ",c+=y?"' + "+g:g+"'"),e.opts.verbose&&(c+=" , schema:  ",c+=y?"validate.schema"+p:""+d,c+="         , parentSchema: validate.schema"+e.schemaPath+" , data: "+v+" "),c+=" } "):c+=" {} ";var x=c;return c=l.pop(),c+=!e.compositeRule&&m?e.async?" throw new ValidationError(["+x+"]); ":" validate.errors = ["+x+"]; return false; ":" var err = "+x+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",c+=" } ",m&&(c+=" else { "),c}},{}],14:[function(e,r,t){"use strict";r.exports=function(e,r){var t=" ",a=e.level,s=e.dataLevel,o=e.schema[r],i=e.schemaPath+e.util.getProperty(r),n=e.errSchemaPath+"/"+r,l=!e.opts.allErrors,c="data"+(s||""),u=e.opts.$data&&o&&o.$data,h=u?(t+=" var schema"+a+" = "+e.util.getData(o.$data,s,e.dataPathArr)+"; ","schema"+a):o;if(!u&&"number"!=typeof o)throw new Error(r+" must be number");t+="if ( ",u&&(t+=" ("+h+" !== undefined && typeof "+h+" != 'number') || ");var d=r,p=p||[];p.push(t+=" "+c+".length "+("maxItems"==r?">":"<")+" "+h+") { "),t="",!1!==e.createErrors?(t+=" { keyword: '"+(d||"_limitItems")+"' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(n)+" , params: { limit: "+h+" } ",!1!==e.opts.messages&&(t+=" , message: 'should NOT have ",t+="maxItems"==r?"more":"fewer",t+=" than ",t+=u?"' + "+h+" + '":""+o,t+=" items' "),e.opts.verbose&&(t+=" , schema:  ",t+=u?"validate.schema"+i:""+o,t+="         , parentSchema: validate.schema"+e.schemaPath+" , data: "+c+" "),t+=" } "):t+=" {} ";var f=t,t=p.pop();return t+=!e.compositeRule&&l?e.async?" throw new ValidationError(["+f+"]); ":" validate.errors = ["+f+"]; return false; ":" var err = "+f+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",t+="} ",l&&(t+=" else { "),t}},{}],15:[function(e,r,t){"use strict";r.exports=function(e,r){var t=" ",a=e.level,s=e.dataLevel,o=e.schema[r],i=e.schemaPath+e.util.getProperty(r),n=e.errSchemaPath+"/"+r,l=!e.opts.allErrors,c="data"+(s||""),u=e.opts.$data&&o&&o.$data,h=u?(t+=" var schema"+a+" = "+e.util.getData(o.$data,s,e.dataPathArr)+"; ","schema"+a):o;if(!u&&"number"!=typeof o)throw new Error(r+" must be number");t+="if ( ",u&&(t+=" ("+h+" !== undefined && typeof "+h+" != 'number') || "),t+=!1===e.opts.unicode?" "+c+".length ":" ucs2length("+c+") ";var d=r,p=p||[];p.push(t+=" "+("maxLength"==r?">":"<")+" "+h+") { "),t="",!1!==e.createErrors?(t+=" { keyword: '"+(d||"_limitLength")+"' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(n)+" , params: { limit: "+h+" } ",!1!==e.opts.messages&&(t+=" , message: 'should NOT be ",t+="maxLength"==r?"longer":"shorter",t+=" than ",t+=u?"' + "+h+" + '":""+o,t+=" characters' "),e.opts.verbose&&(t+=" , schema:  ",t+=u?"validate.schema"+i:""+o,t+="         , parentSchema: validate.schema"+e.schemaPath+" , data: "+c+" "),t+=" } "):t+=" {} ";var f=t,t=p.pop();return t+=!e.compositeRule&&l?e.async?" throw new ValidationError(["+f+"]); ":" validate.errors = ["+f+"]; return false; ":" var err = "+f+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",t+="} ",l&&(t+=" else { "),t}},{}],16:[function(e,r,t){"use strict";r.exports=function(e,r){var t=" ",a=e.level,s=e.dataLevel,o=e.schema[r],i=e.schemaPath+e.util.getProperty(r),n=e.errSchemaPath+"/"+r,l=!e.opts.allErrors,c="data"+(s||""),u=e.opts.$data&&o&&o.$data,h=u?(t+=" var schema"+a+" = "+e.util.getData(o.$data,s,e.dataPathArr)+"; ","schema"+a):o;if(!u&&"number"!=typeof o)throw new Error(r+" must be number");t+="if ( ",u&&(t+=" ("+h+" !== undefined && typeof "+h+" != 'number') || ");var d=r,p=p||[];p.push(t+=" Object.keys("+c+").length "+("maxProperties"==r?">":"<")+" "+h+") { "),t="",!1!==e.createErrors?(t+=" { keyword: '"+(d||"_limitProperties")+"' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(n)+" , params: { limit: "+h+" } ",!1!==e.opts.messages&&(t+=" , message: 'should NOT have ",t+="maxProperties"==r?"more":"fewer",t+=" than ",t+=u?"' + "+h+" + '":""+o,t+=" properties' "),e.opts.verbose&&(t+=" , schema:  ",t+=u?"validate.schema"+i:""+o,t+="         , parentSchema: validate.schema"+e.schemaPath+" , data: "+c+" "),t+=" } "):t+=" {} ";var f=t,t=p.pop();return t+=!e.compositeRule&&l?e.async?" throw new ValidationError(["+f+"]); ":" validate.errors = ["+f+"]; return false; ":" var err = "+f+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",t+="} ",l&&(t+=" else { "),t}},{}],17:[function(e,r,t){"use strict";r.exports=function(e,r){var t=" ",a=e.schema[r],s=e.schemaPath+e.util.getProperty(r),o=e.errSchemaPath+"/"+r,i=!e.opts.allErrors,n=e.util.copy(e),l="";n.level++;var c="valid"+n.level,u=n.baseId,h=!0,d=a;if(d)for(var p,f=-1,m=d.length-1;f<m;)p=d[f+=1],(e.opts.strictKeywords?"object"==typeof p&&0<Object.keys(p).length:e.util.schemaHasRules(p,e.RULES.all))&&(h=!1,n.schema=p,n.schemaPath=s+"["+f+"]",n.errSchemaPath=o+"/"+f,t+="  "+e.validate(n)+" ",n.baseId=u,i&&(t+=" if ("+c+") { ",l+="}"));return i&&(t+=h?" if (true) { ":" "+l.slice(0,-1)+" "),t}},{}],18:[function(e,r,t){"use strict";r.exports=function(r,e){var t=" ",a=r.level,s=r.dataLevel,o=r.schema[e],i=r.schemaPath+r.util.getProperty(e),n=r.errSchemaPath+"/"+e,l=!r.opts.allErrors,c="data"+(s||""),u="valid"+a,h="errs__"+a,d=r.util.copy(r),p="";d.level++;var f="valid"+d.level;if(o.every(function(e){return r.opts.strictKeywords?"object"==typeof e&&0<Object.keys(e).length:r.util.schemaHasRules(e,r.RULES.all)})){var m=d.baseId;t+=" var "+h+" = errors; var "+u+" = false;  ";var v=r.compositeRule;r.compositeRule=d.compositeRule=!0;var y=o;if(y)for(var g,P=-1,E=y.length-1;P<E;)g=y[P+=1],d.schema=g,d.schemaPath=i+"["+P+"]",d.errSchemaPath=n+"/"+P,t+="  "+r.validate(d)+" ",d.baseId=m,t+=" "+u+" = "+u+" || "+f+"; if (!"+u+") { ",p+="}";r.compositeRule=d.compositeRule=v,t+=" "+p+" if (!"+u+") {   var err =   ",!1!==r.createErrors?(t+=" { keyword: 'anyOf' , dataPath: (dataPath || '') + "+r.errorPath+" , schemaPath: "+r.util.toQuotedString(n)+" , params: {} ",!1!==r.opts.messages&&(t+=" , message: 'should match some schema in anyOf' "),r.opts.verbose&&(t+=" , schema: validate.schema"+i+" , parentSchema: validate.schema"+r.schemaPath+" , data: "+c+" "),t+=" } "):t+=" {} ",t+=";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",!r.compositeRule&&l&&(t+=r.async?" throw new ValidationError(vErrors); ":" validate.errors = vErrors; return false; "),t+=" } else {  errors = "+h+"; if (vErrors !== null) { if ("+h+") vErrors.length = "+h+"; else vErrors = null; } ",r.opts.allErrors&&(t+=" } ")}else l&&(t+=" if (true) { ");return t}},{}],19:[function(e,r,t){"use strict";r.exports=function(e,r){var t=" ",a=e.errSchemaPath+"/"+r,s=e.util.toQuotedString(e.schema[r]);return!0===e.opts.$comment?t+=" console.log("+s+");":"function"==typeof e.opts.$comment&&(t+=" self._opts.$comment("+s+", "+e.util.toQuotedString(a)+", validate.root.schema);"),t}},{}],20:[function(e,r,t){"use strict";r.exports=function(e,r){var t=" ",a=e.level,s=e.dataLevel,o=e.schema[r],i=e.schemaPath+e.util.getProperty(r),n=e.errSchemaPath+"/"+r,l=!e.opts.allErrors,c="data"+(s||""),u="valid"+a,h=e.opts.$data&&o&&o.$data;h&&(t+=" var schema"+a+" = "+e.util.getData(o.$data,s,e.dataPathArr)+"; ");h||(t+=" var schema"+a+" = validate.schema"+i+";");var d=d||[];d.push(t+="var "+u+" = equal("+c+", schema"+a+"); if (!"+u+") {   "),t="",!1!==e.createErrors?(t+=" { keyword: 'const' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(n)+" , params: { allowedValue: schema"+a+" } ",!1!==e.opts.messages&&(t+=" , message: 'should be equal to constant' "),e.opts.verbose&&(t+=" , schema: validate.schema"+i+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+c+" "),t+=" } "):t+=" {} ";var p=t,t=d.pop();return t+=!e.compositeRule&&l?e.async?" throw new ValidationError(["+p+"]); ":" validate.errors = ["+p+"]; return false; ":" var err = "+p+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",t+=" }",l&&(t+=" else { "),t}},{}],21:[function(e,r,t){"use strict";r.exports=function(e,r){var t=" ",a=e.level,s=e.dataLevel,o=e.schema[r],i=e.schemaPath+e.util.getProperty(r),n=e.errSchemaPath+"/"+r,l=!e.opts.allErrors,c="data"+(s||""),u="valid"+a,h="errs__"+a,d=e.util.copy(e);d.level++;var p,f,m,v="valid"+d.level,y="i"+a,g=d.dataLevel=e.dataLevel+1,P="data"+g,E=e.baseId,w=e.opts.strictKeywords?"object"==typeof o&&0<Object.keys(o).length:e.util.schemaHasRules(o,e.RULES.all);t+="var "+h+" = errors;var "+u+";",w?(p=e.compositeRule,e.compositeRule=d.compositeRule=!0,d.schema=o,d.schemaPath=i,d.errSchemaPath=n,t+=" var "+v+" = false; for (var "+y+" = 0; "+y+" < "+c+".length; "+y+"++) { ",d.errorPath=e.util.getPathExpr(e.errorPath,y,e.opts.jsonPointers,!0),f=c+"["+y+"]",d.dataPathArr[g]=y,m=e.validate(d),d.baseId=E,e.util.varOccurences(m,P)<2?t+=" "+e.util.varReplace(m,P,f)+" ":t+=" var "+P+" = "+f+"; "+m+" ",t+=" if ("+v+") break; }  ",e.compositeRule=d.compositeRule=p,t+="  if (!"+v+") {"):t+=" if ("+c+".length == 0) {";var b=b||[];b.push(t),t="",!1!==e.createErrors?(t+=" { keyword: 'contains' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(n)+" , params: {} ",!1!==e.opts.messages&&(t+=" , message: 'should contain a valid item' "),e.opts.verbose&&(t+=" , schema: validate.schema"+i+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+c+" "),t+=" } "):t+=" {} ";var S=t,t=b.pop();return t+=!e.compositeRule&&l?e.async?" throw new ValidationError(["+S+"]); ":" validate.errors = ["+S+"]; return false; ":" var err = "+S+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",t+=" } else { ",w&&(t+="  errors = "+h+"; if (vErrors !== null) { if ("+h+") vErrors.length = "+h+"; else vErrors = null; } "),e.opts.allErrors&&(t+=" } "),t}},{}],22:[function(e,r,t){"use strict";r.exports=function(e,r){var t,a,s,o,i,n,l=" ",c=e.level,u=e.dataLevel,h=e.schema[r],d=e.schemaPath+e.util.getProperty(r),p=e.errSchemaPath+"/"+r,f=!e.opts.allErrors,m="data"+(u||""),v="valid"+c,y="errs__"+c,g=e.opts.$data&&h&&h.$data,P=g?(l+=" var schema"+c+" = "+e.util.getData(h.$data,u,e.dataPathArr)+"; ","schema"+c):h,E=this,w="definition"+c,b=E.definition,S="";if(g&&b.$data){var _=b.validateSchema;l+=" var "+w+" = RULES.custom['"+r+"'].definition; var "+(n="keywordValidate"+c)+" = "+w+".validate;"}else{if(!(i=e.useCustomRule(E,h,e.schema,e)))return;P="validate.schema"+d,n=i.code,a=b.compile,s=b.inline,o=b.macro}var F,x,R,$,j,D,O,I,A,k,C=n+".errors",L="i"+c,N="ruleErr"+c,z=b.async;if(z&&!e.async)throw new Error("async keyword in sync schema");return s||o||(l+=C+" = null;"),l+="var "+y+" = errors;var "+v+";",g&&b.$data&&(S+="}",l+=" if ("+P+" === undefined) { "+v+" = true; } else { ",_&&(S+="}",l+=" "+v+" = "+w+".validateSchema("+P+"); if ("+v+") { ")),s?l+=b.statements?" "+i.validate+" ":" "+v+" = "+i.validate+"; ":o?(S="",(F=e.util.copy(e)).level++,x="valid"+F.level,F.schema=i.validate,F.schemaPath="",R=e.compositeRule,e.compositeRule=F.compositeRule=!0,$=e.validate(F).replace(/validate\.schema/g,n),e.compositeRule=F.compositeRule=R,l+=" "+$):((I=I||[]).push(l),l="",l+="  "+n+".call( ",l+=e.opts.passContext?"this":"self",l+=a||!1===b.schema?" , "+m+" ":" , "+P+" , "+m+" , validate.schema"+e.schemaPath+" ",l+=" , (dataPath || '')",'""'!=e.errorPath&&(l+=" + "+e.errorPath),O=l+=" , "+(j=u?"data"+(u-1||""):"parentData")+" , "+(D=u?e.dataPathArr[u]:"parentDataProperty")+" , rootData )  ",l=I.pop(),!1===b.errors?(l+=" "+v+" = ",z&&(l+="await "),l+=O+"; "):l+=z?" var "+(C="customErrors"+c)+" = null; try { "+v+" = await "+O+"; } catch (e) { "+v+" = false; if (e instanceof ValidationError) "+C+" = e.errors; else throw e; } ":" "+C+" = null; "+v+" = "+O+"; "),b.modifying&&(l+=" if ("+j+") "+m+" = "+j+"["+D+"];"),l+=""+S,b.valid?f&&(l+=" if (true) { "):(l+=" if ( ",void 0===b.valid?(l+=" !",l+=o?""+x:v):l+=" "+!b.valid+" ",t=E.keyword,(I=I||[]).push(l+=") { "),(I=I||[]).push(l=""),l="",!1!==e.createErrors?(l+=" { keyword: '"+(t||"custom")+"' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(p)+" , params: { keyword: '"+E.keyword+"' } ",!1!==e.opts.messages&&(l+=" , message: 'should pass \""+E.keyword+"\" keyword validation' "),e.opts.verbose&&(l+=" , schema: validate.schema"+d+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+m+" "),l+=" } "):l+=" {} ",A=l,l=I.pop(),k=l+=!e.compositeRule&&f?e.async?" throw new ValidationError(["+A+"]); ":" validate.errors = ["+A+"]; return false; ":" var err = "+A+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",l=I.pop(),s?b.errors?"full"!=b.errors&&(l+="  for (var "+L+"="+y+"; "+L+"<errors; "+L+"++) { var "+N+" = vErrors["+L+"]; if ("+N+".dataPath === undefined) "+N+".dataPath = (dataPath || '') + "+e.errorPath+"; if ("+N+".schemaPath === undefined) { "+N+'.schemaPath = "'+p+'"; } ',e.opts.verbose&&(l+=" "+N+".schema = "+P+"; "+N+".data = "+m+"; "),l+=" } "):!1===b.errors?l+=" "+k+" ":(l+=" if ("+y+" == errors) { "+k+" } else {  for (var "+L+"="+y+"; "+L+"<errors; "+L+"++) { var "+N+" = vErrors["+L+"]; if ("+N+".dataPath === undefined) "+N+".dataPath = (dataPath || '') + "+e.errorPath+"; if ("+N+".schemaPath === undefined) { "+N+'.schemaPath = "'+p+'"; } ',e.opts.verbose&&(l+=" "+N+".schema = "+P+"; "+N+".data = "+m+"; "),l+=" } } "):o?(l+="   var err =   ",!1!==e.createErrors?(l+=" { keyword: '"+(t||"custom")+"' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(p)+" , params: { keyword: '"+E.keyword+"' } ",!1!==e.opts.messages&&(l+=" , message: 'should pass \""+E.keyword+"\" keyword validation' "),e.opts.verbose&&(l+=" , schema: validate.schema"+d+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+m+" "),l+=" } "):l+=" {} ",l+=";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",!e.compositeRule&&f&&(l+=e.async?" throw new ValidationError(vErrors); ":" validate.errors = vErrors; return false; ")):!1===b.errors?l+=" "+k+" ":(l+=" if (Array.isArray("+C+")) { if (vErrors === null) vErrors = "+C+"; else vErrors = vErrors.concat("+C+"); errors = vErrors.length;  for (var "+L+"="+y+"; "+L+"<errors; "+L+"++) { var "+N+" = vErrors["+L+"]; if ("+N+".dataPath === undefined) "+N+".dataPath = (dataPath || '') + "+e.errorPath+";  "+N+'.schemaPath = "'+p+'";  ',e.opts.verbose&&(l+=" "+N+".schema = "+P+"; "+N+".data = "+m+"; "),l+=" } } else { "+k+" } "),l+=" } ",f&&(l+=" else { ")),l}},{}],23:[function(e,r,t){"use strict";r.exports=function(e,r){var t=" ",a=e.level,s=e.dataLevel,o=e.schema[r],i=e.schemaPath+e.util.getProperty(r),n=e.errSchemaPath+"/"+r,l=!e.opts.allErrors,c="data"+(s||""),u="errs__"+a,h=e.util.copy(e),d="";h.level++;var p,f="valid"+h.level,m={},v={},y=e.opts.ownProperties;for(P in o){"__proto__"!=P&&(k=o[P],(p=Array.isArray(k)?v:m)[P]=k)}t+="var "+u+" = errors;";var g=e.errorPath;for(var P in t+="var missing"+a+";",v)if((p=v[P]).length){if(t+=" if ( "+c+e.util.getProperty(P)+" !== undefined ",y&&(t+=" && Object.prototype.hasOwnProperty.call("+c+", '"+e.util.escapeQuotes(P)+"') "),l){t+=" && ( ";var E=p;if(E)for(var w=-1,b=E.length-1;w<b;){$=E[w+=1],w&&(t+=" || "),t+=" ( ( "+(I=c+(O=e.util.getProperty($)))+" === undefined ",y&&(t+=" || ! Object.prototype.hasOwnProperty.call("+c+", '"+e.util.escapeQuotes($)+"') "),t+=") && (missing"+a+" = "+e.util.toQuotedString(e.opts.jsonPointers?$:O)+") ) "}t+=")) {  ";var S="missing"+a,_="' + "+S+" + '";e.opts._errorDataPathProperty&&(e.errorPath=e.opts.jsonPointers?e.util.getPathExpr(g,S,!0):g+" + "+S);var F=F||[];F.push(t),t="",!1!==e.createErrors?(t+=" { keyword: 'dependencies' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(n)+" , params: { property: '"+e.util.escapeQuotes(P)+"', missingProperty: '"+_+"', depsCount: "+p.length+", deps: '"+e.util.escapeQuotes(1==p.length?p[0]:p.join(", "))+"' } ",!1!==e.opts.messages&&(t+=" , message: 'should have ",t+=1==p.length?"property "+e.util.escapeQuotes(p[0]):"properties "+e.util.escapeQuotes(p.join(", ")),t+=" when property "+e.util.escapeQuotes(P)+" is present' "),e.opts.verbose&&(t+=" , schema: validate.schema"+i+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+c+" "),t+=" } "):t+=" {} ";var x=t,t=F.pop();t+=!e.compositeRule&&l?e.async?" throw new ValidationError(["+x+"]); ":" validate.errors = ["+x+"]; return false; ":" var err = "+x+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; "}else{t+=" ) { ";var R=p;if(R)for(var $,j=-1,D=R.length-1;j<D;){$=R[j+=1];var O=e.util.getProperty($),_=e.util.escapeQuotes($),I=c+O;e.opts._errorDataPathProperty&&(e.errorPath=e.util.getPath(g,$,e.opts.jsonPointers)),t+=" if ( "+I+" === undefined ",y&&(t+=" || ! Object.prototype.hasOwnProperty.call("+c+", '"+e.util.escapeQuotes($)+"') "),t+=") {  var err =   ",!1!==e.createErrors?(t+=" { keyword: 'dependencies' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(n)+" , params: { property: '"+e.util.escapeQuotes(P)+"', missingProperty: '"+_+"', depsCount: "+p.length+", deps: '"+e.util.escapeQuotes(1==p.length?p[0]:p.join(", "))+"' } ",!1!==e.opts.messages&&(t+=" , message: 'should have ",t+=1==p.length?"property "+e.util.escapeQuotes(p[0]):"properties "+e.util.escapeQuotes(p.join(", ")),t+=" when property "+e.util.escapeQuotes(P)+" is present' "),e.opts.verbose&&(t+=" , schema: validate.schema"+i+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+c+" "),t+=" } "):t+=" {} ",t+=";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } "}}t+=" }   ",l&&(d+="}",t+=" else { ")}e.errorPath=g;var A=h.baseId;for(var P in m){var k=m[P];(e.opts.strictKeywords?"object"==typeof k&&0<Object.keys(k).length:e.util.schemaHasRules(k,e.RULES.all))&&(t+=" "+f+" = true; if ( "+c+e.util.getProperty(P)+" !== undefined ",y&&(t+=" && Object.prototype.hasOwnProperty.call("+c+", '"+e.util.escapeQuotes(P)+"') "),t+=") { ",h.schema=k,h.schemaPath=i+e.util.getProperty(P),h.errSchemaPath=n+"/"+e.util.escapeFragment(P),t+="  "+e.validate(h)+" ",h.baseId=A,t+=" }  ",l&&(t+=" if ("+f+") { ",d+="}"))}return l&&(t+="   "+d+" if ("+u+" == errors) {"),t}},{}],24:[function(e,r,t){"use strict";r.exports=function(e,r){var t=" ",a=e.level,s=e.dataLevel,o=e.schema[r],i=e.schemaPath+e.util.getProperty(r),n=e.errSchemaPath+"/"+r,l=!e.opts.allErrors,c="data"+(s||""),u="valid"+a,h=e.opts.$data&&o&&o.$data,d=(h&&(t+=" var schema"+a+" = "+e.util.getData(o.$data,s,e.dataPathArr)+"; "),"i"+a),p="schema"+a;h||(t+=" var "+p+" = validate.schema"+i+";"),t+="var "+u+";",h&&(t+=" if (schema"+a+" === undefined) "+u+" = true; else if (!Array.isArray(schema"+a+")) "+u+" = false; else {"),t+=u+" = false;for (var "+d+"=0; "+d+"<"+p+".length; "+d+"++) if (equal("+c+", "+p+"["+d+"])) { "+u+" = true; break; }",h&&(t+="  }  ");var f=f||[];f.push(t+=" if (!"+u+") {   "),t="",!1!==e.createErrors?(t+=" { keyword: 'enum' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(n)+" , params: { allowedValues: schema"+a+" } ",!1!==e.opts.messages&&(t+=" , message: 'should be equal to one of the allowed values' "),e.opts.verbose&&(t+=" , schema: validate.schema"+i+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+c+" "),t+=" } "):t+=" {} ";var m=t,t=f.pop();return t+=!e.compositeRule&&l?e.async?" throw new ValidationError(["+m+"]); ":" validate.errors = ["+m+"]; return false; ":" var err = "+m+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",t+=" }",l&&(t+=" else { "),t}},{}],25:[function(e,r,t){"use strict";r.exports=function(e,r,t){var a=" ",s=e.level,o=e.dataLevel,i=e.schema[r],n=e.schemaPath+e.util.getProperty(r),l=e.errSchemaPath+"/"+r,c=!e.opts.allErrors,u="data"+(o||"");if(!1===e.opts.format)return c&&(a+=" if (true) { "),a;var h,d=e.opts.$data&&i&&i.$data,p=d?(a+=" var schema"+s+" = "+e.util.getData(i.$data,o,e.dataPathArr)+"; ","schema"+s):i,f=e.opts.unknownFormats,m=Array.isArray(f);if(d){a+=" var "+(h="format"+s)+" = formats["+p+"]; var "+(v="isObject"+s)+" = typeof "+h+" == 'object' && !("+h+" instanceof RegExp) && "+h+".validate; var "+(g="formatType"+s)+" = "+v+" && "+h+".type || 'string'; if ("+v+") { ",e.async&&(a+=" var async"+s+" = "+h+".async; "),a+=" "+h+" = "+h+".validate; } if (  ",d&&(a+=" ("+p+" !== undefined && typeof "+p+" != 'string') || "),a+=" (","ignore"!=f&&(a+=" ("+p+" && !"+h+" ",m&&(a+=" && self._opts.unknownFormats.indexOf("+p+") == -1 "),a+=") || "),a+=" ("+h+" && "+g+" == '"+t+"' && !(typeof "+h+" == 'function' ? ",a+=e.async?" (async"+s+" ? await "+h+"("+u+") : "+h+"("+u+")) ":" "+h+"("+u+") ",a+=" : "+h+".test("+u+"))))) {"}else{if(!(h=e.formats[i])){if("ignore"==f)return e.logger.warn('unknown format "'+i+'" ignored in schema at path "'+e.errSchemaPath+'"'),c&&(a+=" if (true) { "),a;if(m&&0<=f.indexOf(i))return c&&(a+=" if (true) { "),a;throw new Error('unknown format "'+i+'" is used in schema at path "'+e.errSchemaPath+'"')}var v,y,g=(v="object"==typeof h&&!(h instanceof RegExp)&&h.validate)&&h.type||"string";if(v&&(y=!0===h.async,h=h.validate),g!=t)return c&&(a+=" if (true) { "),a;if(y){if(!e.async)throw new Error("async format in sync schema");a+=" if (!(await "+(P="formats"+e.util.getProperty(i)+".validate")+"("+u+"))) { "}else{a+=" if (! ";var P="formats"+e.util.getProperty(i);v&&(P+=".validate"),a+="function"==typeof h?" "+P+"("+u+") ":" "+P+".test("+u+") ",a+=") { "}}var E=E||[];E.push(a),a="",!1!==e.createErrors?(a+=" { keyword: 'format' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(l)+" , params: { format:  ",a+=d?""+p:""+e.util.toQuotedString(i),a+="  } ",!1!==e.opts.messages&&(a+=" , message: 'should match format \"",a+=d?"' + "+p+" + '":""+e.util.escapeQuotes(i),a+="\"' "),e.opts.verbose&&(a+=" , schema:  ",a+=d?"validate.schema"+n:""+e.util.toQuotedString(i),a+="         , parentSchema: validate.schema"+e.schemaPath+" , data: "+u+" "),a+=" } "):a+=" {} ";var w=a,a=E.pop();return a+=!e.compositeRule&&c?e.async?" throw new ValidationError(["+w+"]); ":" validate.errors = ["+w+"]; return false; ":" var err = "+w+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",a+=" } ",c&&(a+=" else { "),a}},{}],26:[function(e,r,t){"use strict";r.exports=function(e,r){var t=" ",a=e.level,s=e.dataLevel,o=e.schema[r],i=e.schemaPath+e.util.getProperty(r),n=e.errSchemaPath+"/"+r,l=!e.opts.allErrors,c="data"+(s||""),u="valid"+a,h="errs__"+a,d=e.util.copy(e);d.level++;var p,f,m="valid"+d.level,v=e.schema.then,y=e.schema.else,g=void 0!==v&&(e.opts.strictKeywords?"object"==typeof v&&0<Object.keys(v).length:e.util.schemaHasRules(v,e.RULES.all)),P=void 0!==y&&(e.opts.strictKeywords?"object"==typeof y&&0<Object.keys(y).length:e.util.schemaHasRules(y,e.RULES.all)),E=d.baseId;return g||P?(d.createErrors=!1,d.schema=o,d.schemaPath=i,d.errSchemaPath=n,t+=" var "+h+" = errors; var "+u+" = true;  ",f=e.compositeRule,e.compositeRule=d.compositeRule=!0,t+="  "+e.validate(d)+" ",d.baseId=E,d.createErrors=!0,t+="  errors = "+h+"; if (vErrors !== null) { if ("+h+") vErrors.length = "+h+"; else vErrors = null; }  ",e.compositeRule=d.compositeRule=f,g?(t+=" if ("+m+") {  ",d.schema=e.schema.then,d.schemaPath=e.schemaPath+".then",d.errSchemaPath=e.errSchemaPath+"/then",t+="  "+e.validate(d)+" ",d.baseId=E,t+=" "+u+" = "+m+"; ",g&&P?t+=" var "+(p="ifClause"+a)+" = 'then'; ":p="'then'",t+=" } ",P&&(t+=" else { ")):t+=" if (!"+m+") { ",P&&(d.schema=e.schema.else,d.schemaPath=e.schemaPath+".else",d.errSchemaPath=e.errSchemaPath+"/else",t+="  "+e.validate(d)+" ",d.baseId=E,t+=" "+u+" = "+m+"; ",g&&P?t+=" var "+(p="ifClause"+a)+" = 'else'; ":p="'else'",t+=" } "),t+=" if (!"+u+") {   var err =   ",!1!==e.createErrors?(t+=" { keyword: 'if' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(n)+" , params: { failingKeyword: "+p+" } ",!1!==e.opts.messages&&(t+=" , message: 'should match \"' + "+p+" + '\" schema' "),e.opts.verbose&&(t+=" , schema: validate.schema"+i+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+c+" "),t+=" } "):t+=" {} ",t+=";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",!e.compositeRule&&l&&(t+=e.async?" throw new ValidationError(vErrors); ":" validate.errors = vErrors; return false; "),t+=" }   ",l&&(t+=" else { ")):l&&(t+=" if (true) { "),t}},{}],27:[function(e,r,t){"use strict";r.exports={$ref:e("./ref"),allOf:e("./allOf"),anyOf:e("./anyOf"),$comment:e("./comment"),const:e("./const"),contains:e("./contains"),dependencies:e("./dependencies"),enum:e("./enum"),format:e("./format"),if:e("./if"),items:e("./items"),maximum:e("./_limit"),minimum:e("./_limit"),maxItems:e("./_limitItems"),minItems:e("./_limitItems"),maxLength:e("./_limitLength"),minLength:e("./_limitLength"),maxProperties:e("./_limitProperties"),minProperties:e("./_limitProperties"),multipleOf:e("./multipleOf"),not:e("./not"),oneOf:e("./oneOf"),pattern:e("./pattern"),properties:e("./properties"),propertyNames:e("./propertyNames"),required:e("./required"),uniqueItems:e("./uniqueItems"),validate:e("./validate")}},{"./_limit":13,"./_limitItems":14,"./_limitLength":15,"./_limitProperties":16,"./allOf":17,"./anyOf":18,"./comment":19,"./const":20,"./contains":21,"./dependencies":23,"./enum":24,"./format":25,"./if":26,"./items":28,"./multipleOf":29,"./not":30,"./oneOf":31,"./pattern":32,"./properties":33,"./propertyNames":34,"./ref":35,"./required":36,"./uniqueItems":37,"./validate":38}],28:[function(e,r,t){"use strict";r.exports=function(e,r){var t=" ",a=e.level,s=e.dataLevel,o=e.schema[r],i=e.schemaPath+e.util.getProperty(r),n=e.errSchemaPath+"/"+r,l=!e.opts.allErrors,c="data"+(s||""),u="valid"+a,h="errs__"+a,d=e.util.copy(e),p="";d.level++;var f="valid"+d.level,m="i"+a,v=d.dataLevel=e.dataLevel+1,y="data"+v,g=e.baseId;if(t+="var "+h+" = errors;var "+u+";",Array.isArray(o)){var P,E,w,b=e.schema.additionalItems;!1===b&&(t+=" "+u+" = "+c+".length <= "+o.length+"; ",P=n,n=e.errSchemaPath+"/additionalItems",(E=E||[]).push(t+="  if (!"+u+") {   "),t="",!1!==e.createErrors?(t+=" { keyword: 'additionalItems' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(n)+" , params: { limit: "+o.length+" } ",!1!==e.opts.messages&&(t+=" , message: 'should NOT have more than "+o.length+" items' "),e.opts.verbose&&(t+=" , schema: false , parentSchema: validate.schema"+e.schemaPath+" , data: "+c+" "),t+=" } "):t+=" {} ",w=t,t=E.pop(),t+=!e.compositeRule&&l?e.async?" throw new ValidationError(["+w+"]); ":" validate.errors = ["+w+"]; return false; ":" var err = "+w+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",t+=" } ",n=P,l&&(p+="}",t+=" else { "));var S=o;if(S)for(var _=-1,F=S.length-1;_<F;){var x,R,$=S[_+=1];(e.opts.strictKeywords?"object"==typeof $&&0<Object.keys($).length:e.util.schemaHasRules($,e.RULES.all))&&(t+=" "+f+" = true; if ("+c+".length > "+_+") { ",x=c+"["+_+"]",d.schema=$,d.schemaPath=i+"["+_+"]",d.errSchemaPath=n+"/"+_,d.errorPath=e.util.getPathExpr(e.errorPath,_,e.opts.jsonPointers,!0),d.dataPathArr[v]=_,R=e.validate(d),d.baseId=g,e.util.varOccurences(R,y)<2?t+=" "+e.util.varReplace(R,y,x)+" ":t+=" var "+y+" = "+x+"; "+R+" ",t+=" }  ",l&&(t+=" if ("+f+") { ",p+="}"))}"object"==typeof b&&(e.opts.strictKeywords?"object"==typeof b&&0<Object.keys(b).length:e.util.schemaHasRules(b,e.RULES.all))&&(d.schema=b,d.schemaPath=e.schemaPath+".additionalItems",d.errSchemaPath=e.errSchemaPath+"/additionalItems",t+=" "+f+" = true; if ("+c+".length > "+o.length+") {  for (var "+m+" = "+o.length+"; "+m+" < "+c+".length; "+m+"++) { ",d.errorPath=e.util.getPathExpr(e.errorPath,m,e.opts.jsonPointers,!0),x=c+"["+m+"]",d.dataPathArr[v]=m,R=e.validate(d),d.baseId=g,e.util.varOccurences(R,y)<2?t+=" "+e.util.varReplace(R,y,x)+" ":t+=" var "+y+" = "+x+"; "+R+" ",l&&(t+=" if (!"+f+") break; "),t+=" } }  ",l&&(t+=" if ("+f+") { ",p+="}"))}else{(e.opts.strictKeywords?"object"==typeof o&&0<Object.keys(o).length:e.util.schemaHasRules(o,e.RULES.all))&&(d.schema=o,d.schemaPath=i,d.errSchemaPath=n,t+="  for (var "+m+" = 0; "+m+" < "+c+".length; "+m+"++) { ",d.errorPath=e.util.getPathExpr(e.errorPath,m,e.opts.jsonPointers,!0),x=c+"["+m+"]",d.dataPathArr[v]=m,R=e.validate(d),d.baseId=g,e.util.varOccurences(R,y)<2?t+=" "+e.util.varReplace(R,y,x)+" ":t+=" var "+y+" = "+x+"; "+R+" ",l&&(t+=" if (!"+f+") break; "),t+=" }")}return l&&(t+=" "+p+" if ("+h+" == errors) {"),t}},{}],29:[function(e,r,t){"use strict";r.exports=function(e,r){var t=" ",a=e.level,s=e.dataLevel,o=e.schema[r],i=e.schemaPath+e.util.getProperty(r),n=e.errSchemaPath+"/"+r,l=!e.opts.allErrors,c="data"+(s||""),u=e.opts.$data&&o&&o.$data,h=u?(t+=" var schema"+a+" = "+e.util.getData(o.$data,s,e.dataPathArr)+"; ","schema"+a):o;if(!u&&"number"!=typeof o)throw new Error(r+" must be number");t+="var division"+a+";if (",u&&(t+=" "+h+" !== undefined && ( typeof "+h+" != 'number' || "),t+=" (division"+a+" = "+c+" / "+h+", ",t+=e.opts.multipleOfPrecision?" Math.abs(Math.round(division"+a+") - division"+a+") > 1e-"+e.opts.multipleOfPrecision+" ":" division"+a+" !== parseInt(division"+a+") ",t+=" ) ",u&&(t+="  )  ");var d=d||[];d.push(t+=" ) {   "),t="",!1!==e.createErrors?(t+=" { keyword: 'multipleOf' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(n)+" , params: { multipleOf: "+h+" } ",!1!==e.opts.messages&&(t+=" , message: 'should be multiple of ",t+=u?"' + "+h:h+"'"),e.opts.verbose&&(t+=" , schema:  ",t+=u?"validate.schema"+i:""+o,t+="         , parentSchema: validate.schema"+e.schemaPath+" , data: "+c+" "),t+=" } "):t+=" {} ";var p=t,t=d.pop();return t+=!e.compositeRule&&l?e.async?" throw new ValidationError(["+p+"]); ":" validate.errors = ["+p+"]; return false; ":" var err = "+p+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",t+="} ",l&&(t+=" else { "),t}},{}],30:[function(e,r,t){"use strict";r.exports=function(e,r){var t=" ",a=e.level,s=e.dataLevel,o=e.schema[r],i=e.schemaPath+e.util.getProperty(r),n=e.errSchemaPath+"/"+r,l=!e.opts.allErrors,c="data"+(s||""),u="errs__"+a,h=e.util.copy(e);h.level++;var d,p,f,m,v="valid"+h.level;return(e.opts.strictKeywords?"object"==typeof o&&0<Object.keys(o).length:e.util.schemaHasRules(o,e.RULES.all))?(h.schema=o,h.schemaPath=i,h.errSchemaPath=n,t+=" var "+u+" = errors;  ",d=e.compositeRule,e.compositeRule=h.compositeRule=!0,h.createErrors=!1,h.opts.allErrors&&(p=h.opts.allErrors,h.opts.allErrors=!1),t+=" "+e.validate(h)+" ",h.createErrors=!0,p&&(h.opts.allErrors=p),e.compositeRule=h.compositeRule=d,(f=f||[]).push(t+=" if ("+v+") {   "),t="",!1!==e.createErrors?(t+=" { keyword: 'not' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(n)+" , params: {} ",!1!==e.opts.messages&&(t+=" , message: 'should NOT be valid' "),e.opts.verbose&&(t+=" , schema: validate.schema"+i+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+c+" "),t+=" } "):t+=" {} ",m=t,t=f.pop(),t+=!e.compositeRule&&l?e.async?" throw new ValidationError(["+m+"]); ":" validate.errors = ["+m+"]; return false; ":" var err = "+m+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",t+=" } else {  errors = "+u+"; if (vErrors !== null) { if ("+u+") vErrors.length = "+u+"; else vErrors = null; } ",e.opts.allErrors&&(t+=" } ")):(t+="  var err =   ",!1!==e.createErrors?(t+=" { keyword: 'not' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(n)+" , params: {} ",!1!==e.opts.messages&&(t+=" , message: 'should NOT be valid' "),e.opts.verbose&&(t+=" , schema: validate.schema"+i+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+c+" "),t+=" } "):t+=" {} ",t+=";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",l&&(t+=" if (false) { ")),t}},{}],31:[function(e,r,t){"use strict";r.exports=function(e,r){var t=" ",a=e.level,s=e.dataLevel,o=e.schema[r],i=e.schemaPath+e.util.getProperty(r),n=e.errSchemaPath+"/"+r,l=!e.opts.allErrors,c="data"+(s||""),u="valid"+a,h="errs__"+a,d=e.util.copy(e),p="";d.level++;var f="valid"+d.level,m=d.baseId,v="prevValid"+a,y="passingSchemas"+a;t+="var "+h+" = errors , "+v+" = false , "+u+" = false , "+y+" = null; ";var g=e.compositeRule;e.compositeRule=d.compositeRule=!0;var P=o;if(P)for(var E,w=-1,b=P.length-1;w<b;)E=P[w+=1],(e.opts.strictKeywords?"object"==typeof E&&0<Object.keys(E).length:e.util.schemaHasRules(E,e.RULES.all))?(d.schema=E,d.schemaPath=i+"["+w+"]",d.errSchemaPath=n+"/"+w,t+="  "+e.validate(d)+" ",d.baseId=m):t+=" var "+f+" = true; ",w&&(t+=" if ("+f+" && "+v+") { "+u+" = false; "+y+" = ["+y+", "+w+"]; } else { ",p+="}"),t+=" if ("+f+") { "+u+" = "+v+" = true; "+y+" = "+w+"; }";return e.compositeRule=d.compositeRule=g,t+=p+"if (!"+u+") {   var err =   ",!1!==e.createErrors?(t+=" { keyword: 'oneOf' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(n)+" , params: { passingSchemas: "+y+" } ",!1!==e.opts.messages&&(t+=" , message: 'should match exactly one schema in oneOf' "),e.opts.verbose&&(t+=" , schema: validate.schema"+i+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+c+" "),t+=" } "):t+=" {} ",t+=";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",!e.compositeRule&&l&&(t+=e.async?" throw new ValidationError(vErrors); ":" validate.errors = vErrors; return false; "),t+="} else {  errors = "+h+"; if (vErrors !== null) { if ("+h+") vErrors.length = "+h+"; else vErrors = null; }",e.opts.allErrors&&(t+=" } "),t}},{}],32:[function(e,r,t){"use strict";r.exports=function(e,r){var t=" ",a=e.level,s=e.dataLevel,o=e.schema[r],i=e.schemaPath+e.util.getProperty(r),n=e.errSchemaPath+"/"+r,l=!e.opts.allErrors,c="data"+(s||""),u=e.opts.$data&&o&&o.$data,h=u?(t+=" var schema"+a+" = "+e.util.getData(o.$data,s,e.dataPathArr)+"; ","schema"+a):o,d=u?"(new RegExp("+h+"))":e.usePattern(o);t+="if ( ",u&&(t+=" ("+h+" !== undefined && typeof "+h+" != 'string') || ");var p=p||[];p.push(t+=" !"+d+".test("+c+") ) {   "),t="",!1!==e.createErrors?(t+=" { keyword: 'pattern' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(n)+" , params: { pattern:  ",t+=u?""+h:""+e.util.toQuotedString(o),t+="  } ",!1!==e.opts.messages&&(t+=" , message: 'should match pattern \"",t+=u?"' + "+h+" + '":""+e.util.escapeQuotes(o),t+="\"' "),e.opts.verbose&&(t+=" , schema:  ",t+=u?"validate.schema"+i:""+e.util.toQuotedString(o),t+="         , parentSchema: validate.schema"+e.schemaPath+" , data: "+c+" "),t+=" } "):t+=" {} ";var f=t,t=p.pop();return t+=!e.compositeRule&&l?e.async?" throw new ValidationError(["+f+"]); ":" validate.errors = ["+f+"]; return false; ":" var err = "+f+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",t+="} ",l&&(t+=" else { "),t}},{}],33:[function(e,r,t){"use strict";r.exports=function(e,r){var t=" ",a=e.level,s=e.dataLevel,o=e.schema[r],i=e.schemaPath+e.util.getProperty(r),n=e.errSchemaPath+"/"+r,l=!e.opts.allErrors,c="data"+(s||""),u="errs__"+a,h=e.util.copy(e),d="";h.level++;var p,f,m,v="valid"+h.level,y="key"+a,g="idx"+a,P=h.dataLevel=e.dataLevel+1,E="data"+P,w="dataProperties"+a,b=Object.keys(o||{}).filter(k),S=e.schema.patternProperties||{},_=Object.keys(S).filter(k),F=e.schema.additionalProperties,x=b.length||_.length,R=!1===F,$="object"==typeof F&&Object.keys(F).length,j=e.opts.removeAdditional,D=R||$||j,O=e.opts.ownProperties,I=e.baseId,A=e.schema.required;function k(e){return"__proto__"!==e}if(A&&(!e.opts.$data||!A.$data)&&A.length<e.opts.loopRequired&&(p=e.util.toHash(A)),t+="var "+u+" = errors;var "+v+" = true;",O&&(t+=" var "+w+" = undefined;"),D){if(t+=O?" "+w+" = "+w+" || Object.keys("+c+"); for (var "+g+"=0; "+g+"<"+w+".length; "+g+"++) { var "+y+" = "+w+"["+g+"]; ":" for (var "+y+" in "+c+") { ",x){if(t+=" var isAdditional"+a+" = !(false ",b.length)if(8<b.length)t+=" || validate.schema"+i+".hasOwnProperty("+y+") ";else{var C=b;if(C)for(var L=-1,N=C.length-1;L<N;)U=C[L+=1],t+=" || "+y+" == "+e.util.toQuotedString(U)+" "}if(_.length){var z=_;if(z)for(var T=-1,q=z.length-1;T<q;)te=z[T+=1],t+=" || "+e.usePattern(te)+".test("+y+") "}t+=" ); if (isAdditional"+a+") { "}"all"==j?t+=" delete "+c+"["+y+"]; ":(Z=e.errorPath,f="' + "+y+" + '",e.opts._errorDataPathProperty&&(e.errorPath=e.util.getPathExpr(e.errorPath,y,e.opts.jsonPointers)),R?j?t+=" delete "+c+"["+y+"]; ":(G=n,n=e.errSchemaPath+"/additionalProperties",(W=W||[]).push(t+=" "+v+" = false; "),t="",!1!==e.createErrors?(t+=" { keyword: 'additionalProperties' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(n)+" , params: { additionalProperty: '"+f+"' } ",!1!==e.opts.messages&&(t+=" , message: '",t+=e.opts._errorDataPathProperty?"is an invalid additional property":"should NOT have additional properties",t+="' "),e.opts.verbose&&(t+=" , schema: false , parentSchema: validate.schema"+e.schemaPath+" , data: "+c+" "),t+=" } "):t+=" {} ",X=t,t=W.pop(),t+=!e.compositeRule&&l?e.async?" throw new ValidationError(["+X+"]); ":" validate.errors = ["+X+"]; return false; ":" var err = "+X+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",n=G,l&&(t+=" break; ")):$&&("failing"==j?(t+=" var "+u+" = errors;  ",m=e.compositeRule,e.compositeRule=h.compositeRule=!0,h.schema=F,h.schemaPath=e.schemaPath+".additionalProperties",h.errSchemaPath=e.errSchemaPath+"/additionalProperties",h.errorPath=e.opts._errorDataPathProperty?e.errorPath:e.util.getPathExpr(e.errorPath,y,e.opts.jsonPointers),oe=c+"["+y+"]",h.dataPathArr[P]=y,ie=e.validate(h),h.baseId=I,e.util.varOccurences(ie,E)<2?t+=" "+e.util.varReplace(ie,E,oe)+" ":t+=" var "+E+" = "+oe+"; "+ie+" ",t+=" if (!"+v+") { errors = "+u+"; if (validate.errors !== null) { if (errors) validate.errors.length = errors; else validate.errors = null; } delete "+c+"["+y+"]; }  ",e.compositeRule=h.compositeRule=m):(h.schema=F,h.schemaPath=e.schemaPath+".additionalProperties",h.errSchemaPath=e.errSchemaPath+"/additionalProperties",h.errorPath=e.opts._errorDataPathProperty?e.errorPath:e.util.getPathExpr(e.errorPath,y,e.opts.jsonPointers),oe=c+"["+y+"]",h.dataPathArr[P]=y,ie=e.validate(h),h.baseId=I,e.util.varOccurences(ie,E)<2?t+=" "+e.util.varReplace(ie,E,oe)+" ":t+=" var "+E+" = "+oe+"; "+ie+" ",l&&(t+=" if (!"+v+") break; "))),e.errorPath=Z),x&&(t+=" } "),t+=" }  ",l&&(t+=" if ("+v+") { ",d+="}")}var Q=e.opts.useDefaults&&!e.compositeRule;if(b.length){var V=b;if(V)for(var U,H=-1,K=V.length-1;H<K;){var M,B,J,Z,G,Y,W,X,ee=o[U=V[H+=1]];(e.opts.strictKeywords?"object"==typeof ee&&0<Object.keys(ee).length:e.util.schemaHasRules(ee,e.RULES.all))&&(oe=c+(M=e.util.getProperty(U)),B=Q&&void 0!==ee.default,h.schema=ee,h.schemaPath=i+M,h.errSchemaPath=n+"/"+e.util.escapeFragment(U),h.errorPath=e.util.getPath(e.errorPath,U,e.opts.jsonPointers),h.dataPathArr[P]=e.util.toQuotedString(U),ie=e.validate(h),h.baseId=I,e.util.varOccurences(ie,E)<2?(ie=e.util.varReplace(ie,E,oe),J=oe):t+=" var "+(J=E)+" = "+oe+"; ",B?t+=" "+ie+" ":(p&&p[U]?(t+=" if ( "+J+" === undefined ",O&&(t+=" || ! Object.prototype.hasOwnProperty.call("+c+", '"+e.util.escapeQuotes(U)+"') "),t+=") { "+v+" = false; ",Z=e.errorPath,G=n,Y=e.util.escapeQuotes(U),e.opts._errorDataPathProperty&&(e.errorPath=e.util.getPath(Z,U,e.opts.jsonPointers)),n=e.errSchemaPath+"/required",(W=W||[]).push(t),t="",!1!==e.createErrors?(t+=" { keyword: 'required' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(n)+" , params: { missingProperty: '"+Y+"' } ",!1!==e.opts.messages&&(t+=" , message: '",t+=e.opts._errorDataPathProperty?"is a required property":"should have required property \\'"+Y+"\\'",t+="' "),e.opts.verbose&&(t+=" , schema: validate.schema"+i+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+c+" "),t+=" } "):t+=" {} ",X=t,t=W.pop(),t+=!e.compositeRule&&l?e.async?" throw new ValidationError(["+X+"]); ":" validate.errors = ["+X+"]; return false; ":" var err = "+X+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",n=G,e.errorPath=Z,t+=" } else { "):l?(t+=" if ( "+J+" === undefined ",O&&(t+=" || ! Object.prototype.hasOwnProperty.call("+c+", '"+e.util.escapeQuotes(U)+"') "),t+=") { "+v+" = true; } else { "):(t+=" if ("+J+" !== undefined ",O&&(t+=" &&   Object.prototype.hasOwnProperty.call("+c+", '"+e.util.escapeQuotes(U)+"') "),t+=" ) { "),t+=" "+ie+" } ")),l&&(t+=" if ("+v+") { ",d+="}")}}if(_.length){var re=_;if(re)for(var te,ae=-1,se=re.length-1;ae<se;){var oe,ie,ee=S[te=re[ae+=1]];(e.opts.strictKeywords?"object"==typeof ee&&0<Object.keys(ee).length:e.util.schemaHasRules(ee,e.RULES.all))&&(h.schema=ee,h.schemaPath=e.schemaPath+".patternProperties"+e.util.getProperty(te),h.errSchemaPath=e.errSchemaPath+"/patternProperties/"+e.util.escapeFragment(te),t+=O?" "+w+" = "+w+" || Object.keys("+c+"); for (var "+g+"=0; "+g+"<"+w+".length; "+g+"++) { var "+y+" = "+w+"["+g+"]; ":" for (var "+y+" in "+c+") { ",t+=" if ("+e.usePattern(te)+".test("+y+")) { ",h.errorPath=e.util.getPathExpr(e.errorPath,y,e.opts.jsonPointers),oe=c+"["+y+"]",h.dataPathArr[P]=y,ie=e.validate(h),h.baseId=I,e.util.varOccurences(ie,E)<2?t+=" "+e.util.varReplace(ie,E,oe)+" ":t+=" var "+E+" = "+oe+"; "+ie+" ",l&&(t+=" if (!"+v+") break; "),t+=" } ",l&&(t+=" else "+v+" = true; "),t+=" }  ",l&&(t+=" if ("+v+") { ",d+="}"))}}return l&&(t+=" "+d+" if ("+u+" == errors) {"),t}},{}],34:[function(e,r,t){"use strict";r.exports=function(e,r){var t=" ",a=e.level,s=e.dataLevel,o=e.schema[r],i=e.schemaPath+e.util.getProperty(r),n=e.errSchemaPath+"/"+r,l=!e.opts.allErrors,c="data"+(s||""),u="errs__"+a,h=e.util.copy(e);h.level++;var d,p,f,m,v,y,g,P,E,w,b,S="valid"+h.level;return t+="var "+u+" = errors;",(e.opts.strictKeywords?"object"==typeof o&&0<Object.keys(o).length:e.util.schemaHasRules(o,e.RULES.all))&&(h.schema=o,h.schemaPath=i,h.errSchemaPath=n,p="idx"+a,f="i"+a,m="' + "+(d="key"+a)+" + '",v="data"+(h.dataLevel=e.dataLevel+1),y="dataProperties"+a,P=e.baseId,(g=e.opts.ownProperties)&&(t+=" var "+y+" = undefined; "),t+=g?" "+y+" = "+y+" || Object.keys("+c+"); for (var "+p+"=0; "+p+"<"+y+".length; "+p+"++) { var "+d+" = "+y+"["+p+"]; ":" for (var "+d+" in "+c+") { ",t+=" var startErrs"+a+" = errors; ",E=d,w=e.compositeRule,e.compositeRule=h.compositeRule=!0,b=e.validate(h),h.baseId=P,e.util.varOccurences(b,v)<2?t+=" "+e.util.varReplace(b,v,E)+" ":t+=" var "+v+" = "+E+"; "+b+" ",e.compositeRule=h.compositeRule=w,t+=" if (!"+S+") { for (var "+f+"=startErrs"+a+"; "+f+"<errors; "+f+"++) { vErrors["+f+"].propertyName = "+d+"; }   var err =   ",!1!==e.createErrors?(t+=" { keyword: 'propertyNames' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(n)+" , params: { propertyName: '"+m+"' } ",!1!==e.opts.messages&&(t+=" , message: 'property name \\'"+m+"\\' is invalid' "),e.opts.verbose&&(t+=" , schema: validate.schema"+i+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+c+" "),t+=" } "):t+=" {} ",t+=";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",!e.compositeRule&&l&&(t+=e.async?" throw new ValidationError(vErrors); ":" validate.errors = vErrors; return false; "),l&&(t+=" break; "),t+=" } }"),l&&(t+="  if ("+u+" == errors) {"),t}},{}],35:[function(e,r,t){"use strict";r.exports=function(e,r){var t,a,s=" ",o=e.dataLevel,i=e.schema[r],n=e.errSchemaPath+"/"+r,l=!e.opts.allErrors,c="data"+(o||""),u="valid"+e.level;if("#"==i||"#/"==i)a=e.isRoot?(t=e.async,"validate"):(t=!0===e.root.schema.$async,"root.refVal[0]");else{var h,d,p=e.resolveRef(e.baseId,i,e.isRoot);if(void 0===p){var f,m=e.MissingRefError.message(e.baseId,i);if("fail"==e.opts.missingRefs){e.logger.error(m),(f=f||[]).push(s),s="",!1!==e.createErrors?(s+=" { keyword: '$ref' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(n)+" , params: { ref: '"+e.util.escapeQuotes(i)+"' } ",!1!==e.opts.messages&&(s+=" , message: 'can\\'t resolve reference "+e.util.escapeQuotes(i)+"' "),e.opts.verbose&&(s+=" , schema: "+e.util.toQuotedString(i)+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+c+" "),s+=" } "):s+=" {} ";var v=s,s=f.pop();s+=!e.compositeRule&&l?e.async?" throw new ValidationError(["+v+"]); ":" validate.errors = ["+v+"]; return false; ":" var err = "+v+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",l&&(s+=" if (false) { ")}else{if("ignore"!=e.opts.missingRefs)throw new e.MissingRefError(e.baseId,i,m);e.logger.warn(m),l&&(s+=" if (true) { ")}}else{p.inline?((h=e.util.copy(e)).level++,d="valid"+h.level,h.schema=p.schema,h.schemaPath="",h.errSchemaPath=i,s+=" "+e.validate(h).replace(/validate\.schema/g,p.code)+" ",l&&(s+=" if ("+d+") { ")):(t=!0===p.$async||e.async&&!1!==p.$async,a=p.code)}}if(a){(f=f||[]).push(s),s="",s+=e.opts.passContext?" "+a+".call(this, ":" "+a+"( ",s+=" "+c+", (dataPath || '')",'""'!=e.errorPath&&(s+=" + "+e.errorPath);var y=s+=" , "+(o?"data"+(o-1||""):"parentData")+" , "+(o?e.dataPathArr[o]:"parentDataProperty")+", rootData)  ";if(s=f.pop(),t){if(!e.async)throw new Error("async schema referenced by sync schema");l&&(s+=" var "+u+"; "),s+=" try { await "+y+"; ",l&&(s+=" "+u+" = true; "),s+=" } catch (e) { if (!(e instanceof ValidationError)) throw e; if (vErrors === null) vErrors = e.errors; else vErrors = vErrors.concat(e.errors); errors = vErrors.length; ",l&&(s+=" "+u+" = false; "),s+=" } ",l&&(s+=" if ("+u+") { ")}else s+=" if (!"+y+") { if (vErrors === null) vErrors = "+a+".errors; else vErrors = vErrors.concat("+a+".errors); errors = vErrors.length; } ",l&&(s+=" else { ")}return s}},{}],36:[function(e,r,t){"use strict";r.exports=function(e,r){var t=" ",a=e.level,s=e.dataLevel,o=e.schema[r],i=e.schemaPath+e.util.getProperty(r),n=e.errSchemaPath+"/"+r,l=!e.opts.allErrors,c="data"+(s||""),u="valid"+a,h=e.opts.$data&&o&&o.$data,d=(h&&(t+=" var schema"+a+" = "+e.util.getData(o.$data,s,e.dataPathArr)+"; "),"schema"+a);if(!h)if(o.length<e.opts.loopRequired&&e.schema.properties&&Object.keys(e.schema.properties).length){var p=[],f=o;if(f)for(var m,v=-1,y=f.length-1;v<y;){m=f[v+=1];var g=e.schema.properties[m];g&&(e.opts.strictKeywords?"object"==typeof g&&0<Object.keys(g).length:e.util.schemaHasRules(g,e.RULES.all))||(p[p.length]=m)}}else p=o;if(h||p.length){var P=e.errorPath,E=h||e.opts.loopRequired<=p.length,w=e.opts.ownProperties;if(l)if(t+=" var missing"+a+"; ",E){h||(t+=" var "+d+" = validate.schema"+i+"; ");var b="' + "+($="schema"+a+"["+(F="i"+a)+"]")+" + '";e.opts._errorDataPathProperty&&(e.errorPath=e.util.getPathExpr(P,$,e.opts.jsonPointers)),t+=" var "+u+" = true; ",h&&(t+=" if (schema"+a+" === undefined) "+u+" = true; else if (!Array.isArray(schema"+a+")) "+u+" = false; else {"),t+=" for (var "+F+" = 0; "+F+" < "+d+".length; "+F+"++) { "+u+" = "+c+"["+d+"["+F+"]] !== undefined ",w&&(t+=" &&   Object.prototype.hasOwnProperty.call("+c+", "+d+"["+F+"]) "),t+="; if (!"+u+") break; } ",h&&(t+="  }  "),(R=R||[]).push(t+="  if (!"+u+") {   "),t="",!1!==e.createErrors?(t+=" { keyword: 'required' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(n)+" , params: { missingProperty: '"+b+"' } ",!1!==e.opts.messages&&(t+=" , message: '",t+=e.opts._errorDataPathProperty?"is a required property":"should have required property \\'"+b+"\\'",t+="' "),e.opts.verbose&&(t+=" , schema: validate.schema"+i+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+c+" "),t+=" } "):t+=" {} ";var S=t,t=R.pop();t+=!e.compositeRule&&l?e.async?" throw new ValidationError(["+S+"]); ":" validate.errors = ["+S+"]; return false; ":" var err = "+S+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",t+=" } else { "}else{t+=" if ( ";var _=p;if(_)for(var F=-1,x=_.length-1;F<x;){D=_[F+=1],F&&(t+=" || "),t+=" ( ( "+(k=c+(A=e.util.getProperty(D)))+" === undefined ",w&&(t+=" || ! Object.prototype.hasOwnProperty.call("+c+", '"+e.util.escapeQuotes(D)+"') "),t+=") && (missing"+a+" = "+e.util.toQuotedString(e.opts.jsonPointers?D:A)+") ) "}t+=") {  ";var R,b="' + "+($="missing"+a)+" + '";e.opts._errorDataPathProperty&&(e.errorPath=e.opts.jsonPointers?e.util.getPathExpr(P,$,!0):P+" + "+$),(R=R||[]).push(t),t="",!1!==e.createErrors?(t+=" { keyword: 'required' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(n)+" , params: { missingProperty: '"+b+"' } ",!1!==e.opts.messages&&(t+=" , message: '",t+=e.opts._errorDataPathProperty?"is a required property":"should have required property \\'"+b+"\\'",t+="' "),e.opts.verbose&&(t+=" , schema: validate.schema"+i+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+c+" "),t+=" } "):t+=" {} ";S=t;t=R.pop(),t+=!e.compositeRule&&l?e.async?" throw new ValidationError(["+S+"]); ":" validate.errors = ["+S+"]; return false; ":" var err = "+S+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",t+=" } else { "}else if(E){h||(t+=" var "+d+" = validate.schema"+i+"; ");var $,b="' + "+($="schema"+a+"["+(F="i"+a)+"]")+" + '";e.opts._errorDataPathProperty&&(e.errorPath=e.util.getPathExpr(P,$,e.opts.jsonPointers)),h&&(t+=" if ("+d+" && !Array.isArray("+d+")) {  var err =   ",!1!==e.createErrors?(t+=" { keyword: 'required' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(n)+" , params: { missingProperty: '"+b+"' } ",!1!==e.opts.messages&&(t+=" , message: '",t+=e.opts._errorDataPathProperty?"is a required property":"should have required property \\'"+b+"\\'",t+="' "),e.opts.verbose&&(t+=" , schema: validate.schema"+i+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+c+" "),t+=" } "):t+=" {} ",t+=";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } else if ("+d+" !== undefined) { "),t+=" for (var "+F+" = 0; "+F+" < "+d+".length; "+F+"++) { if ("+c+"["+d+"["+F+"]] === undefined ",w&&(t+=" || ! Object.prototype.hasOwnProperty.call("+c+", "+d+"["+F+"]) "),t+=") {  var err =   ",!1!==e.createErrors?(t+=" { keyword: 'required' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(n)+" , params: { missingProperty: '"+b+"' } ",!1!==e.opts.messages&&(t+=" , message: '",t+=e.opts._errorDataPathProperty?"is a required property":"should have required property \\'"+b+"\\'",t+="' "),e.opts.verbose&&(t+=" , schema: validate.schema"+i+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+c+" "),t+=" } "):t+=" {} ",t+=";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } } ",h&&(t+="  }  ")}else{var j=p;if(j)for(var D,O=-1,I=j.length-1;O<I;){D=j[O+=1];var A=e.util.getProperty(D),b=e.util.escapeQuotes(D),k=c+A;e.opts._errorDataPathProperty&&(e.errorPath=e.util.getPath(P,D,e.opts.jsonPointers)),t+=" if ( "+k+" === undefined ",w&&(t+=" || ! Object.prototype.hasOwnProperty.call("+c+", '"+e.util.escapeQuotes(D)+"') "),t+=") {  var err =   ",!1!==e.createErrors?(t+=" { keyword: 'required' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(n)+" , params: { missingProperty: '"+b+"' } ",!1!==e.opts.messages&&(t+=" , message: '",t+=e.opts._errorDataPathProperty?"is a required property":"should have required property \\'"+b+"\\'",t+="' "),e.opts.verbose&&(t+=" , schema: validate.schema"+i+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+c+" "),t+=" } "):t+=" {} ",t+=";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } "}}e.errorPath=P}else l&&(t+=" if (true) {");return t}},{}],37:[function(e,r,t){"use strict";r.exports=function(e,r){var t,a,s,o,i=" ",n=e.level,l=e.dataLevel,c=e.schema[r],u=e.schemaPath+e.util.getProperty(r),h=e.errSchemaPath+"/"+r,d=!e.opts.allErrors,p="data"+(l||""),f="valid"+n,m=e.opts.$data&&c&&c.$data,v=m?(i+=" var schema"+n+" = "+e.util.getData(c.$data,l,e.dataPathArr)+"; ","schema"+n):c;return(c||m)&&!1!==e.opts.uniqueItems?(m&&(i+=" var "+f+"; if ("+v+" === false || "+v+" === undefined) "+f+" = true; else if (typeof "+v+" != 'boolean') "+f+" = false; else { "),i+=" var i = "+p+".length , "+f+" = true , j; if (i > 1) { ",t=e.schema.items&&e.schema.items.type,a=Array.isArray(t),!t||"object"==t||"array"==t||a&&(0<=t.indexOf("object")||0<=t.indexOf("array"))?i+=" outer: for (;i--;) { for (j = i; j--;) { if (equal("+p+"[i], "+p+"[j])) { "+f+" = false; break outer; } } } ":(i+=" var itemIndices = {}, item; for (;i--;) { var item = "+p+"[i]; ",i+=" if ("+e.util["checkDataType"+(a?"s":"")](t,"item",e.opts.strictNumbers,!0)+") continue; ",a&&(i+=" if (typeof item == 'string') item = '\"' + item; "),i+=" if (typeof itemIndices[item] == 'number') { "+f+" = false; j = itemIndices[item]; break; } itemIndices[item] = i; } "),i+=" } ",m&&(i+="  }  "),(s=s||[]).push(i+=" if (!"+f+") {   "),i="",!1!==e.createErrors?(i+=" { keyword: 'uniqueItems' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(h)+" , params: { i: i, j: j } ",!1!==e.opts.messages&&(i+=" , message: 'should NOT have duplicate items (items ## ' + j + ' and ' + i + ' are identical)' "),e.opts.verbose&&(i+=" , schema:  ",i+=m?"validate.schema"+u:""+c,i+="         , parentSchema: validate.schema"+e.schemaPath+" , data: "+p+" "),i+=" } "):i+=" {} ",o=i,i=s.pop(),i+=!e.compositeRule&&d?e.async?" throw new ValidationError(["+o+"]); ":" validate.errors = ["+o+"]; return false; ":" var err = "+o+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",i+=" } ",d&&(i+=" else { ")):d&&(i+=" if (true) { "),i}},{}],38:[function(e,r,t){"use strict";r.exports=function(a,e){var r="",t=!0===a.schema.$async,s=a.util.schemaHasRulesExcept(a.schema,a.RULES.all,"$ref"),o=a.self._getId(a.schema);if(a.opts.strictKeywords){var i=a.util.schemaUnknownRules(a.schema,a.RULES.keywords);if(i){var n="unknown keyword: "+i;if("log"!==a.opts.strictKeywords)throw new Error(n);a.logger.warn(n)}}if(a.isTop&&(r+=" var validate = ",t&&(a.async=!0,r+="async "),r+="function(data, dataPath, parentData, parentDataProperty, rootData) { 'use strict'; ",o&&(a.opts.sourceCode||a.opts.processCode)&&(r+=" /*# sourceURL="+o+" */ ")),"boolean"==typeof a.schema||!s&&!a.schema.$ref){var l=a.level,c=a.dataLevel,u=a.schema[e="false schema"],h=a.schemaPath+a.util.getProperty(e),d=a.errSchemaPath+"/"+e,p=!a.opts.allErrors,f="data"+(c||""),m="valid"+l;return!1===a.schema?(a.isTop?p=!0:r+=" var "+m+" = false; ",(H=H||[]).push(r),r="",!1!==a.createErrors?(r+=" { keyword: 'false schema' , dataPath: (dataPath || '') + "+a.errorPath+" , schemaPath: "+a.util.toQuotedString(d)+" , params: {} ",!1!==a.opts.messages&&(r+=" , message: 'boolean schema is false' "),a.opts.verbose&&(r+=" , schema: false , parentSchema: validate.schema"+a.schemaPath+" , data: "+f+" "),r+=" } "):r+=" {} ",O=r,r=H.pop(),r+=!a.compositeRule&&p?a.async?" throw new ValidationError(["+O+"]); ":" validate.errors = ["+O+"]; return false; ":" var err = "+O+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; "):r+=a.isTop?t?" return data; ":" validate.errors = null; return true; ":" var "+m+" = true; ",a.isTop&&(r+=" }; return validate; "),r}if(a.isTop){var v=a.isTop,l=a.level=0,c=a.dataLevel=0,f="data";if(a.rootId=a.resolve.fullPath(a.self._getId(a.root.schema)),a.baseId=a.baseId||a.rootId,delete a.isTop,a.dataPathArr=[void 0],void 0!==a.schema.default&&a.opts.useDefaults&&a.opts.strictDefaults){var y="default is ignored in the schema root";if("log"!==a.opts.strictDefaults)throw new Error(y);a.logger.warn(y)}r+=" var vErrors = null; ",r+=" var errors = 0;     ",r+=" if (rootData === undefined) rootData = data; "}else{l=a.level,f="data"+((c=a.dataLevel)||"");if(o&&(a.baseId=a.resolve.url(a.baseId,o)),t&&!a.async)throw new Error("async schema in sync schema");r+=" var errs_"+l+" = errors;"}var g,m="valid"+l,p=!a.opts.allErrors,P="",E="",w=a.schema.type,b=Array.isArray(w);if(w&&a.opts.nullable&&!0===a.schema.nullable&&(b?-1==w.indexOf("null")&&(w=w.concat("null")):"null"!=w&&(w=[w,"null"],b=!0)),b&&1==w.length&&(w=w[0],b=!1),a.schema.$ref&&s){if("fail"==a.opts.extendRefs)throw new Error('$ref: validation keywords used in schema at path "'+a.errSchemaPath+'" (see option extendRefs)');!0!==a.opts.extendRefs&&(s=!1,a.logger.warn('$ref: keywords ignored in schema at path "'+a.errSchemaPath+'"'))}if(a.schema.$comment&&a.opts.$comment&&(r+=" "+a.RULES.all.$comment.code(a,"$comment")),w){a.opts.coerceTypes&&(g=a.util.coerceToTypes(a.opts.coerceTypes,w));var S=a.RULES.types[w];if(g||b||!0===S||S&&!G(S)){h=a.schemaPath+".type",d=a.errSchemaPath+"/type",h=a.schemaPath+".type",d=a.errSchemaPath+"/type";if(r+=" if ("+a.util[b?"checkDataTypes":"checkDataType"](w,f,a.opts.strictNumbers,!0)+") { ",g){var _="dataType"+l,F="coerced"+l;r+=" var "+_+" = typeof "+f+"; ","array"==a.opts.coerceTypes&&(r+=" if ("+_+" == 'object' && Array.isArray("+f+")) "+_+" = 'array'; "),r+=" var "+F+" = undefined; ";var x="",R=g;if(R)for(var $,j=-1,D=R.length-1;j<D;)$=R[j+=1],j&&(r+=" if ("+F+" === undefined) { ",x+="}"),"array"==a.opts.coerceTypes&&"array"!=$&&(r+=" if ("+_+" == 'array' && "+f+".length == 1) { "+F+" = "+f+" = "+f+"[0]; "+_+" = typeof "+f+";  } "),"string"==$?r+=" if ("+_+" == 'number' || "+_+" == 'boolean') "+F+" = '' + "+f+"; else if ("+f+" === null) "+F+" = ''; ":"number"==$||"integer"==$?(r+=" if ("+_+" == 'boolean' || "+f+" === null || ("+_+" == 'string' && "+f+" && "+f+" == +"+f+" ","integer"==$&&(r+=" && !("+f+" % 1)"),r+=")) "+F+" = +"+f+"; "):"boolean"==$?r+=" if ("+f+" === 'false' || "+f+" === 0 || "+f+" === null) "+F+" = false; else if ("+f+" === 'true' || "+f+" === 1) "+F+" = true; ":"null"==$?r+=" if ("+f+" === '' || "+f+" === 0 || "+f+" === false) "+F+" = null; ":"array"==a.opts.coerceTypes&&"array"==$&&(r+=" if ("+_+" == 'string' || "+_+" == 'number' || "+_+" == 'boolean' || "+f+" == null) "+F+" = ["+f+"]; ");(H=H||[]).push(r+=" "+x+" if ("+F+" === undefined) {   "),r="",!1!==a.createErrors?(r+=" { keyword: 'type' , dataPath: (dataPath || '') + "+a.errorPath+" , schemaPath: "+a.util.toQuotedString(d)+" , params: { type: '",r+=b?""+w.join(","):""+w,r+="' } ",!1!==a.opts.messages&&(r+=" , message: 'should be ",r+=b?""+w.join(","):""+w,r+="' "),a.opts.verbose&&(r+=" , schema: validate.schema"+h+" , parentSchema: validate.schema"+a.schemaPath+" , data: "+f+" "),r+=" } "):r+=" {} ";var O=r;r=H.pop(),r+=!a.compositeRule&&p?a.async?" throw new ValidationError(["+O+"]); ":" validate.errors = ["+O+"]; return false; ":" var err = "+O+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",r+=" } else {  ";var I=c?"data"+(c-1||""):"parentData";r+=" "+f+" = "+F+"; ",c||(r+="if ("+I+" !== undefined)"),r+=" "+I+"["+(c?a.dataPathArr[c]:"parentDataProperty")+"] = "+F+"; } "}else{(H=H||[]).push(r),r="",!1!==a.createErrors?(r+=" { keyword: 'type' , dataPath: (dataPath || '') + "+a.errorPath+" , schemaPath: "+a.util.toQuotedString(d)+" , params: { type: '",r+=b?""+w.join(","):""+w,r+="' } ",!1!==a.opts.messages&&(r+=" , message: 'should be ",r+=b?""+w.join(","):""+w,r+="' "),a.opts.verbose&&(r+=" , schema: validate.schema"+h+" , parentSchema: validate.schema"+a.schemaPath+" , data: "+f+" "),r+=" } "):r+=" {} ";O=r;r=H.pop(),r+=!a.compositeRule&&p?a.async?" throw new ValidationError(["+O+"]); ":" validate.errors = ["+O+"]; return false; ":" var err = "+O+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; "}r+=" } "}}if(a.schema.$ref&&!s)r+=" "+a.RULES.all.$ref.code(a,"$ref")+" ",p&&(r+=" } if (errors === ",r+=v?"0":"errs_"+l,r+=") { ",E+="}");else{var A=a.RULES;if(A)for(var k=-1,C=A.length-1;k<C;)if(G(S=A[k+=1])){if(S.type&&(r+=" if ("+a.util.checkDataType(S.type,f,a.opts.strictNumbers)+") { "),a.opts.useDefaults)if("object"==S.type&&a.schema.properties){var u=a.schema.properties,L=Object.keys(u);if(L)for(var N,z=-1,T=L.length-1;z<T;){if(void 0!==(V=u[N=L[z+=1]]).default){var q=f+a.util.getProperty(N);if(a.compositeRule){if(a.opts.strictDefaults){y="default is ignored for: "+q;if("log"!==a.opts.strictDefaults)throw new Error(y);a.logger.warn(y)}}else r+=" if ("+q+" === undefined ","empty"==a.opts.useDefaults&&(r+=" || "+q+" === null || "+q+" === '' "),r+=" ) "+q+" = ",r+="shared"==a.opts.useDefaults?" "+a.useDefault(V.default)+" ":" "+JSON.stringify(V.default)+" ",r+="; "}}}else if("array"==S.type&&Array.isArray(a.schema.items)){var Q=a.schema.items;if(Q)for(var V,j=-1,U=Q.length-1;j<U;)if(void 0!==(V=Q[j+=1]).default){q=f+"["+j+"]";if(a.compositeRule){if(a.opts.strictDefaults){y="default is ignored for: "+q;if("log"!==a.opts.strictDefaults)throw new Error(y);a.logger.warn(y)}}else r+=" if ("+q+" === undefined ","empty"==a.opts.useDefaults&&(r+=" || "+q+" === null || "+q+" === '' "),r+=" ) "+q+" = ",r+="shared"==a.opts.useDefaults?" "+a.useDefault(V.default)+" ":" "+JSON.stringify(V.default)+" ",r+="; "}}var H,K=S.rules;if(K)for(var M,B,J=-1,Z=K.length-1;J<Z;){!Y(B=K[J+=1])||(M=B.code(a,B.keyword,S.type))&&(r+=" "+M+" ",p&&(P+="}"))}p&&(r+=" "+P+" ",P=""),S.type&&(r+=" } ",w&&w===S.type&&!g&&(h=a.schemaPath+".type",d=a.errSchemaPath+"/type",(H=H||[]).push(r+=" else { "),r="",!1!==a.createErrors?(r+=" { keyword: 'type' , dataPath: (dataPath || '') + "+a.errorPath+" , schemaPath: "+a.util.toQuotedString(d)+" , params: { type: '",r+=b?""+w.join(","):""+w,r+="' } ",!1!==a.opts.messages&&(r+=" , message: 'should be ",r+=b?""+w.join(","):""+w,r+="' "),a.opts.verbose&&(r+=" , schema: validate.schema"+h+" , parentSchema: validate.schema"+a.schemaPath+" , data: "+f+" "),r+=" } "):r+=" {} ",O=r,r=H.pop(),r+=!a.compositeRule&&p?a.async?" throw new ValidationError(["+O+"]); ":" validate.errors = ["+O+"]; return false; ":" var err = "+O+";  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",r+=" } ")),p&&(r+=" if (errors === ",r+=v?"0":"errs_"+l,r+=") { ",E+="}")}}function G(e){for(var r=e.rules,t=0;t<r.length;t++)if(Y(r[t]))return 1}function Y(e){return void 0!==a.schema[e.keyword]||e.implements&&function(e){for(var r=e.implements,t=0;t<r.length;t++)if(void 0!==a.schema[r[t]])return 1}(e)}return p&&(r+=" "+E+" "),v?(t?(r+=" if (errors === 0) return data;           ",r+=" else throw new ValidationError(vErrors); "):(r+=" validate.errors = vErrors; ",r+=" return errors === 0;       "),r+=" }; return validate;"):r+=" var "+m+" = errors === errs_"+l+";",r}},{}],39:[function(e,r,t){"use strict";var i=/^[a-z_$][a-z0-9_$-]*$/i,l=e("./dotjs/custom"),a=e("./definition_schema");function s(e,r){s.errors=null;var t=this._validateKeyword=this._validateKeyword||this.compile(a,!0);if(t(e))return!0;if(s.errors=t.errors,r)throw new Error("custom keyword definition is invalid: "+this.errorsText(t.errors));return!1}r.exports={add:function(e,r){var n=this.RULES;if(n.keywords[e])throw new Error("Keyword "+e+" is already defined");if(!i.test(e))throw new Error("Keyword "+e+" is not a valid identifier");if(r){this.validateKeyword(r,!0);var t=r.type;if(Array.isArray(t))for(var a=0;a<t.length;a++)o(e,t[a],r);else o(e,t,r);var s=r.metaSchema;s&&(r.$data&&this._opts.$data&&(s={anyOf:[s,{$ref:"https://raw.githubusercontent.com/ajv-validator/ajv/master/lib/refs/data.json#"}]}),r.validateSchema=this.compile(s,!0))}function o(e,r,t){for(var a,s=0;s<n.length;s++){var o=n[s];if(o.type==r){a=o;break}}a||n.push(a={type:r,rules:[]});var i={keyword:e,definition:t,custom:!0,code:l,implements:t.implements};a.rules.push(i),n.custom[e]=i}return n.keywords[e]=n.all[e]=!0,this},get:function(e){var r=this.RULES.custom[e];return r?r.definition:this.RULES.keywords[e]||!1},remove:function(e){var r=this.RULES;delete r.keywords[e],delete r.all[e],delete r.custom[e];for(var t=0;t<r.length;t++)for(var a=r[t].rules,s=0;s<a.length;s++)if(a[s].keyword==e){a.splice(s,1);break}return this},validate:s}},{"./definition_schema":12,"./dotjs/custom":22}],40:[function(e,r,t){r.exports={$schema:"http://json-schema.org/draft-07/schema#",$id:"https://raw.githubusercontent.com/ajv-validator/ajv/master/lib/refs/data.json#",description:"Meta-schema for $data reference (JSON Schema extension proposal)",type:"object",required:["$data"],properties:{$data:{type:"string",anyOf:[{format:"relative-json-pointer"},{format:"json-pointer"}]}},additionalProperties:!1}},{}],41:[function(e,r,t){r.exports={$schema:"http://json-schema.org/draft-07/schema#",$id:"http://json-schema.org/draft-07/schema#",title:"Core schema meta-schema",definitions:{schemaArray:{type:"array",minItems:1,items:{$ref:"#"}},nonNegativeInteger:{type:"integer",minimum:0},nonNegativeIntegerDefault0:{allOf:[{$ref:"#/definitions/nonNegativeInteger"},{default:0}]},simpleTypes:{enum:["array","boolean","integer","null","number","object","string"]},stringArray:{type:"array",items:{type:"string"},uniqueItems:!0,default:[]}},type:["object","boolean"],properties:{$id:{type:"string",format:"uri-reference"},$schema:{type:"string",format:"uri"},$ref:{type:"string",format:"uri-reference"},$comment:{type:"string"},title:{type:"string"},description:{type:"string"},default:!0,readOnly:{type:"boolean",default:!1},examples:{type:"array",items:!0},multipleOf:{type:"number",exclusiveMinimum:0},maximum:{type:"number"},exclusiveMaximum:{type:"number"},minimum:{type:"number"},exclusiveMinimum:{type:"number"},maxLength:{$ref:"#/definitions/nonNegativeInteger"},minLength:{$ref:"#/definitions/nonNegativeIntegerDefault0"},pattern:{type:"string",format:"regex"},additionalItems:{$ref:"#"},items:{anyOf:[{$ref:"#"},{$ref:"#/definitions/schemaArray"}],default:!0},maxItems:{$ref:"#/definitions/nonNegativeInteger"},minItems:{$ref:"#/definitions/nonNegativeIntegerDefault0"},uniqueItems:{type:"boolean",default:!1},contains:{$ref:"#"},maxProperties:{$ref:"#/definitions/nonNegativeInteger"},minProperties:{$ref:"#/definitions/nonNegativeIntegerDefault0"},required:{$ref:"#/definitions/stringArray"},additionalProperties:{$ref:"#"},definitions:{type:"object",additionalProperties:{$ref:"#"},default:{}},properties:{type:"object",additionalProperties:{$ref:"#"},default:{}},patternProperties:{type:"object",additionalProperties:{$ref:"#"},propertyNames:{format:"regex"},default:{}},dependencies:{type:"object",additionalProperties:{anyOf:[{$ref:"#"},{$ref:"#/definitions/stringArray"}]}},propertyNames:{$ref:"#"},const:!0,enum:{type:"array",items:!0,minItems:1,uniqueItems:!0},type:{anyOf:[{$ref:"#/definitions/simpleTypes"},{type:"array",items:{$ref:"#/definitions/simpleTypes"},minItems:1,uniqueItems:!0}]},format:{type:"string"},contentMediaType:{type:"string"},contentEncoding:{type:"string"},if:{$ref:"#"},then:{$ref:"#"},else:{$ref:"#"},allOf:{$ref:"#/definitions/schemaArray"},anyOf:{$ref:"#/definitions/schemaArray"},oneOf:{$ref:"#/definitions/schemaArray"},not:{$ref:"#"}},default:!0}},{}],42:[function(e,r,t){"use strict";r.exports=function e(r,t){if(r===t)return!0;if(r&&t&&"object"==typeof r&&"object"==typeof t){if(r.constructor!==t.constructor)return!1;var a,s,o;if(Array.isArray(r)){if((a=r.length)!=t.length)return!1;for(s=a;0!=s--;)if(!e(r[s],t[s]))return!1;return!0}if(r.constructor===RegExp)return r.source===t.source&&r.flags===t.flags;if(r.valueOf!==Object.prototype.valueOf)return r.valueOf()===t.valueOf();if(r.toString!==Object.prototype.toString)return r.toString()===t.toString();if((a=(o=Object.keys(r)).length)!==Object.keys(t).length)return!1;for(s=a;0!=s--;)if(!Object.prototype.hasOwnProperty.call(t,o[s]))return!1;for(s=a;0!=s--;){var i=o[s];if(!e(r[i],t[i]))return!1}return!0}return r!=r&&t!=t}},{}],43:[function(e,r,t){"use strict";r.exports=function(e,r){"function"==typeof(r=r||{})&&(r={cmp:r});var a,l="boolean"==typeof r.cycles&&r.cycles,c=r.cmp&&(a=r.cmp,function(t){return function(e,r){return a({key:e,value:t[e]},{key:r,value:t[r]})}}),u=[];return function e(r){if(r&&r.toJSON&&"function"==typeof r.toJSON&&(r=r.toJSON()),void 0!==r){if("number"==typeof r)return isFinite(r)?""+r:"null";if("object"!=typeof r)return JSON.stringify(r);if(Array.isArray(r)){for(s="[",o=0;o<r.length;o++)o&&(s+=","),s+=e(r[o])||"null";return s+"]"}if(null===r)return"null";if(-1!==u.indexOf(r)){if(l)return JSON.stringify("__cycle__");throw new TypeError("Converting circular structure to JSON")}for(var t=u.push(r)-1,a=Object.keys(r).sort(c&&c(r)),s="",o=0;o<a.length;o++){var i=a[o],n=e(r[i]);n&&(s&&(s+=","),s+=JSON.stringify(i)+":"+n)}return u.splice(t,1),"{"+s+"}"}}(e)}},{}],44:[function(e,r,t){"use strict";var m=r.exports=function(e,r,t){"function"==typeof r&&(t=r,r={}),function e(r,t,a,s,o,i,n,l,c,u){if(s&&"object"==typeof s&&!Array.isArray(s)){for(var h in t(s,o,i,n,l,c,u),s){var d=s[h];if(Array.isArray(d)){if(h in m.arrayKeywords)for(var p=0;p<d.length;p++)e(r,t,a,d[p],o+"/"+h+"/"+p,i,o,h,s,p)}else if(h in m.propsKeywords){if(d&&"object"==typeof d)for(var f in d)e(r,t,a,d[f],o+"/"+h+"/"+f.replace(/~/g,"~0").replace(/\//g,"~1"),i,o,h,s,f)}else(h in m.keywords||r.allKeys&&!(h in m.skipKeywords))&&e(r,t,a,d,o+"/"+h,i,o,h,s)}a(s,o,i,n,l,c,u)}}(r,"function"==typeof(t=r.cb||t)?t:t.pre||function(){},t.post||function(){},e,"",e)};m.keywords={additionalItems:!0,items:!0,contains:!0,additionalProperties:!0,propertyNames:!0,not:!0},m.arrayKeywords={items:!0,allOf:!0,anyOf:!0,oneOf:!0},m.propsKeywords={definitions:!0,properties:!0,patternProperties:!0,dependencies:!0},m.skipKeywords={default:!0,enum:!0,const:!0,required:!0,maximum:!0,minimum:!0,exclusiveMaximum:!0,exclusiveMinimum:!0,multipleOf:!0,maxLength:!0,minLength:!0,pattern:!0,format:!0,maxItems:!0,minItems:!0,uniqueItems:!0,maxProperties:!0,minProperties:!0}},{}],45:[function(e,r,t){var a;a=this,function(e){"use strict";function J(){for(var e=arguments.length,r=Array(e),t=0;t<e;t++)r[t]=arguments[t];if(1<r.length){r[0]=r[0].slice(0,-1);for(var a=r.length-1,s=1;s<a;++s)r[s]=r[s].slice(1,-1);return r[a]=r[a].slice(1),r.join("")}return r[0]}function Z(e){return"(?:"+e+")"}function a(e){return void 0===e?"undefined":null===e?"null":Object.prototype.toString.call(e).split(" ").pop().split("]").shift().toLowerCase()}function f(e){return e.toUpperCase()}function r(e){var r="[A-Za-z]",t="[0-9]",a=J(t,"[A-Fa-f]"),s=Z(Z("%[EFef]"+a+"%"+a+a+"%"+a+a)+"|"+Z("%[89A-Fa-f]"+a+"%"+a+a)+"|"+Z("%"+a+a)),o="[\\!\\$\\&\\'\\(\\)\\*\\+\\,\\;\\=]",i=J("[\\:\\/\\?\\#\\[\\]\\@]",o),n=e?"[\\uE000-\\uF8FF]":"[]",l=J(r,t,"[\\-\\.\\_\\~]",e?"[\\xA0-\\u200D\\u2010-\\u2029\\u202F-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]":"[]"),c=Z(r+J(r,t,"[\\+\\-\\.]")+"*"),u=Z(Z(s+"|"+J(l,o,"[\\:]"))+"*"),h=(Z("(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9][0-9])|(?:[1-9][0-9])|"+t),Z("(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9][0-9])|(?:0?[1-9][0-9])|0?0?"+t)),d=Z(h+"\\."+h+"\\."+h+"\\."+h),p=Z(a+"{1,4}"),f=Z(Z(p+"\\:"+p)+"|"+d),m=Z(Z(p+"\\:")+"{6}"+f),v=Z("\\:\\:"+Z(p+"\\:")+"{5}"+f),y=Z(Z(p)+"?\\:\\:"+Z(p+"\\:")+"{4}"+f),g=Z(Z(Z(p+"\\:")+"{0,1}"+p)+"?\\:\\:"+Z(p+"\\:")+"{3}"+f),P=Z(Z(Z(p+"\\:")+"{0,2}"+p)+"?\\:\\:"+Z(p+"\\:")+"{2}"+f),E=Z(Z(Z(p+"\\:")+"{0,3}"+p)+"?\\:\\:"+p+"\\:"+f),w=Z(Z(Z(p+"\\:")+"{0,4}"+p)+"?\\:\\:"+f),b=Z(Z(Z(p+"\\:")+"{0,5}"+p)+"?\\:\\:"+p),S=Z(Z(Z(p+"\\:")+"{0,6}"+p)+"?\\:\\:"),_=Z([m,v,y,g,P,E,w,b,S].join("|")),F=Z(Z(l+"|"+s)+"+"),x=(Z(_+"\\%25"+F),Z(_+Z("\\%25|\\%(?!"+a+"{2})")+F)),R=Z("[vV]"+a+"+\\."+J(l,o,"[\\:]")+"+"),$=Z("\\["+Z(x+"|"+_+"|"+R)+"\\]"),j=Z(Z(s+"|"+J(l,o))+"*"),D=Z($+"|"+d+"(?!"+j+")|"+j),O=Z(t+"*"),I=Z(Z(u+"@")+"?"+D+Z("\\:"+O)+"?"),A=Z(s+"|"+J(l,o,"[\\:\\@]")),k=Z(A+"*"),C=Z(A+"+"),L=Z(Z(s+"|"+J(l,o,"[\\@]"))+"+"),N=Z(Z("\\/"+k)+"*"),z=Z("\\/"+Z(C+N)+"?"),T=Z(L+N),q=Z(C+N),Q="(?!"+A+")",V=(Z(N+"|"+z+"|"+T+"|"+q+"|"+Q),Z(Z(A+"|"+J("[\\/\\?]",n))+"*")),U=Z(Z(A+"|[\\/\\?]")+"*"),H=Z(Z("\\/\\/"+I+N)+"|"+z+"|"+q+"|"+Q),K=Z(c+"\\:"+H+Z("\\?"+V)+"?"+Z("\\#"+U)+"?"),M=Z(Z("\\/\\/"+I+N)+"|"+z+"|"+T+"|"+Q),B=Z(M+Z("\\?"+V)+"?"+Z("\\#"+U)+"?");Z(K+"|"+B),Z(c+"\\:"+H+Z("\\?"+V)+"?"),Z(Z("\\/\\/("+Z("("+u+")@")+"?("+D+")"+Z("\\:("+O+")")+"?)")+"?("+N+"|"+z+"|"+q+"|"+Q+")"),Z("\\?("+V+")"),Z("\\#("+U+")"),Z(Z("\\/\\/("+Z("("+u+")@")+"?("+D+")"+Z("\\:("+O+")")+"?)")+"?("+N+"|"+z+"|"+T+"|"+Q+")"),Z("\\?("+V+")"),Z("\\#("+U+")"),Z(Z("\\/\\/("+Z("("+u+")@")+"?("+D+")"+Z("\\:("+O+")")+"?)")+"?("+N+"|"+z+"|"+q+"|"+Q+")"),Z("\\?("+V+")"),Z("\\#("+U+")"),Z("("+u+")@"),Z("\\:("+O+")");return{NOT_SCHEME:new RegExp(J("[^]",r,t,"[\\+\\-\\.]"),"g"),NOT_USERINFO:new RegExp(J("[^\\%\\:]",l,o),"g"),NOT_HOST:new RegExp(J("[^\\%\\[\\]\\:]",l,o),"g"),NOT_PATH:new RegExp(J("[^\\%\\/\\:\\@]",l,o),"g"),NOT_PATH_NOSCHEME:new RegExp(J("[^\\%\\/\\@]",l,o),"g"),NOT_QUERY:new RegExp(J("[^\\%]",l,o,"[\\:\\@\\/\\?]",n),"g"),NOT_FRAGMENT:new RegExp(J("[^\\%]",l,o,"[\\:\\@\\/\\?]"),"g"),ESCAPE:new RegExp(J("[^]",l,o),"g"),UNRESERVED:new RegExp(l,"g"),OTHER_CHARS:new RegExp(J("[^\\%]",l,i),"g"),PCT_ENCODED:new RegExp(s,"g"),IPV4ADDRESS:new RegExp("^("+d+")$"),IPV6ADDRESS:new RegExp("^\\[?("+_+")"+Z(Z("\\%25|\\%(?!"+a+"{2})")+"("+F+")")+"?\\]?$")}}var u=r(!1),h=r(!0),w=function(e,r){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return function(e,r){var t=[],a=!0,s=!1,o=void 0;try{for(var i,n=e[Symbol.iterator]();!(a=(i=n.next()).done)&&(t.push(i.value),!r||t.length!==r);a=!0);}catch(e){s=!0,o=e}finally{try{!a&&n.return&&n.return()}finally{if(s)throw o}}return t}(e,r);throw new TypeError("Invalid attempt to destructure non-iterable instance")},A=2147483647,t=/^xn--/,s=/[^\0-\x7E]/,o=/[\x2E\u3002\uFF0E\uFF61]/g,i={overflow:"Overflow: input needs wider integers to process","not-basic":"Illegal input >= 0x80 (not a basic code point)","invalid-input":"Invalid input"},k=Math.floor,C=String.fromCharCode;function L(e){throw new RangeError(i[e])}function n(e,r){var t=e.split("@"),a="";return 1<t.length&&(a=t[0]+"@",e=t[1]),a+function(e,r){for(var t=[],a=e.length;a--;)t[a]=r(e[a]);return t}((e=e.replace(o,".")).split("."),r).join(".")}function N(e){for(var r=[],t=0,a=e.length;t<a;){var s,o=e.charCodeAt(t++);55296<=o&&o<=56319&&t<a?56320==(64512&(s=e.charCodeAt(t++)))?r.push(((1023&o)<<10)+(1023&s)+65536):(r.push(o),t--):r.push(o)}return r}function z(e,r){return e+22+75*(e<26)-((0!=r)<<5)}function T(e,r,t){var a=0;for(e=t?k(e/700):e>>1,e+=k(e/r);455<e;a+=36)e=k(e/35);return k(a+36*e/(e+38))}function l(e){var r=[],t=e.length,a=0,s=128,o=72,i=e.lastIndexOf("-");i<0&&(i=0);for(var n=0;n<i;++n)128<=e.charCodeAt(n)&&L("not-basic"),r.push(e.charCodeAt(n));for(var l,c=0<i?i+1:0;c<t;){for(var u=a,h=1,d=36;;d+=36){t<=c&&L("invalid-input");var p=(l=e.charCodeAt(c++))-48<10?l-22:l-65<26?l-65:l-97<26?l-97:36;(36<=p||p>k((A-a)/h))&&L("overflow"),a+=p*h;var f=d<=o?1:o+26<=d?26:d-o;if(p<f)break;var m=36-f;h>k(A/m)&&L("overflow"),h*=m}var v=r.length+1,o=T(a-u,v,0==u);k(a/v)>A-s&&L("overflow"),s+=k(a/v),a%=v,r.splice(a++,0,s)}return String.fromCodePoint.apply(String,r)}function c(e){var r=[],t=(e=N(e)).length,a=128,s=0,o=72,i=!0,n=!1,l=void 0;try{for(var c,u=e[Symbol.iterator]();!(i=(c=u.next()).done);i=!0){var h=c.value;h<128&&r.push(C(h))}}catch(e){n=!0,l=e}finally{try{!i&&u.return&&u.return()}finally{if(n)throw l}}var d=r.length,p=d;for(d&&r.push("-");p<t;){var f=A,m=!0,v=!1,y=void 0;try{for(var g,P=e[Symbol.iterator]();!(m=(g=P.next()).done);m=!0){var E=g.value;a<=E&&E<f&&(f=E)}}catch(e){v=!0,y=e}finally{try{!m&&P.return&&P.return()}finally{if(v)throw y}}var w=p+1;f-a>k((A-s)/w)&&L("overflow"),s+=(f-a)*w,a=f;var b=!0,S=!1,_=void 0;try{for(var F,x=e[Symbol.iterator]();!(b=(F=x.next()).done);b=!0){var R=F.value;if(R<a&&++s>A&&L("overflow"),R==a){for(var $=s,j=36;;j+=36){var D=j<=o?1:o+26<=j?26:j-o;if($<D)break;var O=$-D,I=36-D;r.push(C(z(D+O%I,0))),$=k(O/I)}r.push(C(z($,0))),o=T(s,w,p==d),s=0,++p}}}catch(e){S=!0,_=e}finally{try{!b&&x.return&&x.return()}finally{if(S)throw _}}++s,++a}return r.join("")}var v={version:"2.1.0",ucs2:{decode:N,encode:function(e){return String.fromCodePoint.apply(String,function(e){if(Array.isArray(e)){for(var r=0,t=Array(e.length);r<e.length;r++)t[r]=e[r];return t}return Array.from(e)}(e))}},decode:l,encode:c,toASCII:function(e){return n(e,function(e){return s.test(e)?"xn--"+c(e):e})},toUnicode:function(e){return n(e,function(e){return t.test(e)?l(e.slice(4).toLowerCase()):e})}},d={};function m(e){var r=e.charCodeAt(0);return r<16?"%0"+r.toString(16).toUpperCase():r<128?"%"+r.toString(16).toUpperCase():r<2048?"%"+(r>>6|192).toString(16).toUpperCase()+"%"+(63&r|128).toString(16).toUpperCase():"%"+(r>>12|224).toString(16).toUpperCase()+"%"+(r>>6&63|128).toString(16).toUpperCase()+"%"+(63&r|128).toString(16).toUpperCase()}function p(e){for(var r="",t=0,a=e.length;t<a;){var s,o,i,n=parseInt(e.substr(t+1,2),16);n<128?(r+=String.fromCharCode(n),t+=3):194<=n&&n<224?(6<=a-t?(s=parseInt(e.substr(t+4,2),16),r+=String.fromCharCode((31&n)<<6|63&s)):r+=e.substr(t,6),t+=6):224<=n?(9<=a-t?(o=parseInt(e.substr(t+4,2),16),i=parseInt(e.substr(t+7,2),16),r+=String.fromCharCode((15&n)<<12|(63&o)<<6|63&i)):r+=e.substr(t,9),t+=9):(r+=e.substr(t,3),t+=3)}return r}function y(e,t){function r(e){var r=p(e);return r.match(t.UNRESERVED)?r:e}return e.scheme&&(e.scheme=String(e.scheme).replace(t.PCT_ENCODED,r).toLowerCase().replace(t.NOT_SCHEME,"")),void 0!==e.userinfo&&(e.userinfo=String(e.userinfo).replace(t.PCT_ENCODED,r).replace(t.NOT_USERINFO,m).replace(t.PCT_ENCODED,f)),void 0!==e.host&&(e.host=String(e.host).replace(t.PCT_ENCODED,r).toLowerCase().replace(t.NOT_HOST,m).replace(t.PCT_ENCODED,f)),void 0!==e.path&&(e.path=String(e.path).replace(t.PCT_ENCODED,r).replace(e.scheme?t.NOT_PATH:t.NOT_PATH_NOSCHEME,m).replace(t.PCT_ENCODED,f)),void 0!==e.query&&(e.query=String(e.query).replace(t.PCT_ENCODED,r).replace(t.NOT_QUERY,m).replace(t.PCT_ENCODED,f)),void 0!==e.fragment&&(e.fragment=String(e.fragment).replace(t.PCT_ENCODED,r).replace(t.NOT_FRAGMENT,m).replace(t.PCT_ENCODED,f)),e}function b(e){return e.replace(/^0*(.*)/,"$1")||"0"}function S(e,r){var t=e.match(r.IPV4ADDRESS)||[],a=w(t,2)[1];return a?a.split(".").map(b).join("."):e}function g(e,r){var t=e.match(r.IPV6ADDRESS)||[],a=w(t,3),s=a[1],o=a[2];if(s){for(var i=s.toLowerCase().split("::").reverse(),n=w(i,2),l=n[0],c=n[1],u=c?c.split(":").map(b):[],h=l.split(":").map(b),d=r.IPV4ADDRESS.test(h[h.length-1]),p=d?7:8,f=h.length-p,m=Array(p),v=0;v<p;++v)m[v]=u[v]||h[f+v]||"";d&&(m[p-1]=S(m[p-1],r));var y,g,P=m.reduce(function(e,r,t){var a;return r&&"0"!==r||((a=e[e.length-1])&&a.index+a.length===t?a.length++:e.push({index:t,length:1})),e},[]).sort(function(e,r){return r.length-e.length})[0],E=void 0;return E=P&&1<P.length?(y=m.slice(0,P.index),g=m.slice(P.index+P.length),y.join(":")+"::"+g.join(":")):m.join(":"),o&&(E+="%"+o),E}return e}var P=/^(?:([^:\/?#]+):)?(?:\/\/((?:([^\/?#@]*)@)?(\[[^\/?#\]]+\]|[^\/?#:]*)(?:\:(\d*))?))?([^?#]*)(?:\?([^#]*))?(?:#((?:.|\n|\r)*))?/i,E=void 0==="".match(/(){0}/)[1];function _(e){var r=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},t={},a=!1!==r.iri?h:u;"suffix"===r.reference&&(e=(r.scheme?r.scheme+":":"")+"//"+e);var s=e.match(P);if(s){E?(t.scheme=s[1],t.userinfo=s[3],t.host=s[4],t.port=parseInt(s[5],10),t.path=s[6]||"",t.query=s[7],t.fragment=s[8],isNaN(t.port)&&(t.port=s[5])):(t.scheme=s[1]||void 0,t.userinfo=-1!==e.indexOf("@")?s[3]:void 0,t.host=-1!==e.indexOf("//")?s[4]:void 0,t.port=parseInt(s[5],10),t.path=s[6]||"",t.query=-1!==e.indexOf("?")?s[7]:void 0,t.fragment=-1!==e.indexOf("#")?s[8]:void 0,isNaN(t.port)&&(t.port=e.match(/\/\/(?:.|\n)*\:(?:\/|\?|\#|$)/)?s[4]:void 0)),t.host&&(t.host=g(S(t.host,a),a)),t.reference=void 0!==t.scheme||void 0!==t.userinfo||void 0!==t.host||void 0!==t.port||t.path||void 0!==t.query?void 0===t.scheme?"relative":void 0===t.fragment?"absolute":"uri":"same-document",r.reference&&"suffix"!==r.reference&&r.reference!==t.reference&&(t.error=t.error||"URI is not a "+r.reference+" reference.");var o=d[(r.scheme||t.scheme||"").toLowerCase()];if(r.unicodeSupport||o&&o.unicodeSupport)y(t,a);else{if(t.host&&(r.domainHost||o&&o.domainHost))try{t.host=v.toASCII(t.host.replace(a.PCT_ENCODED,p).toLowerCase())}catch(e){t.error=t.error||"Host's domain name can not be converted to ASCII via punycode: "+e}y(t,u)}o&&o.parse&&o.parse(t,r)}else t.error=t.error||"URI can not be parsed.";return t}var F=/^\.\.?\//,x=/^\/\.(\/|$)/,R=/^\/\.\.(\/|$)/,$=/^\/?(?:.|\n)*?(?=\/|$)/;function j(e){for(var r=[];e.length;)if(e.match(F))e=e.replace(F,"");else if(e.match(x))e=e.replace(x,"/");else if(e.match(R))e=e.replace(R,"/"),r.pop();else if("."===e||".."===e)e="";else{var t=e.match($);if(!t)throw new Error("Unexpected dot segment condition");var a=t[0];e=e.slice(a.length),r.push(a)}return r.join("")}function D(r){var t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},e=t.iri?h:u,a=[],s=d[(t.scheme||r.scheme||"").toLowerCase()];if(s&&s.serialize&&s.serialize(r,t),r.host&&!e.IPV6ADDRESS.test(r.host)&&(t.domainHost||s&&s.domainHost))try{r.host=t.iri?v.toUnicode(r.host):v.toASCII(r.host.replace(e.PCT_ENCODED,p).toLowerCase())}catch(e){r.error=r.error||"Host's domain name can not be converted to "+(t.iri?"Unicode":"ASCII")+" via punycode: "+e}y(r,e),"suffix"!==t.reference&&r.scheme&&(a.push(r.scheme),a.push(":"));var o,i,n,l,c=(i=!1!==t.iri?h:u,n=[],void 0!==(o=r).userinfo&&(n.push(o.userinfo),n.push("@")),void 0!==o.host&&n.push(g(S(String(o.host),i),i).replace(i.IPV6ADDRESS,function(e,r,t){return"["+r+(t?"%25"+t:"")+"]"})),"number"==typeof o.port&&(n.push(":"),n.push(o.port.toString(10))),n.length?n.join(""):void 0);return void 0!==c&&("suffix"!==t.reference&&a.push("//"),a.push(c),r.path&&"/"!==r.path.charAt(0)&&a.push("/")),void 0!==r.path&&(l=r.path,t.absolutePath||s&&s.absolutePath||(l=j(l)),void 0===c&&(l=l.replace(/^\/\//,"/%2F")),a.push(l)),void 0!==r.query&&(a.push("?"),a.push(r.query)),void 0!==r.fragment&&(a.push("#"),a.push(r.fragment)),a.join("")}function O(e,r){var t=2<arguments.length&&void 0!==arguments[2]?arguments[2]:{},a={};return arguments[3]||(e=_(D(e,t),t),r=_(D(r,t),t)),!(t=t||{}).tolerant&&r.scheme?(a.scheme=r.scheme,a.userinfo=r.userinfo,a.host=r.host,a.port=r.port,a.path=j(r.path||""),a.query=r.query):(void 0!==r.userinfo||void 0!==r.host||void 0!==r.port?(a.userinfo=r.userinfo,a.host=r.host,a.port=r.port,a.path=j(r.path||""),a.query=r.query):(r.path?("/"===r.path.charAt(0)?a.path=j(r.path):(a.path=void 0===e.userinfo&&void 0===e.host&&void 0===e.port||e.path?e.path?e.path.slice(0,e.path.lastIndexOf("/")+1)+r.path:r.path:"/"+r.path,a.path=j(a.path)),a.query=r.query):(a.path=e.path,a.query=void 0!==r.query?r.query:e.query),a.userinfo=e.userinfo,a.host=e.host,a.port=e.port),a.scheme=e.scheme),a.fragment=r.fragment,a}function I(e,r){return e&&e.toString().replace(r&&r.iri?h.PCT_ENCODED:u.PCT_ENCODED,p)}var q={scheme:"http",domainHost:!0,parse:function(e){return e.host||(e.error=e.error||"HTTP URIs must have a host."),e},serialize:function(e){return e.port!==("https"!==String(e.scheme).toLowerCase()?80:443)&&""!==e.port||(e.port=void 0),e.path||(e.path="/"),e}},Q={scheme:"https",domainHost:q.domainHost,parse:q.parse,serialize:q.serialize},V={},U="[A-Za-z0-9\\-\\.\\_\\~\\xA0-\\u200D\\u2010-\\u2029\\u202F-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]",H="[0-9A-Fa-f]",K=(Z(Z("%[EFef]"+H+"%"+H+H+"%"+H+H)+"|"+Z("%[89A-Fa-f]"+H+"%"+H+H)+"|"+Z("%"+H+H)),J("[\\!\\$\\%\\'\\(\\)\\*\\+\\,\\-\\.0-9\\<\\>A-Z\\x5E-\\x7E]",'[\\"\\\\]')),M=new RegExp(U,"g"),B=new RegExp("(?:(?:%[EFef][0-9A-Fa-f]%[0-9A-Fa-f][0-9A-Fa-f]%[0-9A-Fa-f][0-9A-Fa-f])|(?:%[89A-Fa-f][0-9A-Fa-f]%[0-9A-Fa-f][0-9A-Fa-f])|(?:%[0-9A-Fa-f][0-9A-Fa-f]))","g"),G=new RegExp(J("[^]","[A-Za-z0-9\\!\\$\\%\\'\\*\\+\\-\\^\\_\\`\\{\\|\\}\\~]","[\\.]",'[\\"]',K),"g"),Y=new RegExp(J("[^]",U,"[\\!\\$\\'\\(\\)\\*\\+\\,\\;\\:\\@]"),"g"),W=Y;function X(e){var r=p(e);return r.match(M)?r:e}var ee={scheme:"mailto",parse:function(e,r){var t=e,a=t.to=t.path?t.path.split(","):[];if(t.path=void 0,t.query){for(var s=!1,o={},i=t.query.split("&"),n=0,l=i.length;n<l;++n){var c=i[n].split("=");switch(c[0]){case"to":for(var u=c[1].split(","),h=0,d=u.length;h<d;++h)a.push(u[h]);break;case"subject":t.subject=I(c[1],r);break;case"body":t.body=I(c[1],r);break;default:s=!0,o[I(c[0],r)]=I(c[1],r)}}s&&(t.headers=o)}t.query=void 0;for(var p=0,f=a.length;p<f;++p){var m=a[p].split("@");if(m[0]=I(m[0]),r.unicodeSupport)m[1]=I(m[1],r).toLowerCase();else try{m[1]=v.toASCII(I(m[1],r).toLowerCase())}catch(e){t.error=t.error||"Email address's domain name can not be converted to ASCII via punycode: "+e}a[p]=m.join("@")}return t},serialize:function(e,r){var t,a=e,s=null!=(t=e.to)?t instanceof Array?t:"number"!=typeof t.length||t.split||t.setInterval||t.call?[t]:Array.prototype.slice.call(t):[];if(s){for(var o=0,i=s.length;o<i;++o){var n=String(s[o]),l=n.lastIndexOf("@"),c=n.slice(0,l).replace(B,X).replace(B,f).replace(G,m),u=n.slice(l+1);try{u=r.iri?v.toUnicode(u):v.toASCII(I(u,r).toLowerCase())}catch(e){a.error=a.error||"Email address's domain name can not be converted to "+(r.iri?"Unicode":"ASCII")+" via punycode: "+e}s[o]=c+"@"+u}a.path=s.join(",")}var h=e.headers=e.headers||{};e.subject&&(h.subject=e.subject),e.body&&(h.body=e.body);var d=[];for(var p in h)h[p]!==V[p]&&d.push(p.replace(B,X).replace(B,f).replace(Y,m)+"="+h[p].replace(B,X).replace(B,f).replace(W,m));return d.length&&(a.query=d.join("&")),a}},re=/^([^\:]+)\:(.*)/,te={scheme:"urn",parse:function(e,r){var t,a,s,o,i=e.path&&e.path.match(re),n=e;return i?(t=r.scheme||n.scheme||"urn",a=i[1].toLowerCase(),s=i[2],o=d[t+":"+(r.nid||a)],n.nid=a,n.nss=s,n.path=void 0,o&&(n=o.parse(n,r))):n.error=n.error||"URN can not be parsed.",n},serialize:function(e,r){var t=e.nid,a=d[(r.scheme||e.scheme||"urn")+":"+(r.nid||t)];a&&(e=a.serialize(e,r));var s=e;return s.path=(t||r.nid)+":"+e.nss,s}},ae=/^[0-9A-Fa-f]{8}(?:\-[0-9A-Fa-f]{4}){3}\-[0-9A-Fa-f]{12}$/,se={scheme:"urn:uuid",parse:function(e,r){var t=e;return t.uuid=t.nss,t.nss=void 0,r.tolerant||t.uuid&&t.uuid.match(ae)||(t.error=t.error||"UUID is not valid."),t},serialize:function(e){var r=e;return r.nss=(e.uuid||"").toLowerCase(),r}};d[q.scheme]=q,d[Q.scheme]=Q,d[ee.scheme]=ee,d[te.scheme]=te,d[se.scheme]=se,e.SCHEMES=d,e.pctEncChar=m,e.pctDecChars=p,e.parse=_,e.removeDotSegments=j,e.serialize=D,e.resolveComponents=O,e.resolve=function(e,r,t){var a=function(e,r){var t=e;if(r)for(var a in r)t[a]=r[a];return t}({scheme:"null"},t);return D(O(_(e,a),_(r,a),a,!0),a)},e.normalize=function(e,r){return"string"==typeof e?e=D(_(e,r),r):"object"===a(e)&&(e=_(D(e,r),r)),e},e.equal=function(e,r,t){return"string"==typeof e?e=D(_(e,t),t):"object"===a(e)&&(e=D(e,t)),"string"==typeof r?r=D(_(r,t),t):"object"===a(r)&&(r=D(r,t)),e===r},e.escapeComponent=function(e,r){return e&&e.toString().replace(r&&r.iri?h.ESCAPE:u.ESCAPE,m)},e.unescapeComponent=I,Object.defineProperty(e,"__esModule",{value:!0})}("object"==typeof t&&void 0!==r?t:a.URI=a.URI||{})},{}],ajv:[function(a,e,r){"use strict";var n=a("./compile"),d=a("./compile/resolve"),t=a("./cache"),p=a("./compile/schema_obj"),s=a("fast-json-stable-stringify"),o=a("./compile/formats"),i=a("./compile/rules"),l=a("./data"),c=a("./compile/util");(e.exports=y).prototype.validate=function(e,r){var t;if("string"==typeof e){if(!(t=this.getSchema(e)))throw new Error('no schema with key or ref "'+e+'"')}else{var a=this._addSchema(e);t=a.validate||this._compile(a)}var s=t(r);!0!==t.$async&&(this.errors=t.errors);return s},y.prototype.compile=function(e,r){var t=this._addSchema(e,void 0,r);return t.validate||this._compile(t)},y.prototype.addSchema=function(e,r,t,a){if(Array.isArray(e)){for(var s=0;s<e.length;s++)this.addSchema(e[s],void 0,t,a);return this}var o=this._getId(e);if(void 0!==o&&"string"!=typeof o)throw new Error("schema id must be string");return S(this,r=d.normalizeId(r||o)),this._schemas[r]=this._addSchema(e,t,a,!0),this},y.prototype.addMetaSchema=function(e,r,t){return this.addSchema(e,r,t,!0),this},y.prototype.validateSchema=function(e,r){var t=e.$schema;if(void 0!==t&&"string"!=typeof t)throw new Error("$schema must be a string");if(!(t=t||this._opts.defaultMeta||function(e){var r=e._opts.meta;return e._opts.defaultMeta="object"==typeof r?e._getId(r)||r:e.getSchema(f)?f:void 0,e._opts.defaultMeta}(this)))return this.logger.warn("meta-schema not available"),!(this.errors=null);var a=this.validate(t,e);if(!a&&r){var s="schema is invalid: "+this.errorsText();if("log"!=this._opts.validateSchema)throw new Error(s);this.logger.error(s)}return a},y.prototype.getSchema=function(e){var r=g(this,e);switch(typeof r){case"object":return r.validate||this._compile(r);case"string":return this.getSchema(r);case"undefined":return function(e,r){var t=d.schema.call(e,{schema:{}},r);if(t){var a=t.schema,s=t.root,o=t.baseId,i=n.call(e,a,s,void 0,o);return e._fragments[r]=new p({ref:r,fragment:!0,schema:a,root:s,baseId:o,validate:i}),i}}(this,e)}},y.prototype.removeSchema=function(e){if(e instanceof RegExp)return P(this,this._schemas,e),P(this,this._refs,e),this;switch(typeof e){case"undefined":return P(this,this._schemas),P(this,this._refs),this._cache.clear(),this;case"string":var r=g(this,e);return r&&this._cache.del(r.cacheKey),delete this._schemas[e],delete this._refs[e],this;case"object":var t=this._opts.serialize,a=t?t(e):e;this._cache.del(a);var s=this._getId(e);s&&(s=d.normalizeId(s),delete this._schemas[s],delete this._refs[s])}return this},y.prototype.addFormat=function(e,r){"string"==typeof r&&(r=new RegExp(r));return this._formats[e]=r,this},y.prototype.errorsText=function(e,r){if(!(e=e||this.errors))return"No errors";for(var t=void 0===(r=r||{}).separator?", ":r.separator,a=void 0===r.dataVar?"data":r.dataVar,s="",o=0;o<e.length;o++){var i=e[o];i&&(s+=a+i.dataPath+" "+i.message+t)}return s.slice(0,-t.length)},y.prototype._addSchema=function(e,r,t,a){if("object"!=typeof e&&"boolean"!=typeof e)throw new Error("schema should be object or boolean");var s=this._opts.serialize,o=s?s(e):e,i=this._cache.get(o);if(i)return i;a=a||!1!==this._opts.addUsedSchema;var n=d.normalizeId(this._getId(e));n&&a&&S(this,n);var l,c=!1!==this._opts.validateSchema&&!r;c&&!(l=n&&n==d.normalizeId(e.$schema))&&this.validateSchema(e,!0);var u=d.ids.call(this,e),h=new p({id:n,schema:e,localRefs:u,cacheKey:o,meta:t});"#"!=n[0]&&a&&(this._refs[n]=h);this._cache.put(o,h),c&&l&&this.validateSchema(e,!0);return h},y.prototype._compile=function(t,e){if(t.compiling)return(t.validate=s).schema=t.schema,s.errors=null,s.root=e||s,!0===t.schema.$async&&(s.$async=!0),s;var r,a;t.compiling=!0,t.meta&&(r=this._opts,this._opts=this._metaOpts);try{a=n.call(this,t.schema,e,t.localRefs)}catch(e){throw delete t.validate,e}finally{t.compiling=!1,t.meta&&(this._opts=r)}return t.validate=a,t.refs=a.refs,t.refVal=a.refVal,t.root=a.root,a;function s(){var e=t.validate,r=e.apply(this,arguments);return s.errors=e.errors,r}},y.prototype.compileAsync=a("./compile/async");var u=a("./keyword");y.prototype.addKeyword=u.add,y.prototype.getKeyword=u.get,y.prototype.removeKeyword=u.remove,y.prototype.validateKeyword=u.validate;var h=a("./compile/error_classes");y.ValidationError=h.Validation,y.MissingRefError=h.MissingRef,y.$dataMetaSchema=l;var f="http://json-schema.org/draft-07/schema",m=["removeAdditional","useDefaults","coerceTypes","strictDefaults"],v=["/properties"];function y(e){if(!(this instanceof y))return new y(e);e=this._opts=c.copy(e)||{},function(e){var r=e._opts.logger;if(!1===r)e.logger={log:_,warn:_,error:_};else{if(void 0===r&&(r=console),!("object"==typeof r&&r.log&&r.warn&&r.error))throw new Error("logger must implement log, warn and error methods");e.logger=r}}(this),this._schemas={},this._refs={},this._fragments={},this._formats=o(e.format),this._cache=e.cache||new t,this._loadingSchemas={},this._compilations=[],this.RULES=i(),this._getId=function(e){switch(e.schemaId){case"auto":return b;case"id":return E;default:return w}}(e),e.loopRequired=e.loopRequired||1/0,"property"==e.errorDataPath&&(e._errorDataPathProperty=!0),void 0===e.serialize&&(e.serialize=s),this._metaOpts=function(e){for(var r=c.copy(e._opts),t=0;t<m.length;t++)delete r[m[t]];return r}(this),e.formats&&function(e){for(var r in e._opts.formats){e.addFormat(r,e._opts.formats[r])}}(this),e.keywords&&function(e){for(var r in e._opts.keywords){e.addKeyword(r,e._opts.keywords[r])}}(this),function(e){var r;e._opts.$data&&(r=a("./refs/data.json"),e.addMetaSchema(r,r.$id,!0));if(!1===e._opts.meta)return;var t=a("./refs/json-schema-draft-07.json");e._opts.$data&&(t=l(t,v));e.addMetaSchema(t,f,!0),e._refs["http://json-schema.org/schema"]=f}(this),"object"==typeof e.meta&&this.addMetaSchema(e.meta),e.nullable&&this.addKeyword("nullable",{metaSchema:{type:"boolean"}}),function(e){var r=e._opts.schemas;if(!r)return;if(Array.isArray(r))e.addSchema(r);else for(var t in r)e.addSchema(r[t],t)}(this)}function g(e,r){return r=d.normalizeId(r),e._schemas[r]||e._refs[r]||e._fragments[r]}function P(e,r,t){for(var a in r){var s=r[a];s.meta||t&&!t.test(a)||(e._cache.del(s.cacheKey),delete r[a])}}function E(e){return e.$id&&this.logger.warn("schema $id ignored",e.$id),e.id}function w(e){return e.id&&this.logger.warn("schema id ignored",e.id),e.$id}function b(e){if(e.$id&&e.id&&e.$id!=e.id)throw new Error("schema $id is different from id");return e.$id||e.id}function S(e,r){if(e._schemas[r]||e._refs[r])throw new Error('schema with key or id "'+r+'" already exists')}function _(){}},{"./cache":1,"./compile":5,"./compile/async":2,"./compile/error_classes":3,"./compile/formats":4,"./compile/resolve":6,"./compile/rules":7,"./compile/schema_obj":8,"./compile/util":10,"./data":11,"./keyword":39,"./refs/data.json":40,"./refs/json-schema-draft-07.json":41,"fast-json-stable-stringify":43}]},{},[])("ajv")});
 //# sourceMappingURL=ajv.min.js.map
\ No newline at end of file
diff --git a/htdocs/Libs/AJV/ajv.min.js.map b/htdocs/Libs/AJV/ajv.min.js.map
index 09eaa8d..c315399 100644
--- a/htdocs/Libs/AJV/ajv.min.js.map
+++ b/htdocs/Libs/AJV/ajv.min.js.map
@@ -1 +1 @@
-{"version":3,"sources":["ajv.bundle.js"],"names":["f","exports","module","define","amd","g","window","global","self","this","Ajv","e","t","n","r","s","o","u","a","require","i","Error","code","l","call","length",1,"root","error","type","RangeError","errors","map","array","fn","result","mapDomain","string","parts","split","replace","regexSeparators","labels","encoded","join","ucs2decode","value","extra","output","counter","charCodeAt","push","ucs2encode","stringFromCharCode","basicToDigit","codePoint","base","digitToBasic","digit","flag","adapt","delta","numPoints","firstTime","k","floor","damp","baseMinusTMin","tMax","skew","decode","input","out","basic","j","index","oldi","w","baseMinusT","inputLength","initialN","bias","initialBias","lastIndexOf","delimiter","maxInt","tMin","splice","encode","handledCPCount","basicLength","m","q","currentValue","handledCPCountPlusOne","qMinusT","toUnicode","regexPunycode","test","slice","toLowerCase","toASCII","regexNonASCII","freeExports","nodeType","freeModule","freeGlobal","punycode","key","overflow","not-basic","invalid-input","Math","String","fromCharCode","version","ucs2","hasOwnProperty",2,"obj","prop","Object","prototype","qs","sep","eq","options","regexp","maxKeys","len","kstr","vstr","v","x","idx","indexOf","substr","decodeURIComponent","isArray","Array","xs","toString",3,"res","stringifyPrimitive","isFinite","name","undefined","objectKeys","ks","encodeURIComponent","keys",4,"parse","stringify","./decode","./encode",5,"Url","protocol","slashes","auth","host","port","hostname","hash","search","query","pathname","path","href","urlParse","url","parseQueryString","slashesDenoteHost","util","isObject","urlFormat","isString","format","urlResolve","source","relative","resolve","urlResolveObject","resolveObject","protocolPattern","portPattern","simplePathPattern","delims","unwise","concat","autoEscape","nonHostChars","hostEndingChars","hostnameMaxLen","hostnamePartPattern","hostnamePartStart","unsafeProtocol","javascript","javascript:","hostlessProtocol","slashedProtocol","http","https","ftp","gopher","file","http:","https:","ftp:","gopher:","file:","querystring","TypeError","queryIndex","splitter","uSplit","slashRegex","rest","trim","simplePath","exec","proto","lowerProto","match","hostEnd","hec","atSign","parseHost","ipv6Hostname","hostparts","part","newpart","validParts","notHost","bit","unshift","p","h","ae","esc","escape","qm","charAt","rel","tkeys","tk","tkey","rkeys","rk","rkey","relPath","shift","isSourceAbs","isRelAbs","mustEndAbs","removeAllDots","srcPath","psychotic","pop","isNullOrUndefined","authInHost","isNull","last","hasTrailingSlash","up","isAbsolute","./util",6,"arg",7,"schema","callback","_compileAsync","firstCall","loadMissingSchema","schemaLoaded","err","sch","_refs","ref","_schemas","addSchema","missingSchema","missingRef","_callbacks","_loadingSchemas","opts","loadSchema","deferCallback","validate","setTimeout","compile","schemaObj","_addSchema",8,"Cache","_cache","put","get","del",9,"$ref","allOf","anyOf","dependencies","enum","items","maximum","minimum","maxItems","minItems","maxLength","minLength","maxProperties","minProperties","multipleOf","not","oneOf","pattern","properties","required","uniqueItems","../dotjs/_limit","../dotjs/_limitItems","../dotjs/_limitLength","../dotjs/_limitProperties","../dotjs/allOf","../dotjs/anyOf","../dotjs/dependencies","../dotjs/enum","../dotjs/format","../dotjs/items","../dotjs/multipleOf","../dotjs/not","../dotjs/oneOf","../dotjs/pattern","../dotjs/properties","../dotjs/ref","../dotjs/required","../dotjs/uniqueItems","../dotjs/validate",10,"equal","b","arrA","arrB",11,"formats","mode","formatDefs","copy","fName","compare","date","str","matches","DATE","month","day","DAYS","time","full","TIME","hour","minute","second","timeZone","date_time","dateTime","DATE_TIME_SEPARATOR","HOSTNAME","uri","NOT_URI_FRAGMENT","URI","regex","RegExp","compareDate","d1","d2","compareTime","t1","t2","compareDateTime","dt1","dt2","UUID","JSON_POINTER","RELATIVE_JSON_POINTER","fast","date-time","email","ipv4","ipv6","uuid","json-pointer","relative-json-pointer",12,"localRefs","baseId","localCompile","_schema","_root","isRoot","validateCode","validateGenerator","isTop","schemaPath","errSchemaPath","errorPath","RULES","resolveRef","usePattern","useDefault","useCustomRule","vars","refVal","refValCode","patterns","patternCode","defaults","defaultCode","customRules","customRuleCode","beautify","indent_size","console","eval","log","refs","_refVal","refCode","refIndex","resolvedRef","rootRefId","addLocalRef","localSchema","inlineRef","inlineRefs","replaceLocalRef","refId","regexStr","patternsHash","toQuotedString","valueStr","stableStringify","defaultsHash","rule","parentSchema","it","definition","inline","macro","validateSchema","keyword","customRulesHash","_formats","arr","statement","js_beautify","ucs2length","./equal","./resolve","json-stable-stringify",13,"SchemaObject","_compile","_resolve","refPath","_getFullPath","getFullPath","id","normalizeId","resolveRecursive","getJsonPointer","parsedRef","resolveUrl","unescapeFragment","PREVENT_SCOPE_CHANGE","limit","checkNoRef","countKeys","item","count","Infinity","SIMPLE_INLINED","normalize","TRAILING_SLASH_HASH","resolveIds","_resolveIds","fullPath","escapeFragment","ids","toHash","./schema_obj",14,"ruleModules","rules","all","keywords","types","forEach","group","./_rules",15,16,"to","checkDataType","dataType","data","negate","EQUAL","AND","OK","NOT","checkDataTypes","dataTypes","object","number","integer","getProperty","IDENTIFIER","SINGLE_QUOTE","escapeQuotes","pos","varOccurences","dataVar","varReplace","expr","cleanUpCode","EMPTY_ELSE","EMPTY_IF_NO_ELSE","EMPTY_IF_WITH_ELSE","cleanUpVarErrors","ERRORS_REGEXP","REMOVE_ERRORS","RETURN_VALID","RETURN_TRUE","schemaHasRules","getPathExpr","currentPath","jsonPointers","isNumber","joinPaths","getPath","escapeJsonPointer","getData","$data","lvl","paths","jsonPointer","segments","segment","unescapeJsonPointer",17,"$keyword","$errorKeyword","$lvl","level","$dataLvl","dataLevel","$schema","$schemaPath","$errSchemaPath","$breakOnError","allErrors","$valid","$schemaFormat","$isDataFormat","v5","$closingBraces","$schemaValueFormat","dataPathArr","$format","$compare","$isMax","$exclusiveKeyword","$schemaExcl","$isDataExcl","$op","$result","$isData","$schemaValue","$schemaValueExcl","$exclusive","$opExpr","$opStr","$$outStack","createErrors","messages","verbose","__err","compositeRule",18,"$notOp",19,20,"unicode",21,22,"$it","arr1","$sch","$i","l1",23,"$errs","$noEmptySchema","every","$wasComposite",24,25,"$schemaDeps","$propertyDeps","$property","$deps","$currentErrorPath","_$property","$prop","$propertyPath","$missingProperty","_errorDataPathProperty",26,27,"$isObject","$formatRef",28,"$dataNxt","$nextData","$additionalItems","additionalItems","$currErrSchemaPath","$passData","$code",29,"multipleOfPrecision",30,31,32,"$regexp",33,"$schemaKeys","$pProperties","patternProperties","$pPropertyKeys","$aProperties","additionalProperties","$someProperties","$noAdditional","$additionalIsSchema","$removeAdditional","removeAdditional","$checkAdditional","$required","loopRequired","$requiredHash","$pgProperties","patternGroups","$pgPropertyKeys","$propertyKey","i1","arr2","$pProperty","l2","arr3","$pgProperty","l3","$additionalProperty","$useDefaults","useDefaults","arr4","i4","l4","$hasDefault","$useData","arr5","i5","l5","arr6","i6","l6","$pgSchema","$pgMin","$pgMax","$limit","$reason","$moreOrLess",34,"$refVal","$message","missingRefs","$error",35,"$propertySch","$loopRequired",36,"$shouldContinue","$ifPassed","$caseIndex","then",37,38,"$shouldUseGroup","$rulesGroup","$shouldUseRule","$rule","$top","rootId","$closingBraces1","$closingBraces2","$typeSchema","i2","custom","$ruleValidate","$ruleErrs","$ruleErr","$rDef","$inline","$macro","statements","def_customError","$typeChecked","$isArray","$method",39,"_addRule","ruleGroup","rg",40,"description","definitions","schemaArray","positiveInteger","positiveIntegerDefault0","default","simpleTypes","stringArray","title","exclusiveMinimum","exclusiveMaximum",41,"formatMaximum","formatMinimum","exclusiveFormatMaximum","exclusiveFormatMinimum","constant","contains","switch","if","continue",42,"enableV5","ajv","meta","metaSchema","addMetaSchema","META_SCHEMA_ID","addKeyword","containsMacro","formatLimit","enable","./dotjs/_formatLimit","./dotjs/constant","./dotjs/switch","./refs/json-schema-v5.json",43,"json","JSON","cmp","space","cycles","replacer","node","aobj","bobj","seen","parent","indent","colonSeparator","toJSON","sort","keyValue","","has","jsonify",44,"./lib/parse","./lib/stringify",45,"at","ch","text","escapee","\"","\\","/","message","next","c","hex","uffff","parseInt","white","word","reviver","walk","holder",46,"quote","escapable","lastIndex","partial","mind","gap","rep","apply","\b","\t","\n","\f","\r","SCHEMA_URI_FORMAT_FUNC","SCHEMA_URI_FORMAT","schemaKeyRef","getSchema","valid","_skipValidation","_meta","checkUnique","throwOrLogError","currentUriFormat","errorsText","keyRef","_getSchemaObj","removeSchema","jsonStr","skipValidation","shouldAddSchema","cached","addUsedSchema","callValidate","arguments","compiling","currentRA","currentUD","compileSchema","separator","dataPath","addFormat","addInitialSchemas","optsSchemas","schemas","addInitialFormats","cache","errorDataPath","compileAsync","./async","./cache","./compile","./compile/formats","./compile/resolve","./compile/rules","./compile/schema_obj","./keyword","./refs/json-schema-draft-04.json","./v5"],"mappings":"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","file":"ajv.min.js"}
\ No newline at end of file
+{"version":3,"file":"ajv.min.js","sources":["0"],"names":["f","exports","module","define","amd","window","global","self","this","Ajv","r","e","n","t","o","i","c","require","u","a","Error","code","p","call","length","1","Cache","_cache","prototype","put","key","value","get","del","clear","2","MissingRefError","MissingRef","compileAsync","schema","meta","callback","_opts","loadSchema","undefined","loadMetaSchemaOf","then","schemaObj","_addSchema","validate","_compileAsync","_compile","loadMissingSchema","ref","missingSchema","added","missingRef","schemaPromise","_loadingSchemas","removePromise","sch","addSchema","_refs","_schemas","v","$schema","getSchema","$ref","Promise","resolve","./error_classes","3","baseId","message","url","normalizeId","fullPath","errorSubclass","Subclass","Object","create","constructor","Validation","errors","ajv","validation","./resolve","4","util","DATE","DAYS","TIME","HOSTNAME","URI","URITEMPLATE","URL","UUID","JSON_POINTER","JSON_POINTER_URI_FRAGMENT","RELATIVE_JSON_POINTER","formats","mode","copy","date","str","matches","match","year","month","day","time","full","hour","minute","second","fast","date-time","uri","uri-reference","uri-template","email","hostname","ipv4","ipv6","regex","uuid","json-pointer","json-pointer-uri-fragment","relative-json-pointer","dateTime","split","DATE_TIME_SEPARATOR","NOT_URI_FRAGMENT","test","Z_ANCHOR","RegExp","./util","5","errorClasses","stableStringify","validateGenerator","ucs2length","equal","ValidationError","compile","root","localRefs","opts","refVal","refs","patterns","patternsHash","defaults","defaultsHash","customRules","index","compIndex","compiling","_compilations","compilation","callValidate","_formats","RULES","localCompile","cv","$async","sourceCode","source","splice","result","apply","arguments","_schema","_root","isRoot","isTop","schemaPath","errSchemaPath","errorPath","resolveRef","usePattern","useDefault","useCustomRule","logger","vars","refValCode","patternCode","defaultCode","customRuleCode","processCode","Function","makeValidate","error","_refVal","refCode","refIndex","resolvedRef","rootRefId","addLocalRef","localSchema","inlineRef","inlineRefs","refId","inline","regexStr","toQuotedString","valueStr","rule","parentSchema","it","validateSchema","deps","definition","dependencies","every","keyword","hasOwnProperty","join","errorsText","macro","arr","statement","../dotjs/validate","fast-deep-equal","fast-json-stable-stringify","6","SchemaObject","traverse","res","resolveSchema","parse","refPath","_getFullPath","getFullPath","_getId","keys","id","parsedRef","resolveUrl","getJsonPointer","ids","schemaId","baseIds","","fullPaths","allKeys","jsonPtr","rootSchema","parentJsonPtr","parentKeyword","keyIndex","escapeFragment","PREVENT_SCOPE_CHANGE","toHash","fragment","slice","parts","part","unescapeFragment","SIMPLE_INLINED","limit","checkNoRef","item","Array","isArray","countKeys","count","Infinity","normalize","serialize","TRAILING_SLASH_HASH","replace","./schema_obj","json-schema-traverse","uri-js","7","ruleModules","type","rules","maximum","minimum","properties","ALL","all","types","forEach","group","map","implKeywords","k","push","implements","$comment","keywords","concat","custom","../dotjs","8","obj","9","len","pos","charCodeAt","10","checkDataType","dataType","data","strictNumbers","negate","EQUAL","AND","OK","NOT","to","checkDataTypes","dataTypes","array","object","null","number","integer","coerceToTypes","optionCoerceTypes","COERCE_TO_TYPES","getProperty","escapeQuotes","varOccurences","dataVar","varReplace","expr","schemaHasRules","schemaHasRulesExcept","exceptKeyword","schemaUnknownRules","getPathExpr","currentPath","jsonPointers","isNumber","joinPaths","getPath","prop","path","escapeJsonPointer","getData","$data","lvl","paths","up","jsonPointer","segments","segment","unescapeJsonPointer","decodeURIComponent","encodeURIComponent","hash","IDENTIFIER","SINGLE_QUOTE","b","./ucs2length","11","KEYWORDS","metaSchema","keywordsJsonPointers","JSON","stringify","j","anyOf","12","$id","definitions","simpleTypes","statements","valid","not","required","items","modifying","async","const","./refs/json-schema-draft-07.json","13","$keyword","$schemaValueExcl","$exclusive","$exclType","$exclIsNumber","$opStr","$opExpr","$$outStack","out","$lvl","level","$dataLvl","dataLevel","$schemaPath","$errSchemaPath","$breakOnError","allErrors","$isData","$schemaValue","dataPathArr","$isMax","$exclusiveKeyword","$schemaExcl","$isDataExcl","$op","$notOp","$errorKeyword","createErrors","messages","verbose","__err","pop","compositeRule","Math","14","15","unicode","16","17","$it","$closingBraces","$nextValid","$currentBaseId","$allSchemasEmpty","arr1","$sch","$i","l1","strictKeywords","18","$valid","$errs","$wasComposite","19","20","21","$passData","$code","$idx","$dataNxt","$nextData","$nonEmptySchema","22","$compile","$inline","$macro","$ruleValidate","$validateCode","$rule","$definition","$rDef","$validateSchema","$parentData","$parentDataProperty","def_callRuleValidate","def_customError","$ruleErrs","$ruleErr","$asyncKeyword","passContext","23","$deps","$schemaDeps","$propertyDeps","$ownProperties","ownProperties","$property","$currentErrorPath","$propertyKey","$useData","$prop","$propertyPath","$missingProperty","_errorDataPathProperty","arr2","i2","l2","24","$vSchema","25","$ruleType","format","$format","$unknownFormats","unknownFormats","$allowUnknown","$isObject","$formatType","warn","indexOf","$formatRef","26","$ifClause","$thenSch","$elseSch","$thenPresent","$elsePresent","27","allOf","contains","enum","if","maxItems","minItems","maxLength","minLength","maxProperties","minProperties","multipleOf","oneOf","pattern","propertyNames","uniqueItems","./_limit","./_limitItems","./_limitLength","./_limitProperties","./allOf","./anyOf","./comment","./const","./contains","./dependencies","./enum","./format","./if","./items","./multipleOf","./not","./oneOf","./pattern","./properties","./propertyNames","./ref","./required","./uniqueItems","./validate","28","$currErrSchemaPath","$additionalItems","additionalItems","29","multipleOfPrecision","30","$allErrorsOption","31","$prevValid","$passingSchemas","32","$regexp","33","$requiredHash","$additionalProperty","$key","$dataProperties","$schemaKeys","filter","notProto","$pProperties","patternProperties","$pPropertyKeys","$aProperties","additionalProperties","$someProperties","$noAdditional","$additionalIsSchema","$removeAdditional","removeAdditional","$checkAdditional","$required","loopRequired","i1","$pProperty","$useDefaults","useDefaults","arr3","i3","l3","$hasDefault","default","arr4","i4","l4","34","$invalidName","35","$refCode","$refVal","$message","missingRefs","__callValidate","36","$propertySch","$loopRequired","37","$itemType","$typeIsArray","38","$refKeywords","$unknownKwd","$keywordsMsg","$top","rootId","strictDefaults","$defaultMsg","$coerceToTypes","$closingBraces1","$closingBraces2","$typeSchema","nullable","extendRefs","coerceTypes","$rulesGroup","$shouldUseGroup","$dataType","$coerced","$bracesCoercion","$type","arr5","i5","l5","$shouldUseRule","impl","$ruleImplementsSomeKeyword","39","definitionSchema","validateKeyword","throwError","_validateKeyword","add","_addRule","ruleGroup","rg","remove","./definition_schema","./dotjs/custom","40","description","41","title","schemaArray","nonNegativeInteger","nonNegativeIntegerDefault0","stringArray","readOnly","examples","exclusiveMinimum","exclusiveMaximum","contentMediaType","contentEncoding","else","42","flags","valueOf","toString","43","cmp","cycles","node","seen","toJSON","isFinite","TypeError","seenIndex","sort","44","cb","_traverse","pre","post","arrayKeywords","propsKeywords","skipKeywords","45","merge","_len","sets","_key","xl","x","subexp","typeOf","shift","toLowerCase","toUpperCase","buildExps","isIRI","ALPHA$$","DIGIT$$","HEXDIG$$","PCT_ENCODED$","SUB_DELIMS$$","RESERVED$$","IPRIVATE$$","UNRESERVED$$","SCHEME$","USERINFO$","DEC_OCTET_RELAXED$","IPV4ADDRESS$","H16$","LS32$","IPV6ADDRESS1$","IPV6ADDRESS2$","IPV6ADDRESS3$","IPV6ADDRESS4$","IPV6ADDRESS5$","IPV6ADDRESS6$","IPV6ADDRESS7$","IPV6ADDRESS8$","IPV6ADDRESS9$","IPV6ADDRESS$","ZONEID$","IPV6ADDRZ_RELAXED$","IPVFUTURE$","IP_LITERAL$","REG_NAME$","HOST$","PORT$","AUTHORITY$","PCHAR$","SEGMENT$","SEGMENT_NZ$","SEGMENT_NZ_NC$","PATH_ABEMPTY$","PATH_ABSOLUTE$","PATH_NOSCHEME$","PATH_ROOTLESS$","PATH_EMPTY$","QUERY$","FRAGMENT$","HIER_PART$","URI$","RELATIVE_PART$","RELATIVE$","NOT_SCHEME","NOT_USERINFO","NOT_HOST","NOT_PATH","NOT_PATH_NOSCHEME","NOT_QUERY","NOT_FRAGMENT","ESCAPE","UNRESERVED","OTHER_CHARS","PCT_ENCODED","IPV4ADDRESS","IPV6ADDRESS","URI_PROTOCOL","IRI_PROTOCOL","slicedToArray","Symbol","iterator","_arr","_n","_d","_e","_s","_i","next","done","err","sliceIterator","maxInt","regexPunycode","regexNonASCII","regexSeparators","overflow","not-basic","invalid-input","floor","stringFromCharCode","String","fromCharCode","error$1","RangeError","mapDomain","string","fn","ucs2decode","output","counter","extra","digitToBasic","digit","flag","adapt","delta","numPoints","firstTime","baseMinusTMin","base","decode","input","inputLength","bias","basic","lastIndexOf","codePoint","oldi","w","baseMinusT","fromCodePoint","encode","_iteratorNormalCompletion","_didIteratorError","_iteratorError","_step","_iterator","_currentValue2","return","basicLength","handledCPCount","m","_iteratorNormalCompletion2","_didIteratorError2","_iteratorError2","_step2","_iterator2","currentValue","handledCPCountPlusOne","_iteratorNormalCompletion3","_didIteratorError3","_iteratorError3","_step3","_iterator3","_currentValue","q","qMinusT","punycode","version","ucs2","from","toConsumableArray","toASCII","toUnicode","SCHEMES","pctEncChar","chr","pctDecChars","newStr","il","c2","_c","c3","parseInt","substr","_normalizeComponentEncoding","components","protocol","decodeUnreserved","decStr","scheme","userinfo","host","query","_stripLeadingZeros","_normalizeIPv4","address","_normalizeIPv6","_matches2","zone","_address$toLowerCase$","reverse","_address$toLowerCase$2","last","first","firstFields","lastFields","isLastFieldIPv4Address","fieldCount","lastFieldsStart","fields","newFirst","newLast","longestZeroFields","reduce","acc","field","lastLongest","newHost","URI_PARSE","NO_MATCH_IS_UNDEFINED","uriString","options","iri","reference","port","isNaN","schemeHandler","unicodeSupport","domainHost","RDS1","RDS2","RDS3","RDS5","removeDotSegments","im","s","uriTokens","authority","_","$1","$2","charAt","absolutePath","resolveComponents","relative","target","tolerant","unescapeComponent","handler","handler$1","O","VCHAR$$","NOT_LOCAL_PART","NOT_HFNAME","NOT_HFVALUE","handler$2","mailtoComponents","unknownHeaders","headers","hfields","hfield","toAddrs","_x","_xl","subject","body","_x2","_xl2","addr","setInterval","toAddr","atIdx","localPart","domain","name","URN_PARSE","handler$3","nid","nss","urnComponents","uriComponents","handler$4","uuidComponents","baseURI","relativeURI","schemelessOptions","assign","uriA","uriB","escapeComponent","defineProperty","factory","compileSchema","$dataMetaSchema","schemaKeyRef","_meta","_skipValidation","checkUnique","addMetaSchema","skipValidation","throwOrLogError","defaultMeta","META_SCHEMA_ID","keyRef","_getSchemaObj","_fragments","_getSchemaFragment","removeSchema","_removeAllSchemas","cacheKey","addFormat","separator","text","dataPath","shouldAddSchema","cached","addUsedSchema","recursiveMeta","willValidate","currentOpts","_metaOpts","_validate","customKeyword","addKeyword","getKeyword","removeKeyword","META_IGNORE_OPTIONS","META_SUPPORT_DATA","log","noop","console","setLogger","cache","_get$IdOrId","_get$Id","chooseGetId","errorDataPath","metaOpts","getMetaSchemaOptions","addInitialFormats","addInitialKeywords","$dataSchema","addDefaultMetaSchema","optsSchemas","schemas","addInitialSchemas","./cache","./compile","./compile/async","./compile/error_classes","./compile/formats","./compile/resolve","./compile/rules","./compile/schema_obj","./compile/util","./data","./keyword","./refs/data.json"],"mappings":"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"}
\ No newline at end of file
diff --git a/htdocs/Libs/AJV/json-schema-draft-04.json b/htdocs/Libs/AJV/json-schema-draft-04.json
new file mode 100644
index 0000000..bcbb847
--- /dev/null
+++ b/htdocs/Libs/AJV/json-schema-draft-04.json
@@ -0,0 +1,149 @@
+{
+    "id": "http://json-schema.org/draft-04/schema#",
+    "$schema": "http://json-schema.org/draft-04/schema#",
+    "description": "Core schema meta-schema",
+    "definitions": {
+        "schemaArray": {
+            "type": "array",
+            "minItems": 1,
+            "items": { "$ref": "#" }
+        },
+        "positiveInteger": {
+            "type": "integer",
+            "minimum": 0
+        },
+        "positiveIntegerDefault0": {
+            "allOf": [ { "$ref": "#/definitions/positiveInteger" }, { "default": 0 } ]
+        },
+        "simpleTypes": {
+            "enum": [ "array", "boolean", "integer", "null", "number", "object", "string" ]
+        },
+        "stringArray": {
+            "type": "array",
+            "items": { "type": "string" },
+            "minItems": 1,
+            "uniqueItems": true
+        }
+    },
+    "type": "object",
+    "properties": {
+        "id": {
+            "type": "string"
+        },
+        "$schema": {
+            "type": "string"
+        },
+        "title": {
+            "type": "string"
+        },
+        "description": {
+            "type": "string"
+        },
+        "default": {},
+        "multipleOf": {
+            "type": "number",
+            "minimum": 0,
+            "exclusiveMinimum": true
+        },
+        "maximum": {
+            "type": "number"
+        },
+        "exclusiveMaximum": {
+            "type": "boolean",
+            "default": false
+        },
+        "minimum": {
+            "type": "number"
+        },
+        "exclusiveMinimum": {
+            "type": "boolean",
+            "default": false
+        },
+        "maxLength": { "$ref": "#/definitions/positiveInteger" },
+        "minLength": { "$ref": "#/definitions/positiveIntegerDefault0" },
+        "pattern": {
+            "type": "string",
+            "format": "regex"
+        },
+        "additionalItems": {
+            "anyOf": [
+                { "type": "boolean" },
+                { "$ref": "#" }
+            ],
+            "default": {}
+        },
+        "items": {
+            "anyOf": [
+                { "$ref": "#" },
+                { "$ref": "#/definitions/schemaArray" }
+            ],
+            "default": {}
+        },
+        "maxItems": { "$ref": "#/definitions/positiveInteger" },
+        "minItems": { "$ref": "#/definitions/positiveIntegerDefault0" },
+        "uniqueItems": {
+            "type": "boolean",
+            "default": false
+        },
+        "maxProperties": { "$ref": "#/definitions/positiveInteger" },
+        "minProperties": { "$ref": "#/definitions/positiveIntegerDefault0" },
+        "required": { "$ref": "#/definitions/stringArray" },
+        "additionalProperties": {
+            "anyOf": [
+                { "type": "boolean" },
+                { "$ref": "#" }
+            ],
+            "default": {}
+        },
+        "definitions": {
+            "type": "object",
+            "additionalProperties": { "$ref": "#" },
+            "default": {}
+        },
+        "properties": {
+            "type": "object",
+            "additionalProperties": { "$ref": "#" },
+            "default": {}
+        },
+        "patternProperties": {
+            "type": "object",
+            "additionalProperties": { "$ref": "#" },
+            "default": {}
+        },
+        "dependencies": {
+            "type": "object",
+            "additionalProperties": {
+                "anyOf": [
+                    { "$ref": "#" },
+                    { "$ref": "#/definitions/stringArray" }
+                ]
+            }
+        },
+        "enum": {
+            "type": "array",
+            "minItems": 1,
+            "uniqueItems": true
+        },
+        "type": {
+            "anyOf": [
+                { "$ref": "#/definitions/simpleTypes" },
+                {
+                    "type": "array",
+                    "items": { "$ref": "#/definitions/simpleTypes" },
+                    "minItems": 1,
+                    "uniqueItems": true
+                }
+            ]
+        },
+        "format": { "type": "string" },
+        "allOf": { "$ref": "#/definitions/schemaArray" },
+        "anyOf": { "$ref": "#/definitions/schemaArray" },
+        "oneOf": { "$ref": "#/definitions/schemaArray" },
+        "not": { "$ref": "#" }
+    },
+    "dependencies": {
+        "exclusiveMaximum": [ "maximum" ],
+        "exclusiveMinimum": [ "minimum" ]
+    },
+    "default": {}
+}
diff --git a/htdocs/Libs/AJV/json-schema-draft-06.json b/htdocs/Libs/AJV/json-schema-draft-06.json
new file mode 100644
index 0000000..5656240
--- /dev/null
+++ b/htdocs/Libs/AJV/json-schema-draft-06.json
@@ -0,0 +1,154 @@
+{
+    "$schema": "http://json-schema.org/draft-06/schema#",
+    "$id": "http://json-schema.org/draft-06/schema#",
+    "title": "Core schema meta-schema",
+    "definitions": {
+        "schemaArray": {
+            "type": "array",
+            "minItems": 1,
+            "items": { "$ref": "#" }
+        },
+        "nonNegativeInteger": {
+            "type": "integer",
+            "minimum": 0
+        },
+        "nonNegativeIntegerDefault0": {
+            "allOf": [
+                { "$ref": "#/definitions/nonNegativeInteger" },
+                { "default": 0 }
+            ]
+        },
+        "simpleTypes": {
+            "enum": [
+                "array",
+                "boolean",
+                "integer",
+                "null",
+                "number",
+                "object",
+                "string"
+            ]
+        },
+        "stringArray": {
+            "type": "array",
+            "items": { "type": "string" },
+            "uniqueItems": true,
+            "default": []
+        }
+    },
+    "type": ["object", "boolean"],
+    "properties": {
+        "$id": {
+            "type": "string",
+            "format": "uri-reference"
+        },
+        "$schema": {
+            "type": "string",
+            "format": "uri"
+        },
+        "$ref": {
+            "type": "string",
+            "format": "uri-reference"
+        },
+        "title": {
+            "type": "string"
+        },
+        "description": {
+            "type": "string"
+        },
+        "default": {},
+        "examples": {
+            "type": "array",
+            "items": {}
+        },
+        "multipleOf": {
+            "type": "number",
+            "exclusiveMinimum": 0
+        },
+        "maximum": {
+            "type": "number"
+        },
+        "exclusiveMaximum": {
+            "type": "number"
+        },
+        "minimum": {
+            "type": "number"
+        },
+        "exclusiveMinimum": {
+            "type": "number"
+        },
+        "maxLength": { "$ref": "#/definitions/nonNegativeInteger" },
+        "minLength": { "$ref": "#/definitions/nonNegativeIntegerDefault0" },
+        "pattern": {
+            "type": "string",
+            "format": "regex"
+        },
+        "additionalItems": { "$ref": "#" },
+        "items": {
+            "anyOf": [
+                { "$ref": "#" },
+                { "$ref": "#/definitions/schemaArray" }
+            ],
+            "default": {}
+        },
+        "maxItems": { "$ref": "#/definitions/nonNegativeInteger" },
+        "minItems": { "$ref": "#/definitions/nonNegativeIntegerDefault0" },
+        "uniqueItems": {
+            "type": "boolean",
+            "default": false
+        },
+        "contains": { "$ref": "#" },
+        "maxProperties": { "$ref": "#/definitions/nonNegativeInteger" },
+        "minProperties": { "$ref": "#/definitions/nonNegativeIntegerDefault0" },
+        "required": { "$ref": "#/definitions/stringArray" },
+        "additionalProperties": { "$ref": "#" },
+        "definitions": {
+            "type": "object",
+            "additionalProperties": { "$ref": "#" },
+            "default": {}
+        },
+        "properties": {
+            "type": "object",
+            "additionalProperties": { "$ref": "#" },
+            "default": {}
+        },
+        "patternProperties": {
+            "type": "object",
+            "additionalProperties": { "$ref": "#" },
+            "default": {}
+        },
+        "dependencies": {
+            "type": "object",
+            "additionalProperties": {
+                "anyOf": [
+                    { "$ref": "#" },
+                    { "$ref": "#/definitions/stringArray" }
+                ]
+            }
+        },
+        "propertyNames": { "$ref": "#" },
+        "const": {},
+        "enum": {
+            "type": "array",
+            "minItems": 1,
+            "uniqueItems": true
+        },
+        "type": {
+            "anyOf": [
+                { "$ref": "#/definitions/simpleTypes" },
+                {
+                    "type": "array",
+                    "items": { "$ref": "#/definitions/simpleTypes" },
+                    "minItems": 1,
+                    "uniqueItems": true
+                }
+            ]
+        },
+        "format": { "type": "string" },
+        "allOf": { "$ref": "#/definitions/schemaArray" },
+        "anyOf": { "$ref": "#/definitions/schemaArray" },
+        "oneOf": { "$ref": "#/definitions/schemaArray" },
+        "not": { "$ref": "#" }
+    },
+    "default": {}
+}
diff --git a/htdocs/Libs/Codemirror/brace-fold.js b/htdocs/Libs/Codemirror/brace-fold.js
new file mode 100644
index 0000000..654d1fb
--- /dev/null
+++ b/htdocs/Libs/Codemirror/brace-fold.js
@@ -0,0 +1,105 @@
+// CodeMirror, copyright (c) by Marijn Haverbeke and others
+// Distributed under an MIT license: https://codemirror.net/LICENSE
+
+(function(mod) {
+  if (typeof exports == "object" && typeof module == "object") // CommonJS
+    mod(require("../../lib/codemirror"));
+  else if (typeof define == "function" && define.amd) // AMD
+    define(["../../lib/codemirror"], mod);
+  else // Plain browser env
+    mod(CodeMirror);
+})(function(CodeMirror) {
+"use strict";
+
+CodeMirror.registerHelper("fold", "brace", function(cm, start) {
+  var line = start.line, lineText = cm.getLine(line);
+  var tokenType;
+
+  function findOpening(openCh) {
+    for (var at = start.ch, pass = 0;;) {
+      var found = at <= 0 ? -1 : lineText.lastIndexOf(openCh, at - 1);
+      if (found == -1) {
+        if (pass == 1) break;
+        pass = 1;
+        at = lineText.length;
+        continue;
+      }
+      if (pass == 1 && found < start.ch) break;
+      tokenType = cm.getTokenTypeAt(CodeMirror.Pos(line, found + 1));
+      if (!/^(comment|string)/.test(tokenType)) return found + 1;
+      at = found - 1;
+    }
+  }
+
+  var startToken = "{", endToken = "}", startCh = findOpening("{");
+  if (startCh == null) {
+    startToken = "[", endToken = "]";
+    startCh = findOpening("[");
+  }
+
+  if (startCh == null) return;
+  var count = 1, lastLine = cm.lastLine(), end, endCh;
+  outer: for (var i = line; i <= lastLine; ++i) {
+    var text = cm.getLine(i), pos = i == line ? startCh : 0;
+    for (;;) {
+      var nextOpen = text.indexOf(startToken, pos), nextClose = text.indexOf(endToken, pos);
+      if (nextOpen < 0) nextOpen = text.length;
+      if (nextClose < 0) nextClose = text.length;
+      pos = Math.min(nextOpen, nextClose);
+      if (pos == text.length) break;
+      if (cm.getTokenTypeAt(CodeMirror.Pos(i, pos + 1)) == tokenType) {
+        if (pos == nextOpen) ++count;
+        else if (!--count) { end = i; endCh = pos; break outer; }
+      }
+      ++pos;
+    }
+  }
+  if (end == null || line == end) return;
+  return {from: CodeMirror.Pos(line, startCh),
+          to: CodeMirror.Pos(end, endCh)};
+});
+
+CodeMirror.registerHelper("fold", "import", function(cm, start) {
+  function hasImport(line) {
+    if (line < cm.firstLine() || line > cm.lastLine()) return null;
+    var start = cm.getTokenAt(CodeMirror.Pos(line, 1));
+    if (!/\S/.test(start.string)) start = cm.getTokenAt(CodeMirror.Pos(line, start.end + 1));
+    if (start.type != "keyword" || start.string != "import") return null;
+    // Now find closing semicolon, return its position
+    for (var i = line, e = Math.min(cm.lastLine(), line + 10); i <= e; ++i) {
+      var text = cm.getLine(i), semi = text.indexOf(";");
+      if (semi != -1) return {startCh: start.end, end: CodeMirror.Pos(i, semi)};
+    }
+  }
+
+  var startLine = start.line, has = hasImport(startLine), prev;
+  if (!has || hasImport(startLine - 1) || ((prev = hasImport(startLine - 2)) && prev.end.line == startLine - 1))
+    return null;
+  for (var end = has.end;;) {
+    var next = hasImport(end.line + 1);
+    if (next == null) break;
+    end = next.end;
+  }
+  return {from: cm.clipPos(CodeMirror.Pos(startLine, has.startCh + 1)), to: end};
+});
+
+CodeMirror.registerHelper("fold", "include", function(cm, start) {
+  function hasInclude(line) {
+    if (line < cm.firstLine() || line > cm.lastLine()) return null;
+    var start = cm.getTokenAt(CodeMirror.Pos(line, 1));
+    if (!/\S/.test(start.string)) start = cm.getTokenAt(CodeMirror.Pos(line, start.end + 1));
+    if (start.type == "meta" && start.string.slice(0, 8) == "#include") return start.start + 8;
+  }
+
+  var startLine = start.line, has = hasInclude(startLine);
+  if (has == null || hasInclude(startLine - 1) != null) return null;
+  for (var end = startLine;;) {
+    var next = hasInclude(end + 1);
+    if (next == null) break;
+    ++end;
+  }
+  return {from: CodeMirror.Pos(startLine, has + 1),
+          to: cm.clipPos(CodeMirror.Pos(end))};
+});
+
+});
diff --git a/htdocs/Libs/Codemirror/closebrackets.js b/htdocs/Libs/Codemirror/closebrackets.js
new file mode 100644
index 0000000..4415c39
--- /dev/null
+++ b/htdocs/Libs/Codemirror/closebrackets.js
@@ -0,0 +1,191 @@
+// CodeMirror, copyright (c) by Marijn Haverbeke and others
+// Distributed under an MIT license: https://codemirror.net/LICENSE
+
+(function(mod) {
+  if (typeof exports == "object" && typeof module == "object") // CommonJS
+    mod(require("../../lib/codemirror"));
+  else if (typeof define == "function" && define.amd) // AMD
+    define(["../../lib/codemirror"], mod);
+  else // Plain browser env
+    mod(CodeMirror);
+})(function(CodeMirror) {
+  var defaults = {
+    pairs: "()[]{}''\"\"",
+    closeBefore: ")]}'\":;>",
+    triples: "",
+    explode: "[]{}"
+  };
+
+  var Pos = CodeMirror.Pos;
+
+  CodeMirror.defineOption("autoCloseBrackets", false, function(cm, val, old) {
+    if (old && old != CodeMirror.Init) {
+      cm.removeKeyMap(keyMap);
+      cm.state.closeBrackets = null;
+    }
+    if (val) {
+      ensureBound(getOption(val, "pairs"))
+      cm.state.closeBrackets = val;
+      cm.addKeyMap(keyMap);
+    }
+  });
+
+  function getOption(conf, name) {
+    if (name == "pairs" && typeof conf == "string") return conf;
+    if (typeof conf == "object" && conf[name] != null) return conf[name];
+    return defaults[name];
+  }
+
+  var keyMap = {Backspace: handleBackspace, Enter: handleEnter};
+  function ensureBound(chars) {
+    for (var i = 0; i < chars.length; i++) {
+      var ch = chars.charAt(i), key = "'" + ch + "'"
+      if (!keyMap[key]) keyMap[key] = handler(ch)
+    }
+  }
+  ensureBound(defaults.pairs + "`")
+
+  function handler(ch) {
+    return function(cm) { return handleChar(cm, ch); };
+  }
+
+  function getConfig(cm) {
+    var deflt = cm.state.closeBrackets;
+    if (!deflt || deflt.override) return deflt;
+    var mode = cm.getModeAt(cm.getCursor());
+    return mode.closeBrackets || deflt;
+  }
+
+  function handleBackspace(cm) {
+    var conf = getConfig(cm);
+    if (!conf || cm.getOption("disableInput")) return CodeMirror.Pass;
+
+    var pairs = getOption(conf, "pairs");
+    var ranges = cm.listSelections();
+    for (var i = 0; i < ranges.length; i++) {
+      if (!ranges[i].empty()) return CodeMirror.Pass;
+      var around = charsAround(cm, ranges[i].head);
+      if (!around || pairs.indexOf(around) % 2 != 0) return CodeMirror.Pass;
+    }
+    for (var i = ranges.length - 1; i >= 0; i--) {
+      var cur = ranges[i].head;
+      cm.replaceRange("", Pos(cur.line, cur.ch - 1), Pos(cur.line, cur.ch + 1), "+delete");
+    }
+  }
+
+  function handleEnter(cm) {
+    var conf = getConfig(cm);
+    var explode = conf && getOption(conf, "explode");
+    if (!explode || cm.getOption("disableInput")) return CodeMirror.Pass;
+
+    var ranges = cm.listSelections();
+    for (var i = 0; i < ranges.length; i++) {
+      if (!ranges[i].empty()) return CodeMirror.Pass;
+      var around = charsAround(cm, ranges[i].head);
+      if (!around || explode.indexOf(around) % 2 != 0) return CodeMirror.Pass;
+    }
+    cm.operation(function() {
+      var linesep = cm.lineSeparator() || "\n";
+      cm.replaceSelection(linesep + linesep, null);
+      cm.execCommand("goCharLeft");
+      ranges = cm.listSelections();
+      for (var i = 0; i < ranges.length; i++) {
+        var line = ranges[i].head.line;
+        cm.indentLine(line, null, true);
+        cm.indentLine(line + 1, null, true);
+      }
+    });
+  }
+
+  function contractSelection(sel) {
+    var inverted = CodeMirror.cmpPos(sel.anchor, sel.head) > 0;
+    return {anchor: new Pos(sel.anchor.line, sel.anchor.ch + (inverted ? -1 : 1)),
+            head: new Pos(sel.head.line, sel.head.ch + (inverted ? 1 : -1))};
+  }
+
+  function handleChar(cm, ch) {
+    var conf = getConfig(cm);
+    if (!conf || cm.getOption("disableInput")) return CodeMirror.Pass;
+
+    var pairs = getOption(conf, "pairs");
+    var pos = pairs.indexOf(ch);
+    if (pos == -1) return CodeMirror.Pass;
+
+    var closeBefore = getOption(conf,"closeBefore");
+
+    var triples = getOption(conf, "triples");
+
+    var identical = pairs.charAt(pos + 1) == ch;
+    var ranges = cm.listSelections();
+    var opening = pos % 2 == 0;
+
+    var type;
+    for (var i = 0; i < ranges.length; i++) {
+      var range = ranges[i], cur = range.head, curType;
+      var next = cm.getRange(cur, Pos(cur.line, cur.ch + 1));
+      if (opening && !range.empty()) {
+        curType = "surround";
+      } else if ((identical || !opening) && next == ch) {
+        if (identical && stringStartsAfter(cm, cur))
+          curType = "both";
+        else if (triples.indexOf(ch) >= 0 && cm.getRange(cur, Pos(cur.line, cur.ch + 3)) == ch + ch + ch)
+          curType = "skipThree";
+        else
+          curType = "skip";
+      } else if (identical && cur.ch > 1 && triples.indexOf(ch) >= 0 &&
+                 cm.getRange(Pos(cur.line, cur.ch - 2), cur) == ch + ch) {
+        if (cur.ch > 2 && /\bstring/.test(cm.getTokenTypeAt(Pos(cur.line, cur.ch - 2)))) return CodeMirror.Pass;
+        curType = "addFour";
+      } else if (identical) {
+        var prev = cur.ch == 0 ? " " : cm.getRange(Pos(cur.line, cur.ch - 1), cur)
+        if (!CodeMirror.isWordChar(next) && prev != ch && !CodeMirror.isWordChar(prev)) curType = "both";
+        else return CodeMirror.Pass;
+      } else if (opening && (next.length === 0 || /\s/.test(next) || closeBefore.indexOf(next) > -1)) {
+        curType = "both";
+      } else {
+        return CodeMirror.Pass;
+      }
+      if (!type) type = curType;
+      else if (type != curType) return CodeMirror.Pass;
+    }
+
+    var left = pos % 2 ? pairs.charAt(pos - 1) : ch;
+    var right = pos % 2 ? ch : pairs.charAt(pos + 1);
+    cm.operation(function() {
+      if (type == "skip") {
+        cm.execCommand("goCharRight");
+      } else if (type == "skipThree") {
+        for (var i = 0; i < 3; i++)
+          cm.execCommand("goCharRight");
+      } else if (type == "surround") {
+        var sels = cm.getSelections();
+        for (var i = 0; i < sels.length; i++)
+          sels[i] = left + sels[i] + right;
+        cm.replaceSelections(sels, "around");
+        sels = cm.listSelections().slice();
+        for (var i = 0; i < sels.length; i++)
+          sels[i] = contractSelection(sels[i]);
+        cm.setSelections(sels);
+      } else if (type == "both") {
+        cm.replaceSelection(left + right, null);
+        cm.triggerElectric(left + right);
+        cm.execCommand("goCharLeft");
+      } else if (type == "addFour") {
+        cm.replaceSelection(left + left + left + left, "before");
+        cm.execCommand("goCharRight");
+      }
+    });
+  }
+
+  function charsAround(cm, pos) {
+    var str = cm.getRange(Pos(pos.line, pos.ch - 1),
+                          Pos(pos.line, pos.ch + 1));
+    return str.length == 2 ? str : null;
+  }
+
+  function stringStartsAfter(cm, pos) {
+    var token = cm.getTokenAt(Pos(pos.line, pos.ch + 1))
+    return /\bstring/.test(token.type) && token.start == pos.ch &&
+      (pos.ch == 0 || !/\bstring/.test(cm.getTokenTypeAt(pos)))
+  }
+});
diff --git a/htdocs/Libs/Codemirror/closetag.js b/htdocs/Libs/Codemirror/closetag.js
new file mode 100644
index 0000000..7c22a50
--- /dev/null
+++ b/htdocs/Libs/Codemirror/closetag.js
@@ -0,0 +1,185 @@
+// CodeMirror, copyright (c) by Marijn Haverbeke and others
+// Distributed under an MIT license: https://codemirror.net/LICENSE
+
+/**
+ * Tag-closer extension for CodeMirror.
+ *
+ * This extension adds an "autoCloseTags" option that can be set to
+ * either true to get the default behavior, or an object to further
+ * configure its behavior.
+ *
+ * These are supported options:
+ *
+ * `whenClosing` (default true)
+ *   Whether to autoclose when the '/' of a closing tag is typed.
+ * `whenOpening` (default true)
+ *   Whether to autoclose the tag when the final '>' of an opening
+ *   tag is typed.
+ * `dontCloseTags` (default is empty tags for HTML, none for XML)
+ *   An array of tag names that should not be autoclosed.
+ * `indentTags` (default is block tags for HTML, none for XML)
+ *   An array of tag names that should, when opened, cause a
+ *   blank line to be added inside the tag, and the blank line and
+ *   closing line to be indented.
+ * `emptyTags` (default is none)
+ *   An array of XML tag names that should be autoclosed with '/>'.
+ *
+ * See demos/closetag.html for a usage example.
+ */
+
+(function(mod) {
+  if (typeof exports == "object" && typeof module == "object") // CommonJS
+    mod(require("../../lib/codemirror"), require("../fold/xml-fold"));
+  else if (typeof define == "function" && define.amd) // AMD
+    define(["../../lib/codemirror", "../fold/xml-fold"], mod);
+  else // Plain browser env
+    mod(CodeMirror);
+})(function(CodeMirror) {
+  CodeMirror.defineOption("autoCloseTags", false, function(cm, val, old) {
+    if (old != CodeMirror.Init && old)
+      cm.removeKeyMap("autoCloseTags");
+    if (!val) return;
+    var map = {name: "autoCloseTags"};
+    if (typeof val != "object" || val.whenClosing !== false)
+      map["'/'"] = function(cm) { return autoCloseSlash(cm); };
+    if (typeof val != "object" || val.whenOpening !== false)
+      map["'>'"] = function(cm) { return autoCloseGT(cm); };
+    cm.addKeyMap(map);
+  });
+
+  var htmlDontClose = ["area", "base", "br", "col", "command", "embed", "hr", "img", "input", "keygen", "link", "meta", "param",
+                       "source", "track", "wbr"];
+  var htmlIndent = ["applet", "blockquote", "body", "button", "div", "dl", "fieldset", "form", "frameset", "h1", "h2", "h3", "h4",
+                    "h5", "h6", "head", "html", "iframe", "layer", "legend", "object", "ol", "p", "select", "table", "ul"];
+
+  function autoCloseGT(cm) {
+    if (cm.getOption("disableInput")) return CodeMirror.Pass;
+    var ranges = cm.listSelections(), replacements = [];
+    var opt = cm.getOption("autoCloseTags");
+    for (var i = 0; i < ranges.length; i++) {
+      if (!ranges[i].empty()) return CodeMirror.Pass;
+      var pos = ranges[i].head, tok = cm.getTokenAt(pos);
+      var inner = CodeMirror.innerMode(cm.getMode(), tok.state), state = inner.state;
+      var tagInfo = inner.mode.xmlCurrentTag && inner.mode.xmlCurrentTag(state)
+      var tagName = tagInfo && tagInfo.name
+      if (!tagName) return CodeMirror.Pass
+
+      var html = inner.mode.configuration == "html";
+      var dontCloseTags = (typeof opt == "object" && opt.dontCloseTags) || (html && htmlDontClose);
+      var indentTags = (typeof opt == "object" && opt.indentTags) || (html && htmlIndent);
+
+      if (tok.end > pos.ch) tagName = tagName.slice(0, tagName.length - tok.end + pos.ch);
+      var lowerTagName = tagName.toLowerCase();
+      // Don't process the '>' at the end of an end-tag or self-closing tag
+      if (!tagName ||
+          tok.type == "string" && (tok.end != pos.ch || !/[\"\']/.test(tok.string.charAt(tok.string.length - 1)) || tok.string.length == 1) ||
+          tok.type == "tag" && tagInfo.close ||
+          tok.string.indexOf("/") == (pos.ch - tok.start - 1) || // match something like <someTagName />
+          dontCloseTags && indexOf(dontCloseTags, lowerTagName) > -1 ||
+          closingTagExists(cm, inner.mode.xmlCurrentContext && inner.mode.xmlCurrentContext(state) || [], tagName, pos, true))
+        return CodeMirror.Pass;
+
+      var emptyTags = typeof opt == "object" && opt.emptyTags;
+      if (emptyTags && indexOf(emptyTags, tagName) > -1) {
+        replacements[i] = { text: "/>", newPos: CodeMirror.Pos(pos.line, pos.ch + 2) };
+        continue;
+      }
+
+      var indent = indentTags && indexOf(indentTags, lowerTagName) > -1;
+      replacements[i] = {indent: indent,
+                         text: ">" + (indent ? "\n\n" : "") + "</" + tagName + ">",
+                         newPos: indent ? CodeMirror.Pos(pos.line + 1, 0) : CodeMirror.Pos(pos.line, pos.ch + 1)};
+    }
+
+    var dontIndentOnAutoClose = (typeof opt == "object" && opt.dontIndentOnAutoClose);
+    for (var i = ranges.length - 1; i >= 0; i--) {
+      var info = replacements[i];
+      cm.replaceRange(info.text, ranges[i].head, ranges[i].anchor, "+insert");
+      var sel = cm.listSelections().slice(0);
+      sel[i] = {head: info.newPos, anchor: info.newPos};
+      cm.setSelections(sel);
+      if (!dontIndentOnAutoClose && info.indent) {
+        cm.indentLine(info.newPos.line, null, true);
+        cm.indentLine(info.newPos.line + 1, null, true);
+      }
+    }
+  }
+
+  function autoCloseCurrent(cm, typingSlash) {
+    var ranges = cm.listSelections(), replacements = [];
+    var head = typingSlash ? "/" : "</";
+    var opt = cm.getOption("autoCloseTags");
+    var dontIndentOnAutoClose = (typeof opt == "object" && opt.dontIndentOnSlash);
+    for (var i = 0; i < ranges.length; i++) {
+      if (!ranges[i].empty()) return CodeMirror.Pass;
+      var pos = ranges[i].head, tok = cm.getTokenAt(pos);
+      var inner = CodeMirror.innerMode(cm.getMode(), tok.state), state = inner.state;
+      if (typingSlash && (tok.type == "string" || tok.string.charAt(0) != "<" ||
+                          tok.start != pos.ch - 1))
+        return CodeMirror.Pass;
+      // Kludge to get around the fact that we are not in XML mode
+      // when completing in JS/CSS snippet in htmlmixed mode. Does not
+      // work for other XML embedded languages (there is no general
+      // way to go from a mixed mode to its current XML state).
+      var replacement, mixed = inner.mode.name != "xml" && cm.getMode().name == "htmlmixed"
+      if (mixed && inner.mode.name == "javascript") {
+        replacement = head + "script";
+      } else if (mixed && inner.mode.name == "css") {
+        replacement = head + "style";
+      } else {
+        var context = inner.mode.xmlCurrentContext && inner.mode.xmlCurrentContext(state)
+        var top = context.length ? context[context.length - 1] : ""
+        if (!context || (context.length && closingTagExists(cm, context, top, pos)))
+          return CodeMirror.Pass;
+        replacement = head + top
+      }
+      if (cm.getLine(pos.line).charAt(tok.end) != ">") replacement += ">";
+      replacements[i] = replacement;
+    }
+    cm.replaceSelections(replacements);
+    ranges = cm.listSelections();
+    if (!dontIndentOnAutoClose) {
+        for (var i = 0; i < ranges.length; i++)
+            if (i == ranges.length - 1 || ranges[i].head.line < ranges[i + 1].head.line)
+                cm.indentLine(ranges[i].head.line);
+    }
+  }
+
+  function autoCloseSlash(cm) {
+    if (cm.getOption("disableInput")) return CodeMirror.Pass;
+    return autoCloseCurrent(cm, true);
+  }
+
+  CodeMirror.commands.closeTag = function(cm) { return autoCloseCurrent(cm); };
+
+  function indexOf(collection, elt) {
+    if (collection.indexOf) return collection.indexOf(elt);
+    for (var i = 0, e = collection.length; i < e; ++i)
+      if (collection[i] == elt) return i;
+    return -1;
+  }
+
+  // If xml-fold is loaded, we use its functionality to try and verify
+  // whether a given tag is actually unclosed.
+  function closingTagExists(cm, context, tagName, pos, newTag) {
+    if (!CodeMirror.scanForClosingTag) return false;
+    var end = Math.min(cm.lastLine() + 1, pos.line + 500);
+    var nextClose = CodeMirror.scanForClosingTag(cm, pos, null, end);
+    if (!nextClose || nextClose.tag != tagName) return false;
+    // If the immediate wrapping context contains onCx instances of
+    // the same tag, a closing tag only exists if there are at least
+    // that many closing tags of that type following.
+    var onCx = newTag ? 1 : 0
+    for (var i = context.length - 1; i >= 0; i--) {
+      if (context[i] == tagName) ++onCx
+      else break
+    }
+    pos = nextClose.to;
+    for (var i = 1; i < onCx; i++) {
+      var next = CodeMirror.scanForClosingTag(cm, pos, null, end);
+      if (!next || next.tag != tagName) return false;
+      pos = next.to;
+    }
+    return true;
+  }
+});
diff --git a/htdocs/Libs/Codemirror/codemirror.css b/htdocs/Libs/Codemirror/codemirror.css
index 49ec873..f1aa66d 100644
--- a/htdocs/Libs/Codemirror/codemirror.css
+++ b/htdocs/Libs/Codemirror/codemirror.css
@@ -5,6 +5,7 @@
   font-family: monospace;
   height: 300px;
   color: black;
+  direction: ltr;
 }
 
 /* PADDING */
@@ -12,7 +13,8 @@
 .CodeMirror-lines {
   padding: 4px 0; /* Vertical padding around content */
 }
-.CodeMirror pre {
+.CodeMirror pre.CodeMirror-line,
+.CodeMirror pre.CodeMirror-line-like {
   padding: 0 4px; /* Horizontal padding of content */
 }
 
@@ -52,13 +54,18 @@
 }
 .cm-fat-cursor .CodeMirror-cursor {
   width: auto;
-  border: 0;
+  border: 0 !important;
   background: #7e7;
 }
 .cm-fat-cursor div.CodeMirror-cursors {
   z-index: 1;
 }
-
+.cm-fat-cursor-mark {
+  background-color: rgba(20, 255, 20, 0.5);
+  -webkit-animation: blink 1.06s steps(1) infinite;
+  -moz-animation: blink 1.06s steps(1) infinite;
+  animation: blink 1.06s steps(1) infinite;
+}
 .cm-animate-fat-cursor {
   width: auto;
   border: 0;
@@ -88,8 +95,14 @@
 
 .cm-tab { display: inline-block; text-decoration: inherit; }
 
+.CodeMirror-rulers {
+  position: absolute;
+  left: 0; right: 0; top: -50px; bottom: 0;
+  overflow: hidden;
+}
 .CodeMirror-ruler {
   border-left: 1px solid #ccc;
+  top: 0; bottom: 0;
   position: absolute;
 }
 
@@ -113,7 +126,7 @@
 .cm-s-default .cm-property,
 .cm-s-default .cm-operator {}
 .cm-s-default .cm-variable-2 {color: #05a;}
-.cm-s-default .cm-variable-3 {color: #085;}
+.cm-s-default .cm-variable-3, .cm-s-default .cm-type {color: #085;}
 .cm-s-default .cm-comment {color: #a50;}
 .cm-s-default .cm-string {color: #a11;}
 .cm-s-default .cm-string-2 {color: #f50;}
@@ -133,8 +146,8 @@
 
 /* Default styles for common addons */
 
-div.CodeMirror span.CodeMirror-matchingbracket {color: #0f0;}
-div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;}
+div.CodeMirror span.CodeMirror-matchingbracket {color: #0b0;}
+div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #a22;}
 .CodeMirror-matchingtag { background: rgba(255, 150, 0, .3); }
 .CodeMirror-activeline-background {background: #e8f2ff;}
 
@@ -151,26 +164,27 @@
 
 .CodeMirror-scroll {
   overflow: scroll !important; /* Things will break if this is overridden */
-  /* 30px is the magic margin used to hide the element's real scrollbars */
+  /* 50px is the magic margin used to hide the element's real scrollbars */
   /* See overflow: hidden in .CodeMirror */
-  margin-bottom: -30px; margin-right: -30px;
-  padding-bottom: 30px;
+  margin-bottom: -50px; margin-right: -50px;
+  padding-bottom: 50px;
   height: 100%;
   outline: none; /* Prevent dragging from highlighting the element */
   position: relative;
 }
 .CodeMirror-sizer {
   position: relative;
-  border-right: 30px solid transparent;
+  border-right: 50px solid transparent;
 }
 
 /* The fake, visible scrollbars. Used to force redraw during scrolling
-   before actuall scrolling happens, thus preventing shaking and
+   before actual scrolling happens, thus preventing shaking and
    flickering artifacts. */
 .CodeMirror-vscrollbar, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {
   position: absolute;
   z-index: 6;
   display: none;
+  outline: none;
 }
 .CodeMirror-vscrollbar {
   right: 0; top: 0;
@@ -191,16 +205,15 @@
 
 .CodeMirror-gutters {
   position: absolute; left: 0; top: 0;
+  min-height: 100%;
   z-index: 3;
 }
 .CodeMirror-gutter {
   white-space: normal;
   height: 100%;
   display: inline-block;
-  margin-bottom: -30px;
-  /* Hack to make IE7 behave */
-  *zoom:1;
-  *display:inline;
+  vertical-align: top;
+  margin-bottom: -50px;
 }
 .CodeMirror-gutter-wrapper {
   position: absolute;
@@ -218,17 +231,15 @@
   cursor: default;
   z-index: 4;
 }
-.CodeMirror-gutter-wrapper {
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  user-select: none;
-}
+.CodeMirror-gutter-wrapper ::selection { background-color: transparent }
+.CodeMirror-gutter-wrapper ::-moz-selection { background-color: transparent }
 
 .CodeMirror-lines {
   cursor: text;
   min-height: 1px; /* prevents collapsing before first draw */
 }
-.CodeMirror pre {
+.CodeMirror pre.CodeMirror-line,
+.CodeMirror pre.CodeMirror-line-like {
   /* Reset some styles that the rest of the page might have set */
   -moz-border-radius: 0; -webkit-border-radius: 0; border-radius: 0;
   border-width: 0;
@@ -244,8 +255,11 @@
   position: relative;
   overflow: visible;
   -webkit-tap-highlight-color: transparent;
+  -webkit-font-variant-ligatures: contextual;
+  font-variant-ligatures: contextual;
 }
-.CodeMirror-wrap pre {
+.CodeMirror-wrap pre.CodeMirror-line,
+.CodeMirror-wrap pre.CodeMirror-line-like {
   word-wrap: break-word;
   white-space: pre-wrap;
   word-break: normal;
@@ -260,11 +274,13 @@
 .CodeMirror-linewidget {
   position: relative;
   z-index: 2;
-  overflow: auto;
+  padding: 0.1px; /* Force widget margins to stay inside of the container */
 }
 
 .CodeMirror-widget {}
 
+.CodeMirror-rtl pre { direction: rtl; }
+
 .CodeMirror-code {
   outline: none;
 }
@@ -287,7 +303,10 @@
   visibility: hidden;
 }
 
-.CodeMirror-cursor { position: absolute; }
+.CodeMirror-cursor {
+  position: absolute;
+  pointer-events: none;
+}
 .CodeMirror-measure pre { position: static; }
 
 div.CodeMirror-cursors {
@@ -310,13 +329,10 @@
 .CodeMirror-line::-moz-selection, .CodeMirror-line > span::-moz-selection, .CodeMirror-line > span > span::-moz-selection { background: #d7d4f0; }
 
 .cm-searching {
-  background: #ffa;
-  background: rgba(255, 255, 0, .4);
+  background-color: #ffa;
+  background-color: rgba(255, 255, 0, .4);
 }
 
-/* IE7 hack to prevent it from returning funny offsetTops on the spans */
-.CodeMirror span { *vertical-align: text-bottom; }
-
 /* Used to force a border model for a node */
 .cm-force-border { padding-right: .1px; }
 
diff --git a/htdocs/Libs/Codemirror/codemirror.custom.js b/htdocs/Libs/Codemirror/codemirror.custom.js
deleted file mode 100644
index 59ec31c..0000000
--- a/htdocs/Libs/Codemirror/codemirror.custom.js
+++ /dev/null
@@ -1,9544 +0,0 @@
-/* CodeMirror - Minified & Bundled
-   Generated on 2015. 08. 31. with http://codemirror.net/doc/compress.html
-   Version: HEAD
-
-   CodeMirror Library:
-   - codemirror.js
-   Modes:
-   - css.js
-   - htmlmixed.js
-   - javascript.js
-   - perl.js
-   - python.js
-   - shell.js
-   - xml.js
-   Add-ons:
-   - active-line.js
-   - brace-fold.js
-   - closebrackets.js
-   - closetag.js
-   - foldcode.js
-   - foldgutter.js
-   - indent-fold.js
-   - match-highlighter.js
-   - matchbrackets.js
-   - matchtags.js
-   - search.js
-   - xml-fold.js
- */
- 
-! function (a) {
-    if ("object" == typeof exports && "object" == typeof module) module.exports = a();
-    else {
-        if ("function" == typeof define && define.amd) return define([], a);
-        this.CodeMirror = a()
-    }
-}(function () {
-    "use strict";
-
-    function v(a, b) {
-        if (!(this instanceof v)) return new v(a, b);
-        this.options = b = b ? hg(b) : {}, hg(Ad, b, !1), I(b);
-        var c = b.value;
-        "string" == typeof c && (c = new af(c, b.mode, null, b.lineSeparator)), this.doc = c;
-        var g = new v.inputStyles[b.inputStyle](this),
-            h = this.display = new w(a, c, g);
-        h.wrapper.CodeMirror = this, E(this), C(this), b.lineWrapping && (this.display.wrapper.className += " CodeMirror-wrap"), b.autofocus && !n && h.input.focus(), M(this), this.state = {
-            keyMaps: [],
-            overlays: [],
-            modeGen: 0,
-            overwrite: !1,
-            delayingBlurEvent: !1,
-            focused: !1,
-            suppressEdits: !1,
-            pasteIncoming: !1,
-            cutIncoming: !1,
-            selectingText: !1,
-            draggingText: !1,
-            highlight: new Yf,
-            keySeq: null,
-            specialChars: null
-        };
-        var i = this;
-        d && 11 > e && setTimeout(function () {
-            i.display.input.reset(!0)
-        }, 20), pc(this), Bg(), Vb(this), this.curOp.forceUpdate = !0, ef(this, c), b.autofocus && !n || i.hasFocus() ? setTimeout(ig(Zc, this), 20) : $c(this);
-        for (var j in Bd) Bd.hasOwnProperty(j) && Bd[j](this, b[j], Dd);
-        R(this), b.finishInit && b.finishInit(this);
-        for (var k = 0; k < Hd.length; ++k) Hd[k](this);
-        Xb(this), f && b.lineWrapping && "optimizelegibility" == getComputedStyle(h.lineDiv)
-            .textRendering && (h.lineDiv.style.textRendering = "auto")
-    }
-
-    function w(b, c, g) {
-        var h = this;
-        this.input = g, h.scrollbarFiller = pg("div", null, "CodeMirror-scrollbar-filler"), h.scrollbarFiller.setAttribute("cm-not-content", "true"), h.gutterFiller = pg("div", null, "CodeMirror-gutter-filler"), h.gutterFiller.setAttribute("cm-not-content", "true"), h.lineDiv = pg("div", null, "CodeMirror-code"), h.selectionDiv = pg("div", null, null, "position: relative; z-index: 1"), h.cursorDiv = pg("div", null, "CodeMirror-cursors"), h.measure = pg("div", null, "CodeMirror-measure"), h.lineMeasure = pg("div", null, "CodeMirror-measure"), h.lineSpace = pg("div", [h.measure, h.lineMeasure, h.selectionDiv, h.cursorDiv, h.lineDiv], null, "position: relative; outline: none"), h.mover = pg("div", [pg("div", [h.lineSpace], "CodeMirror-lines")], null, "position: relative"), h.sizer = pg("div", [h.mover], "CodeMirror-sizer"), h.sizerWidth = null, h.heightForcer = pg("div", null, null, "position: absolute; height: " + Tf + "px; width: 1px;"), h.gutters = pg("div", null, "CodeMirror-gutters"), h.lineGutter = null, h.scroller = pg("div", [h.sizer, h.heightForcer, h.gutters], "CodeMirror-scroll"), h.scroller.setAttribute("tabIndex", "-1"), h.wrapper = pg("div", [h.scrollbarFiller, h.gutterFiller, h.scroller], "CodeMirror"), d && 8 > e && (h.gutters.style.zIndex = -1, h.scroller.style.paddingRight = 0), f || a && n || (h.scroller.draggable = !0), b && (b.appendChild ? b.appendChild(h.wrapper) : b(h.wrapper)), h.viewFrom = h.viewTo = c.first, h.reportedViewFrom = h.reportedViewTo = c.first, h.view = [], h.renderedView = null, h.externalMeasured = null, h.viewOffset = 0, h.lastWrapHeight = h.lastWrapWidth = 0, h.updateLineNumbers = null, h.nativeBarWidth = h.barHeight = h.barWidth = 0, h.scrollbarsClipped = !1, h.lineNumWidth = h.lineNumInnerWidth = h.lineNumChars = null, h.alignWidgets = !1, h.cachedCharWidth = h.cachedTextHeight = h.cachedPaddingH = null, h.maxLine = null, h.maxLineLength = 0, h.maxLineChanged = !1, h.wheelDX = h.wheelDY = h.wheelStartX = h.wheelStartY = null, h.shift = !1, h.selForContextMenu = null, h.activeTouch = null, g.init(h)
-    }
-
-    function x(a) {
-        a.doc.mode = v.getMode(a.options, a.doc.modeOption), y(a)
-    }
-
-    function y(a) {
-        a.doc.iter(function (a) {
-            a.stateAfter && (a.stateAfter = null), a.styles && (a.styles = null)
-        }), a.doc.frontier = a.doc.first, ib(a, 100), a.state.modeGen++, a.curOp && ic(a)
-    }
-
-    function z(a) {
-        a.options.lineWrapping ? (xg(a.display.wrapper, "CodeMirror-wrap"), a.display.sizer.style.minWidth = "", a.display.sizerWidth = null) : (wg(a.display.wrapper, "CodeMirror-wrap"), H(a)), B(a), ic(a), Fb(a), setTimeout(function () {
-            N(a)
-        }, 100)
-    }
-
-    function A(a) {
-        var b = Rb(a.display),
-            c = a.options.lineWrapping,
-            d = c && Math.max(5, a.display.scroller.clientWidth / Sb(a.display) - 3);
-        return function (e) {
-            if (we(a.doc, e)) return 0;
-            var f = 0;
-            if (e.widgets)
-                for (var g = 0; g < e.widgets.length; g++) e.widgets[g].height && (f += e.widgets[g].height);
-            return c ? f + (Math.ceil(e.text.length / d) || 1) * b : f + b
-        }
-    }
-
-    function B(a) {
-        var b = a.doc,
-            c = A(a);
-        b.iter(function (a) {
-            var b = c(a);
-            b != a.height && jf(a, b)
-        })
-    }
-
-    function C(a) {
-        a.display.wrapper.className = a.display.wrapper.className.replace(/\s*cm-s-\S+/g, "") + a.options.theme.replace(/(^|\s)\s*/g, " cm-s-"), Fb(a)
-    }
-
-    function D(a) {
-        E(a), ic(a), setTimeout(function () {
-            Q(a)
-        }, 20)
-    }
-
-    function E(a) {
-        var b = a.display.gutters,
-            c = a.options.gutters;
-        rg(b);
-        for (var d = 0; d < c.length; ++d) {
-            var e = c[d],
-                f = b.appendChild(pg("div", null, "CodeMirror-gutter " + e));
-            "CodeMirror-linenumbers" == e && (a.display.lineGutter = f, f.style.width = (a.display.lineNumWidth || 1) + "px")
-        }
-        b.style.display = d ? "" : "none", F(a)
-    }
-
-    function F(a) {
-        var b = a.display.gutters.offsetWidth;
-        a.display.sizer.style.marginLeft = b + "px"
-    }
-
-    function G(a) {
-        if (0 == a.height) return 0;
-        for (var c, b = a.text.length, d = a; c = pe(d);) {
-            var e = c.find(0, !0);
-            d = e.from.line, b += e.from.ch - e.to.ch
-        }
-        for (d = a; c = qe(d);) {
-            var e = c.find(0, !0);
-            b -= d.text.length - e.from.ch, d = e.to.line, b += d.text.length - e.to.ch
-        }
-        return b
-    }
-
-    function H(a) {
-        var b = a.display,
-            c = a.doc;
-        b.maxLine = ff(c, c.first), b.maxLineLength = G(b.maxLine), b.maxLineChanged = !0, c.iter(function (a) {
-            var c = G(a);
-            c > b.maxLineLength && (b.maxLineLength = c, b.maxLine = a)
-        })
-    }
-
-    function I(a) {
-        var b = dg(a.gutters, "CodeMirror-linenumbers"); - 1 == b && a.lineNumbers ? a.gutters = a.gutters.concat(["CodeMirror-linenumbers"]) : b > -1 && !a.lineNumbers && (a.gutters = a.gutters.slice(0), a.gutters.splice(b, 1))
-    }
-
-    function J(a) {
-        var b = a.display,
-            c = b.gutters.offsetWidth,
-            d = Math.round(a.doc.height + nb(a.display));
-        return {
-            clientHeight: b.scroller.clientHeight,
-            viewHeight: b.wrapper.clientHeight,
-            scrollWidth: b.scroller.scrollWidth,
-            clientWidth: b.scroller.clientWidth,
-            viewWidth: b.wrapper.clientWidth,
-            barLeft: a.options.fixedGutter ? c : 0,
-            docHeight: d,
-            scrollHeight: d + pb(a) + b.barHeight,
-            nativeBarWidth: b.nativeBarWidth,
-            gutterWidth: c
-        }
-    }
-
-    function K(a, b, c) {
-        this.cm = c;
-        var f = this.vert = pg("div", [pg("div", null, null, "min-width: 1px")], "CodeMirror-vscrollbar"),
-            g = this.horiz = pg("div", [pg("div", null, null, "height: 100%; min-height: 1px")], "CodeMirror-hscrollbar");
-        a(f), a(g), Jf(f, "scroll", function () {
-            f.clientHeight && b(f.scrollTop, "vertical")
-        }), Jf(g, "scroll", function () {
-            g.clientWidth && b(g.scrollLeft, "horizontal")
-        }), this.checkedOverlay = !1, d && 8 > e && (this.horiz.style.minHeight = this.vert.style.minWidth = "18px")
-    }
-
-    function L() {}
-
-    function M(a) {
-        a.display.scrollbars && (a.display.scrollbars.clear(), a.display.scrollbars.addClass && wg(a.display.wrapper, a.display.scrollbars.addClass)), a.display.scrollbars = new v.scrollbarModel[a.options.scrollbarStyle](function (b) {
-            a.display.wrapper.insertBefore(b, a.display.scrollbarFiller), Jf(b, "mousedown", function () {
-                a.state.focused && setTimeout(function () {
-                    a.display.input.focus()
-                }, 0)
-            }), b.setAttribute("cm-not-content", "true")
-        }, function (b, c) {
-            "horizontal" == c ? Ic(a, b) : Hc(a, b)
-        }, a), a.display.scrollbars.addClass && xg(a.display.wrapper, a.display.scrollbars.addClass)
-    }
-
-    function N(a, b) {
-        b || (b = J(a));
-        var c = a.display.barWidth,
-            d = a.display.barHeight;
-        O(a, b);
-        for (var e = 0; 4 > e && c != a.display.barWidth || d != a.display.barHeight; e++) c != a.display.barWidth && a.options.lineWrapping && $(a), O(a, J(a)), c = a.display.barWidth, d = a.display.barHeight
-    }
-
-    function O(a, b) {
-        var c = a.display,
-            d = c.scrollbars.update(b);
-        c.sizer.style.paddingRight = (c.barWidth = d.right) + "px", c.sizer.style.paddingBottom = (c.barHeight = d.bottom) + "px", d.right && d.bottom ? (c.scrollbarFiller.style.display = "block", c.scrollbarFiller.style.height = d.bottom + "px", c.scrollbarFiller.style.width = d.right + "px") : c.scrollbarFiller.style.display = "", d.bottom && a.options.coverGutterNextToScrollbar && a.options.fixedGutter ? (c.gutterFiller.style.display = "block", c.gutterFiller.style.height = d.bottom + "px", c.gutterFiller.style.width = b.gutterWidth + "px") : c.gutterFiller.style.display = ""
-    }
-
-    function P(a, b, c) {
-        var d = c && null != c.top ? Math.max(0, c.top) : a.scroller.scrollTop;
-        d = Math.floor(d - mb(a));
-        var e = c && null != c.bottom ? c.bottom : d + a.wrapper.clientHeight,
-            f = lf(b, d),
-            g = lf(b, e);
-        if (c && c.ensure) {
-            var h = c.ensure.from.line,
-                i = c.ensure.to.line;
-            f > h ? (f = h, g = lf(b, mf(ff(b, h)) + a.wrapper.clientHeight)) : Math.min(i, b.lastLine()) >= g && (f = lf(b, mf(ff(b, i)) - a.wrapper.clientHeight), g = i)
-        }
-        return {
-            from: f,
-            to: Math.max(g, f + 1)
-        }
-    }
-
-    function Q(a) {
-        var b = a.display,
-            c = b.view;
-        if (b.alignWidgets || b.gutters.firstChild && a.options.fixedGutter) {
-            for (var d = T(b) - b.scroller.scrollLeft + a.doc.scrollLeft, e = b.gutters.offsetWidth, f = d + "px", g = 0; g < c.length; g++)
-                if (!c[g].hidden) {
-                    a.options.fixedGutter && c[g].gutter && (c[g].gutter.style.left = f);
-                    var h = c[g].alignable;
-                    if (h)
-                        for (var i = 0; i < h.length; i++) h[i].style.left = f
-                }
-            a.options.fixedGutter && (b.gutters.style.left = d + e + "px")
-        }
-    }
-
-    function R(a) {
-        if (!a.options.lineNumbers) return !1;
-        var b = a.doc,
-            c = S(a.options, b.first + b.size - 1),
-            d = a.display;
-        if (c.length != d.lineNumChars) {
-            var e = d.measure.appendChild(pg("div", [pg("div", c)], "CodeMirror-linenumber CodeMirror-gutter-elt")),
-                f = e.firstChild.offsetWidth,
-                g = e.offsetWidth - f;
-            return d.lineGutter.style.width = "", d.lineNumInnerWidth = Math.max(f, d.lineGutter.offsetWidth - g) + 1, d.lineNumWidth = d.lineNumInnerWidth + g, d.lineNumChars = d.lineNumInnerWidth ? c.length : -1, d.lineGutter.style.width = d.lineNumWidth + "px", F(a), !0
-        }
-        return !1
-    }
-
-    function S(a, b) {
-        return String(a.lineNumberFormatter(b + a.firstLineNumber))
-    }
-
-    function T(a) {
-        return a.scroller.getBoundingClientRect()
-            .left - a.sizer.getBoundingClientRect()
-            .left
-    }
-
-    function U(a, b, c) {
-        var d = a.display;
-        this.viewport = b, this.visible = P(d, a.doc, b), this.editorIsHidden = !d.wrapper.offsetWidth, this.wrapperHeight = d.wrapper.clientHeight, this.wrapperWidth = d.wrapper.clientWidth, this.oldDisplayWidth = qb(a), this.force = c, this.dims = aa(a), this.events = []
-    }
-
-    function V(a) {
-        var b = a.display;
-        !b.scrollbarsClipped && b.scroller.offsetWidth && (b.nativeBarWidth = b.scroller.offsetWidth - b.scroller.clientWidth, b.heightForcer.style.height = pb(a) + "px", b.sizer.style.marginBottom = -b.nativeBarWidth + "px", b.sizer.style.borderRightWidth = pb(a) + "px", b.scrollbarsClipped = !0)
-    }
-
-    function W(a, b) {
-        var c = a.display,
-            d = a.doc;
-        if (b.editorIsHidden) return kc(a), !1;
-        if (!b.force && b.visible.from >= c.viewFrom && b.visible.to <= c.viewTo && (null == c.updateLineNumbers || c.updateLineNumbers >= c.viewTo) && c.renderedView == c.view && 0 == oc(a)) return !1;
-        R(a) && (kc(a), b.dims = aa(a));
-        var e = d.first + d.size,
-            f = Math.max(b.visible.from - a.options.viewportMargin, d.first),
-            g = Math.min(e, b.visible.to + a.options.viewportMargin);
-        c.viewFrom < f && f - c.viewFrom < 20 && (f = Math.max(d.first, c.viewFrom)), c.viewTo > g && c.viewTo - g < 20 && (g = Math.min(e, c.viewTo)), u && (f = ue(a.doc, f), g = ve(a.doc, g));
-        var h = f != c.viewFrom || g != c.viewTo || c.lastWrapHeight != b.wrapperHeight || c.lastWrapWidth != b.wrapperWidth;
-        nc(a, f, g), c.viewOffset = mf(ff(a.doc, c.viewFrom)), a.display.mover.style.top = c.viewOffset + "px";
-        var i = oc(a);
-        if (!h && 0 == i && !b.force && c.renderedView == c.view && (null == c.updateLineNumbers || c.updateLineNumbers >= c.viewTo)) return !1;
-        var j = ug();
-        return i > 4 && (c.lineDiv.style.display = "none"), ba(a, c.updateLineNumbers, b.dims), i > 4 && (c.lineDiv.style.display = ""), c.renderedView = c.view, j && ug() != j && j.offsetHeight && j.focus(), rg(c.cursorDiv), rg(c.selectionDiv), c.gutters.style.height = c.sizer.style.minHeight = 0, h && (c.lastWrapHeight = b.wrapperHeight, c.lastWrapWidth = b.wrapperWidth, ib(a, 400)), c.updateLineNumbers = null, !0
-    }
-
-    function X(a, b) {
-        for (var c = b.viewport, d = !0;
-            (d && a.options.lineWrapping && b.oldDisplayWidth != qb(a) || (c && null != c.top && (c = {
-                top: Math.min(a.doc.height + nb(a.display) - rb(a), c.top)
-            }), b.visible = P(a.display, a.doc, c), !(b.visible.from >= a.display.viewFrom && b.visible.to <= a.display.viewTo))) && W(a, b); d = !1) {
-            $(a);
-            var e = J(a);
-            db(a), Z(a, e), N(a, e)
-        }
-        b.signal(a, "update", a), (a.display.viewFrom != a.display.reportedViewFrom || a.display.viewTo != a.display.reportedViewTo) && (b.signal(a, "viewportChange", a, a.display.viewFrom, a.display.viewTo), a.display.reportedViewFrom = a.display.viewFrom, a.display.reportedViewTo = a.display.viewTo)
-    }
-
-    function Y(a, b) {
-        var c = new U(a, b);
-        if (W(a, c)) {
-            $(a), X(a, c);
-            var d = J(a);
-            db(a), Z(a, d), N(a, d), c.finish()
-        }
-    }
-
-    function Z(a, b) {
-        a.display.sizer.style.minHeight = b.docHeight + "px";
-        var c = b.docHeight + a.display.barHeight;
-        a.display.heightForcer.style.top = c + "px", a.display.gutters.style.height = Math.max(c + pb(a), b.clientHeight) + "px"
-    }
-
-    function $(a) {
-        for (var b = a.display, c = b.lineDiv.offsetTop, f = 0; f < b.view.length; f++) {
-            var h, g = b.view[f];
-            if (!g.hidden) {
-                if (d && 8 > e) {
-                    var i = g.node.offsetTop + g.node.offsetHeight;
-                    h = i - c, c = i
-                } else {
-                    var j = g.node.getBoundingClientRect();
-                    h = j.bottom - j.top
-                }
-                var k = g.line.height - h;
-                if (2 > h && (h = Rb(b)), (k > .001 || -.001 > k) && (jf(g.line, h), _(g.line), g.rest))
-                    for (var l = 0; l < g.rest.length; l++) _(g.rest[l])
-            }
-        }
-    }
-
-    function _(a) {
-        if (a.widgets)
-            for (var b = 0; b < a.widgets.length; ++b) a.widgets[b].height = a.widgets[b].node.offsetHeight
-    }
-
-    function aa(a) {
-        for (var b = a.display, c = {}, d = {}, e = b.gutters.clientLeft, f = b.gutters.firstChild, g = 0; f; f = f.nextSibling, ++g) c[a.options.gutters[g]] = f.offsetLeft + f.clientLeft + e, d[a.options.gutters[g]] = f.clientWidth;
-        return {
-            fixedPos: T(b),
-            gutterTotalWidth: b.gutters.offsetWidth,
-            gutterLeft: c,
-            gutterWidth: d,
-            wrapperWidth: b.wrapper.clientWidth
-        }
-    }
-
-    function ba(a, b, c) {
-        function i(b) {
-            var c = b.nextSibling;
-            return f && o && a.display.currentWheelTarget == b ? b.style.display = "none" : b.parentNode.removeChild(b), c
-        }
-        for (var d = a.display, e = a.options.lineNumbers, g = d.lineDiv, h = g.firstChild, j = d.view, k = d.viewFrom, l = 0; l < j.length; l++) {
-            var m = j[l];
-            if (m.hidden);
-            else if (m.node && m.node.parentNode == g) {
-                for (; h != m.node;) h = i(h);
-                var p = e && null != b && k >= b && m.lineNumber;
-                m.changes && (dg(m.changes, "gutter") > -1 && (p = !1), ca(a, m, k, c)), p && (rg(m.lineNumber), m.lineNumber.appendChild(document.createTextNode(S(a.options, k)))), h = m.node.nextSibling
-            } else {
-                var n = ka(a, m, k, c);
-                g.insertBefore(n, h)
-            }
-            k += m.size
-        }
-        for (; h;) h = i(h)
-    }
-
-    function ca(a, b, c, d) {
-        for (var e = 0; e < b.changes.length; e++) {
-            var f = b.changes[e];
-            "text" == f ? ga(a, b) : "gutter" == f ? ia(a, b, c, d) : "class" == f ? ha(b) : "widget" == f && ja(a, b, d)
-        }
-        b.changes = null
-    }
-
-    function da(a) {
-        return a.node == a.text && (a.node = pg("div", null, null, "position: relative"), a.text.parentNode && a.text.parentNode.replaceChild(a.node, a.text), a.node.appendChild(a.text), d && 8 > e && (a.node.style.zIndex = 2)), a.node
-    }
-
-    function ea(a) {
-        var b = a.bgClass ? a.bgClass + " " + (a.line.bgClass || "") : a.line.bgClass;
-        if (b && (b += " CodeMirror-linebackground"), a.background) b ? a.background.className = b : (a.background.parentNode.removeChild(a.background), a.background = null);
-        else if (b) {
-            var c = da(a);
-            a.background = c.insertBefore(pg("div", null, b), c.firstChild)
-        }
-    }
-
-    function fa(a, b) {
-        var c = a.display.externalMeasured;
-        return c && c.line == b.line ? (a.display.externalMeasured = null, b.measure = c.measure, c.built) : Qe(a, b)
-    }
-
-    function ga(a, b) {
-        var c = b.text.className,
-            d = fa(a, b);
-        b.text == b.node && (b.node = d.pre), b.text.parentNode.replaceChild(d.pre, b.text), b.text = d.pre, d.bgClass != b.bgClass || d.textClass != b.textClass ? (b.bgClass = d.bgClass, b.textClass = d.textClass, ha(b)) : c && (b.text.className = c)
-    }
-
-    function ha(a) {
-        ea(a), a.line.wrapClass ? da(a)
-            .className = a.line.wrapClass : a.node != a.text && (a.node.className = "");
-        var b = a.textClass ? a.textClass + " " + (a.line.textClass || "") : a.line.textClass;
-        a.text.className = b || ""
-    }
-
-    function ia(a, b, c, d) {
-        if (b.gutter && (b.node.removeChild(b.gutter), b.gutter = null), b.gutterBackground && (b.node.removeChild(b.gutterBackground), b.gutterBackground = null), b.line.gutterClass) {
-            var e = da(b);
-            b.gutterBackground = pg("div", null, "CodeMirror-gutter-background " + b.line.gutterClass, "left: " + (a.options.fixedGutter ? d.fixedPos : -d.gutterTotalWidth) + "px; width: " + d.gutterTotalWidth + "px"), e.insertBefore(b.gutterBackground, b.text)
-        }
-        var f = b.line.gutterMarkers;
-        if (a.options.lineNumbers || f) {
-            var e = da(b),
-                g = b.gutter = pg("div", null, "CodeMirror-gutter-wrapper", "left: " + (a.options.fixedGutter ? d.fixedPos : -d.gutterTotalWidth) + "px");
-            if (a.display.input.setUneditable(g), e.insertBefore(g, b.text), b.line.gutterClass && (g.className += " " + b.line.gutterClass), !a.options.lineNumbers || f && f["CodeMirror-linenumbers"] || (b.lineNumber = g.appendChild(pg("div", S(a.options, c), "CodeMirror-linenumber CodeMirror-gutter-elt", "left: " + d.gutterLeft["CodeMirror-linenumbers"] + "px; width: " + a.display.lineNumInnerWidth + "px"))), f)
-                for (var h = 0; h < a.options.gutters.length; ++h) {
-                    var i = a.options.gutters[h],
-                        j = f.hasOwnProperty(i) && f[i];
-                    j && g.appendChild(pg("div", [j], "CodeMirror-gutter-elt", "left: " + d.gutterLeft[i] + "px; width: " + d.gutterWidth[i] + "px"))
-                }
-        }
-    }
-
-    function ja(a, b, c) {
-        b.alignable && (b.alignable = null);
-        for (var e, d = b.node.firstChild; d; d = e) {
-            var e = d.nextSibling;
-            "CodeMirror-linewidget" == d.className && b.node.removeChild(d)
-        }
-        la(a, b, c)
-    }
-
-    function ka(a, b, c, d) {
-        var e = fa(a, b);
-        return b.text = b.node = e.pre, e.bgClass && (b.bgClass = e.bgClass), e.textClass && (b.textClass = e.textClass), ha(b), ia(a, b, c, d), la(a, b, d), b.node
-    }
-
-    function la(a, b, c) {
-        if (ma(a, b.line, b, c, !0), b.rest)
-            for (var d = 0; d < b.rest.length; d++) ma(a, b.rest[d], b, c, !1)
-    }
-
-    function ma(a, b, c, d, e) {
-        if (b.widgets)
-            for (var f = da(c), g = 0, h = b.widgets; g < h.length; ++g) {
-                var i = h[g],
-                    j = pg("div", [i.node], "CodeMirror-linewidget");
-                i.handleMouseEvents || j.setAttribute("cm-ignore-events", "true"), na(i, j, c, d), a.display.input.setUneditable(j), e && i.above ? f.insertBefore(j, c.gutter || c.text) : f.appendChild(j), Nf(i, "redraw")
-            }
-    }
-
-    function na(a, b, c, d) {
-        if (a.noHScroll) {
-            (c.alignable || (c.alignable = []))
-            .push(b);
-            var e = d.wrapperWidth;
-            b.style.left = d.fixedPos + "px", a.coverGutter || (e -= d.gutterTotalWidth, b.style.paddingLeft = d.gutterTotalWidth + "px"), b.style.width = e + "px"
-        }
-        a.coverGutter && (b.style.zIndex = 5, b.style.position = "relative", a.noHScroll || (b.style.marginLeft = -d.gutterTotalWidth + "px"))
-    }
-
-    function qa(a) {
-        return oa(a.line, a.ch)
-    }
-
-    function ra(a, b) {
-        return pa(a, b) < 0 ? b : a
-    }
-
-    function sa(a, b) {
-        return pa(a, b) < 0 ? a : b
-    }
-
-    function ta(a) {
-        a.state.focused || (a.display.input.focus(), Zc(a))
-    }
-
-    function ua(a) {
-        return a.options.readOnly || a.doc.cantEdit
-    }
-
-    function wa(a, b, c, d, e) {
-        var f = a.doc;
-        a.display.shift = !1, d || (d = f.sel);
-        var g = a.state.pasteIncoming || "paste" == e,
-            h = f.splitLines(b),
-            i = null;
-        if (g && d.ranges.length > 1)
-            if (va && va.join("\n") == b) {
-                if (d.ranges.length % va.length == 0) {
-                    i = [];
-                    for (var j = 0; j < va.length; j++) i.push(f.splitLines(va[j]))
-                }
-            } else h.length == d.ranges.length && (i = eg(h, function (a) {
-                return [a]
-            }));
-        for (var j = d.ranges.length - 1; j >= 0; j--) {
-            var k = d.ranges[j],
-                l = k.from(),
-                m = k.to();
-            k.empty() && (c && c > 0 ? l = oa(l.line, l.ch - c) : a.state.overwrite && !g && (m = oa(m.line, Math.min(ff(f, m.line)
-                .text.length, m.ch + bg(h)
-                .length))));
-            var n = a.curOp.updateInput,
-                o = {
-                    from: l,
-                    to: m,
-                    text: i ? i[j % i.length] : h,
-                    origin: e || (g ? "paste" : a.state.cutIncoming ? "cut" : "+input")
-                };
-            hd(a.doc, o), Nf(a, "inputRead", a, o)
-        }
-        b && !g && ya(a, b), td(a), a.curOp.updateInput = n, a.curOp.typing = !0, a.state.pasteIncoming = a.state.cutIncoming = !1
-    }
-
-    function xa(a, b) {
-        var c = a.clipboardData && a.clipboardData.getData("text/plain");
-        return c ? (a.preventDefault(), ua(b) || b.options.disableInput || cc(b, function () {
-            wa(b, c, 0, null, "paste")
-        }), !0) : void 0
-    }
-
-    function ya(a, b) {
-        if (a.options.electricChars && a.options.smartIndent)
-            for (var c = a.doc.sel, d = c.ranges.length - 1; d >= 0; d--) {
-                var e = c.ranges[d];
-                if (!(e.head.ch > 100 || d && c.ranges[d - 1].head.line == e.head.line)) {
-                    var f = a.getModeAt(e.head),
-                        g = !1;
-                    if (f.electricChars) {
-                        for (var h = 0; h < f.electricChars.length; h++)
-                            if (b.indexOf(f.electricChars.charAt(h)) > -1) {
-                                g = vd(a, e.head.line, "smart");
-                                break
-                            }
-                    } else f.electricInput && f.electricInput.test(ff(a.doc, e.head.line)
-                        .text.slice(0, e.head.ch)) && (g = vd(a, e.head.line, "smart"));
-                    g && Nf(a, "electricInput", a, e.head.line)
-                }
-            }
-    }
-
-    function za(a) {
-        for (var b = [], c = [], d = 0; d < a.doc.sel.ranges.length; d++) {
-            var e = a.doc.sel.ranges[d].head.line,
-                f = {
-                    anchor: oa(e, 0),
-                    head: oa(e + 1, 0)
-                };
-            c.push(f), b.push(a.getRange(f.anchor, f.head))
-        }
-        return {
-            text: b,
-            ranges: c
-        }
-    }
-
-    function Aa(a) {
-        a.setAttribute("autocorrect", "off"), a.setAttribute("autocapitalize", "off"), a.setAttribute("spellcheck", "false")
-    }
-
-    function Ba(a) {
-        this.cm = a, this.prevInput = "", this.pollingFast = !1, this.polling = new Yf, this.inaccurateSelection = !1, this.hasSelection = !1, this.composing = null
-    }
-
-    function Ca() {
-        var a = pg("textarea", null, null, "position: absolute; padding: 0; width: 1px; height: 1em; outline: none"),
-            b = pg("div", [a], null, "overflow: hidden; position: relative; width: 3px; height: 0px;");
-        return f ? a.style.width = "1000px" : a.setAttribute("wrap", "off"), m && (a.style.border = "1px solid black"), Aa(a), b
-    }
-
-    function Da(a) {
-        this.cm = a, this.lastAnchorNode = this.lastAnchorOffset = this.lastFocusNode = this.lastFocusOffset = null, this.polling = new Yf, this.gracePeriod = !1
-    }
-
-    function Ea(a, b) {
-        var c = wb(a, b.line);
-        if (!c || c.hidden) return null;
-        var d = ff(a.doc, b.line),
-            e = tb(c, d, b.line),
-            f = nf(d),
-            g = "left";
-        if (f) {
-            var h = Yg(f, b.ch);
-            g = h % 2 ? "right" : "left"
-        }
-        var i = Ab(e.map, b.ch, g);
-        return i.offset = "right" == i.collapse ? i.end : i.start, i
-    }
-
-    function Fa(a, b) {
-        return b && (a.bad = !0), a
-    }
-
-    function Ga(a, b, c) {
-        var d;
-        if (b == a.display.lineDiv) {
-            if (d = a.display.lineDiv.childNodes[c], !d) return Fa(a.clipPos(oa(a.display.viewTo - 1)), !0);
-            b = null, c = 0
-        } else
-            for (d = b;; d = d.parentNode) {
-                if (!d || d == a.display.lineDiv) return null;
-                if (d.parentNode && d.parentNode == a.display.lineDiv) break
-            }
-        for (var e = 0; e < a.display.view.length; e++) {
-            var f = a.display.view[e];
-            if (f.node == d) return Ha(f, b, c)
-        }
-    }
-
-    function Ha(a, b, c) {
-        function k(b, c, d) {
-            for (var e = -1; e < (j ? j.length : 0); e++)
-                for (var f = 0 > e ? i.map : j[e], g = 0; g < f.length; g += 3) {
-                    var h = f[g + 2];
-                    if (h == b || h == c) {
-                        var k = kf(0 > e ? a.line : a.rest[e]),
-                            l = f[g] + d;
-                        return (0 > d || h != b) && (l = f[g + (d ? 1 : 0)]), oa(k, l)
-                    }
-                }
-        }
-        var d = a.text.firstChild,
-            e = !1;
-        if (!b || !tg(d, b)) return Fa(oa(kf(a.line), 0), !0);
-        if (b == d && (e = !0, b = d.childNodes[c], c = 0, !b)) {
-            var f = a.rest ? bg(a.rest) : a.line;
-            return Fa(oa(kf(f), f.text.length), e)
-        }
-        var g = 3 == b.nodeType ? b : null,
-            h = b;
-        for (g || 1 != b.childNodes.length || 3 != b.firstChild.nodeType || (g = b.firstChild, c && (c = g.nodeValue.length)); h.parentNode != d;) h = h.parentNode;
-        var i = a.measure,
-            j = i.maps,
-            l = k(g, h, c);
-        if (l) return Fa(l, e);
-        for (var m = h.nextSibling, n = g ? g.nodeValue.length - c : 0; m; m = m.nextSibling) {
-            if (l = k(m, m.firstChild, 0)) return Fa(oa(l.line, l.ch - n), e);
-            n += m.textContent.length
-        }
-        for (var o = h.previousSibling, n = c; o; o = o.previousSibling) {
-            if (l = k(o, o.firstChild, -1)) return Fa(oa(l.line, l.ch + n), e);
-            n += m.textContent.length
-        }
-    }
-
-    function Ia(a, b, c, d, e) {
-        function i(a) {
-            return function (b) {
-                return b.id == a
-            }
-        }
-
-        function j(b) {
-            if (1 == b.nodeType) {
-                var c = b.getAttribute("cm-text");
-                if (null != c) return "" == c && (c = b.textContent.replace(/\u200b/g, "")), void(f += c);
-                var l, k = b.getAttribute("cm-marker");
-                if (k) {
-                    var m = a.findMarks(oa(d, 0), oa(e + 1, 0), i(+k));
-                    return void(m.length && (l = m[0].find()) && (f += gf(a.doc, l.from, l.to)
-                        .join(h)))
-                }
-                if ("false" == b.getAttribute("contenteditable")) return;
-                for (var n = 0; n < b.childNodes.length; n++) j(b.childNodes[n]);
-                /^(pre|div|p)$/i.test(b.nodeName) && (g = !0)
-            } else if (3 == b.nodeType) {
-                var o = b.nodeValue;
-                if (!o) return;
-                g && (f += h, g = !1), f += o
-            }
-        }
-        for (var f = "", g = !1, h = a.doc.lineSeparator(); j(b), b != c;) b = b.nextSibling;
-        return f
-    }
-
-    function Ja(a, b) {
-        this.ranges = a, this.primIndex = b
-    }
-
-    function Ka(a, b) {
-        this.anchor = a, this.head = b
-    }
-
-    function La(a, b) {
-        var c = a[b];
-        a.sort(function (a, b) {
-            return pa(a.from(), b.from())
-        }), b = dg(a, c);
-        for (var d = 1; d < a.length; d++) {
-            var e = a[d],
-                f = a[d - 1];
-            if (pa(f.to(), e.from()) >= 0) {
-                var g = sa(f.from(), e.from()),
-                    h = ra(f.to(), e.to()),
-                    i = f.empty() ? e.from() == e.head : f.from() == f.head;
-                b >= d && --b, a.splice(--d, 2, new Ka(i ? h : g, i ? g : h))
-            }
-        }
-        return new Ja(a, b)
-    }
-
-    function Ma(a, b) {
-        return new Ja([new Ka(a, b || a)], 0)
-    }
-
-    function Na(a, b) {
-        return Math.max(a.first, Math.min(b, a.first + a.size - 1))
-    }
-
-    function Oa(a, b) {
-        if (b.line < a.first) return oa(a.first, 0);
-        var c = a.first + a.size - 1;
-        return b.line > c ? oa(c, ff(a, c)
-            .text.length) : Pa(b, ff(a, b.line)
-            .text.length)
-    }
-
-    function Pa(a, b) {
-        var c = a.ch;
-        return null == c || c > b ? oa(a.line, b) : 0 > c ? oa(a.line, 0) : a
-    }
-
-    function Qa(a, b) {
-        return b >= a.first && b < a.first + a.size
-    }
-
-    function Ra(a, b) {
-        for (var c = [], d = 0; d < b.length; d++) c[d] = Oa(a, b[d]);
-        return c
-    }
-
-    function Sa(a, b, c, d) {
-        if (a.cm && a.cm.display.shift || a.extend) {
-            var e = b.anchor;
-            if (d) {
-                var f = pa(c, e) < 0;
-                f != pa(d, e) < 0 ? (e = c, c = d) : f != pa(c, d) < 0 && (c = d)
-            }
-            return new Ka(e, c)
-        }
-        return new Ka(d || c, c)
-    }
-
-    function Ta(a, b, c, d) {
-        Za(a, new Ja([Sa(a, a.sel.primary(), b, c)], 0), d)
-    }
-
-    function Ua(a, b, c) {
-        for (var d = [], e = 0; e < a.sel.ranges.length; e++) d[e] = Sa(a, a.sel.ranges[e], b[e], null);
-        var f = La(d, a.sel.primIndex);
-        Za(a, f, c)
-    }
-
-    function Va(a, b, c, d) {
-        var e = a.sel.ranges.slice(0);
-        e[b] = c, Za(a, La(e, a.sel.primIndex), d)
-    }
-
-    function Wa(a, b, c, d) {
-        Za(a, Ma(b, c), d)
-    }
-
-    function Xa(a, b) {
-        var c = {
-            ranges: b.ranges,
-            update: function (b) {
-                this.ranges = [];
-                for (var c = 0; c < b.length; c++) this.ranges[c] = new Ka(Oa(a, b[c].anchor), Oa(a, b[c].head))
-            }
-        };
-        return Lf(a, "beforeSelectionChange", a, c), a.cm && Lf(a.cm, "beforeSelectionChange", a.cm, c), c.ranges != b.ranges ? La(c.ranges, c.ranges.length - 1) : b
-    }
-
-    function Ya(a, b, c) {
-        var d = a.history.done,
-            e = bg(d);
-        e && e.ranges ? (d[d.length - 1] = b, $a(a, b, c)) : Za(a, b, c)
-    }
-
-    function Za(a, b, c) {
-        $a(a, b, c), uf(a, a.sel, a.cm ? a.cm.curOp.id : NaN, c)
-    }
-
-    function $a(a, b, c) {
-        (Rf(a, "beforeSelectionChange") || a.cm && Rf(a.cm, "beforeSelectionChange")) && (b = Xa(a, b));
-        var d = c && c.bias || (pa(b.primary()
-            .head, a.sel.primary()
-            .head) < 0 ? -1 : 1);
-        _a(a, bb(a, b, d, !0)), c && c.scroll === !1 || !a.cm || td(a.cm)
-    }
-
-    function _a(a, b) {
-        b.equals(a.sel) || (a.sel = b, a.cm && (a.cm.curOp.updateInput = a.cm.curOp.selectionChanged = !0, Qf(a.cm)), Nf(a, "cursorActivity", a))
-    }
-
-    function ab(a) {
-        _a(a, bb(a, a.sel, null, !1), Vf)
-    }
-
-    function bb(a, b, c, d) {
-        for (var e, f = 0; f < b.ranges.length; f++) {
-            var g = b.ranges[f],
-                h = cb(a, g.anchor, c, d),
-                i = cb(a, g.head, c, d);
-            (e || h != g.anchor || i != g.head) && (e || (e = b.ranges.slice(0, f)), e[f] = new Ka(h, i))
-        }
-        return e ? La(e, b.primIndex) : b
-    }
-
-    function cb(a, b, c, d) {
-        var e = !1,
-            f = b,
-            g = c || 1;
-        a.cantEdit = !1;
-        a: for (;;) {
-            var h = ff(a, f.line);
-            if (h.markedSpans)
-                for (var i = 0; i < h.markedSpans.length; ++i) {
-                    var j = h.markedSpans[i],
-                        k = j.marker;
-                    if ((null == j.from || (k.inclusiveLeft ? j.from <= f.ch : j.from < f.ch)) && (null == j.to || (k.inclusiveRight ? j.to >= f.ch : j.to > f.ch))) {
-                        if (d && (Lf(k, "beforeCursorEnter"), k.explicitlyCleared)) {
-                            if (h.markedSpans) {
-                                --i;
-                                continue
-                            }
-                            break
-                        }
-                        if (!k.atomic) continue;
-                        var l = k.find(0 > g ? -1 : 1);
-                        if (0 == pa(l, f) && (l.ch += g, l.ch < 0 ? l = l.line > a.first ? Oa(a, oa(l.line - 1)) : null : l.ch > h.text.length && (l = l.line < a.first + a.size - 1 ? oa(l.line + 1, 0) : null), !l)) {
-                            if (e) return d ? (a.cantEdit = !0, oa(a.first, 0)) : cb(a, b, c, !0);
-                            e = !0, l = b, g = -g
-                        }
-                        f = l;
-                        continue a
-                    }
-                }
-            return f
-        }
-    }
-
-    function db(a) {
-        a.display.input.showSelection(a.display.input.prepareSelection())
-    }
-
-    function eb(a, b) {
-        for (var c = a.doc, d = {}, e = d.cursors = document.createDocumentFragment(), f = d.selection = document.createDocumentFragment(), g = 0; g < c.sel.ranges.length; g++)
-            if (b !== !1 || g != c.sel.primIndex) {
-                var h = c.sel.ranges[g],
-                    i = h.empty();
-                (i || a.options.showCursorWhenSelecting) && fb(a, h.head, e), i || gb(a, h, f)
-            }
-        return d
-    }
-
-    function fb(a, b, c) {
-        var d = Lb(a, b, "div", null, null, !a.options.singleCursorHeightPerLine),
-            e = c.appendChild(pg("div", "\xa0", "CodeMirror-cursor"));
-        if (e.style.left = d.left + "px", e.style.top = d.top + "px", e.style.height = Math.max(0, d.bottom - d.top) * a.options.cursorHeight + "px", d.other) {
-            var f = c.appendChild(pg("div", "\xa0", "CodeMirror-cursor CodeMirror-secondarycursor"));
-            f.style.display = "", f.style.left = d.other.left + "px", f.style.top = d.other.top + "px", f.style.height = .85 * (d.other.bottom - d.other.top) + "px"
-        }
-    }
-
-    function gb(a, b, c) {
-        function j(a, b, c, d) {
-            0 > b && (b = 0), b = Math.round(b), d = Math.round(d), f.appendChild(pg("div", null, "CodeMirror-selected", "position: absolute; left: " + a + "px; top: " + b + "px; width: " + (null == c ? i - a : c) + "px; height: " + (d - b) + "px"))
-        }
-
-        function k(b, c, d) {
-            function m(c, d) {
-                return Kb(a, oa(b, c), "div", f, d)
-            }
-            var k, l, f = ff(e, b),
-                g = f.text.length;
-            return Og(nf(f), c || 0, null == d ? g : d, function (a, b, e) {
-                var n, o, p, f = m(a, "left");
-                if (a == b) n = f, o = p = f.left;
-                else {
-                    if (n = m(b - 1, "right"), "rtl" == e) {
-                        var q = f;
-                        f = n, n = q
-                    }
-                    o = f.left, p = n.right
-                }
-                null == c && 0 == a && (o = h), n.top - f.top > 3 && (j(o, f.top, null, f.bottom), o = h, f.bottom < n.top && j(o, f.bottom, null, n.top)), null == d && b == g && (p = i), (!k || f.top < k.top || f.top == k.top && f.left < k.left) && (k = f), (!l || n.bottom > l.bottom || n.bottom == l.bottom && n.right > l.right) && (l = n), h + 1 > o && (o = h), j(o, n.top, p - o, n.bottom)
-            }), {
-                start: k,
-                end: l
-            }
-        }
-        var d = a.display,
-            e = a.doc,
-            f = document.createDocumentFragment(),
-            g = ob(a.display),
-            h = g.left,
-            i = Math.max(d.sizerWidth, qb(a) - d.sizer.offsetLeft) - g.right,
-            l = b.from(),
-            m = b.to();
-        if (l.line == m.line) k(l.line, l.ch, m.ch);
-        else {
-            var n = ff(e, l.line),
-                o = ff(e, m.line),
-                p = se(n) == se(o),
-                q = k(l.line, l.ch, p ? n.text.length + 1 : null)
-                .end,
-                r = k(m.line, p ? 0 : null, m.ch)
-                .start;
-            p && (q.top < r.top - 2 ? (j(q.right, q.top, null, q.bottom), j(h, r.top, r.left, r.bottom)) : j(q.right, q.top, r.left - q.right, q.bottom)), q.bottom < r.top && j(h, q.bottom, null, r.top)
-        }
-        c.appendChild(f)
-    }
-
-    function hb(a) {
-        if (a.state.focused) {
-            var b = a.display;
-            clearInterval(b.blinker);
-            var c = !0;
-            b.cursorDiv.style.visibility = "", a.options.cursorBlinkRate > 0 ? b.blinker = setInterval(function () {
-                b.cursorDiv.style.visibility = (c = !c) ? "" : "hidden"
-            }, a.options.cursorBlinkRate) : a.options.cursorBlinkRate < 0 && (b.cursorDiv.style.visibility = "hidden")
-        }
-    }
-
-    function ib(a, b) {
-        a.doc.mode.startState && a.doc.frontier < a.display.viewTo && a.state.highlight.set(b, ig(jb, a))
-    }
-
-    function jb(a) {
-        var b = a.doc;
-        if (b.frontier < b.first && (b.frontier = b.first), !(b.frontier >= a.display.viewTo)) {
-            var c = +new Date + a.options.workTime,
-                d = Jd(b.mode, lb(a, b.frontier)),
-                e = [];
-            b.iter(b.frontier, Math.min(b.first + b.size, a.display.viewTo + 500), function (f) {
-                if (b.frontier >= a.display.viewFrom) {
-                    var g = f.styles,
-                        h = f.text.length > a.options.maxHighlightLength,
-                        i = Ke(a, f, h ? Jd(b.mode, d) : d, !0);
-                    f.styles = i.styles;
-                    var j = f.styleClasses,
-                        k = i.classes;
-                    k ? f.styleClasses = k : j && (f.styleClasses = null);
-                    for (var l = !g || g.length != f.styles.length || j != k && (!j || !k || j.bgClass != k.bgClass || j.textClass != k.textClass), m = 0; !l && m < g.length; ++m) l = g[m] != f.styles[m];
-                    l && e.push(b.frontier), f.stateAfter = h ? d : Jd(b.mode, d)
-                } else f.text.length <= a.options.maxHighlightLength && Me(a, f.text, d), f.stateAfter = b.frontier % 5 == 0 ? Jd(b.mode, d) : null;
-                return ++b.frontier, +new Date > c ? (ib(a, a.options.workDelay), !0) : void 0
-            }), e.length && cc(a, function () {
-                for (var b = 0; b < e.length; b++) jc(a, e[b], "text")
-            })
-        }
-    }
-
-    function kb(a, b, c) {
-        for (var d, e, f = a.doc, g = c ? -1 : b - (a.doc.mode.innerMode ? 1e3 : 100), h = b; h > g; --h) {
-            if (h <= f.first) return f.first;
-            var i = ff(f, h - 1);
-            if (i.stateAfter && (!c || h <= f.frontier)) return h;
-            var j = Zf(i.text, null, a.options.tabSize);
-            (null == e || d > j) && (e = h - 1, d = j)
-        }
-        return e
-    }
-
-    function lb(a, b, c) {
-        var d = a.doc,
-            e = a.display;
-        if (!d.mode.startState) return !0;
-        var f = kb(a, b, c),
-            g = f > d.first && ff(d, f - 1)
-            .stateAfter;
-        return g = g ? Jd(d.mode, g) : Kd(d.mode), d.iter(f, b, function (c) {
-            Me(a, c.text, g);
-            var h = f == b - 1 || f % 5 == 0 || f >= e.viewFrom && f < e.viewTo;
-            c.stateAfter = h ? Jd(d.mode, g) : null, ++f
-        }), c && (d.frontier = f), g
-    }
-
-    function mb(a) {
-        return a.lineSpace.offsetTop
-    }
-
-    function nb(a) {
-        return a.mover.offsetHeight - a.lineSpace.offsetHeight
-    }
-
-    function ob(a) {
-        if (a.cachedPaddingH) return a.cachedPaddingH;
-        var b = sg(a.measure, pg("pre", "x")),
-            c = window.getComputedStyle ? window.getComputedStyle(b, null) : b.currentStyle, // why the null: http://bugs.jquery.com/ticket/8635
-            d = {
-                left: parseInt(c.paddingLeft),
-                right: parseInt(c.paddingRight)
-            };
-        return isNaN(d.left) || isNaN(d.right) || (a.cachedPaddingH = d), d
-    }
-
-    function pb(a) {
-        return Tf - a.display.nativeBarWidth
-    }
-
-    function qb(a) {
-        return a.display.scroller.clientWidth - pb(a) - a.display.barWidth
-    }
-
-    function rb(a) {
-        return a.display.scroller.clientHeight - pb(a) - a.display.barHeight
-    }
-
-    function sb(a, b, c) {
-        var d = a.options.lineWrapping,
-            e = d && qb(a);
-        if (!b.measure.heights || d && b.measure.width != e) {
-            var f = b.measure.heights = [];
-            if (d) {
-                b.measure.width = e;
-                for (var g = b.text.firstChild.getClientRects(), h = 0; h < g.length - 1; h++) {
-                    var i = g[h],
-                        j = g[h + 1];
-                    Math.abs(i.bottom - j.bottom) > 2 && f.push((i.bottom + j.top) / 2 - c.top)
-                }
-            }
-            f.push(c.bottom - c.top)
-        }
-    }
-
-    function tb(a, b, c) {
-        if (a.line == b) return {
-            map: a.measure.map,
-            cache: a.measure.cache
-        };
-        for (var d = 0; d < a.rest.length; d++)
-            if (a.rest[d] == b) return {
-                map: a.measure.maps[d],
-                cache: a.measure.caches[d]
-            };
-        for (var d = 0; d < a.rest.length; d++)
-            if (kf(a.rest[d]) > c) return {
-                map: a.measure.maps[d],
-                cache: a.measure.caches[d],
-                before: !0
-            }
-    }
-
-    function ub(a, b) {
-        b = se(b);
-        var c = kf(b),
-            d = a.display.externalMeasured = new gc(a.doc, b, c);
-        d.lineN = c;
-        var e = d.built = Qe(a, d);
-        return d.text = e.pre, sg(a.display.lineMeasure, e.pre), d
-    }
-
-    function vb(a, b, c, d) {
-        return yb(a, xb(a, b), c, d)
-    }
-
-    function wb(a, b) {
-        if (b >= a.display.viewFrom && b < a.display.viewTo) return a.display.view[lc(a, b)];
-        var c = a.display.externalMeasured;
-        return c && b >= c.lineN && b < c.lineN + c.size ? c : void 0
-    }
-
-    function xb(a, b) {
-        var c = kf(b),
-            d = wb(a, c);
-        d && !d.text ? d = null : d && d.changes && (ca(a, d, c, aa(a)), a.curOp.forceUpdate = !0), d || (d = ub(a, b));
-        var e = tb(d, b, c);
-        return {
-            line: b,
-            view: d,
-            rect: null,
-            map: e.map,
-            cache: e.cache,
-            before: e.before,
-            hasHeights: !1
-        }
-    }
-
-    function yb(a, b, c, d, e) {
-        b.before && (c = -1);
-        var g, f = c + (d || "");
-        return b.cache.hasOwnProperty(f) ? g = b.cache[f] : (b.rect || (b.rect = b.view.text.getBoundingClientRect()), b.hasHeights || (sb(a, b.view, b.rect), b.hasHeights = !0), g = Bb(a, b, c, d), g.bogus || (b.cache[f] = g)), {
-            left: g.left,
-            right: g.right,
-            top: e ? g.rtop : g.top,
-            bottom: e ? g.rbottom : g.bottom
-        }
-    }
-
-    function Ab(a, b, c) {
-        for (var d, e, f, g, h = 0; h < a.length; h += 3) {
-            var i = a[h],
-                j = a[h + 1];
-            if (i > b ? (e = 0, f = 1, g = "left") : j > b ? (e = b - i, f = e + 1) : (h == a.length - 3 || b == j && a[h + 3] > b) && (f = j - i, e = f - 1, b >= j && (g = "right")), null != e) {
-                if (d = a[h + 2], i == j && c == (d.insertLeft ? "left" : "right") && (g = c), "left" == c && 0 == e)
-                    for (; h && a[h - 2] == a[h - 3] && a[h - 1].insertLeft;) d = a[(h -= 3) + 2], g = "left";
-                if ("right" == c && e == j - i)
-                    for (; h < a.length - 3 && a[h + 3] == a[h + 4] && !a[h + 5].insertLeft;) d = a[(h += 3) + 2], g = "right";
-                break
-            }
-        }
-        return {
-            node: d,
-            start: e,
-            end: f,
-            collapse: g,
-            coverStart: i,
-            coverEnd: j
-        }
-    }
-
-    function Bb(a, b, c, f) {
-        var l, g = Ab(b.map, c, f),
-            h = g.node,
-            i = g.start,
-            j = g.end,
-            k = g.collapse;
-        if (3 == h.nodeType) {
-            for (var m = 0; 4 > m; m++) {
-                for (; i && og(b.line.text.charAt(g.coverStart + i));) --i;
-                for (; g.coverStart + j < g.coverEnd && og(b.line.text.charAt(g.coverStart + j));) ++j;
-                if (d && 9 > e && 0 == i && j == g.coverEnd - g.coverStart) l = h.parentNode.getBoundingClientRect();
-                else if (d && a.options.lineWrapping) {
-                    var n = qg(h, i, j).getClientRects();
-                    l = n.length ? n["right" == f ? n.length - 1 : 0] : zb
-                } else if (oldff) { // customization here
-                    var w = jQuery(".CodeMirror-line SPAN", b.view.node).get(0);
-                    if (w) {
-                        l = w.getClientRects()[0];
-                    } else {
-                        l = zb;
-                    }
-                } else {
-                    l = qg(h, i, j).getBoundingClientRect() || zb;
-                }
-                if (l.left || l.right || 0 == i) break;
-                j = i, i -= 1, k = "right"
-            }
-            d && 11 > e && (l = Cb(a.display.measure, l))
-        } else {
-            i > 0 && (k = f = "right");
-            var n;
-            l = a.options.lineWrapping && (n = h.getClientRects())
-                .length > 1 ? n["right" == f ? n.length - 1 : 0] : h.getBoundingClientRect()
-        }
-        if (d && 9 > e && !i && (!l || !l.left && !l.right)) {
-            var o = h.parentNode.getClientRects()[0];
-            l = o ? {
-                left: o.left,
-                right: o.left + Sb(a.display),
-                top: o.top,
-                bottom: o.bottom
-            } : zb
-        }
-        for (var p = l.top - b.rect.top, q = l.bottom - b.rect.top, r = (p + q) / 2, s = b.view.measure.heights, m = 0; m < s.length - 1 && !(r < s[m]); m++);
-        var t = m ? s[m - 1] : 0,
-            u = s[m],
-            v = {
-                left: ("right" == k ? l.right : l.left) - b.rect.left,
-                right: ("left" == k ? l.left : l.right) - b.rect.left,
-                top: t,
-                bottom: u
-            };
-        return l.left || l.right || (v.bogus = !0), a.options.singleCursorHeightPerLine || (v.rtop = p, v.rbottom = q), v
-    }
-
-    function Cb(a, b) {
-        if (!window.screen || null == screen.logicalXDPI || screen.logicalXDPI == screen.deviceXDPI || !Mg(a)) return b;
-        var c = screen.logicalXDPI / screen.deviceXDPI,
-            d = screen.logicalYDPI / screen.deviceYDPI;
-        return {
-            left: b.left * c,
-            right: b.right * c,
-            top: b.top * d,
-            bottom: b.bottom * d
-        }
-    }
-
-    function Db(a) {
-        if (a.measure && (a.measure.cache = {}, a.measure.heights = null, a.rest))
-            for (var b = 0; b < a.rest.length; b++) a.measure.caches[b] = {}
-    }
-
-    function Eb(a) {
-        a.display.externalMeasure = null, rg(a.display.lineMeasure);
-        for (var b = 0; b < a.display.view.length; b++) Db(a.display.view[b])
-    }
-
-    function Fb(a) {
-        Eb(a), a.display.cachedCharWidth = a.display.cachedTextHeight = a.display.cachedPaddingH = null, a.options.lineWrapping || (a.display.maxLineChanged = !0), a.display.lineNumChars = null
-    }
-
-    function Gb() {
-        return window.pageXOffset || (document.documentElement || document.body)
-            .scrollLeft
-    }
-
-    function Hb() {
-        return window.pageYOffset || (document.documentElement || document.body)
-            .scrollTop
-    }
-
-    function Ib(a, b, c, d) {
-        if (b.widgets)
-            for (var e = 0; e < b.widgets.length; ++e)
-                if (b.widgets[e].above) {
-                    var f = Ae(b.widgets[e]);
-                    c.top += f, c.bottom += f
-                }
-        if ("line" == d) return c;
-        d || (d = "local");
-        var g = mf(b);
-        if ("local" == d ? g += mb(a.display) : g -= a.display.viewOffset, "page" == d || "window" == d) {
-            var h = a.display.lineSpace.getBoundingClientRect();
-            g += h.top + ("window" == d ? 0 : Hb());
-            var i = h.left + ("window" == d ? 0 : Gb());
-            c.left += i, c.right += i
-        }
-        return c.top += g, c.bottom += g, c
-    }
-
-    function Jb(a, b, c) {
-        if ("div" == c) return b;
-        var d = b.left,
-            e = b.top;
-        if ("page" == c) d -= Gb(), e -= Hb();
-        else if ("local" == c || !c) {
-            var f = a.display.sizer.getBoundingClientRect();
-            d += f.left, e += f.top
-        }
-        var g = a.display.lineSpace.getBoundingClientRect();
-        return {
-            left: d - g.left,
-            top: e - g.top
-        }
-    }
-
-    function Kb(a, b, c, d, e) {
-        return d || (d = ff(a.doc, b.line)), Ib(a, d, vb(a, d, b.ch, e), c)
-    }
-
-    function Lb(a, b, c, d, e, f) {
-        function g(b, g) {
-            var h = yb(a, e, b, g ? "right" : "left", f);
-            return g ? h.left = h.right : h.right = h.left, Ib(a, d, h, c)
-        }
-
-        function h(a, b) {
-            var c = i[b],
-                d = c.level % 2;
-            return a == Pg(c) && b && c.level < i[b - 1].level ? (c = i[--b], a = Qg(c) - (c.level % 2 ? 0 : 1), d = !0) : a == Qg(c) && b < i.length - 1 && c.level < i[b + 1].level && (c = i[++b], a = Pg(c) - c.level % 2, d = !1), d && a == c.to && a > c.from ? g(a - 1) : g(a, d)
-        }
-        d = d || ff(a.doc, b.line), e || (e = xb(a, d));
-        var i = nf(d),
-            j = b.ch;
-        if (!i) return g(j);
-        var k = Yg(i, j),
-            l = h(j, k);
-        return null != Xg && (l.other = h(j, Xg)), l
-    }
-
-    function Mb(a, b) {
-        var c = 0,
-            b = Oa(a.doc, b);
-        a.options.lineWrapping || (c = Sb(a.display) * b.ch);
-        var d = ff(a.doc, b.line),
-            e = mf(d) + mb(a.display);
-        return {
-            left: c,
-            right: c,
-            top: e,
-            bottom: e + d.height
-        }
-    }
-
-    function Nb(a, b, c, d) {
-        var e = oa(a, b);
-        return e.xRel = d, c && (e.outside = !0), e
-    }
-
-    function Ob(a, b, c) {
-        var d = a.doc;
-        if (c += a.display.viewOffset, 0 > c) return Nb(d.first, 0, !0, -1);
-        var e = lf(d, c),
-            f = d.first + d.size - 1;
-        if (e > f) return Nb(d.first + d.size - 1, ff(d, f)
-            .text.length, !0, 1);
-        0 > b && (b = 0);
-        for (var g = ff(d, e);;) {
-            var h = Pb(a, g, e, b, c),
-                i = qe(g),
-                j = i && i.find(0, !0);
-            if (!i || !(h.ch > j.from.ch || h.ch == j.from.ch && h.xRel > 0)) return h;
-            e = kf(g = j.to.line)
-        }
-    }
-
-    function Pb(a, b, c, d, e) {
-        function j(d) {
-            var e = Lb(a, oa(c, d), "line", b, i);
-            return g = !0, f > e.bottom ? e.left - h : f < e.top ? e.left + h : (g = !1, e.left)
-        }
-        var f = e - mf(b),
-            g = !1,
-            h = 2 * a.display.wrapper.clientWidth,
-            i = xb(a, b),
-            k = nf(b),
-            l = b.text.length,
-            m = Rg(b),
-            n = Sg(b),
-            o = j(m),
-            p = g,
-            q = j(n),
-            r = g;
-        if (d > q) return Nb(c, n, r, 1);
-        for (;;) {
-            if (k ? n == m || n == $g(b, m, 1) : 1 >= n - m) {
-                for (var s = o > d || q - d >= d - o ? m : n, t = d - (s == m ? o : q); og(b.text.charAt(s));) ++s;
-                var u = Nb(c, s, s == m ? p : r, -1 > t ? -1 : t > 1 ? 1 : 0);
-                return u
-            }
-            var v = Math.ceil(l / 2),
-                w = m + v;
-            if (k) {
-                w = m;
-                for (var x = 0; v > x; ++x) w = $g(b, w, 1)
-            }
-            var y = j(w);
-            y > d ? (n = w, q = y, (r = g) && (q += 1e3), l = v) : (m = w, o = y, p = g, l -= v)
-        }
-    }
-
-    function Rb(a) {
-        if (null != a.cachedTextHeight) return a.cachedTextHeight;
-        if (null == Qb) {
-            Qb = pg("pre");
-            for (var b = 0; 49 > b; ++b) Qb.appendChild(document.createTextNode("x")), Qb.appendChild(pg("br"));
-            Qb.appendChild(document.createTextNode("x"))
-        }
-        sg(a.measure, Qb);
-        var c = Qb.offsetHeight / 50;
-        return c > 3 && (a.cachedTextHeight = c), rg(a.measure), c || 1
-    }
-
-    function Sb(a) {
-        if (null != a.cachedCharWidth) return a.cachedCharWidth;
-        var b = pg("span", "xxxxxxxxxx"),
-            c = pg("pre", [b]);
-        sg(a.measure, c);
-        var d = b.getBoundingClientRect(),
-            e = (d.right - d.left) / 10;
-        return e > 2 && (a.cachedCharWidth = e), e || 10
-    }
-
-    function Vb(a) {
-        a.curOp = {
-            cm: a,
-            viewChanged: !1,
-            startHeight: a.doc.height,
-            forceUpdate: !1,
-            updateInput: null,
-            typing: !1,
-            changeObjs: null,
-            cursorActivityHandlers: null,
-            cursorActivityCalled: 0,
-            selectionChanged: !1,
-            updateMaxLine: !1,
-            scrollLeft: null,
-            scrollTop: null,
-            scrollToPos: null,
-            focus: !1,
-            id: ++Ub
-        }, Tb ? Tb.ops.push(a.curOp) : a.curOp.ownsGroup = Tb = {
-            ops: [a.curOp],
-            delayedCallbacks: []
-        }
-    }
-
-    function Wb(a) {
-        var b = a.delayedCallbacks,
-            c = 0;
-        do {
-            for (; c < b.length; c++) b[c].call(null);
-            for (var d = 0; d < a.ops.length; d++) {
-                var e = a.ops[d];
-                if (e.cursorActivityHandlers)
-                    for (; e.cursorActivityCalled < e.cursorActivityHandlers.length;) e.cursorActivityHandlers[e.cursorActivityCalled++].call(null, e.cm)
-            }
-        } while (c < b.length)
-    }
-
-    function Xb(a) {
-        var b = a.curOp,
-            c = b.ownsGroup;
-        if (c) try {
-            Wb(c)
-        } finally {
-            Tb = null;
-            for (var d = 0; d < c.ops.length; d++) c.ops[d].cm.curOp = null;
-            Yb(c)
-        }
-    }
-
-    function Yb(a) {
-        for (var b = a.ops, c = 0; c < b.length; c++) Zb(b[c]);
-        for (var c = 0; c < b.length; c++) $b(b[c]);
-        for (var c = 0; c < b.length; c++) _b(b[c]);
-        for (var c = 0; c < b.length; c++) ac(b[c]);
-        for (var c = 0; c < b.length; c++) bc(b[c])
-    }
-
-    function Zb(a) {
-        var b = a.cm,
-            c = b.display;
-        V(b), a.updateMaxLine && H(b), a.mustUpdate = a.viewChanged || a.forceUpdate || null != a.scrollTop || a.scrollToPos && (a.scrollToPos.from.line < c.viewFrom || a.scrollToPos.to.line >= c.viewTo) || c.maxLineChanged && b.options.lineWrapping, a.update = a.mustUpdate && new U(b, a.mustUpdate && {
-            top: a.scrollTop,
-            ensure: a.scrollToPos
-        }, a.forceUpdate)
-    }
-
-    function $b(a) {
-        a.updatedDisplay = a.mustUpdate && W(a.cm, a.update)
-    }
-
-    function _b(a) {
-        var b = a.cm,
-            c = b.display;
-        a.updatedDisplay && $(b), a.barMeasure = J(b), c.maxLineChanged && !b.options.lineWrapping && (a.adjustWidthTo = vb(b, c.maxLine, c.maxLine.text.length)
-            .left + 3, b.display.sizerWidth = a.adjustWidthTo, a.barMeasure.scrollWidth = Math.max(c.scroller.clientWidth, c.sizer.offsetLeft + a.adjustWidthTo + pb(b) + b.display.barWidth), a.maxScrollLeft = Math.max(0, c.sizer.offsetLeft + a.adjustWidthTo - qb(b))), (a.updatedDisplay || a.selectionChanged) && (a.preparedSelection = c.input.prepareSelection())
-    }
-
-    function ac(a) {
-        var b = a.cm;
-        null != a.adjustWidthTo && (b.display.sizer.style.minWidth = a.adjustWidthTo + "px", a.maxScrollLeft < b.doc.scrollLeft && Ic(b, Math.min(b.display.scroller.scrollLeft, a.maxScrollLeft), !0), b.display.maxLineChanged = !1), a.preparedSelection && b.display.input.showSelection(a.preparedSelection), a.updatedDisplay && Z(b, a.barMeasure), (a.updatedDisplay || a.startHeight != b.doc.height) && N(b, a.barMeasure), a.selectionChanged && hb(b), b.state.focused && a.updateInput && b.display.input.reset(a.typing), a.focus && a.focus == ug() && ta(a.cm)
-    }
-
-    function bc(a) {
-        var b = a.cm,
-            c = b.display,
-            d = b.doc;
-        if (a.updatedDisplay && X(b, a.update), null == c.wheelStartX || null == a.scrollTop && null == a.scrollLeft && !a.scrollToPos || (c.wheelStartX = c.wheelStartY = null), null == a.scrollTop || c.scroller.scrollTop == a.scrollTop && !a.forceScroll || (d.scrollTop = Math.max(0, Math.min(c.scroller.scrollHeight - c.scroller.clientHeight, a.scrollTop)), c.scrollbars.setScrollTop(d.scrollTop), c.scroller.scrollTop = d.scrollTop), null == a.scrollLeft || c.scroller.scrollLeft == a.scrollLeft && !a.forceScroll || (d.scrollLeft = Math.max(0, Math.min(c.scroller.scrollWidth - qb(b), a.scrollLeft)), c.scrollbars.setScrollLeft(d.scrollLeft), c.scroller.scrollLeft = d.scrollLeft, Q(b)), a.scrollToPos) {
-            var e = pd(b, Oa(d, a.scrollToPos.from), Oa(d, a.scrollToPos.to), a.scrollToPos.margin);
-            a.scrollToPos.isCursor && b.state.focused && od(b, e)
-        }
-        var f = a.maybeHiddenMarkers,
-            g = a.maybeUnhiddenMarkers;
-        if (f)
-            for (var h = 0; h < f.length; ++h) f[h].lines.length || Lf(f[h], "hide");
-        if (g)
-            for (var h = 0; h < g.length; ++h) g[h].lines.length && Lf(g[h], "unhide");
-        c.wrapper.offsetHeight && (d.scrollTop = b.display.scroller.scrollTop), a.changeObjs && Lf(b, "changes", b, a.changeObjs), a.update && a.update.finish()
-    }
-
-    function cc(a, b) {
-        if (a.curOp) return b();
-        Vb(a);
-        try {
-            return b()
-        } finally {
-            Xb(a)
-        }
-    }
-
-    function dc(a, b) {
-        return function () {
-            if (a.curOp) return b.apply(a, arguments);
-            Vb(a);
-            try {
-                return b.apply(a, arguments)
-            } finally {
-                Xb(a)
-            }
-        }
-    }
-
-    function ec(a) {
-        return function () {
-            if (this.curOp) return a.apply(this, arguments);
-            Vb(this);
-            try {
-                return a.apply(this, arguments)
-            } finally {
-                Xb(this)
-            }
-        }
-    }
-
-    function fc(a) {
-        return function () {
-            var b = this.cm;
-            if (!b || b.curOp) return a.apply(this, arguments);
-            Vb(b);
-            try {
-                return a.apply(this, arguments)
-            } finally {
-                Xb(b)
-            }
-        }
-    }
-
-    function gc(a, b, c) {
-        this.line = b, this.rest = te(b), this.size = this.rest ? kf(bg(this.rest)) - c + 1 : 1, this.node = this.text = null, this.hidden = we(a, b)
-    }
-
-    function hc(a, b, c) {
-        for (var e, d = [], f = b; c > f; f = e) {
-            var g = new gc(a.doc, ff(a.doc, f), f);
-            e = f + g.size, d.push(g)
-        }
-        return d
-    }
-
-    function ic(a, b, c, d) {
-        null == b && (b = a.doc.first), null == c && (c = a.doc.first + a.doc.size), d || (d = 0);
-        var e = a.display;
-        if (d && c < e.viewTo && (null == e.updateLineNumbers || e.updateLineNumbers > b) && (e.updateLineNumbers = b), a.curOp.viewChanged = !0, b >= e.viewTo) u && ue(a.doc, b) < e.viewTo && kc(a);
-        else if (c <= e.viewFrom) u && ve(a.doc, c + d) > e.viewFrom ? kc(a) : (e.viewFrom += d, e.viewTo += d);
-        else if (b <= e.viewFrom && c >= e.viewTo) kc(a);
-        else if (b <= e.viewFrom) {
-            var f = mc(a, c, c + d, 1);
-            f ? (e.view = e.view.slice(f.index), e.viewFrom = f.lineN, e.viewTo += d) : kc(a)
-        } else if (c >= e.viewTo) {
-            var f = mc(a, b, b, -1);
-            f ? (e.view = e.view.slice(0, f.index), e.viewTo = f.lineN) : kc(a)
-        } else {
-            var g = mc(a, b, b, -1),
-                h = mc(a, c, c + d, 1);
-            g && h ? (e.view = e.view.slice(0, g.index)
-                .concat(hc(a, g.lineN, h.lineN))
-                .concat(e.view.slice(h.index)), e.viewTo += d) : kc(a)
-        }
-        var i = e.externalMeasured;
-        i && (c < i.lineN ? i.lineN += d : b < i.lineN + i.size && (e.externalMeasured = null))
-    }
-
-    function jc(a, b, c) {
-        a.curOp.viewChanged = !0;
-        var d = a.display,
-            e = a.display.externalMeasured;
-        if (e && b >= e.lineN && b < e.lineN + e.size && (d.externalMeasured = null), !(b < d.viewFrom || b >= d.viewTo)) {
-            var f = d.view[lc(a, b)];
-            if (null != f.node) {
-                var g = f.changes || (f.changes = []); - 1 == dg(g, c) && g.push(c)
-            }
-        }
-    }
-
-    function kc(a) {
-        a.display.viewFrom = a.display.viewTo = a.doc.first, a.display.view = [], a.display.viewOffset = 0
-    }
-
-    function lc(a, b) {
-        if (b >= a.display.viewTo) return null;
-        if (b -= a.display.viewFrom, 0 > b) return null;
-        for (var c = a.display.view, d = 0; d < c.length; d++)
-            if (b -= c[d].size, 0 > b) return d
-    }
-
-    function mc(a, b, c, d) {
-        var f, e = lc(a, b),
-            g = a.display.view;
-        if (!u || c == a.doc.first + a.doc.size) return {
-            index: e,
-            lineN: c
-        };
-        for (var h = 0, i = a.display.viewFrom; e > h; h++) i += g[h].size;
-        if (i != b) {
-            if (d > 0) {
-                if (e == g.length - 1) return null;
-                f = i + g[e].size - b, e++
-            } else f = i - b;
-            b += f, c += f
-        }
-        for (; ue(a.doc, c) != c;) {
-            if (e == (0 > d ? 0 : g.length - 1)) return null;
-            c += d * g[e - (0 > d ? 1 : 0)].size, e += d
-        }
-        return {
-            index: e,
-            lineN: c
-        }
-    }
-
-    function nc(a, b, c) {
-        var d = a.display,
-            e = d.view;
-        0 == e.length || b >= d.viewTo || c <= d.viewFrom ? (d.view = hc(a, b, c), d.viewFrom = b) : (d.viewFrom > b ? d.view = hc(a, b, d.viewFrom)
-            .concat(d.view) : d.viewFrom < b && (d.view = d.view.slice(lc(a, b))), d.viewFrom = b, d.viewTo < c ? d.view = d.view.concat(hc(a, d.viewTo, c)) : d.viewTo > c && (d.view = d.view.slice(0, lc(a, c)))), d.viewTo = c
-    }
-
-    function oc(a) {
-        for (var b = a.display.view, c = 0, d = 0; d < b.length; d++) {
-            var e = b[d];
-            e.hidden || e.node && !e.changes || ++c
-        }
-        return c
-    }
-
-    function pc(a) {
-        function g() {
-            b.activeTouch && (c = setTimeout(function () {
-                b.activeTouch = null
-            }, 1e3), f = b.activeTouch, f.end = +new Date)
-        }
-
-        function h(a) {
-            if (1 != a.touches.length) return !1;
-            var b = a.touches[0];
-            return b.radiusX <= 1 && b.radiusY <= 1
-        }
-
-        function i(a, b) {
-            if (null == b.left) return !0;
-            var c = b.left - a.left,
-                d = b.top - a.top;
-            return c * c + d * d > 400
-        }
-        var b = a.display;
-        Jf(b.scroller, "mousedown", dc(a, uc)), d && 11 > e ? Jf(b.scroller, "dblclick", dc(a, function (b) {
-            if (!Pf(a, b)) {
-                var c = tc(a, b);
-                if (c && !Bc(a, b) && !sc(a.display, b)) {
-                    Df(b);
-                    var d = a.findWordAt(c);
-                    Ta(a.doc, d.anchor, d.head)
-                }
-            }
-        })) : Jf(b.scroller, "dblclick", function (b) {
-            Pf(a, b) || Df(b)
-        }), s || Jf(b.scroller, "contextmenu", function (b) {
-            _c(a, b)
-        });
-        var c, f = {
-            end: 0
-        };
-        Jf(b.scroller, "touchstart", function (a) {
-            if (!h(a)) {
-                clearTimeout(c);
-                var d = +new Date;
-                b.activeTouch = {
-                    start: d,
-                    moved: !1,
-                    prev: d - f.end <= 300 ? f : null
-                }, 1 == a.touches.length && (b.activeTouch.left = a.touches[0].pageX, b.activeTouch.top = a.touches[0].pageY)
-            }
-        }), Jf(b.scroller, "touchmove", function () {
-            b.activeTouch && (b.activeTouch.moved = !0)
-        }), Jf(b.scroller, "touchend", function (c) {
-            var d = b.activeTouch;
-            if (d && !sc(b, c) && null != d.left && !d.moved && new Date - d.start < 300) {
-                var f, e = a.coordsChar(b.activeTouch, "page");
-                f = !d.prev || i(d, d.prev) ? new Ka(e, e) : !d.prev.prev || i(d, d.prev.prev) ? a.findWordAt(e) : new Ka(oa(e.line, 0), Oa(a.doc, oa(e.line + 1, 0))), a.setSelection(f.anchor, f.head), a.focus(), Df(c)
-            }
-            g()
-        }), Jf(b.scroller, "touchcancel", g), Jf(b.scroller, "scroll", function () {
-            b.scroller.clientHeight && (Hc(a, b.scroller.scrollTop), Ic(a, b.scroller.scrollLeft, !0), Lf(a, "scroll", a))
-        }), Jf(b.scroller, "mousewheel", function (b) {
-            Mc(a, b)
-        }), Jf(b.scroller, "DOMMouseScroll", function (b) {
-            Mc(a, b)
-        }), Jf(b.wrapper, "scroll", function () {
-            b.wrapper.scrollTop = b.wrapper.scrollLeft = 0
-        }), b.dragFunctions = {
-            enter: function (b) {
-                Pf(a, b) || Gf(b)
-            },
-            over: function (b) {
-                Pf(a, b) || (Fc(a, b), Gf(b))
-            },
-            start: function (b) {
-                Ec(a, b)
-            },
-            drop: dc(a, Dc),
-            leave: function () {
-                Gc(a)
-            }
-        };
-        var j = b.input.getField();
-        Jf(j, "keyup", function (b) {
-            Wc.call(a, b)
-        }), Jf(j, "keydown", dc(a, Uc)), Jf(j, "keypress", dc(a, Xc)), Jf(j, "focus", ig(Zc, a)), Jf(j, "blur", ig($c, a))
-    }
-
-    function qc(a, b, c) {
-        var d = c && c != v.Init;
-        if (!b != !d) {
-            var e = a.display.dragFunctions,
-                f = b ? Jf : Kf;
-            f(a.display.scroller, "dragstart", e.start), f(a.display.scroller, "dragenter", e.enter), f(a.display.scroller, "dragover", e.over), f(a.display.scroller, "dragleave", e.leave), f(a.display.scroller, "drop", e.drop)
-        }
-    }
-
-    function rc(a) {
-        var b = a.display;
-        (b.lastWrapHeight != b.wrapper.clientHeight || b.lastWrapWidth != b.wrapper.clientWidth) && (b.cachedCharWidth = b.cachedTextHeight = b.cachedPaddingH = null, b.scrollbarsClipped = !1, a.setSize())
-    }
-
-    function sc(a, b) {
-        for (var c = Hf(b); c != a.wrapper; c = c.parentNode)
-            if (!c || 1 == c.nodeType && "true" == c.getAttribute("cm-ignore-events") || c.parentNode == a.sizer && c != a.mover) return !0
-    }
-
-    function tc(a, b, c, d) {
-        var e = a.display;
-        if (!c && "true" == Hf(b)
-            .getAttribute("cm-not-content")) return null;
-        var f, g, h = e.lineSpace.getBoundingClientRect();
-        try {
-            f = b.clientX - h.left, g = b.clientY - h.top
-        } catch (b) {
-            return null
-        }
-        var j, i = Ob(a, f, g);
-        if (d && 1 == i.xRel && (j = ff(a.doc, i.line)
-                .text)
-            .length == i.ch) {
-            var k = Zf(j, j.length, a.options.tabSize) - j.length;
-            i = oa(i.line, Math.max(0, Math.round((f - ob(a.display)
-                .left) / Sb(a.display)) - k))
-        }
-        return i
-    }
-
-    function uc(a) {
-        var b = this,
-            c = b.display;
-        if (!(c.activeTouch && c.input.supportsTouch() || Pf(b, a))) {
-            if (c.shift = a.shiftKey, sc(c, a)) return void(f || (c.scroller.draggable = !1, setTimeout(function () {
-                c.scroller.draggable = !0
-            }, 100)));
-            if (!Bc(b, a)) {
-                var d = tc(b, a);
-                switch (window.focus(), If(a)) {
-                case 1:
-                    b.state.selectingText ? b.state.selectingText(a) : d ? xc(b, a, d) : Hf(a) == c.scroller && Df(a);
-                    break;
-                case 2:
-                    f && (b.state.lastMiddleDown = +new Date), d && Ta(b.doc, d), setTimeout(function () {
-                        c.input.focus()
-                    }, 20), Df(a);
-                    break;
-                case 3:
-                    s ? _c(b, a) : Yc(b)
-                }
-            }
-        }
-    }
-
-    function xc(a, b, c) {
-        d ? setTimeout(ig(ta, a), 0) : a.curOp.focus = ug();
-        var f, e = +new Date;
-        wc && wc.time > e - 400 && 0 == pa(wc.pos, c) ? f = "triple" : vc && vc.time > e - 400 && 0 == pa(vc.pos, c) ? (f = "double", wc = {
-            time: e,
-            pos: c
-        }) : (f = "single", vc = {
-            time: e,
-            pos: c
-        });
-        var i, g = a.doc.sel,
-            h = o ? b.metaKey : b.ctrlKey;
-        a.options.dragDrop && Dg && !ua(a) && "single" == f && (i = g.contains(c)) > -1 && (pa((i = g.ranges[i])
-            .from(), c) < 0 || c.xRel > 0) && (pa(i.to(), c) > 0 || c.xRel < 0) ? yc(a, b, c, h) : zc(a, b, c, f, h)
-    }
-
-    function yc(a, b, c, g) {
-        var h = a.display,
-            i = +new Date,
-            j = dc(a, function (k) {
-                f && (h.scroller.draggable = !1), a.state.draggingText = !1, Kf(document, "mouseup", j), Kf(h.scroller, "drop", j), Math.abs(b.clientX - k.clientX) + Math.abs(b.clientY - k.clientY) < 10 && (Df(k), !g && +new Date - 200 < i && Ta(a.doc, c), f || d && 9 == e ? setTimeout(function () {
-                    document.body.focus(), h.input.focus()
-                }, 20) : h.input.focus())
-            });
-        f && (h.scroller.draggable = !0), a.state.draggingText = j, h.scroller.dragDrop && h.scroller.dragDrop(), Jf(document, "mouseup", j), Jf(h.scroller, "drop", j)
-    }
-
-    function zc(a, b, c, d, e) {
-        function o(b) {
-            if (0 != pa(n, b))
-                if (n = b, "rect" == d) {
-                    for (var e = [], f = a.options.tabSize, k = Zf(ff(g, c.line)
-                            .text, c.ch, f), l = Zf(ff(g, b.line)
-                            .text, b.ch, f), m = Math.min(k, l), o = Math.max(k, l), p = Math.min(c.line, b.line), q = Math.min(a.lastLine(), Math.max(c.line, b.line)); q >= p; p++) {
-                        var r = ff(g, p)
-                            .text,
-                            s = $f(r, m, f);
-                        m == o ? e.push(new Ka(oa(p, s), oa(p, s))) : r.length > s && e.push(new Ka(oa(p, s), oa(p, $f(r, o, f))))
-                    }
-                    e.length || e.push(new Ka(c, c)), Za(g, La(j.ranges.slice(0, i)
-                        .concat(e), i), {
-                        origin: "*mouse",
-                        scroll: !1
-                    }), a.scrollIntoView(b)
-                } else {
-                    var t = h,
-                        u = t.anchor,
-                        v = b;
-                    if ("single" != d) {
-                        if ("double" == d) var w = a.findWordAt(b);
-                        else var w = new Ka(oa(b.line, 0), Oa(g, oa(b.line + 1, 0)));
-                        pa(w.anchor, u) > 0 ? (v = w.head, u = sa(t.from(), w.anchor)) : (v = w.anchor, u = ra(t.to(), w.head))
-                    }
-                    var e = j.ranges.slice(0);
-                    e[i] = new Ka(Oa(g, u), v), Za(g, La(e, i), Wf)
-                }
-        }
-
-        function r(b) {
-            var c = ++q,
-                e = tc(a, b, !0, "rect" == d);
-            if (e)
-                if (0 != pa(e, n)) {
-                    a.curOp.focus = ug(), o(e);
-                    var h = P(f, g);
-                    (e.line >= h.to || e.line < h.from) && setTimeout(dc(a, function () {
-                        q == c && r(b)
-                    }), 150)
-                } else {
-                    var i = b.clientY < p.top ? -20 : b.clientY > p.bottom ? 20 : 0;
-                    i && setTimeout(dc(a, function () {
-                        q == c && (f.scroller.scrollTop += i, r(b))
-                    }), 50)
-                }
-        }
-
-        function s(b) {
-            a.state.selectingText = !1, q = 1 / 0, Df(b), f.input.focus(), Kf(document, "mousemove", t), Kf(document, "mouseup", u), g.history.lastSelOrigin = null
-        }
-        var f = a.display,
-            g = a.doc;
-        Df(b);
-        var h, i, j = g.sel,
-            k = j.ranges;
-        if (e && !b.shiftKey ? (i = g.sel.contains(c), h = i > -1 ? k[i] : new Ka(c, c)) : (h = g.sel.primary(), i = g.sel.primIndex), b.altKey) d = "rect", e || (h = new Ka(c, c)), c = tc(a, b, !0, !0), i = -1;
-        else if ("double" == d) {
-            var l = a.findWordAt(c);
-            h = a.display.shift || g.extend ? Sa(g, h, l.anchor, l.head) : l
-        } else if ("triple" == d) {
-            var m = new Ka(oa(c.line, 0), Oa(g, oa(c.line + 1, 0)));
-            h = a.display.shift || g.extend ? Sa(g, h, m.anchor, m.head) : m
-        } else h = Sa(g, h, c);
-        e ? -1 == i ? (i = k.length, Za(g, La(k.concat([h]), i), {
-            scroll: !1,
-            origin: "*mouse"
-        })) : k.length > 1 && k[i].empty() && "single" == d && !b.shiftKey ? (Za(g, La(k.slice(0, i)
-            .concat(k.slice(i + 1)), 0), {
-            scroll: !1,
-            origin: "*mouse"
-        }), j = g.sel) : Va(g, i, h, Wf) : (i = 0, Za(g, new Ja([h], 0), Wf), j = g.sel);
-        var n = c,
-            p = f.wrapper.getBoundingClientRect(),
-            q = 0,
-            t = dc(a, function (a) {
-                If(a) ? r(a) : s(a)
-            }),
-            u = dc(a, s);
-        a.state.selectingText = u, Jf(document, "mousemove", t), Jf(document, "mouseup", u)
-    }
-
-    function Ac(a, b, c, d, e) {
-        try {
-            var f = b.clientX,
-                g = b.clientY
-        } catch (b) {
-            return !1
-        }
-        if (f >= Math.floor(a.display.gutters.getBoundingClientRect()
-                .right)) return !1;
-        d && Df(b);
-        var h = a.display,
-            i = h.lineDiv.getBoundingClientRect();
-        if (g > i.bottom || !Rf(a, c)) return Ff(b);
-        g -= i.top - h.viewOffset;
-        for (var j = 0; j < a.options.gutters.length; ++j) {
-            var k = h.gutters.childNodes[j];
-            if (k && k.getBoundingClientRect()
-                .right >= f) {
-                var l = lf(a.doc, g),
-                    m = a.options.gutters[j];
-                return e(a, c, a, l, m, b), Ff(b)
-            }
-        }
-    }
-
-    function Bc(a, b) {
-        return Ac(a, b, "gutterClick", !0, Nf)
-    }
-
-    function Dc(a) {
-        var b = this;
-        if (Gc(b), !Pf(b, a) && !sc(b.display, a)) {
-            Df(a), d && (Cc = +new Date);
-            var c = tc(b, a, !0),
-                e = a.dataTransfer.files;
-            if (c && !ua(b))
-                if (e && e.length && window.FileReader && window.File)
-                    for (var f = e.length, g = Array(f), h = 0, i = function (a, d) {
-                            var e = new FileReader;
-                            e.onload = dc(b, function () {
-                                if (g[d] = e.result, ++h == f) {
-                                    c = Oa(b.doc, c);
-                                    var a = {
-                                        from: c,
-                                        to: c,
-                                        text: b.doc.splitLines(g.join(b.doc.lineSeparator())),
-                                        origin: "paste"
-                                    };
-                                    hd(b.doc, a), Ya(b.doc, Ma(c, bd(a)))
-                                }
-                            }), e.readAsText(a)
-                        }, j = 0; f > j; ++j) i(e[j], j);
-                else {
-                    if (b.state.draggingText && b.doc.sel.contains(c) > -1) return b.state.draggingText(a), void setTimeout(function () {
-                        b.display.input.focus()
-                    }, 20);
-                    try {
-                        var g = a.dataTransfer.getData("Text");
-                        if (g) {
-                            if (b.state.draggingText && !(o ? a.altKey : a.ctrlKey)) var k = b.listSelections();
-                            if ($a(b.doc, Ma(c, c)), k)
-                                for (var j = 0; j < k.length; ++j) nd(b.doc, "", k[j].anchor, k[j].head, "drag");
-                            b.replaceSelection(g, "around", "paste"), b.display.input.focus()
-                        }
-                    } catch (a) {}
-                }
-        }
-    }
-
-    function Ec(a, b) {
-        if (d && (!a.state.draggingText || +new Date - Cc < 100)) return void Gf(b);
-        if (!Pf(a, b) && !sc(a.display, b) && (b.dataTransfer.setData("Text", a.getSelection()), b.dataTransfer.setDragImage && !j)) {
-            var c = pg("img", null, null, "position: fixed; left: 0; top: 0;");
-            c.src = "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==", i && (c.width = c.height = 1, a.display.wrapper.appendChild(c), c._top = c.offsetTop), b.dataTransfer.setDragImage(c, 0, 0), i && c.parentNode.removeChild(c)
-        }
-    }
-
-    function Fc(a, b) {
-        var c = tc(a, b);
-        if (c) {
-            var d = document.createDocumentFragment();
-            fb(a, c, d), a.display.dragCursor || (a.display.dragCursor = pg("div", null, "CodeMirror-cursors CodeMirror-dragcursors"), a.display.lineSpace.insertBefore(a.display.dragCursor, a.display.cursorDiv)), sg(a.display.dragCursor, d)
-        }
-    }
-
-    function Gc(a) {
-        a.display.dragCursor && (a.display.lineSpace.removeChild(a.display.dragCursor), a.display.dragCursor = null)
-    }
-
-    function Hc(b, c) {
-        Math.abs(b.doc.scrollTop - c) < 2 || (b.doc.scrollTop = c, a || Y(b, {
-            top: c
-        }), b.display.scroller.scrollTop != c && (b.display.scroller.scrollTop = c), b.display.scrollbars.setScrollTop(c), a && Y(b), ib(b, 100))
-    }
-
-    function Ic(a, b, c) {
-        (c ? b == a.doc.scrollLeft : Math.abs(a.doc.scrollLeft - b) < 2) || (b = Math.min(b, a.display.scroller.scrollWidth - a.display.scroller.clientWidth), a.doc.scrollLeft = b, Q(a), a.display.scroller.scrollLeft != b && (a.display.scroller.scrollLeft = b), a.display.scrollbars.setScrollLeft(b))
-    }
-
-    function Mc(b, c) {
-        var d = Lc(c),
-            e = d.x,
-            g = d.y,
-            h = b.display,
-            j = h.scroller;
-        if (e && j.scrollWidth > j.clientWidth || g && j.scrollHeight > j.clientHeight) {
-            if (g && o && f) a: for (var k = c.target, l = h.view; k != j; k = k.parentNode)
-                for (var m = 0; m < l.length; m++)
-                    if (l[m].node == k) {
-                        b.display.currentWheelTarget = k;
-                        break a
-                    }
-            if (e && !a && !i && null != Kc) return g && Hc(b, Math.max(0, Math.min(j.scrollTop + g * Kc, j.scrollHeight - j.clientHeight))), Ic(b, Math.max(0, Math.min(j.scrollLeft + e * Kc, j.scrollWidth - j.clientWidth))), Df(c), void(h.wheelStartX = null);
-            if (g && null != Kc) {
-                var n = g * Kc,
-                    p = b.doc.scrollTop,
-                    q = p + h.wrapper.clientHeight;
-                0 > n ? p = Math.max(0, p + n - 50) : q = Math.min(b.doc.height, q + n + 50), Y(b, {
-                    top: p,
-                    bottom: q
-                })
-            }
-            20 > Jc && (null == h.wheelStartX ? (h.wheelStartX = j.scrollLeft, h.wheelStartY = j.scrollTop, h.wheelDX = e, h.wheelDY = g, setTimeout(function () {
-                if (null != h.wheelStartX) {
-                    var a = j.scrollLeft - h.wheelStartX,
-                        b = j.scrollTop - h.wheelStartY,
-                        c = b && h.wheelDY && b / h.wheelDY || a && h.wheelDX && a / h.wheelDX;
-                    h.wheelStartX = h.wheelStartY = null, c && (Kc = (Kc * Jc + c) / (Jc + 1), ++Jc)
-                }
-            }, 200)) : (h.wheelDX += e, h.wheelDY += g))
-        }
-    }
-
-    function Nc(a, b, c) {
-        if ("string" == typeof b && (b = Ld[b], !b)) return !1;
-        a.display.input.ensurePolled();
-        var d = a.display.shift,
-            e = !1;
-        try {
-            ua(a) && (a.state.suppressEdits = !0), c && (a.display.shift = !1), e = b(a) != Uf
-        } finally {
-            a.display.shift = d, a.state.suppressEdits = !1
-        }
-        return e
-    }
-
-    function Oc(a, b, c) {
-        for (var d = 0; d < a.state.keyMaps.length; d++) {
-            var e = Od(b, a.state.keyMaps[d], c, a);
-            if (e) return e
-        }
-        return a.options.extraKeys && Od(b, a.options.extraKeys, c, a) || Od(b, a.options.keyMap, c, a)
-    }
-
-    function Qc(a, b, c, d) {
-        var e = a.state.keySeq;
-        if (e) {
-            if (Pd(b)) return "handled";
-            Pc.set(50, function () {
-                a.state.keySeq == e && (a.state.keySeq = null, a.display.input.reset())
-            }), b = e + " " + b
-        }
-        var f = Oc(a, b, d);
-        return "multi" == f && (a.state.keySeq = b), "handled" == f && Nf(a, "keyHandled", a, b, c), ("handled" == f || "multi" == f) && (Df(c), hb(a)), e && !f && /\'$/.test(b) ? (Df(c), !0) : !!f
-    }
-
-    function Rc(a, b) {
-        var c = Qd(b, !0);
-        return c ? b.shiftKey && !a.state.keySeq ? Qc(a, "Shift-" + c, b, function (b) {
-            return Nc(a, b, !0)
-        }) || Qc(a, c, b, function (b) {
-            return ("string" == typeof b ? /^go[A-Z]/.test(b) : b.motion) ? Nc(a, b) : void 0
-        }) : Qc(a, c, b, function (b) {
-            return Nc(a, b)
-        }) : !1
-    }
-
-    function Sc(a, b, c) {
-        return Qc(a, "'" + c + "'", b, function (b) {
-            return Nc(a, b, !0)
-        })
-    }
-
-    function Uc(a) {
-        var b = this;
-        if (b.curOp.focus = ug(), !Pf(b, a)) {
-            d && 11 > e && 27 == a.keyCode && (a.returnValue = !1);
-            var c = a.keyCode;
-            b.display.shift = 16 == c || a.shiftKey;
-            var f = Rc(b, a);
-            i && (Tc = f ? c : null, !f && 88 == c && !Kg && (o ? a.metaKey : a.ctrlKey) && b.replaceSelection("", null, "cut")), 18 != c || /\bCodeMirror-crosshair\b/.test(b.display.lineDiv.className) || Vc(b)
-        }
-    }
-
-    function Vc(a) {
-        function c(a) {
-            18 != a.keyCode && a.altKey || (wg(b, "CodeMirror-crosshair"), Kf(document, "keyup", c), Kf(document, "mouseover", c))
-        }
-        var b = a.display.lineDiv;
-        xg(b, "CodeMirror-crosshair"), Jf(document, "keyup", c), Jf(document, "mouseover", c)
-    }
-
-    function Wc(a) {
-        16 == a.keyCode && (this.doc.sel.shift = !1), Pf(this, a)
-    }
-
-    function Xc(a) {
-        var b = this;
-        if (!(sc(b.display, a) || Pf(b, a) || a.ctrlKey && !a.altKey || o && a.metaKey)) {
-            var c = a.keyCode,
-                d = a.charCode;
-            if (i && c == Tc) return Tc = null, void Df(a);
-            if (!i || a.which && !(a.which < 10) || !Rc(b, a)) {
-                var e = String.fromCharCode(null == d ? c : d);
-                Sc(b, a, e) || b.display.input.onKeyPress(a)
-            }
-        }
-    }
-
-    function Yc(a) {
-        a.state.delayingBlurEvent = !0, setTimeout(function () {
-            a.state.delayingBlurEvent && (a.state.delayingBlurEvent = !1, $c(a))
-        }, 100)
-    }
-
-    function Zc(a) {
-        a.state.delayingBlurEvent && (a.state.delayingBlurEvent = !1), "nocursor" != a.options.readOnly && (a.state.focused || (Lf(a, "focus", a), a.state.focused = !0, xg(a.display.wrapper, "CodeMirror-focused"), a.curOp || a.display.selForContextMenu == a.doc.sel || (a.display.input.reset(), f && setTimeout(function () {
-            a.display.input.reset(!0)
-        }, 20)), a.display.input.receivedFocus()), hb(a))
-    }
-
-    function $c(a) {
-        a.state.delayingBlurEvent || (a.state.focused && (Lf(a, "blur", a), a.state.focused = !1, wg(a.display.wrapper, "CodeMirror-focused")), clearInterval(a.display.blinker), setTimeout(function () {
-            a.state.focused || (a.display.shift = !1)
-        }, 150))
-    }
-
-    function _c(a, b) {
-        sc(a.display, b) || ad(a, b) || a.display.input.onContextMenu(b)
-    }
-
-    function ad(a, b) {
-        return Rf(a, "gutterContextMenu") ? Ac(a, b, "gutterContextMenu", !1, Lf) : !1
-    }
-
-    function cd(a, b) {
-        if (pa(a, b.from) < 0) return a;
-        if (pa(a, b.to) <= 0) return bd(b);
-        var c = a.line + b.text.length - (b.to.line - b.from.line) - 1,
-            d = a.ch;
-        return a.line == b.to.line && (d += bd(b)
-            .ch - b.to.ch), oa(c, d)
-    }
-
-    function dd(a, b) {
-        for (var c = [], d = 0; d < a.sel.ranges.length; d++) {
-            var e = a.sel.ranges[d];
-            c.push(new Ka(cd(e.anchor, b), cd(e.head, b)))
-        }
-        return La(c, a.sel.primIndex)
-    }
-
-    function ed(a, b, c) {
-        return a.line == b.line ? oa(c.line, a.ch - b.ch + c.ch) : oa(c.line + (a.line - b.line), a.ch)
-    }
-
-    function fd(a, b, c) {
-        for (var d = [], e = oa(a.first, 0), f = e, g = 0; g < b.length; g++) {
-            var h = b[g],
-                i = ed(h.from, e, f),
-                j = ed(bd(h), e, f);
-            if (e = h.to, f = j, "around" == c) {
-                var k = a.sel.ranges[g],
-                    l = pa(k.head, k.anchor) < 0;
-                d[g] = new Ka(l ? j : i, l ? i : j)
-            } else d[g] = new Ka(i, i)
-        }
-        return new Ja(d, a.sel.primIndex)
-    }
-
-    function gd(a, b, c) {
-        var d = {
-            canceled: !1,
-            from: b.from,
-            to: b.to,
-            text: b.text,
-            origin: b.origin,
-            cancel: function () {
-                this.canceled = !0
-            }
-        };
-        return c && (d.update = function (b, c, d, e) {
-            b && (this.from = Oa(a, b)), c && (this.to = Oa(a, c)), d && (this.text = d), void 0 !== e && (this.origin = e)
-        }), Lf(a, "beforeChange", a, d), a.cm && Lf(a.cm, "beforeChange", a.cm, d), d.canceled ? null : {
-            from: d.from,
-            to: d.to,
-            text: d.text,
-            origin: d.origin
-        }
-    }
-
-    function hd(a, b, c) {
-        if (a.cm) {
-            if (!a.cm.curOp) return dc(a.cm, hd)(a, b, c);
-            if (a.cm.state.suppressEdits) return
-        }
-        if (!(Rf(a, "beforeChange") || a.cm && Rf(a.cm, "beforeChange")) || (b = gd(a, b, !0))) {
-            var d = t && !c && ie(a, b.from, b.to);
-            if (d)
-                for (var e = d.length - 1; e >= 0; --e) id(a, {
-                    from: d[e].from,
-                    to: d[e].to,
-                    text: e ? [""] : b.text
-                });
-            else id(a, b)
-        }
-    }
-
-    function id(a, b) {
-        if (1 != b.text.length || "" != b.text[0] || 0 != pa(b.from, b.to)) {
-            var c = dd(a, b);
-            sf(a, b, c, a.cm ? a.cm.curOp.id : NaN), ld(a, b, c, fe(a, b));
-            var d = [];
-            df(a, function (a, c) {
-                c || -1 != dg(d, a.history) || (Cf(a.history, b), d.push(a.history)), ld(a, b, null, fe(a, b))
-            })
-        }
-    }
-
-    function jd(a, b, c) {
-        if (!a.cm || !a.cm.state.suppressEdits) {
-            for (var e, d = a.history, f = a.sel, g = "undo" == b ? d.done : d.undone, h = "undo" == b ? d.undone : d.done, i = 0; i < g.length && (e = g[i], c ? !e.ranges || e.equals(a.sel) : e.ranges); i++);
-            if (i != g.length) {
-                for (d.lastOrigin = d.lastSelOrigin = null; e = g.pop(), e.ranges;) {
-                    if (vf(e, h), c && !e.equals(a.sel)) return void Za(a, e, {
-                        clearRedo: !1
-                    });
-                    f = e
-                }
-                var j = [];
-                vf(f, h), h.push({
-                    changes: j,
-                    generation: d.generation
-                }), d.generation = e.generation || ++d.maxGeneration;
-                for (var k = Rf(a, "beforeChange") || a.cm && Rf(a.cm, "beforeChange"), i = e.changes.length - 1; i >= 0; --i) {
-                    var l = e.changes[i];
-                    if (l.origin = b, k && !gd(a, l, !1)) return void(g.length = 0);
-                    j.push(pf(a, l));
-                    var m = i ? dd(a, l) : bg(g);
-                    ld(a, l, m, he(a, l)), !i && a.cm && a.cm.scrollIntoView({
-                        from: l.from,
-                        to: bd(l)
-                    });
-                    var n = [];
-                    df(a, function (a, b) {
-                        b || -1 != dg(n, a.history) || (Cf(a.history, l), n.push(a.history)), ld(a, l, null, he(a, l))
-                    })
-                }
-            }
-        }
-    }
-
-    function kd(a, b) {
-        if (0 != b && (a.first += b, a.sel = new Ja(eg(a.sel.ranges, function (a) {
-                return new Ka(oa(a.anchor.line + b, a.anchor.ch), oa(a.head.line + b, a.head.ch))
-            }), a.sel.primIndex), a.cm)) {
-            ic(a.cm, a.first, a.first - b, b);
-            for (var c = a.cm.display, d = c.viewFrom; d < c.viewTo; d++) jc(a.cm, d, "gutter")
-        }
-    }
-
-    function ld(a, b, c, d) {
-        if (a.cm && !a.cm.curOp) return dc(a.cm, ld)(a, b, c, d);
-        if (b.to.line < a.first) return void kd(a, b.text.length - 1 - (b.to.line - b.from.line));
-        if (!(b.from.line > a.lastLine())) {
-            if (b.from.line < a.first) {
-                var e = b.text.length - 1 - (a.first - b.from.line);
-                kd(a, e), b = {
-                    from: oa(a.first, 0),
-                    to: oa(b.to.line + e, b.to.ch),
-                    text: [bg(b.text)],
-                    origin: b.origin
-                }
-            }
-            var f = a.lastLine();
-            b.to.line > f && (b = {
-                from: b.from,
-                to: oa(f, ff(a, f)
-                    .text.length),
-                text: [b.text[0]],
-                origin: b.origin
-            }), b.removed = gf(a, b.from, b.to), c || (c = dd(a, b)), a.cm ? md(a.cm, b, d) : Ye(a, b, d), $a(a, c, Vf)
-        }
-    }
-
-    function md(a, b, c) {
-        var d = a.doc,
-            e = a.display,
-            f = b.from,
-            g = b.to,
-            h = !1,
-            i = f.line;
-        a.options.lineWrapping || (i = kf(se(ff(d, f.line))), d.iter(i, g.line + 1, function (a) {
-            return a == e.maxLine ? (h = !0, !0) : void 0
-        })), d.sel.contains(b.from, b.to) > -1 && Qf(a), Ye(d, b, c, A(a)), a.options.lineWrapping || (d.iter(i, f.line + b.text.length, function (a) {
-            var b = G(a);
-            b > e.maxLineLength && (e.maxLine = a, e.maxLineLength = b, e.maxLineChanged = !0, h = !1)
-        }), h && (a.curOp.updateMaxLine = !0)), d.frontier = Math.min(d.frontier, f.line), ib(a, 400);
-        var j = b.text.length - (g.line - f.line) - 1;
-        b.full ? ic(a) : f.line != g.line || 1 != b.text.length || Xe(a.doc, b) ? ic(a, f.line, g.line + 1, j) : jc(a, f.line, "text");
-        var k = Rf(a, "changes"),
-            l = Rf(a, "change");
-        if (l || k) {
-            var m = {
-                from: f,
-                to: g,
-                text: b.text,
-                removed: b.removed,
-                origin: b.origin
-            };
-            l && Nf(a, "change", a, m), k && (a.curOp.changeObjs || (a.curOp.changeObjs = []))
-                .push(m)
-        }
-        a.display.selForContextMenu = null
-    }
-
-    function nd(a, b, c, d, e) {
-        if (d || (d = c), pa(d, c) < 0) {
-            var f = d;
-            d = c, c = f
-        }
-        "string" == typeof b && (b = a.splitLines(b)), hd(a, {
-            from: c,
-            to: d,
-            text: b,
-            origin: e
-        })
-    }
-
-    function od(a, b) {
-        if (!Pf(a, "scrollCursorIntoView")) {
-            var c = a.display,
-                d = c.sizer.getBoundingClientRect(),
-                e = null;
-            if (b.top + d.top < 0 ? e = !0 : b.bottom + d.top > (window.innerHeight || document.documentElement.clientHeight) && (e = !1), null != e && !l) {
-                var f = pg("div", "\u200b", null, "position: absolute; top: " + (b.top - c.viewOffset - mb(a.display)) + "px; height: " + (b.bottom - b.top + pb(a) + c.barHeight) + "px; left: " + b.left + "px; width: 2px;");
-                a.display.lineSpace.appendChild(f), f.scrollIntoView(e), a.display.lineSpace.removeChild(f)
-            }
-        }
-    }
-
-    function pd(a, b, c, d) {
-        null == d && (d = 0);
-        for (var e = 0; 5 > e; e++) {
-            var f = !1,
-                g = Lb(a, b),
-                h = c && c != b ? Lb(a, c) : g,
-                i = rd(a, Math.min(g.left, h.left), Math.min(g.top, h.top) - d, Math.max(g.left, h.left), Math.max(g.bottom, h.bottom) + d),
-                j = a.doc.scrollTop,
-                k = a.doc.scrollLeft;
-            if (null != i.scrollTop && (Hc(a, i.scrollTop), Math.abs(a.doc.scrollTop - j) > 1 && (f = !0)), null != i.scrollLeft && (Ic(a, i.scrollLeft), Math.abs(a.doc.scrollLeft - k) > 1 && (f = !0)), !f) break
-        }
-        return g
-    }
-
-    function qd(a, b, c, d, e) {
-        var f = rd(a, b, c, d, e);
-        null != f.scrollTop && Hc(a, f.scrollTop), null != f.scrollLeft && Ic(a, f.scrollLeft)
-    }
-
-    function rd(a, b, c, d, e) {
-        var f = a.display,
-            g = Rb(a.display);
-        0 > c && (c = 0);
-        var h = a.curOp && null != a.curOp.scrollTop ? a.curOp.scrollTop : f.scroller.scrollTop,
-            i = rb(a),
-            j = {};
-        e - c > i && (e = c + i);
-        var k = a.doc.height + nb(f),
-            l = g > c,
-            m = e > k - g;
-        if (h > c) j.scrollTop = l ? 0 : c;
-        else if (e > h + i) {
-            var n = Math.min(c, (m ? k : e) - i);
-            n != h && (j.scrollTop = n)
-        }
-        var o = a.curOp && null != a.curOp.scrollLeft ? a.curOp.scrollLeft : f.scroller.scrollLeft,
-            p = qb(a) - (a.options.fixedGutter ? f.gutters.offsetWidth : 0),
-            q = d - b > p;
-        return q && (d = b + p), 10 > b ? j.scrollLeft = 0 : o > b ? j.scrollLeft = Math.max(0, b - (q ? 0 : 10)) : d > p + o - 3 && (j.scrollLeft = d + (q ? 0 : 10) - p), j
-    }
-
-    function sd(a, b, c) {
-        (null != b || null != c) && ud(a), null != b && (a.curOp.scrollLeft = (null == a.curOp.scrollLeft ? a.doc.scrollLeft : a.curOp.scrollLeft) + b), null != c && (a.curOp.scrollTop = (null == a.curOp.scrollTop ? a.doc.scrollTop : a.curOp.scrollTop) + c)
-    }
-
-    function td(a) {
-        ud(a);
-        var b = a.getCursor(),
-            c = b,
-            d = b;
-        a.options.lineWrapping || (c = b.ch ? oa(b.line, b.ch - 1) : b, d = oa(b.line, b.ch + 1)), a.curOp.scrollToPos = {
-            from: c,
-            to: d,
-            margin: a.options.cursorScrollMargin,
-            isCursor: !0
-        }
-    }
-
-    function ud(a) {
-        var b = a.curOp.scrollToPos;
-        if (b) {
-            a.curOp.scrollToPos = null;
-            var c = Mb(a, b.from),
-                d = Mb(a, b.to),
-                e = rd(a, Math.min(c.left, d.left), Math.min(c.top, d.top) - b.margin, Math.max(c.right, d.right), Math.max(c.bottom, d.bottom) + b.margin);
-            a.scrollTo(e.scrollLeft, e.scrollTop)
-        }
-    }
-
-    function vd(a, b, c, d) {
-        var f, e = a.doc;
-        null == c && (c = "add"), "smart" == c && (e.mode.indent ? f = lb(a, b) : c = "prev");
-        var g = a.options.tabSize,
-            h = ff(e, b),
-            i = Zf(h.text, null, g);
-        h.stateAfter && (h.stateAfter = null);
-        var k, j = h.text.match(/^\s*/)[0];
-        if (d || /\S/.test(h.text)) {
-            if ("smart" == c && (k = e.mode.indent(f, h.text.slice(j.length), h.text), k == Uf || k > 150)) {
-                if (!d) return;
-                c = "prev"
-            }
-        } else k = 0, c = "not";
-        "prev" == c ? k = b > e.first ? Zf(ff(e, b - 1)
-            .text, null, g) : 0 : "add" == c ? k = i + a.options.indentUnit : "subtract" == c ? k = i - a.options.indentUnit : "number" == typeof c && (k = i + c), k = Math.max(0, k);
-        var l = "",
-            m = 0;
-        if (a.options.indentWithTabs)
-            for (var n = Math.floor(k / g); n; --n) m += g, l += "	";
-        if (k > m && (l += ag(k - m)), l != j) return nd(e, l, oa(b, 0), oa(b, j.length), "+input"), h.stateAfter = null, !0;
-        for (var n = 0; n < e.sel.ranges.length; n++) {
-            var o = e.sel.ranges[n];
-            if (o.head.line == b && o.head.ch < j.length) {
-                var m = oa(b, j.length);
-                Va(e, n, new Ka(m, m));
-                break
-            }
-        }
-    }
-
-    function wd(a, b, c, d) {
-        var e = b,
-            f = b;
-        return "number" == typeof b ? f = ff(a, Na(a, b)) : e = kf(b), null == e ? null : (d(f, e) && a.cm && jc(a.cm, e, c), f)
-    }
-
-    function xd(a, b) {
-        for (var c = a.doc.sel.ranges, d = [], e = 0; e < c.length; e++) {
-            for (var f = b(c[e]); d.length && pa(f.from, bg(d)
-                    .to) <= 0;) {
-                var g = d.pop();
-                if (pa(g.from, f.from) < 0) {
-                    f.from = g.from;
-                    break
-                }
-            }
-            d.push(f)
-        }
-        cc(a, function () {
-            for (var b = d.length - 1; b >= 0; b--) nd(a.doc, "", d[b].from, d[b].to, "+delete");
-            td(a)
-        })
-    }
-
-    function yd(a, b, c, d, e) {
-        function k() {
-            var b = f + c;
-            return b < a.first || b >= a.first + a.size ? j = !1 : (f = b, i = ff(a, b))
-        }
-
-        function l(a) {
-            var b = (e ? $g : _g)(i, g, c, !0);
-            if (null == b) {
-                if (a || !k()) return j = !1;
-                g = e ? (0 > c ? Sg : Rg)(i) : 0 > c ? i.text.length : 0
-            } else g = b;
-            return !0
-        }
-        var f = b.line,
-            g = b.ch,
-            h = c,
-            i = ff(a, f),
-            j = !0;
-        if ("char" == d) l();
-        else if ("column" == d) l(!0);
-        else if ("word" == d || "group" == d)
-            for (var m = null, n = "group" == d, o = a.cm && a.cm.getHelper(b, "wordChars"), p = !0; !(0 > c) || l(!p); p = !1) {
-                var q = i.text.charAt(g) || "\n",
-                    r = lg(q, o) ? "w" : n && "\n" == q ? "n" : !n || /\s/.test(q) ? null : "p";
-                if (!n || p || r || (r = "s"), m && m != r) {
-                    0 > c && (c = 1, l());
-                    break
-                }
-                if (r && (m = r), c > 0 && !l(!p)) break
-            }
-        var s = cb(a, oa(f, g), h, !0);
-        return j || (s.hitSide = !0), s
-    }
-
-    function zd(a, b, c, d) {
-        var g, e = a.doc,
-            f = b.left;
-        if ("page" == d) {
-            var h = Math.min(a.display.wrapper.clientHeight, window.innerHeight || document.documentElement.clientHeight);
-            g = b.top + c * (h - (0 > c ? 1.5 : .5) * Rb(a.display))
-        } else "line" == d && (g = c > 0 ? b.bottom + 3 : b.top - 3);
-        for (;;) {
-            var i = Ob(a, f, g);
-            if (!i.outside) break;
-            if (0 > c ? 0 >= g : g >= e.height) {
-                i.hitSide = !0;
-                break
-            }
-            g += 5 * c
-        }
-        return i
-    }
-
-    function Cd(a, b, c, d) {
-        v.defaults[a] = b, c && (Bd[a] = d ? function (a, b, d) {
-            d != Dd && c(a, b, d)
-        } : c)
-    }
-
-    function Nd(a) {
-        for (var c, d, e, f, b = a.split(/-(?!$)/), a = b[b.length - 1], g = 0; g < b.length - 1; g++) {
-            var h = b[g];
-            if (/^(cmd|meta|m)$/i.test(h)) f = !0;
-            else if (/^a(lt)?$/i.test(h)) c = !0;
-            else if (/^(c|ctrl|control)$/i.test(h)) d = !0;
-            else {
-                if (!/^s(hift)$/i.test(h)) throw new Error("Unrecognized modifier name: " + h);
-                e = !0
-            }
-        }
-        return c && (a = "Alt-" + a), d && (a = "Ctrl-" + a), f && (a = "Cmd-" + a), e && (a = "Shift-" + a), a
-    }
-
-    function Rd(a) {
-        return "string" == typeof a ? Md[a] : a
-    }
-
-    function Vd(a, b, c, d, e) {
-        if (d && d.shared) return Xd(a, b, c, d, e);
-        if (a.cm && !a.cm.curOp) return dc(a.cm, Vd)(a, b, c, d, e);
-        var f = new Ud(a, e),
-            g = pa(b, c);
-        if (d && hg(d, f, !1), g > 0 || 0 == g && f.clearWhenEmpty !== !1) return f;
-        if (f.replacedWith && (f.collapsed = !0, f.widgetNode = pg("span", [f.replacedWith], "CodeMirror-widget"), d.handleMouseEvents || f.widgetNode.setAttribute("cm-ignore-events", "true"), d.insertLeft && (f.widgetNode.insertLeft = !0)), f.collapsed) {
-            if (re(a, b.line, b, c, f) || b.line != c.line && re(a, c.line, b, c, f)) throw new Error("Inserting collapsed marker partially overlapping an existing one");
-            u = !0
-        }
-        f.addToHistory && sf(a, {
-            from: b,
-            to: c,
-            origin: "markText"
-        }, a.sel, NaN);
-        var j, h = b.line,
-            i = a.cm;
-        if (a.iter(h, c.line + 1, function (a) {
-                i && f.collapsed && !i.options.lineWrapping && se(a) == i.display.maxLine && (j = !0), f.collapsed && h != b.line && jf(a, 0), ce(a, new _d(f, h == b.line ? b.ch : null, h == c.line ? c.ch : null)), ++h
-            }), f.collapsed && a.iter(b.line, c.line + 1, function (b) {
-                we(a, b) && jf(b, 0)
-            }), f.clearOnEnter && Jf(f, "beforeCursorEnter", function () {
-                f.clear()
-            }), f.readOnly && (t = !0, (a.history.done.length || a.history.undone.length) && a.clearHistory()), f.collapsed && (f.id = ++Td, f.atomic = !0), i) {
-            if (j && (i.curOp.updateMaxLine = !0), f.collapsed) ic(i, b.line, c.line + 1);
-            else if (f.className || f.title || f.startStyle || f.endStyle || f.css)
-                for (var k = b.line; k <= c.line; k++) jc(i, k, "text");
-            f.atomic && ab(i.doc), Nf(i, "markerAdded", i, f)
-        }
-        return f
-    }
-
-    function Xd(a, b, c, d, e) {
-        d = hg(d), d.shared = !1;
-        var f = [Vd(a, b, c, d, e)],
-            g = f[0],
-            h = d.widgetNode;
-        return df(a, function (a) {
-            h && (d.widgetNode = h.cloneNode(!0)), f.push(Vd(a, Oa(a, b), Oa(a, c), d, e));
-            for (var i = 0; i < a.linked.length; ++i)
-                if (a.linked[i].isParent) return;
-            g = bg(f)
-        }), new Wd(f, g)
-    }
-
-    function Yd(a) {
-        return a.findMarks(oa(a.first, 0), a.clipPos(oa(a.lastLine())), function (a) {
-            return a.parent
-        })
-    }
-
-    function Zd(a, b) {
-        for (var c = 0; c < b.length; c++) {
-            var d = b[c],
-                e = d.find(),
-                f = a.clipPos(e.from),
-                g = a.clipPos(e.to);
-            if (pa(f, g)) {
-                var h = Vd(a, f, g, d.primary, d.primary.type);
-                d.markers.push(h), h.parent = d
-            }
-        }
-    }
-
-    function $d(a) {
-        for (var b = 0; b < a.length; b++) {
-            var c = a[b],
-                d = [c.primary.doc];
-            df(c.primary.doc, function (a) {
-                d.push(a)
-            });
-            for (var e = 0; e < c.markers.length; e++) {
-                var f = c.markers[e]; - 1 == dg(d, f.doc) && (f.parent = null, c.markers.splice(e--, 1))
-            }
-        }
-    }
-
-    function _d(a, b, c) {
-        this.marker = a, this.from = b, this.to = c
-    }
-
-    function ae(a, b) {
-        if (a)
-            for (var c = 0; c < a.length; ++c) {
-                var d = a[c];
-                if (d.marker == b) return d
-            }
-    }
-
-    function be(a, b) {
-        for (var c, d = 0; d < a.length; ++d) a[d] != b && (c || (c = []))
-            .push(a[d]);
-        return c
-    }
-
-    function ce(a, b) {
-        a.markedSpans = a.markedSpans ? a.markedSpans.concat([b]) : [b], b.marker.attachLine(a)
-    }
-
-    function de(a, b, c) {
-        if (a)
-            for (var e, d = 0; d < a.length; ++d) {
-                var f = a[d],
-                    g = f.marker,
-                    h = null == f.from || (g.inclusiveLeft ? f.from <= b : f.from < b);
-                if (h || f.from == b && "bookmark" == g.type && (!c || !f.marker.insertLeft)) {
-                    var i = null == f.to || (g.inclusiveRight ? f.to >= b : f.to > b);
-                    (e || (e = []))
-                    .push(new _d(g, f.from, i ? null : f.to))
-                }
-            }
-        return e
-    }
-
-    function ee(a, b, c) {
-        if (a)
-            for (var e, d = 0; d < a.length; ++d) {
-                var f = a[d],
-                    g = f.marker,
-                    h = null == f.to || (g.inclusiveRight ? f.to >= b : f.to > b);
-                if (h || f.from == b && "bookmark" == g.type && (!c || f.marker.insertLeft)) {
-                    var i = null == f.from || (g.inclusiveLeft ? f.from <= b : f.from < b);
-                    (e || (e = []))
-                    .push(new _d(g, i ? null : f.from - b, null == f.to ? null : f.to - b))
-                }
-            }
-        return e
-    }
-
-    function fe(a, b) {
-        if (b.full) return null;
-        var c = Qa(a, b.from.line) && ff(a, b.from.line)
-            .markedSpans,
-            d = Qa(a, b.to.line) && ff(a, b.to.line)
-            .markedSpans;
-        if (!c && !d) return null;
-        var e = b.from.ch,
-            f = b.to.ch,
-            g = 0 == pa(b.from, b.to),
-            h = de(c, e, g),
-            i = ee(d, f, g),
-            j = 1 == b.text.length,
-            k = bg(b.text)
-            .length + (j ? e : 0);
-        if (h)
-            for (var l = 0; l < h.length; ++l) {
-                var m = h[l];
-                if (null == m.to) {
-                    var n = ae(i, m.marker);
-                    n ? j && (m.to = null == n.to ? null : n.to + k) : m.to = e
-                }
-            }
-        if (i)
-            for (var l = 0; l < i.length; ++l) {
-                var m = i[l];
-                if (null != m.to && (m.to += k), null == m.from) {
-                    var n = ae(h, m.marker);
-                    n || (m.from = k, j && (h || (h = []))
-                        .push(m))
-                } else m.from += k, j && (h || (h = []))
-                    .push(m)
-            }
-        h && (h = ge(h)), i && i != h && (i = ge(i));
-        var o = [h];
-        if (!j) {
-            var q, p = b.text.length - 2;
-            if (p > 0 && h)
-                for (var l = 0; l < h.length; ++l) null == h[l].to && (q || (q = []))
-                    .push(new _d(h[l].marker, null, null));
-            for (var l = 0; p > l; ++l) o.push(q);
-            o.push(i)
-        }
-        return o
-    }
-
-    function ge(a) {
-        for (var b = 0; b < a.length; ++b) {
-            var c = a[b];
-            null != c.from && c.from == c.to && c.marker.clearWhenEmpty !== !1 && a.splice(b--, 1)
-        }
-        return a.length ? a : null
-    }
-
-    function he(a, b) {
-        var c = yf(a, b),
-            d = fe(a, b);
-        if (!c) return d;
-        if (!d) return c;
-        for (var e = 0; e < c.length; ++e) {
-            var f = c[e],
-                g = d[e];
-            if (f && g) a: for (var h = 0; h < g.length; ++h) {
-                for (var i = g[h], j = 0; j < f.length; ++j)
-                    if (f[j].marker == i.marker) continue a;
-                f.push(i)
-            } else g && (c[e] = g)
-        }
-        return c
-    }
-
-    function ie(a, b, c) {
-        var d = null;
-        if (a.iter(b.line, c.line + 1, function (a) {
-                if (a.markedSpans)
-                    for (var b = 0; b < a.markedSpans.length; ++b) {
-                        var c = a.markedSpans[b].marker;
-                        !c.readOnly || d && -1 != dg(d, c) || (d || (d = []))
-                            .push(c)
-                    }
-            }), !d) return null;
-        for (var e = [{
-                from: b,
-                to: c
-            }], f = 0; f < d.length; ++f)
-            for (var g = d[f], h = g.find(0), i = 0; i < e.length; ++i) {
-                var j = e[i];
-                if (!(pa(j.to, h.from) < 0 || pa(j.from, h.to) > 0)) {
-                    var k = [i, 1],
-                        l = pa(j.from, h.from),
-                        m = pa(j.to, h.to);
-                    (0 > l || !g.inclusiveLeft && !l) && k.push({
-                        from: j.from,
-                        to: h.from
-                    }), (m > 0 || !g.inclusiveRight && !m) && k.push({
-                        from: h.to,
-                        to: j.to
-                    }), e.splice.apply(e, k), i += k.length - 1
-                }
-            }
-        return e
-    }
-
-    function je(a) {
-        var b = a.markedSpans;
-        if (b) {
-            for (var c = 0; c < b.length; ++c) b[c].marker.detachLine(a);
-            a.markedSpans = null
-        }
-    }
-
-    function ke(a, b) {
-        if (b) {
-            for (var c = 0; c < b.length; ++c) b[c].marker.attachLine(a);
-            a.markedSpans = b
-        }
-    }
-
-    function le(a) {
-        return a.inclusiveLeft ? -1 : 0
-    }
-
-    function me(a) {
-        return a.inclusiveRight ? 1 : 0
-    }
-
-    function ne(a, b) {
-        var c = a.lines.length - b.lines.length;
-        if (0 != c) return c;
-        var d = a.find(),
-            e = b.find(),
-            f = pa(d.from, e.from) || le(a) - le(b);
-        if (f) return -f;
-        var g = pa(d.to, e.to) || me(a) - me(b);
-        return g ? g : b.id - a.id
-    }
-
-    function oe(a, b) {
-        var d, c = u && a.markedSpans;
-        if (c)
-            for (var e, f = 0; f < c.length; ++f) e = c[f], e.marker.collapsed && null == (b ? e.from : e.to) && (!d || ne(d, e.marker) < 0) && (d = e.marker);
-        return d
-    }
-
-    function pe(a) {
-        return oe(a, !0)
-    }
-
-    function qe(a) {
-        return oe(a, !1)
-    }
-
-    function re(a, b, c, d, e) {
-        var f = ff(a, b),
-            g = u && f.markedSpans;
-        if (g)
-            for (var h = 0; h < g.length; ++h) {
-                var i = g[h];
-                if (i.marker.collapsed) {
-                    var j = i.marker.find(0),
-                        k = pa(j.from, c) || le(i.marker) - le(e),
-                        l = pa(j.to, d) || me(i.marker) - me(e);
-                    if (!(k >= 0 && 0 >= l || 0 >= k && l >= 0) && (0 >= k && (pa(j.to, c) > 0 || i.marker.inclusiveRight && e.inclusiveLeft) || k >= 0 && (pa(j.from, d) < 0 || i.marker.inclusiveLeft && e.inclusiveRight))) return !0
-                }
-            }
-    }
-
-    function se(a) {
-        for (var b; b = pe(a);) a = b.find(-1, !0)
-            .line;
-        return a
-    }
-
-    function te(a) {
-        for (var b, c; b = qe(a);) a = b.find(1, !0)
-            .line, (c || (c = []))
-            .push(a);
-        return c
-    }
-
-    function ue(a, b) {
-        var c = ff(a, b),
-            d = se(c);
-        return c == d ? b : kf(d)
-    }
-
-    function ve(a, b) {
-        if (b > a.lastLine()) return b;
-        var d, c = ff(a, b);
-        if (!we(a, c)) return b;
-        for (; d = qe(c);) c = d.find(1, !0)
-            .line;
-        return kf(c) + 1
-    }
-
-    function we(a, b) {
-        var c = u && b.markedSpans;
-        if (c)
-            for (var d, e = 0; e < c.length; ++e)
-                if (d = c[e], d.marker.collapsed) {
-                    if (null == d.from) return !0;
-                    if (!d.marker.widgetNode && 0 == d.from && d.marker.inclusiveLeft && xe(a, b, d)) return !0
-                }
-    }
-
-    function xe(a, b, c) {
-        if (null == c.to) {
-            var d = c.marker.find(1, !0);
-            return xe(a, d.line, ae(d.line.markedSpans, c.marker))
-        }
-        if (c.marker.inclusiveRight && c.to == b.text.length) return !0;
-        for (var e, f = 0; f < b.markedSpans.length; ++f)
-            if (e = b.markedSpans[f], e.marker.collapsed && !e.marker.widgetNode && e.from == c.to && (null == e.to || e.to != c.from) && (e.marker.inclusiveLeft || c.marker.inclusiveRight) && xe(a, b, e)) return !0
-    }
-
-    function ze(a, b, c) {
-        mf(b) < (a.curOp && a.curOp.scrollTop || a.doc.scrollTop) && sd(a, null, c)
-    }
-
-    function Ae(a) {
-        if (null != a.height) return a.height;
-        var b = a.doc.cm;
-        if (!b) return 0;
-        if (!tg(document.body, a.node)) {
-            var c = "position: relative;";
-            a.coverGutter && (c += "margin-left: -" + b.display.gutters.offsetWidth + "px;"), a.noHScroll && (c += "width: " + b.display.wrapper.clientWidth + "px;"), sg(b.display.measure, pg("div", [a.node], null, c))
-        }
-        return a.height = a.node.offsetHeight
-    }
-
-    function Be(a, b, c, d) {
-        var e = new ye(a, c, d),
-            f = a.cm;
-        return f && e.noHScroll && (f.display.alignWidgets = !0), wd(a, b, "widget", function (b) {
-            var c = b.widgets || (b.widgets = []);
-            if (null == e.insertAt ? c.push(e) : c.splice(Math.min(c.length - 1, Math.max(0, e.insertAt)), 0, e), e.line = b, f && !we(a, b)) {
-                var d = mf(b) < a.scrollTop;
-                jf(b, b.height + Ae(e)), d && sd(f, null, e.height), f.curOp.forceUpdate = !0
-            }
-            return !0
-        }), e
-    }
-
-    function De(a, b, c, d) {
-        a.text = b, a.stateAfter && (a.stateAfter = null), a.styles && (a.styles = null), null != a.order && (a.order = null), je(a), ke(a, c);
-        var e = d ? d(a) : 1;
-        e != a.height && jf(a, e)
-    }
-
-    function Ee(a) {
-        a.parent = null, je(a)
-    }
-
-    function Fe(a, b) {
-        if (a)
-            for (;;) {
-                var c = a.match(/(?:^|\s+)line-(background-)?(\S+)/);
-                if (!c) break;
-                a = a.slice(0, c.index) + a.slice(c.index + c[0].length);
-                var d = c[1] ? "bgClass" : "textClass";
-                null == b[d] ? b[d] = c[2] : new RegExp("(?:^|s)" + c[2] + "(?:$|s)")
-                    .test(b[d]) || (b[d] += " " + c[2])
-            }
-        return a
-    }
-
-    function Ge(a, b) {
-        if (a.blankLine) return a.blankLine(b);
-        if (a.innerMode) {
-            var c = v.innerMode(a, b);
-            return c.mode.blankLine ? c.mode.blankLine(c.state) : void 0
-        }
-    }
-
-    function He(a, b, c, d) {
-        for (var e = 0; 10 > e; e++) {
-            d && (d[0] = v.innerMode(a, c)
-                .mode);
-            var f = a.token(b, c);
-            if (b.pos > b.start) return f
-        }
-        throw new Error("Mode " + a.name + " failed to advance stream.")
-    }
-
-    function Ie(a, b, c, d) {
-        function e(a) {
-            return {
-                start: k.start,
-                end: k.pos,
-                string: k.current(),
-                type: h || null,
-                state: a ? Jd(f.mode, j) : j
-            }
-        }
-        var h, f = a.doc,
-            g = f.mode;
-        b = Oa(f, b);
-        var l, i = ff(f, b.line),
-            j = lb(a, b.line, c),
-            k = new Sd(i.text, a.options.tabSize);
-        for (d && (l = []);
-            (d || k.pos < b.ch) && !k.eol();) k.start = k.pos, h = He(g, k, j), d && l.push(e(!0));
-        return d ? l : e()
-    }
-
-    function Je(a, b, c, d, e, f, g) {
-        var h = c.flattenSpans;
-        null == h && (h = a.options.flattenSpans);
-        var l, i = 0,
-            j = null,
-            k = new Sd(b, a.options.tabSize),
-            m = a.options.addModeClass && [null];
-        for ("" == b && Fe(Ge(c, d), f); !k.eol();) {
-            if (k.pos > a.options.maxHighlightLength ? (h = !1, g && Me(a, b, d, k.pos), k.pos = b.length, l = null) : l = Fe(He(c, k, d, m), f), m) {
-                var n = m[0].name;
-                n && (l = "m-" + (l ? n + " " + l : n))
-            }
-            if (!h || j != l) {
-                for (; i < k.start;) i = Math.min(k.start, i + 5e4), e(i, j);
-                j = l
-            }
-            k.start = k.pos
-        }
-        for (; i < k.pos;) {
-            var o = Math.min(k.pos, i + 5e4);
-            e(o, j), i = o
-        }
-    }
-
-    function Ke(a, b, c, d) {
-        var e = [a.state.modeGen],
-            f = {};
-        Je(a, b.text, a.doc.mode, c, function (a, b) {
-            e.push(a, b)
-        }, f, d);
-        for (var g = 0; g < a.state.overlays.length; ++g) {
-            var h = a.state.overlays[g],
-                i = 1,
-                j = 0;
-            Je(a, b.text, h.mode, !0, function (a, b) {
-                for (var c = i; a > j;) {
-                    var d = e[i];
-                    d > a && e.splice(i, 1, a, e[i + 1], d), i += 2, j = Math.min(a, d)
-                }
-                if (b)
-                    if (h.opaque) e.splice(c, i - c, a, "cm-overlay " + b), i = c + 2;
-                    else
-                        for (; i > c; c += 2) {
-                            var f = e[c + 1];
-                            e[c + 1] = (f ? f + " " : "") + "cm-overlay " + b
-                        }
-            }, f)
-        }
-        return {
-            styles: e,
-            classes: f.bgClass || f.textClass ? f : null
-        }
-    }
-
-    function Le(a, b, c) {
-        if (!b.styles || b.styles[0] != a.state.modeGen) {
-            var d = lb(a, kf(b)),
-                e = Ke(a, b, b.text.length > a.options.maxHighlightLength ? Jd(a.doc.mode, d) : d);
-            b.stateAfter = d, b.styles = e.styles, e.classes ? b.styleClasses = e.classes : b.styleClasses && (b.styleClasses = null), c === a.doc.frontier && a.doc.frontier++
-        }
-        return b.styles
-    }
-
-    function Me(a, b, c, d) {
-        var e = a.doc.mode,
-            f = new Sd(b, a.options.tabSize);
-        for (f.start = f.pos = d || 0, "" == b && Ge(e, c); !f.eol();) He(e, f, c), f.start = f.pos
-    }
-
-    function Pe(a, b) {
-        if (!a || /^\s*$/.test(a)) return null;
-        var c = b.addModeClass ? Oe : Ne;
-        return c[a] || (c[a] = a.replace(/\S+/g, "cm-$&"))
-    }
-
-    function Qe(a, b) {
-        var c = pg("span", null, null, f ? "padding-right: .1px" : null),
-            e = {
-                pre: pg("pre", [c], "CodeMirror-line"),
-                content: c,
-                col: 0,
-                pos: 0,
-                cm: a,
-                splitSpaces: (d || f) && a.getOption("lineWrapping")
-            };
-        b.measure = {};
-        for (var g = 0; g <= (b.rest ? b.rest.length : 0); g++) {
-            var i, h = g ? b.rest[g - 1] : b.line;
-            e.pos = 0, e.addToken = Se, Hg(a.display.measure) && (i = nf(h)) && (e.addToken = Ue(e.addToken, i)), e.map = [];
-            var j = b != a.display.externalMeasured && kf(h);
-            We(h, e, Le(a, h, j)), h.styleClasses && (h.styleClasses.bgClass && (e.bgClass = yg(h.styleClasses.bgClass, e.bgClass || "")), h.styleClasses.textClass && (e.textClass = yg(h.styleClasses.textClass, e.textClass || ""))), 0 == e.map.length && e.map.push(0, 0, e.content.appendChild(Fg(a.display.measure))), 0 == g ? (b.measure.map = e.map, b.measure.cache = {}) : ((b.measure.maps || (b.measure.maps = []))
-                .push(e.map), (b.measure.caches || (b.measure.caches = []))
-                .push({}))
-        }
-        return f && /\bcm-tab\b/.test(e.content.lastChild.className) && (e.content.className = "cm-tab-wrap-hack"), Lf(a, "renderLine", a, b.line, e.pre), e.pre.className && (e.textClass = yg(e.pre.className, e.textClass || "")), e
-    }
-
-    function Re(a) {
-        var b = pg("span", "\u2022", "cm-invalidchar");
-        return b.title = "\\u" + a.charCodeAt(0)
-            .toString(16), b.setAttribute("aria-label", b.title), b
-    }
-
-    function Se(a, b, c, f, g, h, i) {
-        if (b) {
-            var j = a.splitSpaces ? b.replace(/ {3,}/g, Te) : b,
-                k = a.cm.state.specialChars,
-                l = !1;
-            if (k.test(b))
-                for (var m = document.createDocumentFragment(), n = 0;;) {
-                    k.lastIndex = n;
-                    var o = k.exec(b),
-                        p = o ? o.index - n : b.length - n;
-                    if (p) {
-                        var q = document.createTextNode(j.slice(n, n + p));
-                        d && 9 > e ? m.appendChild(pg("span", [q])) : m.appendChild(q), a.map.push(a.pos, a.pos + p, q), a.col += p, a.pos += p
-                    }
-                    if (!o) break;
-                    if (n += p + 1, "	" == o[0]) {
-                        var r = a.cm.options.tabSize,
-                            s = r - a.col % r,
-                            q = m.appendChild(pg("span", ag(s), "cm-tab"));
-                        q.setAttribute("role", "presentation"), q.setAttribute("cm-text", "	"), a.col += s
-                    } else if ("\r" == o[0] || "\n" == o[0]) {
-                        var q = m.appendChild(pg("span", "\r" == o[0] ? "\u240d" : "\u2424", "cm-invalidchar"));
-                        q.setAttribute("cm-text", o[0]), a.col += 1
-                    } else {
-                        var q = a.cm.options.specialCharPlaceholder(o[0]);
-                        q.setAttribute("cm-text", o[0]), d && 9 > e ? m.appendChild(pg("span", [q])) : m.appendChild(q), a.col += 1
-                    }
-                    a.map.push(a.pos, a.pos + 1, q), a.pos++
-                } else {
-                    a.col += b.length;
-                    var m = document.createTextNode(j);
-                    a.map.push(a.pos, a.pos + b.length, m), d && 9 > e && (l = !0), a.pos += b.length
-                }
-            if (c || f || g || l || i) {
-                var t = c || "";
-                f && (t += f), g && (t += g);
-                var u = pg("span", [m], t, i);
-                return h && (u.title = h), a.content.appendChild(u)
-            }
-            a.content.appendChild(m)
-        }
-    }
-
-    function Te(a) {
-        for (var b = " ", c = 0; c < a.length - 2; ++c) b += c % 2 ? " " : "\xa0";
-        return b += " "
-    }
-
-    function Ue(a, b) {
-        return function (c, d, e, f, g, h, i) {
-            e = e ? e + " cm-force-border" : "cm-force-border";
-            for (var j = c.pos, k = j + d.length;;) {
-                for (var l = 0; l < b.length; l++) {
-                    var m = b[l];
-                    if (m.to > j && m.from <= j) break
-                }
-                if (m.to >= k) return a(c, d, e, f, g, h, i);
-                a(c, d.slice(0, m.to - j), e, f, null, h, i), f = null, d = d.slice(m.to - j), j = m.to
-            }
-        }
-    }
-
-    function Ve(a, b, c, d) {
-        var e = !d && c.widgetNode;
-        e && a.map.push(a.pos, a.pos + b, e), !d && a.cm.display.input.needsContentAttribute && (e || (e = a.content.appendChild(document.createElement("span"))), e.setAttribute("cm-marker", c.id)), e && (a.cm.display.input.setUneditable(e), a.content.appendChild(e)), a.pos += b
-    }
-
-    function We(a, b, c) {
-        var d = a.markedSpans,
-            e = a.text,
-            f = 0;
-        if (d)
-            for (var k, l, n, o, p, q, r, h = e.length, i = 0, g = 1, j = "", m = 0;;) {
-                if (m == i) {
-                    n = o = p = q = l = "", r = null, m = 1 / 0;
-                    for (var s = [], t = 0; t < d.length; ++t) {
-                        var u = d[t],
-                            v = u.marker;
-                        "bookmark" == v.type && u.from == i && v.widgetNode ? s.push(v) : u.from <= i && (null == u.to || u.to > i || v.collapsed && u.to == i && u.from == i) ? (null != u.to && u.to != i && m > u.to && (m = u.to, o = ""), v.className && (n += " " + v.className), v.css && (l = v.css), v.startStyle && u.from == i && (p += " " + v.startStyle), v.endStyle && u.to == m && (o += " " + v.endStyle), v.title && !q && (q = v.title), v.collapsed && (!r || ne(r.marker, v) < 0) && (r = u)) : u.from > i && m > u.from && (m = u.from)
-                    }
-                    if (r && (r.from || 0) == i) {
-                        if (Ve(b, (null == r.to ? h + 1 : r.to) - i, r.marker, null == r.from), null == r.to) return;
-                        r.to == i && (r = !1)
-                    }
-                    if (!r && s.length)
-                        for (var t = 0; t < s.length; ++t) Ve(b, 0, s[t])
-                }
-                if (i >= h) break;
-                for (var w = Math.min(h, m);;) {
-                    if (j) {
-                        var x = i + j.length;
-                        if (!r) {
-                            var y = x > w ? j.slice(0, w - i) : j;
-                            b.addToken(b, y, k ? k + n : n, p, i + y.length == m ? o : "", q, l)
-                        }
-                        if (x >= w) {
-                            j = j.slice(w - i), i = w;
-                            break
-                        }
-                        i = x, p = ""
-                    }
-                    j = e.slice(f, f = c[g++]), k = Pe(c[g++], b.cm.options)
-                }
-            } else
-                for (var g = 1; g < c.length; g += 2) b.addToken(b, e.slice(f, f = c[g]), Pe(c[g + 1], b.cm.options))
-    }
-
-    function Xe(a, b) {
-        return 0 == b.from.ch && 0 == b.to.ch && "" == bg(b.text) && (!a.cm || a.cm.options.wholeLineUpdateBefore)
-    }
-
-    function Ye(a, b, c, d) {
-        function e(a) {
-            return c ? c[a] : null
-        }
-
-        function f(a, c, e) {
-            De(a, c, e, d), Nf(a, "change", a, b)
-        }
-
-        function g(a, b) {
-            for (var c = a, f = []; b > c; ++c) f.push(new Ce(j[c], e(c), d));
-            return f
-        }
-        var h = b.from,
-            i = b.to,
-            j = b.text,
-            k = ff(a, h.line),
-            l = ff(a, i.line),
-            m = bg(j),
-            n = e(j.length - 1),
-            o = i.line - h.line;
-        if (b.full) a.insert(0, g(0, j.length)), a.remove(j.length, a.size - j.length);
-        else if (Xe(a, b)) {
-            var p = g(0, j.length - 1);
-            f(l, l.text, n), o && a.remove(h.line, o), p.length && a.insert(h.line, p)
-        } else if (k == l)
-            if (1 == j.length) f(k, k.text.slice(0, h.ch) + m + k.text.slice(i.ch), n);
-            else {
-                var p = g(1, j.length - 1);
-                p.push(new Ce(m + k.text.slice(i.ch), n, d)), f(k, k.text.slice(0, h.ch) + j[0], e(0)), a.insert(h.line + 1, p)
-            } else if (1 == j.length) f(k, k.text.slice(0, h.ch) + j[0] + l.text.slice(i.ch), e(0)), a.remove(h.line + 1, o);
-        else {
-            f(k, k.text.slice(0, h.ch) + j[0], e(0)), f(l, m + l.text.slice(i.ch), n);
-            var p = g(1, j.length - 1);
-            o > 1 && a.remove(h.line + 1, o - 1), a.insert(h.line + 1, p)
-        }
-        Nf(a, "change", a, b)
-    }
-
-    function Ze(a) {
-        this.lines = a, this.parent = null;
-        for (var b = 0, c = 0; b < a.length; ++b) a[b].parent = this, c += a[b].height;
-        this.height = c
-    }
-
-    function $e(a) {
-        this.children = a;
-        for (var b = 0, c = 0, d = 0; d < a.length; ++d) {
-            var e = a[d];
-            b += e.chunkSize(), c += e.height, e.parent = this
-        }
-        this.size = b, this.height = c, this.parent = null
-    }
-
-    function df(a, b, c) {
-        function d(a, e, f) {
-            if (a.linked)
-                for (var g = 0; g < a.linked.length; ++g) {
-                    var h = a.linked[g];
-                    if (h.doc != e) {
-                        var i = f && h.sharedHist;
-                        (!c || i) && (b(h.doc, i), d(h.doc, a, i))
-                    }
-                }
-        }
-        d(a, null, !0)
-    }
-
-    function ef(a, b) {
-        if (b.cm) throw new Error("This document is already in use.");
-        a.doc = b, b.cm = a, B(a), x(a), a.options.lineWrapping || H(a), a.options.mode = b.modeOption, ic(a)
-    }
-
-    function ff(a, b) {
-        if (b -= a.first, 0 > b || b >= a.size) throw new Error("There is no line " + (b + a.first) + " in the document.");
-        for (var c = a; !c.lines;)
-            for (var d = 0;; ++d) {
-                var e = c.children[d],
-                    f = e.chunkSize();
-                if (f > b) {
-                    c = e;
-                    break
-                }
-                b -= f
-            }
-        return c.lines[b]
-    }
-
-    function gf(a, b, c) {
-        var d = [],
-            e = b.line;
-        return a.iter(b.line, c.line + 1, function (a) {
-            var f = a.text;
-            e == c.line && (f = f.slice(0, c.ch)), e == b.line && (f = f.slice(b.ch)), d.push(f), ++e
-        }), d
-    }
-
-    function hf(a, b, c) {
-        var d = [];
-        return a.iter(b, c, function (a) {
-            d.push(a.text)
-        }), d
-    }
-
-    function jf(a, b) {
-        var c = b - a.height;
-        if (c)
-            for (var d = a; d; d = d.parent) d.height += c
-    }
-
-    function kf(a) {
-        if (null == a.parent) return null;
-        for (var b = a.parent, c = dg(b.lines, a), d = b.parent; d; b = d, d = d.parent)
-            for (var e = 0; d.children[e] != b; ++e) c += d.children[e].chunkSize();
-        return c + b.first
-    }
-
-    function lf(a, b) {
-        var c = a.first;
-        a: do {
-            for (var d = 0; d < a.children.length; ++d) {
-                var e = a.children[d],
-                    f = e.height;
-                if (f > b) {
-                    a = e;
-                    continue a
-                }
-                b -= f, c += e.chunkSize()
-            }
-            return c
-        } while (!a.lines);
-        for (var d = 0; d < a.lines.length; ++d) {
-            var g = a.lines[d],
-                h = g.height;
-            if (h > b) break;
-            b -= h
-        }
-        return c + d
-    }
-
-    function mf(a) {
-        a = se(a);
-        for (var b = 0, c = a.parent, d = 0; d < c.lines.length; ++d) {
-            var e = c.lines[d];
-            if (e == a) break;
-            b += e.height
-        }
-        for (var f = c.parent; f; c = f, f = c.parent)
-            for (var d = 0; d < f.children.length; ++d) {
-                var g = f.children[d];
-                if (g == c) break;
-                b += g.height
-            }
-        return b
-    }
-
-    function nf(a) {
-        var b = a.order;
-        return null == b && (b = a.order = ah(a.text)), b
-    }
-
-    function of(a) {
-        this.done = [], this.undone = [], this.undoDepth = 1 / 0, this.lastModTime = this.lastSelTime = 0, this.lastOp = this.lastSelOp = null, this.lastOrigin = this.lastSelOrigin = null, this.generation = this.maxGeneration = a || 1
-    }
-
-    function pf(a, b) {
-        var c = {
-            from: qa(b.from),
-            to: bd(b),
-            text: gf(a, b.from, b.to)
-        };
-        return wf(a, c, b.from.line, b.to.line + 1), df(a, function (a) {
-            wf(a, c, b.from.line, b.to.line + 1)
-        }, !0), c
-    }
-
-    function qf(a) {
-        for (; a.length;) {
-            var b = bg(a);
-            if (!b.ranges) break;
-            a.pop()
-        }
-    }
-
-    function rf(a, b) {
-        return b ? (qf(a.done), bg(a.done)) : a.done.length && !bg(a.done)
-            .ranges ? bg(a.done) : a.done.length > 1 && !a.done[a.done.length - 2].ranges ? (a.done.pop(), bg(a.done)) : void 0
-    }
-
-    function sf(a, b, c, d) {
-        var e = a.history;
-        e.undone.length = 0;
-        var g, f = +new Date;
-        if ((e.lastOp == d || e.lastOrigin == b.origin && b.origin && ("+" == b.origin.charAt(0) && a.cm && e.lastModTime > f - a.cm.options.historyEventDelay || "*" == b.origin.charAt(0))) && (g = rf(e, e.lastOp == d))) {
-            var h = bg(g.changes);
-            0 == pa(b.from, b.to) && 0 == pa(b.from, h.to) ? h.to = bd(b) : g.changes.push(pf(a, b))
-        } else {
-            var i = bg(e.done);
-            for (i && i.ranges || vf(a.sel, e.done), g = {
-                    changes: [pf(a, b)],
-                    generation: e.generation
-                }, e.done.push(g); e.done.length > e.undoDepth;) e.done.shift(), e.done[0].ranges || e.done.shift()
-        }
-        e.done.push(c), e.generation = ++e.maxGeneration, e.lastModTime = e.lastSelTime = f, e.lastOp = e.lastSelOp = d, e.lastOrigin = e.lastSelOrigin = b.origin, h || Lf(a, "historyAdded")
-    }
-
-    function tf(a, b, c, d) {
-        var e = b.charAt(0);
-        return "*" == e || "+" == e && c.ranges.length == d.ranges.length && c.somethingSelected() == d.somethingSelected() && new Date - a.history.lastSelTime <= (a.cm ? a.cm.options.historyEventDelay : 500)
-    }
-
-    function uf(a, b, c, d) {
-        var e = a.history,
-            f = d && d.origin;
-        c == e.lastSelOp || f && e.lastSelOrigin == f && (e.lastModTime == e.lastSelTime && e.lastOrigin == f || tf(a, f, bg(e.done), b)) ? e.done[e.done.length - 1] = b : vf(b, e.done), e.lastSelTime = +new Date, e.lastSelOrigin = f, e.lastSelOp = c, d && d.clearRedo !== !1 && qf(e.undone)
-    }
-
-    function vf(a, b) {
-        var c = bg(b);
-        c && c.ranges && c.equals(a) || b.push(a)
-    }
-
-    function wf(a, b, c, d) {
-        var e = b["spans_" + a.id],
-            f = 0;
-        a.iter(Math.max(a.first, c), Math.min(a.first + a.size, d), function (c) {
-            c.markedSpans && ((e || (e = b["spans_" + a.id] = {}))[f] = c.markedSpans), ++f
-        })
-    }
-
-    function xf(a) {
-        if (!a) return null;
-        for (var c, b = 0; b < a.length; ++b) a[b].marker.explicitlyCleared ? c || (c = a.slice(0, b)) : c && c.push(a[b]);
-        return c ? c.length ? c : null : a
-    }
-
-    function yf(a, b) {
-        var c = b["spans_" + a.id];
-        if (!c) return null;
-        for (var d = 0, e = []; d < b.text.length; ++d) e.push(xf(c[d]));
-        return e
-    }
-
-    function zf(a, b, c) {
-        for (var d = 0, e = []; d < a.length; ++d) {
-            var f = a[d];
-            if (f.ranges) e.push(c ? Ja.prototype.deepCopy.call(f) : f);
-            else {
-                var g = f.changes,
-                    h = [];
-                e.push({
-                    changes: h
-                });
-                for (var i = 0; i < g.length; ++i) {
-                    var k, j = g[i];
-                    if (h.push({
-                            from: j.from,
-                            to: j.to,
-                            text: j.text
-                        }), b)
-                        for (var l in j)(k = l.match(/^spans_(\d+)$/)) && dg(b, Number(k[1])) > -1 && (bg(h)[l] = j[l], delete j[l])
-                }
-            }
-        }
-        return e
-    }
-
-    function Af(a, b, c, d) {
-        c < a.line ? a.line += d : b < a.line && (a.line = b, a.ch = 0)
-    }
-
-    function Bf(a, b, c, d) {
-        for (var e = 0; e < a.length; ++e) {
-            var f = a[e],
-                g = !0;
-            if (f.ranges) {
-                f.copied || (f = a[e] = f.deepCopy(), f.copied = !0);
-                for (var h = 0; h < f.ranges.length; h++) Af(f.ranges[h].anchor, b, c, d), Af(f.ranges[h].head, b, c, d)
-            } else {
-                for (var h = 0; h < f.changes.length; ++h) {
-                    var i = f.changes[h];
-                    if (c < i.from.line) i.from = oa(i.from.line + d, i.from.ch), i.to = oa(i.to.line + d, i.to.ch);
-                    else if (b <= i.to.line) {
-                        g = !1;
-                        break
-                    }
-                }
-                g || (a.splice(0, e + 1), e = 0)
-            }
-        }
-    }
-
-    function Cf(a, b) {
-        var c = b.from.line,
-            d = b.to.line,
-            e = b.text.length - (d - c) - 1;
-        Bf(a.done, c, d, e), Bf(a.undone, c, d, e)
-    }
-
-    function Ff(a) {
-        return null != a.defaultPrevented ? a.defaultPrevented : 0 == a.returnValue
-    }
-
-    function Hf(a) {
-        return a.target || a.srcElement
-    }
-
-    function If(a) {
-        var b = a.which;
-        return null == b && (1 & a.button ? b = 1 : 2 & a.button ? b = 3 : 4 & a.button && (b = 2)), o && a.ctrlKey && 1 == b && (b = 3), b
-    }
-
-    function Nf(a, b) {
-        function f(a) {
-            return function () {
-                a.apply(null, d)
-            }
-        }
-        var c = a._handlers && a._handlers[b];
-        if (c) {
-            var e, d = Array.prototype.slice.call(arguments, 2);
-            Tb ? e = Tb.delayedCallbacks : Mf ? e = Mf : (e = Mf = [], setTimeout(Of, 0));
-            for (var g = 0; g < c.length; ++g) e.push(f(c[g]))
-        }
-    }
-
-    function Of() {
-        var a = Mf;
-        Mf = null;
-        for (var b = 0; b < a.length; ++b) a[b]()
-    }
-
-    function Pf(a, b, c) {
-        return "string" == typeof b && (b = {
-            type: b,
-            preventDefault: function () {
-                this.defaultPrevented = !0
-            }
-        }), Lf(a, c || b.type, a, b), Ff(b) || b.codemirrorIgnore
-    }
-
-    function Qf(a) {
-        var b = a._handlers && a._handlers.cursorActivity;
-        if (b)
-            for (var c = a.curOp.cursorActivityHandlers || (a.curOp.cursorActivityHandlers = []), d = 0; d < b.length; ++d) - 1 == dg(c, b[d]) && c.push(b[d])
-    }
-
-    function Rf(a, b) {
-        var c = a._handlers && a._handlers[b];
-        return c && c.length > 0
-    }
-
-    function Sf(a) {
-        a.prototype.on = function (a, b) {
-            Jf(this, a, b)
-        }, a.prototype.off = function (a, b) {
-            Kf(this, a, b)
-        }
-    }
-
-    function Yf() {
-        this.id = null
-    }
-
-    function ag(a) {
-        for (; _f.length <= a;) _f.push(bg(_f) + " ");
-        return _f[a]
-    }
-
-    function bg(a) {
-        return a[a.length - 1]
-    }
-
-    function dg(a, b) {
-        for (var c = 0; c < a.length; ++c)
-            if (a[c] == b) return c;
-        return -1
-    }
-
-    function eg(a, b) {
-        for (var c = [], d = 0; d < a.length; d++) c[d] = b(a[d], d);
-        return c
-    }
-
-    function fg() {}
-
-    function gg(a, b) {
-        var c;
-        return Object.create ? c = Object.create(a) : (fg.prototype = a, c = new fg), b && hg(b, c), c
-    }
-
-    function hg(a, b, c) {
-        b || (b = {});
-        for (var d in a) !a.hasOwnProperty(d) || c === !1 && b.hasOwnProperty(d) || (b[d] = a[d]);
-        return b
-    }
-
-    function ig(a) {
-        var b = Array.prototype.slice.call(arguments, 1);
-        return function () {
-            return a.apply(null, b)
-        }
-    }
-
-    function lg(a, b) {
-        return b ? b.source.indexOf("\\w") > -1 && kg(a) ? !0 : b.test(a) : kg(a)
-    }
-
-    function mg(a) {
-        for (var b in a)
-            if (a.hasOwnProperty(b) && a[b]) return !1;
-        return !0
-    }
-
-    function og(a) {
-        return a.charCodeAt(0) >= 768 && ng.test(a)
-    }
-
-    function pg(a, b, c, d) {
-        var e = document.createElement(a);
-        if (c && (e.className = c), d && (e.style.cssText = d), "string" == typeof b) e.appendChild(document.createTextNode(b));
-        else if (b)
-            for (var f = 0; f < b.length; ++f) e.appendChild(b[f]);
-        return e
-    }
-
-    function rg(a) {
-        for (var b = a.childNodes.length; b > 0; --b) a.removeChild(a.firstChild);
-        return a
-    }
-
-    function sg(a, b) {
-        return rg(a)
-            .appendChild(b)
-    }
-
-    function ug() {
-        for (var a = document.activeElement; a && a.root && a.root.activeElement;) a = a.root.activeElement;
-        return a
-    }
-
-    function vg(a) {
-        return new RegExp("(^|\\s)" + a + "(?:$|\\s)\\s*")
-    }
-
-    function yg(a, b) {
-        for (var c = a.split(" "), d = 0; d < c.length; d++) c[d] && !vg(c[d])
-            .test(b) && (b += " " + c[d]);
-        return b
-    }
-
-    function zg(a) {
-        if (document.body.getElementsByClassName)
-            for (var b = document.body.getElementsByClassName("CodeMirror"), c = 0; c < b.length; c++) {
-                var d = b[c].CodeMirror;
-                d && a(d)
-            }
-    }
-
-    function Bg() {
-        Ag || (Cg(), Ag = !0)
-    }
-
-    function Cg() {
-        var a;
-        Jf(window, "resize", function () {
-            null == a && (a = setTimeout(function () {
-                a = null, zg(rc)
-            }, 100))
-        }), Jf(window, "blur", function () {
-            zg($c)
-        })
-    }
-
-    function Fg(a) {
-        if (null == Eg) {
-            var b = pg("span", "\u200b");
-            sg(a, pg("span", [b, document.createTextNode("x")])), 0 != a.firstChild.offsetHeight && (Eg = b.offsetWidth <= 1 && b.offsetHeight > 2 && !(d && 8 > e))
-        }
-        var c = Eg ? pg("span", "\u200b") : pg("span", "\xa0", null, "display: inline-block; width: 1px; margin-right: -1px");
-        return c.setAttribute("cm-text", ""), c
-    }
-
-    function Hg(a) {
-        if (oldff) return false;
-        if (null != Gg) return Gg;
-        var b = sg(a, document.createTextNode("A\u062eA")),
-            c = qg(b, 0, 1)
-            .getBoundingClientRect();
-        if (!c || c.left == c.right) return !1;
-        var d = qg(b, 1, 2)
-            .getBoundingClientRect();
-        return Gg = d.right - c.right < 3
-    }
-
-    function Mg(a) {
-        if (null != Lg) return Lg;
-        var b = sg(a, pg("span", "x")),
-            c = b.getBoundingClientRect(),
-            d = qg(b, 0, 1)
-            .getBoundingClientRect();
-        return Lg = Math.abs(c.left - d.left) > 1
-    }
-
-    function Og(a, b, c, d) {
-        if (!a) return d(b, c, "ltr");
-        for (var e = !1, f = 0; f < a.length; ++f) {
-            var g = a[f];
-            (g.from < c && g.to > b || b == c && g.to == b) && (d(Math.max(g.from, b), Math.min(g.to, c), 1 == g.level ? "rtl" : "ltr"), e = !0)
-        }
-        e || d(b, c, "ltr")
-    }
-
-    function Pg(a) {
-        return a.level % 2 ? a.to : a.from
-    }
-
-    function Qg(a) {
-        return a.level % 2 ? a.from : a.to
-    }
-
-    function Rg(a) {
-        var b = nf(a);
-        return b ? Pg(b[0]) : 0
-    }
-
-    function Sg(a) {
-        var b = nf(a);
-        return b ? Qg(bg(b)) : a.text.length
-    }
-
-    function Tg(a, b) {
-        var c = ff(a.doc, b),
-            d = se(c);
-        d != c && (b = kf(d));
-        var e = nf(d),
-            f = e ? e[0].level % 2 ? Sg(d) : Rg(d) : 0;
-        return oa(b, f)
-    }
-
-    function Ug(a, b) {
-        for (var c, d = ff(a.doc, b); c = qe(d);) d = c.find(1, !0)
-            .line, b = null;
-        var e = nf(d),
-            f = e ? e[0].level % 2 ? Rg(d) : Sg(d) : d.text.length;
-        return oa(null == b ? kf(d) : b, f)
-    }
-
-    function Vg(a, b) {
-        var c = Tg(a, b.line),
-            d = ff(a.doc, c.line),
-            e = nf(d);
-        if (!e || 0 == e[0].level) {
-            var f = Math.max(0, d.text.search(/\S/)),
-                g = b.line == c.line && b.ch <= f && b.ch;
-            return oa(c.line, g ? 0 : f)
-        }
-        return c
-    }
-
-    function Wg(a, b, c) {
-        var d = a[0].level;
-        return b == d ? !0 : c == d ? !1 : c > b
-    }
-
-    function Yg(a, b) {
-        Xg = null;
-        for (var d, c = 0; c < a.length; ++c) {
-            var e = a[c];
-            if (e.from < b && e.to > b) return c;
-            if (e.from == b || e.to == b) {
-                if (null != d) return Wg(a, e.level, a[d].level) ? (e.from != e.to && (Xg = d), c) : (e.from != e.to && (Xg = c), d);
-                d = c
-            }
-        }
-        return d
-    }
-
-    function Zg(a, b, c, d) {
-        if (!d) return b + c;
-        do b += c; while (b > 0 && og(a.text.charAt(b)));
-        return b
-    }
-
-    function $g(a, b, c, d) {
-        var e = nf(a);
-        if (!e) return _g(a, b, c, d);
-        for (var f = Yg(e, b), g = e[f], h = Zg(a, b, g.level % 2 ? -c : c, d);;) {
-            if (h > g.from && h < g.to) return h;
-            if (h == g.from || h == g.to) return Yg(e, h) == f ? h : (g = e[f += c], c > 0 == g.level % 2 ? g.to : g.from);
-            if (g = e[f += c], !g) return null;
-            h = c > 0 == g.level % 2 ? Zg(a, g.to, -1, d) : Zg(a, g.from, 1, d)
-        }
-    }
-
-    function _g(a, b, c, d) {
-        var e = b + c;
-        if (d)
-            for (; e > 0 && og(a.text.charAt(e));) e += c;
-        return 0 > e || e > a.text.length ? null : e
-    }
-    var a = /gecko\/\d/i.test(navigator.userAgent),
-        b = /MSIE \d/.test(navigator.userAgent),
-        c = /Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(navigator.userAgent),
-        d = b || c,
-        e = d && (b ? document.documentMode || 6 : c[1]),
-        f = /WebKit\//.test(navigator.userAgent),
-        g = f && /Qt\/\d+\.\d+/.test(navigator.userAgent),
-        h = /Chrome\//.test(navigator.userAgent),
-        i = /Opera\//.test(navigator.userAgent),
-        j = /Apple Computer/.test(navigator.vendor),
-        k = /Mac OS X 1\d\D([8-9]|\d\d)\D/.test(navigator.userAgent),
-        l = /PhantomJS/.test(navigator.userAgent),
-        m = /AppleWebKit/.test(navigator.userAgent) && /Mobile\/\w+/.test(navigator.userAgent),
-        n = m || /Android|webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(navigator.userAgent),
-        o = m || /Mac/.test(navigator.platform),
-        p = /win/i.test(navigator.platform),
-        q = i && navigator.userAgent.match(/Version\/(\d*\.\d*)/),
-        oldff = /Firefox\/([1-3])\./i.test(navigator.userAgent);
-    q && (q = Number(q[1])), q && q >= 15 && (i = !1, f = !0);
-    var r = o && (g || i && (null == q || 12.11 > q)),
-        s = a || d && e >= 9,
-        t = !1,
-        u = !1;
-    K.prototype = hg({
-        update: function (a) {
-            var b = a.scrollWidth > a.clientWidth + 1,
-                c = a.scrollHeight > a.clientHeight + 1,
-                d = a.nativeBarWidth;
-            if (c) {
-                this.vert.style.display = "block", this.vert.style.bottom = b ? d + "px" : "0";
-                var e = a.viewHeight - (b ? d : 0);
-                this.vert.firstChild.style.height = Math.max(0, a.scrollHeight - a.clientHeight + e) + "px"
-            } else this.vert.style.display = "", this.vert.firstChild.style.height = "0";
-            if (b) {
-                this.horiz.style.display = "block", this.horiz.style.right = c ? d + "px" : "0", this.horiz.style.left = a.barLeft + "px";
-                var f = a.viewWidth - a.barLeft - (c ? d : 0);
-                this.horiz.firstChild.style.width = a.scrollWidth - a.clientWidth + f + "px"
-            } else this.horiz.style.display = "", this.horiz.firstChild.style.width = "0";
-            return !this.checkedOverlay && a.clientHeight > 0 && (0 == d && this.overlayHack(), this.checkedOverlay = !0), {
-                right: c ? d : 0,
-                bottom: b ? d : 0
-            }
-        },
-        setScrollLeft: function (a) {
-            this.horiz.scrollLeft != a && (this.horiz.scrollLeft = a)
-        },
-        setScrollTop: function (a) {
-            this.vert.scrollTop != a && (this.vert.scrollTop = a)
-        },
-        overlayHack: function () {
-            var a = o && !k ? "12px" : "18px";
-            this.horiz.style.minHeight = this.vert.style.minWidth = a;
-            var b = this,
-                c = function (a) {
-                    Hf(a) != b.vert && Hf(a) != b.horiz && dc(b.cm, uc)(a)
-                };
-            Jf(this.vert, "mousedown", c), Jf(this.horiz, "mousedown", c)
-        },
-        clear: function () {
-            var a = this.horiz.parentNode;
-            a.removeChild(this.horiz), a.removeChild(this.vert)
-        }
-    }, K.prototype), L.prototype = hg({
-        update: function () {
-            return {
-                bottom: 0,
-                right: 0
-            }
-        },
-        setScrollLeft: function () {},
-        setScrollTop: function () {},
-        clear: function () {}
-    }, L.prototype), v.scrollbarModel = {
-        "native": K,
-        "null": L
-    }, U.prototype.signal = function (a, b) {
-        Rf(a, b) && this.events.push(arguments)
-    }, U.prototype.finish = function () {
-        for (var a = 0; a < this.events.length; a++) Lf.apply(null, this.events[a])
-    };
-    var oa = v.Pos = function (a, b) {
-            return this instanceof oa ? (this.line = a, void(this.ch = b)) : new oa(a, b)
-        },
-        pa = v.cmpPos = function (a, b) {
-            return a.line - b.line || a.ch - b.ch
-        },
-        va = null;
-    Ba.prototype = hg({
-        init: function (a) {
-            function h(a) {
-                if (c.somethingSelected()) va = c.getSelections(), b.inaccurateSelection && (b.prevInput = "", b.inaccurateSelection = !1, g.value = va.join("\n"), cg(g));
-                else {
-                    if (!c.options.lineWiseCopyCut) return;
-                    var d = za(c);
-                    va = d.text, "cut" == a.type ? c.setSelections(d.ranges, null, Vf) : (b.prevInput = "", g.value = d.text.join("\n"), cg(g))
-                }
-                "cut" == a.type && (c.state.cutIncoming = !0)
-            }
-            var b = this,
-                c = this.cm,
-                f = this.wrapper = Ca(),
-                g = this.textarea = f.firstChild;
-            a.wrapper.insertBefore(f, a.wrapper.firstChild), m && (g.style.width = "0px"), Jf(g, "input", function () {
-                d && e >= 9 && b.hasSelection && (b.hasSelection = null), b.poll()
-            }), Jf(g, "paste", function (a) {
-                return xa(a, c) ? !0 : (c.state.pasteIncoming = !0, void b.fastPoll())
-            }), Jf(g, "cut", h), Jf(g, "copy", h), Jf(a.scroller, "paste", function (d) {
-                sc(a, d) || (c.state.pasteIncoming = !0, b.focus())
-            }), Jf(a.lineSpace, "selectstart", function (b) {
-                sc(a, b) || Df(b)
-            }), Jf(g, "compositionstart", function () {
-                var a = c.getCursor("from");
-                b.composing = {
-                    start: a,
-                    range: c.markText(a, c.getCursor("to"), {
-                        className: "CodeMirror-composing"
-                    })
-                }
-            }), Jf(g, "compositionend", function () {
-                b.composing && (b.poll(), b.composing.range.clear(), b.composing = null)
-            })
-        },
-        prepareSelection: function () {
-            var a = this.cm,
-                b = a.display,
-                c = a.doc,
-                d = eb(a);
-            if (a.options.moveInputWithCursor) {
-                var e = Lb(a, c.sel.primary()
-                        .head, "div"),
-                    f = b.wrapper.getBoundingClientRect(),
-                    g = b.lineDiv.getBoundingClientRect();
-                d.teTop = Math.max(0, Math.min(b.wrapper.clientHeight - 10, e.top + g.top - f.top)), d.teLeft = Math.max(0, Math.min(b.wrapper.clientWidth - 10, e.left + g.left - f.left))
-            }
-            return d
-        },
-        showSelection: function (a) {
-            var b = this.cm,
-                c = b.display;
-            sg(c.cursorDiv, a.cursors), sg(c.selectionDiv, a.selection), null != a.teTop && (this.wrapper.style.top = a.teTop + "px", this.wrapper.style.left = a.teLeft + "px")
-        },
-        reset: function (a) {
-            if (!this.contextMenuPending) {
-                var b, c, f = this.cm,
-                    g = f.doc;
-                if (f.somethingSelected()) {
-                    this.prevInput = "";
-                    var h = g.sel.primary();
-                    b = Kg && (h.to()
-                        .line - h.from()
-                        .line > 100 || (c = f.getSelection())
-                        .length > 1e3);
-                    var i = b ? "-" : c || f.getSelection();
-                    this.textarea.value = i, f.state.focused && cg(this.textarea), d && e >= 9 && (this.hasSelection = i)
-                } else a || (this.prevInput = this.textarea.value = "", d && e >= 9 && (this.hasSelection = null));
-                this.inaccurateSelection = b
-            }
-        },
-        getField: function () {
-            return this.textarea
-        },
-        supportsTouch: function () {
-            return !1
-        },
-        focus: function () {
-            if ("nocursor" != this.cm.options.readOnly && (!n || ug() != this.textarea)) try {
-                this.textarea.focus()
-            } catch (a) {}
-        },
-        blur: function () {
-            this.textarea.blur()
-        },
-        resetPosition: function () {
-            this.wrapper.style.top = this.wrapper.style.left = 0
-        },
-        receivedFocus: function () {
-            this.slowPoll()
-        },
-        slowPoll: function () {
-            var a = this;
-            a.pollingFast || a.polling.set(this.cm.options.pollInterval, function () {
-                a.poll(), a.cm.state.focused && a.slowPoll()
-            })
-        },
-        fastPoll: function () {
-            function c() {
-                var d = b.poll();
-                d || a ? (b.pollingFast = !1, b.slowPoll()) : (a = !0, b.polling.set(60, c))
-            }
-            var a = !1,
-                b = this;
-            b.pollingFast = !0, b.polling.set(20, c)
-        },
-        poll: function () {
-            var a = this.cm,
-                b = this.textarea,
-                c = this.prevInput;
-            if (this.contextMenuPending || !a.state.focused || Jg(b) && !c && !this.composing || ua(a) || a.options.disableInput || a.state.keySeq) return !1;
-            var f = b.value;
-            if (f == c && !a.somethingSelected()) return !1;
-            if (d && e >= 9 && this.hasSelection === f || o && /[\uf700-\uf7ff]/.test(f)) return a.display.input.reset(), !1;
-            if (a.doc.sel == a.display.selForContextMenu) {
-                var g = f.charCodeAt(0);
-                if (8203 != g || c || (c = "\u200b"), 8666 == g) return this.reset(), this.cm.execCommand("undo")
-            }
-            for (var h = 0, i = Math.min(c.length, f.length); i > h && c.charCodeAt(h) == f.charCodeAt(h);) ++h;
-            var j = this;
-            return cc(a, function () {
-                wa(a, f.slice(h), c.length - h, null, j.composing ? "*compose" : null), f.length > 1e3 || f.indexOf("\n") > -1 ? b.value = j.prevInput = "" : j.prevInput = f, j.composing && (j.composing.range.clear(), j.composing.range = a.markText(j.composing.start, a.getCursor("to"), {
-                    className: "CodeMirror-composing"
-                }))
-            }), !0
-        },
-        ensurePolled: function () {
-            this.pollingFast && this.poll() && (this.pollingFast = !1)
-        },
-        onKeyPress: function () {
-            d && e >= 9 && (this.hasSelection = null), this.fastPoll()
-        },
-        onContextMenu: function (a) {
-            function o() {
-                if (null != h.selectionStart) {
-                    var a = c.somethingSelected(),
-                        d = "\u200b" + (a ? h.value : "");
-                    h.value = "\u21da", h.value = d, b.prevInput = a ? "" : "\u200b", h.selectionStart = 1, h.selectionEnd = d.length, g.selForContextMenu = c.doc.sel
-                }
-            }
-
-            function p() {
-                if (b.contextMenuPending = !1, b.wrapper.style.position = "relative", h.style.cssText = m, d && 9 > e && g.scrollbars.setScrollTop(g.scroller.scrollTop = k), null != h.selectionStart) {
-                    (!d || d && 9 > e) && o();
-                    var a = 0,
-                        f = function () {
-                            g.selForContextMenu == c.doc.sel && 0 == h.selectionStart && h.selectionEnd > 0 && "\u200b" == b.prevInput ? dc(c, Ld.selectAll)(c) : a++ < 10 ? g.detectingSelectAll = setTimeout(f, 500) : g.input.reset()
-                        };
-                    g.detectingSelectAll = setTimeout(f, 200)
-                }
-            }
-            var b = this,
-                c = b.cm,
-                g = c.display,
-                h = b.textarea,
-                j = tc(c, a),
-                k = g.scroller.scrollTop;
-            if (j && !i) {
-                var l = c.options.resetSelectionOnContextMenu;
-                l && -1 == c.doc.sel.contains(j) && dc(c, Za)(c.doc, Ma(j), Vf);
-                var m = h.style.cssText;
-                if (b.wrapper.style.position = "absolute", h.style.cssText = "position: fixed; width: 30px; height: 30px; top: " + (a.clientY - 5) + "px; left: " + (a.clientX - 5) + "px; z-index: 1000; background: " + (d ? "rgba(255, 255, 255, .05)" : "transparent") + "; outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);", f) var n = window.scrollY;
-                if (g.input.focus(), f && window.scrollTo(null, n), g.input.reset(), c.somethingSelected() || (h.value = b.prevInput = " "), b.contextMenuPending = !0, g.selForContextMenu = c.doc.sel, clearTimeout(g.detectingSelectAll), d && e >= 9 && o(), s) {
-                    Gf(a);
-                    var q = function () {
-                        Kf(window, "mouseup", q), setTimeout(p, 20)
-                    };
-                    Jf(window, "mouseup", q)
-                } else setTimeout(p, 50)
-            }
-        },
-        setUneditable: fg,
-        needsContentAttribute: !1
-    }, Ba.prototype), Da.prototype = hg({
-        init: function (a) {
-            function e(a) {
-                if (c.somethingSelected()) va = c.getSelections(), "cut" == a.type && c.replaceSelection("", null, "cut");
-                else {
-                    if (!c.options.lineWiseCopyCut) return;
-                    var b = za(c);
-                    va = b.text, "cut" == a.type && c.operation(function () {
-                        c.setSelections(b.ranges, 0, Vf), c.replaceSelection("", null, "cut")
-                    })
-                }
-                if (a.clipboardData && !m) a.preventDefault(), a.clipboardData.clearData(), a.clipboardData.setData("text/plain", va.join("\n"));
-                else {
-                    var d = Ca(),
-                        e = d.firstChild;
-                    c.display.lineSpace.insertBefore(d, c.display.lineSpace.firstChild), e.value = va.join("\n");
-                    var f = document.activeElement;
-                    cg(e), setTimeout(function () {
-                        c.display.lineSpace.removeChild(d), f.focus()
-                    }, 50)
-                }
-            }
-            var b = this,
-                c = b.cm,
-                d = b.div = a.lineDiv;
-            d.contentEditable = "true", Aa(d), Jf(d, "paste", function (a) {
-                xa(a, c)
-            }), Jf(d, "compositionstart", function (a) {
-                var d = a.data;
-                if (b.composing = {
-                        sel: c.doc.sel,
-                        data: d,
-                        startData: d
-                    }, d) {
-                    var e = c.doc.sel.primary(),
-                        f = c.getLine(e.head.line),
-                        g = f.indexOf(d, Math.max(0, e.head.ch - d.length));
-                    g > -1 && g <= e.head.ch && (b.composing.sel = Ma(oa(e.head.line, g), oa(e.head.line, g + d.length)))
-                }
-            }), Jf(d, "compositionupdate", function (a) {
-                b.composing.data = a.data
-            }), Jf(d, "compositionend", function (a) {
-                var c = b.composing;
-                c && (a.data == c.startData || /\u200b/.test(a.data) || (c.data = a.data), setTimeout(function () {
-                    c.handled || b.applyComposition(c), b.composing == c && (b.composing = null)
-                }, 50))
-            }), Jf(d, "touchstart", function () {
-                b.forceCompositionEnd()
-            }), Jf(d, "input", function () {
-                b.composing || b.pollContent() || cc(b.cm, function () {
-                    ic(c)
-                })
-            }), Jf(d, "copy", e), Jf(d, "cut", e)
-        },
-        prepareSelection: function () {
-            var a = eb(this.cm, !1);
-            return a.focus = this.cm.state.focused, a
-        },
-        showSelection: function (a) {
-            a && this.cm.display.view.length && (a.focus && this.showPrimarySelection(), this.showMultipleSelections(a))
-        },
-        showPrimarySelection: function () {
-            var b = window.getSelection(),
-                c = this.cm.doc.sel.primary(),
-                d = Ga(this.cm, b.anchorNode, b.anchorOffset),
-                e = Ga(this.cm, b.focusNode, b.focusOffset);
-            if (!d || d.bad || !e || e.bad || 0 != pa(sa(d, e), c.from()) || 0 != pa(ra(d, e), c.to())) {
-                var f = Ea(this.cm, c.from()),
-                    g = Ea(this.cm, c.to());
-                if (f || g) {
-                    var h = this.cm.display.view,
-                        i = b.rangeCount && b.getRangeAt(0);
-                    if (f) {
-                        if (!g) {
-                            var j = h[h.length - 1].measure,
-                                k = j.maps ? j.maps[j.maps.length - 1] : j.map;
-                            g = {
-                                node: k[k.length - 1],
-                                offset: k[k.length - 2] - k[k.length - 3]
-                            }
-                        }
-                    } else f = {
-                        node: h[0].measure.map[2],
-                        offset: 0
-                    };
-                    try {
-                        var l = qg(f.node, f.offset, g.offset, g.node)
-                    } catch (m) {}
-                    l && (b.removeAllRanges(), b.addRange(l), i && null == b.anchorNode ? b.addRange(i) : a && this.startGracePeriod()), this.rememberSelection()
-                }
-            }
-        },
-        startGracePeriod: function () {
-            var a = this;
-            clearTimeout(this.gracePeriod), this.gracePeriod = setTimeout(function () {
-                a.gracePeriod = !1, a.selectionChanged() && a.cm.operation(function () {
-                    a.cm.curOp.selectionChanged = !0
-                })
-            }, 20)
-        },
-        showMultipleSelections: function (a) {
-            sg(this.cm.display.cursorDiv, a.cursors), sg(this.cm.display.selectionDiv, a.selection)
-        },
-        rememberSelection: function () {
-            var a = window.getSelection();
-            this.lastAnchorNode = a.anchorNode, this.lastAnchorOffset = a.anchorOffset, this.lastFocusNode = a.focusNode, this.lastFocusOffset = a.focusOffset
-        },
-        selectionInEditor: function () {
-            var a = window.getSelection();
-            if (!a.rangeCount) return !1;
-            var b = a.getRangeAt(0)
-                .commonAncestorContainer;
-            return tg(this.div, b)
-        },
-        focus: function () {
-            "nocursor" != this.cm.options.readOnly && this.div.focus()
-        },
-        blur: function () {
-            this.div.blur()
-        },
-        getField: function () {
-            return this.div
-        },
-        supportsTouch: function () {
-            return !0
-        },
-        receivedFocus: function () {
-            function b() {
-                a.cm.state.focused && (a.pollSelection(), a.polling.set(a.cm.options.pollInterval, b))
-            }
-            var a = this;
-            this.selectionInEditor() ? this.pollSelection() : cc(this.cm, function () {
-                a.cm.curOp.selectionChanged = !0
-            }), this.polling.set(this.cm.options.pollInterval, b)
-        },
-        selectionChanged: function () {
-            var a = window.getSelection();
-            return a.anchorNode != this.lastAnchorNode || a.anchorOffset != this.lastAnchorOffset || a.focusNode != this.lastFocusNode || a.focusOffset != this.lastFocusOffset
-        },
-        pollSelection: function () {
-            if (!this.composing && !this.gracePeriod && this.selectionChanged()) {
-                var a = window.getSelection(),
-                    b = this.cm;
-                this.rememberSelection();
-                var c = Ga(b, a.anchorNode, a.anchorOffset),
-                    d = Ga(b, a.focusNode, a.focusOffset);
-                c && d && cc(b, function () {
-                    Za(b.doc, Ma(c, d), Vf), (c.bad || d.bad) && (b.curOp.selectionChanged = !0)
-                })
-            }
-        },
-        pollContent: function () {
-            var a = this.cm,
-                b = a.display,
-                c = a.doc.sel.primary(),
-                d = c.from(),
-                e = c.to();
-            if (d.line < b.viewFrom || e.line > b.viewTo - 1) return !1;
-            var f;
-            if (d.line == b.viewFrom || 0 == (f = lc(a, d.line))) var g = kf(b.view[0].line),
-                h = b.view[0].node;
-            else var g = kf(b.view[f].line),
-                h = b.view[f - 1].node.nextSibling;
-            var i = lc(a, e.line);
-            if (i == b.view.length - 1) var j = b.viewTo - 1,
-                k = b.lineDiv.lastChild;
-            else var j = kf(b.view[i + 1].line) - 1,
-                k = b.view[i + 1].node.previousSibling;
-            for (var l = a.doc.splitLines(Ia(a, h, k, g, j)), m = gf(a.doc, oa(g, 0), oa(j, ff(a.doc, j)
-                    .text.length)); l.length > 1 && m.length > 1;)
-                if (bg(l) == bg(m)) l.pop(), m.pop(), j--;
-                else {
-                    if (l[0] != m[0]) break;
-                    l.shift(), m.shift(), g++
-                }
-            for (var n = 0, o = 0, p = l[0], q = m[0], r = Math.min(p.length, q.length); r > n && p.charCodeAt(n) == q.charCodeAt(n);) ++n;
-            for (var s = bg(l), t = bg(m), u = Math.min(s.length - (1 == l.length ? n : 0), t.length - (1 == m.length ? n : 0)); u > o && s.charCodeAt(s.length - o - 1) == t.charCodeAt(t.length - o - 1);) ++o;
-            l[l.length - 1] = s.slice(0, s.length - o), l[0] = l[0].slice(n);
-            var v = oa(g, n),
-                w = oa(j, m.length ? bg(m)
-                    .length - o : 0);
-            return l.length > 1 || l[0] || pa(v, w) ? (nd(a.doc, l, v, w, "+input"), !0) : void 0
-        },
-        ensurePolled: function () {
-            this.forceCompositionEnd()
-        },
-        reset: function () {
-            this.forceCompositionEnd()
-        },
-        forceCompositionEnd: function () {
-            this.composing && !this.composing.handled && (this.applyComposition(this.composing), this.composing.handled = !0, this.div.blur(), this.div.focus())
-        },
-        applyComposition: function (a) {
-            a.data && a.data != a.startData && dc(this.cm, wa)(this.cm, a.data, 0, a.sel)
-        },
-        setUneditable: function (a) {
-            a.setAttribute("contenteditable", "false")
-        },
-        onKeyPress: function (a) {
-            a.preventDefault(), dc(this.cm, wa)(this.cm, String.fromCharCode(null == a.charCode ? a.keyCode : a.charCode), 0)
-        },
-        onContextMenu: fg,
-        resetPosition: fg,
-        needsContentAttribute: !0
-    }, Da.prototype), v.inputStyles = {
-        textarea: Ba,
-        contenteditable: Da
-    }, Ja.prototype = {
-        primary: function () {
-            return this.ranges[this.primIndex]
-        },
-        equals: function (a) {
-            if (a == this) return !0;
-            if (a.primIndex != this.primIndex || a.ranges.length != this.ranges.length) return !1;
-            for (var b = 0; b < this.ranges.length; b++) {
-                var c = this.ranges[b],
-                    d = a.ranges[b];
-                if (0 != pa(c.anchor, d.anchor) || 0 != pa(c.head, d.head)) return !1
-            }
-            return !0
-        },
-        deepCopy: function () {
-            for (var a = [], b = 0; b < this.ranges.length; b++) a[b] = new Ka(qa(this.ranges[b].anchor), qa(this.ranges[b].head));
-            return new Ja(a, this.primIndex)
-        },
-        somethingSelected: function () {
-            for (var a = 0; a < this.ranges.length; a++)
-                if (!this.ranges[a].empty()) return !0;
-            return !1
-        },
-        contains: function (a, b) {
-            b || (b = a);
-            for (var c = 0; c < this.ranges.length; c++) {
-                var d = this.ranges[c];
-                if (pa(b, d.from()) >= 0 && pa(a, d.to()) <= 0) return c
-            }
-            return -1
-        }
-    }, Ka.prototype = {
-        from: function () {
-            return sa(this.anchor, this.head)
-        },
-        to: function () {
-            return ra(this.anchor, this.head)
-        },
-        empty: function () {
-            return this.head.line == this.anchor.line && this.head.ch == this.anchor.ch
-        }
-    };
-    var Qb, vc, wc, zb = {
-            left: 0,
-            right: 0,
-            top: 0,
-            bottom: 0
-        },
-        Tb = null,
-        Ub = 0,
-        Cc = 0,
-        Jc = 0,
-        Kc = null;
-    d ? Kc = -.53 : a ? Kc = 15 : h ? Kc = -.7 : j && (Kc = -1 / 3);
-    var Lc = function (a) {
-        var b = a.wheelDeltaX,
-            c = a.wheelDeltaY;
-        return null == b && a.detail && a.axis == a.HORIZONTAL_AXIS && (b = a.detail), null == c && a.detail && a.axis == a.VERTICAL_AXIS ? c = a.detail : null == c && (c = a.wheelDelta), {
-            x: b,
-            y: c
-        }
-    };
-    v.wheelEventPixels = function (a) {
-        var b = Lc(a);
-        return b.x *= Kc, b.y *= Kc, b
-    };
-    var Pc = new Yf,
-        Tc = null,
-        bd = v.changeEnd = function (a) {
-            return a.text ? oa(a.from.line + a.text.length - 1, bg(a.text)
-                .length + (1 == a.text.length ? a.from.ch : 0)) : a.to
-        };
-    v.prototype = {
-        constructor: v,
-        focus: function () {
-            window.focus(), this.display.input.focus()
-        },
-        setOption: function (a, b) {
-            var c = this.options,
-                d = c[a];
-            (c[a] != b || "mode" == a) && (c[a] = b, Bd.hasOwnProperty(a) && dc(this, Bd[a])(this, b, d))
-        },
-        getOption: function (a) {
-            return this.options[a]
-        },
-        getDoc: function () {
-            return this.doc
-        },
-        addKeyMap: function (a, b) {
-            this.state.keyMaps[b ? "push" : "unshift"](Rd(a))
-        },
-        removeKeyMap: function (a) {
-            for (var b = this.state.keyMaps, c = 0; c < b.length; ++c)
-                if (b[c] == a || b[c].name == a) return b.splice(c, 1), !0
-        },
-        addOverlay: ec(function (a, b) {
-            var c = a.token ? a : v.getMode(this.options, a);
-            if (c.startState) throw new Error("Overlays may not be stateful.");
-            this.state.overlays.push({
-                mode: c,
-                modeSpec: a,
-                opaque: b && b.opaque
-            }), this.state.modeGen++, ic(this)
-        }),
-        removeOverlay: ec(function (a) {
-            for (var b = this.state.overlays, c = 0; c < b.length; ++c) {
-                var d = b[c].modeSpec;
-                if (d == a || "string" == typeof a && d.name == a) return b.splice(c, 1), this.state.modeGen++, void ic(this)
-            }
-        }),
-        indentLine: ec(function (a, b, c) {
-            "string" != typeof b && "number" != typeof b && (b = null == b ? this.options.smartIndent ? "smart" : "prev" : b ? "add" : "subtract"), Qa(this.doc, a) && vd(this, a, b, c)
-        }),
-        indentSelection: ec(function (a) {
-            for (var b = this.doc.sel.ranges, c = -1, d = 0; d < b.length; d++) {
-                var e = b[d];
-                if (e.empty()) e.head.line > c && (vd(this, e.head.line, a, !0), c = e.head.line, d == this.doc.sel.primIndex && td(this));
-                else {
-                    var f = e.from(),
-                        g = e.to(),
-                        h = Math.max(c, f.line);
-                    c = Math.min(this.lastLine(), g.line - (g.ch ? 0 : 1)) + 1;
-                    for (var i = h; c > i; ++i) vd(this, i, a);
-                    var j = this.doc.sel.ranges;
-                    0 == f.ch && b.length == j.length && j[d].from()
-                        .ch > 0 && Va(this.doc, d, new Ka(f, j[d].to()), Vf)
-                }
-            }
-        }),
-        getTokenAt: function (a, b) {
-            return Ie(this, a, b)
-        },
-        getLineTokens: function (a, b) {
-            return Ie(this, oa(a), b, !0)
-        },
-        getTokenTypeAt: function (a) {
-            a = Oa(this.doc, a);
-            var f, b = Le(this, ff(this.doc, a.line)),
-                c = 0,
-                d = (b.length - 1) / 2,
-                e = a.ch;
-            if (0 == e) f = b[2];
-            else
-                for (;;) {
-                    var g = c + d >> 1;
-                    if ((g ? b[2 * g - 1] : 0) >= e) d = g;
-                    else {
-                        if (!(b[2 * g + 1] < e)) {
-                            f = b[2 * g + 2];
-                            break
-                        }
-                        c = g + 1
-                    }
-                }
-            var h = f ? f.indexOf("cm-overlay ") : -1;
-            return 0 > h ? f : 0 == h ? null : f.slice(0, h - 1)
-        },
-        getModeAt: function (a) {
-            var b = this.doc.mode;
-            return b.innerMode ? v.innerMode(b, this.getTokenAt(a)
-                    .state)
-                .mode : b
-        },
-        getHelper: function (a, b) {
-            return this.getHelpers(a, b)[0]
-        },
-        getHelpers: function (a, b) {
-            var c = [];
-            if (!Id.hasOwnProperty(b)) return c;
-            var d = Id[b],
-                e = this.getModeAt(a);
-            if ("string" == typeof e[b]) d[e[b]] && c.push(d[e[b]]);
-            else if (e[b])
-                for (var f = 0; f < e[b].length; f++) {
-                    var g = d[e[b][f]];
-                    g && c.push(g)
-                } else e.helperType && d[e.helperType] ? c.push(d[e.helperType]) : d[e.name] && c.push(d[e.name]);
-            for (var f = 0; f < d._global.length; f++) {
-                var h = d._global[f];
-                h.pred(e, this) && -1 == dg(c, h.val) && c.push(h.val)
-            }
-            return c
-        },
-        getStateAfter: function (a, b) {
-            var c = this.doc;
-            return a = Na(c, null == a ? c.first + c.size - 1 : a), lb(this, a + 1, b)
-        },
-        cursorCoords: function (a, b) {
-            var c, d = this.doc.sel.primary();
-            return c = null == a ? d.head : "object" == typeof a ? Oa(this.doc, a) : a ? d.from() : d.to(), Lb(this, c, b || "page")
-        },
-        charCoords: function (a, b) {
-            return Kb(this, Oa(this.doc, a), b || "page")
-        },
-        coordsChar: function (a, b) {
-            return a = Jb(this, a, b || "page"), Ob(this, a.left, a.top)
-        },
-        lineAtHeight: function (a, b) {
-            return a = Jb(this, {
-                    top: a,
-                    left: 0
-                }, b || "page")
-                .top, lf(this.doc, a + this.display.viewOffset)
-        },
-        heightAtLine: function (a, b) {
-            var d, c = !1;
-            if ("number" == typeof a) {
-                var e = this.doc.first + this.doc.size - 1;
-                a < this.doc.first ? a = this.doc.first : a > e && (a = e, c = !0), d = ff(this.doc, a)
-            } else d = a;
-            return Ib(this, d, {
-                    top: 0,
-                    left: 0
-                }, b || "page")
-                .top + (c ? this.doc.height - mf(d) : 0)
-        },
-        defaultTextHeight: function () {
-            return Rb(this.display)
-        },
-        defaultCharWidth: function () {
-            return Sb(this.display)
-        },
-        setGutterMarker: ec(function (a, b, c) {
-            return wd(this.doc, a, "gutter", function (a) {
-                var d = a.gutterMarkers || (a.gutterMarkers = {});
-                return d[b] = c, !c && mg(d) && (a.gutterMarkers = null), !0
-            })
-        }),
-        clearGutter: ec(function (a) {
-            var b = this,
-                c = b.doc,
-                d = c.first;
-            c.iter(function (c) {
-                c.gutterMarkers && c.gutterMarkers[a] && (c.gutterMarkers[a] = null, jc(b, d, "gutter"), mg(c.gutterMarkers) && (c.gutterMarkers = null)), ++d
-            })
-        }),
-        lineInfo: function (a) {
-            if ("number" == typeof a) {
-                if (!Qa(this.doc, a)) return null;
-                var b = a;
-                if (a = ff(this.doc, a), !a) return null
-            } else {
-                var b = kf(a);
-                if (null == b) return null
-            }
-            return {
-                line: b,
-                handle: a,
-                text: a.text,
-                gutterMarkers: a.gutterMarkers,
-                textClass: a.textClass,
-                bgClass: a.bgClass,
-                wrapClass: a.wrapClass,
-                widgets: a.widgets
-            }
-        },
-        getViewport: function () {
-            return {
-                from: this.display.viewFrom,
-                to: this.display.viewTo
-            }
-        },
-        addWidget: function (a, b, c, d, e) {
-            var f = this.display;
-            a = Lb(this, Oa(this.doc, a));
-            var g = a.bottom,
-                h = a.left;
-            if (b.style.position = "absolute", b.setAttribute("cm-ignore-events", "true"), this.display.input.setUneditable(b), f.sizer.appendChild(b), "over" == d) g = a.top;
-            else if ("above" == d || "near" == d) {
-                var i = Math.max(f.wrapper.clientHeight, this.doc.height),
-                    j = Math.max(f.sizer.clientWidth, f.lineSpace.clientWidth);
-                ("above" == d || a.bottom + b.offsetHeight > i) && a.top > b.offsetHeight ? g = a.top - b.offsetHeight : a.bottom + b.offsetHeight <= i && (g = a.bottom), h + b.offsetWidth > j && (h = j - b.offsetWidth)
-            }
-            b.style.top = g + "px", b.style.left = b.style.right = "", "right" == e ? (h = f.sizer.clientWidth - b.offsetWidth, b.style.right = "0px") : ("left" == e ? h = 0 : "middle" == e && (h = (f.sizer.clientWidth - b.offsetWidth) / 2), b.style.left = h + "px"), c && qd(this, h, g, h + b.offsetWidth, g + b.offsetHeight)
-        },
-        triggerOnKeyDown: ec(Uc),
-        triggerOnKeyPress: ec(Xc),
-        triggerOnKeyUp: Wc,
-        execCommand: function (a) {
-            return Ld.hasOwnProperty(a) ? Ld[a].call(null, this) : void 0
-        },
-        triggerElectric: ec(function (a) {
-            ya(this, a)
-        }),
-        findPosH: function (a, b, c, d) {
-            var e = 1;
-            0 > b && (e = -1, b = -b);
-            for (var f = 0, g = Oa(this.doc, a); b > f && (g = yd(this.doc, g, e, c, d), !g.hitSide); ++f);
-            return g
-        },
-        moveH: ec(function (a, b) {
-            var c = this;
-            c.extendSelectionsBy(function (d) {
-                return c.display.shift || c.doc.extend || d.empty() ? yd(c.doc, d.head, a, b, c.options.rtlMoveVisually) : 0 > a ? d.from() : d.to()
-            }, Xf)
-        }),
-        deleteH: ec(function (a, b) {
-            var c = this.doc.sel,
-                d = this.doc;
-            c.somethingSelected() ? d.replaceSelection("", null, "+delete") : xd(this, function (c) {
-                var e = yd(d, c.head, a, b, !1);
-                return 0 > a ? {
-                    from: e,
-                    to: c.head
-                } : {
-                    from: c.head,
-                    to: e
-                }
-            })
-        }),
-        findPosV: function (a, b, c, d) {
-            var e = 1,
-                f = d;
-            0 > b && (e = -1, b = -b);
-            for (var g = 0, h = Oa(this.doc, a); b > g; ++g) {
-                var i = Lb(this, h, "div");
-                if (null == f ? f = i.left : i.left = f, h = zd(this, i, e, c), h.hitSide) break
-            }
-            return h
-        },
-        moveV: ec(function (a, b) {
-            var c = this,
-                d = this.doc,
-                e = [],
-                f = !c.display.shift && !d.extend && d.sel.somethingSelected();
-            if (d.extendSelectionsBy(function (g) {
-                    if (f) return 0 > a ? g.from() : g.to();
-                    var h = Lb(c, g.head, "div");
-                    null != g.goalColumn && (h.left = g.goalColumn), e.push(h.left);
-                    var i = zd(c, h, a, b);
-                    return "page" == b && g == d.sel.primary() && sd(c, null, Kb(c, i, "div")
-                        .top - h.top), i
-                }, Xf), e.length)
-                for (var g = 0; g < d.sel.ranges.length; g++) d.sel.ranges[g].goalColumn = e[g]
-        }),
-        findWordAt: function (a) {
-            var b = this.doc,
-                c = ff(b, a.line)
-                .text,
-                d = a.ch,
-                e = a.ch;
-            if (c) {
-                var f = this.getHelper(a, "wordChars");
-                (a.xRel < 0 || e == c.length) && d ? --d : ++e;
-                for (var g = c.charAt(d), h = lg(g, f) ? function (a) {
-                        return lg(a, f)
-                    } : /\s/.test(g) ? function (a) {
-                        return /\s/.test(a)
-                    } : function (a) {
-                        return !/\s/.test(a) && !lg(a)
-                    }; d > 0 && h(c.charAt(d - 1));) --d;
-                for (; e < c.length && h(c.charAt(e));) ++e
-            }
-            return new Ka(oa(a.line, d), oa(a.line, e))
-        },
-        toggleOverwrite: function (a) {
-            (null == a || a != this.state.overwrite) && ((this.state.overwrite = !this.state.overwrite) ? xg(this.display.cursorDiv, "CodeMirror-overwrite") : wg(this.display.cursorDiv, "CodeMirror-overwrite"), Lf(this, "overwriteToggle", this, this.state.overwrite))
-        },
-        hasFocus: function () {
-            return this.display.input.getField() == ug()
-        },
-        scrollTo: ec(function (a, b) {
-            (null != a || null != b) && ud(this), null != a && (this.curOp.scrollLeft = a), null != b && (this.curOp.scrollTop = b)
-        }),
-        getScrollInfo: function () {
-            var a = this.display.scroller;
-            return {
-                left: a.scrollLeft,
-                top: a.scrollTop,
-                height: a.scrollHeight - pb(this) - this.display.barHeight,
-                width: a.scrollWidth - pb(this) - this.display.barWidth,
-                clientHeight: rb(this),
-                clientWidth: qb(this)
-            }
-        },
-        scrollIntoView: ec(function (a, b) {
-            if (null == a ? (a = {
-                    from: this.doc.sel.primary()
-                        .head,
-                    to: null
-                }, null == b && (b = this.options.cursorScrollMargin)) : "number" == typeof a ? a = {
-                    from: oa(a, 0),
-                    to: null
-                } : null == a.from && (a = {
-                    from: a,
-                    to: null
-                }), a.to || (a.to = a.from), a.margin = b || 0, null != a.from.line) ud(this), this.curOp.scrollToPos = a;
-            else {
-                var c = rd(this, Math.min(a.from.left, a.to.left), Math.min(a.from.top, a.to.top) - a.margin, Math.max(a.from.right, a.to.right), Math.max(a.from.bottom, a.to.bottom) + a.margin);
-                this.scrollTo(c.scrollLeft, c.scrollTop)
-            }
-        }),
-        setSize: ec(function (a, b) {
-            function d(a) {
-                return "number" == typeof a || /^\d+$/.test(String(a)) ? a + "px" : a
-            }
-            var c = this;
-            null != a && (c.display.wrapper.style.width = d(a)), null != b && (c.display.wrapper.style.height = d(b)), c.options.lineWrapping && Eb(this);
-            var e = c.display.viewFrom;
-            c.doc.iter(e, c.display.viewTo, function (a) {
-                if (a.widgets)
-                    for (var b = 0; b < a.widgets.length; b++)
-                        if (a.widgets[b].noHScroll) {
-                            jc(c, e, "widget");
-                            break
-                        }++e
-            }), c.curOp.forceUpdate = !0, Lf(c, "refresh", this)
-        }),
-        operation: function (a) {
-            return cc(this, a)
-        },
-        refresh: ec(function () {
-            var a = this.display.cachedTextHeight;
-            ic(this), this.curOp.forceUpdate = !0, Fb(this), this.scrollTo(this.doc.scrollLeft, this.doc.scrollTop), F(this), (null == a || Math.abs(a - Rb(this.display)) > .5) && B(this), Lf(this, "refresh", this)
-        }),
-        swapDoc: ec(function (a) {
-            var b = this.doc;
-            return b.cm = null, ef(this, a), Fb(this), this.display.input.reset(), this.scrollTo(a.scrollLeft, a.scrollTop), this.curOp.forceScroll = !0, Nf(this, "swapDoc", this, b), b
-        }),
-        getInputField: function () {
-            return this.display.input.getField()
-        },
-        getWrapperElement: function () {
-            return this.display.wrapper
-        },
-        getScrollerElement: function () {
-            return this.display.scroller
-        },
-        getGutterElement: function () {
-            return this.display.gutters
-        }
-    }, Sf(v);
-    var Ad = v.defaults = {},
-        Bd = v.optionHandlers = {},
-        Dd = v.Init = {
-            toString: function () {
-                return "CodeMirror.Init"
-            }
-        };
-    Cd("value", "", function (a, b) {
-        a.setValue(b)
-    }, !0), Cd("mode", null, function (a, b) {
-        a.doc.modeOption = b, x(a)
-    }, !0), Cd("indentUnit", 2, x, !0), Cd("indentWithTabs", !1), Cd("smartIndent", !0), Cd("tabSize", 4, function (a) {
-        y(a), Fb(a), ic(a)
-    }, !0), Cd("lineSeparator", null, function (a, b) {
-        if (a.doc.lineSep = b, b) {
-            var c = [],
-                d = a.doc.first;
-            a.doc.iter(function (a) {
-                for (var e = 0;;) {
-                    var f = a.text.indexOf(b, e);
-                    if (-1 == f) break;
-                    e = f + b.length, c.push(oa(d, f))
-                }
-                d++
-            });
-            for (var e = c.length - 1; e >= 0; e--) nd(a.doc, b, c[e], oa(c[e].line, c[e].ch + b.length))
-        }
-    }), Cd("specialChars", /[\t\u0000-\u0019\u00ad\u200b-\u200f\u2028\u2029\ufeff]/g, function (a, b, c) {
-        a.state.specialChars = new RegExp(b.source + (b.test("	") ? "" : "|	"), "g"), c != v.Init && a.refresh()
-    }), Cd("specialCharPlaceholder", Re, function (a) {
-        a.refresh()
-    }, !0), Cd("electricChars", !0), Cd("inputStyle", n ? "contenteditable" : "textarea", function () {
-        throw new Error("inputStyle can not (yet) be changed in a running editor")
-    }, !0), Cd("rtlMoveVisually", !p), Cd("wholeLineUpdateBefore", !0), Cd("theme", "default", function (a) {
-        C(a), D(a)
-    }, !0), Cd("keyMap", "default", function (a, b, c) {
-        var d = Rd(b),
-            e = c != v.Init && Rd(c);
-        e && e.detach && e.detach(a, d), d.attach && d.attach(a, e || null)
-    }), Cd("extraKeys", null), Cd("lineWrapping", !1, z, !0), Cd("gutters", [], function (a) {
-        I(a.options), D(a)
-    }, !0), Cd("fixedGutter", !0, function (a, b) {
-        a.display.gutters.style.left = b ? T(a.display) + "px" : "0", a.refresh()
-    }, !0), Cd("coverGutterNextToScrollbar", !1, function (a) {
-        N(a)
-    }, !0), Cd("scrollbarStyle", "native", function (a) {
-        M(a), N(a), a.display.scrollbars.setScrollTop(a.doc.scrollTop), a.display.scrollbars.setScrollLeft(a.doc.scrollLeft)
-    }, !0), Cd("lineNumbers", !1, function (a) {
-        I(a.options), D(a)
-    }, !0), Cd("firstLineNumber", 1, D, !0), Cd("lineNumberFormatter", function (a) {
-        return a
-    }, D, !0), Cd("showCursorWhenSelecting", !1, db, !0), Cd("resetSelectionOnContextMenu", !0), Cd("lineWiseCopyCut", !0), Cd("readOnly", !1, function (a, b) {
-        "nocursor" == b ? ($c(a), a.display.input.blur(), a.display.disabled = !0) : (a.display.disabled = !1, b || a.display.input.reset())
-    }), Cd("disableInput", !1, function (a, b) {
-        b || a.display.input.reset()
-    }, !0), Cd("dragDrop", !0, qc), Cd("cursorBlinkRate", 530), Cd("cursorScrollMargin", 0), Cd("cursorHeight", 1, db, !0), Cd("singleCursorHeightPerLine", !0, db, !0), Cd("workTime", 100), Cd("workDelay", 100), Cd("flattenSpans", !0, y, !0), Cd("addModeClass", !1, y, !0), Cd("pollInterval", 100), Cd("undoDepth", 200, function (a, b) {
-        a.doc.history.undoDepth = b
-    }), Cd("historyEventDelay", 1250), Cd("viewportMargin", 10, function (a) {
-        a.refresh()
-    }, !0), Cd("maxHighlightLength", 1e4, y, !0), Cd("moveInputWithCursor", !0, function (a, b) {
-        b || a.display.input.resetPosition()
-    }), Cd("tabindex", null, function (a, b) {
-        a.display.input.getField()
-            .tabIndex = b || ""
-    }), Cd("autofocus", null);
-    var Ed = v.modes = {},
-        Fd = v.mimeModes = {};
-    v.defineMode = function (a, b) {
-        v.defaults.mode || "null" == a || (v.defaults.mode = a), arguments.length > 2 && (b.dependencies = Array.prototype.slice.call(arguments, 2)), Ed[a] = b
-    }, v.defineMIME = function (a, b) {
-        Fd[a] = b
-    }, v.resolveMode = function (a) {
-        if ("string" == typeof a && Fd.hasOwnProperty(a)) a = Fd[a];
-        else if (a && "string" == typeof a.name && Fd.hasOwnProperty(a.name)) {
-            var b = Fd[a.name];
-            "string" == typeof b && (b = {
-                name: b
-            }), a = gg(b, a), a.name = b.name
-        } else if ("string" == typeof a && /^[\w\-]+\/[\w\-]+\+xml$/.test(a)) return v.resolveMode("application/xml");
-        return "string" == typeof a ? {
-            name: a
-        } : a || {
-            name: "null"
-        }
-    }, v.getMode = function (a, b) {
-        var b = v.resolveMode(b),
-            c = Ed[b.name];
-        if (!c) return v.getMode(a, "text/plain");
-        var d = c(a, b);
-        if (Gd.hasOwnProperty(b.name)) {
-            var e = Gd[b.name];
-            for (var f in e) e.hasOwnProperty(f) && (d.hasOwnProperty(f) && (d["_" + f] = d[f]), d[f] = e[f])
-        }
-        if (d.name = b.name, b.helperType && (d.helperType = b.helperType), b.modeProps)
-            for (var f in b.modeProps) d[f] = b.modeProps[f];
-        return d
-    }, v.defineMode("null", function () {
-        return {
-            token: function (a) {
-                a.skipToEnd()
-            }
-        }
-    }), v.defineMIME("text/plain", "null");
-    var Gd = v.modeExtensions = {};
-    v.extendMode = function (a, b) {
-        var c = Gd.hasOwnProperty(a) ? Gd[a] : Gd[a] = {};
-        hg(b, c)
-    }, v.defineExtension = function (a, b) {
-        v.prototype[a] = b
-    }, v.defineDocExtension = function (a, b) {
-        af.prototype[a] = b
-    }, v.defineOption = Cd;
-    var Hd = [];
-    v.defineInitHook = function (a) {
-        Hd.push(a)
-    };
-    var Id = v.helpers = {};
-    v.registerHelper = function (a, b, c) {
-        Id.hasOwnProperty(a) || (Id[a] = v[a] = {
-            _global: []
-        }), Id[a][b] = c
-    }, v.registerGlobalHelper = function (a, b, c, d) {
-        v.registerHelper(a, b, d), Id[a]._global.push({
-            pred: c,
-            val: d
-        })
-    };
-    var Jd = v.copyState = function (a, b) {
-            if (b === !0) return b;
-            if (a.copyState) return a.copyState(b);
-            var c = {};
-            for (var d in b) {
-                var e = b[d];
-                e instanceof Array && (e = e.concat([])), c[d] = e
-            }
-            return c
-        },
-        Kd = v.startState = function (a, b, c) {
-            return a.startState ? a.startState(b, c) : !0
-        };
-    v.innerMode = function (a, b) {
-        for (; a.innerMode;) {
-            var c = a.innerMode(b);
-            if (!c || c.mode == a) break;
-            b = c.state, a = c.mode
-        }
-        return c || {
-            mode: a,
-            state: b
-        }
-    };
-    var Ld = v.commands = {
-            selectAll: function (a) {
-                a.setSelection(oa(a.firstLine(), 0), oa(a.lastLine()), Vf)
-            },
-            singleSelection: function (a) {
-                a.setSelection(a.getCursor("anchor"), a.getCursor("head"), Vf)
-            },
-            killLine: function (a) {
-                xd(a, function (b) {
-                    if (b.empty()) {
-                        var c = ff(a.doc, b.head.line)
-                            .text.length;
-                        return b.head.ch == c && b.head.line < a.lastLine() ? {
-                            from: b.head,
-                            to: oa(b.head.line + 1, 0)
-                        } : {
-                            from: b.head,
-                            to: oa(b.head.line, c)
-                        }
-                    }
-                    return {
-                        from: b.from(),
-                        to: b.to()
-                    }
-                })
-            },
-            deleteLine: function (a) {
-                xd(a, function (b) {
-                    return {
-                        from: oa(b.from()
-                            .line, 0),
-                        to: Oa(a.doc, oa(b.to()
-                            .line + 1, 0))
-                    }
-                })
-            },
-            delLineLeft: function (a) {
-                xd(a, function (a) {
-                    return {
-                        from: oa(a.from()
-                            .line, 0),
-                        to: a.from()
-                    }
-                })
-            },
-            delWrappedLineLeft: function (a) {
-                xd(a, function (b) {
-                    var c = a.charCoords(b.head, "div")
-                        .top + 5,
-                        d = a.coordsChar({
-                            left: 0,
-                            top: c
-                        }, "div");
-                    return {
-                        from: d,
-                        to: b.from()
-                    }
-                })
-            },
-            delWrappedLineRight: function (a) {
-                xd(a, function (b) {
-                    var c = a.charCoords(b.head, "div")
-                        .top + 5,
-                        d = a.coordsChar({
-                            left: a.display.lineDiv.offsetWidth + 100,
-                            top: c
-                        }, "div");
-                    return {
-                        from: b.from(),
-                        to: d
-                    }
-                })
-            },
-            undo: function (a) {
-                a.undo()
-            },
-            redo: function (a) {
-                a.redo()
-            },
-            undoSelection: function (a) {
-                a.undoSelection()
-            },
-            redoSelection: function (a) {
-                a.redoSelection()
-            },
-            goDocStart: function (a) {
-                a.extendSelection(oa(a.firstLine(), 0))
-            },
-            goDocEnd: function (a) {
-                a.extendSelection(oa(a.lastLine()))
-            },
-            goLineStart: function (a) {
-                a.extendSelectionsBy(function (b) {
-                    return Tg(a, b.head.line)
-                }, {
-                    origin: "+move",
-                    bias: 1
-                })
-            },
-            goLineStartSmart: function (a) {
-                a.extendSelectionsBy(function (b) {
-                    return Vg(a, b.head)
-                }, {
-                    origin: "+move",
-                    bias: 1
-                })
-            },
-            goLineEnd: function (a) {
-                a.extendSelectionsBy(function (b) {
-                    return Ug(a, b.head.line)
-                }, {
-                    origin: "+move",
-                    bias: -1
-                })
-            },
-            goLineRight: function (a) {
-                a.extendSelectionsBy(function (b) {
-                    var c = a.charCoords(b.head, "div")
-                        .top + 5;
-                    return a.coordsChar({
-                        left: a.display.lineDiv.offsetWidth + 100,
-                        top: c
-                    }, "div")
-                }, Xf)
-            },
-            goLineLeft: function (a) {
-                a.extendSelectionsBy(function (b) {
-                    var c = a.charCoords(b.head, "div")
-                        .top + 5;
-                    return a.coordsChar({
-                        left: 0,
-                        top: c
-                    }, "div")
-                }, Xf)
-            },
-            goLineLeftSmart: function (a) {
-                a.extendSelectionsBy(function (b) {
-                    var c = a.charCoords(b.head, "div")
-                        .top + 5,
-                        d = a.coordsChar({
-                            left: 0,
-                            top: c
-                        }, "div");
-                    return d.ch < a.getLine(d.line)
-                        .search(/\S/) ? Vg(a, b.head) : d
-                }, Xf)
-            },
-            goLineUp: function (a) {
-                a.moveV(-1, "line")
-            },
-            goLineDown: function (a) {
-                a.moveV(1, "line")
-            },
-            goPageUp: function (a) {
-                a.moveV(-1, "page")
-            },
-            goPageDown: function (a) {
-                a.moveV(1, "page")
-            },
-            goCharLeft: function (a) {
-                a.moveH(-1, "char")
-            },
-            goCharRight: function (a) {
-                a.moveH(1, "char")
-            },
-            goColumnLeft: function (a) {
-                a.moveH(-1, "column")
-            },
-            goColumnRight: function (a) {
-                a.moveH(1, "column")
-            },
-            goWordLeft: function (a) {
-                a.moveH(-1, "word")
-            },
-            goGroupRight: function (a) {
-                a.moveH(1, "group")
-            },
-            goGroupLeft: function (a) {
-                a.moveH(-1, "group")
-            },
-            goWordRight: function (a) {
-                a.moveH(1, "word")
-            },
-            delCharBefore: function (a) {
-                a.deleteH(-1, "char")
-            },
-            delCharAfter: function (a) {
-                a.deleteH(1, "char")
-            },
-            delWordBefore: function (a) {
-                a.deleteH(-1, "word")
-            },
-            delWordAfter: function (a) {
-                a.deleteH(1, "word")
-            },
-            delGroupBefore: function (a) {
-                a.deleteH(-1, "group")
-            },
-            delGroupAfter: function (a) {
-                a.deleteH(1, "group")
-            },
-            indentAuto: function (a) {
-                a.indentSelection("smart")
-            },
-            indentMore: function (a) {
-                a.indentSelection("add")
-            },
-            indentLess: function (a) {
-                a.indentSelection("subtract")
-            },
-            insertTab: function (a) {
-                a.replaceSelection("	")
-            },
-            insertSoftTab: function (a) {
-                for (var b = [], c = a.listSelections(), d = a.options.tabSize, e = 0; e < c.length; e++) {
-                    var f = c[e].from(),
-                        g = Zf(a.getLine(f.line), f.ch, d);
-                    b.push(new Array(d - g % d + 1)
-                        .join(" "))
-                }
-                a.replaceSelections(b)
-            },
-            defaultTab: function (a) {
-                a.somethingSelected() ? a.indentSelection("add") : a.execCommand("insertTab")
-            },
-            transposeChars: function (a) {
-                cc(a, function () {
-                    for (var b = a.listSelections(), c = [], d = 0; d < b.length; d++) {
-                        var e = b[d].head,
-                            f = ff(a.doc, e.line)
-                            .text;
-                        if (f)
-                            if (e.ch == f.length && (e = new oa(e.line, e.ch - 1)), e.ch > 0) e = new oa(e.line, e.ch + 1), a.replaceRange(f.charAt(e.ch - 1) + f.charAt(e.ch - 2), oa(e.line, e.ch - 2), e, "+transpose");
-                            else if (e.line > a.doc.first) {
-                            var g = ff(a.doc, e.line - 1)
-                                .text;
-                            g && a.replaceRange(f.charAt(0) + a.doc.lineSeparator() + g.charAt(g.length - 1), oa(e.line - 1, g.length - 1), oa(e.line, 1), "+transpose")
-                        }
-                        c.push(new Ka(e, e))
-                    }
-                    a.setSelections(c)
-                })
-            },
-            newlineAndIndent: function (a) {
-                cc(a, function () {
-                    for (var b = a.listSelections()
-                            .length, c = 0; b > c; c++) {
-                        var d = a.listSelections()[c];
-                        a.replaceRange(a.doc.lineSeparator(), d.anchor, d.head, "+input"), a.indentLine(d.from()
-                            .line + 1, null, !0), td(a)
-                    }
-                })
-            },
-            toggleOverwrite: function (a) {
-                a.toggleOverwrite()
-            }
-        },
-        Md = v.keyMap = {};
-    Md.basic = {
-        Left: "goCharLeft",
-        Right: "goCharRight",
-        Up: "goLineUp",
-        Down: "goLineDown",
-        End: "goLineEnd",
-        Home: "goLineStartSmart",
-        PageUp: "goPageUp",
-        PageDown: "goPageDown",
-        Delete: "delCharAfter",
-        Backspace: "delCharBefore",
-        "Shift-Backspace": "delCharBefore",
-        Tab: "defaultTab",
-        "Shift-Tab": "indentAuto",
-        Enter: "newlineAndIndent",
-        Insert: "toggleOverwrite",
-        Esc: "singleSelection"
-    }, Md.pcDefault = {
-        "Ctrl-A": "selectAll",
-        "Ctrl-D": "deleteLine",
-        "Ctrl-Z": "undo",
-        "Shift-Ctrl-Z": "redo",
-        "Ctrl-Y": "redo",
-        "Ctrl-Home": "goDocStart",
-        "Ctrl-End": "goDocEnd",
-        "Ctrl-Up": "goLineUp",
-        "Ctrl-Down": "goLineDown",
-        "Ctrl-Left": "goGroupLeft",
-        "Ctrl-Right": "goGroupRight",
-        "Alt-Left": "goLineStart",
-        "Alt-Right": "goLineEnd",
-        "Ctrl-Backspace": "delGroupBefore",
-        "Ctrl-Delete": "delGroupAfter",
-        "Ctrl-S": "save",
-        "Ctrl-F": "find",
-        "Ctrl-G": "findNext",
-        "Shift-Ctrl-G": "findPrev",
-        "Shift-Ctrl-F": "replace",
-        "Shift-Ctrl-R": "replaceAll",
-        "Ctrl-[": "indentLess",
-        "Ctrl-]": "indentMore",
-        "Ctrl-U": "undoSelection",
-        "Shift-Ctrl-U": "redoSelection",
-        "Alt-U": "redoSelection",
-        fallthrough: "basic"
-    }, Md.emacsy = {
-        "Ctrl-F": "goCharRight",
-        "Ctrl-B": "goCharLeft",
-        "Ctrl-P": "goLineUp",
-        "Ctrl-N": "goLineDown",
-        "Alt-F": "goWordRight",
-        "Alt-B": "goWordLeft",
-        "Ctrl-A": "goLineStart",
-        "Ctrl-E": "goLineEnd",
-        "Ctrl-V": "goPageDown",
-        "Shift-Ctrl-V": "goPageUp",
-        "Ctrl-D": "delCharAfter",
-        "Ctrl-H": "delCharBefore",
-        "Alt-D": "delWordAfter",
-        "Alt-Backspace": "delWordBefore",
-        "Ctrl-K": "killLine",
-        "Ctrl-T": "transposeChars"
-    }, Md.macDefault = {
-        "Cmd-A": "selectAll",
-        "Cmd-D": "deleteLine",
-        "Cmd-Z": "undo",
-        "Shift-Cmd-Z": "redo",
-        "Cmd-Y": "redo",
-        "Cmd-Home": "goDocStart",
-        "Cmd-Up": "goDocStart",
-        "Cmd-End": "goDocEnd",
-        "Cmd-Down": "goDocEnd",
-        "Alt-Left": "goGroupLeft",
-        "Alt-Right": "goGroupRight",
-        "Cmd-Left": "goLineLeft",
-        "Cmd-Right": "goLineRight",
-        "Alt-Backspace": "delGroupBefore",
-        "Ctrl-Alt-Backspace": "delGroupAfter",
-        "Alt-Delete": "delGroupAfter",
-        "Cmd-S": "save",
-        "Cmd-F": "find",
-        "Cmd-G": "findNext",
-        "Shift-Cmd-G": "findPrev",
-        "Cmd-Alt-F": "replace",
-        "Shift-Cmd-Alt-F": "replaceAll",
-        "Cmd-[": "indentLess",
-        "Cmd-]": "indentMore",
-        "Cmd-Backspace": "delWrappedLineLeft",
-        "Cmd-Delete": "delWrappedLineRight",
-        "Cmd-U": "undoSelection",
-        "Shift-Cmd-U": "redoSelection",
-        "Ctrl-Up": "goDocStart",
-        "Ctrl-Down": "goDocEnd",
-        fallthrough: ["basic", "emacsy"]
-    }, Md["default"] = o ? Md.macDefault : Md.pcDefault, v.normalizeKeyMap = function (a) {
-        var b = {};
-        for (var c in a)
-            if (a.hasOwnProperty(c)) {
-                var d = a[c];
-                if (/^(name|fallthrough|(de|at)tach)$/.test(c)) continue;
-                if ("..." == d) {
-                    delete a[c];
-                    continue
-                }
-                for (var e = eg(c.split(" "), Nd), f = 0; f < e.length; f++) {
-                    var g, h;
-                    f == e.length - 1 ? (h = e.join(" "), g = d) : (h = e.slice(0, f + 1)
-                        .join(" "), g = "...");
-                    var i = b[h];
-                    if (i) {
-                        if (i != g) throw new Error("Inconsistent bindings for " + h)
-                    } else b[h] = g
-                }
-                delete a[c]
-            }
-        for (var j in b) a[j] = b[j];
-        return a
-    };
-    var Od = v.lookupKey = function (a, b, c, d) {
-            b = Rd(b);
-            var e = b.call ? b.call(a, d) : b[a];
-            if (e === !1) return "nothing";
-            if ("..." === e) return "multi";
-            if (null != e && c(e)) return "handled";
-            if (b.fallthrough) {
-                if ("[object Array]" != Object.prototype.toString.call(b.fallthrough)) return Od(a, b.fallthrough, c, d);
-                for (var f = 0; f < b.fallthrough.length; f++) {
-                    var g = Od(a, b.fallthrough[f], c, d);
-                    if (g) return g
-                }
-            }
-        },
-        Pd = v.isModifierKey = function (a) {
-            var b = "string" == typeof a ? a : Ng[a.keyCode];
-            return "Ctrl" == b || "Alt" == b || "Shift" == b || "Mod" == b
-        },
-        Qd = v.keyName = function (a, b) {
-            if (i && 34 == a.keyCode && a["char"]) return !1;
-            var c = Ng[a.keyCode],
-                d = c;
-            return null == d || a.altGraphKey ? !1 : (a.altKey && "Alt" != c && (d = "Alt-" + d), (r ? a.metaKey : a.ctrlKey) && "Ctrl" != c && (d = "Ctrl-" + d), (r ? a.ctrlKey : a.metaKey) && "Cmd" != c && (d = "Cmd-" + d), !b && a.shiftKey && "Shift" != c && (d = "Shift-" + d), d)
-        };
-    v.fromTextArea = function (a, b) {
-        function d() {
-            a.value = i.getValue()
-        }
-        if (b = b ? hg(b) : {}, b.value = a.value, !b.tabindex && a.tabIndex && (b.tabindex = a.tabIndex), !b.placeholder && a.placeholder && (b.placeholder = a.placeholder), null == b.autofocus) {
-            var c = ug();
-            b.autofocus = c == a || null != a.getAttribute("autofocus") && c == document.body
-        }
-        if (a.form && (Jf(a.form, "submit", d), !b.leaveSubmitMethodAlone)) {
-            var e = a.form,
-                f = e.submit;
-            try {
-                var g = e.submit = function () {
-                    d(), e.submit = f, e.submit(), e.submit = g
-                }
-            } catch (h) {}
-        }
-        b.finishInit = function (b) {
-            b.save = d, b.getTextArea = function () {
-                return a
-            }, b.toTextArea = function () {
-                b.toTextArea = isNaN, d(), a.parentNode.removeChild(b.getWrapperElement()), a.style.display = "", a.form && (Kf(a.form, "submit", d), "function" == typeof a.form.submit && (a.form.submit = f))
-            }
-        }, a.style.display = "none";
-        var i = v(function (b) {
-            a.parentNode.insertBefore(b, a.nextSibling)
-        }, b);
-        return i
-    };
-    var Sd = v.StringStream = function (a, b) {
-        this.pos = this.start = 0, this.string = a, this.tabSize = b || 8, this.lastColumnPos = this.lastColumnValue = 0, this.lineStart = 0
-    };
-    Sd.prototype = {
-        eol: function () {
-            return this.pos >= this.string.length
-        },
-        sol: function () {
-            return this.pos == this.lineStart
-        },
-        peek: function () {
-            return this.string.charAt(this.pos) || void 0
-        },
-        next: function () {
-            return this.pos < this.string.length ? this.string.charAt(this.pos++) : void 0
-        },
-        eat: function (a) {
-            var b = this.string.charAt(this.pos);
-            if ("string" == typeof a) var c = b == a;
-            else var c = b && (a.test ? a.test(b) : a(b));
-            return c ? (++this.pos, b) : void 0
-        },
-        eatWhile: function (a) {
-            for (var b = this.pos; this.eat(a););
-            return this.pos > b
-        },
-        eatSpace: function () {
-            for (var a = this.pos;
-                /[\s\u00a0]/.test(this.string.charAt(this.pos));) ++this.pos;
-            return this.pos > a
-        },
-        skipToEnd: function () {
-            this.pos = this.string.length
-        },
-        skipTo: function (a) {
-            var b = this.string.indexOf(a, this.pos);
-            return b > -1 ? (this.pos = b, !0) : void 0
-        },
-        backUp: function (a) {
-            this.pos -= a
-        },
-        column: function () {
-            return this.lastColumnPos < this.start && (this.lastColumnValue = Zf(this.string, this.start, this.tabSize, this.lastColumnPos, this.lastColumnValue), this.lastColumnPos = this.start), this.lastColumnValue - (this.lineStart ? Zf(this.string, this.lineStart, this.tabSize) : 0)
-        },
-        indentation: function () {
-            return Zf(this.string, null, this.tabSize) - (this.lineStart ? Zf(this.string, this.lineStart, this.tabSize) : 0)
-        },
-        match: function (a, b, c) {
-            if ("string" != typeof a) {
-                var f = this.string.slice(this.pos)
-                    .match(a);
-                return f && f.index > 0 ? null : (f && b !== !1 && (this.pos += f[0].length), f)
-            }
-            var d = function (a) {
-                    return c ? a.toLowerCase() : a
-                },
-                e = this.string.substr(this.pos, a.length);
-            return d(e) == d(a) ? (b !== !1 && (this.pos += a.length), !0) : void 0
-        },
-        current: function () {
-            return this.string.slice(this.start, this.pos)
-        },
-        hideFirstChars: function (a, b) {
-            this.lineStart += a;
-            try {
-                return b()
-            } finally {
-                this.lineStart -= a
-            }
-        }
-    };
-    var Td = 0,
-        Ud = v.TextMarker = function (a, b) {
-            this.lines = [], this.type = b, this.doc = a, this.id = ++Td
-        };
-    Sf(Ud), Ud.prototype.clear = function () {
-        if (!this.explicitlyCleared) {
-            var a = this.doc.cm,
-                b = a && !a.curOp;
-            if (b && Vb(a), Rf(this, "clear")) {
-                var c = this.find();
-                c && Nf(this, "clear", c.from, c.to)
-            }
-            for (var d = null, e = null, f = 0; f < this.lines.length; ++f) {
-                var g = this.lines[f],
-                    h = ae(g.markedSpans, this);
-                a && !this.collapsed ? jc(a, kf(g), "text") : a && (null != h.to && (e = kf(g)), null != h.from && (d = kf(g))), g.markedSpans = be(g.markedSpans, h), null == h.from && this.collapsed && !we(this.doc, g) && a && jf(g, Rb(a.display))
-            }
-            if (a && this.collapsed && !a.options.lineWrapping)
-                for (var f = 0; f < this.lines.length; ++f) {
-                    var i = se(this.lines[f]),
-                        j = G(i);
-                    j > a.display.maxLineLength && (a.display.maxLine = i, a.display.maxLineLength = j, a.display.maxLineChanged = !0)
-                }
-            null != d && a && this.collapsed && ic(a, d, e + 1), this.lines.length = 0, this.explicitlyCleared = !0, this.atomic && this.doc.cantEdit && (this.doc.cantEdit = !1, a && ab(a.doc)), a && Nf(a, "markerCleared", a, this), b && Xb(a), this.parent && this.parent.clear()
-        }
-    }, Ud.prototype.find = function (a, b) {
-        null == a && "bookmark" == this.type && (a = 1);
-        for (var c, d, e = 0; e < this.lines.length; ++e) {
-            var f = this.lines[e],
-                g = ae(f.markedSpans, this);
-            if (null != g.from && (c = oa(b ? f : kf(f), g.from), -1 == a)) return c;
-            if (null != g.to && (d = oa(b ? f : kf(f), g.to), 1 == a)) return d
-        }
-        return c && {
-            from: c,
-            to: d
-        }
-    }, Ud.prototype.changed = function () {
-        var a = this.find(-1, !0),
-            b = this,
-            c = this.doc.cm;
-        a && c && cc(c, function () {
-            var d = a.line,
-                e = kf(a.line),
-                f = wb(c, e);
-            if (f && (Db(f), c.curOp.selectionChanged = c.curOp.forceUpdate = !0), c.curOp.updateMaxLine = !0, !we(b.doc, d) && null != b.height) {
-                var g = b.height;
-                b.height = null;
-                var h = Ae(b) - g;
-                h && jf(d, d.height + h)
-            }
-        })
-    }, Ud.prototype.attachLine = function (a) {
-        if (!this.lines.length && this.doc.cm) {
-            var b = this.doc.cm.curOp;
-            b.maybeHiddenMarkers && -1 != dg(b.maybeHiddenMarkers, this) || (b.maybeUnhiddenMarkers || (b.maybeUnhiddenMarkers = []))
-                .push(this)
-        }
-        this.lines.push(a)
-    }, Ud.prototype.detachLine = function (a) {
-        if (this.lines.splice(dg(this.lines, a), 1), !this.lines.length && this.doc.cm) {
-            var b = this.doc.cm.curOp;
-            (b.maybeHiddenMarkers || (b.maybeHiddenMarkers = []))
-            .push(this)
-        }
-    };
-    var Td = 0,
-        Wd = v.SharedTextMarker = function (a, b) {
-            this.markers = a, this.primary = b;
-            for (var c = 0; c < a.length; ++c) a[c].parent = this
-        };
-    Sf(Wd), Wd.prototype.clear = function () {
-        if (!this.explicitlyCleared) {
-            this.explicitlyCleared = !0;
-            for (var a = 0; a < this.markers.length; ++a) this.markers[a].clear();
-            Nf(this, "clear")
-        }
-    }, Wd.prototype.find = function (a, b) {
-        return this.primary.find(a, b)
-    };
-    var ye = v.LineWidget = function (a, b, c) {
-        if (c)
-            for (var d in c) c.hasOwnProperty(d) && (this[d] = c[d]);
-        this.doc = a, this.node = b
-    };
-    Sf(ye), ye.prototype.clear = function () {
-        var a = this.doc.cm,
-            b = this.line.widgets,
-            c = this.line,
-            d = kf(c);
-        if (null != d && b) {
-            for (var e = 0; e < b.length; ++e) b[e] == this && b.splice(e--, 1);
-            b.length || (c.widgets = null);
-            var f = Ae(this);
-            jf(c, Math.max(0, c.height - f)), a && cc(a, function () {
-                ze(a, c, -f), jc(a, d, "widget")
-            })
-        }
-    }, ye.prototype.changed = function () {
-        var a = this.height,
-            b = this.doc.cm,
-            c = this.line;
-        this.height = null;
-        var d = Ae(this) - a;
-        d && (jf(c, c.height + d), b && cc(b, function () {
-            b.curOp.forceUpdate = !0, ze(b, c, d)
-        }))
-    };
-    var Ce = v.Line = function (a, b, c) {
-        this.text = a, ke(this, b), this.height = c ? c(this) : 1
-    };
-    Sf(Ce), Ce.prototype.lineNo = function () {
-        return kf(this)
-    };
-    var Ne = {},
-        Oe = {};
-    Ze.prototype = {
-        chunkSize: function () {
-            return this.lines.length
-        },
-        removeInner: function (a, b) {
-            for (var c = a, d = a + b; d > c; ++c) {
-                var e = this.lines[c];
-                this.height -= e.height, Ee(e), Nf(e, "delete")
-            }
-            this.lines.splice(a, b)
-        },
-        collapse: function (a) {
-            a.push.apply(a, this.lines)
-        },
-        insertInner: function (a, b, c) {
-            this.height += c, this.lines = this.lines.slice(0, a)
-                .concat(b)
-                .concat(this.lines.slice(a));
-            for (var d = 0; d < b.length; ++d) b[d].parent = this
-        },
-        iterN: function (a, b, c) {
-            for (var d = a + b; d > a; ++a)
-                if (c(this.lines[a])) return !0
-        }
-    }, $e.prototype = {
-        chunkSize: function () {
-            return this.size
-        },
-        removeInner: function (a, b) {
-            this.size -= b;
-            for (var c = 0; c < this.children.length; ++c) {
-                var d = this.children[c],
-                    e = d.chunkSize();
-                if (e > a) {
-                    var f = Math.min(b, e - a),
-                        g = d.height;
-                    if (d.removeInner(a, f), this.height -= g - d.height, e == f && (this.children.splice(c--, 1), d.parent = null), 0 == (b -= f)) break;
-                    a = 0
-                } else a -= e
-            }
-            if (this.size - b < 25 && (this.children.length > 1 || !(this.children[0] instanceof Ze))) {
-                var h = [];
-                this.collapse(h), this.children = [new Ze(h)], this.children[0].parent = this
-            }
-        },
-        collapse: function (a) {
-            for (var b = 0; b < this.children.length; ++b) this.children[b].collapse(a)
-        },
-        insertInner: function (a, b, c) {
-            this.size += b.length, this.height += c;
-            for (var d = 0; d < this.children.length; ++d) {
-                var e = this.children[d],
-                    f = e.chunkSize();
-                if (f >= a) {
-                    if (e.insertInner(a, b, c), e.lines && e.lines.length > 50) {
-                        for (; e.lines.length > 50;) {
-                            var g = e.lines.splice(e.lines.length - 25, 25),
-                                h = new Ze(g);
-                            e.height -= h.height, this.children.splice(d + 1, 0, h), h.parent = this
-                        }
-                        this.maybeSpill()
-                    }
-                    break
-                }
-                a -= f
-            }
-        },
-        maybeSpill: function () {
-            if (!(this.children.length <= 10)) {
-                var a = this;
-                do {
-                    var b = a.children.splice(a.children.length - 5, 5),
-                        c = new $e(b);
-                    if (a.parent) {
-                        a.size -= c.size, a.height -= c.height;
-                        var e = dg(a.parent.children, a);
-                        a.parent.children.splice(e + 1, 0, c)
-                    } else {
-                        var d = new $e(a.children);
-                        d.parent = a, a.children = [d, c], a = d
-                    }
-                    c.parent = a.parent
-                } while (a.children.length > 10);
-                a.parent.maybeSpill()
-            }
-        },
-        iterN: function (a, b, c) {
-            for (var d = 0; d < this.children.length; ++d) {
-                var e = this.children[d],
-                    f = e.chunkSize();
-                if (f > a) {
-                    var g = Math.min(b, f - a);
-                    if (e.iterN(a, g, c)) return !0;
-                    if (0 == (b -= g)) break;
-                    a = 0
-                } else a -= f
-            }
-        }
-    };
-    var _e = 0,
-        af = v.Doc = function (a, b, c, d) {
-            if (!(this instanceof af)) return new af(a, b, c, d);
-            null == c && (c = 0), $e.call(this, [new Ze([new Ce("", null)])]), this.first = c, this.scrollTop = this.scrollLeft = 0, this.cantEdit = !1, this.cleanGeneration = 1, this.frontier = c;
-            var e = oa(c, 0);
-            this.sel = Ma(e), this.history = new of(null), this.id = ++_e, this.modeOption = b, this.lineSep = d, "string" == typeof a && (a = this.splitLines(a)), Ye(this, {
-                from: e,
-                to: e,
-                text: a
-            }), Za(this, Ma(e), Vf)
-        };
-    af.prototype = gg($e.prototype, {
-        constructor: af,
-        iter: function (a, b, c) {
-            c ? this.iterN(a - this.first, b - a, c) : this.iterN(this.first, this.first + this.size, a)
-        },
-        insert: function (a, b) {
-            for (var c = 0, d = 0; d < b.length; ++d) c += b[d].height;
-            this.insertInner(a - this.first, b, c)
-        },
-        remove: function (a, b) {
-            this.removeInner(a - this.first, b)
-        },
-        getValue: function (a) {
-            var b = hf(this, this.first, this.first + this.size);
-            return a === !1 ? b : b.join(a || this.lineSeparator())
-        },
-        setValue: fc(function (a) {
-            var b = oa(this.first, 0),
-                c = this.first + this.size - 1;
-            hd(this, {
-                from: b,
-                to: oa(c, ff(this, c)
-                    .text.length),
-                text: this.splitLines(a),
-                origin: "setValue",
-                full: !0
-            }, !0), Za(this, Ma(b))
-        }),
-        replaceRange: function (a, b, c, d) {
-            b = Oa(this, b), c = c ? Oa(this, c) : b, nd(this, a, b, c, d)
-        },
-        getRange: function (a, b, c) {
-            var d = gf(this, Oa(this, a), Oa(this, b));
-            return c === !1 ? d : d.join(c || this.lineSeparator())
-        },
-        getLine: function (a) {
-            var b = this.getLineHandle(a);
-            return b && b.text
-        },
-        getLineHandle: function (a) {
-            return Qa(this, a) ? ff(this, a) : void 0
-        },
-        getLineNumber: function (a) {
-            return kf(a)
-        },
-        getLineHandleVisualStart: function (a) {
-            return "number" == typeof a && (a = ff(this, a)), se(a)
-        },
-        lineCount: function () {
-            return this.size
-        },
-        firstLine: function () {
-            return this.first
-        },
-        lastLine: function () {
-            return this.first + this.size - 1
-        },
-        clipPos: function (a) {
-            return Oa(this, a)
-        },
-        getCursor: function (a) {
-            var c, b = this.sel.primary();
-            return c = null == a || "head" == a ? b.head : "anchor" == a ? b.anchor : "end" == a || "to" == a || a === !1 ? b.to() : b.from()
-        },
-        listSelections: function () {
-            return this.sel.ranges
-        },
-        somethingSelected: function () {
-            return this.sel.somethingSelected()
-        },
-        setCursor: fc(function (a, b, c) {
-            Wa(this, Oa(this, "number" == typeof a ? oa(a, b || 0) : a), null, c)
-        }),
-        setSelection: fc(function (a, b, c) {
-            Wa(this, Oa(this, a), Oa(this, b || a), c)
-        }),
-        extendSelection: fc(function (a, b, c) {
-            Ta(this, Oa(this, a), b && Oa(this, b), c)
-        }),
-        extendSelections: fc(function (a, b) {
-            Ua(this, Ra(this, a, b))
-        }),
-        extendSelectionsBy: fc(function (a, b) {
-            Ua(this, eg(this.sel.ranges, a), b)
-        }),
-        setSelections: fc(function (a, b, c) {
-            if (a.length) {
-                for (var d = 0, e = []; d < a.length; d++) e[d] = new Ka(Oa(this, a[d].anchor), Oa(this, a[d].head));
-                null == b && (b = Math.min(a.length - 1, this.sel.primIndex)), Za(this, La(e, b), c)
-            }
-        }),
-        addSelection: fc(function (a, b, c) {
-            var d = this.sel.ranges.slice(0);
-            d.push(new Ka(Oa(this, a), Oa(this, b || a))), Za(this, La(d, d.length - 1), c)
-        }),
-        getSelection: function (a) {
-            for (var c, b = this.sel.ranges, d = 0; d < b.length; d++) {
-                var e = gf(this, b[d].from(), b[d].to());
-                c = c ? c.concat(e) : e
-            }
-            return a === !1 ? c : c.join(a || this.lineSeparator())
-        },
-        getSelections: function (a) {
-            for (var b = [], c = this.sel.ranges, d = 0; d < c.length; d++) {
-                var e = gf(this, c[d].from(), c[d].to());
-                a !== !1 && (e = e.join(a || this.lineSeparator())), b[d] = e
-            }
-            return b
-        },
-        replaceSelection: function (a, b, c) {
-            for (var d = [], e = 0; e < this.sel.ranges.length; e++) d[e] = a;
-            this.replaceSelections(d, b, c || "+input")
-        },
-        replaceSelections: fc(function (a, b, c) {
-            for (var d = [], e = this.sel, f = 0; f < e.ranges.length; f++) {
-                var g = e.ranges[f];
-                d[f] = {
-                    from: g.from(),
-                    to: g.to(),
-                    text: this.splitLines(a[f]),
-                    origin: c
-                }
-            }
-            for (var h = b && "end" != b && fd(this, d, b), f = d.length - 1; f >= 0; f--) hd(this, d[f]);
-            h ? Ya(this, h) : this.cm && td(this.cm)
-        }),
-        undo: fc(function () {
-            jd(this, "undo")
-        }),
-        redo: fc(function () {
-            jd(this, "redo")
-        }),
-        undoSelection: fc(function () {
-            jd(this, "undo", !0)
-        }),
-        redoSelection: fc(function () {
-            jd(this, "redo", !0)
-        }),
-        setExtending: function (a) {
-            this.extend = a
-        },
-        getExtending: function () {
-            return this.extend
-        },
-        historySize: function () {
-            for (var a = this.history, b = 0, c = 0, d = 0; d < a.done.length; d++) a.done[d].ranges || ++b;
-            for (var d = 0; d < a.undone.length; d++) a.undone[d].ranges || ++c;
-            return {
-                undo: b,
-                redo: c
-            }
-        },
-        clearHistory: function () {
-            this.history = new of(this.history.maxGeneration)
-        },
-        markClean: function () {
-            this.cleanGeneration = this.changeGeneration(!0)
-        },
-        changeGeneration: function (a) {
-            return a && (this.history.lastOp = this.history.lastSelOp = this.history.lastOrigin = null), this.history.generation
-        },
-        isClean: function (a) {
-            return this.history.generation == (a || this.cleanGeneration)
-        },
-        getHistory: function () {
-            return {
-                done: zf(this.history.done),
-                undone: zf(this.history.undone)
-            }
-        },
-        setHistory: function (a) {
-            var b = this.history = new of(this.history.maxGeneration);
-            b.done = zf(a.done.slice(0), null, !0), b.undone = zf(a.undone.slice(0), null, !0)
-        },
-        addLineClass: fc(function (a, b, c) {
-            return wd(this, a, "gutter" == b ? "gutter" : "class", function (a) {
-                var d = "text" == b ? "textClass" : "background" == b ? "bgClass" : "gutter" == b ? "gutterClass" : "wrapClass";
-                if (a[d]) {
-                    if (vg(c)
-                        .test(a[d])) return !1;
-                    a[d] += " " + c
-                } else a[d] = c;
-                return !0
-            })
-        }),
-        removeLineClass: fc(function (a, b, c) {
-            return wd(this, a, "gutter" == b ? "gutter" : "class", function (a) {
-                var d = "text" == b ? "textClass" : "background" == b ? "bgClass" : "gutter" == b ? "gutterClass" : "wrapClass",
-                    e = a[d];
-                if (!e) return !1;
-                if (null == c) a[d] = null;
-                else {
-                    var f = e.match(vg(c));
-                    if (!f) return !1;
-                    var g = f.index + f[0].length;
-                    a[d] = e.slice(0, f.index) + (f.index && g != e.length ? " " : "") + e.slice(g) || null
-                }
-                return !0
-            })
-        }),
-        addLineWidget: fc(function (a, b, c) {
-            return Be(this, a, b, c)
-        }),
-        removeLineWidget: function (a) {
-            a.clear()
-        },
-        markText: function (a, b, c) {
-            return Vd(this, Oa(this, a), Oa(this, b), c, "range")
-        },
-        setBookmark: function (a, b) {
-            var c = {
-                replacedWith: b && (null == b.nodeType ? b.widget : b),
-                insertLeft: b && b.insertLeft,
-                clearWhenEmpty: !1,
-                shared: b && b.shared,
-                handleMouseEvents: b && b.handleMouseEvents
-            };
-            return a = Oa(this, a), Vd(this, a, a, c, "bookmark")
-        },
-        findMarksAt: function (a) {
-            a = Oa(this, a);
-            var b = [],
-                c = ff(this, a.line)
-                .markedSpans;
-            if (c)
-                for (var d = 0; d < c.length; ++d) {
-                    var e = c[d];
-                    (null == e.from || e.from <= a.ch) && (null == e.to || e.to >= a.ch) && b.push(e.marker.parent || e.marker)
-                }
-            return b
-        },
-        findMarks: function (a, b, c) {
-            a = Oa(this, a), b = Oa(this, b);
-            var d = [],
-                e = a.line;
-            return this.iter(a.line, b.line + 1, function (f) {
-                var g = f.markedSpans;
-                if (g)
-                    for (var h = 0; h < g.length; h++) {
-                        var i = g[h];
-                        e == a.line && a.ch > i.to || null == i.from && e != a.line || e == b.line && i.from > b.ch || c && !c(i.marker) || d.push(i.marker.parent || i.marker)
-                    }++e
-            }), d
-        },
-        getAllMarks: function () {
-            var a = [];
-            return this.iter(function (b) {
-                var c = b.markedSpans;
-                if (c)
-                    for (var d = 0; d < c.length; ++d) null != c[d].from && a.push(c[d].marker)
-            }), a
-        },
-        posFromIndex: function (a) {
-            var b, c = this.first;
-            return this.iter(function (d) {
-                var e = d.text.length + 1;
-                return e > a ? (b = a, !0) : (a -= e, void++c)
-            }), Oa(this, oa(c, b))
-        },
-        indexFromPos: function (a) {
-            a = Oa(this, a);
-            var b = a.ch;
-            return a.line < this.first || a.ch < 0 ? 0 : (this.iter(this.first, a.line, function (a) {
-                b += a.text.length + 1
-            }), b)
-        },
-        copy: function (a) {
-            var b = new af(hf(this, this.first, this.first + this.size), this.modeOption, this.first, this.lineSep);
-            return b.scrollTop = this.scrollTop, b.scrollLeft = this.scrollLeft, b.sel = this.sel, b.extend = !1, a && (b.history.undoDepth = this.history.undoDepth, b.setHistory(this.getHistory())), b
-        },
-        linkedDoc: function (a) {
-            a || (a = {});
-            var b = this.first,
-                c = this.first + this.size;
-            null != a.from && a.from > b && (b = a.from), null != a.to && a.to < c && (c = a.to);
-            var d = new af(hf(this, b, c), a.mode || this.modeOption, b, this.lineSep);
-            return a.sharedHist && (d.history = this.history), (this.linked || (this.linked = []))
-                .push({
-                    doc: d,
-                    sharedHist: a.sharedHist
-                }), d.linked = [{
-                    doc: this,
-                    isParent: !0,
-                    sharedHist: a.sharedHist
-                }], Zd(d, Yd(this)), d
-        },
-        unlinkDoc: function (a) {
-            if (a instanceof v && (a = a.doc), this.linked)
-                for (var b = 0; b < this.linked.length; ++b) {
-                    var c = this.linked[b];
-                    if (c.doc == a) {
-                        this.linked.splice(b, 1), a.unlinkDoc(this), $d(Yd(this));
-                        break
-                    }
-                }
-            if (a.history == this.history) {
-                var d = [a.id];
-                df(a, function (a) {
-                    d.push(a.id)
-                }, !0), a.history = new of(null), a.history.done = zf(this.history.done, d), a.history.undone = zf(this.history.undone, d)
-            }
-        },
-        iterLinkedDocs: function (a) {
-            df(this, a)
-        },
-        getMode: function () {
-            return this.mode
-        },
-        getEditor: function () {
-            return this.cm
-        },
-        splitLines: function (a) {
-            return this.lineSep ? a.split(this.lineSep) : Ig(a)
-        },
-        lineSeparator: function () {
-            return this.lineSep || "\n"
-        }
-    }), af.prototype.eachLine = af.prototype.iter;
-    var bf = "iter insert remove copy getEditor constructor".split(" ");
-    for (var cf in af.prototype) af.prototype.hasOwnProperty(cf) && dg(bf, cf) < 0 && (v.prototype[cf] = function (a) {
-        return function () {
-            return a.apply(this.doc, arguments)
-        }
-    }(af.prototype[cf]));
-    Sf(af);
-    var Df = v.e_preventDefault = function (a) {
-            a.preventDefault ? a.preventDefault() : a.returnValue = !1
-        },
-        Ef = v.e_stopPropagation = function (a) {
-            a.stopPropagation ? a.stopPropagation() : a.cancelBubble = !0
-        },
-        Gf = v.e_stop = function (a) {
-            Df(a), Ef(a)
-        },
-        Jf = v.on = function (a, b, c) {
-            if (a.addEventListener) a.addEventListener(b, c, !1);
-            else if (a.attachEvent) a.attachEvent("on" + b, c);
-            else {
-                var d = a._handlers || (a._handlers = {}),
-                    e = d[b] || (d[b] = []);
-                e.push(c)
-            }
-        },
-        Kf = v.off = function (a, b, c) {
-            if (a.removeEventListener) a.removeEventListener(b, c, !1);
-            else if (a.detachEvent) a.detachEvent("on" + b, c);
-            else {
-                var d = a._handlers && a._handlers[b];
-                if (!d) return;
-                for (var e = 0; e < d.length; ++e)
-                    if (d[e] == c) {
-                        d.splice(e, 1);
-                        break
-                    }
-            }
-        },
-        Lf = v.signal = function (a, b) {
-            var c = a._handlers && a._handlers[b];
-            if (c)
-                for (var d = Array.prototype.slice.call(arguments, 2), e = 0; e < c.length; ++e) c[e].apply(null, d)
-        },
-        Mf = null,
-        Tf = 30,
-        Uf = v.Pass = {
-            toString: function () {
-                return "CodeMirror.Pass"
-            }
-        },
-        Vf = {
-            scroll: !1
-        },
-        Wf = {
-            origin: "*mouse"
-        },
-        Xf = {
-            origin: "+move"
-        };
-    Yf.prototype.set = function (a, b) {
-        clearTimeout(this.id), this.id = setTimeout(b, a)
-    };
-    var Zf = v.countColumn = function (a, b, c, d, e) {
-            null == b && (b = a.search(/[^\s\u00a0]/), -1 == b && (b = a.length));
-            for (var f = d || 0, g = e || 0;;) {
-                var h = a.indexOf("	", f);
-                if (0 > h || h >= b) return g + (b - f);
-                g += h - f, g += c - g % c, f = h + 1
-            }
-        },
-        $f = v.findColumn = function (a, b, c) {
-            for (var d = 0, e = 0;;) {
-                var f = a.indexOf("	", d); - 1 == f && (f = a.length);
-                var g = f - d;
-                if (f == a.length || e + g >= b) return d + Math.min(g, b - e);
-                if (e += f - d, e += c - e % c, d = f + 1, e >= b) return d
-            }
-        },
-        _f = [""],
-        cg = function (a) {
-            a.select()
-        };
-    m ? cg = function (a) {
-        a.selectionStart = 0, a.selectionEnd = a.value.length
-    } : d && (cg = function (a) {
-        try {
-            a.select()
-        } catch (b) {}
-    });
-    var qg, jg = /[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/,
-        kg = v.isWordChar = function (a) {
-            return /\w/.test(a) || a > "\x80" && (a.toUpperCase() != a.toLowerCase() || jg.test(a))
-        },
-        ng = /[\u0300-\u036f\u0483-\u0489\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u065e\u0670\u06d6-\u06dc\u06de-\u06e4\u06e7\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0900-\u0902\u093c\u0941-\u0948\u094d\u0951-\u0955\u0962\u0963\u0981\u09bc\u09be\u09c1-\u09c4\u09cd\u09d7\u09e2\u09e3\u0a01\u0a02\u0a3c\u0a41\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a70\u0a71\u0a75\u0a81\u0a82\u0abc\u0ac1-\u0ac5\u0ac7\u0ac8\u0acd\u0ae2\u0ae3\u0b01\u0b3c\u0b3e\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b82\u0bbe\u0bc0\u0bcd\u0bd7\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0cbc\u0cbf\u0cc2\u0cc6\u0ccc\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0d3e\u0d41-\u0d44\u0d4d\u0d57\u0d62\u0d63\u0dca\u0dcf\u0dd2-\u0dd4\u0dd6\u0ddf\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0f18\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86\u0f87\u0f90-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039\u103a\u103d\u103e\u1058\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085\u1086\u108d\u109d\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927\u1928\u1932\u1939-\u193b\u1a17\u1a18\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80\u1b81\u1ba2-\u1ba5\u1ba8\u1ba9\u1c2c-\u1c33\u1c36\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1dc0-\u1de6\u1dfd-\u1dff\u200c\u200d\u20d0-\u20f0\u2cef-\u2cf1\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua66f-\ua672\ua67c\ua67d\ua6f0\ua6f1\ua802\ua806\ua80b\ua825\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\uaa29-\uaa2e\uaa31\uaa32\uaa35\uaa36\uaa43\uaa4c\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uabe5\uabe8\uabed\udc00-\udfff\ufb1e\ufe00-\ufe0f\ufe20-\ufe26\uff9e\uff9f]/;
-    qg = document.createRange ? function (a, b, c, d) {
-        var e = document.createRange();
-        return e.setEnd(d || a, c), e.setStart(a, b), e
-    } : function (a, b, c) {
-        var d = document.body.createTextRange();
-        try {
-            d.moveToElementText(a.parentNode)
-        } catch (e) {
-            return d
-        }
-        return d.collapse(!0), d.moveEnd("character", c), d.moveStart("character", b), d
-    };
-    var tg = v.contains = function (a, b) {
-        if (3 == b.nodeType && (b = b.parentNode), a.contains) return a.contains(b);
-        do
-            if (11 == b.nodeType && (b = b.host), b == a) return !0;
-        while (b = b.parentNode)
-    };
-    d && 11 > e && (ug = function () {
-        try {
-            return document.activeElement
-        } catch (a) {
-            return document.body
-        }
-    });
-    var Eg, Gg, wg = v.rmClass = function (a, b) {
-            var c = a.className,
-                d = vg(b)
-                .exec(c);
-            if (d) {
-                var e = c.slice(d.index + d[0].length);
-                a.className = c.slice(0, d.index) + (e ? d[1] + e : "")
-            }
-        },
-        xg = v.addClass = function (a, b) {
-            var c = a.className;
-            vg(b)
-                .test(c) || (a.className += (c ? " " : "") + b)
-        },
-        Ag = !1,
-        Dg = function () {
-            if (d && 9 > e) return !1;
-            var a = pg("div");
-            return "draggable" in a || "dragDrop" in a
-        }(),
-        Ig = v.splitLines = 3 != "\n\nb".split(/\n/)
-        .length ? function (a) {
-            for (var b = 0, c = [], d = a.length; d >= b;) {
-                var e = a.indexOf("\n", b); - 1 == e && (e = a.length);
-                var f = a.slice(b, "\r" == a.charAt(e - 1) ? e - 1 : e),
-                    g = f.indexOf("\r"); - 1 != g ? (c.push(f.slice(0, g)), b += g + 1) : (c.push(f), b = e + 1)
-            }
-            return c
-        } : function (a) {
-            return a.split(/\r\n?|\n/)
-        },
-        Jg = window.getSelection ? function (a) {
-            try {
-                return a.selectionStart != a.selectionEnd
-            } catch (b) {
-                return !1
-            }
-        } : function (a) {
-            try {
-                var b = a.ownerDocument.selection.createRange()
-            } catch (c) {}
-            return b && b.parentElement() == a ? 0 != b.compareEndPoints("StartToEnd", b) : !1
-        },
-        Kg = function () {
-            var a = pg("div");
-            return "oncopy" in a ? !0 : (a.setAttribute("oncopy", "return;"), "function" == typeof a.oncopy)
-        }(),
-        Lg = null,
-        Ng = {
-            3: "Enter",
-            8: "Backspace",
-            9: "Tab",
-            13: "Enter",
-            16: "Shift",
-            17: "Ctrl",
-            18: "Alt",
-            19: "Pause",
-            20: "CapsLock",
-            27: "Esc",
-            32: "Space",
-            33: "PageUp",
-            34: "PageDown",
-            35: "End",
-            36: "Home",
-            37: "Left",
-            38: "Up",
-            39: "Right",
-            40: "Down",
-            44: "PrintScrn",
-            45: "Insert",
-            46: "Delete",
-            59: ";",
-            61: "=",
-            91: "Mod",
-            92: "Mod",
-            93: "Mod",
-            107: "=",
-            109: "-",
-            127: "Delete",
-            173: "-",
-            186: ";",
-            187: "=",
-            188: ",",
-            189: "-",
-            190: ".",
-            191: "/",
-            192: "`",
-            219: "[",
-            220: "\\",
-            221: "]",
-            222: "'",
-            63232: "Up",
-            63233: "Down",
-            63234: "Left",
-            63235: "Right",
-            63272: "Delete",
-            63273: "Home",
-            63275: "End",
-            63276: "PageUp",
-            63277: "PageDown",
-            63302: "Insert"
-        };
-    v.keyNames = Ng,
-        function () {
-            for (var a = 0; 10 > a; a++) Ng[a + 48] = Ng[a + 96] = String(a);
-            for (var a = 65; 90 >= a; a++) Ng[a] = String.fromCharCode(a);
-            for (var a = 1; 12 >= a; a++) Ng[a + 111] = Ng[a + 63235] = "F" + a
-        }();
-    var Xg, ah = function () {
-        function c(c) {
-            return 247 >= c ? a.charAt(c) : c >= 1424 && 1524 >= c ? "R" : c >= 1536 && 1773 >= c ? b.charAt(c - 1536) : c >= 1774 && 2220 >= c ? "r" : c >= 8192 && 8203 >= c ? "w" : 8204 == c ? "b" : "L"
-        }
-
-        function j(a, b, c) {
-            this.level = a, this.from = b, this.to = c
-        }
-        var a = "bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN",
-            b = "rrrrrrrrrrrr,rNNmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmrrrrrrrnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmNmmmm",
-            d = /[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac]/,
-            e = /[stwN]/,
-            f = /[LRr]/,
-            g = /[Lb1n]/,
-            h = /[1n]/,
-            i = "L";
-        return function (a) {
-            if (!d.test(a)) return !1;
-            for (var m, b = a.length, k = [], l = 0; b > l; ++l) k.push(m = c(a.charCodeAt(l)));
-            for (var l = 0, n = i; b > l; ++l) {
-                var m = k[l];
-                "m" == m ? k[l] = n : n = m
-            }
-            for (var l = 0, o = i; b > l; ++l) {
-                var m = k[l];
-                "1" == m && "r" == o ? k[l] = "n" : f.test(m) && (o = m, "r" == m && (k[l] = "R"))
-            }
-            for (var l = 1, n = k[0]; b - 1 > l; ++l) {
-                var m = k[l];
-                "+" == m && "1" == n && "1" == k[l + 1] ? k[l] = "1" : "," != m || n != k[l + 1] || "1" != n && "n" != n || (k[l] = n), n = m
-            }
-            for (var l = 0; b > l; ++l) {
-                var m = k[l];
-                if ("," == m) k[l] = "N";
-                else if ("%" == m) {
-                    for (var p = l + 1; b > p && "%" == k[p]; ++p);
-                    for (var q = l && "!" == k[l - 1] || b > p && "1" == k[p] ? "1" : "N", r = l; p > r; ++r) k[r] = q;
-                    l = p - 1
-                }
-            }
-            for (var l = 0, o = i; b > l; ++l) {
-                var m = k[l];
-                "L" == o && "1" == m ? k[l] = "L" : f.test(m) && (o = m)
-            }
-            for (var l = 0; b > l; ++l)
-                if (e.test(k[l])) {
-                    for (var p = l + 1; b > p && e.test(k[p]); ++p);
-                    for (var s = "L" == (l ? k[l - 1] : i), t = "L" == (b > p ? k[p] : i), q = s || t ? "L" : "R", r = l; p > r; ++r) k[r] = q;
-                    l = p - 1
-                }
-            for (var v, u = [], l = 0; b > l;)
-                if (g.test(k[l])) {
-                    var w = l;
-                    for (++l; b > l && g.test(k[l]); ++l);
-                    u.push(new j(0, w, l))
-                } else {
-                    var x = l,
-                        y = u.length;
-                    for (++l; b > l && "L" != k[l]; ++l);
-                    for (var r = x; l > r;)
-                        if (h.test(k[r])) {
-                            r > x && u.splice(y, 0, new j(1, x, r));
-                            var z = r;
-                            for (++r; l > r && h.test(k[r]); ++r);
-                            u.splice(y, 0, new j(2, z, r)), x = r
-                        } else ++r;
-                    l > x && u.splice(y, 0, new j(1, x, l))
-                }
-            return 1 == u[0].level && (v = a.match(/^\s+/)) && (u[0].from = v[0].length, u.unshift(new j(0, 0, v[0].length))), 1 == bg(u)
-                .level && (v = a.match(/\s+$/)) && (bg(u)
-                    .to -= v[0].length, u.push(new j(0, b - v[0].length, b))), 2 == u[0].level && u.unshift(new j(1, u[0].to, u[0].to)), u[0].level != bg(u)
-                .level && u.push(new j(u[0].level, b, b)), u
-        }
-    }();
-    return v.version = "5.6.1", v
-}),
-function (a) {
-    "object" == typeof exports && "object" == typeof module ? a(require("../../lib/codemirror")) : "function" == typeof define && define.amd ? define(["../../lib/codemirror"], a) : a(CodeMirror)
-}(function (a) {
-    "use strict";
-
-    function b(a) {
-        for (var b = {}, c = 0; c < a.length; ++c) b[a[c]] = !0;
-        return b
-    }
-
-    function x(a, b) {
-        for (var d, c = !1; null != (d = a.next());) {
-            if (c && "/" == d) {
-                b.tokenize = null;
-                break
-            }
-            c = "*" == d
-        }
-        return ["comment", "comment"]
-    }
-    a.defineMode("css", function (b, c) {
-        function u(a, b) {
-            return s = b, a
-        }
-
-        function v(a, b) {
-            var c = a.next();
-            if (f[c]) {
-                var d = f[c](a, b);
-                if (d !== !1) return d
-            }
-            return "@" == c ? (a.eatWhile(/[\w\\\-]/), u("def", a.current())) : "=" == c || ("~" == c || "|" == c) && a.eat("=") ? u(null, "compare") : '"' == c || "'" == c ? (b.tokenize = w(c), b.tokenize(a, b)) : "#" == c ? (a.eatWhile(/[\w\\\-]/), u("atom", "hash")) : "!" == c ? (a.match(/^\s*\w*/), u("keyword", "important")) : /\d/.test(c) || "." == c && a.eat(/\d/) ? (a.eatWhile(/[\w.%]/), u("number", "unit")) : "-" !== c ? /[,+>*\/]/.test(c) ? u(null, "select-op") : "." == c && a.match(/^-?[_a-z][_a-z0-9-]*/i) ? u("qualifier", "qualifier") : /[:;{}\[\]\(\)]/.test(c) ? u(null, c) : "u" == c && a.match(/rl(-prefix)?\(/) || "d" == c && a.match("omain(") || "r" == c && a.match("egexp(") ? (a.backUp(1), b.tokenize = x, u("property", "word")) : /[\w\\\-]/.test(c) ? (a.eatWhile(/[\w\\\-]/), u("property", "word")) : u(null, null) : /[\d.]/.test(a.peek()) ? (a.eatWhile(/[\w.%]/), u("number", "unit")) : a.match(/^-[\w\\\-]+/) ? (a.eatWhile(/[\w\\\-]/), a.match(/^\s*:/, !1) ? u("variable-2", "variable-definition") : u("variable-2", "variable")) : a.match(/^\w+-/) ? u("meta", "meta") : void 0
-        }
-
-        function w(a) {
-            return function (b, c) {
-                for (var e, d = !1; null != (e = b.next());) {
-                    if (e == a && !d) {
-                        ")" == a && b.backUp(1);
-                        break
-                    }
-                    d = !d && "\\" == e
-                }
-                return (e == a || !d && ")" != a) && (c.tokenize = null), u("string", "string")
-            }
-        }
-
-        function x(a, b) {
-            return a.next(), a.match(/\s*[\"\')]/, !1) ? b.tokenize = null : b.tokenize = w(")"), u(null, "(")
-        }
-
-        function y(a, b, c) {
-            this.type = a, this.indent = b, this.prev = c
-        }
-
-        function z(a, b, c, d) {
-            return a.context = new y(c, b.indentation() + (d === !1 ? 0 : e), a.context), c
-        }
-
-        function A(a) {
-            return a.context.prev && (a.context = a.context.prev), a.context.type
-        }
-
-        function B(a, b, c) {
-            return E[c.context.type](a, b, c)
-        }
-
-        function C(a, b, c, d) {
-            for (var e = d || 1; e > 0; e--) c.context = c.context.prev;
-            return B(a, b, c)
-        }
-
-        function D(a) {
-            var b = a.current()
-                .toLowerCase();
-            t = p.hasOwnProperty(b) ? "atom" : o.hasOwnProperty(b) ? "keyword" : "variable"
-        }
-        var d = c;
-        c.propertyKeywords || (c = a.resolveMode("text/css")), c.inline = d.inline;
-        var s, t, e = b.indentUnit,
-            f = c.tokenHooks,
-            g = c.documentTypes || {},
-            h = c.mediaTypes || {},
-            i = c.mediaFeatures || {},
-            j = c.mediaValueKeywords || {},
-            k = c.propertyKeywords || {},
-            l = c.nonStandardPropertyKeywords || {},
-            m = c.fontProperties || {},
-            n = c.counterDescriptors || {},
-            o = c.colorKeywords || {},
-            p = c.valueKeywords || {},
-            q = c.allowNested,
-            r = c.supportsAtComponent === !0,
-            E = {};
-        return E.top = function (a, b, c) {
-            if ("{" == a) return z(c, b, "block");
-            if ("}" == a && c.context.prev) return A(c);
-            if (r && /@component/.test(a)) return z(c, b, "atComponentBlock");
-            if (/^@(-moz-)?document$/.test(a)) return z(c, b, "documentTypes");
-            if (/^@(media|supports|(-moz-)?document|import)$/.test(a)) return z(c, b, "atBlock");
-            if (/^@(font-face|counter-style)/.test(a)) return c.stateArg = a, "restricted_atBlock_before";
-            if (/^@(-(moz|ms|o|webkit)-)?keyframes$/.test(a)) return "keyframes";
-            if (a && "@" == a.charAt(0)) return z(c, b, "at");
-            if ("hash" == a) t = "builtin";
-            else if ("word" == a) t = "tag";
-            else {
-                if ("variable-definition" == a) return "maybeprop";
-                if ("interpolation" == a) return z(c, b, "interpolation");
-                if (":" == a) return "pseudo";
-                if (q && "(" == a) return z(c, b, "parens")
-            }
-            return c.context.type
-        }, E.block = function (a, b, c) {
-            if ("word" == a) {
-                var d = b.current()
-                    .toLowerCase();
-                return k.hasOwnProperty(d) ? (t = "property", "maybeprop") : l.hasOwnProperty(d) ? (t = "string-2", "maybeprop") : q ? (t = b.match(/^\s*:(?:\s|$)/, !1) ? "property" : "tag", "block") : (t += " error", "maybeprop")
-            }
-            return "meta" == a ? "block" : q || "hash" != a && "qualifier" != a ? E.top(a, b, c) : (t = "error", "block")
-        }, E.maybeprop = function (a, b, c) {
-            return ":" == a ? z(c, b, "prop") : B(a, b, c)
-        }, E.prop = function (a, b, c) {
-            if (";" == a) return A(c);
-            if ("{" == a && q) return z(c, b, "propBlock");
-            if ("}" == a || "{" == a) return C(a, b, c);
-            if ("(" == a) return z(c, b, "parens");
-            if ("hash" != a || /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/.test(b.current())) {
-                if ("word" == a) D(b);
-                else if ("interpolation" == a) return z(c, b, "interpolation")
-            } else t += " error";
-            return "prop"
-        }, E.propBlock = function (a, b, c) {
-            return "}" == a ? A(c) : "word" == a ? (t = "property", "maybeprop") : c.context.type
-        }, E.parens = function (a, b, c) {
-            return "{" == a || "}" == a ? C(a, b, c) : ")" == a ? A(c) : "(" == a ? z(c, b, "parens") : "interpolation" == a ? z(c, b, "interpolation") : ("word" == a && D(b), "parens")
-        }, E.pseudo = function (a, b, c) {
-            return "word" == a ? (t = "variable-3", c.context.type) : B(a, b, c)
-        }, E.documentTypes = function (a, b, c) {
-            return "word" == a && g.hasOwnProperty(b.current()) ? (t = "tag", c.context.type) : E.atBlock(a, b, c)
-        }, E.atBlock = function (a, b, c) {
-            if ("(" == a) return z(c, b, "atBlock_parens");
-            if ("}" == a || ";" == a) return C(a, b, c);
-            if ("{" == a) return A(c) && z(c, b, q ? "block" : "top");
-            if ("word" == a) {
-                var d = b.current()
-                    .toLowerCase();
-                t = "only" == d || "not" == d || "and" == d || "or" == d ? "keyword" : h.hasOwnProperty(d) ? "attribute" : i.hasOwnProperty(d) ? "property" : j.hasOwnProperty(d) ? "keyword" : k.hasOwnProperty(d) ? "property" : l.hasOwnProperty(d) ? "string-2" : p.hasOwnProperty(d) ? "atom" : o.hasOwnProperty(d) ? "keyword" : "error"
-            }
-            return c.context.type
-        }, E.atComponentBlock = function (a, b, c) {
-            return "}" == a ? C(a, b, c) : "{" == a ? A(c) && z(c, b, q ? "block" : "top", !1) : ("word" == a && (t = "error"), c.context.type)
-        }, E.atBlock_parens = function (a, b, c) {
-            return ")" == a ? A(c) : "{" == a || "}" == a ? C(a, b, c, 2) : E.atBlock(a, b, c)
-        }, E.restricted_atBlock_before = function (a, b, c) {
-            return "{" == a ? z(c, b, "restricted_atBlock") : "word" == a && "@counter-style" == c.stateArg ? (t = "variable", "restricted_atBlock_before") : B(a, b, c)
-        }, E.restricted_atBlock = function (a, b, c) {
-            return "}" == a ? (c.stateArg = null, A(c)) : "word" == a ? (t = "@font-face" == c.stateArg && !m.hasOwnProperty(b.current()
-                .toLowerCase()) || "@counter-style" == c.stateArg && !n.hasOwnProperty(b.current()
-                .toLowerCase()) ? "error" : "property", "maybeprop") : "restricted_atBlock"
-        }, E.keyframes = function (a, b, c) {
-            return "word" == a ? (t = "variable", "keyframes") : "{" == a ? z(c, b, "top") : B(a, b, c)
-        }, E.at = function (a, b, c) {
-            return ";" == a ? A(c) : "{" == a || "}" == a ? C(a, b, c) : ("word" == a ? t = "tag" : "hash" == a && (t = "builtin"), "at")
-        }, E.interpolation = function (a, b, c) {
-            return "}" == a ? A(c) : "{" == a || ";" == a ? C(a, b, c) : ("word" == a ? t = "variable" : "variable" != a && "(" != a && ")" != a && (t = "error"), "interpolation")
-        }, {
-            startState: function (a) {
-                return {
-                    tokenize: null,
-                    state: c.inline ? "block" : "top",
-                    stateArg: null,
-                    context: new y(c.inline ? "block" : "top", a || 0, null)
-                }
-            },
-            token: function (a, b) {
-                if (!b.tokenize && a.eatSpace()) return null;
-                var c = (b.tokenize || v)(a, b);
-                return c && "object" == typeof c && (s = c[1], c = c[0]), t = c, b.state = E[b.state](s, a, b), t
-            },
-            indent: function (a, b) {
-                var c = a.context,
-                    d = b && b.charAt(0),
-                    f = c.indent;
-                return "prop" != c.type || "}" != d && ")" != d || (c = c.prev), c.prev && ("}" != d || "block" != c.type && "top" != c.type && "interpolation" != c.type && "restricted_atBlock" != c.type ? (")" == d && ("parens" == c.type || "atBlock_parens" == c.type) || "{" == d && ("at" == c.type || "atBlock" == c.type)) && (f = Math.max(0, c.indent - e), c = c.prev) : (c = c.prev, f = c.indent)), f
-            },
-            electricChars: "}",
-            blockCommentStart: "/*",
-            blockCommentEnd: "*/",
-            fold: "brace"
-        }
-    });
-    var c = ["domain", "regexp", "url", "url-prefix"],
-        d = b(c),
-        e = ["all", "aural", "braille", "handheld", "print", "projection", "screen", "tty", "tv", "embossed"],
-        f = b(e),
-        g = ["width", "min-width", "max-width", "height", "min-height", "max-height", "device-width", "min-device-width", "max-device-width", "device-height", "min-device-height", "max-device-height", "aspect-ratio", "min-aspect-ratio", "max-aspect-ratio", "device-aspect-ratio", "min-device-aspect-ratio", "max-device-aspect-ratio", "color", "min-color", "max-color", "color-index", "min-color-index", "max-color-index", "monochrome", "min-monochrome", "max-monochrome", "resolution", "min-resolution", "max-resolution", "scan", "grid", "orientation", "device-pixel-ratio", "min-device-pixel-ratio", "max-device-pixel-ratio", "pointer", "any-pointer", "hover", "any-hover"],
-        h = b(g),
-        i = ["landscape", "portrait", "none", "coarse", "fine", "on-demand", "hover", "interlace", "progressive"],
-        j = b(i),
-        k = ["align-content", "align-items", "align-self", "alignment-adjust", "alignment-baseline", "anchor-point", "animation", "animation-delay", "animation-direction", "animation-duration", "animation-fill-mode", "animation-iteration-count", "animation-name", "animation-play-state", "animation-timing-function", "appearance", "azimuth", "backface-visibility", "background", "background-attachment", "background-clip", "background-color", "background-image", "background-origin", "background-position", "background-repeat", "background-size", "baseline-shift", "binding", "bleed", "bookmark-label", "bookmark-level", "bookmark-state", "bookmark-target", "border", "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", "bottom", "box-decoration-break", "box-shadow", "box-sizing", "break-after", "break-before", "break-inside", "caption-side", "clear", "clip", "color", "color-profile", "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", "cue-after", "cue-before", "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", "flex", "flex-basis", "flex-direction", "flex-flow", "flex-grow", "flex-shrink", "flex-wrap", "float", "float-offset", "flow-from", "flow-into", "font", "font-feature-settings", "font-family", "font-kerning", "font-language-override", "font-size", "font-size-adjust", "font-stretch", "font-style", "font-synthesis", "font-variant", "font-variant-alternates", "font-variant-caps", "font-variant-east-asian", "font-variant-ligatures", "font-variant-numeric", "font-variant-position", "font-weight", "grid", "grid-area", "grid-auto-columns", "grid-auto-flow", "grid-auto-position", "grid-auto-rows", "grid-column", "grid-column-end", "grid-column-start", "grid-row", "grid-row-end", "grid-row-start", "grid-template", "grid-template-areas", "grid-template-columns", "grid-template-rows", "hanging-punctuation", "height", "hyphens", "icon", "image-orientation", "image-rendering", "image-resolution", "inline-box-align", "justify-content", "left", "letter-spacing", "line-break", "line-height", "line-stacking", "line-stacking-ruby", "line-stacking-shift", "line-stacking-strategy", "list-style", "list-style-image", "list-style-position", "list-style-type", "margin", "margin-bottom", "margin-left", "margin-right", "margin-top", "marker-offset", "marks", "marquee-direction", "marquee-loop", "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", "object-fit", "object-position", "opacity", "order", "orphans", "outline", "outline-color", "outline-offset", "outline-style", "outline-width", "overflow", "overflow-style", "overflow-wrap", "overflow-x", "overflow-y", "padding", "padding-bottom", "padding-left", "padding-right", "padding-top", "page", "page-break-after", "page-break-before", "page-break-inside", "page-policy", "pause", "pause-after", "pause-before", "perspective", "perspective-origin", "pitch", "pitch-range", "play-during", "position", "presentation-level", "punctuation-trim", "quotes", "region-break-after", "region-break-before", "region-break-inside", "region-fragment", "rendering-intent", "resize", "rest", "rest-after", "rest-before", "richness", "right", "rotation", "rotation-point", "ruby-align", "ruby-overhang", "ruby-position", "ruby-span", "shape-image-threshold", "shape-inside", "shape-margin", "shape-outside", "size", "speak", "speak-as", "speak-header", "speak-numeral", "speak-punctuation", "speech-rate", "stress", "string-set", "tab-size", "table-layout", "target", "target-name", "target-new", "target-position", "text-align", "text-align-last", "text-decoration", "text-decoration-color", "text-decoration-line", "text-decoration-skip", "text-decoration-style", "text-emphasis", "text-emphasis-color", "text-emphasis-position", "text-emphasis-style", "text-height", "text-indent", "text-justify", "text-outline", "text-overflow", "text-shadow", "text-size-adjust", "text-space-collapse", "text-transform", "text-underline-position", "text-wrap", "top", "transform", "transform-origin", "transform-style", "transition", "transition-delay", "transition-duration", "transition-property", "transition-timing-function", "unicode-bidi", "vertical-align", "visibility", "voice-balance", "voice-duration", "voice-family", "voice-pitch", "voice-range", "voice-rate", "voice-stress", "voice-volume", "volume", "white-space", "widows", "width", "word-break", "word-spacing", "word-wrap", "z-index", "clip-path", "clip-rule", "mask", "enable-background", "filter", "flood-color", "flood-opacity", "lighting-color", "stop-color", "stop-opacity", "pointer-events", "color-interpolation", "color-interpolation-filters", "color-rendering", "fill", "fill-opacity", "fill-rule", "image-rendering", "marker", "marker-end", "marker-mid", "marker-start", "shape-rendering", "stroke", "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin", "stroke-miterlimit", "stroke-opacity", "stroke-width", "text-rendering", "baseline-shift", "dominant-baseline", "glyph-orientation-horizontal", "glyph-orientation-vertical", "text-anchor", "writing-mode"],
-        l = b(k),
-        m = ["scrollbar-arrow-color", "scrollbar-base-color", "scrollbar-dark-shadow-color", "scrollbar-face-color", "scrollbar-highlight-color", "scrollbar-shadow-color", "scrollbar-3d-light-color", "scrollbar-track-color", "shape-inside", "searchfield-cancel-button", "searchfield-decoration", "searchfield-results-button", "searchfield-results-decoration", "zoom"],
-        n = b(m),
-        o = ["font-family", "src", "unicode-range", "font-variant", "font-feature-settings", "font-stretch", "font-weight", "font-style"],
-        p = b(o),
-        q = ["additive-symbols", "fallback", "negative", "pad", "prefix", "range", "speak-as", "suffix", "symbols", "system"],
-        r = b(q),
-        s = ["aliceblue", "antiquewhite", "aqua", "aquamarine", "azure", "beige", "bisque", "black", "blanchedalmond", "blue", "blueviolet", "brown", "burlywood", "cadetblue", "chartreuse", "chocolate", "coral", "cornflowerblue", "cornsilk", "crimson", "cyan", "darkblue", "darkcyan", "darkgoldenrod", "darkgray", "darkgreen", "darkkhaki", "darkmagenta", "darkolivegreen", "darkorange", "darkorchid", "darkred", "darksalmon", "darkseagreen", "darkslateblue", "darkslategray", "darkturquoise", "darkviolet", "deeppink", "deepskyblue", "dimgray", "dodgerblue", "firebrick", "floralwhite", "forestgreen", "fuchsia", "gainsboro", "ghostwhite", "gold", "goldenrod", "gray", "grey", "green", "greenyellow", "honeydew", "hotpink", "indianred", "indigo", "ivory", "khaki", "lavender", "lavenderblush", "lawngreen", "lemonchiffon", "lightblue", "lightcoral", "lightcyan", "lightgoldenrodyellow", "lightgray", "lightgreen", "lightpink", "lightsalmon", "lightseagreen", "lightskyblue", "lightslategray", "lightsteelblue", "lightyellow", "lime", "limegreen", "linen", "magenta", "maroon", "mediumaquamarine", "mediumblue", "mediumorchid", "mediumpurple", "mediumseagreen", "mediumslateblue", "mediumspringgreen", "mediumturquoise", "mediumvioletred", "midnightblue", "mintcream", "mistyrose", "moccasin", "navajowhite", "navy", "oldlace", "olive", "olivedrab", "orange", "orangered", "orchid", "palegoldenrod", "palegreen", "paleturquoise", "palevioletred", "papayawhip", "peachpuff", "peru", "pink", "plum", "powderblue", "purple", "rebeccapurple", "red", "rosybrown", "royalblue", "saddlebrown", "salmon", "sandybrown", "seagreen", "seashell", "sienna", "silver", "skyblue", "slateblue", "slategray", "snow", "springgreen", "steelblue", "tan", "teal", "thistle", "tomato", "turquoise", "violet", "wheat", "white", "whitesmoke", "yellow", "yellowgreen"],
-        t = b(s),
-        u = ["above", "absolute", "activeborder", "additive", "activecaption", "afar", "after-white-space", "ahead", "alias", "all", "all-scroll", "alphabetic", "alternate", "always", "amharic", "amharic-abegede", "antialiased", "appworkspace", "arabic-indic", "armenian", "asterisks", "attr", "auto", "avoid", "avoid-column", "avoid-page", "avoid-region", "background", "backwards", "baseline", "below", "bidi-override", "binary", "bengali", "blink", "block", "block-axis", "bold", "bolder", "border", "border-box", "both", "bottom", "break", "break-all", "break-word", "bullets", "button", "button-bevel", "buttonface", "buttonhighlight", "buttonshadow", "buttontext", "calc", "cambodian", "capitalize", "caps-lock-indicator", "caption", "captiontext", "caret", "cell", "center", "checkbox", "circle", "cjk-decimal", "cjk-earthly-branch", "cjk-heavenly-stem", "cjk-ideographic", "clear", "clip", "close-quote", "col-resize", "collapse", "column", "column-reverse", "compact", "condensed", "contain", "content", "content-box", "context-menu", "continuous", "copy", "counter", "counters", "cover", "crop", "cross", "crosshair", "currentcolor", "cursive", "cyclic", "dashed", "decimal", "decimal-leading-zero", "default", "default-button", "destination-atop", "destination-in", "destination-out", "destination-over", "devanagari", "disc", "discard", "disclosure-closed", "disclosure-open", "document", "dot-dash", "dot-dot-dash", "dotted", "double", "down", "e-resize", "ease", "ease-in", "ease-in-out", "ease-out", "element", "ellipse", "ellipsis", "embed", "end", "ethiopic", "ethiopic-abegede", "ethiopic-abegede-am-et", "ethiopic-abegede-gez", "ethiopic-abegede-ti-er", "ethiopic-abegede-ti-et", "ethiopic-halehame-aa-er", "ethiopic-halehame-aa-et", "ethiopic-halehame-am-et", "ethiopic-halehame-gez", "ethiopic-halehame-om-et", "ethiopic-halehame-sid-et", "ethiopic-halehame-so-et", "ethiopic-halehame-ti-er", "ethiopic-halehame-ti-et", "ethiopic-halehame-tig", "ethiopic-numeric", "ew-resize", "expanded", "extends", "extra-condensed", "extra-expanded", "fantasy", "fast", "fill", "fixed", "flat", "flex", "flex-end", "flex-start", "footnotes", "forwards", "from", "geometricPrecision", "georgian", "graytext", "groove", "gujarati", "gurmukhi", "hand", "hangul", "hangul-consonant", "hebrew", "help", "hidden", "hide", "higher", "highlight", "highlighttext", "hiragana", "hiragana-iroha", "horizontal", "hsl", "hsla", "icon", "ignore", "inactiveborder", "inactivecaption", "inactivecaptiontext", "infinite", "infobackground", "infotext", "inherit", "initial", "inline", "inline-axis", "inline-block", "inline-flex", "inline-table", "inset", "inside", "intrinsic", "invert", "italic", "japanese-formal", "japanese-informal", "justify", "kannada", "katakana", "katakana-iroha", "keep-all", "khmer", "korean-hangul-formal", "korean-hanja-formal", "korean-hanja-informal", "landscape", "lao", "large", "larger", "left", "level", "lighter", "line-through", "linear", "linear-gradient", "lines", "list-item", "listbox", "listitem", "local", "logical", "loud", "lower", "lower-alpha", "lower-armenian", "lower-greek", "lower-hexadecimal", "lower-latin", "lower-norwegian", "lower-roman", "lowercase", "ltr", "malayalam", "match", "matrix", "matrix3d", "media-controls-background", "media-current-time-display", "media-fullscreen-button", "media-mute-button", "media-play-button", "media-return-to-realtime-button", "media-rewind-button", "media-seek-back-button", "media-seek-forward-button", "media-slider", "media-sliderthumb", "media-time-remaining-display", "media-volume-slider", "media-volume-slider-container", "media-volume-sliderthumb", "medium", "menu", "menulist", "menulist-button", "menulist-text", "menulist-textfield", "menutext", "message-box", "middle", "min-intrinsic", "mix", "mongolian", "monospace", "move", "multiple", "myanmar", "n-resize", "narrower", "ne-resize", "nesw-resize", "no-close-quote", "no-drop", "no-open-quote", "no-repeat", "none", "normal", "not-allowed", "nowrap", "ns-resize", "numbers", "numeric", "nw-resize", "nwse-resize", "oblique", "octal", "open-quote", "optimizeLegibility", "optimizeSpeed", "oriya", "oromo", "outset", "outside", "outside-shape", "overlay", "overline", "padding", "padding-box", "painted", "page", "paused", "persian", "perspective", "plus-darker", "plus-lighter", "pointer", "polygon", "portrait", "pre", "pre-line", "pre-wrap", "preserve-3d", "progress", "push-button", "radial-gradient", "radio", "read-only", "read-write", "read-write-plaintext-only", "rectangle", "region", "relative", "repeat", "repeating-linear-gradient", "repeating-radial-gradient", "repeat-x", "repeat-y", "reset", "reverse", "rgb", "rgba", "ridge", "right", "rotate", "rotate3d", "rotateX", "rotateY", "rotateZ", "round", "row", "row-resize", "row-reverse", "rtl", "run-in", "running", "s-resize", "sans-serif", "scale", "scale3d", "scaleX", "scaleY", "scaleZ", "scroll", "scrollbar", "se-resize", "searchfield", "searchfield-cancel-button", "searchfield-decoration", "searchfield-results-button", "searchfield-results-decoration", "semi-condensed", "semi-expanded", "separate", "serif", "show", "sidama", "simp-chinese-formal", "simp-chinese-informal", "single", "skew", "skewX", "skewY", "skip-white-space", "slide", "slider-horizontal", "slider-vertical", "sliderthumb-horizontal", "sliderthumb-vertical", "slow", "small", "small-caps", "small-caption", "smaller", "solid", "somali", "source-atop", "source-in", "source-out", "source-over", "space", "space-around", "space-between", "spell-out", "square", "square-button", "start", "static", "status-bar", "stretch", "stroke", "sub", "subpixel-antialiased", "super", "sw-resize", "symbolic", "symbols", "table", "table-caption", "table-cell", "table-column", "table-column-group", "table-footer-group", "table-header-group", "table-row", "table-row-group", "tamil", "telugu", "text", "text-bottom", "text-top", "textarea", "textfield", "thai", "thick", "thin", "threeddarkshadow", "threedface", "threedhighlight", "threedlightshadow", "threedshadow", "tibetan", "tigre", "tigrinya-er", "tigrinya-er-abegede", "tigrinya-et", "tigrinya-et-abegede", "to", "top", "trad-chinese-formal", "trad-chinese-informal", "translate", "translate3d", "translateX", "translateY", "translateZ", "transparent", "ultra-condensed", "ultra-expanded", "underline", "up", "upper-alpha", "upper-armenian", "upper-greek", "upper-hexadecimal", "upper-latin", "upper-norwegian", "upper-roman", "uppercase", "urdu", "url", "var", "vertical", "vertical-text", "visible", "visibleFill", "visiblePainted", "visibleStroke", "visual", "w-resize", "wait", "wave", "wider", "window", "windowframe", "windowtext", "words", "wrap", "wrap-reverse", "x-large", "x-small", "xor", "xx-large", "xx-small"],
-        v = b(u),
-        w = c.concat(e)
-        .concat(g)
-        .concat(i)
-        .concat(k)
-        .concat(m)
-        .concat(s)
-        .concat(u);
-    a.registerHelper("hintWords", "css", w), a.defineMIME("text/css", {
-        documentTypes: d,
-        mediaTypes: f,
-        mediaFeatures: h,
-        mediaValueKeywords: j,
-        propertyKeywords: l,
-        nonStandardPropertyKeywords: n,
-        fontProperties: p,
-        counterDescriptors: r,
-        colorKeywords: t,
-        valueKeywords: v,
-        tokenHooks: {
-            "/": function (a, b) {
-                return a.eat("*") ? (b.tokenize = x, x(a, b)) : !1
-            }
-        },
-        name: "css"
-    }), a.defineMIME("text/x-scss", {
-        mediaTypes: f,
-        mediaFeatures: h,
-        mediaValueKeywords: j,
-        propertyKeywords: l,
-        nonStandardPropertyKeywords: n,
-        colorKeywords: t,
-        valueKeywords: v,
-        fontProperties: p,
-        allowNested: !0,
-        tokenHooks: {
-            "/": function (a, b) {
-                return a.eat("/") ? (a.skipToEnd(), ["comment", "comment"]) : a.eat("*") ? (b.tokenize = x, x(a, b)) : ["operator", "operator"]
-            },
-            ":": function (a) {
-                return a.match(/\s*\{/) ? [null, "{"] : !1
-            },
-            $: function (a) {
-                return a.match(/^[\w-]+/), a.match(/^\s*:/, !1) ? ["variable-2", "variable-definition"] : ["variable-2", "variable"]
-            },
-            "#": function (a) {
-                return a.eat("{") ? [null, "interpolation"] : !1
-            }
-        },
-        name: "css",
-        helperType: "scss"
-    }), a.defineMIME("text/x-less", {
-        mediaTypes: f,
-        mediaFeatures: h,
-        mediaValueKeywords: j,
-        propertyKeywords: l,
-        nonStandardPropertyKeywords: n,
-        colorKeywords: t,
-        valueKeywords: v,
-        fontProperties: p,
-        allowNested: !0,
-        tokenHooks: {
-            "/": function (a, b) {
-                return a.eat("/") ? (a.skipToEnd(), ["comment", "comment"]) : a.eat("*") ? (b.tokenize = x, x(a, b)) : ["operator", "operator"]
-            },
-            "@": function (a) {
-                return a.eat("{") ? [null, "interpolation"] : a.match(/^(charset|document|font-face|import|(-(moz|ms|o|webkit)-)?keyframes|media|namespace|page|supports)\b/, !1) ? !1 : (a.eatWhile(/[\w\\\-]/), a.match(/^\s*:/, !1) ? ["variable-2", "variable-definition"] : ["variable-2", "variable"])
-            },
-            "&": function () {
-                return ["atom", "atom"]
-            }
-        },
-        name: "css",
-        helperType: "less"
-    }), a.defineMIME("text/x-gss", {
-        documentTypes: d,
-        mediaTypes: f,
-        mediaFeatures: h,
-        propertyKeywords: l,
-        nonStandardPropertyKeywords: n,
-        fontProperties: p,
-        counterDescriptors: r,
-        colorKeywords: t,
-        valueKeywords: v,
-        supportsAtComponent: !0,
-        tokenHooks: {
-            "/": function (a, b) {
-                return a.eat("*") ? (b.tokenize = x, x(a, b)) : !1
-            }
-        },
-        name: "css",
-        helperType: "gss"
-    })
-}),
-function (a) {
-    "object" == typeof exports && "object" == typeof module ? a(require("../../lib/codemirror"), require("../xml/xml"), require("../javascript/javascript"), require("../css/css")) : "function" == typeof define && define.amd ? define(["../../lib/codemirror", "../xml/xml", "../javascript/javascript", "../css/css"], a) : a(CodeMirror)
-}(function (a) {
-    "use strict";
-
-    function c(a, b, c) {
-        var d = a.current(),
-            e = d.search(b);
-        return e > -1 ? a.backUp(d.length - e) : d.match(/<\/?$/) && (a.backUp(d.length), a.match(b, !1) || a.match(d)), c
-    }
-
-    function e(a) {
-        var b = d[a];
-        return b ? b : d[a] = new RegExp("\\s+" + a + "\\s*=\\s*('|\")?([^'\"]+)('|\")?\\s*")
-    }
-
-    function f(a, b) {
-        for (var d, c = a.pos; c >= 0 && "<" !== a.string.charAt(c);) c--;
-        return 0 > c ? c : (d = a.string.slice(c, a.pos)
-            .match(e(b))) ? d[2] : ""
-    }
-
-    function g(a, b) {
-        return new RegExp((b ? "^" : "") + "</s*" + a + "s*>", "i")
-    }
-
-    function h(a, b) {
-        for (var c in a)
-            for (var d = b[c] || (b[c] = []), e = a[c], f = e.length - 1; f >= 0; f--) d.unshift(e[f])
-    }
-
-    function i(a, b) {
-        for (var c = 0; c < a.length; c++) {
-            var d = a[c];
-            if (!d[0] || d[1].test(f(b, d[0]))) return d[2]
-        }
-    }
-    var b = {
-            script: [["lang", /(javascript|babel)/i, "javascript"], ["type", /^(?:text|application)\/(?:x-)?(?:java|ecma)script$|^$/i, "javascript"], ["type", /./, "text/plain"], [null, null, "javascript"]],
-            style: [["lang", /^css$/i, "css"], ["type", /^(text\/)?(x-)?(stylesheet|css)$/i, "css"], ["type", /./, "text/plain"], [null, null, "css"]]
-        },
-        d = {};
-    a.defineMode("htmlmixed", function (d, e) {
-        function n(b, e) {
-            var m, h = e.htmlState.tagName,
-                k = h && j[h.toLowerCase()],
-                l = f.token(b, e.htmlState);
-            if (k && /\btag\b/.test(l) && ">" === b.current() && (m = i(k, b))) {
-                var o = a.getMode(d, m),
-                    p = g(h, !0),
-                    q = g(h, !1);
-                e.token = function (a, b) {
-                    return a.match(p, !1) ? (b.token = n, b.localState = b.localMode = null, null) : c(a, q, b.localMode.token(a, b.localState))
-                }, e.localMode = o, e.localState = a.startState(o, f.indent(e.htmlState, ""))
-            }
-            return l
-        }
-        var f = a.getMode(d, {
-                name: "xml",
-                htmlMode: !0,
-                multilineTagIndentFactor: e.multilineTagIndentFactor,
-                multilineTagIndentPastTag: e.multilineTagIndentPastTag
-            }),
-            j = {},
-            k = e && e.tags,
-            l = e && e.scriptTypes;
-        if (h(b, j), k && h(k, j), l)
-            for (var m = l.length - 1; m >= 0; m--) j.script.unshift(["type", l[m].matches, l[m].mode]);
-        return {
-            startState: function () {
-                var a = f.startState();
-                return {
-                    token: n,
-                    localMode: null,
-                    localState: null,
-                    htmlState: a
-                }
-            },
-            copyState: function (b) {
-                var c;
-                return b.localState && (c = a.copyState(b.localMode, b.localState)), {
-                    token: b.token,
-                    localMode: b.localMode,
-                    localState: c,
-                    htmlState: a.copyState(f, b.htmlState)
-                }
-            },
-            token: function (a, b) {
-                return b.token(a, b)
-            },
-            indent: function (b, c) {
-                return !b.localMode || /^\s*<\//.test(c) ? f.indent(b.htmlState, c) : b.localMode.indent ? b.localMode.indent(b.localState, c) : a.Pass
-            },
-            innerMode: function (a) {
-                return {
-                    state: a.localState || a.htmlState,
-                    mode: a.localMode || f
-                }
-            }
-        }
-    }, "xml", "javascript", "css"), a.defineMIME("text/html", "htmlmixed")
-}),
-function (a) {
-    "object" == typeof exports && "object" == typeof module ? a(require("../../lib/codemirror")) : "function" == typeof define && define.amd ? define(["../../lib/codemirror"], a) : a(CodeMirror)
-}(function (a) {
-    "use strict";
-    a.defineMode("javascript", function (b, c) {
-            function m(a) {
-                for (var c, b = !1, d = !1; null != (c = a.next());) {
-                    if (!b) {
-                        if ("/" == c && !d) return;
-                        "[" == c ? d = !0 : d && "]" == c && (d = !1)
-                    }
-                    b = !b && "\\" == c
-                }
-            }
-
-            function p(a, b, c) {
-                return n = a, o = c, b
-            }
-
-            function q(a, b) {
-                var c = a.next();
-                if ('"' == c || "'" == c) return b.tokenize = r(c), b.tokenize(a, b);
-                if ("." == c && a.match(/^\d+(?:[eE][+\-]?\d+)?/)) return p("number", "number");
-                if ("." == c && a.match("..")) return p("spread", "meta");
-                if (/[\[\]{}\(\),;\:\.]/.test(c)) return p(c);
-                if ("=" == c && a.eat(">")) return p("=>", "operator");
-                if ("0" == c && a.eat(/x/i)) return a.eatWhile(/[\da-f]/i), p("number", "number");
-                if (/\d/.test(c)) return a.match(/^\d*(?:\.\d*)?(?:[eE][+\-]?\d+)?/), p("number", "number");
-                if ("/" == c) return a.eat("*") ? (b.tokenize = s, s(a, b)) : a.eat("/") ? (a.skipToEnd(), p("comment", "comment")) : "operator" == b.lastType || "keyword c" == b.lastType || "sof" == b.lastType || /^[\[{}\(,;:]$/.test(b.lastType) ? (m(a), a.match(/^\b(([gimyu])(?![gimyu]*\2))+\b/), p("regexp", "string-2")) : (a.eatWhile(k), p("operator", "operator", a.current()));
-                if ("`" == c) return b.tokenize = t, t(a, b);
-                if ("#" == c) return a.skipToEnd(), p("error", "error");
-                if (k.test(c)) return a.eatWhile(k), p("operator", "operator", a.current());
-                if (i.test(c)) {
-                    a.eatWhile(i);
-                    var d = a.current(),
-                        e = j.propertyIsEnumerable(d) && j[d];
-                    return e && "." != b.lastType ? p(e.type, e.style, d) : p("variable", "variable", d)
-                }
-            }
-
-            function r(a) {
-                return function (b, c) {
-                    var e, d = !1;
-                    if (f && "@" == b.peek() && b.match(l)) return c.tokenize = q, p("jsonld-keyword", "meta");
-                    for (; null != (e = b.next()) && (e != a || d);) d = !d && "\\" == e;
-                    return d || (c.tokenize = q), p("string", "string")
-                }
-            }
-
-            function s(a, b) {
-                for (var d, c = !1; d = a.next();) {
-                    if ("/" == d && c) {
-                        b.tokenize = q;
-                        break
-                    }
-                    c = "*" == d
-                }
-                return p("comment", "comment")
-            }
-
-            function t(a, b) {
-                for (var d, c = !1; null != (d = a.next());) {
-                    if (!c && ("`" == d || "$" == d && a.eat("{"))) {
-                        b.tokenize = q;
-                        break
-                    }
-                    c = !c && "\\" == d
-                }
-                return p("quasi", "string-2", a.current())
-            }
-
-            function v(a, b) {
-                b.fatArrowAt && (b.fatArrowAt = null);
-                var c = a.string.indexOf("=>", a.start);
-                if (!(0 > c)) {
-                    for (var d = 0, e = !1, f = c - 1; f >= 0; --f) {
-                        var g = a.string.charAt(f),
-                            h = u.indexOf(g);
-                        if (h >= 0 && 3 > h) {
-                            if (!d) {
-                                ++f;
-                                break
-                            }
-                            if (0 == --d) break
-                        } else if (h >= 3 && 6 > h) ++d;
-                        else if (i.test(g)) e = !0;
-                        else {
-                            if (/["'\/]/.test(g)) return;
-                            if (e && !d) {
-                                ++f;
-                                break
-                            }
-                        }
-                    }
-                    e && !d && (b.fatArrowAt = f)
-                }
-            }
-
-            function x(a, b, c, d, e, f) {
-                this.indented = a, this.column = b, this.type = c, this.prev = e, this.info = f, null != d && (this.align = d)
-            }
-
-            function y(a, b) {
-                for (var c = a.localVars; c; c = c.next)
-                    if (c.name == b) return !0;
-                for (var d = a.context; d; d = d.prev)
-                    for (var c = d.vars; c; c = c.next)
-                        if (c.name == b) return !0
-            }
-
-            function z(a, b, c, d, e) {
-                var f = a.cc;
-                for (A.state = a, A.stream = e, A.marked = null, A.cc = f, A.style = b, a.lexical.hasOwnProperty("align") || (a.lexical.align = !0);;) {
-                    var h = f.length ? f.pop() : g ? L : K;
-                    if (h(c, d)) {
-                        for (; f.length && f[f.length - 1].lex;) f.pop()();
-                        return A.marked ? A.marked : "variable" == c && y(a, d) ? "variable-2" : b
-                    }
-                }
-            }
-
-            function B() {
-                for (var a = arguments.length - 1; a >= 0; a--) A.cc.push(arguments[a])
-            }
-
-            function C() {
-                return B.apply(null, arguments), !0
-            }
-
-            function D(a) {
-                function b(b) {
-                    for (var c = b; c; c = c.next)
-                        if (c.name == a) return !0;
-                    return !1
-                }
-                var d = A.state;
-                if (d.context) {
-                    if (A.marked = "def", b(d.localVars)) return;
-                    d.localVars = {
-                        name: a,
-                        next: d.localVars
-                    }
-                } else {
-                    if (b(d.globalVars)) return;
-                    c.globalVars && (d.globalVars = {
-                        name: a,
-                        next: d.globalVars
-                    })
-                }
-            }
-
-            function F() {
-                A.state.context = {
-                    prev: A.state.context,
-                    vars: A.state.localVars
-                }, A.state.localVars = E
-            }
-
-            function G() {
-                A.state.localVars = A.state.context.vars, A.state.context = A.state.context.prev
-            }
-
-            function H(a, b) {
-                var c = function () {
-                    var c = A.state,
-                        d = c.indented;
-                    if ("stat" == c.lexical.type) d = c.lexical.indented;
-                    else
-                        for (var e = c.lexical; e && ")" == e.type && e.align; e = e.prev) d = e.indented;
-                    c.lexical = new x(d, A.stream.column(), a, null, c.lexical, b)
-                };
-                return c.lex = !0, c
-            }
-
-            function I() {
-                var a = A.state;
-                a.lexical.prev && (")" == a.lexical.type && (a.indented = a.lexical.indented), a.lexical = a.lexical.prev)
-            }
-
-            function J(a) {
-                function b(c) {
-                    return c == a ? C() : ";" == a ? B() : C(b)
-                }
-                return b
-            }
-
-            function K(a, b) {
-                return "var" == a ? C(H("vardef", b.length), fa, J(";"), I) : "keyword a" == a ? C(H("form"), L, K, I) : "keyword b" == a ? C(H("form"), K, I) : "{" == a ? C(H("}"), ba, I) : ";" == a ? C() : "if" == a ? ("else" == A.state.lexical.info && A.state.cc[A.state.cc.length - 1] == I && A.state.cc.pop()(), C(H("form"), L, K, I, ka)) : "function" == a ? C(qa) : "for" == a ? C(H("form"), la, K, I) : "variable" == a ? C(H("stat"), W) : "switch" == a ? C(H("form"), L, H("}", "switch"), J("{"), ba, I, I) : "case" == a ? C(L, J(":")) : "default" == a ? C(J(":")) : "catch" == a ? C(H("form"), F, J("("), ra, J(")"), K, I, G) : "class" == a ? C(H("form"), sa, I) : "export" == a ? C(H("form"), wa, I) : "import" == a ? C(H("form"), xa, I) : B(H("stat"), L, J(";"), I)
-            }
-
-            function L(a) {
-                return N(a, !1)
-            }
-
-            function M(a) {
-                return N(a, !0)
-            }
-
-            function N(a, b) {
-                if (A.state.fatArrowAt == A.stream.start) {
-                    var c = b ? V : U;
-                    if ("(" == a) return C(F, H(")"), _(ga, ")"), I, J("=>"), c, G);
-                    if ("variable" == a) return B(F, ga, J("=>"), c, G)
-                }
-                var d = b ? R : Q;
-                return w.hasOwnProperty(a) ? C(d) : "async" == a ? C(L) : "function" == a ? C(qa, d) : "keyword c" == a ? C(b ? P : O) : "(" == a ? C(H(")"), O, Da, J(")"), I, d) : "operator" == a || "spread" == a ? C(b ? M : L) : "[" == a ? C(H("]"), Ba, I, d) : "{" == a ? aa(Y, "}", null, d) : "quasi" == a ? B(S, d) : C()
-            }
-
-            function O(a) {
-                return a.match(/[;\}\)\],]/) ? B() : B(L)
-            }
-
-            function P(a) {
-                return a.match(/[;\}\)\],]/) ? B() : B(M)
-            }
-
-            function Q(a, b) {
-                return "," == a ? C(L) : R(a, b, !1)
-            }
-
-            function R(a, b, c) {
-                var d = 0 == c ? Q : R,
-                    e = 0 == c ? L : M;
-                return "=>" == a ? C(F, c ? V : U, G) : "operator" == a ? /\+\+|--/.test(b) ? C(d) : "?" == b ? C(L, J(":"), e) : C(e) : "quasi" == a ? B(S, d) : ";" != a ? "(" == a ? aa(M, ")", "call", d) : "." == a ? C(X, d) : "[" == a ? C(H("]"), O, J("]"), I, d) : void 0 : void 0
-            }
-
-            function S(a, b) {
-                return "quasi" != a ? B() : "${" != b.slice(b.length - 2) ? C(S) : C(L, T)
-            }
-
-            function T(a) {
-                return "}" == a ? (A.marked = "string-2", A.state.tokenize = t, C(S)) : void 0
-            }
-
-            function U(a) {
-                return v(A.stream, A.state), B("{" == a ? K : L)
-            }
-
-            function V(a) {
-                return v(A.stream, A.state), B("{" == a ? K : M)
-            }
-
-            function W(a) {
-                return ":" == a ? C(I, K) : B(Q, J(";"), I)
-            }
-
-            function X(a) {
-                return "variable" == a ? (A.marked = "property", C()) : void 0
-            }
-
-            function Y(a, b) {
-                return "async" == a ? C(Y) : "variable" == a || "keyword" == A.style ? (A.marked = "property", C("get" == b || "set" == b ? Z : $)) : "number" == a || "string" == a ? (A.marked = f ? "property" : A.style + " property", C($)) : "jsonld-keyword" == a ? C($) : "[" == a ? C(L, J("]"), $) : void 0
-            }
-
-            function Z(a) {
-                return "variable" != a ? B($) : (A.marked = "property", C(qa))
-            }
-
-            function $(a) {
-                return ":" == a ? C(M) : "(" == a ? B(qa) : void 0
-            }
-
-            function _(a, b) {
-                function c(d) {
-                    if ("," == d) {
-                        var e = A.state.lexical;
-                        return "call" == e.info && (e.pos = (e.pos || 0) + 1), C(a, c)
-                    }
-                    return d == b ? C() : C(J(b))
-                }
-                return function (d) {
-                    return d == b ? C() : B(a, c)
-                }
-            }
-
-            function aa(a, b, c) {
-                for (var d = 3; d < arguments.length; d++) A.cc.push(arguments[d]);
-                return C(H(b, c), _(a, b), I)
-            }
-
-            function ba(a) {
-                return "}" == a ? C() : B(K, ba)
-            }
-
-            function ca(a) {
-                return h && ":" == a ? C(ea) : void 0
-            }
-
-            function da(a, b) {
-                return "=" == b ? C(M) : void 0
-            }
-
-            function ea(a) {
-                return "variable" == a ? (A.marked = "variable-3", C()) : void 0
-            }
-
-            function fa() {
-                return B(ga, ca, ia, ja)
-            }
-
-            function ga(a, b) {
-                return "variable" == a ? (D(b), C()) : "[" == a ? aa(ga, "]") : "{" == a ? aa(ha, "}") : void 0
-            }
-
-            function ha(a, b) {
-                return "variable" != a || A.stream.match(/^\s*:/, !1) ? ("variable" == a && (A.marked = "property"), C(J(":"), ga, ia)) : (D(b), C(ia))
-            }
-
-            function ia(a, b) {
-                return "=" == b ? C(M) : void 0
-            }
-
-            function ja(a) {
-                return "," == a ? C(fa) : void 0
-            }
-
-            function ka(a, b) {
-                return "keyword b" == a && "else" == b ? C(H("form", "else"), K, I) : void 0
-            }
-
-            function la(a) {
-                return "(" == a ? C(H(")"), ma, J(")"), I) : void 0
-            }
-
-            function ma(a) {
-                return "var" == a ? C(fa, J(";"), oa) : ";" == a ? C(oa) : "variable" == a ? C(na) : B(L, J(";"), oa)
-            }
-
-            function na(a, b) {
-                return "in" == b || "of" == b ? (A.marked = "keyword", C(L)) : C(Q, oa)
-            }
-
-            function oa(a, b) {
-                return ";" == a ? C(pa) : "in" == b || "of" == b ? (A.marked = "keyword", C(L)) : B(L, J(";"), pa)
-            }
-
-            function pa(a) {
-                ")" != a && C(L)
-            }
-
-            function qa(a, b) {
-                return "*" == b ? (A.marked = "keyword", C(qa)) : "variable" == a ? (D(b), C(qa)) : "(" == a ? C(F, H(")"), _(ra, ")"), I, K, G) : void 0
-            }
-
-            function ra(a) {
-                return "spread" == a ? C(ra) : B(ga, ca, da)
-            }
-
-            function sa(a, b) {
-                return "variable" == a ? (D(b), C(ta)) : void 0
-            }
-
-            function ta(a, b) {
-                return "extends" == b ? C(L, ta) : "{" == a ? C(H("}"), ua, I) : void 0
-            }
-
-            function ua(a, b) {
-                return "variable" == a || "keyword" == A.style ? "static" == b ? (A.marked = "keyword", C(ua)) : (A.marked = "property", "get" == b || "set" == b ? C(va, qa, ua) : C(qa, ua)) : "*" == b ? (A.marked = "keyword", C(ua)) : ";" == a ? C(ua) : "}" == a ? C() : void 0
-            }
-
-            function va(a) {
-                return "variable" != a ? B() : (A.marked = "property", C())
-            }
-
-            function wa(a, b) {
-                return "*" == b ? (A.marked = "keyword", C(Aa, J(";"))) : "default" == b ? (A.marked = "keyword", C(L, J(";"))) : B(K)
-            }
-
-            function xa(a) {
-                return "string" == a ? C() : B(ya, Aa)
-            }
-
-            function ya(a, b) {
-                return "{" == a ? aa(ya, "}") : ("variable" == a && D(b), "*" == b && (A.marked = "keyword"), C(za))
-            }
-
-            function za(a, b) {
-                return "as" == b ? (A.marked = "keyword", C(ya)) : void 0
-            }
-
-            function Aa(a, b) {
-                return "from" == b ? (A.marked = "keyword", C(L)) : void 0
-            }
-
-            function Ba(a) {
-                return "]" == a ? C() : B(M, Ca)
-            }
-
-            function Ca(a) {
-                return "for" == a ? B(Da, J("]")) : "," == a ? C(_(P, "]")) : B(_(M, "]"))
-            }
-
-            function Da(a) {
-                return "for" == a ? C(la, Da) : "if" == a ? C(L, Da) : void 0
-            }
-
-            function Ea(a, b) {
-                return "operator" == a.lastType || "," == a.lastType || k.test(b.charAt(0)) || /[,.]/.test(b.charAt(0))
-            }
-            var n, o, d = b.indentUnit,
-                e = c.statementIndent,
-                f = c.jsonld,
-                g = c.json || f,
-                h = c.typescript,
-                i = c.wordCharacters || /[\w$\xa1-\uffff]/,
-                j = function () {
-                    function a(a) {
-                        return {
-                            type: a,
-                            style: "keyword"
-                        }
-                    }
-                    var b = a("keyword a"),
-                        c = a("keyword b"),
-                        d = a("keyword c"),
-                        e = a("operator"),
-                        f = {
-                            type: "atom",
-                            style: "atom"
-                        },
-                        g = {
-                            "if": a("if"),
-                            "while": b,
-                            "with": b,
-                            "else": c,
-                            "do": c,
-                            "try": c,
-                            "finally": c,
-                            "return": d,
-                            "break": d,
-                            "continue": d,
-                            "new": d,
-                            "delete": d,
-                            "throw": d,
-                            "debugger": d,
-                            "var": a("var"),
-                            "const": a("var"),
-                            let: a("var"),
-                            async: a("async"),
-                            "function": a("function"),
-                            "catch": a("catch"),
-                            "for": a("for"),
-                            "switch": a("switch"),
-                            "case": a("case"),
-                            "default": a("default"),
-                            "in": e,
-                            "typeof": e,
-                            "instanceof": e,
-                            "true": f,
-                            "false": f,
-                            "null": f,
-                            undefined: f,
-                            NaN: f,
-                            Infinity: f,
-                            "this": a("this"),
-                            "class": a("class"),
-                            "super": a("atom"),
-                            await: d,
-                            "yield": d,
-                            "export": a("export"),
-                            "import": a("import"),
-                            "extends": d
-                        };
-                    if (h) {
-                        var i = {
-                                type: "variable",
-                                style: "variable-3"
-                            },
-                            j = {
-                                "interface": a("interface"),
-                                "extends": a("extends"),
-                                constructor: a("constructor"),
-                                "public": a("public"),
-                                "private": a("private"),
-                                "protected": a("protected"),
-                                "static": a("static"),
-                                string: i,
-                                number: i,
-                                bool: i,
-                                any: i
-                            };
-                        for (var k in j) g[k] = j[k]
-                    }
-                    return g
-                }(),
-                k = /[+\-*&%=<>!?|~^]/,
-                l = /^@(context|id|value|language|type|container|list|set|reverse|index|base|vocab|graph)"/,
-                u = "([{}])",
-                w = {
-                    atom: !0,
-                    number: !0,
-                    variable: !0,
-                    string: !0,
-                    regexp: !0,
-                    "this": !0,
-                    "jsonld-keyword": !0
-                },
-                A = {
-                    state: null,
-                    column: null,
-                    marked: null,
-                    cc: null
-                },
-                E = {
-                    name: "this",
-                    next: {
-                        name: "arguments"
-                    }
-                };
-            return I.lex = !0, {
-                startState: function (a) {
-                    var b = {
-                        tokenize: q,
-                        lastType: "sof",
-                        cc: [],
-                        lexical: new x((a || 0) - d, 0, "block", !1),
-                        localVars: c.localVars,
-                        context: c.localVars && {
-                            vars: c.localVars
-                        },
-                        indented: 0
-                    };
-                    return c.globalVars && "object" == typeof c.globalVars && (b.globalVars = c.globalVars), b
-                },
-                token: function (a, b) {
-                    if (a.sol() && (b.lexical.hasOwnProperty("align") || (b.lexical.align = !1), b.indented = a.indentation(), v(a, b)), b.tokenize != s && a.eatSpace()) return null;
-                    var c = b.tokenize(a, b);
-                    return "comment" == n ? c : (b.lastType = "operator" != n || "++" != o && "--" != o ? n : "incdec", z(b, c, n, o, a))
-                },
-                indent: function (b, f) {
-                    if (b.tokenize == s) return a.Pass;
-                    if (b.tokenize != q) return 0;
-                    var g = f && f.charAt(0),
-                        h = b.lexical;
-                    if (!/^\s*else\b/.test(f))
-                        for (var i = b.cc.length - 1; i >= 0; --i) {
-                            var j = b.cc[i];
-                            if (j == I) h = h.prev;
-                            else if (j != ka) break
-                        }
-                    "stat" == h.type && "}" == g && (h = h.prev), e && ")" == h.type && "stat" == h.prev.type && (h = h.prev);
-                    var k = h.type,
-                        l = g == k;
-                    return "vardef" == k ? h.indented + ("operator" == b.lastType || "," == b.lastType ? h.info + 1 : 0) : "form" == k && "{" == g ? h.indented : "form" == k ? h.indented + d : "stat" == k ? h.indented + (Ea(b, f) ? e || d : 0) : "switch" != h.info || l || 0 == c.doubleIndentSwitch ? h.align ? h.column + (l ? 0 : 1) : h.indented + (l ? 0 : d) : h.indented + (/^(?:case|default)\b/.test(f) ? d : 2 * d)
-                },
-                electricInput: /^\s*(?:case .*?:|default:|\{|\})$/,
-                blockCommentStart: g ? null : "/*",
-                blockCommentEnd: g ? null : "*/",
-                lineComment: g ? null : "//",
-                fold: "brace",
-                closeBrackets: "()[]{}''\"\"``",
-                helperType: g ? "json" : "javascript",
-                jsonldMode: f,
-                jsonMode: g
-            }
-        }), a.registerHelper("wordChars", "javascript", /[\w$]/), a.defineMIME("text/javascript", "javascript"), a.defineMIME("text/ecmascript", "javascript"), a.defineMIME("application/javascript", "javascript"),
-        a.defineMIME("application/x-javascript", "javascript"), a.defineMIME("application/ecmascript", "javascript"), a.defineMIME("application/json", {
-            name: "javascript",
-            json: !0
-        }), a.defineMIME("application/x-json", {
-            name: "javascript",
-            json: !0
-        }), a.defineMIME("application/ld+json", {
-            name: "javascript",
-            jsonld: !0
-        }), a.defineMIME("text/typescript", {
-            name: "javascript",
-            typescript: !0
-        }), a.defineMIME("application/typescript", {
-            name: "javascript",
-            typescript: !0
-        })
-}),
-function (a) {
-    "object" == typeof exports && "object" == typeof module ? a(require("../../lib/codemirror")) : "function" == typeof define && define.amd ? define(["../../lib/codemirror"], a) : a(CodeMirror)
-}(function (a) {
-    "use strict";
-
-    function b(a, b) {
-        return a.string.charAt(a.pos + (b || 0))
-    }
-
-    function c(a, b) {
-        if (b) {
-            var c = a.pos - b;
-            return a.string.substr(c >= 0 ? c : 0, b)
-        }
-        return a.string.substr(0, a.pos - 1)
-    }
-
-    function d(a, b) {
-        var c = a.string.length,
-            d = c - a.pos + 1;
-        return a.string.substr(a.pos, b && c > b ? b : d)
-    }
-
-    function e(a, b) {
-        var d, c = a.pos + b;
-        0 >= c ? a.pos = 0 : c >= (d = a.string.length - 1) ? a.pos = d : a.pos = c
-    }
-    a.defineMode("perl", function () {
-        function h(a, b, c, d, e) {
-            return b.chain = null, b.style = null, b.tail = null, b.tokenize = function (a, b) {
-                for (var g, f = !1, h = 0; g = a.next();) {
-                    if (g === c[h] && !f) return void 0 !== c[++h] ? (b.chain = c[h], b.style = d, b.tail = e) : e && a.eatWhile(e), b.tokenize = j, d;
-                    f = !f && "\\" == g
-                }
-                return d
-            }, b.tokenize(a, b)
-        }
-
-        function i(a, b, c) {
-            return b.tokenize = function (a, b) {
-                return a.string == c && (b.tokenize = j), a.skipToEnd(), "string"
-            }, b.tokenize(a, b)
-        }
-
-        function j(j, k) {
-            if (j.eatSpace()) return null;
-            if (k.chain) return h(j, k, k.chain, k.style, k.tail);
-            if (j.match(/^\-?[\d\.]/, !1) && j.match(/^(\-?(\d*\.\d+(e[+-]?\d+)?|\d+\.\d*)|0x[\da-fA-F]+|0b[01]+|\d+(e[+-]?\d+)?)/)) return "number";
-            if (j.match(/^<<(?=\w)/)) return j.eatWhile(/\w/), i(j, k, j.current()
-                .substr(2));
-            if (j.sol() && j.match(/^\=item(?!\w)/)) return i(j, k, "=cut");
-            var l = j.next();
-            if ('"' == l || "'" == l) {
-                if (c(j, 3) == "<<" + l) {
-                    var m = j.pos;
-                    j.eatWhile(/\w/);
-                    var n = j.current()
-                        .substr(1);
-                    if (n && j.eat(l)) return i(j, k, n);
-                    j.pos = m
-                }
-                return h(j, k, [l], "string")
-            }
-            if ("q" == l) {
-                var o = b(j, -2);
-                if (!o || !/\w/.test(o))
-                    if (o = b(j, 0), "x" == o) {
-                        if (o = b(j, 1), "(" == o) return e(j, 2), h(j, k, [")"], f, g);
-                        if ("[" == o) return e(j, 2), h(j, k, ["]"], f, g);
-                        if ("{" == o) return e(j, 2), h(j, k, ["}"], f, g);
-                        if ("<" == o) return e(j, 2), h(j, k, [">"], f, g);
-                        if (/[\^'"!~\/]/.test(o)) return e(j, 1), h(j, k, [j.eat(o)], f, g)
-                    } else if ("q" == o) {
-                    if (o = b(j, 1), "(" == o) return e(j, 2), h(j, k, [")"], "string");
-                    if ("[" == o) return e(j, 2), h(j, k, ["]"], "string");
-                    if ("{" == o) return e(j, 2), h(j, k, ["}"], "string");
-                    if ("<" == o) return e(j, 2), h(j, k, [">"], "string");
-                    if (/[\^'"!~\/]/.test(o)) return e(j, 1), h(j, k, [j.eat(o)], "string")
-                } else if ("w" == o) {
-                    if (o = b(j, 1), "(" == o) return e(j, 2), h(j, k, [")"], "bracket");
-                    if ("[" == o) return e(j, 2), h(j, k, ["]"], "bracket");
-                    if ("{" == o) return e(j, 2), h(j, k, ["}"], "bracket");
-                    if ("<" == o) return e(j, 2), h(j, k, [">"], "bracket");
-                    if (/[\^'"!~\/]/.test(o)) return e(j, 1), h(j, k, [j.eat(o)], "bracket")
-                } else if ("r" == o) {
-                    if (o = b(j, 1), "(" == o) return e(j, 2), h(j, k, [")"], f, g);
-                    if ("[" == o) return e(j, 2), h(j, k, ["]"], f, g);
-                    if ("{" == o) return e(j, 2), h(j, k, ["}"], f, g);
-                    if ("<" == o) return e(j, 2), h(j, k, [">"], f, g);
-                    if (/[\^'"!~\/]/.test(o)) return e(j, 1), h(j, k, [j.eat(o)], f, g)
-                } else if (/[\^'"!~\/(\[{<]/.test(o)) {
-                    if ("(" == o) return e(j, 1), h(j, k, [")"], "string");
-                    if ("[" == o) return e(j, 1), h(j, k, ["]"], "string");
-                    if ("{" == o) return e(j, 1), h(j, k, ["}"], "string");
-                    if ("<" == o) return e(j, 1), h(j, k, [">"], "string");
-                    if (/[\^'"!~\/]/.test(o)) return h(j, k, [j.eat(o)], "string")
-                }
-            }
-            if ("m" == l) {
-                var o = b(j, -2);
-                if ((!o || !/\w/.test(o)) && (o = j.eat(/[(\[{<\^'"!~\/]/))) {
-                    if (/[\^'"!~\/]/.test(o)) return h(j, k, [o], f, g);
-                    if ("(" == o) return h(j, k, [")"], f, g);
-                    if ("[" == o) return h(j, k, ["]"], f, g);
-                    if ("{" == o) return h(j, k, ["}"], f, g);
-                    if ("<" == o) return h(j, k, [">"], f, g)
-                }
-            }
-            if ("s" == l) {
-                var o = /[\/>\]})\w]/.test(b(j, -2));
-                if (!o && (o = j.eat(/[(\[{<\^'"!~\/]/))) return "[" == o ? h(j, k, ["]", "]"], f, g) : "{" == o ? h(j, k, ["}", "}"], f, g) : "<" == o ? h(j, k, [">", ">"], f, g) : "(" == o ? h(j, k, [")", ")"], f, g) : h(j, k, [o, o], f, g)
-            }
-            if ("y" == l) {
-                var o = /[\/>\]})\w]/.test(b(j, -2));
-                if (!o && (o = j.eat(/[(\[{<\^'"!~\/]/))) return "[" == o ? h(j, k, ["]", "]"], f, g) : "{" == o ? h(j, k, ["}", "}"], f, g) : "<" == o ? h(j, k, [">", ">"], f, g) : "(" == o ? h(j, k, [")", ")"], f, g) : h(j, k, [o, o], f, g)
-            }
-            if ("t" == l) {
-                var o = /[\/>\]})\w]/.test(b(j, -2));
-                if (!o && (o = j.eat("r"), o && (o = j.eat(/[(\[{<\^'"!~\/]/)))) return "[" == o ? h(j, k, ["]", "]"], f, g) : "{" == o ? h(j, k, ["}", "}"], f, g) : "<" == o ? h(j, k, [">", ">"], f, g) : "(" == o ? h(j, k, [")", ")"], f, g) : h(j, k, [o, o], f, g)
-            }
-            if ("`" == l) return h(j, k, [l], "variable-2");
-            if ("/" == l) return /~\s*$/.test(c(j)) ? h(j, k, [l], f, g) : "operator";
-            if ("$" == l) {
-                var m = j.pos;
-                if (j.eatWhile(/\d/) || j.eat("{") && j.eatWhile(/\d/) && j.eat("}")) return "variable-2";
-                j.pos = m
-            }
-            if (/[$@%]/.test(l)) {
-                var m = j.pos;
-                if (j.eat("^") && j.eat(/[A-Z]/) || !/[@$%&]/.test(b(j, -2)) && j.eat(/[=|\\\-#?@;:&`~\^!\[\]*'"$+.,\/<>()]/)) {
-                    var o = j.current();
-                    if (a[o]) return "variable-2"
-                }
-                j.pos = m
-            }
-            if (/[$@%&]/.test(l) && (j.eatWhile(/[\w$\[\]]/) || j.eat("{") && j.eatWhile(/[\w$\[\]]/) && j.eat("}"))) {
-                var o = j.current();
-                return a[o] ? "variable-2" : "variable"
-            }
-            if ("#" == l && "$" != b(j, -2)) return j.skipToEnd(), "comment";
-            if (/[:+\-\^*$&%@=<>!?|\/~\.]/.test(l)) {
-                var m = j.pos;
-                if (j.eatWhile(/[:+\-\^*$&%@=<>!?|\/~\.]/), a[j.current()]) return "operator";
-                j.pos = m
-            }
-            if ("_" == l && 1 == j.pos) {
-                if ("_END__" == d(j, 6)) return h(j, k, ["\x00"], "comment");
-                if ("_DATA__" == d(j, 7)) return h(j, k, ["\x00"], "variable-2");
-                if ("_C__" == d(j, 7)) return h(j, k, ["\x00"], "string")
-            }
-            if (/\w/.test(l)) {
-                var m = j.pos;
-                if ("{" == b(j, -2) && ("}" == b(j, 0) || j.eatWhile(/\w/) && "}" == b(j, 0))) return "string";
-                j.pos = m
-            }
-            if (/[A-Z]/.test(l)) {
-                var p = b(j, -2),
-                    m = j.pos;
-                if (j.eatWhile(/[A-Z_]/), !/[\da-z]/.test(b(j, 0))) {
-                    var o = a[j.current()];
-                    return o ? (o[1] && (o = o[0]), ":" != p ? 1 == o ? "keyword" : 2 == o ? "def" : 3 == o ? "atom" : 4 == o ? "operator" : 5 == o ? "variable-2" : "meta" : "meta") : "meta"
-                }
-                j.pos = m
-            }
-            if (/[a-zA-Z_]/.test(l)) {
-                var p = b(j, -2);
-                j.eatWhile(/\w/);
-                var o = a[j.current()];
-                return o ? (o[1] && (o = o[0]), ":" != p ? 1 == o ? "keyword" : 2 == o ? "def" : 3 == o ? "atom" : 4 == o ? "operator" : 5 == o ? "variable-2" : "meta" : "meta") : "meta"
-            }
-            return null
-        }
-        var a = {
-                "->": 4,
-                "++": 4,
-                "--": 4,
-                "**": 4,
-                "=~": 4,
-                "!~": 4,
-                "*": 4,
-                "/": 4,
-                "%": 4,
-                x: 4,
-                "+": 4,
-                "-": 4,
-                ".": 4,
-                "<<": 4,
-                ">>": 4,
-                "<": 4,
-                ">": 4,
-                "<=": 4,
-                ">=": 4,
-                lt: 4,
-                gt: 4,
-                le: 4,
-                ge: 4,
-                "==": 4,
-                "!=": 4,
-                "<=>": 4,
-                eq: 4,
-                ne: 4,
-                cmp: 4,
-                "~~": 4,
-                "&": 4,
-                "|": 4,
-                "^": 4,
-                "&&": 4,
-                "||": 4,
-                "//": 4,
-                "..": 4,
-                "...": 4,
-                "?": 4,
-                ":": 4,
-                "=": 4,
-                "+=": 4,
-                "-=": 4,
-                "*=": 4,
-                ",": 4,
-                "=>": 4,
-                "::": 4,
-                not: 4,
-                and: 4,
-                or: 4,
-                xor: 4,
-                BEGIN: [5, 1],
-                END: [5, 1],
-                PRINT: [5, 1],
-                PRINTF: [5, 1],
-                GETC: [5, 1],
-                READ: [5, 1],
-                READLINE: [5, 1],
-                DESTROY: [5, 1],
-                TIE: [5, 1],
-                TIEHANDLE: [5, 1],
-                UNTIE: [5, 1],
-                STDIN: 5,
-                STDIN_TOP: 5,
-                STDOUT: 5,
-                STDOUT_TOP: 5,
-                STDERR: 5,
-                STDERR_TOP: 5,
-                $ARG: 5,
-                $_: 5,
-                "@ARG": 5,
-                "@_": 5,
-                $LIST_SEPARATOR: 5,
-                '$"': 5,
-                $PROCESS_ID: 5,
-                $PID: 5,
-                $$: 5,
-                $REAL_GROUP_ID: 5,
-                $GID: 5,
-                "$(": 5,
-                $EFFECTIVE_GROUP_ID: 5,
-                $EGID: 5,
-                "$)": 5,
-                $PROGRAM_NAME: 5,
-                $0: 5,
-                $SUBSCRIPT_SEPARATOR: 5,
-                $SUBSEP: 5,
-                "$;": 5,
-                $REAL_USER_ID: 5,
-                $UID: 5,
-                "$<": 5,
-                $EFFECTIVE_USER_ID: 5,
-                $EUID: 5,
-                "$>": 5,
-                $a: 5,
-                $b: 5,
-                $COMPILING: 5,
-                "$^C": 5,
-                $DEBUGGING: 5,
-                "$^D": 5,
-                "${^ENCODING}": 5,
-                $ENV: 5,
-                "%ENV": 5,
-                $SYSTEM_FD_MAX: 5,
-                "$^F": 5,
-                "@F": 5,
-                "${^GLOBAL_PHASE}": 5,
-                "$^H": 5,
-                "%^H": 5,
-                "@INC": 5,
-                "%INC": 5,
-                $INPLACE_EDIT: 5,
-                "$^I": 5,
-                "$^M": 5,
-                $OSNAME: 5,
-                "$^O": 5,
-                "${^OPEN}": 5,
-                $PERLDB: 5,
-                "$^P": 5,
-                $SIG: 5,
-                "%SIG": 5,
-                $BASETIME: 5,
-                "$^T": 5,
-                "${^TAINT}": 5,
-                "${^UNICODE}": 5,
-                "${^UTF8CACHE}": 5,
-                "${^UTF8LOCALE}": 5,
-                $PERL_VERSION: 5,
-                "$^V": 5,
-                "${^WIN32_SLOPPY_STAT}": 5,
-                $EXECUTABLE_NAME: 5,
-                "$^X": 5,
-                $1: 5,
-                $MATCH: 5,
-                "$&": 5,
-                "${^MATCH}": 5,
-                $PREMATCH: 5,
-                "$`": 5,
-                "${^PREMATCH}": 5,
-                $POSTMATCH: 5,
-                "$'": 5,
-                "${^POSTMATCH}": 5,
-                $LAST_PAREN_MATCH: 5,
-                "$+": 5,
-                $LAST_SUBMATCH_RESULT: 5,
-                "$^N": 5,
-                "@LAST_MATCH_END": 5,
-                "@+": 5,
-                "%LAST_PAREN_MATCH": 5,
-                "%+": 5,
-                "@LAST_MATCH_START": 5,
-                "@-": 5,
-                "%LAST_MATCH_START": 5,
-                "%-": 5,
-                $LAST_REGEXP_CODE_RESULT: 5,
-                "$^R": 5,
-                "${^RE_DEBUG_FLAGS}": 5,
-                "${^RE_TRIE_MAXBUF}": 5,
-                $ARGV: 5,
-                "@ARGV": 5,
-                ARGV: 5,
-                ARGVOUT: 5,
-                $OUTPUT_FIELD_SEPARATOR: 5,
-                $OFS: 5,
-                "$,": 5,
-                $INPUT_LINE_NUMBER: 5,
-                $NR: 5,
-                "$.": 5,
-                $INPUT_RECORD_SEPARATOR: 5,
-                $RS: 5,
-                "$/": 5,
-                $OUTPUT_RECORD_SEPARATOR: 5,
-                $ORS: 5,
-                "$\\": 5,
-                $OUTPUT_AUTOFLUSH: 5,
-                "$|": 5,
-                $ACCUMULATOR: 5,
-                "$^A": 5,
-                $FORMAT_FORMFEED: 5,
-                "$^L": 5,
-                $FORMAT_PAGE_NUMBER: 5,
-                "$%": 5,
-                $FORMAT_LINES_LEFT: 5,
-                "$-": 5,
-                $FORMAT_LINE_BREAK_CHARACTERS: 5,
-                "$:": 5,
-                $FORMAT_LINES_PER_PAGE: 5,
-                "$=": 5,
-                $FORMAT_TOP_NAME: 5,
-                "$^": 5,
-                $FORMAT_NAME: 5,
-                "$~": 5,
-                "${^CHILD_ERROR_NATIVE}": 5,
-                $EXTENDED_OS_ERROR: 5,
-                "$^E": 5,
-                $EXCEPTIONS_BEING_CAUGHT: 5,
-                "$^S": 5,
-                $WARNING: 5,
-                "$^W": 5,
-                "${^WARNING_BITS}": 5,
-                $OS_ERROR: 5,
-                $ERRNO: 5,
-                "$!": 5,
-                "%OS_ERROR": 5,
-                "%ERRNO": 5,
-                "%!": 5,
-                $CHILD_ERROR: 5,
-                "$?": 5,
-                $EVAL_ERROR: 5,
-                "$@": 5,
-                $OFMT: 5,
-                "$#": 5,
-                "$*": 5,
-                $ARRAY_BASE: 5,
-                "$[": 5,
-                $OLD_PERL_VERSION: 5,
-                "$]": 5,
-                "if": [1, 1],
-                elsif: [1, 1],
-                "else": [1, 1],
-                "while": [1, 1],
-                unless: [1, 1],
-                "for": [1, 1],
-                foreach: [1, 1],
-                abs: 1,
-                accept: 1,
-                alarm: 1,
-                atan2: 1,
-                bind: 1,
-                binmode: 1,
-                bless: 1,
-                bootstrap: 1,
-                "break": 1,
-                caller: 1,
-                chdir: 1,
-                chmod: 1,
-                chomp: 1,
-                chop: 1,
-                chown: 1,
-                chr: 1,
-                chroot: 1,
-                close: 1,
-                closedir: 1,
-                connect: 1,
-                "continue": [1, 1],
-                cos: 1,
-                crypt: 1,
-                dbmclose: 1,
-                dbmopen: 1,
-                "default": 1,
-                defined: 1,
-                "delete": 1,
-                die: 1,
-                "do": 1,
-                dump: 1,
-                each: 1,
-                endgrent: 1,
-                endhostent: 1,
-                endnetent: 1,
-                endprotoent: 1,
-                endpwent: 1,
-                endservent: 1,
-                eof: 1,
-                eval: 1,
-                exec: 1,
-                exists: 1,
-                exit: 1,
-                exp: 1,
-                fcntl: 1,
-                fileno: 1,
-                flock: 1,
-                fork: 1,
-                format: 1,
-                formline: 1,
-                getc: 1,
-                getgrent: 1,
-                getgrgid: 1,
-                getgrnam: 1,
-                gethostbyaddr: 1,
-                gethostbyname: 1,
-                gethostent: 1,
-                getlogin: 1,
-                getnetbyaddr: 1,
-                getnetbyname: 1,
-                getnetent: 1,
-                getpeername: 1,
-                getpgrp: 1,
-                getppid: 1,
-                getpriority: 1,
-                getprotobyname: 1,
-                getprotobynumber: 1,
-                getprotoent: 1,
-                getpwent: 1,
-                getpwnam: 1,
-                getpwuid: 1,
-                getservbyname: 1,
-                getservbyport: 1,
-                getservent: 1,
-                getsockname: 1,
-                getsockopt: 1,
-                given: 1,
-                glob: 1,
-                gmtime: 1,
-                "goto": 1,
-                grep: 1,
-                hex: 1,
-                "import": 1,
-                index: 1,
-                "int": 1,
-                ioctl: 1,
-                join: 1,
-                keys: 1,
-                kill: 1,
-                last: 1,
-                lc: 1,
-                lcfirst: 1,
-                length: 1,
-                link: 1,
-                listen: 1,
-                local: 2,
-                localtime: 1,
-                lock: 1,
-                log: 1,
-                lstat: 1,
-                m: null,
-                map: 1,
-                mkdir: 1,
-                msgctl: 1,
-                msgget: 1,
-                msgrcv: 1,
-                msgsnd: 1,
-                my: 2,
-                "new": 1,
-                next: 1,
-                no: 1,
-                oct: 1,
-                open: 1,
-                opendir: 1,
-                ord: 1,
-                our: 2,
-                pack: 1,
-                "package": 1,
-                pipe: 1,
-                pop: 1,
-                pos: 1,
-                print: 1,
-                printf: 1,
-                prototype: 1,
-                push: 1,
-                q: null,
-                qq: null,
-                qr: null,
-                quotemeta: null,
-                qw: null,
-                qx: null,
-                rand: 1,
-                read: 1,
-                readdir: 1,
-                readline: 1,
-                readlink: 1,
-                readpipe: 1,
-                recv: 1,
-                redo: 1,
-                ref: 1,
-                rename: 1,
-                require: 1,
-                reset: 1,
-                "return": 1,
-                reverse: 1,
-                rewinddir: 1,
-                rindex: 1,
-                rmdir: 1,
-                s: null,
-                say: 1,
-                scalar: 1,
-                seek: 1,
-                seekdir: 1,
-                select: 1,
-                semctl: 1,
-                semget: 1,
-                semop: 1,
-                send: 1,
-                setgrent: 1,
-                sethostent: 1,
-                setnetent: 1,
-                setpgrp: 1,
-                setpriority: 1,
-                setprotoent: 1,
-                setpwent: 1,
-                setservent: 1,
-                setsockopt: 1,
-                shift: 1,
-                shmctl: 1,
-                shmget: 1,
-                shmread: 1,
-                shmwrite: 1,
-                shutdown: 1,
-                sin: 1,
-                sleep: 1,
-                socket: 1,
-                socketpair: 1,
-                sort: 1,
-                splice: 1,
-                split: 1,
-                sprintf: 1,
-                sqrt: 1,
-                srand: 1,
-                stat: 1,
-                state: 1,
-                study: 1,
-                sub: 1,
-                substr: 1,
-                symlink: 1,
-                syscall: 1,
-                sysopen: 1,
-                sysread: 1,
-                sysseek: 1,
-                system: 1,
-                syswrite: 1,
-                tell: 1,
-                telldir: 1,
-                tie: 1,
-                tied: 1,
-                time: 1,
-                times: 1,
-                tr: null,
-                truncate: 1,
-                uc: 1,
-                ucfirst: 1,
-                umask: 1,
-                undef: 1,
-                unlink: 1,
-                unpack: 1,
-                unshift: 1,
-                untie: 1,
-                use: 1,
-                utime: 1,
-                values: 1,
-                vec: 1,
-                wait: 1,
-                waitpid: 1,
-                wantarray: 1,
-                warn: 1,
-                when: 1,
-                write: 1,
-                y: null
-            },
-            f = "string-2",
-            g = /[goseximacplud]/;
-        return {
-            startState: function () {
-                return {
-                    tokenize: j,
-                    chain: null,
-                    style: null,
-                    tail: null
-                }
-            },
-            token: function (a, b) {
-                return (b.tokenize || j)(a, b)
-            },
-            lineComment: "#"
-        }
-    }), a.registerHelper("wordChars", "perl", /[\w$]/), a.defineMIME("text/x-perl", "perl")
-}),
-function (a) {
-    "object" == typeof exports && "object" == typeof module ? a(require("../../lib/codemirror")) : "function" == typeof define && define.amd ? define(["../../lib/codemirror"], a) : a(CodeMirror)
-}(function (a) {
-    "use strict";
-
-    function b(a) {
-        return new RegExp("^((" + a.join(")|(") + "))\\b")
-    }
-
-    function h(a) {
-        return a.scopes[a.scopes.length - 1]
-    }
-    var c = b(["and", "or", "not", "is"]),
-        d = ["as", "assert", "break", "class", "continue", "def", "del", "elif", "else", "except", "finally", "for", "from", "global", "if", "import", "lambda", "pass", "raise", "return", "try", "while", "with", "yield", "in"],
-        e = ["abs", "all", "any", "bin", "bool", "bytearray", "callable", "chr", "classmethod", "compile", "complex", "delattr", "dict", "dir", "divmod", "enumerate", "eval", "filter", "float", "format", "frozenset", "getattr", "globals", "hasattr", "hash", "help", "hex", "id", "input", "int", "isinstance", "issubclass", "iter", "len", "list", "locals", "map", "max", "memoryview", "min", "next", "object", "oct", "open", "ord", "pow", "property", "range", "repr", "reversed", "round", "set", "setattr", "slice", "sorted", "staticmethod", "str", "sum", "super", "tuple", "type", "vars", "zip", "__import__", "NotImplemented", "Ellipsis", "__debug__"],
-        f = {
-            builtins: ["apply", "basestring", "buffer", "cmp", "coerce", "execfile", "file", "intern", "long", "raw_input", "reduce", "reload", "unichr", "unicode", "xrange", "False", "True", "None"],
-            keywords: ["exec", "print"]
-        },
-        g = {
-            builtins: ["ascii", "bytes", "exec", "print"],
-            keywords: ["nonlocal", "False", "True", "None", "async", "await"]
-        };
-    a.registerHelper("hintWords", "python", d.concat(e)), a.defineMode("python", function (i, j) {
-        function x(a, b) {
-            if (a.sol() && "py" == h(b)
-                .type) {
-                var c = h(b)
-                    .offset;
-                if (a.eatSpace()) {
-                    var d = a.indentation();
-                    return d > c ? A(a, b, "py") : c > d && B(a, b) && (b.errorToken = !0), null
-                }
-                var e = y(a, b);
-                return c > 0 && B(a, b) && (e += " " + k), e
-            }
-            return y(a, b)
-        }
-
-        function y(a, b) {
-            if (a.eatSpace()) return null;
-            var d = a.peek();
-            if ("#" == d) return a.skipToEnd(), "comment";
-            if (a.match(/^[0-9\.]/, !1)) {
-                var e = !1;
-                if (a.match(/^\d*\.\d+(e[\+\-]?\d+)?/i) && (e = !0), a.match(/^\d+\.\d*/) && (e = !0), a.match(/^\.\d+/) && (e = !0), e) return a.eat(/J/i), "number";
-                var f = !1;
-                if (a.match(/^0x[0-9a-f]+/i) && (f = !0), a.match(/^0b[01]+/i) && (f = !0), a.match(/^0o[0-7]+/i) && (f = !0), a.match(/^[1-9]\d*(e[\+\-]?\d+)?/) && (a.eat(/J/i), f = !0), a.match(/^0(?![\dx])/i) && (f = !0), f) return a.eat(/L/i), "number"
-            }
-            return a.match(u) ? (b.tokenize = z(a.current()), b.tokenize(a, b)) : a.match(o) || a.match(n) ? null : a.match(m) || a.match(p) ? "operator" : a.match(l) ? null : a.match(v) || a.match(c) ? "keyword" : a.match(w) ? "builtin" : a.match(/^(self|cls)\b/) ? "variable-2" : a.match(q) ? "def" == b.lastToken || "class" == b.lastToken ? "def" : "variable" : (a.next(), k)
-        }
-
-        function z(a) {
-            function d(d, e) {
-                for (; !d.eol();)
-                    if (d.eatWhile(/[^'"\\]/), d.eat("\\")) {
-                        if (d.next(), b && d.eol()) return c
-                    } else {
-                        if (d.match(a)) return e.tokenize = x, c;
-                        d.eat(/['"]/)
-                    }
-                if (b) {
-                    if (j.singleLineStringErrors) return k;
-                    e.tokenize = x
-                }
-                return c
-            }
-            for (;
-                "rub".indexOf(a.charAt(0)
-                    .toLowerCase()) >= 0;) a = a.substr(1);
-            var b = 1 == a.length,
-                c = "string";
-            return d.isString = !0, d
-        }
-
-        function A(a, b, c) {
-            var d = 0,
-                e = null;
-            if ("py" == c)
-                for (;
-                    "py" != h(b)
-                    .type;) b.scopes.pop();
-            d = h(b)
-                .offset + ("py" == c ? i.indentUnit : r), "py" == c || a.match(/^(\s|#.*)*$/, !1) || (e = a.column() + 1), b.scopes.push({
-                    offset: d,
-                    type: c,
-                    align: e
-                })
-        }
-
-        function B(a, b) {
-            for (var c = a.indentation(); h(b)
-                .offset > c;) {
-                if ("py" != h(b)
-                    .type) return !0;
-                b.scopes.pop()
-            }
-            return h(b)
-                .offset != c
-        }
-
-        function C(a, b) {
-            var c = b.tokenize(a, b),
-                d = a.current();
-            if ("." == d) return c = a.match(q, !1) ? null : k, null == c && "meta" == b.lastStyle && (c = "meta"), c;
-            if ("@" == d) return j.version && 3 == parseInt(j.version, 10) ? a.match(q, !1) ? "meta" : "operator" : a.match(q, !1) ? "meta" : k;
-            "variable" != c && "builtin" != c || "meta" != b.lastStyle || (c = "meta"), ("pass" == d || "return" == d) && (b.dedent += 1), "lambda" == d && (b.lambda = !0), ":" != d || b.lambda || "py" != h(b)
-                .type || A(a, b, "py");
-            var e = 1 == d.length ? "[({".indexOf(d) : -1;
-            if (-1 != e && A(a, b, "])}".slice(e, e + 1)), e = "])}".indexOf(d), -1 != e) {
-                if (h(b)
-                    .type != d) return k;
-                b.scopes.pop()
-            }
-            return b.dedent > 0 && a.eol() && "py" == h(b)
-                .type && (b.scopes.length > 1 && b.scopes.pop(), b.dedent -= 1), c
-        }
-        var k = "error",
-            l = j.singleDelimiters || new RegExp("^[\\(\\)\\[\\]\\{\\}@,:`=;\\.]"),
-            m = j.doubleOperators || new RegExp("^((==)|(!=)|(<=)|(>=)|(<>)|(<<)|(>>)|(//)|(\\*\\*))"),
-            n = j.doubleDelimiters || new RegExp("^((\\+=)|(\\-=)|(\\*=)|(%=)|(/=)|(&=)|(\\|=)|(\\^=))"),
-            o = j.tripleDelimiters || new RegExp("^((//=)|(>>=)|(<<=)|(\\*\\*=))");
-        if (j.version && 3 == parseInt(j.version, 10)) var p = j.singleOperators || new RegExp("^[\\+\\-\\*/%&|\\^~<>!@]"),
-            q = j.identifiers || new RegExp("^[_A-Za-z\xa1-\uffff][_A-Za-z0-9\xa1-\uffff]*");
-        else var p = j.singleOperators || new RegExp("^[\\+\\-\\*/%&|\\^~<>!]"),
-            q = j.identifiers || new RegExp("^[_A-Za-z][_A-Za-z0-9]*");
-        var r = j.hangingIndent || i.indentUnit,
-            s = d,
-            t = e;
-        if (void 0 != j.extra_keywords && (s = s.concat(j.extra_keywords)), void 0 != j.extra_builtins && (t = t.concat(j.extra_builtins)), j.version && 3 == parseInt(j.version, 10)) {
-            s = s.concat(g.keywords), t = t.concat(g.builtins);
-            var u = new RegExp("^(([rb]|(br))?('{3}|\"{3}|['\"]))", "i")
-        } else {
-            s = s.concat(f.keywords), t = t.concat(f.builtins);
-            var u = new RegExp("^(([rub]|(ur)|(br))?('{3}|\"{3}|['\"]))", "i")
-        }
-        var v = b(s),
-            w = b(t),
-            D = {
-                startState: function (a) {
-                    return {
-                        tokenize: x,
-                        scopes: [{
-                            offset: a || 0,
-                            type: "py",
-                            align: null
-                        }],
-                        lastStyle: null,
-                        lastToken: null,
-                        lambda: !1,
-                        dedent: 0
-                    }
-                },
-                token: function (a, b) {
-                    var c = b.errorToken;
-                    c && (b.errorToken = !1);
-                    var d = C(a, b);
-                    b.lastStyle = d;
-                    var e = a.current();
-                    return e && d && (b.lastToken = e), a.eol() && b.lambda && (b.lambda = !1), c ? d + " " + k : d
-                },
-                indent: function (b, c) {
-                    if (b.tokenize != x) return b.tokenize.isString ? a.Pass : 0;
-                    var d = h(b),
-                        e = c && c.charAt(0) == d.type;
-                    return null != d.align ? d.align - (e ? 1 : 0) : e && b.scopes.length > 1 ? b.scopes[b.scopes.length - 2].offset : d.offset
-                },
-                closeBrackets: {
-                    triples: "'\""
-                },
-                lineComment: "#",
-                fold: "indent"
-            };
-        return D
-    }), a.defineMIME("text/x-python", "python");
-    var i = function (a) {
-        return a.split(" ")
-    };
-    a.defineMIME("text/x-cython", {
-        name: "python",
-        extra_keywords: i("by cdef cimport cpdef ctypedef enum exceptextern gil include nogil property publicreadonly struct union DEF IF ELIF ELSE")
-    })
-}),
-function (a) {
-    "object" == typeof exports && "object" == typeof module ? a(require("../../lib/codemirror")) : "function" == typeof define && define.amd ? define(["../../lib/codemirror"], a) : a(CodeMirror)
-}(function (a) {
-    "use strict";
-    a.defineMode("shell", function () {
-        function b(b, c) {
-            for (var d = c.split(" "), e = 0; e < d.length; e++) a[d[e]] = b
-        }
-
-        function c(b, c) {
-            if (b.eatSpace()) return null;
-            var g = b.sol(),
-                h = b.next();
-            if ("\\" === h) return b.next(), null;
-            if ("'" === h || '"' === h || "`" === h) return c.tokens.unshift(d(h)), f(b, c);
-            if ("#" === h) return g && b.eat("!") ? (b.skipToEnd(), "meta") : (b.skipToEnd(), "comment");
-            if ("$" === h) return c.tokens.unshift(e), f(b, c);
-            if ("+" === h || "=" === h) return "operator";
-            if ("-" === h) return b.eat("-"), b.eatWhile(/\w/), "attribute";
-            if (/\d/.test(h) && (b.eatWhile(/\d/), b.eol() || !/\w/.test(b.peek()))) return "number";
-            b.eatWhile(/[\w-]/);
-            var i = b.current();
-            return "=" === b.peek() && /\w+/.test(i) ? "def" : a.hasOwnProperty(i) ? a[i] : null
-        }
-
-        function d(a) {
-            return function (b, c) {
-                for (var d, f = !1, g = !1; null != (d = b.next());) {
-                    if (d === a && !g) {
-                        f = !0;
-                        break
-                    }
-                    if ("$" === d && !g && "'" !== a) {
-                        g = !0, b.backUp(1), c.tokens.unshift(e);
-                        break
-                    }
-                    g = !g && "\\" === d
-                }
-                return (f || !g) && c.tokens.shift(), "`" === a || ")" === a ? "quote" : "string"
-            }
-        }
-
-        function f(a, b) {
-            return (b.tokens[0] || c)(a, b)
-        }
-        var a = {};
-        b("atom", "true false"), b("keyword", "if then do else elif while until for in esac fi fin fil done exit set unset export function"), b("builtin", "ab awk bash beep cat cc cd chown chmod chroot clear cp curl cut diff echo find gawk gcc get git grep kill killall ln ls make mkdir openssl mv nc node npm ping ps restart rm rmdir sed service sh shopt shred source sort sleep ssh start stop su sudo tee telnet top touch vi vim wall wc wget who write yes zsh");
-        var e = function (a, b) {
-            b.tokens.length > 1 && a.eat("$");
-            var c = a.next(),
-                e = /\w/;
-            return "{" === c && (e = /[^}]/), "(" === c ? (b.tokens[0] = d(")"), f(a, b)) : (/\d/.test(c) || (a.eatWhile(e), a.eat("}")), b.tokens.shift(), "def")
-        };
-        return {
-            startState: function () {
-                return {
-                    tokens: []
-                }
-            },
-            token: function (a, b) {
-                return f(a, b)
-            },
-            lineComment: "#",
-            fold: "brace"
-        }
-    }), a.defineMIME("text/x-sh", "shell")
-}),
-function (a) {
-    "object" == typeof exports && "object" == typeof module ? a(require("../../lib/codemirror")) : "function" == typeof define && define.amd ? define(["../../lib/codemirror"], a) : a(CodeMirror)
-}(function (a) {
-    "use strict";
-    a.defineMode("xml", function (b, c) {
-        function k(a, b) {
-            function c(c) {
-                return b.tokenize = c, c(a, b)
-            }
-            var d = a.next();
-            if ("<" == d) return a.eat("!") ? a.eat("[") ? a.match("CDATA[") ? c(n("atom", "]]>")) : null : a.match("--") ? c(n("comment", "-->")) : a.match("DOCTYPE", !0, !0) ? (a.eatWhile(/[\w\._\-]/), c(o(1))) : null : a.eat("?") ? (a.eatWhile(/[\w\._\-]/), b.tokenize = n("meta", "?>"), "meta") : (i = a.eat("/") ? "closeTag" : "openTag", b.tokenize = l, "tag bracket");
-            if ("&" == d) {
-                var e;
-                return e = a.eat("#") ? a.eat("x") ? a.eatWhile(/[a-fA-F\d]/) && a.eat(";") : a.eatWhile(/[\d]/) && a.eat(";") : a.eatWhile(/[\w\.\-:]/) && a.eat(";"), e ? "atom" : "error"
-            }
-            return a.eatWhile(/[^&<]/), null
-        }
-
-        function l(a, b) {
-            var c = a.next();
-            if (">" == c || "/" == c && a.eat(">")) return b.tokenize = k, i = ">" == c ? "endTag" : "selfcloseTag", "tag bracket";
-            if ("=" == c) return i = "equals", null;
-            if ("<" == c) {
-                b.tokenize = k, b.state = s, b.tagName = b.tagStart = null;
-                var d = b.tokenize(a, b);
-                return d ? d + " tag error" : "tag error"
-            }
-            return /[\'\"]/.test(c) ? (b.tokenize = m(c), b.stringStartCol = a.column(), b.tokenize(a, b)) : (a.match(/^[^\s\u00a0=<>\"\']*[^\s\u00a0=<>\"\'\/]/), "word")
-        }
-
-        function m(a) {
-            var b = function (b, c) {
-                for (; !b.eol();)
-                    if (b.next() == a) {
-                        c.tokenize = l;
-                        break
-                    }
-                return "string"
-            };
-            return b.isInAttribute = !0, b
-        }
-
-        function n(a, b) {
-            return function (c, d) {
-                for (; !c.eol();) {
-                    if (c.match(b)) {
-                        d.tokenize = k;
-                        break
-                    }
-                    c.next()
-                }
-                return a
-            }
-        }
-
-        function o(a) {
-            return function (b, c) {
-                for (var d; null != (d = b.next());) {
-                    if ("<" == d) return c.tokenize = o(a + 1), c.tokenize(b, c);
-                    if (">" == d) {
-                        if (1 == a) {
-                            c.tokenize = k;
-                            break
-                        }
-                        return c.tokenize = o(a - 1), c.tokenize(b, c)
-                    }
-                }
-                return "meta"
-            }
-        }
-
-        function p(a, b, c) {
-            this.prev = a.context, this.tagName = b, this.indent = a.indented, this.startOfLine = c, (g.doNotIndent.hasOwnProperty(b) || a.context && a.context.noIndent) && (this.noIndent = !0)
-        }
-
-        function q(a) {
-            a.context && (a.context = a.context.prev)
-        }
-
-        function r(a, b) {
-            for (var c;;) {
-                if (!a.context) return;
-                if (c = a.context.tagName, !g.contextGrabbers.hasOwnProperty(c) || !g.contextGrabbers[c].hasOwnProperty(b)) return;
-                q(a)
-            }
-        }
-
-        function s(a, b, c) {
-            return "openTag" == a ? (c.tagStart = b.column(), t) : "closeTag" == a ? u : s
-        }
-
-        function t(a, b, c) {
-            return "word" == a ? (c.tagName = b.current(), j = "tag", x) : (j = "error", t)
-        }
-
-        function u(a, b, c) {
-            if ("word" == a) {
-                var d = b.current();
-                return c.context && c.context.tagName != d && g.implicitlyClosed.hasOwnProperty(c.context.tagName) && q(c), c.context && c.context.tagName == d ? (j = "tag", v) : (j = "tag error", w)
-            }
-            return j = "error", w
-        }
-
-        function v(a, b, c) {
-            return "endTag" != a ? (j = "error", v) : (q(c), s)
-        }
-
-        function w(a, b, c) {
-            return j = "error", v(a, b, c)
-        }
-
-        function x(a, b, c) {
-            if ("word" == a) return j = "attribute", y;
-            if ("endTag" == a || "selfcloseTag" == a) {
-                var d = c.tagName,
-                    e = c.tagStart;
-                return c.tagName = c.tagStart = null, "selfcloseTag" == a || g.autoSelfClosers.hasOwnProperty(d) ? r(c, d) : (r(c, d), c.context = new p(c, d, e == c.indented)), s
-            }
-            return j = "error", x
-        }
-
-        function y(a, b, c) {
-            return "equals" == a ? z : (g.allowMissing || (j = "error"), x(a, b, c))
-        }
-
-        function z(a, b, c) {
-            return "string" == a ? A : "word" == a && g.allowUnquoted ? (j = "string", x) : (j = "error", x(a, b, c))
-        }
-
-        function A(a, b, c) {
-            return "string" == a ? A : x(a, b, c)
-        }
-        var d = b.indentUnit,
-            e = c.multilineTagIndentFactor || 1,
-            f = c.multilineTagIndentPastTag;
-        null == f && (f = !0);
-        var i, j, g = c.htmlMode ? {
-                autoSelfClosers: {
-                    area: !0,
-                    base: !0,
-                    br: !0,
-                    col: !0,
-                    command: !0,
-                    embed: !0,
-                    frame: !0,
-                    hr: !0,
-                    img: !0,
-                    input: !0,
-                    keygen: !0,
-                    link: !0,
-                    meta: !0,
-                    param: !0,
-                    source: !0,
-                    track: !0,
-                    wbr: !0,
-                    menuitem: !0
-                },
-                implicitlyClosed: {
-                    dd: !0,
-                    li: !0,
-                    optgroup: !0,
-                    option: !0,
-                    p: !0,
-                    rp: !0,
-                    rt: !0,
-                    tbody: !0,
-                    td: !0,
-                    tfoot: !0,
-                    th: !0,
-                    tr: !0
-                },
-                contextGrabbers: {
-                    dd: {
-                        dd: !0,
-                        dt: !0
-                    },
-                    dt: {
-                        dd: !0,
-                        dt: !0
-                    },
-                    li: {
-                        li: !0
-                    },
-                    option: {
-                        option: !0,
-                        optgroup: !0
-                    },
-                    optgroup: {
-                        optgroup: !0
-                    },
-                    p: {
-                        address: !0,
-                        article: !0,
-                        aside: !0,
-                        blockquote: !0,
-                        dir: !0,
-                        div: !0,
-                        dl: !0,
-                        fieldset: !0,
-                        footer: !0,
-                        form: !0,
-                        h1: !0,
-                        h2: !0,
-                        h3: !0,
-                        h4: !0,
-                        h5: !0,
-                        h6: !0,
-                        header: !0,
-                        hgroup: !0,
-                        hr: !0,
-                        menu: !0,
-                        nav: !0,
-                        ol: !0,
-                        p: !0,
-                        pre: !0,
-                        section: !0,
-                        table: !0,
-                        ul: !0
-                    },
-                    rp: {
-                        rp: !0,
-                        rt: !0
-                    },
-                    rt: {
-                        rp: !0,
-                        rt: !0
-                    },
-                    tbody: {
-                        tbody: !0,
-                        tfoot: !0
-                    },
-                    td: {
-                        td: !0,
-                        th: !0
-                    },
-                    tfoot: {
-                        tbody: !0
-                    },
-                    th: {
-                        td: !0,
-                        th: !0
-                    },
-                    thead: {
-                        tbody: !0,
-                        tfoot: !0
-                    },
-                    tr: {
-                        tr: !0
-                    }
-                },
-                doNotIndent: {
-                    pre: !0
-                },
-                allowUnquoted: !0,
-                allowMissing: !0,
-                caseFold: !0
-            } : {
-                autoSelfClosers: {},
-                implicitlyClosed: {},
-                contextGrabbers: {},
-                doNotIndent: {},
-                allowUnquoted: !1,
-                allowMissing: !1,
-                caseFold: !1
-            },
-            h = c.alignCDATA;
-        return k.isInText = !0, {
-            startState: function () {
-                return {
-                    tokenize: k,
-                    state: s,
-                    indented: 0,
-                    tagName: null,
-                    tagStart: null,
-                    context: null
-                }
-            },
-            token: function (a, b) {
-                if (!b.tagName && a.sol() && (b.indented = a.indentation()), a.eatSpace()) return null;
-                i = null;
-                var c = b.tokenize(a, b);
-                return (c || i) && "comment" != c && (j = null, b.state = b.state(i || c, a, b), j && (c = "error" == j ? c + " error" : j)), c
-            },
-            indent: function (b, c, i) {
-                var j = b.context;
-                if (b.tokenize.isInAttribute) return b.tagStart == b.indented ? b.stringStartCol + 1 : b.indented + d;
-                if (j && j.noIndent) return a.Pass;
-                if (b.tokenize != l && b.tokenize != k) return i ? i.match(/^(\s*)/)[0].length : 0;
-                if (b.tagName) return f ? b.tagStart + b.tagName.length + 2 : b.tagStart + d * e;
-                if (h && /<!\[CDATA\[/.test(c)) return 0;
-                var m = c && /^<(\/)?([\w_:\.-]*)/.exec(c);
-                if (m && m[1])
-                    for (; j;) {
-                        if (j.tagName == m[2]) {
-                            j = j.prev;
-                            break
-                        }
-                        if (!g.implicitlyClosed.hasOwnProperty(j.tagName)) break;
-                        j = j.prev
-                    } else if (m)
-                        for (; j;) {
-                            var n = g.contextGrabbers[j.tagName];
-                            if (!n || !n.hasOwnProperty(m[2])) break;
-                            j = j.prev
-                        }
-                    for (; j && !j.startOfLine;) j = j.prev;
-                return j ? j.indent + d : 0
-            },
-            electricInput: /<\/[\s\w:]+>$/,
-            blockCommentStart: "<!--",
-            blockCommentEnd: "-->",
-            configuration: c.htmlMode ? "html" : "xml",
-            helperType: c.htmlMode ? "html" : "xml"
-        }
-    }), a.defineMIME("text/xml", "xml"), a.defineMIME("application/xml", "xml"), a.mimeModes.hasOwnProperty("text/html") || a.defineMIME("text/html", {
-        name: "xml",
-        htmlMode: !0
-    })
-}),
-function (a) {
-    "object" == typeof exports && "object" == typeof module ? a(require("../../lib/codemirror")) : "function" == typeof define && define.amd ? define(["../../lib/codemirror"], a) : a(CodeMirror)
-}(function (a) {
-    "use strict";
-
-    function d(a) {
-        for (var d = 0; d < a.state.activeLines.length; d++) a.removeLineClass(a.state.activeLines[d], "wrap", b), a.removeLineClass(a.state.activeLines[d], "background", c)
-    }
-
-    function e(a, b) {
-        if (a.length != b.length) return !1;
-        for (var c = 0; c < a.length; c++)
-            if (a[c] != b[c]) return !1;
-        return !0
-    }
-
-    function f(a, f) {
-        for (var g = [], h = 0; h < f.length; h++) {
-            var i = f[h];
-            if (i.empty()) {
-                var j = a.getLineHandleVisualStart(i.head.line);
-                g[g.length - 1] != j && g.push(j)
-            }
-        }
-        e(a.state.activeLines, g) || a.operation(function () {
-            d(a);
-            for (var e = 0; e < g.length; e++) a.addLineClass(g[e], "wrap", b), a.addLineClass(g[e], "background", c);
-            a.state.activeLines = g
-        })
-    }
-
-    function g(a, b) {
-        f(a, b.ranges)
-    }
-    var b = "CodeMirror-activeline",
-        c = "CodeMirror-activeline-background";
-    a.defineOption("styleActiveLine", !1, function (b, c, e) {
-        var h = e && e != a.Init;
-        c && !h ? (b.state.activeLines = [], f(b, b.listSelections()), b.on("beforeSelectionChange", g)) : !c && h && (b.off("beforeSelectionChange", g), d(b), delete b.state.activeLines)
-    })
-}),
-function (a) {
-    "object" == typeof exports && "object" == typeof module ? a(require("../../lib/codemirror")) : "function" == typeof define && define.amd ? define(["../../lib/codemirror"], a) : a(CodeMirror)
-}(function (a) {
-    "use strict";
-    a.registerHelper("fold", "brace", function (b, c) {
-        function h(f) {
-            for (var h = c.ch, i = 0;;) {
-                var j = 0 >= h ? -1 : e.lastIndexOf(f, h - 1);
-                if (-1 != j) {
-                    if (1 == i && j < c.ch) break;
-                    if (g = b.getTokenTypeAt(a.Pos(d, j + 1)), !/^(comment|string)/.test(g)) return j + 1;
-                    h = j - 1
-                } else {
-                    if (1 == i) break;
-                    i = 1, h = e.length
-                }
-            }
-        }
-        var f, g, d = c.line,
-            e = b.getLine(d),
-            i = "{",
-            j = "}",
-            f = h("{");
-        if (null == f && (i = "[", j = "]", f = h("[")), null != f) {
-            var m, n, k = 1,
-                l = b.lastLine();
-            a: for (var o = d; l >= o; ++o)
-                for (var p = b.getLine(o), q = o == d ? f : 0;;) {
-                    var r = p.indexOf(i, q),
-                        s = p.indexOf(j, q);
-                    if (0 > r && (r = p.length), 0 > s && (s = p.length), q = Math.min(r, s), q == p.length) break;
-                    if (b.getTokenTypeAt(a.Pos(o, q + 1)) == g)
-                        if (q == r) ++k;
-                        else if (!--k) {
-                        m = o, n = q;
-                        break a
-                    }++q
-                }
-            if (null != m && (d != m || n != f)) return {
-                from: a.Pos(d, f),
-                to: a.Pos(m, n)
-            }
-        }
-    }), a.registerHelper("fold", "import", function (b, c) {
-        function d(c) {
-            if (c < b.firstLine() || c > b.lastLine()) return null;
-            var d = b.getTokenAt(a.Pos(c, 1));
-            if (/\S/.test(d.string) || (d = b.getTokenAt(a.Pos(c, d.end + 1))), "keyword" != d.type || "import" != d.string) return null;
-            for (var e = c, f = Math.min(b.lastLine(), c + 10); f >= e; ++e) {
-                var g = b.getLine(e),
-                    h = g.indexOf(";");
-                if (-1 != h) return {
-                    startCh: d.end,
-                    end: a.Pos(e, h)
-                }
-            }
-        }
-        var f, c = c.line,
-            e = d(c);
-        if (!e || d(c - 1) || (f = d(c - 2)) && f.end.line == c - 1) return null;
-        for (var g = e.end;;) {
-            var h = d(g.line + 1);
-            if (null == h) break;
-            g = h.end
-        }
-        return {
-            from: b.clipPos(a.Pos(c, e.startCh + 1)),
-            to: g
-        }
-    }), a.registerHelper("fold", "include", function (b, c) {
-        function d(c) {
-            if (c < b.firstLine() || c > b.lastLine()) return null;
-            var d = b.getTokenAt(a.Pos(c, 1));
-            return /\S/.test(d.string) || (d = b.getTokenAt(a.Pos(c, d.end + 1))), "meta" == d.type && "#include" == d.string.slice(0, 8) ? d.start + 8 : void 0
-        }
-        var c = c.line,
-            e = d(c);
-        if (null == e || null != d(c - 1)) return null;
-        for (var f = c;;) {
-            var g = d(f + 1);
-            if (null == g) break;
-            ++f
-        }
-        return {
-            from: a.Pos(c, e + 1),
-            to: b.clipPos(a.Pos(f))
-        }
-    })
-}),
-function (a) {
-    "object" == typeof exports && "object" == typeof module ? a(require("../../lib/codemirror")) : "function" == typeof define && define.amd ? define(["../../lib/codemirror"], a) : a(CodeMirror)
-}(function (a) {
-    function d(a, c) {
-        return "pairs" == c && "string" == typeof a ? a : "object" == typeof a && null != a[c] ? a[c] : b[c]
-    }
-
-    function h(a) {
-        return function (b) {
-            return l(b, a)
-        }
-    }
-
-    function i(a) {
-        var b = a.state.closeBrackets;
-        if (!b) return null;
-        var c = a.getModeAt(a.getCursor());
-        return c.closeBrackets || b
-    }
-
-    function j(b) {
-        var e = i(b);
-        if (!e || b.getOption("disableInput")) return a.Pass;
-        for (var f = d(e, "pairs"), g = b.listSelections(), h = 0; h < g.length; h++) {
-            if (!g[h].empty()) return a.Pass;
-            var j = n(b, g[h].head);
-            if (!j || f.indexOf(j) % 2 != 0) return a.Pass
-        }
-        for (var h = g.length - 1; h >= 0; h--) {
-            var k = g[h].head;
-            b.replaceRange("", c(k.line, k.ch - 1), c(k.line, k.ch + 1))
-        }
-    }
-
-    function k(b) {
-        var c = i(b),
-            e = c && d(c, "explode");
-        if (!e || b.getOption("disableInput")) return a.Pass;
-        for (var f = b.listSelections(), g = 0; g < f.length; g++) {
-            if (!f[g].empty()) return a.Pass;
-            var h = n(b, f[g].head);
-            if (!h || e.indexOf(h) % 2 != 0) return a.Pass
-        }
-        b.operation(function () {
-            b.replaceSelection("\n\n", null), b.execCommand("goCharLeft"), f = b.listSelections();
-            for (var a = 0; a < f.length; a++) {
-                var c = f[a].head.line;
-                b.indentLine(c, null, !0), b.indentLine(c + 1, null, !0)
-            }
-        })
-    }
-
-    function l(b, e) {
-        var f = i(b);
-        if (!f || b.getOption("disableInput")) return a.Pass;
-        var g = d(f, "pairs"),
-            h = g.indexOf(e);
-        if (-1 == h) return a.Pass;
-        for (var p, q, j = d(f, "triples"), k = g.charAt(h + 1) == e, l = b.listSelections(), n = h % 2 == 0, r = 0; r < l.length; r++) {
-            var u, s = l[r],
-                t = s.head,
-                q = b.getRange(t, c(t.line, t.ch + 1));
-            if (n && !s.empty()) u = "surround";
-            else if (!k && n || q != e)
-                if (k && t.ch > 1 && j.indexOf(e) >= 0 && b.getRange(c(t.line, t.ch - 2), t) == e + e && (t.ch <= 2 || b.getRange(c(t.line, t.ch - 3), c(t.line, t.ch - 2)) != e)) u = "addFour";
-                else if (k) {
-                if (a.isWordChar(q) || !o(b, t, e)) return a.Pass;
-                u = "both"
-            } else {
-                if (!n || b.getLine(t.line)
-                    .length != t.ch && !m(q, g) && !/\s/.test(q)) return a.Pass;
-                u = "both"
-            } else u = j.indexOf(e) >= 0 && b.getRange(t, c(t.line, t.ch + 3)) == e + e + e ? "skipThree" : "skip";
-            if (p) {
-                if (p != u) return a.Pass
-            } else p = u
-        }
-        var v = h % 2 ? g.charAt(h - 1) : e,
-            w = h % 2 ? e : g.charAt(h + 1);
-        b.operation(function () {
-            if ("skip" == p) b.execCommand("goCharRight");
-            else if ("skipThree" == p)
-                for (var a = 0; 3 > a; a++) b.execCommand("goCharRight");
-            else if ("surround" == p) {
-                for (var c = b.getSelections(), a = 0; a < c.length; a++) c[a] = v + c[a] + w;
-                b.replaceSelections(c, "around")
-            } else "both" == p ? (b.replaceSelection(v + w, null), b.triggerElectric(v + w), b.execCommand("goCharLeft")) : "addFour" == p && (b.replaceSelection(v + v + v + v, "before"), b.execCommand("goCharRight"))
-        })
-    }
-
-    function m(a, b) {
-        var c = b.lastIndexOf(a);
-        return c > -1 && c % 2 == 1
-    }
-
-    function n(a, b) {
-        var d = a.getRange(c(b.line, b.ch - 1), c(b.line, b.ch + 1));
-        return 2 == d.length ? d : null
-    }
-
-    function o(b, c, d) {
-        var e = b.getLine(c.line),
-            f = b.getTokenAt(c);
-        if (/\bstring2?\b/.test(f.type)) return !1;
-        var g = new a.StringStream(e.slice(0, c.ch) + d + e.slice(c.ch), 4);
-        for (g.pos = g.start = f.start;;) {
-            var h = b.getMode()
-                .token(g, f.state);
-            if (g.pos >= c.ch + 1) return /\bstring2?\b/.test(h);
-            g.start = g.pos
-        }
-    }
-    var b = {
-            pairs: "()[]{}''\"\"",
-            triples: "",
-            explode: "[]{}"
-        },
-        c = a.Pos;
-    a.defineOption("autoCloseBrackets", !1, function (b, c, d) {
-        d && d != a.Init && (b.removeKeyMap(f), b.state.closeBrackets = null), c && (b.state.closeBrackets = c, b.addKeyMap(f))
-    });
-    for (var e = b.pairs + "`", f = {
-            Backspace: j,
-            Enter: k
-        }, g = 0; g < e.length; g++) f["'" + e.charAt(g) + "'"] = h(e.charAt(g))
-}),
-function (a) {
-    "object" == typeof exports && "object" == typeof module ? a(require("../../lib/codemirror"), require("../fold/xml-fold")) : "function" == typeof define && define.amd ? define(["../../lib/codemirror", "../fold/xml-fold"], a) : a(CodeMirror)
-}(function (a) {
-    function d(d) {
-        if (d.getOption("disableInput")) return a.Pass;
-        for (var e = d.listSelections(), f = [], i = 0; i < e.length; i++) {
-            if (!e[i].empty()) return a.Pass;
-            var j = e[i].head,
-                k = d.getTokenAt(j),
-                l = a.innerMode(d.getMode(), k.state),
-                m = l.state;
-            if ("xml" != l.mode.name || !m.tagName) return a.Pass;
-            var n = d.getOption("autoCloseTags"),
-                o = "html" == l.mode.configuration,
-                p = "object" == typeof n && n.dontCloseTags || o && b,
-                q = "object" == typeof n && n.indentTags || o && c,
-                r = m.tagName;
-            k.end > j.ch && (r = r.slice(0, r.length - k.end + j.ch));
-            var s = r.toLowerCase();
-            if (!r || "string" == k.type && (k.end != j.ch || !/[\"\']/.test(k.string.charAt(k.string.length - 1)) || 1 == k.string.length) || "tag" == k.type && "closeTag" == m.type || k.string.indexOf("/") == k.string.length - 1 || p && g(p, s) > -1 || h(d, r, j, m, !0)) return a.Pass;
-            var t = q && g(q, s) > -1;
-            f[i] = {
-                indent: t,
-                text: ">" + (t ? "\n\n" : "") + "</" + r + ">",
-                newPos: t ? a.Pos(j.line + 1, 0) : a.Pos(j.line, j.ch + 1)
-            }
-        }
-        for (var i = e.length - 1; i >= 0; i--) {
-            var u = f[i];
-            d.replaceRange(u.text, e[i].head, e[i].anchor, "+insert");
-            var v = d.listSelections()
-                .slice(0);
-            v[i] = {
-                head: u.newPos,
-                anchor: u.newPos
-            }, d.setSelections(v), u.indent && (d.indentLine(u.newPos.line, null, !0), d.indentLine(u.newPos.line + 1, null, !0))
-        }
-    }
-
-    function e(b, c) {
-        for (var d = b.listSelections(), e = [], f = c ? "/" : "</", g = 0; g < d.length; g++) {
-            if (!d[g].empty()) return a.Pass;
-            var i = d[g].head,
-                j = b.getTokenAt(i),
-                k = a.innerMode(b.getMode(), j.state),
-                l = k.state;
-            if (c && ("string" == j.type || "<" != j.string.charAt(0) || j.start != i.ch - 1)) return a.Pass;
-            var m;
-            if ("xml" != k.mode.name)
-                if ("htmlmixed" == b.getMode()
-                    .name && "javascript" == k.mode.name) m = f + "script";
-                else {
-                    if ("htmlmixed" != b.getMode()
-                        .name || "css" != k.mode.name) return a.Pass;
-                    m = f + "style"
-                } else {
-                if (!l.context || !l.context.tagName || h(b, l.context.tagName, i, l)) return a.Pass;
-                m = f + l.context.tagName;
-            }
-            ">" != b.getLine(i.line)
-                .charAt(j.end) && (m += ">"), e[g] = m
-        }
-        b.replaceSelections(e), d = b.listSelections();
-        for (var g = 0; g < d.length; g++)(g == d.length - 1 || d[g].head.line < d[g + 1].head.line) && b.indentLine(d[g].head.line)
-    }
-
-    function f(b) {
-        return b.getOption("disableInput") ? a.Pass : e(b, !0)
-    }
-
-    function g(a, b) {
-        if (a.indexOf) return a.indexOf(b);
-        for (var c = 0, d = a.length; d > c; ++c)
-            if (a[c] == b) return c;
-        return -1
-    }
-
-    function h(b, c, d, e, f) {
-        if (!a.scanForClosingTag) return !1;
-        var g = Math.min(b.lastLine() + 1, d.line + 500),
-            h = a.scanForClosingTag(b, d, null, g);
-        if (!h || h.tag != c) return !1;
-        for (var i = e.context, j = f ? 1 : 0; i && i.tagName == c; i = i.prev) ++j;
-        d = h.to;
-        for (var k = 1; j > k; k++) {
-            var l = a.scanForClosingTag(b, d, null, g);
-            if (!l || l.tag != c) return !1;
-            d = l.to
-        }
-        return !0
-    }
-    a.defineOption("autoCloseTags", !1, function (b, c, e) {
-        if (e != a.Init && e && b.removeKeyMap("autoCloseTags"), c) {
-            var g = {
-                name: "autoCloseTags"
-            };
-            ("object" != typeof c || c.whenClosing) && (g["'/'"] = function (a) {
-                return f(a)
-            }), ("object" != typeof c || c.whenOpening) && (g["'>'"] = function (a) {
-                return d(a)
-            }), b.addKeyMap(g)
-        }
-    });
-    var b = ["area", "base", "br", "col", "command", "embed", "hr", "img", "input", "keygen", "link", "meta", "param", "source", "track", "wbr"],
-        c = ["applet", "blockquote", "body", "button", "div", "dl", "fieldset", "form", "frameset", "h1", "h2", "h3", "h4", "h5", "h6", "head", "html", "iframe", "layer", "legend", "object", "ol", "p", "select", "table", "ul"];
-    a.commands.closeTag = function (a) {
-        return e(a)
-    }
-}),
-function (a) {
-    "object" == typeof exports && "object" == typeof module ? a(require("../../lib/codemirror")) : "function" == typeof define && define.amd ? define(["../../lib/codemirror"], a) : a(CodeMirror)
-}(function (a) {
-    "use strict";
-
-    function b(b, d, f, g) {
-        function j(a) {
-            var c = h(b, d);
-            if (!c || c.to.line - c.from.line < i) return null;
-            for (var e = b.findMarksAt(c.from), f = 0; f < e.length; ++f)
-                if (e[f].__isFold && "fold" !== g) {
-                    if (!a) return null;
-                    c.cleared = !0, e[f].clear()
-                }
-            return c
-        }
-        if (f && f.call) {
-            var h = f;
-            f = null
-        } else var h = e(b, f, "rangeFinder");
-        "number" == typeof d && (d = a.Pos(d, 0));
-        var i = e(b, f, "minFoldSize"),
-            k = j(!0);
-        if (e(b, f, "scanUp"))
-            for (; !k && d.line > b.firstLine();) d = a.Pos(d.line - 1, 0), k = j(!1);
-        if (k && !k.cleared && "unfold" !== g) {
-            var l = c(b, f);
-            a.on(l, "mousedown", function (b) {
-                m.clear(), a.e_preventDefault(b)
-            });
-            var m = b.markText(k.from, k.to, {
-                replacedWith: l,
-                clearOnEnter: !0,
-                __isFold: !0
-            });
-            m.on("clear", function (c, d) {
-                a.signal(b, "unfold", b, c, d)
-            }), a.signal(b, "fold", b, k.from, k.to)
-        }
-    }
-
-    function c(a, b) {
-        var c = e(a, b, "widget");
-        if ("string" == typeof c) {
-            var d = document.createTextNode(c);
-            c = document.createElement("span"), c.appendChild(d), c.className = "CodeMirror-foldmarker"
-        }
-        return c
-    }
-
-    function e(a, b, c) {
-        if (b && void 0 !== b[c]) return b[c];
-        var e = a.options.foldOptions;
-        return e && void 0 !== e[c] ? e[c] : d[c]
-    }
-    a.newFoldFunction = function (a, c) {
-        return function (d, e) {
-            b(d, e, {
-                rangeFinder: a,
-                widget: c
-            })
-        }
-    }, a.defineExtension("foldCode", function (a, c, d) {
-        b(this, a, c, d)
-    }), a.defineExtension("isFolded", function (a) {
-        for (var b = this.findMarksAt(a), c = 0; c < b.length; ++c)
-            if (b[c].__isFold) return !0
-    }), a.commands.toggleFold = function (a) {
-        a.foldCode(a.getCursor())
-    }, a.commands.fold = function (a) {
-        a.foldCode(a.getCursor(), null, "fold")
-    }, a.commands.unfold = function (a) {
-        a.foldCode(a.getCursor(), null, "unfold")
-    }, a.commands.foldAll = function (b) {
-        b.operation(function () {
-            for (var c = b.firstLine(), d = b.lastLine(); d >= c; c++) b.foldCode(a.Pos(c, 0), null, "fold")
-        })
-    }, a.commands.unfoldAll = function (b) {
-        b.operation(function () {
-            for (var c = b.firstLine(), d = b.lastLine(); d >= c; c++) b.foldCode(a.Pos(c, 0), null, "unfold")
-        })
-    }, a.registerHelper("fold", "combine", function () {
-        var a = Array.prototype.slice.call(arguments, 0);
-        return function (b, c) {
-            for (var d = 0; d < a.length; ++d) {
-                var e = a[d](b, c);
-                if (e) return e
-            }
-        }
-    }), a.registerHelper("fold", "auto", function (a, b) {
-        for (var c = a.getHelpers(b, "fold"), d = 0; d < c.length; d++) {
-            var e = c[d](a, b);
-            if (e) return e
-        }
-    });
-    var d = {
-        rangeFinder: a.fold.auto,
-        widget: "\u2194",
-        minFoldSize: 0,
-        scanUp: !1
-    };
-    a.defineOption("foldOptions", null), a.defineExtension("foldOption", function (a, b) {
-        return e(this, a, b)
-    })
-}),
-function (a) {
-    "object" == typeof exports && "object" == typeof module ? a(require("../../lib/codemirror"), require("./foldcode")) : "function" == typeof define && define.amd ? define(["../../lib/codemirror", "./foldcode"], a) : a(CodeMirror)
-}(function (a) {
-    "use strict";
-
-    function c(a) {
-        this.options = a, this.from = this.to = 0
-    }
-
-    function d(a) {
-        return a === !0 && (a = {}), null == a.gutter && (a.gutter = "CodeMirror-foldgutter"), null == a.indicatorOpen && (a.indicatorOpen = "CodeMirror-foldgutter-open"), null == a.indicatorFolded && (a.indicatorFolded = "CodeMirror-foldgutter-folded"), a
-    }
-
-    function e(a, c) {
-        for (var d = a.findMarksAt(b(c)), e = 0; e < d.length; ++e)
-            if (d[e].__isFold && d[e].find()
-                .from.line == c) return d[e]
-    }
-
-    function f(a) {
-        if ("string" == typeof a) {
-            var b = document.createElement("div");
-            return b.className = a + " CodeMirror-guttermarker-subtle", b
-        }
-        return a.cloneNode(!0)
-    }
-
-    function g(a, c, d) {
-        var g = a.state.foldGutter.options,
-            h = c,
-            i = a.foldOption(g, "minFoldSize"),
-            j = a.foldOption(g, "rangeFinder");
-        a.eachLine(c, d, function (c) {
-            var d = null;
-            if (e(a, h)) d = f(g.indicatorFolded);
-            else {
-                var k = b(h, 0),
-                    l = j && j(a, k);
-                l && l.to.line - l.from.line >= i && (d = f(g.indicatorOpen))
-            }
-            a.setGutterMarker(c, g.gutter, d), ++h
-        })
-    }
-
-    function h(a) {
-        var b = a.getViewport(),
-            c = a.state.foldGutter;
-        c && (a.operation(function () {
-            g(a, b.from, b.to)
-        }), c.from = b.from, c.to = b.to)
-    }
-
-    function i(a, c, d) {
-        var f = a.state.foldGutter;
-        if (f) {
-            var g = f.options;
-            if (d == g.gutter) {
-                var h = e(a, c);
-                h ? h.clear() : a.foldCode(b(c, 0), g.rangeFinder)
-            }
-        }
-    }
-
-    function j(a) {
-        var b = a.state.foldGutter;
-        if (b) {
-            var c = b.options;
-            b.from = b.to = 0, clearTimeout(b.changeUpdate), b.changeUpdate = setTimeout(function () {
-                h(a)
-            }, c.foldOnChangeTimeSpan || 600)
-        }
-    }
-
-    function k(a) {
-        var b = a.state.foldGutter;
-        if (b) {
-            var c = b.options;
-            clearTimeout(b.changeUpdate), b.changeUpdate = setTimeout(function () {
-                var c = a.getViewport();
-                b.from == b.to || c.from - b.to > 20 || b.from - c.to > 20 ? h(a) : a.operation(function () {
-                    c.from < b.from && (g(a, c.from, b.from), b.from = c.from), c.to > b.to && (g(a, b.to, c.to), b.to = c.to)
-                })
-            }, c.updateViewportTimeSpan || 400)
-        }
-    }
-
-    function l(a, b) {
-        var c = a.state.foldGutter;
-        if (c) {
-            var d = b.line;
-            d >= c.from && d < c.to && g(a, d, d + 1)
-        }
-    }
-    a.defineOption("foldGutter", !1, function (b, e, f) {
-        f && f != a.Init && (b.clearGutter(b.state.foldGutter.options.gutter), b.state.foldGutter = null, b.off("gutterClick", i), b.off("change", j), b.off("viewportChange", k), b.off("fold", l), b.off("unfold", l), b.off("swapDoc", h)), e && (b.state.foldGutter = new c(d(e)), h(b), b.on("gutterClick", i), b.on("change", j), b.on("viewportChange", k), b.on("fold", l), b.on("unfold", l), b.on("swapDoc", h))
-    });
-    var b = a.Pos
-}),
-function (a) {
-    "object" == typeof exports && "object" == typeof module ? a(require("../../lib/codemirror")) : "function" == typeof define && define.amd ? define(["../../lib/codemirror"], a) : a(CodeMirror)
-}(function (a) {
-    "use strict";
-    a.registerHelper("fold", "indent", function (b, c) {
-        var d = b.getOption("tabSize"),
-            e = b.getLine(c.line);
-        if (/\S/.test(e)) {
-            for (var f = function (b) {
-                    return a.countColumn(b, null, d)
-                }, g = f(e), h = null, i = c.line + 1, j = b.lastLine(); j >= i; ++i) {
-                var k = b.getLine(i),
-                    l = f(k);
-                if (l > g) h = i;
-                else if (/\S/.test(k)) break
-            }
-            return h ? {
-                from: a.Pos(c.line, e.length),
-                to: a.Pos(h, b.getLine(h)
-                    .length)
-            } : void 0
-        }
-    })
-}),
-function (a) {
-    "object" == typeof exports && "object" == typeof module ? a(require("../../lib/codemirror")) : "function" == typeof define && define.amd ? define(["../../lib/codemirror"], a) : a(CodeMirror)
-}(function (a) {
-    "use strict";
-
-    function f(a) {
-        "object" == typeof a && (this.minChars = a.minChars, this.style = a.style, this.showToken = a.showToken, this.delay = a.delay, this.wordsOnly = a.wordsOnly), null == this.style && (this.style = c), null == this.minChars && (this.minChars = b), null == this.delay && (this.delay = d), null == this.wordsOnly && (this.wordsOnly = e), this.overlay = this.timeout = null
-    }
-
-    function g(a) {
-        var b = a.state.matchHighlighter;
-        clearTimeout(b.timeout), b.timeout = setTimeout(function () {
-            h(a)
-        }, b.delay)
-    }
-
-    function h(a) {
-        a.operation(function () {
-            var b = a.state.matchHighlighter;
-            if (b.overlay && (a.removeOverlay(b.overlay), b.overlay = null), !a.somethingSelected() && b.showToken) {
-                for (var c = b.showToken === !0 ? /[\w$]/ : b.showToken, d = a.getCursor(), e = a.getLine(d.line), f = d.ch, g = f; f && c.test(e.charAt(f - 1));) --f;
-                for (; g < e.length && c.test(e.charAt(g));) ++g;
-                return void(g > f && a.addOverlay(b.overlay = k(e.slice(f, g), c, b.style)))
-            }
-            var h = a.getCursor("from"),
-                j = a.getCursor("to");
-            if (h.line == j.line && (!b.wordsOnly || i(a, h, j))) {
-                var l = a.getRange(h, j)
-                    .replace(/^\s+|\s+$/g, "");
-                l.length >= b.minChars && a.addOverlay(b.overlay = k(l, !1, b.style))
-            }
-        })
-    }
-
-    function i(a, b, c) {
-        var d = a.getRange(b, c);
-        if (null !== d.match(/^\w+$/)) {
-            if (b.ch > 0) {
-                var e = {
-                        line: b.line,
-                        ch: b.ch - 1
-                    },
-                    f = a.getRange(e, b);
-                if (null === f.match(/\W/)) return !1
-            }
-            if (c.ch < a.getLine(b.line)
-                .length) {
-                var e = {
-                        line: c.line,
-                        ch: c.ch + 1
-                    },
-                    f = a.getRange(c, e);
-                if (null === f.match(/\W/)) return !1
-            }
-            return !0
-        }
-        return !1
-    }
-
-    function j(a, b) {
-        return !(a.start && b.test(a.string.charAt(a.start - 1)) || a.pos != a.string.length && b.test(a.string.charAt(a.pos)))
-    }
-
-    function k(a, b, c) {
-        return {
-            token: function (d) {
-                return !d.match(a) || b && !j(d, b) ? (d.next(), void(d.skipTo(a.charAt(0)) || d.skipToEnd())) : c
-            }
-        }
-    }
-    var b = 2,
-        c = "matchhighlight",
-        d = 100,
-        e = !1;
-    a.defineOption("highlightSelectionMatches", !1, function (b, c, d) {
-        if (d && d != a.Init) {
-            var e = b.state.matchHighlighter.overlay;
-            e && b.removeOverlay(e), clearTimeout(b.state.matchHighlighter.timeout), b.state.matchHighlighter = null, b.off("cursorActivity", g)
-        }
-        c && (b.state.matchHighlighter = new f(c), h(b), b.on("cursorActivity", g))
-    })
-}),
-function (a) {
-    "object" == typeof exports && "object" == typeof module ? a(require("../../lib/codemirror")) : "function" == typeof define && define.amd ? define(["../../lib/codemirror"], a) : a(CodeMirror)
-}(function (a) {
-    function e(a, b, e, g) {
-        var h = a.getLineHandle(b.line),
-            i = b.ch - 1,
-            j = i >= 0 && d[h.text.charAt(i)] || d[h.text.charAt(++i)];
-        if (!j) return null;
-        var k = ">" == j.charAt(1) ? 1 : -1;
-        if (e && k > 0 != (i == b.ch)) return null;
-        var l = a.getTokenTypeAt(c(b.line, i + 1)),
-            m = f(a, c(b.line, i + (k > 0 ? 1 : 0)), k, l || null, g);
-        return null == m ? null : {
-            from: c(b.line, i),
-            to: m && m.pos,
-            match: m && m.ch == j.charAt(0),
-            forward: k > 0
-        }
-    }
-
-    function f(a, b, e, f, g) {
-        for (var h = g && g.maxScanLineLength || 1e4, i = g && g.maxScanLines || 1e3, j = [], k = g && g.bracketRegex ? g.bracketRegex : /[(){}[\]]/, l = e > 0 ? Math.min(b.line + i, a.lastLine() + 1) : Math.max(a.firstLine() - 1, b.line - i), m = b.line; m != l; m += e) {
-            var n = a.getLine(m);
-            if (n) {
-                var o = e > 0 ? 0 : n.length - 1,
-                    p = e > 0 ? n.length : -1;
-                if (!(n.length > h))
-                    for (m == b.line && (o = b.ch - (0 > e ? 1 : 0)); o != p; o += e) {
-                        var q = n.charAt(o);
-                        if (k.test(q) && (void 0 === f || a.getTokenTypeAt(c(m, o + 1)) == f)) {
-                            var r = d[q];
-                            if (">" == r.charAt(1) == e > 0) j.push(q);
-                            else {
-                                if (!j.length) return {
-                                    pos: c(m, o),
-                                    ch: q
-                                };
-                                j.pop()
-                            }
-                        }
-                    }
-            }
-        }
-        return m - e == (e > 0 ? a.lastLine() : a.firstLine()) ? !1 : null
-    }
-
-    function g(a, d, f) {
-        for (var g = a.state.matchBrackets.maxHighlightLineLength || 1e3, h = [], i = a.listSelections(), j = 0; j < i.length; j++) {
-            var k = i[j].empty() && e(a, i[j].head, !1, f);
-            if (k && a.getLine(k.from.line)
-                .length <= g) {
-                var l = k.match ? "CodeMirror-matchingbracket" : "CodeMirror-nonmatchingbracket";
-                h.push(a.markText(k.from, c(k.from.line, k.from.ch + 1), {
-                        className: l
-                    })), k.to && a.getLine(k.to.line)
-                    .length <= g && h.push(a.markText(k.to, c(k.to.line, k.to.ch + 1), {
-                        className: l
-                    }))
-            }
-        }
-        if (h.length) {
-            b && a.state.focused && a.focus();
-            var m = function () {
-                a.operation(function () {
-                    for (var a = 0; a < h.length; a++) h[a].clear()
-                })
-            };
-            if (!d) return m;
-            setTimeout(m, 800)
-        }
-    }
-
-    function i(a) {
-        a.operation(function () {
-            h && (h(), h = null), h = g(a, !1, a.state.matchBrackets)
-        })
-    }
-    var b = /MSIE \d/.test(navigator.userAgent) && (null == document.documentMode || document.documentMode < 8),
-        c = a.Pos,
-        d = {
-            "(": ")>",
-            ")": "(<",
-            "[": "]>",
-            "]": "[<",
-            "{": "}>",
-            "}": "{<"
-        },
-        h = null;
-    a.defineOption("matchBrackets", !1, function (b, c, d) {
-        d && d != a.Init && b.off("cursorActivity", i), c && (b.state.matchBrackets = "object" == typeof c ? c : {}, b.on("cursorActivity", i))
-    }), a.defineExtension("matchBrackets", function () {
-        g(this, !0)
-    }), a.defineExtension("findMatchingBracket", function (a, b, c) {
-        return e(this, a, b, c)
-    }), a.defineExtension("scanForBracket", function (a, b, c, d) {
-        return f(this, a, b, c, d)
-    })
-}),
-function (a) {
-    "object" == typeof exports && "object" == typeof module ? a(require("../../lib/codemirror"), require("../fold/xml-fold")) : "function" == typeof define && define.amd ? define(["../../lib/codemirror", "../fold/xml-fold"], a) : a(CodeMirror)
-}(function (a) {
-    "use strict";
-
-    function b(a) {
-        a.state.tagHit && a.state.tagHit.clear(), a.state.tagOther && a.state.tagOther.clear(), a.state.tagHit = a.state.tagOther = null
-    }
-
-    function c(c) {
-        c.state.failedTagMatch = !1, c.operation(function () {
-            if (b(c), !c.somethingSelected()) {
-                var d = c.getCursor(),
-                    e = c.getViewport();
-                e.from = Math.min(e.from, d.line), e.to = Math.max(d.line + 1, e.to);
-                var f = a.findMatchingTag(c, d, e);
-                if (f) {
-                    if (c.state.matchBothTags) {
-                        var g = "open" == f.at ? f.open : f.close;
-                        g && (c.state.tagHit = c.markText(g.from, g.to, {
-                            className: "CodeMirror-matchingtag"
-                        }))
-                    }
-                    var h = "close" == f.at ? f.open : f.close;
-                    h ? c.state.tagOther = c.markText(h.from, h.to, {
-                        className: "CodeMirror-matchingtag"
-                    }) : c.state.failedTagMatch = !0
-                }
-            }
-        })
-    }
-
-    function d(a) {
-        a.state.failedTagMatch && c(a)
-    }
-    a.defineOption("matchTags", !1, function (e, f, g) {
-        g && g != a.Init && (e.off("cursorActivity", c), e.off("viewportChange", d), b(e)), f && (e.state.matchBothTags = "object" == typeof f && f.bothTags, e.on("cursorActivity", c), e.on("viewportChange", d), c(e))
-    }), a.commands.toMatchingTag = function (b) {
-        var c = a.findMatchingTag(b, b.getCursor());
-        if (c) {
-            var d = "close" == c.at ? c.open : c.close;
-            d && b.extendSelection(d.to, d.from)
-        }
-    }
-}),
-function (a) {
-    "object" == typeof exports && "object" == typeof module ? a(require("../../lib/codemirror"), require("./searchcursor"), require("../dialog/dialog")) : "function" == typeof define && define.amd ? define(["../../lib/codemirror", "./searchcursor", "../dialog/dialog"], a) : a(CodeMirror)
-}(function (a) {
-    "use strict";
-
-    function b(a, b) {
-        return "string" == typeof a ? a = new RegExp(a.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"), b ? "gi" : "g") : a.global || (a = new RegExp(a.source, a.ignoreCase ? "gi" : "g")), {
-            token: function (b) {
-                a.lastIndex = b.pos;
-                var c = a.exec(b.string);
-                return c && c.index == b.pos ? (b.pos += c[0].length, "searching") : void(c ? b.pos = c.index : b.skipToEnd())
-            }
-        }
-    }
-
-    function c() {
-        this.posFrom = this.posTo = this.lastQuery = this.query = null, this.overlay = null
-    }
-
-    function d(a) {
-        return a.state.search || (a.state.search = new c)
-    }
-
-    function e(a) {
-        return "string" == typeof a && a == a.toLowerCase()
-    }
-
-    function f(a, b, c) {
-        return a.getSearchCursor(b, c, e(b))
-    }
-
-    function g(a, b, c, d) {
-        a.openDialog(b, d, {
-            value: c,
-            selectValueOnOpen: !0,
-            closeOnEnter: !1,
-            onClose: function () {
-                p(a)
-            }
-        })
-    }
-
-    function h(a, b, c, d, e) {
-        a.openDialog ? a.openDialog(b, e, {
-            value: d,
-            selectValueOnOpen: !0
-        }) : e(prompt(c, d))
-    }
-
-    function i(a, b, c, d) {
-        a.openConfirm ? a.openConfirm(b, d) : confirm(c) && d[0]()
-    }
-
-    function j(a) {
-        return a.replace(/\\(.)/g, function (a, b) {
-            return "n" == b ? "\n" : "r" == b ? "\r" : b
-        })
-    }
-
-    function k(a) {
-        var b = a.match(/^\/(.*)\/([a-z]*)$/);
-        if (b) try {
-            a = new RegExp(b[1], -1 == b[2].indexOf("i") ? "" : "i")
-        } catch (c) {} else a = j(a);
-        return ("string" == typeof a ? "" == a : a.test("")) && (a = /x^/), a
-    }
-
-    function m(a, c, d) {
-        c.queryText = d, c.query = k(d), a.removeOverlay(c.overlay, e(c.query)), c.overlay = b(c.query, e(c.query)), a.addOverlay(c.overlay), a.showMatchesOnScrollbar && (c.annotate && (c.annotate.clear(), c.annotate = null), c.annotate = a.showMatchesOnScrollbar(c.query, e(c.query)))
-    }
-
-    function n(b, c, e) {
-        var f = d(b);
-        if (f.query) return o(b, c);
-        var i = b.getSelection() || f.lastQuery;
-        e && b.openDialog ? g(b, l, i, function (c, d) {
-            a.e_stop(d), c && (c != f.queryText && m(b, f, c), o(b, d.shiftKey))
-        }) : h(b, l, "Search for:", i, function (a) {
-            a && !f.query && b.operation(function () {
-                m(b, f, a), f.posFrom = f.posTo = b.getCursor(), o(b, c)
-            })
-        })
-    }
-
-    function o(b, c) {
-        b.operation(function () {
-            var e = d(b),
-                g = f(b, e.query, c ? e.posFrom : e.posTo);
-            (g.find(c) || (g = f(b, e.query, c ? a.Pos(b.lastLine()) : a.Pos(b.firstLine(), 0)), g.find(c))) && (b.setSelection(g.from(), g.to()), b.scrollIntoView({
-                from: g.from(),
-                to: g.to()
-            }, 20), e.posFrom = g.from(), e.posTo = g.to())
-        })
-    }
-
-    function p(a) {
-        a.operation(function () {
-            var b = d(a);
-            b.lastQuery = b.query, b.query && (b.query = b.queryText = null, a.removeOverlay(b.overlay), b.annotate && (b.annotate.clear(), b.annotate = null))
-        })
-    }
-
-    function t(a, b) {
-        if (!a.getOption("readOnly")) {
-            var c = a.getSelection() || d(a)
-                .lastQuery;
-            h(a, q, "Replace:", c, function (c) {
-                c && (c = k(c), h(a, r, "Replace with:", "", function (d) {
-                    if (d = j(d), b) a.operation(function () {
-                        for (var b = f(a, c); b.findNext();)
-                            if ("string" != typeof c) {
-                                var e = a.getRange(b.from(), b.to())
-                                    .match(c);
-                                b.replace(d.replace(/\$(\d)/g, function (a, b) {
-                                    return e[b]
-                                }))
-                            } else b.replace(d)
-                    });
-                    else {
-                        p(a);
-                        var e = f(a, c, a.getCursor()),
-                            g = function () {
-                                var d, b = e.from();
-                                !(d = e.findNext()) && (e = f(a, c), !(d = e.findNext()) || b && e.from()
-                                    .line == b.line && e.from()
-                                    .ch == b.ch) || (a.setSelection(e.from(), e.to()), a.scrollIntoView({
-                                    from: e.from(),
-                                    to: e.to()
-                                }), i(a, s, "Replace?", [function () {
-                                    h(d)
-                                }, g]))
-                            },
-                            h = function (a) {
-                                e.replace("string" == typeof c ? d : d.replace(/\$(\d)/g, function (b, c) {
-                                    return a[c]
-                                })), g()
-                            };
-                        g()
-                    }
-                }))
-            })
-        }
-    }
-    var l = 'Search: <input type="text" style="width: 10em" class="CodeMirror-search-field"/> <span style="color: #888" class="CodeMirror-search-hint">(Use /re/ syntax for regexp search)</span>',
-        q = 'Replace: <input type="text" style="width: 10em" class="CodeMirror-search-field"/> <span style="color: #888" class="CodeMirror-search-hint">(Use /re/ syntax for regexp search)</span>',
-        r = 'With: <input type="text" style="width: 10em" class="CodeMirror-search-field"/>',
-        s = "Replace? <button>Yes</button> <button>No</button> <button>Stop</button>";
-    a.commands.find = function (a) {
-        p(a), n(a)
-    }, a.commands.findPersistent = function (a) {
-        p(a), n(a, !1, !0)
-    }, a.commands.findNext = n, a.commands.findPrev = function (a) {
-        n(a, !0)
-    }, a.commands.clearSearch = p, a.commands.replace = t, a.commands.replaceAll = function (a) {
-        t(a, !0)
-    }
-}),
-function (a) {
-    "object" == typeof exports && "object" == typeof module ? a(require("../../lib/codemirror")) : "function" == typeof define && define.amd ? define(["../../lib/codemirror"], a) : a(CodeMirror)
-}(function (a) {
-    "use strict";
-
-    function c(a, b) {
-        return a.line - b.line || a.ch - b.ch
-    }
-
-    function g(a, b, c, d) {
-        this.line = b, this.ch = c, this.cm = a, this.text = a.getLine(b), this.min = d ? d.from : a.firstLine(), this.max = d ? d.to - 1 : a.lastLine()
-    }
-
-    function h(a, c) {
-        var d = a.cm.getTokenTypeAt(b(a.line, c));
-        return d && /\btag\b/.test(d)
-    }
-
-    function i(a) {
-        return a.line >= a.max ? void 0 : (a.ch = 0, a.text = a.cm.getLine(++a.line), !0)
-    }
-
-    function j(a) {
-        return a.line <= a.min ? void 0 : (a.text = a.cm.getLine(--a.line), a.ch = a.text.length, !0)
-    }
-
-    function k(a) {
-        for (;;) {
-            var b = a.text.indexOf(">", a.ch);
-            if (-1 == b) {
-                if (i(a)) continue;
-                return
-            } {
-                if (h(a, b + 1)) {
-                    var c = a.text.lastIndexOf("/", b),
-                        d = c > -1 && !/\S/.test(a.text.slice(c + 1, b));
-                    return a.ch = b + 1, d ? "selfClose" : "regular"
-                }
-                a.ch = b + 1
-            }
-        }
-    }
-
-    function l(a) {
-        for (;;) {
-            var b = a.ch ? a.text.lastIndexOf("<", a.ch - 1) : -1;
-            if (-1 == b) {
-                if (j(a)) continue;
-                return
-            }
-            if (h(a, b + 1)) {
-                f.lastIndex = b, a.ch = b;
-                var c = f.exec(a.text);
-                if (c && c.index == b) return c
-            } else a.ch = b
-        }
-    }
-
-    function m(a) {
-        for (;;) {
-            f.lastIndex = a.ch;
-            var b = f.exec(a.text);
-            if (!b) {
-                if (i(a)) continue;
-                return
-            } {
-                if (h(a, b.index + 1)) return a.ch = b.index + b[0].length, b;
-                a.ch = b.index + 1
-            }
-        }
-    }
-
-    function n(a) {
-        for (;;) {
-            var b = a.ch ? a.text.lastIndexOf(">", a.ch - 1) : -1;
-            if (-1 == b) {
-                if (j(a)) continue;
-                return
-            } {
-                if (h(a, b + 1)) {
-                    var c = a.text.lastIndexOf("/", b),
-                        d = c > -1 && !/\S/.test(a.text.slice(c + 1, b));
-                    return a.ch = b + 1, d ? "selfClose" : "regular"
-                }
-                a.ch = b
-            }
-        }
-    }
-
-    function o(a, c) {
-        for (var d = [];;) {
-            var f, e = m(a),
-                g = a.line,
-                h = a.ch - (e ? e[0].length : 0);
-            if (!e || !(f = k(a))) return;
-            if ("selfClose" != f)
-                if (e[1]) {
-                    for (var i = d.length - 1; i >= 0; --i)
-                        if (d[i] == e[2]) {
-                            d.length = i;
-                            break
-                        }
-                    if (0 > i && (!c || c == e[2])) return {
-                        tag: e[2],
-                        from: b(g, h),
-                        to: b(a.line, a.ch)
-                    }
-                } else d.push(e[2])
-        }
-    }
-
-    function p(a, c) {
-        for (var d = [];;) {
-            var e = n(a);
-            if (!e) return;
-            if ("selfClose" != e) {
-                var f = a.line,
-                    g = a.ch,
-                    h = l(a);
-                if (!h) return;
-                if (h[1]) d.push(h[2]);
-                else {
-                    for (var i = d.length - 1; i >= 0; --i)
-                        if (d[i] == h[2]) {
-                            d.length = i;
-                            break
-                        }
-                    if (0 > i && (!c || c == h[2])) return {
-                        tag: h[2],
-                        from: b(a.line, a.ch),
-                        to: b(f, g)
-                    }
-                }
-            } else l(a)
-        }
-    }
-    var b = a.Pos,
-        d = "A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD",
-        e = d + "-:.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040",
-        f = new RegExp("<(/?)([" + d + "][" + e + "]*)", "g");
-    a.registerHelper("fold", "xml", function (a, c) {
-        for (var d = new g(a, c.line, 0);;) {
-            var f, e = m(d);
-            if (!e || d.line != c.line || !(f = k(d))) return;
-            if (!e[1] && "selfClose" != f) {
-                var c = b(d.line, d.ch),
-                    h = o(d, e[2]);
-                return h && {
-                    from: c,
-                    to: h.from
-                }
-            }
-        }
-    }), a.findMatchingTag = function (a, d, e) {
-        var f = new g(a, d.line, d.ch, e);
-        if (-1 != f.text.indexOf(">") || -1 != f.text.indexOf("<")) {
-            var h = k(f),
-                i = h && b(f.line, f.ch),
-                j = h && l(f);
-            if (h && j && !(c(f, d) > 0)) {
-                var m = {
-                    from: b(f.line, f.ch),
-                    to: i,
-                    tag: j[2]
-                };
-                return "selfClose" == h ? {
-                    open: m,
-                    close: null,
-                    at: "open"
-                } : j[1] ? {
-                    open: p(f, j[2]),
-                    close: m,
-                    at: "close"
-                } : (f = new g(a, i.line, i.ch, e), {
-                    open: m,
-                    close: o(f, j[2]),
-                    at: "open"
-                })
-            }
-        }
-    }, a.findEnclosingTag = function (a, b, c) {
-        for (var d = new g(a, b.line, b.ch, c);;) {
-            var e = p(d);
-            if (!e) break;
-            var f = new g(a, b.line, b.ch, c),
-                h = o(f, e.tag);
-            if (h) return {
-                open: e,
-                close: h
-            }
-        }
-    }, a.scanForClosingTag = function (a, b, c, d) {
-        var e = new g(a, b.line, b.ch, d ? {
-            from: 0,
-            to: d
-        } : null);
-        return o(e, c)
-    }
-});
diff --git a/htdocs/Libs/Codemirror/codemirror.js b/htdocs/Libs/Codemirror/codemirror.js
new file mode 100644
index 0000000..0436a99
--- /dev/null
+++ b/htdocs/Libs/Codemirror/codemirror.js
@@ -0,0 +1,9797 @@
+// CodeMirror, copyright (c) by Marijn Haverbeke and others
+// Distributed under an MIT license: https://codemirror.net/LICENSE
+
+// This is CodeMirror (https://codemirror.net), a code editor
+// implemented in JavaScript on top of the browser's DOM.
+//
+// You can find some technical background for some of the code below
+// at http://marijnhaverbeke.nl/blog/#cm-internals .
+
+(function (global, factory) {
+  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+  typeof define === 'function' && define.amd ? define(factory) :
+  (global = global || self, global.CodeMirror = factory());
+}(this, (function () { 'use strict';
+
+  // Kludges for bugs and behavior differences that can't be feature
+  // detected are enabled based on userAgent etc sniffing.
+  var userAgent = navigator.userAgent;
+  var platform = navigator.platform;
+
+  var gecko = /gecko\/\d/i.test(userAgent);
+  var ie_upto10 = /MSIE \d/.test(userAgent);
+  var ie_11up = /Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(userAgent);
+  var edge = /Edge\/(\d+)/.exec(userAgent);
+  var ie = ie_upto10 || ie_11up || edge;
+  var ie_version = ie && (ie_upto10 ? document.documentMode || 6 : +(edge || ie_11up)[1]);
+  var webkit = !edge && /WebKit\//.test(userAgent);
+  var qtwebkit = webkit && /Qt\/\d+\.\d+/.test(userAgent);
+  var chrome = !edge && /Chrome\//.test(userAgent);
+  var presto = /Opera\//.test(userAgent);
+  var safari = /Apple Computer/.test(navigator.vendor);
+  var mac_geMountainLion = /Mac OS X 1\d\D([8-9]|\d\d)\D/.test(userAgent);
+  var phantom = /PhantomJS/.test(userAgent);
+
+  var ios = !edge && /AppleWebKit/.test(userAgent) && /Mobile\/\w+/.test(userAgent);
+  var android = /Android/.test(userAgent);
+  // This is woefully incomplete. Suggestions for alternative methods welcome.
+  var mobile = ios || android || /webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(userAgent);
+  var mac = ios || /Mac/.test(platform);
+  var chromeOS = /\bCrOS\b/.test(userAgent);
+  var windows = /win/i.test(platform);
+
+  var presto_version = presto && userAgent.match(/Version\/(\d*\.\d*)/);
+  if (presto_version) { presto_version = Number(presto_version[1]); }
+  if (presto_version && presto_version >= 15) { presto = false; webkit = true; }
+  // Some browsers use the wrong event properties to signal cmd/ctrl on OS X
+  var flipCtrlCmd = mac && (qtwebkit || presto && (presto_version == null || presto_version < 12.11));
+  var captureRightClick = gecko || (ie && ie_version >= 9);
+
+  function classTest(cls) { return new RegExp("(^|\\s)" + cls + "(?:$|\\s)\\s*") }
+
+  var rmClass = function(node, cls) {
+    var current = node.className;
+    var match = classTest(cls).exec(current);
+    if (match) {
+      var after = current.slice(match.index + match[0].length);
+      node.className = current.slice(0, match.index) + (after ? match[1] + after : "");
+    }
+  };
+
+  function removeChildren(e) {
+    for (var count = e.childNodes.length; count > 0; --count)
+      { e.removeChild(e.firstChild); }
+    return e
+  }
+
+  function removeChildrenAndAdd(parent, e) {
+    return removeChildren(parent).appendChild(e)
+  }
+
+  function elt(tag, content, className, style) {
+    var e = document.createElement(tag);
+    if (className) { e.className = className; }
+    if (style) { e.style.cssText = style; }
+    if (typeof content == "string") { e.appendChild(document.createTextNode(content)); }
+    else if (content) { for (var i = 0; i < content.length; ++i) { e.appendChild(content[i]); } }
+    return e
+  }
+  // wrapper for elt, which removes the elt from the accessibility tree
+  function eltP(tag, content, className, style) {
+    var e = elt(tag, content, className, style);
+    e.setAttribute("role", "presentation");
+    return e
+  }
+
+  var range;
+  if (document.createRange) { range = function(node, start, end, endNode) {
+    var r = document.createRange();
+    r.setEnd(endNode || node, end);
+    r.setStart(node, start);
+    return r
+  }; }
+  else { range = function(node, start, end) {
+    var r = document.body.createTextRange();
+    try { r.moveToElementText(node.parentNode); }
+    catch(e) { return r }
+    r.collapse(true);
+    r.moveEnd("character", end);
+    r.moveStart("character", start);
+    return r
+  }; }
+
+  function contains(parent, child) {
+    if (child.nodeType == 3) // Android browser always returns false when child is a textnode
+      { child = child.parentNode; }
+    if (parent.contains)
+      { return parent.contains(child) }
+    do {
+      if (child.nodeType == 11) { child = child.host; }
+      if (child == parent) { return true }
+    } while (child = child.parentNode)
+  }
+
+  function activeElt() {
+    // IE and Edge may throw an "Unspecified Error" when accessing document.activeElement.
+    // IE < 10 will throw when accessed while the page is loading or in an iframe.
+    // IE > 9 and Edge will throw when accessed in an iframe if document.body is unavailable.
+    var activeElement;
+    try {
+      activeElement = document.activeElement;
+    } catch(e) {
+      activeElement = document.body || null;
+    }
+    while (activeElement && activeElement.shadowRoot && activeElement.shadowRoot.activeElement)
+      { activeElement = activeElement.shadowRoot.activeElement; }
+    return activeElement
+  }
+
+  function addClass(node, cls) {
+    var current = node.className;
+    if (!classTest(cls).test(current)) { node.className += (current ? " " : "") + cls; }
+  }
+  function joinClasses(a, b) {
+    var as = a.split(" ");
+    for (var i = 0; i < as.length; i++)
+      { if (as[i] && !classTest(as[i]).test(b)) { b += " " + as[i]; } }
+    return b
+  }
+
+  var selectInput = function(node) { node.select(); };
+  if (ios) // Mobile Safari apparently has a bug where select() is broken.
+    { selectInput = function(node) { node.selectionStart = 0; node.selectionEnd = node.value.length; }; }
+  else if (ie) // Suppress mysterious IE10 errors
+    { selectInput = function(node) { try { node.select(); } catch(_e) {} }; }
+
+  function bind(f) {
+    var args = Array.prototype.slice.call(arguments, 1);
+    return function(){return f.apply(null, args)}
+  }
+
+  function copyObj(obj, target, overwrite) {
+    if (!target) { target = {}; }
+    for (var prop in obj)
+      { if (obj.hasOwnProperty(prop) && (overwrite !== false || !target.hasOwnProperty(prop)))
+        { target[prop] = obj[prop]; } }
+    return target
+  }
+
+  // Counts the column offset in a string, taking tabs into account.
+  // Used mostly to find indentation.
+  function countColumn(string, end, tabSize, startIndex, startValue) {
+    if (end == null) {
+      end = string.search(/[^\s\u00a0]/);
+      if (end == -1) { end = string.length; }
+    }
+    for (var i = startIndex || 0, n = startValue || 0;;) {
+      var nextTab = string.indexOf("\t", i);
+      if (nextTab < 0 || nextTab >= end)
+        { return n + (end - i) }
+      n += nextTab - i;
+      n += tabSize - (n % tabSize);
+      i = nextTab + 1;
+    }
+  }
+
+  var Delayed = function() {
+    this.id = null;
+    this.f = null;
+    this.time = 0;
+    this.handler = bind(this.onTimeout, this);
+  };
+  Delayed.prototype.onTimeout = function (self) {
+    self.id = 0;
+    if (self.time <= +new Date) {
+      self.f();
+    } else {
+      setTimeout(self.handler, self.time - +new Date);
+    }
+  };
+  Delayed.prototype.set = function (ms, f) {
+    this.f = f;
+    var time = +new Date + ms;
+    if (!this.id || time < this.time) {
+      clearTimeout(this.id);
+      this.id = setTimeout(this.handler, ms);
+      this.time = time;
+    }
+  };
+
+  function indexOf(array, elt) {
+    for (var i = 0; i < array.length; ++i)
+      { if (array[i] == elt) { return i } }
+    return -1
+  }
+
+  // Number of pixels added to scroller and sizer to hide scrollbar
+  var scrollerGap = 50;
+
+  // Returned or thrown by various protocols to signal 'I'm not
+  // handling this'.
+  var Pass = {toString: function(){return "CodeMirror.Pass"}};
+
+  // Reused option objects for setSelection & friends
+  var sel_dontScroll = {scroll: false}, sel_mouse = {origin: "*mouse"}, sel_move = {origin: "+move"};
+
+  // The inverse of countColumn -- find the offset that corresponds to
+  // a particular column.
+  function findColumn(string, goal, tabSize) {
+    for (var pos = 0, col = 0;;) {
+      var nextTab = string.indexOf("\t", pos);
+      if (nextTab == -1) { nextTab = string.length; }
+      var skipped = nextTab - pos;
+      if (nextTab == string.length || col + skipped >= goal)
+        { return pos + Math.min(skipped, goal - col) }
+      col += nextTab - pos;
+      col += tabSize - (col % tabSize);
+      pos = nextTab + 1;
+      if (col >= goal) { return pos }
+    }
+  }
+
+  var spaceStrs = [""];
+  function spaceStr(n) {
+    while (spaceStrs.length <= n)
+      { spaceStrs.push(lst(spaceStrs) + " "); }
+    return spaceStrs[n]
+  }
+
+  function lst(arr) { return arr[arr.length-1] }
+
+  function map(array, f) {
+    var out = [];
+    for (var i = 0; i < array.length; i++) { out[i] = f(array[i], i); }
+    return out
+  }
+
+  function insertSorted(array, value, score) {
+    var pos = 0, priority = score(value);
+    while (pos < array.length && score(array[pos]) <= priority) { pos++; }
+    array.splice(pos, 0, value);
+  }
+
+  function nothing() {}
+
+  function createObj(base, props) {
+    var inst;
+    if (Object.create) {
+      inst = Object.create(base);
+    } else {
+      nothing.prototype = base;
+      inst = new nothing();
+    }
+    if (props) { copyObj(props, inst); }
+    return inst
+  }
+
+  var nonASCIISingleCaseWordChar = /[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/;
+  function isWordCharBasic(ch) {
+    return /\w/.test(ch) || ch > "\x80" &&
+      (ch.toUpperCase() != ch.toLowerCase() || nonASCIISingleCaseWordChar.test(ch))
+  }
+  function isWordChar(ch, helper) {
+    if (!helper) { return isWordCharBasic(ch) }
+    if (helper.source.indexOf("\\w") > -1 && isWordCharBasic(ch)) { return true }
+    return helper.test(ch)
+  }
+
+  function isEmpty(obj) {
+    for (var n in obj) { if (obj.hasOwnProperty(n) && obj[n]) { return false } }
+    return true
+  }
+
+  // Extending unicode characters. A series of a non-extending char +
+  // any number of extending chars is treated as a single unit as far
+  // as editing and measuring is concerned. This is not fully correct,
+  // since some scripts/fonts/browsers also treat other configurations
+  // of code points as a group.
+  var extendingChars = /[\u0300-\u036f\u0483-\u0489\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u065e\u0670\u06d6-\u06dc\u06de-\u06e4\u06e7\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0900-\u0902\u093c\u0941-\u0948\u094d\u0951-\u0955\u0962\u0963\u0981\u09bc\u09be\u09c1-\u09c4\u09cd\u09d7\u09e2\u09e3\u0a01\u0a02\u0a3c\u0a41\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a70\u0a71\u0a75\u0a81\u0a82\u0abc\u0ac1-\u0ac5\u0ac7\u0ac8\u0acd\u0ae2\u0ae3\u0b01\u0b3c\u0b3e\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b82\u0bbe\u0bc0\u0bcd\u0bd7\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0cbc\u0cbf\u0cc2\u0cc6\u0ccc\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0d3e\u0d41-\u0d44\u0d4d\u0d57\u0d62\u0d63\u0dca\u0dcf\u0dd2-\u0dd4\u0dd6\u0ddf\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0f18\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86\u0f87\u0f90-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039\u103a\u103d\u103e\u1058\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085\u1086\u108d\u109d\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927\u1928\u1932\u1939-\u193b\u1a17\u1a18\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80\u1b81\u1ba2-\u1ba5\u1ba8\u1ba9\u1c2c-\u1c33\u1c36\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1dc0-\u1de6\u1dfd-\u1dff\u200c\u200d\u20d0-\u20f0\u2cef-\u2cf1\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua66f-\ua672\ua67c\ua67d\ua6f0\ua6f1\ua802\ua806\ua80b\ua825\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\uaa29-\uaa2e\uaa31\uaa32\uaa35\uaa36\uaa43\uaa4c\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uabe5\uabe8\uabed\udc00-\udfff\ufb1e\ufe00-\ufe0f\ufe20-\ufe26\uff9e\uff9f]/;
+  function isExtendingChar(ch) { return ch.charCodeAt(0) >= 768 && extendingChars.test(ch) }
+
+  // Returns a number from the range [`0`; `str.length`] unless `pos` is outside that range.
+  function skipExtendingChars(str, pos, dir) {
+    while ((dir < 0 ? pos > 0 : pos < str.length) && isExtendingChar(str.charAt(pos))) { pos += dir; }
+    return pos
+  }
+
+  // Returns the value from the range [`from`; `to`] that satisfies
+  // `pred` and is closest to `from`. Assumes that at least `to`
+  // satisfies `pred`. Supports `from` being greater than `to`.
+  function findFirst(pred, from, to) {
+    // At any point we are certain `to` satisfies `pred`, don't know
+    // whether `from` does.
+    var dir = from > to ? -1 : 1;
+    for (;;) {
+      if (from == to) { return from }
+      var midF = (from + to) / 2, mid = dir < 0 ? Math.ceil(midF) : Math.floor(midF);
+      if (mid == from) { return pred(mid) ? from : to }
+      if (pred(mid)) { to = mid; }
+      else { from = mid + dir; }
+    }
+  }
+
+  // BIDI HELPERS
+
+  function iterateBidiSections(order, from, to, f) {
+    if (!order) { return f(from, to, "ltr", 0) }
+    var found = false;
+    for (var i = 0; i < order.length; ++i) {
+      var part = order[i];
+      if (part.from < to && part.to > from || from == to && part.to == from) {
+        f(Math.max(part.from, from), Math.min(part.to, to), part.level == 1 ? "rtl" : "ltr", i);
+        found = true;
+      }
+    }
+    if (!found) { f(from, to, "ltr"); }
+  }
+
+  var bidiOther = null;
+  function getBidiPartAt(order, ch, sticky) {
+    var found;
+    bidiOther = null;
+    for (var i = 0; i < order.length; ++i) {
+      var cur = order[i];
+      if (cur.from < ch && cur.to > ch) { return i }
+      if (cur.to == ch) {
+        if (cur.from != cur.to && sticky == "before") { found = i; }
+        else { bidiOther = i; }
+      }
+      if (cur.from == ch) {
+        if (cur.from != cur.to && sticky != "before") { found = i; }
+        else { bidiOther = i; }
+      }
+    }
+    return found != null ? found : bidiOther
+  }
+
+  // Bidirectional ordering algorithm
+  // See http://unicode.org/reports/tr9/tr9-13.html for the algorithm
+  // that this (partially) implements.
+
+  // One-char codes used for character types:
+  // L (L):   Left-to-Right
+  // R (R):   Right-to-Left
+  // r (AL):  Right-to-Left Arabic
+  // 1 (EN):  European Number
+  // + (ES):  European Number Separator
+  // % (ET):  European Number Terminator
+  // n (AN):  Arabic Number
+  // , (CS):  Common Number Separator
+  // m (NSM): Non-Spacing Mark
+  // b (BN):  Boundary Neutral
+  // s (B):   Paragraph Separator
+  // t (S):   Segment Separator
+  // w (WS):  Whitespace
+  // N (ON):  Other Neutrals
+
+  // Returns null if characters are ordered as they appear
+  // (left-to-right), or an array of sections ({from, to, level}
+  // objects) in the order in which they occur visually.
+  var bidiOrdering = (function() {
+    // Character types for codepoints 0 to 0xff
+    var lowTypes = "bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN";
+    // Character types for codepoints 0x600 to 0x6f9
+    var arabicTypes = "nnnnnnNNr%%r,rNNmmmmmmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmmmnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmnNmmmmmmrrmmNmmmmrr1111111111";
+    function charType(code) {
+      if (code <= 0xf7) { return lowTypes.charAt(code) }
+      else if (0x590 <= code && code <= 0x5f4) { return "R" }
+      else if (0x600 <= code && code <= 0x6f9) { return arabicTypes.charAt(code - 0x600) }
+      else if (0x6ee <= code && code <= 0x8ac) { return "r" }
+      else if (0x2000 <= code && code <= 0x200b) { return "w" }
+      else if (code == 0x200c) { return "b" }
+      else { return "L" }
+    }
+
+    var bidiRE = /[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac]/;
+    var isNeutral = /[stwN]/, isStrong = /[LRr]/, countsAsLeft = /[Lb1n]/, countsAsNum = /[1n]/;
+
+    function BidiSpan(level, from, to) {
+      this.level = level;
+      this.from = from; this.to = to;
+    }
+
+    return function(str, direction) {
+      var outerType = direction == "ltr" ? "L" : "R";
+
+      if (str.length == 0 || direction == "ltr" && !bidiRE.test(str)) { return false }
+      var len = str.length, types = [];
+      for (var i = 0; i < len; ++i)
+        { types.push(charType(str.charCodeAt(i))); }
+
+      // W1. Examine each non-spacing mark (NSM) in the level run, and
+      // change the type of the NSM to the type of the previous
+      // character. If the NSM is at the start of the level run, it will
+      // get the type of sor.
+      for (var i$1 = 0, prev = outerType; i$1 < len; ++i$1) {
+        var type = types[i$1];
+        if (type == "m") { types[i$1] = prev; }
+        else { prev = type; }
+      }
+
+      // W2. Search backwards from each instance of a European number
+      // until the first strong type (R, L, AL, or sor) is found. If an
+      // AL is found, change the type of the European number to Arabic
+      // number.
+      // W3. Change all ALs to R.
+      for (var i$2 = 0, cur = outerType; i$2 < len; ++i$2) {
+        var type$1 = types[i$2];
+        if (type$1 == "1" && cur == "r") { types[i$2] = "n"; }
+        else if (isStrong.test(type$1)) { cur = type$1; if (type$1 == "r") { types[i$2] = "R"; } }
+      }
+
+      // W4. A single European separator between two European numbers
+      // changes to a European number. A single common separator between
+      // two numbers of the same type changes to that type.
+      for (var i$3 = 1, prev$1 = types[0]; i$3 < len - 1; ++i$3) {
+        var type$2 = types[i$3];
+        if (type$2 == "+" && prev$1 == "1" && types[i$3+1] == "1") { types[i$3] = "1"; }
+        else if (type$2 == "," && prev$1 == types[i$3+1] &&
+                 (prev$1 == "1" || prev$1 == "n")) { types[i$3] = prev$1; }
+        prev$1 = type$2;
+      }
+
+      // W5. A sequence of European terminators adjacent to European
+      // numbers changes to all European numbers.
+      // W6. Otherwise, separators and terminators change to Other
+      // Neutral.
+      for (var i$4 = 0; i$4 < len; ++i$4) {
+        var type$3 = types[i$4];
+        if (type$3 == ",") { types[i$4] = "N"; }
+        else if (type$3 == "%") {
+          var end = (void 0);
+          for (end = i$4 + 1; end < len && types[end] == "%"; ++end) {}
+          var replace = (i$4 && types[i$4-1] == "!") || (end < len && types[end] == "1") ? "1" : "N";
+          for (var j = i$4; j < end; ++j) { types[j] = replace; }
+          i$4 = end - 1;
+        }
+      }
+
+      // W7. Search backwards from each instance of a European number
+      // until the first strong type (R, L, or sor) is found. If an L is
+      // found, then change the type of the European number to L.
+      for (var i$5 = 0, cur$1 = outerType; i$5 < len; ++i$5) {
+        var type$4 = types[i$5];
+        if (cur$1 == "L" && type$4 == "1") { types[i$5] = "L"; }
+        else if (isStrong.test(type$4)) { cur$1 = type$4; }
+      }
+
+      // N1. A sequence of neutrals takes the direction of the
+      // surrounding strong text if the text on both sides has the same
+      // direction. European and Arabic numbers act as if they were R in
+      // terms of their influence on neutrals. Start-of-level-run (sor)
+      // and end-of-level-run (eor) are used at level run boundaries.
+      // N2. Any remaining neutrals take the embedding direction.
+      for (var i$6 = 0; i$6 < len; ++i$6) {
+        if (isNeutral.test(types[i$6])) {
+          var end$1 = (void 0);
+          for (end$1 = i$6 + 1; end$1 < len && isNeutral.test(types[end$1]); ++end$1) {}
+          var before = (i$6 ? types[i$6-1] : outerType) == "L";
+          var after = (end$1 < len ? types[end$1] : outerType) == "L";
+          var replace$1 = before == after ? (before ? "L" : "R") : outerType;
+          for (var j$1 = i$6; j$1 < end$1; ++j$1) { types[j$1] = replace$1; }
+          i$6 = end$1 - 1;
+        }
+      }
+
+      // Here we depart from the documented algorithm, in order to avoid
+      // building up an actual levels array. Since there are only three
+      // levels (0, 1, 2) in an implementation that doesn't take
+      // explicit embedding into account, we can build up the order on
+      // the fly, without following the level-based algorithm.
+      var order = [], m;
+      for (var i$7 = 0; i$7 < len;) {
+        if (countsAsLeft.test(types[i$7])) {
+          var start = i$7;
+          for (++i$7; i$7 < len && countsAsLeft.test(types[i$7]); ++i$7) {}
+          order.push(new BidiSpan(0, start, i$7));
+        } else {
+          var pos = i$7, at = order.length, isRTL = direction == "rtl" ? 1 : 0;
+          for (++i$7; i$7 < len && types[i$7] != "L"; ++i$7) {}
+          for (var j$2 = pos; j$2 < i$7;) {
+            if (countsAsNum.test(types[j$2])) {
+              if (pos < j$2) { order.splice(at, 0, new BidiSpan(1, pos, j$2)); at += isRTL; }
+              var nstart = j$2;
+              for (++j$2; j$2 < i$7 && countsAsNum.test(types[j$2]); ++j$2) {}
+              order.splice(at, 0, new BidiSpan(2, nstart, j$2));
+              at += isRTL;
+              pos = j$2;
+            } else { ++j$2; }
+          }
+          if (pos < i$7) { order.splice(at, 0, new BidiSpan(1, pos, i$7)); }
+        }
+      }
+      if (direction == "ltr") {
+        if (order[0].level == 1 && (m = str.match(/^\s+/))) {
+          order[0].from = m[0].length;
+          order.unshift(new BidiSpan(0, 0, m[0].length));
+        }
+        if (lst(order).level == 1 && (m = str.match(/\s+$/))) {
+          lst(order).to -= m[0].length;
+          order.push(new BidiSpan(0, len - m[0].length, len));
+        }
+      }
+
+      return direction == "rtl" ? order.reverse() : order
+    }
+  })();
+
+  // Get the bidi ordering for the given line (and cache it). Returns
+  // false for lines that are fully left-to-right, and an array of
+  // BidiSpan objects otherwise.
+  function getOrder(line, direction) {
+    var order = line.order;
+    if (order == null) { order = line.order = bidiOrdering(line.text, direction); }
+    return order
+  }
+
+  // EVENT HANDLING
+
+  // Lightweight event framework. on/off also work on DOM nodes,
+  // registering native DOM handlers.
+
+  var noHandlers = [];
+
+  var on = function(emitter, type, f) {
+    if (emitter.addEventListener) {
+      emitter.addEventListener(type, f, false);
+    } else if (emitter.attachEvent) {
+      emitter.attachEvent("on" + type, f);
+    } else {
+      var map = emitter._handlers || (emitter._handlers = {});
+      map[type] = (map[type] || noHandlers).concat(f);
+    }
+  };
+
+  function getHandlers(emitter, type) {
+    return emitter._handlers && emitter._handlers[type] || noHandlers
+  }
+
+  function off(emitter, type, f) {
+    if (emitter.removeEventListener) {
+      emitter.removeEventListener(type, f, false);
+    } else if (emitter.detachEvent) {
+      emitter.detachEvent("on" + type, f);
+    } else {
+      var map = emitter._handlers, arr = map && map[type];
+      if (arr) {
+        var index = indexOf(arr, f);
+        if (index > -1)
+          { map[type] = arr.slice(0, index).concat(arr.slice(index + 1)); }
+      }
+    }
+  }
+
+  function signal(emitter, type /*, values...*/) {
+    var handlers = getHandlers(emitter, type);
+    if (!handlers.length) { return }
+    var args = Array.prototype.slice.call(arguments, 2);
+    for (var i = 0; i < handlers.length; ++i) { handlers[i].apply(null, args); }
+  }
+
+  // The DOM events that CodeMirror handles can be overridden by
+  // registering a (non-DOM) handler on the editor for the event name,
+  // and preventDefault-ing the event in that handler.
+  function signalDOMEvent(cm, e, override) {
+    if (typeof e == "string")
+      { e = {type: e, preventDefault: function() { this.defaultPrevented = true; }}; }
+    signal(cm, override || e.type, cm, e);
+    return e_defaultPrevented(e) || e.codemirrorIgnore
+  }
+
+  function signalCursorActivity(cm) {
+    var arr = cm._handlers && cm._handlers.cursorActivity;
+    if (!arr) { return }
+    var set = cm.curOp.cursorActivityHandlers || (cm.curOp.cursorActivityHandlers = []);
+    for (var i = 0; i < arr.length; ++i) { if (indexOf(set, arr[i]) == -1)
+      { set.push(arr[i]); } }
+  }
+
+  function hasHandler(emitter, type) {
+    return getHandlers(emitter, type).length > 0
+  }
+
+  // Add on and off methods to a constructor's prototype, to make
+  // registering events on such objects more convenient.
+  function eventMixin(ctor) {
+    ctor.prototype.on = function(type, f) {on(this, type, f);};
+    ctor.prototype.off = function(type, f) {off(this, type, f);};
+  }
+
+  // Due to the fact that we still support jurassic IE versions, some
+  // compatibility wrappers are needed.
+
+  function e_preventDefault(e) {
+    if (e.preventDefault) { e.preventDefault(); }
+    else { e.returnValue = false; }
+  }
+  function e_stopPropagation(e) {
+    if (e.stopPropagation) { e.stopPropagation(); }
+    else { e.cancelBubble = true; }
+  }
+  function e_defaultPrevented(e) {
+    return e.defaultPrevented != null ? e.defaultPrevented : e.returnValue == false
+  }
+  function e_stop(e) {e_preventDefault(e); e_stopPropagation(e);}
+
+  function e_target(e) {return e.target || e.srcElement}
+  function e_button(e) {
+    var b = e.which;
+    if (b == null) {
+      if (e.button & 1) { b = 1; }
+      else if (e.button & 2) { b = 3; }
+      else if (e.button & 4) { b = 2; }
+    }
+    if (mac && e.ctrlKey && b == 1) { b = 3; }
+    return b
+  }
+
+  // Detect drag-and-drop
+  var dragAndDrop = function() {
+    // There is *some* kind of drag-and-drop support in IE6-8, but I
+    // couldn't get it to work yet.
+    if (ie && ie_version < 9) { return false }
+    var div = elt('div');
+    return "draggable" in div || "dragDrop" in div
+  }();
+
+  var zwspSupported;
+  function zeroWidthElement(measure) {
+    if (zwspSupported == null) {
+      var test = elt("span", "\u200b");
+      removeChildrenAndAdd(measure, elt("span", [test, document.createTextNode("x")]));
+      if (measure.firstChild.offsetHeight != 0)
+        { zwspSupported = test.offsetWidth <= 1 && test.offsetHeight > 2 && !(ie && ie_version < 8); }
+    }
+    var node = zwspSupported ? elt("span", "\u200b") :
+      elt("span", "\u00a0", null, "display: inline-block; width: 1px; margin-right: -1px");
+    node.setAttribute("cm-text", "");
+    return node
+  }
+
+  // Feature-detect IE's crummy client rect reporting for bidi text
+  var badBidiRects;
+  function hasBadBidiRects(measure) {
+    if (badBidiRects != null) { return badBidiRects }
+    var txt = removeChildrenAndAdd(measure, document.createTextNode("A\u062eA"));
+    var r0 = range(txt, 0, 1).getBoundingClientRect();
+    var r1 = range(txt, 1, 2).getBoundingClientRect();
+    removeChildren(measure);
+    if (!r0 || r0.left == r0.right) { return false } // Safari returns null in some cases (#2780)
+    return badBidiRects = (r1.right - r0.right < 3)
+  }
+
+  // See if "".split is the broken IE version, if so, provide an
+  // alternative way to split lines.
+  var splitLinesAuto = "\n\nb".split(/\n/).length != 3 ? function (string) {
+    var pos = 0, result = [], l = string.length;
+    while (pos <= l) {
+      var nl = string.indexOf("\n", pos);
+      if (nl == -1) { nl = string.length; }
+      var line = string.slice(pos, string.charAt(nl - 1) == "\r" ? nl - 1 : nl);
+      var rt = line.indexOf("\r");
+      if (rt != -1) {
+        result.push(line.slice(0, rt));
+        pos += rt + 1;
+      } else {
+        result.push(line);
+        pos = nl + 1;
+      }
+    }
+    return result
+  } : function (string) { return string.split(/\r\n?|\n/); };
+
+  var hasSelection = window.getSelection ? function (te) {
+    try { return te.selectionStart != te.selectionEnd }
+    catch(e) { return false }
+  } : function (te) {
+    var range;
+    try {range = te.ownerDocument.selection.createRange();}
+    catch(e) {}
+    if (!range || range.parentElement() != te) { return false }
+    return range.compareEndPoints("StartToEnd", range) != 0
+  };
+
+  var hasCopyEvent = (function () {
+    var e = elt("div");
+    if ("oncopy" in e) { return true }
+    e.setAttribute("oncopy", "return;");
+    return typeof e.oncopy == "function"
+  })();
+
+  var badZoomedRects = null;
+  function hasBadZoomedRects(measure) {
+    if (badZoomedRects != null) { return badZoomedRects }
+    var node = removeChildrenAndAdd(measure, elt("span", "x"));
+    var normal = node.getBoundingClientRect();
+    var fromRange = range(node, 0, 1).getBoundingClientRect();
+    return badZoomedRects = Math.abs(normal.left - fromRange.left) > 1
+  }
+
+  // Known modes, by name and by MIME
+  var modes = {}, mimeModes = {};
+
+  // Extra arguments are stored as the mode's dependencies, which is
+  // used by (legacy) mechanisms like loadmode.js to automatically
+  // load a mode. (Preferred mechanism is the require/define calls.)
+  function defineMode(name, mode) {
+    if (arguments.length > 2)
+      { mode.dependencies = Array.prototype.slice.call(arguments, 2); }
+    modes[name] = mode;
+  }
+
+  function defineMIME(mime, spec) {
+    mimeModes[mime] = spec;
+  }
+
+  // Given a MIME type, a {name, ...options} config object, or a name
+  // string, return a mode config object.
+  function resolveMode(spec) {
+    if (typeof spec == "string" && mimeModes.hasOwnProperty(spec)) {
+      spec = mimeModes[spec];
+    } else if (spec && typeof spec.name == "string" && mimeModes.hasOwnProperty(spec.name)) {
+      var found = mimeModes[spec.name];
+      if (typeof found == "string") { found = {name: found}; }
+      spec = createObj(found, spec);
+      spec.name = found.name;
+    } else if (typeof spec == "string" && /^[\w\-]+\/[\w\-]+\+xml$/.test(spec)) {
+      return resolveMode("application/xml")
+    } else if (typeof spec == "string" && /^[\w\-]+\/[\w\-]+\+json$/.test(spec)) {
+      return resolveMode("application/json")
+    }
+    if (typeof spec == "string") { return {name: spec} }
+    else { return spec || {name: "null"} }
+  }
+
+  // Given a mode spec (anything that resolveMode accepts), find and
+  // initialize an actual mode object.
+  function getMode(options, spec) {
+    spec = resolveMode(spec);
+    var mfactory = modes[spec.name];
+    if (!mfactory) { return getMode(options, "text/plain") }
+    var modeObj = mfactory(options, spec);
+    if (modeExtensions.hasOwnProperty(spec.name)) {
+      var exts = modeExtensions[spec.name];
+      for (var prop in exts) {
+        if (!exts.hasOwnProperty(prop)) { continue }
+        if (modeObj.hasOwnProperty(prop)) { modeObj["_" + prop] = modeObj[prop]; }
+        modeObj[prop] = exts[prop];
+      }
+    }
+    modeObj.name = spec.name;
+    if (spec.helperType) { modeObj.helperType = spec.helperType; }
+    if (spec.modeProps) { for (var prop$1 in spec.modeProps)
+      { modeObj[prop$1] = spec.modeProps[prop$1]; } }
+
+    return modeObj
+  }
+
+  // This can be used to attach properties to mode objects from
+  // outside the actual mode definition.
+  var modeExtensions = {};
+  function extendMode(mode, properties) {
+    var exts = modeExtensions.hasOwnProperty(mode) ? modeExtensions[mode] : (modeExtensions[mode] = {});
+    copyObj(properties, exts);
+  }
+
+  function copyState(mode, state) {
+    if (state === true) { return state }
+    if (mode.copyState) { return mode.copyState(state) }
+    var nstate = {};
+    for (var n in state) {
+      var val = state[n];
+      if (val instanceof Array) { val = val.concat([]); }
+      nstate[n] = val;
+    }
+    return nstate
+  }
+
+  // Given a mode and a state (for that mode), find the inner mode and
+  // state at the position that the state refers to.
+  function innerMode(mode, state) {
+    var info;
+    while (mode.innerMode) {
+      info = mode.innerMode(state);
+      if (!info || info.mode == mode) { break }
+      state = info.state;
+      mode = info.mode;
+    }
+    return info || {mode: mode, state: state}
+  }
+
+  function startState(mode, a1, a2) {
+    return mode.startState ? mode.startState(a1, a2) : true
+  }
+
+  // STRING STREAM
+
+  // Fed to the mode parsers, provides helper functions to make
+  // parsers more succinct.
+
+  var StringStream = function(string, tabSize, lineOracle) {
+    this.pos = this.start = 0;
+    this.string = string;
+    this.tabSize = tabSize || 8;
+    this.lastColumnPos = this.lastColumnValue = 0;
+    this.lineStart = 0;
+    this.lineOracle = lineOracle;
+  };
+
+  StringStream.prototype.eol = function () {return this.pos >= this.string.length};
+  StringStream.prototype.sol = function () {return this.pos == this.lineStart};
+  StringStream.prototype.peek = function () {return this.string.charAt(this.pos) || undefined};
+  StringStream.prototype.next = function () {
+    if (this.pos < this.string.length)
+      { return this.string.charAt(this.pos++) }
+  };
+  StringStream.prototype.eat = function (match) {
+    var ch = this.string.charAt(this.pos);
+    var ok;
+    if (typeof match == "string") { ok = ch == match; }
+    else { ok = ch && (match.test ? match.test(ch) : match(ch)); }
+    if (ok) {++this.pos; return ch}
+  };
+  StringStream.prototype.eatWhile = function (match) {
+    var start = this.pos;
+    while (this.eat(match)){}
+    return this.pos > start
+  };
+  StringStream.prototype.eatSpace = function () {
+    var start = this.pos;
+    while (/[\s\u00a0]/.test(this.string.charAt(this.pos))) { ++this.pos; }
+    return this.pos > start
+  };
+  StringStream.prototype.skipToEnd = function () {this.pos = this.string.length;};
+  StringStream.prototype.skipTo = function (ch) {
+    var found = this.string.indexOf(ch, this.pos);
+    if (found > -1) {this.pos = found; return true}
+  };
+  StringStream.prototype.backUp = function (n) {this.pos -= n;};
+  StringStream.prototype.column = function () {
+    if (this.lastColumnPos < this.start) {
+      this.lastColumnValue = countColumn(this.string, this.start, this.tabSize, this.lastColumnPos, this.lastColumnValue);
+      this.lastColumnPos = this.start;
+    }
+    return this.lastColumnValue - (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0)
+  };
+  StringStream.prototype.indentation = function () {
+    return countColumn(this.string, null, this.tabSize) -
+      (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0)
+  };
+  StringStream.prototype.match = function (pattern, consume, caseInsensitive) {
+    if (typeof pattern == "string") {
+      var cased = function (str) { return caseInsensitive ? str.toLowerCase() : str; };
+      var substr = this.string.substr(this.pos, pattern.length);
+      if (cased(substr) == cased(pattern)) {
+        if (consume !== false) { this.pos += pattern.length; }
+        return true
+      }
+    } else {
+      var match = this.string.slice(this.pos).match(pattern);
+      if (match && match.index > 0) { return null }
+      if (match && consume !== false) { this.pos += match[0].length; }
+      return match
+    }
+  };
+  StringStream.prototype.current = function (){return this.string.slice(this.start, this.pos)};
+  StringStream.prototype.hideFirstChars = function (n, inner) {
+    this.lineStart += n;
+    try { return inner() }
+    finally { this.lineStart -= n; }
+  };
+  StringStream.prototype.lookAhead = function (n) {
+    var oracle = this.lineOracle;
+    return oracle && oracle.lookAhead(n)
+  };
+  StringStream.prototype.baseToken = function () {
+    var oracle = this.lineOracle;
+    return oracle && oracle.baseToken(this.pos)
+  };
+
+  // Find the line object corresponding to the given line number.
+  function getLine(doc, n) {
+    n -= doc.first;
+    if (n < 0 || n >= doc.size) { throw new Error("There is no line " + (n + doc.first) + " in the document.") }
+    var chunk = doc;
+    while (!chunk.lines) {
+      for (var i = 0;; ++i) {
+        var child = chunk.children[i], sz = child.chunkSize();
+        if (n < sz) { chunk = child; break }
+        n -= sz;
+      }
+    }
+    return chunk.lines[n]
+  }
+
+  // Get the part of a document between two positions, as an array of
+  // strings.
+  function getBetween(doc, start, end) {
+    var out = [], n = start.line;
+    doc.iter(start.line, end.line + 1, function (line) {
+      var text = line.text;
+      if (n == end.line) { text = text.slice(0, end.ch); }
+      if (n == start.line) { text = text.slice(start.ch); }
+      out.push(text);
+      ++n;
+    });
+    return out
+  }
+  // Get the lines between from and to, as array of strings.
+  function getLines(doc, from, to) {
+    var out = [];
+    doc.iter(from, to, function (line) { out.push(line.text); }); // iter aborts when callback returns truthy value
+    return out
+  }
+
+  // Update the height of a line, propagating the height change
+  // upwards to parent nodes.
+  function updateLineHeight(line, height) {
+    var diff = height - line.height;
+    if (diff) { for (var n = line; n; n = n.parent) { n.height += diff; } }
+  }
+
+  // Given a line object, find its line number by walking up through
+  // its parent links.
+  function lineNo(line) {
+    if (line.parent == null) { return null }
+    var cur = line.parent, no = indexOf(cur.lines, line);
+    for (var chunk = cur.parent; chunk; cur = chunk, chunk = chunk.parent) {
+      for (var i = 0;; ++i) {
+        if (chunk.children[i] == cur) { break }
+        no += chunk.children[i].chunkSize();
+      }
+    }
+    return no + cur.first
+  }
+
+  // Find the line at the given vertical position, using the height
+  // information in the document tree.
+  function lineAtHeight(chunk, h) {
+    var n = chunk.first;
+    outer: do {
+      for (var i$1 = 0; i$1 < chunk.children.length; ++i$1) {
+        var child = chunk.children[i$1], ch = child.height;
+        if (h < ch) { chunk = child; continue outer }
+        h -= ch;
+        n += child.chunkSize();
+      }
+      return n
+    } while (!chunk.lines)
+    var i = 0;
+    for (; i < chunk.lines.length; ++i) {
+      var line = chunk.lines[i], lh = line.height;
+      if (h < lh) { break }
+      h -= lh;
+    }
+    return n + i
+  }
+
+  function isLine(doc, l) {return l >= doc.first && l < doc.first + doc.size}
+
+  function lineNumberFor(options, i) {
+    return String(options.lineNumberFormatter(i + options.firstLineNumber))
+  }
+
+  // A Pos instance represents a position within the text.
+  function Pos(line, ch, sticky) {
+    if ( sticky === void 0 ) sticky = null;
+
+    if (!(this instanceof Pos)) { return new Pos(line, ch, sticky) }
+    this.line = line;
+    this.ch = ch;
+    this.sticky = sticky;
+  }
+
+  // Compare two positions, return 0 if they are the same, a negative
+  // number when a is less, and a positive number otherwise.
+  function cmp(a, b) { return a.line - b.line || a.ch - b.ch }
+
+  function equalCursorPos(a, b) { return a.sticky == b.sticky && cmp(a, b) == 0 }
+
+  function copyPos(x) {return Pos(x.line, x.ch)}
+  function maxPos(a, b) { return cmp(a, b) < 0 ? b : a }
+  function minPos(a, b) { return cmp(a, b) < 0 ? a : b }
+
+  // Most of the external API clips given positions to make sure they
+  // actually exist within the document.
+  function clipLine(doc, n) {return Math.max(doc.first, Math.min(n, doc.first + doc.size - 1))}
+  function clipPos(doc, pos) {
+    if (pos.line < doc.first) { return Pos(doc.first, 0) }
+    var last = doc.first + doc.size - 1;
+    if (pos.line > last) { return Pos(last, getLine(doc, last).text.length) }
+    return clipToLen(pos, getLine(doc, pos.line).text.length)
+  }
+  function clipToLen(pos, linelen) {
+    var ch = pos.ch;
+    if (ch == null || ch > linelen) { return Pos(pos.line, linelen) }
+    else if (ch < 0) { return Pos(pos.line, 0) }
+    else { return pos }
+  }
+  function clipPosArray(doc, array) {
+    var out = [];
+    for (var i = 0; i < array.length; i++) { out[i] = clipPos(doc, array[i]); }
+    return out
+  }
+
+  var SavedContext = function(state, lookAhead) {
+    this.state = state;
+    this.lookAhead = lookAhead;
+  };
+
+  var Context = function(doc, state, line, lookAhead) {
+    this.state = state;
+    this.doc = doc;
+    this.line = line;
+    this.maxLookAhead = lookAhead || 0;
+    this.baseTokens = null;
+    this.baseTokenPos = 1;
+  };
+
+  Context.prototype.lookAhead = function (n) {
+    var line = this.doc.getLine(this.line + n);
+    if (line != null && n > this.maxLookAhead) { this.maxLookAhead = n; }
+    return line
+  };
+
+  Context.prototype.baseToken = function (n) {
+    if (!this.baseTokens) { return null }
+    while (this.baseTokens[this.baseTokenPos] <= n)
+      { this.baseTokenPos += 2; }
+    var type = this.baseTokens[this.baseTokenPos + 1];
+    return {type: type && type.replace(/( |^)overlay .*/, ""),
+            size: this.baseTokens[this.baseTokenPos] - n}
+  };
+
+  Context.prototype.nextLine = function () {
+    this.line++;
+    if (this.maxLookAhead > 0) { this.maxLookAhead--; }
+  };
+
+  Context.fromSaved = function (doc, saved, line) {
+    if (saved instanceof SavedContext)
+      { return new Context(doc, copyState(doc.mode, saved.state), line, saved.lookAhead) }
+    else
+      { return new Context(doc, copyState(doc.mode, saved), line) }
+  };
+
+  Context.prototype.save = function (copy) {
+    var state = copy !== false ? copyState(this.doc.mode, this.state) : this.state;
+    return this.maxLookAhead > 0 ? new SavedContext(state, this.maxLookAhead) : state
+  };
+
+
+  // Compute a style array (an array starting with a mode generation
+  // -- for invalidation -- followed by pairs of end positions and
+  // style strings), which is used to highlight the tokens on the
+  // line.
+  function highlightLine(cm, line, context, forceToEnd) {
+    // A styles array always starts with a number identifying the
+    // mode/overlays that it is based on (for easy invalidation).
+    var st = [cm.state.modeGen], lineClasses = {};
+    // Compute the base array of styles
+    runMode(cm, line.text, cm.doc.mode, context, function (end, style) { return st.push(end, style); },
+            lineClasses, forceToEnd);
+    var state = context.state;
+
+    // Run overlays, adjust style array.
+    var loop = function ( o ) {
+      context.baseTokens = st;
+      var overlay = cm.state.overlays[o], i = 1, at = 0;
+      context.state = true;
+      runMode(cm, line.text, overlay.mode, context, function (end, style) {
+        var start = i;
+        // Ensure there's a token end at the current position, and that i points at it
+        while (at < end) {
+          var i_end = st[i];
+          if (i_end > end)
+            { st.splice(i, 1, end, st[i+1], i_end); }
+          i += 2;
+          at = Math.min(end, i_end);
+        }
+        if (!style) { return }
+        if (overlay.opaque) {
+          st.splice(start, i - start, end, "overlay " + style);
+          i = start + 2;
+        } else {
+          for (; start < i; start += 2) {
+            var cur = st[start+1];
+            st[start+1] = (cur ? cur + " " : "") + "overlay " + style;
+          }
+        }
+      }, lineClasses);
+      context.state = state;
+      context.baseTokens = null;
+      context.baseTokenPos = 1;
+    };
+
+    for (var o = 0; o < cm.state.overlays.length; ++o) loop( o );
+
+    return {styles: st, classes: lineClasses.bgClass || lineClasses.textClass ? lineClasses : null}
+  }
+
+  function getLineStyles(cm, line, updateFrontier) {
+    if (!line.styles || line.styles[0] != cm.state.modeGen) {
+      var context = getContextBefore(cm, lineNo(line));
+      var resetState = line.text.length > cm.options.maxHighlightLength && copyState(cm.doc.mode, context.state);
+      var result = highlightLine(cm, line, context);
+      if (resetState) { context.state = resetState; }
+      line.stateAfter = context.save(!resetState);
+      line.styles = result.styles;
+      if (result.classes) { line.styleClasses = result.classes; }
+      else if (line.styleClasses) { line.styleClasses = null; }
+      if (updateFrontier === cm.doc.highlightFrontier)
+        { cm.doc.modeFrontier = Math.max(cm.doc.modeFrontier, ++cm.doc.highlightFrontier); }
+    }
+    return line.styles
+  }
+
+  function getContextBefore(cm, n, precise) {
+    var doc = cm.doc, display = cm.display;
+    if (!doc.mode.startState) { return new Context(doc, true, n) }
+    var start = findStartLine(cm, n, precise);
+    var saved = start > doc.first && getLine(doc, start - 1).stateAfter;
+    var context = saved ? Context.fromSaved(doc, saved, start) : new Context(doc, startState(doc.mode), start);
+
+    doc.iter(start, n, function (line) {
+      processLine(cm, line.text, context);
+      var pos = context.line;
+      line.stateAfter = pos == n - 1 || pos % 5 == 0 || pos >= display.viewFrom && pos < display.viewTo ? context.save() : null;
+      context.nextLine();
+    });
+    if (precise) { doc.modeFrontier = context.line; }
+    return context
+  }
+
+  // Lightweight form of highlight -- proceed over this line and
+  // update state, but don't save a style array. Used for lines that
+  // aren't currently visible.
+  function processLine(cm, text, context, startAt) {
+    var mode = cm.doc.mode;
+    var stream = new StringStream(text, cm.options.tabSize, context);
+    stream.start = stream.pos = startAt || 0;
+    if (text == "") { callBlankLine(mode, context.state); }
+    while (!stream.eol()) {
+      readToken(mode, stream, context.state);
+      stream.start = stream.pos;
+    }
+  }
+
+  function callBlankLine(mode, state) {
+    if (mode.blankLine) { return mode.blankLine(state) }
+    if (!mode.innerMode) { return }
+    var inner = innerMode(mode, state);
+    if (inner.mode.blankLine) { return inner.mode.blankLine(inner.state) }
+  }
+
+  function readToken(mode, stream, state, inner) {
+    for (var i = 0; i < 10; i++) {
+      if (inner) { inner[0] = innerMode(mode, state).mode; }
+      var style = mode.token(stream, state);
+      if (stream.pos > stream.start) { return style }
+    }
+    throw new Error("Mode " + mode.name + " failed to advance stream.")
+  }
+
+  var Token = function(stream, type, state) {
+    this.start = stream.start; this.end = stream.pos;
+    this.string = stream.current();
+    this.type = type || null;
+    this.state = state;
+  };
+
+  // Utility for getTokenAt and getLineTokens
+  function takeToken(cm, pos, precise, asArray) {
+    var doc = cm.doc, mode = doc.mode, style;
+    pos = clipPos(doc, pos);
+    var line = getLine(doc, pos.line), context = getContextBefore(cm, pos.line, precise);
+    var stream = new StringStream(line.text, cm.options.tabSize, context), tokens;
+    if (asArray) { tokens = []; }
+    while ((asArray || stream.pos < pos.ch) && !stream.eol()) {
+      stream.start = stream.pos;
+      style = readToken(mode, stream, context.state);
+      if (asArray) { tokens.push(new Token(stream, style, copyState(doc.mode, context.state))); }
+    }
+    return asArray ? tokens : new Token(stream, style, context.state)
+  }
+
+  function extractLineClasses(type, output) {
+    if (type) { for (;;) {
+      var lineClass = type.match(/(?:^|\s+)line-(background-)?(\S+)/);
+      if (!lineClass) { break }
+      type = type.slice(0, lineClass.index) + type.slice(lineClass.index + lineClass[0].length);
+      var prop = lineClass[1] ? "bgClass" : "textClass";
+      if (output[prop] == null)
+        { output[prop] = lineClass[2]; }
+      else if (!(new RegExp("(?:^|\\s)" + lineClass[2] + "(?:$|\\s)")).test(output[prop]))
+        { output[prop] += " " + lineClass[2]; }
+    } }
+    return type
+  }
+
+  // Run the given mode's parser over a line, calling f for each token.
+  function runMode(cm, text, mode, context, f, lineClasses, forceToEnd) {
+    var flattenSpans = mode.flattenSpans;
+    if (flattenSpans == null) { flattenSpans = cm.options.flattenSpans; }
+    var curStart = 0, curStyle = null;
+    var stream = new StringStream(text, cm.options.tabSize, context), style;
+    var inner = cm.options.addModeClass && [null];
+    if (text == "") { extractLineClasses(callBlankLine(mode, context.state), lineClasses); }
+    while (!stream.eol()) {
+      if (stream.pos > cm.options.maxHighlightLength) {
+        flattenSpans = false;
+        if (forceToEnd) { processLine(cm, text, context, stream.pos); }
+        stream.pos = text.length;
+        style = null;
+      } else {
+        style = extractLineClasses(readToken(mode, stream, context.state, inner), lineClasses);
+      }
+      if (inner) {
+        var mName = inner[0].name;
+        if (mName) { style = "m-" + (style ? mName + " " + style : mName); }
+      }
+      if (!flattenSpans || curStyle != style) {
+        while (curStart < stream.start) {
+          curStart = Math.min(stream.start, curStart + 5000);
+          f(curStart, curStyle);
+        }
+        curStyle = style;
+      }
+      stream.start = stream.pos;
+    }
+    while (curStart < stream.pos) {
+      // Webkit seems to refuse to render text nodes longer than 57444
+      // characters, and returns inaccurate measurements in nodes
+      // starting around 5000 chars.
+      var pos = Math.min(stream.pos, curStart + 5000);
+      f(pos, curStyle);
+      curStart = pos;
+    }
+  }
+
+  // Finds the line to start with when starting a parse. Tries to
+  // find a line with a stateAfter, so that it can start with a
+  // valid state. If that fails, it returns the line with the
+  // smallest indentation, which tends to need the least context to
+  // parse correctly.
+  function findStartLine(cm, n, precise) {
+    var minindent, minline, doc = cm.doc;
+    var lim = precise ? -1 : n - (cm.doc.mode.innerMode ? 1000 : 100);
+    for (var search = n; search > lim; --search) {
+      if (search <= doc.first) { return doc.first }
+      var line = getLine(doc, search - 1), after = line.stateAfter;
+      if (after && (!precise || search + (after instanceof SavedContext ? after.lookAhead : 0) <= doc.modeFrontier))
+        { return search }
+      var indented = countColumn(line.text, null, cm.options.tabSize);
+      if (minline == null || minindent > indented) {
+        minline = search - 1;
+        minindent = indented;
+      }
+    }
+    return minline
+  }
+
+  function retreatFrontier(doc, n) {
+    doc.modeFrontier = Math.min(doc.modeFrontier, n);
+    if (doc.highlightFrontier < n - 10) { return }
+    var start = doc.first;
+    for (var line = n - 1; line > start; line--) {
+      var saved = getLine(doc, line).stateAfter;
+      // change is on 3
+      // state on line 1 looked ahead 2 -- so saw 3
+      // test 1 + 2 < 3 should cover this
+      if (saved && (!(saved instanceof SavedContext) || line + saved.lookAhead < n)) {
+        start = line + 1;
+        break
+      }
+    }
+    doc.highlightFrontier = Math.min(doc.highlightFrontier, start);
+  }
+
+  // Optimize some code when these features are not used.
+  var sawReadOnlySpans = false, sawCollapsedSpans = false;
+
+  function seeReadOnlySpans() {
+    sawReadOnlySpans = true;
+  }
+
+  function seeCollapsedSpans() {
+    sawCollapsedSpans = true;
+  }
+
+  // TEXTMARKER SPANS
+
+  function MarkedSpan(marker, from, to) {
+    this.marker = marker;
+    this.from = from; this.to = to;
+  }
+
+  // Search an array of spans for a span matching the given marker.
+  function getMarkedSpanFor(spans, marker) {
+    if (spans) { for (var i = 0; i < spans.length; ++i) {
+      var span = spans[i];
+      if (span.marker == marker) { return span }
+    } }
+  }
+  // Remove a span from an array, returning undefined if no spans are
+  // left (we don't store arrays for lines without spans).
+  function removeMarkedSpan(spans, span) {
+    var r;
+    for (var i = 0; i < spans.length; ++i)
+      { if (spans[i] != span) { (r || (r = [])).push(spans[i]); } }
+    return r
+  }
+  // Add a span to a line.
+  function addMarkedSpan(line, span) {
+    line.markedSpans = line.markedSpans ? line.markedSpans.concat([span]) : [span];
+    span.marker.attachLine(line);
+  }
+
+  // Used for the algorithm that adjusts markers for a change in the
+  // document. These functions cut an array of spans at a given
+  // character position, returning an array of remaining chunks (or
+  // undefined if nothing remains).
+  function markedSpansBefore(old, startCh, isInsert) {
+    var nw;
+    if (old) { for (var i = 0; i < old.length; ++i) {
+      var span = old[i], marker = span.marker;
+      var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= startCh : span.from < startCh);
+      if (startsBefore || span.from == startCh && marker.type == "bookmark" && (!isInsert || !span.marker.insertLeft)) {
+        var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= startCh : span.to > startCh)
+        ;(nw || (nw = [])).push(new MarkedSpan(marker, span.from, endsAfter ? null : span.to));
+      }
+    } }
+    return nw
+  }
+  function markedSpansAfter(old, endCh, isInsert) {
+    var nw;
+    if (old) { for (var i = 0; i < old.length; ++i) {
+      var span = old[i], marker = span.marker;
+      var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= endCh : span.to > endCh);
+      if (endsAfter || span.from == endCh && marker.type == "bookmark" && (!isInsert || span.marker.insertLeft)) {
+        var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= endCh : span.from < endCh)
+        ;(nw || (nw = [])).push(new MarkedSpan(marker, startsBefore ? null : span.from - endCh,
+                                              span.to == null ? null : span.to - endCh));
+      }
+    } }
+    return nw
+  }
+
+  // Given a change object, compute the new set of marker spans that
+  // cover the line in which the change took place. Removes spans
+  // entirely within the change, reconnects spans belonging to the
+  // same marker that appear on both sides of the change, and cuts off
+  // spans partially within the change. Returns an array of span
+  // arrays with one element for each line in (after) the change.
+  function stretchSpansOverChange(doc, change) {
+    if (change.full) { return null }
+    var oldFirst = isLine(doc, change.from.line) && getLine(doc, change.from.line).markedSpans;
+    var oldLast = isLine(doc, change.to.line) && getLine(doc, change.to.line).markedSpans;
+    if (!oldFirst && !oldLast) { return null }
+
+    var startCh = change.from.ch, endCh = change.to.ch, isInsert = cmp(change.from, change.to) == 0;
+    // Get the spans that 'stick out' on both sides
+    var first = markedSpansBefore(oldFirst, startCh, isInsert);
+    var last = markedSpansAfter(oldLast, endCh, isInsert);
+
+    // Next, merge those two ends
+    var sameLine = change.text.length == 1, offset = lst(change.text).length + (sameLine ? startCh : 0);
+    if (first) {
+      // Fix up .to properties of first
+      for (var i = 0; i < first.length; ++i) {
+        var span = first[i];
+        if (span.to == null) {
+          var found = getMarkedSpanFor(last, span.marker);
+          if (!found) { span.to = startCh; }
+          else if (sameLine) { span.to = found.to == null ? null : found.to + offset; }
+        }
+      }
+    }
+    if (last) {
+      // Fix up .from in last (or move them into first in case of sameLine)
+      for (var i$1 = 0; i$1 < last.length; ++i$1) {
+        var span$1 = last[i$1];
+        if (span$1.to != null) { span$1.to += offset; }
+        if (span$1.from == null) {
+          var found$1 = getMarkedSpanFor(first, span$1.marker);
+          if (!found$1) {
+            span$1.from = offset;
+            if (sameLine) { (first || (first = [])).push(span$1); }
+          }
+        } else {
+          span$1.from += offset;
+          if (sameLine) { (first || (first = [])).push(span$1); }
+        }
+      }
+    }
+    // Make sure we didn't create any zero-length spans
+    if (first) { first = clearEmptySpans(first); }
+    if (last && last != first) { last = clearEmptySpans(last); }
+
+    var newMarkers = [first];
+    if (!sameLine) {
+      // Fill gap with whole-line-spans
+      var gap = change.text.length - 2, gapMarkers;
+      if (gap > 0 && first)
+        { for (var i$2 = 0; i$2 < first.length; ++i$2)
+          { if (first[i$2].to == null)
+            { (gapMarkers || (gapMarkers = [])).push(new MarkedSpan(first[i$2].marker, null, null)); } } }
+      for (var i$3 = 0; i$3 < gap; ++i$3)
+        { newMarkers.push(gapMarkers); }
+      newMarkers.push(last);
+    }
+    return newMarkers
+  }
+
+  // Remove spans that are empty and don't have a clearWhenEmpty
+  // option of false.
+  function clearEmptySpans(spans) {
+    for (var i = 0; i < spans.length; ++i) {
+      var span = spans[i];
+      if (span.from != null && span.from == span.to && span.marker.clearWhenEmpty !== false)
+        { spans.splice(i--, 1); }
+    }
+    if (!spans.length) { return null }
+    return spans
+  }
+
+  // Used to 'clip' out readOnly ranges when making a change.
+  function removeReadOnlyRanges(doc, from, to) {
+    var markers = null;
+    doc.iter(from.line, to.line + 1, function (line) {
+      if (line.markedSpans) { for (var i = 0; i < line.markedSpans.length; ++i) {
+        var mark = line.markedSpans[i].marker;
+        if (mark.readOnly && (!markers || indexOf(markers, mark) == -1))
+          { (markers || (markers = [])).push(mark); }
+      } }
+    });
+    if (!markers) { return null }
+    var parts = [{from: from, to: to}];
+    for (var i = 0; i < markers.length; ++i) {
+      var mk = markers[i], m = mk.find(0);
+      for (var j = 0; j < parts.length; ++j) {
+        var p = parts[j];
+        if (cmp(p.to, m.from) < 0 || cmp(p.from, m.to) > 0) { continue }
+        var newParts = [j, 1], dfrom = cmp(p.from, m.from), dto = cmp(p.to, m.to);
+        if (dfrom < 0 || !mk.inclusiveLeft && !dfrom)
+          { newParts.push({from: p.from, to: m.from}); }
+        if (dto > 0 || !mk.inclusiveRight && !dto)
+          { newParts.push({from: m.to, to: p.to}); }
+        parts.splice.apply(parts, newParts);
+        j += newParts.length - 3;
+      }
+    }
+    return parts
+  }
+
+  // Connect or disconnect spans from a line.
+  function detachMarkedSpans(line) {
+    var spans = line.markedSpans;
+    if (!spans) { return }
+    for (var i = 0; i < spans.length; ++i)
+      { spans[i].marker.detachLine(line); }
+    line.markedSpans = null;
+  }
+  function attachMarkedSpans(line, spans) {
+    if (!spans) { return }
+    for (var i = 0; i < spans.length; ++i)
+      { spans[i].marker.attachLine(line); }
+    line.markedSpans = spans;
+  }
+
+  // Helpers used when computing which overlapping collapsed span
+  // counts as the larger one.
+  function extraLeft(marker) { return marker.inclusiveLeft ? -1 : 0 }
+  function extraRight(marker) { return marker.inclusiveRight ? 1 : 0 }
+
+  // Returns a number indicating which of two overlapping collapsed
+  // spans is larger (and thus includes the other). Falls back to
+  // comparing ids when the spans cover exactly the same range.
+  function compareCollapsedMarkers(a, b) {
+    var lenDiff = a.lines.length - b.lines.length;
+    if (lenDiff != 0) { return lenDiff }
+    var aPos = a.find(), bPos = b.find();
+    var fromCmp = cmp(aPos.from, bPos.from) || extraLeft(a) - extraLeft(b);
+    if (fromCmp) { return -fromCmp }
+    var toCmp = cmp(aPos.to, bPos.to) || extraRight(a) - extraRight(b);
+    if (toCmp) { return toCmp }
+    return b.id - a.id
+  }
+
+  // Find out whether a line ends or starts in a collapsed span. If
+  // so, return the marker for that span.
+  function collapsedSpanAtSide(line, start) {
+    var sps = sawCollapsedSpans && line.markedSpans, found;
+    if (sps) { for (var sp = (void 0), i = 0; i < sps.length; ++i) {
+      sp = sps[i];
+      if (sp.marker.collapsed && (start ? sp.from : sp.to) == null &&
+          (!found || compareCollapsedMarkers(found, sp.marker) < 0))
+        { found = sp.marker; }
+    } }
+    return found
+  }
+  function collapsedSpanAtStart(line) { return collapsedSpanAtSide(line, true) }
+  function collapsedSpanAtEnd(line) { return collapsedSpanAtSide(line, false) }
+
+  function collapsedSpanAround(line, ch) {
+    var sps = sawCollapsedSpans && line.markedSpans, found;
+    if (sps) { for (var i = 0; i < sps.length; ++i) {
+      var sp = sps[i];
+      if (sp.marker.collapsed && (sp.from == null || sp.from < ch) && (sp.to == null || sp.to > ch) &&
+          (!found || compareCollapsedMarkers(found, sp.marker) < 0)) { found = sp.marker; }
+    } }
+    return found
+  }
+
+  // Test whether there exists a collapsed span that partially
+  // overlaps (covers the start or end, but not both) of a new span.
+  // Such overlap is not allowed.
+  function conflictingCollapsedRange(doc, lineNo, from, to, marker) {
+    var line = getLine(doc, lineNo);
+    var sps = sawCollapsedSpans && line.markedSpans;
+    if (sps) { for (var i = 0; i < sps.length; ++i) {
+      var sp = sps[i];
+      if (!sp.marker.collapsed) { continue }
+      var found = sp.marker.find(0);
+      var fromCmp = cmp(found.from, from) || extraLeft(sp.marker) - extraLeft(marker);
+      var toCmp = cmp(found.to, to) || extraRight(sp.marker) - extraRight(marker);
+      if (fromCmp >= 0 && toCmp <= 0 || fromCmp <= 0 && toCmp >= 0) { continue }
+      if (fromCmp <= 0 && (sp.marker.inclusiveRight && marker.inclusiveLeft ? cmp(found.to, from) >= 0 : cmp(found.to, from) > 0) ||
+          fromCmp >= 0 && (sp.marker.inclusiveRight && marker.inclusiveLeft ? cmp(found.from, to) <= 0 : cmp(found.from, to) < 0))
+        { return true }
+    } }
+  }
+
+  // A visual line is a line as drawn on the screen. Folding, for
+  // example, can cause multiple logical lines to appear on the same
+  // visual line. This finds the start of the visual line that the
+  // given line is part of (usually that is the line itself).
+  function visualLine(line) {
+    var merged;
+    while (merged = collapsedSpanAtStart(line))
+      { line = merged.find(-1, true).line; }
+    return line
+  }
+
+  function visualLineEnd(line) {
+    var merged;
+    while (merged = collapsedSpanAtEnd(line))
+      { line = merged.find(1, true).line; }
+    return line
+  }
+
+  // Returns an array of logical lines that continue the visual line
+  // started by the argument, or undefined if there are no such lines.
+  function visualLineContinued(line) {
+    var merged, lines;
+    while (merged = collapsedSpanAtEnd(line)) {
+      line = merged.find(1, true).line
+      ;(lines || (lines = [])).push(line);
+    }
+    return lines
+  }
+
+  // Get the line number of the start of the visual line that the
+  // given line number is part of.
+  function visualLineNo(doc, lineN) {
+    var line = getLine(doc, lineN), vis = visualLine(line);
+    if (line == vis) { return lineN }
+    return lineNo(vis)
+  }
+
+  // Get the line number of the start of the next visual line after
+  // the given line.
+  function visualLineEndNo(doc, lineN) {
+    if (lineN > doc.lastLine()) { return lineN }
+    var line = getLine(doc, lineN), merged;
+    if (!lineIsHidden(doc, line)) { return lineN }
+    while (merged = collapsedSpanAtEnd(line))
+      { line = merged.find(1, true).line; }
+    return lineNo(line) + 1
+  }
+
+  // Compute whether a line is hidden. Lines count as hidden when they
+  // are part of a visual line that starts with another line, or when
+  // they are entirely covered by collapsed, non-widget span.
+  function lineIsHidden(doc, line) {
+    var sps = sawCollapsedSpans && line.markedSpans;
+    if (sps) { for (var sp = (void 0), i = 0; i < sps.length; ++i) {
+      sp = sps[i];
+      if (!sp.marker.collapsed) { continue }
+      if (sp.from == null) { return true }
+      if (sp.marker.widgetNode) { continue }
+      if (sp.from == 0 && sp.marker.inclusiveLeft && lineIsHiddenInner(doc, line, sp))
+        { return true }
+    } }
+  }
+  function lineIsHiddenInner(doc, line, span) {
+    if (span.to == null) {
+      var end = span.marker.find(1, true);
+      return lineIsHiddenInner(doc, end.line, getMarkedSpanFor(end.line.markedSpans, span.marker))
+    }
+    if (span.marker.inclusiveRight && span.to == line.text.length)
+      { return true }
+    for (var sp = (void 0), i = 0; i < line.markedSpans.length; ++i) {
+      sp = line.markedSpans[i];
+      if (sp.marker.collapsed && !sp.marker.widgetNode && sp.from == span.to &&
+          (sp.to == null || sp.to != span.from) &&
+          (sp.marker.inclusiveLeft || span.marker.inclusiveRight) &&
+          lineIsHiddenInner(doc, line, sp)) { return true }
+    }
+  }
+
+  // Find the height above the given line.
+  function heightAtLine(lineObj) {
+    lineObj = visualLine(lineObj);
+
+    var h = 0, chunk = lineObj.parent;
+    for (var i = 0; i < chunk.lines.length; ++i) {
+      var line = chunk.lines[i];
+      if (line == lineObj) { break }
+      else { h += line.height; }
+    }
+    for (var p = chunk.parent; p; chunk = p, p = chunk.parent) {
+      for (var i$1 = 0; i$1 < p.children.length; ++i$1) {
+        var cur = p.children[i$1];
+        if (cur == chunk) { break }
+        else { h += cur.height; }
+      }
+    }
+    return h
+  }
+
+  // Compute the character length of a line, taking into account
+  // collapsed ranges (see markText) that might hide parts, and join
+  // other lines onto it.
+  function lineLength(line) {
+    if (line.height == 0) { return 0 }
+    var len = line.text.length, merged, cur = line;
+    while (merged = collapsedSpanAtStart(cur)) {
+      var found = merged.find(0, true);
+      cur = found.from.line;
+      len += found.from.ch - found.to.ch;
+    }
+    cur = line;
+    while (merged = collapsedSpanAtEnd(cur)) {
+      var found$1 = merged.find(0, true);
+      len -= cur.text.length - found$1.from.ch;
+      cur = found$1.to.line;
+      len += cur.text.length - found$1.to.ch;
+    }
+    return len
+  }
+
+  // Find the longest line in the document.
+  function findMaxLine(cm) {
+    var d = cm.display, doc = cm.doc;
+    d.maxLine = getLine(doc, doc.first);
+    d.maxLineLength = lineLength(d.maxLine);
+    d.maxLineChanged = true;
+    doc.iter(function (line) {
+      var len = lineLength(line);
+      if (len > d.maxLineLength) {
+        d.maxLineLength = len;
+        d.maxLine = line;
+      }
+    });
+  }
+
+  // LINE DATA STRUCTURE
+
+  // Line objects. These hold state related to a line, including
+  // highlighting info (the styles array).
+  var Line = function(text, markedSpans, estimateHeight) {
+    this.text = text;
+    attachMarkedSpans(this, markedSpans);
+    this.height = estimateHeight ? estimateHeight(this) : 1;
+  };
+
+  Line.prototype.lineNo = function () { return lineNo(this) };
+  eventMixin(Line);
+
+  // Change the content (text, markers) of a line. Automatically
+  // invalidates cached information and tries to re-estimate the
+  // line's height.
+  function updateLine(line, text, markedSpans, estimateHeight) {
+    line.text = text;
+    if (line.stateAfter) { line.stateAfter = null; }
+    if (line.styles) { line.styles = null; }
+    if (line.order != null) { line.order = null; }
+    detachMarkedSpans(line);
+    attachMarkedSpans(line, markedSpans);
+    var estHeight = estimateHeight ? estimateHeight(line) : 1;
+    if (estHeight != line.height) { updateLineHeight(line, estHeight); }
+  }
+
+  // Detach a line from the document tree and its markers.
+  function cleanUpLine(line) {
+    line.parent = null;
+    detachMarkedSpans(line);
+  }
+
+  // Convert a style as returned by a mode (either null, or a string
+  // containing one or more styles) to a CSS style. This is cached,
+  // and also looks for line-wide styles.
+  var styleToClassCache = {}, styleToClassCacheWithMode = {};
+  function interpretTokenStyle(style, options) {
+    if (!style || /^\s*$/.test(style)) { return null }
+    var cache = options.addModeClass ? styleToClassCacheWithMode : styleToClassCache;
+    return cache[style] ||
+      (cache[style] = style.replace(/\S+/g, "cm-$&"))
+  }
+
+  // Render the DOM representation of the text of a line. Also builds
+  // up a 'line map', which points at the DOM nodes that represent
+  // specific stretches of text, and is used by the measuring code.
+  // The returned object contains the DOM node, this map, and
+  // information about line-wide styles that were set by the mode.
+  function buildLineContent(cm, lineView) {
+    // The padding-right forces the element to have a 'border', which
+    // is needed on Webkit to be able to get line-level bounding
+    // rectangles for it (in measureChar).
+    var content = eltP("span", null, null, webkit ? "padding-right: .1px" : null);
+    var builder = {pre: eltP("pre", [content], "CodeMirror-line"), content: content,
+                   col: 0, pos: 0, cm: cm,
+                   trailingSpace: false,
+                   splitSpaces: cm.getOption("lineWrapping")};
+    lineView.measure = {};
+
+    // Iterate over the logical lines that make up this visual line.
+    for (var i = 0; i <= (lineView.rest ? lineView.rest.length : 0); i++) {
+      var line = i ? lineView.rest[i - 1] : lineView.line, order = (void 0);
+      builder.pos = 0;
+      builder.addToken = buildToken;
+      // Optionally wire in some hacks into the token-rendering
+      // algorithm, to deal with browser quirks.
+      if (hasBadBidiRects(cm.display.measure) && (order = getOrder(line, cm.doc.direction)))
+        { builder.addToken = buildTokenBadBidi(builder.addToken, order); }
+      builder.map = [];
+      var allowFrontierUpdate = lineView != cm.display.externalMeasured && lineNo(line);
+      insertLineContent(line, builder, getLineStyles(cm, line, allowFrontierUpdate));
+      if (line.styleClasses) {
+        if (line.styleClasses.bgClass)
+          { builder.bgClass = joinClasses(line.styleClasses.bgClass, builder.bgClass || ""); }
+        if (line.styleClasses.textClass)
+          { builder.textClass = joinClasses(line.styleClasses.textClass, builder.textClass || ""); }
+      }
+
+      // Ensure at least a single node is present, for measuring.
+      if (builder.map.length == 0)
+        { builder.map.push(0, 0, builder.content.appendChild(zeroWidthElement(cm.display.measure))); }
+
+      // Store the map and a cache object for the current logical line
+      if (i == 0) {
+        lineView.measure.map = builder.map;
+        lineView.measure.cache = {};
+      } else {
+  (lineView.measure.maps || (lineView.measure.maps = [])).push(builder.map)
+        ;(lineView.measure.caches || (lineView.measure.caches = [])).push({});
+      }
+    }
+
+    // See issue #2901
+    if (webkit) {
+      var last = builder.content.lastChild;
+      if (/\bcm-tab\b/.test(last.className) || (last.querySelector && last.querySelector(".cm-tab")))
+        { builder.content.className = "cm-tab-wrap-hack"; }
+    }
+
+    signal(cm, "renderLine", cm, lineView.line, builder.pre);
+    if (builder.pre.className)
+      { builder.textClass = joinClasses(builder.pre.className, builder.textClass || ""); }
+
+    return builder
+  }
+
+  function defaultSpecialCharPlaceholder(ch) {
+    var token = elt("span", "\u2022", "cm-invalidchar");
+    token.title = "\\u" + ch.charCodeAt(0).toString(16);
+    token.setAttribute("aria-label", token.title);
+    return token
+  }
+
+  // Build up the DOM representation for a single token, and add it to
+  // the line map. Takes care to render special characters separately.
+  function buildToken(builder, text, style, startStyle, endStyle, css, attributes) {
+    if (!text) { return }
+    var displayText = builder.splitSpaces ? splitSpaces(text, builder.trailingSpace) : text;
+    var special = builder.cm.state.specialChars, mustWrap = false;
+    var content;
+    if (!special.test(text)) {
+      builder.col += text.length;
+      content = document.createTextNode(displayText);
+      builder.map.push(builder.pos, builder.pos + text.length, content);
+      if (ie && ie_version < 9) { mustWrap = true; }
+      builder.pos += text.length;
+    } else {
+      content = document.createDocumentFragment();
+      var pos = 0;
+      while (true) {
+        special.lastIndex = pos;
+        var m = special.exec(text);
+        var skipped = m ? m.index - pos : text.length - pos;
+        if (skipped) {
+          var txt = document.createTextNode(displayText.slice(pos, pos + skipped));
+          if (ie && ie_version < 9) { content.appendChild(elt("span", [txt])); }
+          else { content.appendChild(txt); }
+          builder.map.push(builder.pos, builder.pos + skipped, txt);
+          builder.col += skipped;
+          builder.pos += skipped;
+        }
+        if (!m) { break }
+        pos += skipped + 1;
+        var txt$1 = (void 0);
+        if (m[0] == "\t") {
+          var tabSize = builder.cm.options.tabSize, tabWidth = tabSize - builder.col % tabSize;
+          txt$1 = content.appendChild(elt("span", spaceStr(tabWidth), "cm-tab"));
+          txt$1.setAttribute("role", "presentation");
+          txt$1.setAttribute("cm-text", "\t");
+          builder.col += tabWidth;
+        } else if (m[0] == "\r" || m[0] == "\n") {
+          txt$1 = content.appendChild(elt("span", m[0] == "\r" ? "\u240d" : "\u2424", "cm-invalidchar"));
+          txt$1.setAttribute("cm-text", m[0]);
+          builder.col += 1;
+        } else {
+          txt$1 = builder.cm.options.specialCharPlaceholder(m[0]);
+          txt$1.setAttribute("cm-text", m[0]);
+          if (ie && ie_version < 9) { content.appendChild(elt("span", [txt$1])); }
+          else { content.appendChild(txt$1); }
+          builder.col += 1;
+        }
+        builder.map.push(builder.pos, builder.pos + 1, txt$1);
+        builder.pos++;
+      }
+    }
+    builder.trailingSpace = displayText.charCodeAt(text.length - 1) == 32;
+    if (style || startStyle || endStyle || mustWrap || css || attributes) {
+      var fullStyle = style || "";
+      if (startStyle) { fullStyle += startStyle; }
+      if (endStyle) { fullStyle += endStyle; }
+      var token = elt("span", [content], fullStyle, css);
+      if (attributes) {
+        for (var attr in attributes) { if (attributes.hasOwnProperty(attr) && attr != "style" && attr != "class")
+          { token.setAttribute(attr, attributes[attr]); } }
+      }
+      return builder.content.appendChild(token)
+    }
+    builder.content.appendChild(content);
+  }
+
+  // Change some spaces to NBSP to prevent the browser from collapsing
+  // trailing spaces at the end of a line when rendering text (issue #1362).
+  function splitSpaces(text, trailingBefore) {
+    if (text.length > 1 && !/  /.test(text)) { return text }
+    var spaceBefore = trailingBefore, result = "";
+    for (var i = 0; i < text.length; i++) {
+      var ch = text.charAt(i);
+      if (ch == " " && spaceBefore && (i == text.length - 1 || text.charCodeAt(i + 1) == 32))
+        { ch = "\u00a0"; }
+      result += ch;
+      spaceBefore = ch == " ";
+    }
+    return result
+  }
+
+  // Work around nonsense dimensions being reported for stretches of
+  // right-to-left text.
+  function buildTokenBadBidi(inner, order) {
+    return function (builder, text, style, startStyle, endStyle, css, attributes) {
+      style = style ? style + " cm-force-border" : "cm-force-border";
+      var start = builder.pos, end = start + text.length;
+      for (;;) {
+        // Find the part that overlaps with the start of this text
+        var part = (void 0);
+        for (var i = 0; i < order.length; i++) {
+          part = order[i];
+          if (part.to > start && part.from <= start) { break }
+        }
+        if (part.to >= end) { return inner(builder, text, style, startStyle, endStyle, css, attributes) }
+        inner(builder, text.slice(0, part.to - start), style, startStyle, null, css, attributes);
+        startStyle = null;
+        text = text.slice(part.to - start);
+        start = part.to;
+      }
+    }
+  }
+
+  function buildCollapsedSpan(builder, size, marker, ignoreWidget) {
+    var widget = !ignoreWidget && marker.widgetNode;
+    if (widget) { builder.map.push(builder.pos, builder.pos + size, widget); }
+    if (!ignoreWidget && builder.cm.display.input.needsContentAttribute) {
+      if (!widget)
+        { widget = builder.content.appendChild(document.createElement("span")); }
+      widget.setAttribute("cm-marker", marker.id);
+    }
+    if (widget) {
+      builder.cm.display.input.setUneditable(widget);
+      builder.content.appendChild(widget);
+    }
+    builder.pos += size;
+    builder.trailingSpace = false;
+  }
+
+  // Outputs a number of spans to make up a line, taking highlighting
+  // and marked text into account.
+  function insertLineContent(line, builder, styles) {
+    var spans = line.markedSpans, allText = line.text, at = 0;
+    if (!spans) {
+      for (var i$1 = 1; i$1 < styles.length; i$1+=2)
+        { builder.addToken(builder, allText.slice(at, at = styles[i$1]), interpretTokenStyle(styles[i$1+1], builder.cm.options)); }
+      return
+    }
+
+    var len = allText.length, pos = 0, i = 1, text = "", style, css;
+    var nextChange = 0, spanStyle, spanEndStyle, spanStartStyle, collapsed, attributes;
+    for (;;) {
+      if (nextChange == pos) { // Update current marker set
+        spanStyle = spanEndStyle = spanStartStyle = css = "";
+        attributes = null;
+        collapsed = null; nextChange = Infinity;
+        var foundBookmarks = [], endStyles = (void 0);
+        for (var j = 0; j < spans.length; ++j) {
+          var sp = spans[j], m = sp.marker;
+          if (m.type == "bookmark" && sp.from == pos && m.widgetNode) {
+            foundBookmarks.push(m);
+          } else if (sp.from <= pos && (sp.to == null || sp.to > pos || m.collapsed && sp.to == pos && sp.from == pos)) {
+            if (sp.to != null && sp.to != pos && nextChange > sp.to) {
+              nextChange = sp.to;
+              spanEndStyle = "";
+            }
+            if (m.className) { spanStyle += " " + m.className; }
+            if (m.css) { css = (css ? css + ";" : "") + m.css; }
+            if (m.startStyle && sp.from == pos) { spanStartStyle += " " + m.startStyle; }
+            if (m.endStyle && sp.to == nextChange) { (endStyles || (endStyles = [])).push(m.endStyle, sp.to); }
+            // support for the old title property
+            // https://github.com/codemirror/CodeMirror/pull/5673
+            if (m.title) { (attributes || (attributes = {})).title = m.title; }
+            if (m.attributes) {
+              for (var attr in m.attributes)
+                { (attributes || (attributes = {}))[attr] = m.attributes[attr]; }
+            }
+            if (m.collapsed && (!collapsed || compareCollapsedMarkers(collapsed.marker, m) < 0))
+              { collapsed = sp; }
+          } else if (sp.from > pos && nextChange > sp.from) {
+            nextChange = sp.from;
+          }
+        }
+        if (endStyles) { for (var j$1 = 0; j$1 < endStyles.length; j$1 += 2)
+          { if (endStyles[j$1 + 1] == nextChange) { spanEndStyle += " " + endStyles[j$1]; } } }
+
+        if (!collapsed || collapsed.from == pos) { for (var j$2 = 0; j$2 < foundBookmarks.length; ++j$2)
+          { buildCollapsedSpan(builder, 0, foundBookmarks[j$2]); } }
+        if (collapsed && (collapsed.from || 0) == pos) {
+          buildCollapsedSpan(builder, (collapsed.to == null ? len + 1 : collapsed.to) - pos,
+                             collapsed.marker, collapsed.from == null);
+          if (collapsed.to == null) { return }
+          if (collapsed.to == pos) { collapsed = false; }
+        }
+      }
+      if (pos >= len) { break }
+
+      var upto = Math.min(len, nextChange);
+      while (true) {
+        if (text) {
+          var end = pos + text.length;
+          if (!collapsed) {
+            var tokenText = end > upto ? text.slice(0, upto - pos) : text;
+            builder.addToken(builder, tokenText, style ? style + spanStyle : spanStyle,
+                             spanStartStyle, pos + tokenText.length == nextChange ? spanEndStyle : "", css, attributes);
+          }
+          if (end >= upto) {text = text.slice(upto - pos); pos = upto; break}
+          pos = end;
+          spanStartStyle = "";
+        }
+        text = allText.slice(at, at = styles[i++]);
+        style = interpretTokenStyle(styles[i++], builder.cm.options);
+      }
+    }
+  }
+
+
+  // These objects are used to represent the visible (currently drawn)
+  // part of the document. A LineView may correspond to multiple
+  // logical lines, if those are connected by collapsed ranges.
+  function LineView(doc, line, lineN) {
+    // The starting line
+    this.line = line;
+    // Continuing lines, if any
+    this.rest = visualLineContinued(line);
+    // Number of logical lines in this visual line
+    this.size = this.rest ? lineNo(lst(this.rest)) - lineN + 1 : 1;
+    this.node = this.text = null;
+    this.hidden = lineIsHidden(doc, line);
+  }
+
+  // Create a range of LineView objects for the given lines.
+  function buildViewArray(cm, from, to) {
+    var array = [], nextPos;
+    for (var pos = from; pos < to; pos = nextPos) {
+      var view = new LineView(cm.doc, getLine(cm.doc, pos), pos);
+      nextPos = pos + view.size;
+      array.push(view);
+    }
+    return array
+  }
+
+  var operationGroup = null;
+
+  function pushOperation(op) {
+    if (operationGroup) {
+      operationGroup.ops.push(op);
+    } else {
+      op.ownsGroup = operationGroup = {
+        ops: [op],
+        delayedCallbacks: []
+      };
+    }
+  }
+
+  function fireCallbacksForOps(group) {
+    // Calls delayed callbacks and cursorActivity handlers until no
+    // new ones appear
+    var callbacks = group.delayedCallbacks, i = 0;
+    do {
+      for (; i < callbacks.length; i++)
+        { callbacks[i].call(null); }
+      for (var j = 0; j < group.ops.length; j++) {
+        var op = group.ops[j];
+        if (op.cursorActivityHandlers)
+          { while (op.cursorActivityCalled < op.cursorActivityHandlers.length)
+            { op.cursorActivityHandlers[op.cursorActivityCalled++].call(null, op.cm); } }
+      }
+    } while (i < callbacks.length)
+  }
+
+  function finishOperation(op, endCb) {
+    var group = op.ownsGroup;
+    if (!group) { return }
+
+    try { fireCallbacksForOps(group); }
+    finally {
+      operationGroup = null;
+      endCb(group);
+    }
+  }
+
+  var orphanDelayedCallbacks = null;
+
+  // Often, we want to signal events at a point where we are in the
+  // middle of some work, but don't want the handler to start calling
+  // other methods on the editor, which might be in an inconsistent
+  // state or simply not expect any other events to happen.
+  // signalLater looks whether there are any handlers, and schedules
+  // them to be executed when the last operation ends, or, if no
+  // operation is active, when a timeout fires.
+  function signalLater(emitter, type /*, values...*/) {
+    var arr = getHandlers(emitter, type);
+    if (!arr.length) { return }
+    var args = Array.prototype.slice.call(arguments, 2), list;
+    if (operationGroup) {
+      list = operationGroup.delayedCallbacks;
+    } else if (orphanDelayedCallbacks) {
+      list = orphanDelayedCallbacks;
+    } else {
+      list = orphanDelayedCallbacks = [];
+      setTimeout(fireOrphanDelayed, 0);
+    }
+    var loop = function ( i ) {
+      list.push(function () { return arr[i].apply(null, args); });
+    };
+
+    for (var i = 0; i < arr.length; ++i)
+      loop( i );
+  }
+
+  function fireOrphanDelayed() {
+    var delayed = orphanDelayedCallbacks;
+    orphanDelayedCallbacks = null;
+    for (var i = 0; i < delayed.length; ++i) { delayed[i](); }
+  }
+
+  // When an aspect of a line changes, a string is added to
+  // lineView.changes. This updates the relevant part of the line's
+  // DOM structure.
+  function updateLineForChanges(cm, lineView, lineN, dims) {
+    for (var j = 0; j < lineView.changes.length; j++) {
+      var type = lineView.changes[j];
+      if (type == "text") { updateLineText(cm, lineView); }
+      else if (type == "gutter") { updateLineGutter(cm, lineView, lineN, dims); }
+      else if (type == "class") { updateLineClasses(cm, lineView); }
+      else if (type == "widget") { updateLineWidgets(cm, lineView, dims); }
+    }
+    lineView.changes = null;
+  }
+
+  // Lines with gutter elements, widgets or a background class need to
+  // be wrapped, and have the extra elements added to the wrapper div
+  function ensureLineWrapped(lineView) {
+    if (lineView.node == lineView.text) {
+      lineView.node = elt("div", null, null, "position: relative");
+      if (lineView.text.parentNode)
+        { lineView.text.parentNode.replaceChild(lineView.node, lineView.text); }
+      lineView.node.appendChild(lineView.text);
+      if (ie && ie_version < 8) { lineView.node.style.zIndex = 2; }
+    }
+    return lineView.node
+  }
+
+  function updateLineBackground(cm, lineView) {
+    var cls = lineView.bgClass ? lineView.bgClass + " " + (lineView.line.bgClass || "") : lineView.line.bgClass;
+    if (cls) { cls += " CodeMirror-linebackground"; }
+    if (lineView.background) {
+      if (cls) { lineView.background.className = cls; }
+      else { lineView.background.parentNode.removeChild(lineView.background); lineView.background = null; }
+    } else if (cls) {
+      var wrap = ensureLineWrapped(lineView);
+      lineView.background = wrap.insertBefore(elt("div", null, cls), wrap.firstChild);
+      cm.display.input.setUneditable(lineView.background);
+    }
+  }
+
+  // Wrapper around buildLineContent which will reuse the structure
+  // in display.externalMeasured when possible.
+  function getLineContent(cm, lineView) {
+    var ext = cm.display.externalMeasured;
+    if (ext && ext.line == lineView.line) {
+      cm.display.externalMeasured = null;
+      lineView.measure = ext.measure;
+      return ext.built
+    }
+    return buildLineContent(cm, lineView)
+  }
+
+  // Redraw the line's text. Interacts with the background and text
+  // classes because the mode may output tokens that influence these
+  // classes.
+  function updateLineText(cm, lineView) {
+    var cls = lineView.text.className;
+    var built = getLineContent(cm, lineView);
+    if (lineView.text == lineView.node) { lineView.node = built.pre; }
+    lineView.text.parentNode.replaceChild(built.pre, lineView.text);
+    lineView.text = built.pre;
+    if (built.bgClass != lineView.bgClass || built.textClass != lineView.textClass) {
+      lineView.bgClass = built.bgClass;
+      lineView.textClass = built.textClass;
+      updateLineClasses(cm, lineView);
+    } else if (cls) {
+      lineView.text.className = cls;
+    }
+  }
+
+  function updateLineClasses(cm, lineView) {
+    updateLineBackground(cm, lineView);
+    if (lineView.line.wrapClass)
+      { ensureLineWrapped(lineView).className = lineView.line.wrapClass; }
+    else if (lineView.node != lineView.text)
+      { lineView.node.className = ""; }
+    var textClass = lineView.textClass ? lineView.textClass + " " + (lineView.line.textClass || "") : lineView.line.textClass;
+    lineView.text.className = textClass || "";
+  }
+
+  function updateLineGutter(cm, lineView, lineN, dims) {
+    if (lineView.gutter) {
+      lineView.node.removeChild(lineView.gutter);
+      lineView.gutter = null;
+    }
+    if (lineView.gutterBackground) {
+      lineView.node.removeChild(lineView.gutterBackground);
+      lineView.gutterBackground = null;
+    }
+    if (lineView.line.gutterClass) {
+      var wrap = ensureLineWrapped(lineView);
+      lineView.gutterBackground = elt("div", null, "CodeMirror-gutter-background " + lineView.line.gutterClass,
+                                      ("left: " + (cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) + "px; width: " + (dims.gutterTotalWidth) + "px"));
+      cm.display.input.setUneditable(lineView.gutterBackground);
+      wrap.insertBefore(lineView.gutterBackground, lineView.text);
+    }
+    var markers = lineView.line.gutterMarkers;
+    if (cm.options.lineNumbers || markers) {
+      var wrap$1 = ensureLineWrapped(lineView);
+      var gutterWrap = lineView.gutter = elt("div", null, "CodeMirror-gutter-wrapper", ("left: " + (cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) + "px"));
+      cm.display.input.setUneditable(gutterWrap);
+      wrap$1.insertBefore(gutterWrap, lineView.text);
+      if (lineView.line.gutterClass)
+        { gutterWrap.className += " " + lineView.line.gutterClass; }
+      if (cm.options.lineNumbers && (!markers || !markers["CodeMirror-linenumbers"]))
+        { lineView.lineNumber = gutterWrap.appendChild(
+          elt("div", lineNumberFor(cm.options, lineN),
+              "CodeMirror-linenumber CodeMirror-gutter-elt",
+              ("left: " + (dims.gutterLeft["CodeMirror-linenumbers"]) + "px; width: " + (cm.display.lineNumInnerWidth) + "px"))); }
+      if (markers) { for (var k = 0; k < cm.display.gutterSpecs.length; ++k) {
+        var id = cm.display.gutterSpecs[k].className, found = markers.hasOwnProperty(id) && markers[id];
+        if (found)
+          { gutterWrap.appendChild(elt("div", [found], "CodeMirror-gutter-elt",
+                                     ("left: " + (dims.gutterLeft[id]) + "px; width: " + (dims.gutterWidth[id]) + "px"))); }
+      } }
+    }
+  }
+
+  function updateLineWidgets(cm, lineView, dims) {
+    if (lineView.alignable) { lineView.alignable = null; }
+    var isWidget = classTest("CodeMirror-linewidget");
+    for (var node = lineView.node.firstChild, next = (void 0); node; node = next) {
+      next = node.nextSibling;
+      if (isWidget.test(node.className)) { lineView.node.removeChild(node); }
+    }
+    insertLineWidgets(cm, lineView, dims);
+  }
+
+  // Build a line's DOM representation from scratch
+  function buildLineElement(cm, lineView, lineN, dims) {
+    var built = getLineContent(cm, lineView);
+    lineView.text = lineView.node = built.pre;
+    if (built.bgClass) { lineView.bgClass = built.bgClass; }
+    if (built.textClass) { lineView.textClass = built.textClass; }
+
+    updateLineClasses(cm, lineView);
+    updateLineGutter(cm, lineView, lineN, dims);
+    insertLineWidgets(cm, lineView, dims);
+    return lineView.node
+  }
+
+  // A lineView may contain multiple logical lines (when merged by
+  // collapsed spans). The widgets for all of them need to be drawn.
+  function insertLineWidgets(cm, lineView, dims) {
+    insertLineWidgetsFor(cm, lineView.line, lineView, dims, true);
+    if (lineView.rest) { for (var i = 0; i < lineView.rest.length; i++)
+      { insertLineWidgetsFor(cm, lineView.rest[i], lineView, dims, false); } }
+  }
+
+  function insertLineWidgetsFor(cm, line, lineView, dims, allowAbove) {
+    if (!line.widgets) { return }
+    var wrap = ensureLineWrapped(lineView);
+    for (var i = 0, ws = line.widgets; i < ws.length; ++i) {
+      var widget = ws[i], node = elt("div", [widget.node], "CodeMirror-linewidget" + (widget.className ? " " + widget.className : ""));
+      if (!widget.handleMouseEvents) { node.setAttribute("cm-ignore-events", "true"); }
+      positionLineWidget(widget, node, lineView, dims);
+      cm.display.input.setUneditable(node);
+      if (allowAbove && widget.above)
+        { wrap.insertBefore(node, lineView.gutter || lineView.text); }
+      else
+        { wrap.appendChild(node); }
+      signalLater(widget, "redraw");
+    }
+  }
+
+  function positionLineWidget(widget, node, lineView, dims) {
+    if (widget.noHScroll) {
+  (lineView.alignable || (lineView.alignable = [])).push(node);
+      var width = dims.wrapperWidth;
+      node.style.left = dims.fixedPos + "px";
+      if (!widget.coverGutter) {
+        width -= dims.gutterTotalWidth;
+        node.style.paddingLeft = dims.gutterTotalWidth + "px";
+      }
+      node.style.width = width + "px";
+    }
+    if (widget.coverGutter) {
+      node.style.zIndex = 5;
+      node.style.position = "relative";
+      if (!widget.noHScroll) { node.style.marginLeft = -dims.gutterTotalWidth + "px"; }
+    }
+  }
+
+  function widgetHeight(widget) {
+    if (widget.height != null) { return widget.height }
+    var cm = widget.doc.cm;
+    if (!cm) { return 0 }
+    if (!contains(document.body, widget.node)) {
+      var parentStyle = "position: relative;";
+      if (widget.coverGutter)
+        { parentStyle += "margin-left: -" + cm.display.gutters.offsetWidth + "px;"; }
+      if (widget.noHScroll)
+        { parentStyle += "width: " + cm.display.wrapper.clientWidth + "px;"; }
+      removeChildrenAndAdd(cm.display.measure, elt("div", [widget.node], null, parentStyle));
+    }
+    return widget.height = widget.node.parentNode.offsetHeight
+  }
+
+  // Return true when the given mouse event happened in a widget
+  function eventInWidget(display, e) {
+    for (var n = e_target(e); n != display.wrapper; n = n.parentNode) {
+      if (!n || (n.nodeType == 1 && n.getAttribute("cm-ignore-events") == "true") ||
+          (n.parentNode == display.sizer && n != display.mover))
+        { return true }
+    }
+  }
+
+  // POSITION MEASUREMENT
+
+  function paddingTop(display) {return display.lineSpace.offsetTop}
+  function paddingVert(display) {return display.mover.offsetHeight - display.lineSpace.offsetHeight}
+  function paddingH(display) {
+    if (display.cachedPaddingH) { return display.cachedPaddingH }
+    var e = removeChildrenAndAdd(display.measure, elt("pre", "x", "CodeMirror-line-like"));
+    var style = window.getComputedStyle ? window.getComputedStyle(e) : e.currentStyle;
+    var data = {left: parseInt(style.paddingLeft), right: parseInt(style.paddingRight)};
+    if (!isNaN(data.left) && !isNaN(data.right)) { display.cachedPaddingH = data; }
+    return data
+  }
+
+  function scrollGap(cm) { return scrollerGap - cm.display.nativeBarWidth }
+  function displayWidth(cm) {
+    return cm.display.scroller.clientWidth - scrollGap(cm) - cm.display.barWidth
+  }
+  function displayHeight(cm) {
+    return cm.display.scroller.clientHeight - scrollGap(cm) - cm.display.barHeight
+  }
+
+  // Ensure the lineView.wrapping.heights array is populated. This is
+  // an array of bottom offsets for the lines that make up a drawn
+  // line. When lineWrapping is on, there might be more than one
+  // height.
+  function ensureLineHeights(cm, lineView, rect) {
+    var wrapping = cm.options.lineWrapping;
+    var curWidth = wrapping && displayWidth(cm);
+    if (!lineView.measure.heights || wrapping && lineView.measure.width != curWidth) {
+      var heights = lineView.measure.heights = [];
+      if (wrapping) {
+        lineView.measure.width = curWidth;
+        var rects = lineView.text.firstChild.getClientRects();
+        for (var i = 0; i < rects.length - 1; i++) {
+          var cur = rects[i], next = rects[i + 1];
+          if (Math.abs(cur.bottom - next.bottom) > 2)
+            { heights.push((cur.bottom + next.top) / 2 - rect.top); }
+        }
+      }
+      heights.push(rect.bottom - rect.top);
+    }
+  }
+
+  // Find a line map (mapping character offsets to text nodes) and a
+  // measurement cache for the given line number. (A line view might
+  // contain multiple lines when collapsed ranges are present.)
+  function mapFromLineView(lineView, line, lineN) {
+    if (lineView.line == line)
+      { return {map: lineView.measure.map, cache: lineView.measure.cache} }
+    for (var i = 0; i < lineView.rest.length; i++)
+      { if (lineView.rest[i] == line)
+        { return {map: lineView.measure.maps[i], cache: lineView.measure.caches[i]} } }
+    for (var i$1 = 0; i$1 < lineView.rest.length; i$1++)
+      { if (lineNo(lineView.rest[i$1]) > lineN)
+        { return {map: lineView.measure.maps[i$1], cache: lineView.measure.caches[i$1], before: true} } }
+  }
+
+  // Render a line into the hidden node display.externalMeasured. Used
+  // when measurement is needed for a line that's not in the viewport.
+  function updateExternalMeasurement(cm, line) {
+    line = visualLine(line);
+    var lineN = lineNo(line);
+    var view = cm.display.externalMeasured = new LineView(cm.doc, line, lineN);
+    view.lineN = lineN;
+    var built = view.built = buildLineContent(cm, view);
+    view.text = built.pre;
+    removeChildrenAndAdd(cm.display.lineMeasure, built.pre);
+    return view
+  }
+
+  // Get a {top, bottom, left, right} box (in line-local coordinates)
+  // for a given character.
+  function measureChar(cm, line, ch, bias) {
+    return measureCharPrepared(cm, prepareMeasureForLine(cm, line), ch, bias)
+  }
+
+  // Find a line view that corresponds to the given line number.
+  function findViewForLine(cm, lineN) {
+    if (lineN >= cm.display.viewFrom && lineN < cm.display.viewTo)
+      { return cm.display.view[findViewIndex(cm, lineN)] }
+    var ext = cm.display.externalMeasured;
+    if (ext && lineN >= ext.lineN && lineN < ext.lineN + ext.size)
+      { return ext }
+  }
+
+  // Measurement can be split in two steps, the set-up work that
+  // applies to the whole line, and the measurement of the actual
+  // character. Functions like coordsChar, that need to do a lot of
+  // measurements in a row, can thus ensure that the set-up work is
+  // only done once.
+  function prepareMeasureForLine(cm, line) {
+    var lineN = lineNo(line);
+    var view = findViewForLine(cm, lineN);
+    if (view && !view.text) {
+      view = null;
+    } else if (view && view.changes) {
+      updateLineForChanges(cm, view, lineN, getDimensions(cm));
+      cm.curOp.forceUpdate = true;
+    }
+    if (!view)
+      { view = updateExternalMeasurement(cm, line); }
+
+    var info = mapFromLineView(view, line, lineN);
+    return {
+      line: line, view: view, rect: null,
+      map: info.map, cache: info.cache, before: info.before,
+      hasHeights: false
+    }
+  }
+
+  // Given a prepared measurement object, measures the position of an
+  // actual character (or fetches it from the cache).
+  function measureCharPrepared(cm, prepared, ch, bias, varHeight) {
+    if (prepared.before) { ch = -1; }
+    var key = ch + (bias || ""), found;
+    if (prepared.cache.hasOwnProperty(key)) {
+      found = prepared.cache[key];
+    } else {
+      if (!prepared.rect)
+        { prepared.rect = prepared.view.text.getBoundingClientRect(); }
+      if (!prepared.hasHeights) {
+        ensureLineHeights(cm, prepared.view, prepared.rect);
+        prepared.hasHeights = true;
+      }
+      found = measureCharInner(cm, prepared, ch, bias);
+      if (!found.bogus) { prepared.cache[key] = found; }
+    }
+    return {left: found.left, right: found.right,
+            top: varHeight ? found.rtop : found.top,
+            bottom: varHeight ? found.rbottom : found.bottom}
+  }
+
+  var nullRect = {left: 0, right: 0, top: 0, bottom: 0};
+
+  function nodeAndOffsetInLineMap(map, ch, bias) {
+    var node, start, end, collapse, mStart, mEnd;
+    // First, search the line map for the text node corresponding to,
+    // or closest to, the target character.
+    for (var i = 0; i < map.length; i += 3) {
+      mStart = map[i];
+      mEnd = map[i + 1];
+      if (ch < mStart) {
+        start = 0; end = 1;
+        collapse = "left";
+      } else if (ch < mEnd) {
+        start = ch - mStart;
+        end = start + 1;
+      } else if (i == map.length - 3 || ch == mEnd && map[i + 3] > ch) {
+        end = mEnd - mStart;
+        start = end - 1;
+        if (ch >= mEnd) { collapse = "right"; }
+      }
+      if (start != null) {
+        node = map[i + 2];
+        if (mStart == mEnd && bias == (node.insertLeft ? "left" : "right"))
+          { collapse = bias; }
+        if (bias == "left" && start == 0)
+          { while (i && map[i - 2] == map[i - 3] && map[i - 1].insertLeft) {
+            node = map[(i -= 3) + 2];
+            collapse = "left";
+          } }
+        if (bias == "right" && start == mEnd - mStart)
+          { while (i < map.length - 3 && map[i + 3] == map[i + 4] && !map[i + 5].insertLeft) {
+            node = map[(i += 3) + 2];
+            collapse = "right";
+          } }
+        break
+      }
+    }
+    return {node: node, start: start, end: end, collapse: collapse, coverStart: mStart, coverEnd: mEnd}
+  }
+
+  function getUsefulRect(rects, bias) {
+    var rect = nullRect;
+    if (bias == "left") { for (var i = 0; i < rects.length; i++) {
+      if ((rect = rects[i]).left != rect.right) { break }
+    } } else { for (var i$1 = rects.length - 1; i$1 >= 0; i$1--) {
+      if ((rect = rects[i$1]).left != rect.right) { break }
+    } }
+    return rect
+  }
+
+  function measureCharInner(cm, prepared, ch, bias) {
+    var place = nodeAndOffsetInLineMap(prepared.map, ch, bias);
+    var node = place.node, start = place.start, end = place.end, collapse = place.collapse;
+
+    var rect;
+    if (node.nodeType == 3) { // If it is a text node, use a range to retrieve the coordinates.
+      for (var i$1 = 0; i$1 < 4; i$1++) { // Retry a maximum of 4 times when nonsense rectangles are returned
+        while (start && isExtendingChar(prepared.line.text.charAt(place.coverStart + start))) { --start; }
+        while (place.coverStart + end < place.coverEnd && isExtendingChar(prepared.line.text.charAt(place.coverStart + end))) { ++end; }
+        if (ie && ie_version < 9 && start == 0 && end == place.coverEnd - place.coverStart)
+          { rect = node.parentNode.getBoundingClientRect(); }
+        else
+          { rect = getUsefulRect(range(node, start, end).getClientRects(), bias); }
+        if (rect.left || rect.right || start == 0) { break }
+        end = start;
+        start = start - 1;
+        collapse = "right";
+      }
+      if (ie && ie_version < 11) { rect = maybeUpdateRectForZooming(cm.display.measure, rect); }
+    } else { // If it is a widget, simply get the box for the whole widget.
+      if (start > 0) { collapse = bias = "right"; }
+      var rects;
+      if (cm.options.lineWrapping && (rects = node.getClientRects()).length > 1)
+        { rect = rects[bias == "right" ? rects.length - 1 : 0]; }
+      else
+        { rect = node.getBoundingClientRect(); }
+    }
+    if (ie && ie_version < 9 && !start && (!rect || !rect.left && !rect.right)) {
+      var rSpan = node.parentNode.getClientRects()[0];
+      if (rSpan)
+        { rect = {left: rSpan.left, right: rSpan.left + charWidth(cm.display), top: rSpan.top, bottom: rSpan.bottom}; }
+      else
+        { rect = nullRect; }
+    }
+
+    var rtop = rect.top - prepared.rect.top, rbot = rect.bottom - prepared.rect.top;
+    var mid = (rtop + rbot) / 2;
+    var heights = prepared.view.measure.heights;
+    var i = 0;
+    for (; i < heights.length - 1; i++)
+      { if (mid < heights[i]) { break } }
+    var top = i ? heights[i - 1] : 0, bot = heights[i];
+    var result = {left: (collapse == "right" ? rect.right : rect.left) - prepared.rect.left,
+                  right: (collapse == "left" ? rect.left : rect.right) - prepared.rect.left,
+                  top: top, bottom: bot};
+    if (!rect.left && !rect.right) { result.bogus = true; }
+    if (!cm.options.singleCursorHeightPerLine) { result.rtop = rtop; result.rbottom = rbot; }
+
+    return result
+  }
+
+  // Work around problem with bounding client rects on ranges being
+  // returned incorrectly when zoomed on IE10 and below.
+  function maybeUpdateRectForZooming(measure, rect) {
+    if (!window.screen || screen.logicalXDPI == null ||
+        screen.logicalXDPI == screen.deviceXDPI || !hasBadZoomedRects(measure))
+      { return rect }
+    var scaleX = screen.logicalXDPI / screen.deviceXDPI;
+    var scaleY = screen.logicalYDPI / screen.deviceYDPI;
+    return {left: rect.left * scaleX, right: rect.right * scaleX,
+            top: rect.top * scaleY, bottom: rect.bottom * scaleY}
+  }
+
+  function clearLineMeasurementCacheFor(lineView) {
+    if (lineView.measure) {
+      lineView.measure.cache = {};
+      lineView.measure.heights = null;
+      if (lineView.rest) { for (var i = 0; i < lineView.rest.length; i++)
+        { lineView.measure.caches[i] = {}; } }
+    }
+  }
+
+  function clearLineMeasurementCache(cm) {
+    cm.display.externalMeasure = null;
+    removeChildren(cm.display.lineMeasure);
+    for (var i = 0; i < cm.display.view.length; i++)
+      { clearLineMeasurementCacheFor(cm.display.view[i]); }
+  }
+
+  function clearCaches(cm) {
+    clearLineMeasurementCache(cm);
+    cm.display.cachedCharWidth = cm.display.cachedTextHeight = cm.display.cachedPaddingH = null;
+    if (!cm.options.lineWrapping) { cm.display.maxLineChanged = true; }
+    cm.display.lineNumChars = null;
+  }
+
+  function pageScrollX() {
+    // Work around https://bugs.chromium.org/p/chromium/issues/detail?id=489206
+    // which causes page_Offset and bounding client rects to use
+    // different reference viewports and invalidate our calculations.
+    if (chrome && android) { return -(document.body.getBoundingClientRect().left - parseInt(getComputedStyle(document.body).marginLeft)) }
+    return window.pageXOffset || (document.documentElement || document.body).scrollLeft
+  }
+  function pageScrollY() {
+    if (chrome && android) { return -(document.body.getBoundingClientRect().top - parseInt(getComputedStyle(document.body).marginTop)) }
+    return window.pageYOffset || (document.documentElement || document.body).scrollTop
+  }
+
+  function widgetTopHeight(lineObj) {
+    var height = 0;
+    if (lineObj.widgets) { for (var i = 0; i < lineObj.widgets.length; ++i) { if (lineObj.widgets[i].above)
+      { height += widgetHeight(lineObj.widgets[i]); } } }
+    return height
+  }
+
+  // Converts a {top, bottom, left, right} box from line-local
+  // coordinates into another coordinate system. Context may be one of
+  // "line", "div" (display.lineDiv), "local"./null (editor), "window",
+  // or "page".
+  function intoCoordSystem(cm, lineObj, rect, context, includeWidgets) {
+    if (!includeWidgets) {
+      var height = widgetTopHeight(lineObj);
+      rect.top += height; rect.bottom += height;
+    }
+    if (context == "line") { return rect }
+    if (!context) { context = "local"; }
+    var yOff = heightAtLine(lineObj);
+    if (context == "local") { yOff += paddingTop(cm.display); }
+    else { yOff -= cm.display.viewOffset; }
+    if (context == "page" || context == "window") {
+      var lOff = cm.display.lineSpace.getBoundingClientRect();
+      yOff += lOff.top + (context == "window" ? 0 : pageScrollY());
+      var xOff = lOff.left + (context == "window" ? 0 : pageScrollX());
+      rect.left += xOff; rect.right += xOff;
+    }
+    rect.top += yOff; rect.bottom += yOff;
+    return rect
+  }
+
+  // Coverts a box from "div" coords to another coordinate system.
+  // Context may be "window", "page", "div", or "local"./null.
+  function fromCoordSystem(cm, coords, context) {
+    if (context == "div") { return coords }
+    var left = coords.left, top = coords.top;
+    // First move into "page" coordinate system
+    if (context == "page") {
+      left -= pageScrollX();
+      top -= pageScrollY();
+    } else if (context == "local" || !context) {
+      var localBox = cm.display.sizer.getBoundingClientRect();
+      left += localBox.left;
+      top += localBox.top;
+    }
+
+    var lineSpaceBox = cm.display.lineSpace.getBoundingClientRect();
+    return {left: left - lineSpaceBox.left, top: top - lineSpaceBox.top}
+  }
+
+  function charCoords(cm, pos, context, lineObj, bias) {
+    if (!lineObj) { lineObj = getLine(cm.doc, pos.line); }
+    return intoCoordSystem(cm, lineObj, measureChar(cm, lineObj, pos.ch, bias), context)
+  }
+
+  // Returns a box for a given cursor position, which may have an
+  // 'other' property containing the position of the secondary cursor
+  // on a bidi boundary.
+  // A cursor Pos(line, char, "before") is on the same visual line as `char - 1`
+  // and after `char - 1` in writing order of `char - 1`
+  // A cursor Pos(line, char, "after") is on the same visual line as `char`
+  // and before `char` in writing order of `char`
+  // Examples (upper-case letters are RTL, lower-case are LTR):
+  //     Pos(0, 1, ...)
+  //     before   after
+  // ab     a|b     a|b
+  // aB     a|B     aB|
+  // Ab     |Ab     A|b
+  // AB     B|A     B|A
+  // Every position after the last character on a line is considered to stick
+  // to the last character on the line.
+  function cursorCoords(cm, pos, context, lineObj, preparedMeasure, varHeight) {
+    lineObj = lineObj || getLine(cm.doc, pos.line);
+    if (!preparedMeasure) { preparedMeasure = prepareMeasureForLine(cm, lineObj); }
+    function get(ch, right) {
+      var m = measureCharPrepared(cm, preparedMeasure, ch, right ? "right" : "left", varHeight);
+      if (right) { m.left = m.right; } else { m.right = m.left; }
+      return intoCoordSystem(cm, lineObj, m, context)
+    }
+    var order = getOrder(lineObj, cm.doc.direction), ch = pos.ch, sticky = pos.sticky;
+    if (ch >= lineObj.text.length) {
+      ch = lineObj.text.length;
+      sticky = "before";
+    } else if (ch <= 0) {
+      ch = 0;
+      sticky = "after";
+    }
+    if (!order) { return get(sticky == "before" ? ch - 1 : ch, sticky == "before") }
+
+    function getBidi(ch, partPos, invert) {
+      var part = order[partPos], right = part.level == 1;
+      return get(invert ? ch - 1 : ch, right != invert)
+    }
+    var partPos = getBidiPartAt(order, ch, sticky);
+    var other = bidiOther;
+    var val = getBidi(ch, partPos, sticky == "before");
+    if (other != null) { val.other = getBidi(ch, other, sticky != "before"); }
+    return val
+  }
+
+  // Used to cheaply estimate the coordinates for a position. Used for
+  // intermediate scroll updates.
+  function estimateCoords(cm, pos) {
+    var left = 0;
+    pos = clipPos(cm.doc, pos);
+    if (!cm.options.lineWrapping) { left = charWidth(cm.display) * pos.ch; }
+    var lineObj = getLine(cm.doc, pos.line);
+    var top = heightAtLine(lineObj) + paddingTop(cm.display);
+    return {left: left, right: left, top: top, bottom: top + lineObj.height}
+  }
+
+  // Positions returned by coordsChar contain some extra information.
+  // xRel is the relative x position of the input coordinates compared
+  // to the found position (so xRel > 0 means the coordinates are to
+  // the right of the character position, for example). When outside
+  // is true, that means the coordinates lie outside the line's
+  // vertical range.
+  function PosWithInfo(line, ch, sticky, outside, xRel) {
+    var pos = Pos(line, ch, sticky);
+    pos.xRel = xRel;
+    if (outside) { pos.outside = outside; }
+    return pos
+  }
+
+  // Compute the character position closest to the given coordinates.
+  // Input must be lineSpace-local ("div" coordinate system).
+  function coordsChar(cm, x, y) {
+    var doc = cm.doc;
+    y += cm.display.viewOffset;
+    if (y < 0) { return PosWithInfo(doc.first, 0, null, -1, -1) }
+    var lineN = lineAtHeight(doc, y), last = doc.first + doc.size - 1;
+    if (lineN > last)
+      { return PosWithInfo(doc.first + doc.size - 1, getLine(doc, last).text.length, null, 1, 1) }
+    if (x < 0) { x = 0; }
+
+    var lineObj = getLine(doc, lineN);
+    for (;;) {
+      var found = coordsCharInner(cm, lineObj, lineN, x, y);
+      var collapsed = collapsedSpanAround(lineObj, found.ch + (found.xRel > 0 || found.outside > 0 ? 1 : 0));
+      if (!collapsed) { return found }
+      var rangeEnd = collapsed.find(1);
+      if (rangeEnd.line == lineN) { return rangeEnd }
+      lineObj = getLine(doc, lineN = rangeEnd.line);
+    }
+  }
+
+  function wrappedLineExtent(cm, lineObj, preparedMeasure, y) {
+    y -= widgetTopHeight(lineObj);
+    var end = lineObj.text.length;
+    var begin = findFirst(function (ch) { return measureCharPrepared(cm, preparedMeasure, ch - 1).bottom <= y; }, end, 0);
+    end = findFirst(function (ch) { return measureCharPrepared(cm, preparedMeasure, ch).top > y; }, begin, end);
+    return {begin: begin, end: end}
+  }
+
+  function wrappedLineExtentChar(cm, lineObj, preparedMeasure, target) {
+    if (!preparedMeasure) { preparedMeasure = prepareMeasureForLine(cm, lineObj); }
+    var targetTop = intoCoordSystem(cm, lineObj, measureCharPrepared(cm, preparedMeasure, target), "line").top;
+    return wrappedLineExtent(cm, lineObj, preparedMeasure, targetTop)
+  }
+
+  // Returns true if the given side of a box is after the given
+  // coordinates, in top-to-bottom, left-to-right order.
+  function boxIsAfter(box, x, y, left) {
+    return box.bottom <= y ? false : box.top > y ? true : (left ? box.left : box.right) > x
+  }
+
+  function coordsCharInner(cm, lineObj, lineNo, x, y) {
+    // Move y into line-local coordinate space
+    y -= heightAtLine(lineObj);
+    var preparedMeasure = prepareMeasureForLine(cm, lineObj);
+    // When directly calling `measureCharPrepared`, we have to adjust
+    // for the widgets at this line.
+    var widgetHeight = widgetTopHeight(lineObj);
+    var begin = 0, end = lineObj.text.length, ltr = true;
+
+    var order = getOrder(lineObj, cm.doc.direction);
+    // If the line isn't plain left-to-right text, first figure out
+    // which bidi section the coordinates fall into.
+    if (order) {
+      var part = (cm.options.lineWrapping ? coordsBidiPartWrapped : coordsBidiPart)
+                   (cm, lineObj, lineNo, preparedMeasure, order, x, y);
+      ltr = part.level != 1;
+      // The awkward -1 offsets are needed because findFirst (called
+      // on these below) will treat its first bound as inclusive,
+      // second as exclusive, but we want to actually address the
+      // characters in the part's range
+      begin = ltr ? part.from : part.to - 1;
+      end = ltr ? part.to : part.from - 1;
+    }
+
+    // A binary search to find the first character whose bounding box
+    // starts after the coordinates. If we run across any whose box wrap
+    // the coordinates, store that.
+    var chAround = null, boxAround = null;
+    var ch = findFirst(function (ch) {
+      var box = measureCharPrepared(cm, preparedMeasure, ch);
+      box.top += widgetHeight; box.bottom += widgetHeight;
+      if (!boxIsAfter(box, x, y, false)) { return false }
+      if (box.top <= y && box.left <= x) {
+        chAround = ch;
+        boxAround = box;
+      }
+      return true
+    }, begin, end);
+
+    var baseX, sticky, outside = false;
+    // If a box around the coordinates was found, use that
+    if (boxAround) {
+      // Distinguish coordinates nearer to the left or right side of the box
+      var atLeft = x - boxAround.left < boxAround.right - x, atStart = atLeft == ltr;
+      ch = chAround + (atStart ? 0 : 1);
+      sticky = atStart ? "after" : "before";
+      baseX = atLeft ? boxAround.left : boxAround.right;
+    } else {
+      // (Adjust for extended bound, if necessary.)
+      if (!ltr && (ch == end || ch == begin)) { ch++; }
+      // To determine which side to associate with, get the box to the
+      // left of the character and compare it's vertical position to the
+      // coordinates
+      sticky = ch == 0 ? "after" : ch == lineObj.text.length ? "before" :
+        (measureCharPrepared(cm, preparedMeasure, ch - (ltr ? 1 : 0)).bottom + widgetHeight <= y) == ltr ?
+        "after" : "before";
+      // Now get accurate coordinates for this place, in order to get a
+      // base X position
+      var coords = cursorCoords(cm, Pos(lineNo, ch, sticky), "line", lineObj, preparedMeasure);
+      baseX = coords.left;
+      outside = y < coords.top ? -1 : y >= coords.bottom ? 1 : 0;
+    }
+
+    ch = skipExtendingChars(lineObj.text, ch, 1);
+    return PosWithInfo(lineNo, ch, sticky, outside, x - baseX)
+  }
+
+  function coordsBidiPart(cm, lineObj, lineNo, preparedMeasure, order, x, y) {
+    // Bidi parts are sorted left-to-right, and in a non-line-wrapping
+    // situation, we can take this ordering to correspond to the visual
+    // ordering. This finds the first part whose end is after the given
+    // coordinates.
+    var index = findFirst(function (i) {
+      var part = order[i], ltr = part.level != 1;
+      return boxIsAfter(cursorCoords(cm, Pos(lineNo, ltr ? part.to : part.from, ltr ? "before" : "after"),
+                                     "line", lineObj, preparedMeasure), x, y, true)
+    }, 0, order.length - 1);
+    var part = order[index];
+    // If this isn't the first part, the part's start is also after
+    // the coordinates, and the coordinates aren't on the same line as
+    // that start, move one part back.
+    if (index > 0) {
+      var ltr = part.level != 1;
+      var start = cursorCoords(cm, Pos(lineNo, ltr ? part.from : part.to, ltr ? "after" : "before"),
+                               "line", lineObj, preparedMeasure);
+      if (boxIsAfter(start, x, y, true) && start.top > y)
+        { part = order[index - 1]; }
+    }
+    return part
+  }
+
+  function coordsBidiPartWrapped(cm, lineObj, _lineNo, preparedMeasure, order, x, y) {
+    // In a wrapped line, rtl text on wrapping boundaries can do things
+    // that don't correspond to the ordering in our `order` array at
+    // all, so a binary search doesn't work, and we want to return a
+    // part that only spans one line so that the binary search in
+    // coordsCharInner is safe. As such, we first find the extent of the
+    // wrapped line, and then do a flat search in which we discard any
+    // spans that aren't on the line.
+    var ref = wrappedLineExtent(cm, lineObj, preparedMeasure, y);
+    var begin = ref.begin;
+    var end = ref.end;
+    if (/\s/.test(lineObj.text.charAt(end - 1))) { end--; }
+    var part = null, closestDist = null;
+    for (var i = 0; i < order.length; i++) {
+      var p = order[i];
+      if (p.from >= end || p.to <= begin) { continue }
+      var ltr = p.level != 1;
+      var endX = measureCharPrepared(cm, preparedMeasure, ltr ? Math.min(end, p.to) - 1 : Math.max(begin, p.from)).right;
+      // Weigh against spans ending before this, so that they are only
+      // picked if nothing ends after
+      var dist = endX < x ? x - endX + 1e9 : endX - x;
+      if (!part || closestDist > dist) {
+        part = p;
+        closestDist = dist;
+      }
+    }
+    if (!part) { part = order[order.length - 1]; }
+    // Clip the part to the wrapped line.
+    if (part.from < begin) { part = {from: begin, to: part.to, level: part.level}; }
+    if (part.to > end) { part = {from: part.from, to: end, level: part.level}; }
+    return part
+  }
+
+  var measureText;
+  // Compute the default text height.
+  function textHeight(display) {
+    if (display.cachedTextHeight != null) { return display.cachedTextHeight }
+    if (measureText == null) {
+      measureText = elt("pre", null, "CodeMirror-line-like");
+      // Measure a bunch of lines, for browsers that compute
+      // fractional heights.
+      for (var i = 0; i < 49; ++i) {
+        measureText.appendChild(document.createTextNode("x"));
+        measureText.appendChild(elt("br"));
+      }
+      measureText.appendChild(document.createTextNode("x"));
+    }
+    removeChildrenAndAdd(display.measure, measureText);
+    var height = measureText.offsetHeight / 50;
+    if (height > 3) { display.cachedTextHeight = height; }
+    removeChildren(display.measure);
+    return height || 1
+  }
+
+  // Compute the default character width.
+  function charWidth(display) {
+    if (display.cachedCharWidth != null) { return display.cachedCharWidth }
+    var anchor = elt("span", "xxxxxxxxxx");
+    var pre = elt("pre", [anchor], "CodeMirror-line-like");
+    removeChildrenAndAdd(display.measure, pre);
+    var rect = anchor.getBoundingClientRect(), width = (rect.right - rect.left) / 10;
+    if (width > 2) { display.cachedCharWidth = width; }
+    return width || 10
+  }
+
+  // Do a bulk-read of the DOM positions and sizes needed to draw the
+  // view, so that we don't interleave reading and writing to the DOM.
+  function getDimensions(cm) {
+    var d = cm.display, left = {}, width = {};
+    var gutterLeft = d.gutters.clientLeft;
+    for (var n = d.gutters.firstChild, i = 0; n; n = n.nextSibling, ++i) {
+      var id = cm.display.gutterSpecs[i].className;
+      left[id] = n.offsetLeft + n.clientLeft + gutterLeft;
+      width[id] = n.clientWidth;
+    }
+    return {fixedPos: compensateForHScroll(d),
+            gutterTotalWidth: d.gutters.offsetWidth,
+            gutterLeft: left,
+            gutterWidth: width,
+            wrapperWidth: d.wrapper.clientWidth}
+  }
+
+  // Computes display.scroller.scrollLeft + display.gutters.offsetWidth,
+  // but using getBoundingClientRect to get a sub-pixel-accurate
+  // result.
+  function compensateForHScroll(display) {
+    return display.scroller.getBoundingClientRect().left - display.sizer.getBoundingClientRect().left
+  }
+
+  // Returns a function that estimates the height of a line, to use as
+  // first approximation until the line becomes visible (and is thus
+  // properly measurable).
+  function estimateHeight(cm) {
+    var th = textHeight(cm.display), wrapping = cm.options.lineWrapping;
+    var perLine = wrapping && Math.max(5, cm.display.scroller.clientWidth / charWidth(cm.display) - 3);
+    return function (line) {
+      if (lineIsHidden(cm.doc, line)) { return 0 }
+
+      var widgetsHeight = 0;
+      if (line.widgets) { for (var i = 0; i < line.widgets.length; i++) {
+        if (line.widgets[i].height) { widgetsHeight += line.widgets[i].height; }
+      } }
+
+      if (wrapping)
+        { return widgetsHeight + (Math.ceil(line.text.length / perLine) || 1) * th }
+      else
+        { return widgetsHeight + th }
+    }
+  }
+
+  function estimateLineHeights(cm) {
+    var doc = cm.doc, est = estimateHeight(cm);
+    doc.iter(function (line) {
+      var estHeight = est(line);
+      if (estHeight != line.height) { updateLineHeight(line, estHeight); }
+    });
+  }
+
+  // Given a mouse event, find the corresponding position. If liberal
+  // is false, it checks whether a gutter or scrollbar was clicked,
+  // and returns null if it was. forRect is used by rectangular
+  // selections, and tries to estimate a character position even for
+  // coordinates beyond the right of the text.
+  function posFromMouse(cm, e, liberal, forRect) {
+    var display = cm.display;
+    if (!liberal && e_target(e).getAttribute("cm-not-content") == "true") { return null }
+
+    var x, y, space = display.lineSpace.getBoundingClientRect();
+    // Fails unpredictably on IE[67] when mouse is dragged around quickly.
+    try { x = e.clientX - space.left; y = e.clientY - space.top; }
+    catch (e$1) { return null }
+    var coords = coordsChar(cm, x, y), line;
+    if (forRect && coords.xRel > 0 && (line = getLine(cm.doc, coords.line).text).length == coords.ch) {
+      var colDiff = countColumn(line, line.length, cm.options.tabSize) - line.length;
+      coords = Pos(coords.line, Math.max(0, Math.round((x - paddingH(cm.display).left) / charWidth(cm.display)) - colDiff));
+    }
+    return coords
+  }
+
+  // Find the view element corresponding to a given line. Return null
+  // when the line isn't visible.
+  function findViewIndex(cm, n) {
+    if (n >= cm.display.viewTo) { return null }
+    n -= cm.display.viewFrom;
+    if (n < 0) { return null }
+    var view = cm.display.view;
+    for (var i = 0; i < view.length; i++) {
+      n -= view[i].size;
+      if (n < 0) { return i }
+    }
+  }
+
+  // Updates the display.view data structure for a given change to the
+  // document. From and to are in pre-change coordinates. Lendiff is
+  // the amount of lines added or subtracted by the change. This is
+  // used for changes that span multiple lines, or change the way
+  // lines are divided into visual lines. regLineChange (below)
+  // registers single-line changes.
+  function regChange(cm, from, to, lendiff) {
+    if (from == null) { from = cm.doc.first; }
+    if (to == null) { to = cm.doc.first + cm.doc.size; }
+    if (!lendiff) { lendiff = 0; }
+
+    var display = cm.display;
+    if (lendiff && to < display.viewTo &&
+        (display.updateLineNumbers == null || display.updateLineNumbers > from))
+      { display.updateLineNumbers = from; }
+
+    cm.curOp.viewChanged = true;
+
+    if (from >= display.viewTo) { // Change after
+      if (sawCollapsedSpans && visualLineNo(cm.doc, from) < display.viewTo)
+        { resetView(cm); }
+    } else if (to <= display.viewFrom) { // Change before
+      if (sawCollapsedSpans && visualLineEndNo(cm.doc, to + lendiff) > display.viewFrom) {
+        resetView(cm);
+      } else {
+        display.viewFrom += lendiff;
+        display.viewTo += lendiff;
+      }
+    } else if (from <= display.viewFrom && to >= display.viewTo) { // Full overlap
+      resetView(cm);
+    } else if (from <= display.viewFrom) { // Top overlap
+      var cut = viewCuttingPoint(cm, to, to + lendiff, 1);
+      if (cut) {
+        display.view = display.view.slice(cut.index);
+        display.viewFrom = cut.lineN;
+        display.viewTo += lendiff;
+      } else {
+        resetView(cm);
+      }
+    } else if (to >= display.viewTo) { // Bottom overlap
+      var cut$1 = viewCuttingPoint(cm, from, from, -1);
+      if (cut$1) {
+        display.view = display.view.slice(0, cut$1.index);
+        display.viewTo = cut$1.lineN;
+      } else {
+        resetView(cm);
+      }
+    } else { // Gap in the middle
+      var cutTop = viewCuttingPoint(cm, from, from, -1);
+      var cutBot = viewCuttingPoint(cm, to, to + lendiff, 1);
+      if (cutTop && cutBot) {
+        display.view = display.view.slice(0, cutTop.index)
+          .concat(buildViewArray(cm, cutTop.lineN, cutBot.lineN))
+          .concat(display.view.slice(cutBot.index));
+        display.viewTo += lendiff;
+      } else {
+        resetView(cm);
+      }
+    }
+
+    var ext = display.externalMeasured;
+    if (ext) {
+      if (to < ext.lineN)
+        { ext.lineN += lendiff; }
+      else if (from < ext.lineN + ext.size)
+        { display.externalMeasured = null; }
+    }
+  }
+
+  // Register a change to a single line. Type must be one of "text",
+  // "gutter", "class", "widget"
+  function regLineChange(cm, line, type) {
+    cm.curOp.viewChanged = true;
+    var display = cm.display, ext = cm.display.externalMeasured;
+    if (ext && line >= ext.lineN && line < ext.lineN + ext.size)
+      { display.externalMeasured = null; }
+
+    if (line < display.viewFrom || line >= display.viewTo) { return }
+    var lineView = display.view[findViewIndex(cm, line)];
+    if (lineView.node == null) { return }
+    var arr = lineView.changes || (lineView.changes = []);
+    if (indexOf(arr, type) == -1) { arr.push(type); }
+  }
+
+  // Clear the view.
+  function resetView(cm) {
+    cm.display.viewFrom = cm.display.viewTo = cm.doc.first;
+    cm.display.view = [];
+    cm.display.viewOffset = 0;
+  }
+
+  function viewCuttingPoint(cm, oldN, newN, dir) {
+    var index = findViewIndex(cm, oldN), diff, view = cm.display.view;
+    if (!sawCollapsedSpans || newN == cm.doc.first + cm.doc.size)
+      { return {index: index, lineN: newN} }
+    var n = cm.display.viewFrom;
+    for (var i = 0; i < index; i++)
+      { n += view[i].size; }
+    if (n != oldN) {
+      if (dir > 0) {
+        if (index == view.length - 1) { return null }
+        diff = (n + view[index].size) - oldN;
+        index++;
+      } else {
+        diff = n - oldN;
+      }
+      oldN += diff; newN += diff;
+    }
+    while (visualLineNo(cm.doc, newN) != newN) {
+      if (index == (dir < 0 ? 0 : view.length - 1)) { return null }
+      newN += dir * view[index - (dir < 0 ? 1 : 0)].size;
+      index += dir;
+    }
+    return {index: index, lineN: newN}
+  }
+
+  // Force the view to cover a given range, adding empty view element
+  // or clipping off existing ones as needed.
+  function adjustView(cm, from, to) {
+    var display = cm.display, view = display.view;
+    if (view.length == 0 || from >= display.viewTo || to <= display.viewFrom) {
+      display.view = buildViewArray(cm, from, to);
+      display.viewFrom = from;
+    } else {
+      if (display.viewFrom > from)
+        { display.view = buildViewArray(cm, from, display.viewFrom).concat(display.view); }
+      else if (display.viewFrom < from)
+        { display.view = display.view.slice(findViewIndex(cm, from)); }
+      display.viewFrom = from;
+      if (display.viewTo < to)
+        { display.view = display.view.concat(buildViewArray(cm, display.viewTo, to)); }
+      else if (display.viewTo > to)
+        { display.view = display.view.slice(0, findViewIndex(cm, to)); }
+    }
+    display.viewTo = to;
+  }
+
+  // Count the number of lines in the view whose DOM representation is
+  // out of date (or nonexistent).
+  function countDirtyView(cm) {
+    var view = cm.display.view, dirty = 0;
+    for (var i = 0; i < view.length; i++) {
+      var lineView = view[i];
+      if (!lineView.hidden && (!lineView.node || lineView.changes)) { ++dirty; }
+    }
+    return dirty
+  }
+
+  function updateSelection(cm) {
+    cm.display.input.showSelection(cm.display.input.prepareSelection());
+  }
+
+  function prepareSelection(cm, primary) {
+    if ( primary === void 0 ) primary = true;
+
+    var doc = cm.doc, result = {};
+    var curFragment = result.cursors = document.createDocumentFragment();
+    var selFragment = result.selection = document.createDocumentFragment();
+
+    for (var i = 0; i < doc.sel.ranges.length; i++) {
+      if (!primary && i == doc.sel.primIndex) { continue }
+      var range = doc.sel.ranges[i];
+      if (range.from().line >= cm.display.viewTo || range.to().line < cm.display.viewFrom) { continue }
+      var collapsed = range.empty();
+      if (collapsed || cm.options.showCursorWhenSelecting)
+        { drawSelectionCursor(cm, range.head, curFragment); }
+      if (!collapsed)
+        { drawSelectionRange(cm, range, selFragment); }
+    }
+    return result
+  }
+
+  // Draws a cursor for the given range
+  function drawSelectionCursor(cm, head, output) {
+    var pos = cursorCoords(cm, head, "div", null, null, !cm.options.singleCursorHeightPerLine);
+
+    var cursor = output.appendChild(elt("div", "\u00a0", "CodeMirror-cursor"));
+    cursor.style.left = pos.left + "px";
+    cursor.style.top = pos.top + "px";
+    cursor.style.height = Math.max(0, pos.bottom - pos.top) * cm.options.cursorHeight + "px";
+
+    if (pos.other) {
+      // Secondary cursor, shown when on a 'jump' in bi-directional text
+      var otherCursor = output.appendChild(elt("div", "\u00a0", "CodeMirror-cursor CodeMirror-secondarycursor"));
+      otherCursor.style.display = "";
+      otherCursor.style.left = pos.other.left + "px";
+      otherCursor.style.top = pos.other.top + "px";
+      otherCursor.style.height = (pos.other.bottom - pos.other.top) * .85 + "px";
+    }
+  }
+
+  function cmpCoords(a, b) { return a.top - b.top || a.left - b.left }
+
+  // Draws the given range as a highlighted selection
+  function drawSelectionRange(cm, range, output) {
+    var display = cm.display, doc = cm.doc;
+    var fragment = document.createDocumentFragment();
+    var padding = paddingH(cm.display), leftSide = padding.left;
+    var rightSide = Math.max(display.sizerWidth, displayWidth(cm) - display.sizer.offsetLeft) - padding.right;
+    var docLTR = doc.direction == "ltr";
+
+    function add(left, top, width, bottom) {
+      if (top < 0) { top = 0; }
+      top = Math.round(top);
+      bottom = Math.round(bottom);
+      fragment.appendChild(elt("div", null, "CodeMirror-selected", ("position: absolute; left: " + left + "px;\n                             top: " + top + "px; width: " + (width == null ? rightSide - left : width) + "px;\n                             height: " + (bottom - top) + "px")));
+    }
+
+    function drawForLine(line, fromArg, toArg) {
+      var lineObj = getLine(doc, line);
+      var lineLen = lineObj.text.length;
+      var start, end;
+      function coords(ch, bias) {
+        return charCoords(cm, Pos(line, ch), "div", lineObj, bias)
+      }
+
+      function wrapX(pos, dir, side) {
+        var extent = wrappedLineExtentChar(cm, lineObj, null, pos);
+        var prop = (dir == "ltr") == (side == "after") ? "left" : "right";
+        var ch = side == "after" ? extent.begin : extent.end - (/\s/.test(lineObj.text.charAt(extent.end - 1)) ? 2 : 1);
+        return coords(ch, prop)[prop]
+      }
+
+      var order = getOrder(lineObj, doc.direction);
+      iterateBidiSections(order, fromArg || 0, toArg == null ? lineLen : toArg, function (from, to, dir, i) {
+        var ltr = dir == "ltr";
+        var fromPos = coords(from, ltr ? "left" : "right");
+        var toPos = coords(to - 1, ltr ? "right" : "left");
+
+        var openStart = fromArg == null && from == 0, openEnd = toArg == null && to == lineLen;
+        var first = i == 0, last = !order || i == order.length - 1;
+        if (toPos.top - fromPos.top <= 3) { // Single line
+          var openLeft = (docLTR ? openStart : openEnd) && first;
+          var openRight = (docLTR ? openEnd : openStart) && last;
+          var left = openLeft ? leftSide : (ltr ? fromPos : toPos).left;
+          var right = openRight ? rightSide : (ltr ? toPos : fromPos).right;
+          add(left, fromPos.top, right - left, fromPos.bottom);
+        } else { // Multiple lines
+          var topLeft, topRight, botLeft, botRight;
+          if (ltr) {
+            topLeft = docLTR && openStart && first ? leftSide : fromPos.left;
+            topRight = docLTR ? rightSide : wrapX(from, dir, "before");
+            botLeft = docLTR ? leftSide : wrapX(to, dir, "after");
+            botRight = docLTR && openEnd && last ? rightSide : toPos.right;
+          } else {
+            topLeft = !docLTR ? leftSide : wrapX(from, dir, "before");
+            topRight = !docLTR && openStart && first ? rightSide : fromPos.right;
+            botLeft = !docLTR && openEnd && last ? leftSide : toPos.left;
+            botRight = !docLTR ? rightSide : wrapX(to, dir, "after");
+          }
+          add(topLeft, fromPos.top, topRight - topLeft, fromPos.bottom);
+          if (fromPos.bottom < toPos.top) { add(leftSide, fromPos.bottom, null, toPos.top); }
+          add(botLeft, toPos.top, botRight - botLeft, toPos.bottom);
+        }
+
+        if (!start || cmpCoords(fromPos, start) < 0) { start = fromPos; }
+        if (cmpCoords(toPos, start) < 0) { start = toPos; }
+        if (!end || cmpCoords(fromPos, end) < 0) { end = fromPos; }
+        if (cmpCoords(toPos, end) < 0) { end = toPos; }
+      });
+      return {start: start, end: end}
+    }
+
+    var sFrom = range.from(), sTo = range.to();
+    if (sFrom.line == sTo.line) {
+      drawForLine(sFrom.line, sFrom.ch, sTo.ch);
+    } else {
+      var fromLine = getLine(doc, sFrom.line), toLine = getLine(doc, sTo.line);
+      var singleVLine = visualLine(fromLine) == visualLine(toLine);
+      var leftEnd = drawForLine(sFrom.line, sFrom.ch, singleVLine ? fromLine.text.length + 1 : null).end;
+      var rightStart = drawForLine(sTo.line, singleVLine ? 0 : null, sTo.ch).start;
+      if (singleVLine) {
+        if (leftEnd.top < rightStart.top - 2) {
+          add(leftEnd.right, leftEnd.top, null, leftEnd.bottom);
+          add(leftSide, rightStart.top, rightStart.left, rightStart.bottom);
+        } else {
+          add(leftEnd.right, leftEnd.top, rightStart.left - leftEnd.right, leftEnd.bottom);
+        }
+      }
+      if (leftEnd.bottom < rightStart.top)
+        { add(leftSide, leftEnd.bottom, null, rightStart.top); }
+    }
+
+    output.appendChild(fragment);
+  }
+
+  // Cursor-blinking
+  function restartBlink(cm) {
+    if (!cm.state.focused) { return }
+    var display = cm.display;
+    clearInterval(display.blinker);
+    var on = true;
+    display.cursorDiv.style.visibility = "";
+    if (cm.options.cursorBlinkRate > 0)
+      { display.blinker = setInterval(function () {
+        if (!cm.hasFocus()) { onBlur(cm); }
+        display.cursorDiv.style.visibility = (on = !on) ? "" : "hidden";
+      }, cm.options.cursorBlinkRate); }
+    else if (cm.options.cursorBlinkRate < 0)
+      { display.cursorDiv.style.visibility = "hidden"; }
+  }
+
+  function ensureFocus(cm) {
+    if (!cm.hasFocus()) {
+      cm.display.input.focus();
+      if (!cm.state.focused) { onFocus(cm); }
+    }
+  }
+
+  function delayBlurEvent(cm) {
+    cm.state.delayingBlurEvent = true;
+    setTimeout(function () { if (cm.state.delayingBlurEvent) {
+      cm.state.delayingBlurEvent = false;
+      if (cm.state.focused) { onBlur(cm); }
+    } }, 100);
+  }
+
+  function onFocus(cm, e) {
+    if (cm.state.delayingBlurEvent && !cm.state.draggingText) { cm.state.delayingBlurEvent = false; }
+
+    if (cm.options.readOnly == "nocursor") { return }
+    if (!cm.state.focused) {
+      signal(cm, "focus", cm, e);
+      cm.state.focused = true;
+      addClass(cm.display.wrapper, "CodeMirror-focused");
+      // This test prevents this from firing when a context
+      // menu is closed (since the input reset would kill the
+      // select-all detection hack)
+      if (!cm.curOp && cm.display.selForContextMenu != cm.doc.sel) {
+        cm.display.input.reset();
+        if (webkit) { setTimeout(function () { return cm.display.input.reset(true); }, 20); } // Issue #1730
+      }
+      cm.display.input.receivedFocus();
+    }
+    restartBlink(cm);
+  }
+  function onBlur(cm, e) {
+    if (cm.state.delayingBlurEvent) { return }
+
+    if (cm.state.focused) {
+      signal(cm, "blur", cm, e);
+      cm.state.focused = false;
+      rmClass(cm.display.wrapper, "CodeMirror-focused");
+    }
+    clearInterval(cm.display.blinker);
+    setTimeout(function () { if (!cm.state.focused) { cm.display.shift = false; } }, 150);
+  }
+
+  // Read the actual heights of the rendered lines, and update their
+  // stored heights to match.
+  function updateHeightsInViewport(cm) {
+    var display = cm.display;
+    var prevBottom = display.lineDiv.offsetTop;
+    for (var i = 0; i < display.view.length; i++) {
+      var cur = display.view[i], wrapping = cm.options.lineWrapping;
+      var height = (void 0), width = 0;
+      if (cur.hidden) { continue }
+      if (ie && ie_version < 8) {
+        var bot = cur.node.offsetTop + cur.node.offsetHeight;
+        height = bot - prevBottom;
+        prevBottom = bot;
+      } else {
+        var box = cur.node.getBoundingClientRect();
+        height = box.bottom - box.top;
+        // Check that lines don't extend past the right of the current
+        // editor width
+        if (!wrapping && cur.text.firstChild)
+          { width = cur.text.firstChild.getBoundingClientRect().right - box.left - 1; }
+      }
+      var diff = cur.line.height - height;
+      if (diff > .005 || diff < -.005) {
+        updateLineHeight(cur.line, height);
+        updateWidgetHeight(cur.line);
+        if (cur.rest) { for (var j = 0; j < cur.rest.length; j++)
+          { updateWidgetHeight(cur.rest[j]); } }
+      }
+      if (width > cm.display.sizerWidth) {
+        var chWidth = Math.ceil(width / charWidth(cm.display));
+        if (chWidth > cm.display.maxLineLength) {
+          cm.display.maxLineLength = chWidth;
+          cm.display.maxLine = cur.line;
+          cm.display.maxLineChanged = true;
+        }
+      }
+    }
+  }
+
+  // Read and store the height of line widgets associated with the
+  // given line.
+  function updateWidgetHeight(line) {
+    if (line.widgets) { for (var i = 0; i < line.widgets.length; ++i) {
+      var w = line.widgets[i], parent = w.node.parentNode;
+      if (parent) { w.height = parent.offsetHeight; }
+    } }
+  }
+
+  // Compute the lines that are visible in a given viewport (defaults
+  // the the current scroll position). viewport may contain top,
+  // height, and ensure (see op.scrollToPos) properties.
+  function visibleLines(display, doc, viewport) {
+    var top = viewport && viewport.top != null ? Math.max(0, viewport.top) : display.scroller.scrollTop;
+    top = Math.floor(top - paddingTop(display));
+    var bottom = viewport && viewport.bottom != null ? viewport.bottom : top + display.wrapper.clientHeight;
+
+    var from = lineAtHeight(doc, top), to = lineAtHeight(doc, bottom);
+    // Ensure is a {from: {line, ch}, to: {line, ch}} object, and
+    // forces those lines into the viewport (if possible).
+    if (viewport && viewport.ensure) {
+      var ensureFrom = viewport.ensure.from.line, ensureTo = viewport.ensure.to.line;
+      if (ensureFrom < from) {
+        from = ensureFrom;
+        to = lineAtHeight(doc, heightAtLine(getLine(doc, ensureFrom)) + display.wrapper.clientHeight);
+      } else if (Math.min(ensureTo, doc.lastLine()) >= to) {
+        from = lineAtHeight(doc, heightAtLine(getLine(doc, ensureTo)) - display.wrapper.clientHeight);
+        to = ensureTo;
+      }
+    }
+    return {from: from, to: Math.max(to, from + 1)}
+  }
+
+  // SCROLLING THINGS INTO VIEW
+
+  // If an editor sits on the top or bottom of the window, partially
+  // scrolled out of view, this ensures that the cursor is visible.
+  function maybeScrollWindow(cm, rect) {
+    if (signalDOMEvent(cm, "scrollCursorIntoView")) { return }
+
+    var display = cm.display, box = display.sizer.getBoundingClientRect(), doScroll = null;
+    if (rect.top + box.top < 0) { doScroll = true; }
+    else if (rect.bottom + box.top > (window.innerHeight || document.documentElement.clientHeight)) { doScroll = false; }
+    if (doScroll != null && !phantom) {
+      var scrollNode = elt("div", "\u200b", null, ("position: absolute;\n                         top: " + (rect.top - display.viewOffset - paddingTop(cm.display)) + "px;\n                         height: " + (rect.bottom - rect.top + scrollGap(cm) + display.barHeight) + "px;\n                         left: " + (rect.left) + "px; width: " + (Math.max(2, rect.right - rect.left)) + "px;"));
+      cm.display.lineSpace.appendChild(scrollNode);
+      scrollNode.scrollIntoView(doScroll);
+      cm.display.lineSpace.removeChild(scrollNode);
+    }
+  }
+
+  // Scroll a given position into view (immediately), verifying that
+  // it actually became visible (as line heights are accurately
+  // measured, the position of something may 'drift' during drawing).
+  function scrollPosIntoView(cm, pos, end, margin) {
+    if (margin == null) { margin = 0; }
+    var rect;
+    if (!cm.options.lineWrapping && pos == end) {
+      // Set pos and end to the cursor positions around the character pos sticks to
+      // If pos.sticky == "before", that is around pos.ch - 1, otherwise around pos.ch
+      // If pos == Pos(_, 0, "before"), pos and end are unchanged
+      pos = pos.ch ? Pos(pos.line, pos.sticky == "before" ? pos.ch - 1 : pos.ch, "after") : pos;
+      end = pos.sticky == "before" ? Pos(pos.line, pos.ch + 1, "before") : pos;
+    }
+    for (var limit = 0; limit < 5; limit++) {
+      var changed = false;
+      var coords = cursorCoords(cm, pos);
+      var endCoords = !end || end == pos ? coords : cursorCoords(cm, end);
+      rect = {left: Math.min(coords.left, endCoords.left),
+              top: Math.min(coords.top, endCoords.top) - margin,
+              right: Math.max(coords.left, endCoords.left),
+              bottom: Math.max(coords.bottom, endCoords.bottom) + margin};
+      var scrollPos = calculateScrollPos(cm, rect);
+      var startTop = cm.doc.scrollTop, startLeft = cm.doc.scrollLeft;
+      if (scrollPos.scrollTop != null) {
+        updateScrollTop(cm, scrollPos.scrollTop);
+        if (Math.abs(cm.doc.scrollTop - startTop) > 1) { changed = true; }
+      }
+      if (scrollPos.scrollLeft != null) {
+        setScrollLeft(cm, scrollPos.scrollLeft);
+        if (Math.abs(cm.doc.scrollLeft - startLeft) > 1) { changed = true; }
+      }
+      if (!changed) { break }
+    }
+    return rect
+  }
+
+  // Scroll a given set of coordinates into view (immediately).
+  function scrollIntoView(cm, rect) {
+    var scrollPos = calculateScrollPos(cm, rect);
+    if (scrollPos.scrollTop != null) { updateScrollTop(cm, scrollPos.scrollTop); }
+    if (scrollPos.scrollLeft != null) { setScrollLeft(cm, scrollPos.scrollLeft); }
+  }
+
+  // Calculate a new scroll position needed to scroll the given
+  // rectangle into view. Returns an object with scrollTop and
+  // scrollLeft properties. When these are undefined, the
+  // vertical/horizontal position does not need to be adjusted.
+  function calculateScrollPos(cm, rect) {
+    var display = cm.display, snapMargin = textHeight(cm.display);
+    if (rect.top < 0) { rect.top = 0; }
+    var screentop = cm.curOp && cm.curOp.scrollTop != null ? cm.curOp.scrollTop : display.scroller.scrollTop;
+    var screen = displayHeight(cm), result = {};
+    if (rect.bottom - rect.top > screen) { rect.bottom = rect.top + screen; }
+    var docBottom = cm.doc.height + paddingVert(display);
+    var atTop = rect.top < snapMargin, atBottom = rect.bottom > docBottom - snapMargin;
+    if (rect.top < screentop) {
+      result.scrollTop = atTop ? 0 : rect.top;
+    } else if (rect.bottom > screentop + screen) {
+      var newTop = Math.min(rect.top, (atBottom ? docBottom : rect.bottom) - screen);
+      if (newTop != screentop) { result.scrollTop = newTop; }
+    }
+
+    var gutterSpace = cm.options.fixedGutter ? 0 : display.gutters.offsetWidth;
+    var screenleft = cm.curOp && cm.curOp.scrollLeft != null ? cm.curOp.scrollLeft : display.scroller.scrollLeft - gutterSpace;
+    var screenw = displayWidth(cm) - display.gutters.offsetWidth;
+    var tooWide = rect.right - rect.left > screenw;
+    if (tooWide) { rect.right = rect.left + screenw; }
+    if (rect.left < 10)
+      { result.scrollLeft = 0; }
+    else if (rect.left < screenleft)
+      { result.scrollLeft = Math.max(0, rect.left + gutterSpace - (tooWide ? 0 : 10)); }
+    else if (rect.right > screenw + screenleft - 3)
+      { result.scrollLeft = rect.right + (tooWide ? 0 : 10) - screenw; }
+    return result
+  }
+
+  // Store a relative adjustment to the scroll position in the current
+  // operation (to be applied when the operation finishes).
+  function addToScrollTop(cm, top) {
+    if (top == null) { return }
+    resolveScrollToPos(cm);
+    cm.curOp.scrollTop = (cm.curOp.scrollTop == null ? cm.doc.scrollTop : cm.curOp.scrollTop) + top;
+  }
+
+  // Make sure that at the end of the operation the current cursor is
+  // shown.
+  function ensureCursorVisible(cm) {
+    resolveScrollToPos(cm);
+    var cur = cm.getCursor();
+    cm.curOp.scrollToPos = {from: cur, to: cur, margin: cm.options.cursorScrollMargin};
+  }
+
+  function scrollToCoords(cm, x, y) {
+    if (x != null || y != null) { resolveScrollToPos(cm); }
+    if (x != null) { cm.curOp.scrollLeft = x; }
+    if (y != null) { cm.curOp.scrollTop = y; }
+  }
+
+  function scrollToRange(cm, range) {
+    resolveScrollToPos(cm);
+    cm.curOp.scrollToPos = range;
+  }
+
+  // When an operation has its scrollToPos property set, and another
+  // scroll action is applied before the end of the operation, this
+  // 'simulates' scrolling that position into view in a cheap way, so
+  // that the effect of intermediate scroll commands is not ignored.
+  function resolveScrollToPos(cm) {
+    var range = cm.curOp.scrollToPos;
+    if (range) {
+      cm.curOp.scrollToPos = null;
+      var from = estimateCoords(cm, range.from), to = estimateCoords(cm, range.to);
+      scrollToCoordsRange(cm, from, to, range.margin);
+    }
+  }
+
+  function scrollToCoordsRange(cm, from, to, margin) {
+    var sPos = calculateScrollPos(cm, {
+      left: Math.min(from.left, to.left),
+      top: Math.min(from.top, to.top) - margin,
+      right: Math.max(from.right, to.right),
+      bottom: Math.max(from.bottom, to.bottom) + margin
+    });
+    scrollToCoords(cm, sPos.scrollLeft, sPos.scrollTop);
+  }
+
+  // Sync the scrollable area and scrollbars, ensure the viewport
+  // covers the visible area.
+  function updateScrollTop(cm, val) {
+    if (Math.abs(cm.doc.scrollTop - val) < 2) { return }
+    if (!gecko) { updateDisplaySimple(cm, {top: val}); }
+    setScrollTop(cm, val, true);
+    if (gecko) { updateDisplaySimple(cm); }
+    startWorker(cm, 100);
+  }
+
+  function setScrollTop(cm, val, forceScroll) {
+    val = Math.max(0, Math.min(cm.display.scroller.scrollHeight - cm.display.scroller.clientHeight, val));
+    if (cm.display.scroller.scrollTop == val && !forceScroll) { return }
+    cm.doc.scrollTop = val;
+    cm.display.scrollbars.setScrollTop(val);
+    if (cm.display.scroller.scrollTop != val) { cm.display.scroller.scrollTop = val; }
+  }
+
+  // Sync scroller and scrollbar, ensure the gutter elements are
+  // aligned.
+  function setScrollLeft(cm, val, isScroller, forceScroll) {
+    val = Math.max(0, Math.min(val, cm.display.scroller.scrollWidth - cm.display.scroller.clientWidth));
+    if ((isScroller ? val == cm.doc.scrollLeft : Math.abs(cm.doc.scrollLeft - val) < 2) && !forceScroll) { return }
+    cm.doc.scrollLeft = val;
+    alignHorizontally(cm);
+    if (cm.display.scroller.scrollLeft != val) { cm.display.scroller.scrollLeft = val; }
+    cm.display.scrollbars.setScrollLeft(val);
+  }
+
+  // SCROLLBARS
+
+  // Prepare DOM reads needed to update the scrollbars. Done in one
+  // shot to minimize update/measure roundtrips.
+  function measureForScrollbars(cm) {
+    var d = cm.display, gutterW = d.gutters.offsetWidth;
+    var docH = Math.round(cm.doc.height + paddingVert(cm.display));
+    return {
+      clientHeight: d.scroller.clientHeight,
+      viewHeight: d.wrapper.clientHeight,
+      scrollWidth: d.scroller.scrollWidth, clientWidth: d.scroller.clientWidth,
+      viewWidth: d.wrapper.clientWidth,
+      barLeft: cm.options.fixedGutter ? gutterW : 0,
+      docHeight: docH,
+      scrollHeight: docH + scrollGap(cm) + d.barHeight,
+      nativeBarWidth: d.nativeBarWidth,
+      gutterWidth: gutterW
+    }
+  }
+
+  var NativeScrollbars = function(place, scroll, cm) {
+    this.cm = cm;
+    var vert = this.vert = elt("div", [elt("div", null, null, "min-width: 1px")], "CodeMirror-vscrollbar");
+    var horiz = this.horiz = elt("div", [elt("div", null, null, "height: 100%; min-height: 1px")], "CodeMirror-hscrollbar");
+    vert.tabIndex = horiz.tabIndex = -1;
+    place(vert); place(horiz);
+
+    on(vert, "scroll", function () {
+      if (vert.clientHeight) { scroll(vert.scrollTop, "vertical"); }
+    });
+    on(horiz, "scroll", function () {
+      if (horiz.clientWidth) { scroll(horiz.scrollLeft, "horizontal"); }
+    });
+
+    this.checkedZeroWidth = false;
+    // Need to set a minimum width to see the scrollbar on IE7 (but must not set it on IE8).
+    if (ie && ie_version < 8) { this.horiz.style.minHeight = this.vert.style.minWidth = "18px"; }
+  };
+
+  NativeScrollbars.prototype.update = function (measure) {
+    var needsH = measure.scrollWidth > measure.clientWidth + 1;
+    var needsV = measure.scrollHeight > measure.clientHeight + 1;
+    var sWidth = measure.nativeBarWidth;
+
+    if (needsV) {
+      this.vert.style.display = "block";
+      this.vert.style.bottom = needsH ? sWidth + "px" : "0";
+      var totalHeight = measure.viewHeight - (needsH ? sWidth : 0);
+      // A bug in IE8 can cause this value to be negative, so guard it.
+      this.vert.firstChild.style.height =
+        Math.max(0, measure.scrollHeight - measure.clientHeight + totalHeight) + "px";
+    } else {
+      this.vert.style.display = "";
+      this.vert.firstChild.style.height = "0";
+    }
+
+    if (needsH) {
+      this.horiz.style.display = "block";
+      this.horiz.style.right = needsV ? sWidth + "px" : "0";
+      this.horiz.style.left = measure.barLeft + "px";
+      var totalWidth = measure.viewWidth - measure.barLeft - (needsV ? sWidth : 0);
+      this.horiz.firstChild.style.width =
+        Math.max(0, measure.scrollWidth - measure.clientWidth + totalWidth) + "px";
+    } else {
+      this.horiz.style.display = "";
+      this.horiz.firstChild.style.width = "0";
+    }
+
+    if (!this.checkedZeroWidth && measure.clientHeight > 0) {
+      if (sWidth == 0) { this.zeroWidthHack(); }
+      this.checkedZeroWidth = true;
+    }
+
+    return {right: needsV ? sWidth : 0, bottom: needsH ? sWidth : 0}
+  };
+
+  NativeScrollbars.prototype.setScrollLeft = function (pos) {
+    if (this.horiz.scrollLeft != pos) { this.horiz.scrollLeft = pos; }
+    if (this.disableHoriz) { this.enableZeroWidthBar(this.horiz, this.disableHoriz, "horiz"); }
+  };
+
+  NativeScrollbars.prototype.setScrollTop = function (pos) {
+    if (this.vert.scrollTop != pos) { this.vert.scrollTop = pos; }
+    if (this.disableVert) { this.enableZeroWidthBar(this.vert, this.disableVert, "vert"); }
+  };
+
+  NativeScrollbars.prototype.zeroWidthHack = function () {
+    var w = mac && !mac_geMountainLion ? "12px" : "18px";
+    this.horiz.style.height = this.vert.style.width = w;
+    this.horiz.style.pointerEvents = this.vert.style.pointerEvents = "none";
+    this.disableHoriz = new Delayed;
+    this.disableVert = new Delayed;
+  };
+
+  NativeScrollbars.prototype.enableZeroWidthBar = function (bar, delay, type) {
+    bar.style.pointerEvents = "auto";
+    function maybeDisable() {
+      // To find out whether the scrollbar is still visible, we
+      // check whether the element under the pixel in the bottom
+      // right corner of the scrollbar box is the scrollbar box
+      // itself (when the bar is still visible) or its filler child
+      // (when the bar is hidden). If it is still visible, we keep
+      // it enabled, if it's hidden, we disable pointer events.
+      var box = bar.getBoundingClientRect();
+      var elt = type == "vert" ? document.elementFromPoint(box.right - 1, (box.top + box.bottom) / 2)
+          : document.elementFromPoint((box.right + box.left) / 2, box.bottom - 1);
+      if (elt != bar) { bar.style.pointerEvents = "none"; }
+      else { delay.set(1000, maybeDisable); }
+    }
+    delay.set(1000, maybeDisable);
+  };
+
+  NativeScrollbars.prototype.clear = function () {
+    var parent = this.horiz.parentNode;
+    parent.removeChild(this.horiz);
+    parent.removeChild(this.vert);
+  };
+
+  var NullScrollbars = function () {};
+
+  NullScrollbars.prototype.update = function () { return {bottom: 0, right: 0} };
+  NullScrollbars.prototype.setScrollLeft = function () {};
+  NullScrollbars.prototype.setScrollTop = function () {};
+  NullScrollbars.prototype.clear = function () {};
+
+  function updateScrollbars(cm, measure) {
+    if (!measure) { measure = measureForScrollbars(cm); }
+    var startWidth = cm.display.barWidth, startHeight = cm.display.barHeight;
+    updateScrollbarsInner(cm, measure);
+    for (var i = 0; i < 4 && startWidth != cm.display.barWidth || startHeight != cm.display.barHeight; i++) {
+      if (startWidth != cm.display.barWidth && cm.options.lineWrapping)
+        { updateHeightsInViewport(cm); }
+      updateScrollbarsInner(cm, measureForScrollbars(cm));
+      startWidth = cm.display.barWidth; startHeight = cm.display.barHeight;
+    }
+  }
+
+  // Re-synchronize the fake scrollbars with the actual size of the
+  // content.
+  function updateScrollbarsInner(cm, measure) {
+    var d = cm.display;
+    var sizes = d.scrollbars.update(measure);
+
+    d.sizer.style.paddingRight = (d.barWidth = sizes.right) + "px";
+    d.sizer.style.paddingBottom = (d.barHeight = sizes.bottom) + "px";
+    d.heightForcer.style.borderBottom = sizes.bottom + "px solid transparent";
+
+    if (sizes.right && sizes.bottom) {
+      d.scrollbarFiller.style.display = "block";
+      d.scrollbarFiller.style.height = sizes.bottom + "px";
+      d.scrollbarFiller.style.width = sizes.right + "px";
+    } else { d.scrollbarFiller.style.display = ""; }
+    if (sizes.bottom && cm.options.coverGutterNextToScrollbar && cm.options.fixedGutter) {
+      d.gutterFiller.style.display = "block";
+      d.gutterFiller.style.height = sizes.bottom + "px";
+      d.gutterFiller.style.width = measure.gutterWidth + "px";
+    } else { d.gutterFiller.style.display = ""; }
+  }
+
+  var scrollbarModel = {"native": NativeScrollbars, "null": NullScrollbars};
+
+  function initScrollbars(cm) {
+    if (cm.display.scrollbars) {
+      cm.display.scrollbars.clear();
+      if (cm.display.scrollbars.addClass)
+        { rmClass(cm.display.wrapper, cm.display.scrollbars.addClass); }
+    }
+
+    cm.display.scrollbars = new scrollbarModel[cm.options.scrollbarStyle](function (node) {
+      cm.display.wrapper.insertBefore(node, cm.display.scrollbarFiller);
+      // Prevent clicks in the scrollbars from killing focus
+      on(node, "mousedown", function () {
+        if (cm.state.focused) { setTimeout(function () { return cm.display.input.focus(); }, 0); }
+      });
+      node.setAttribute("cm-not-content", "true");
+    }, function (pos, axis) {
+      if (axis == "horizontal") { setScrollLeft(cm, pos); }
+      else { updateScrollTop(cm, pos); }
+    }, cm);
+    if (cm.display.scrollbars.addClass)
+      { addClass(cm.display.wrapper, cm.display.scrollbars.addClass); }
+  }
+
+  // Operations are used to wrap a series of changes to the editor
+  // state in such a way that each change won't have to update the
+  // cursor and display (which would be awkward, slow, and
+  // error-prone). Instead, display updates are batched and then all
+  // combined and executed at once.
+
+  var nextOpId = 0;
+  // Start a new operation.
+  function startOperation(cm) {
+    cm.curOp = {
+      cm: cm,
+      viewChanged: false,      // Flag that indicates that lines might need to be redrawn
+      startHeight: cm.doc.height, // Used to detect need to update scrollbar
+      forceUpdate: false,      // Used to force a redraw
+      updateInput: 0,       // Whether to reset the input textarea
+      typing: false,           // Whether this reset should be careful to leave existing text (for compositing)
+      changeObjs: null,        // Accumulated changes, for firing change events
+      cursorActivityHandlers: null, // Set of handlers to fire cursorActivity on
+      cursorActivityCalled: 0, // Tracks which cursorActivity handlers have been called already
+      selectionChanged: false, // Whether the selection needs to be redrawn
+      updateMaxLine: false,    // Set when the widest line needs to be determined anew
+      scrollLeft: null, scrollTop: null, // Intermediate scroll position, not pushed to DOM yet
+      scrollToPos: null,       // Used to scroll to a specific position
+      focus: false,
+      id: ++nextOpId           // Unique ID
+    };
+    pushOperation(cm.curOp);
+  }
+
+  // Finish an operation, updating the display and signalling delayed events
+  function endOperation(cm) {
+    var op = cm.curOp;
+    if (op) { finishOperation(op, function (group) {
+      for (var i = 0; i < group.ops.length; i++)
+        { group.ops[i].cm.curOp = null; }
+      endOperations(group);
+    }); }
+  }
+
+  // The DOM updates done when an operation finishes are batched so
+  // that the minimum number of relayouts are required.
+  function endOperations(group) {
+    var ops = group.ops;
+    for (var i = 0; i < ops.length; i++) // Read DOM
+      { endOperation_R1(ops[i]); }
+    for (var i$1 = 0; i$1 < ops.length; i$1++) // Write DOM (maybe)
+      { endOperation_W1(ops[i$1]); }
+    for (var i$2 = 0; i$2 < ops.length; i$2++) // Read DOM
+      { endOperation_R2(ops[i$2]); }
+    for (var i$3 = 0; i$3 < ops.length; i$3++) // Write DOM (maybe)
+      { endOperation_W2(ops[i$3]); }
+    for (var i$4 = 0; i$4 < ops.length; i$4++) // Read DOM
+      { endOperation_finish(ops[i$4]); }
+  }
+
+  function endOperation_R1(op) {
+    var cm = op.cm, display = cm.display;
+    maybeClipScrollbars(cm);
+    if (op.updateMaxLine) { findMaxLine(cm); }
+
+    op.mustUpdate = op.viewChanged || op.forceUpdate || op.scrollTop != null ||
+      op.scrollToPos && (op.scrollToPos.from.line < display.viewFrom ||
+                         op.scrollToPos.to.line >= display.viewTo) ||
+      display.maxLineChanged && cm.options.lineWrapping;
+    op.update = op.mustUpdate &&
+      new DisplayUpdate(cm, op.mustUpdate && {top: op.scrollTop, ensure: op.scrollToPos}, op.forceUpdate);
+  }
+
+  function endOperation_W1(op) {
+    op.updatedDisplay = op.mustUpdate && updateDisplayIfNeeded(op.cm, op.update);
+  }
+
+  function endOperation_R2(op) {
+    var cm = op.cm, display = cm.display;
+    if (op.updatedDisplay) { updateHeightsInViewport(cm); }
+
+    op.barMeasure = measureForScrollbars(cm);
+
+    // If the max line changed since it was last measured, measure it,
+    // and ensure the document's width matches it.
+    // updateDisplay_W2 will use these properties to do the actual resizing
+    if (display.maxLineChanged && !cm.options.lineWrapping) {
+      op.adjustWidthTo = measureChar(cm, display.maxLine, display.maxLine.text.length).left + 3;
+      cm.display.sizerWidth = op.adjustWidthTo;
+      op.barMeasure.scrollWidth =
+        Math.max(display.scroller.clientWidth, display.sizer.offsetLeft + op.adjustWidthTo + scrollGap(cm) + cm.display.barWidth);
+      op.maxScrollLeft = Math.max(0, display.sizer.offsetLeft + op.adjustWidthTo - displayWidth(cm));
+    }
+
+    if (op.updatedDisplay || op.selectionChanged)
+      { op.preparedSelection = display.input.prepareSelection(); }
+  }
+
+  function endOperation_W2(op) {
+    var cm = op.cm;
+
+    if (op.adjustWidthTo != null) {
+      cm.display.sizer.style.minWidth = op.adjustWidthTo + "px";
+      if (op.maxScrollLeft < cm.doc.scrollLeft)
+        { setScrollLeft(cm, Math.min(cm.display.scroller.scrollLeft, op.maxScrollLeft), true); }
+      cm.display.maxLineChanged = false;
+    }
+
+    var takeFocus = op.focus && op.focus == activeElt();
+    if (op.preparedSelection)
+      { cm.display.input.showSelection(op.preparedSelection, takeFocus); }
+    if (op.updatedDisplay || op.startHeight != cm.doc.height)
+      { updateScrollbars(cm, op.barMeasure); }
+    if (op.updatedDisplay)
+      { setDocumentHeight(cm, op.barMeasure); }
+
+    if (op.selectionChanged) { restartBlink(cm); }
+
+    if (cm.state.focused && op.updateInput)
+      { cm.display.input.reset(op.typing); }
+    if (takeFocus) { ensureFocus(op.cm); }
+  }
+
+  function endOperation_finish(op) {
+    var cm = op.cm, display = cm.display, doc = cm.doc;
+
+    if (op.updatedDisplay) { postUpdateDisplay(cm, op.update); }
+
+    // Abort mouse wheel delta measurement, when scrolling explicitly
+    if (display.wheelStartX != null && (op.scrollTop != null || op.scrollLeft != null || op.scrollToPos))
+      { display.wheelStartX = display.wheelStartY = null; }
+
+    // Propagate the scroll position to the actual DOM scroller
+    if (op.scrollTop != null) { setScrollTop(cm, op.scrollTop, op.forceScroll); }
+
+    if (op.scrollLeft != null) { setScrollLeft(cm, op.scrollLeft, true, true); }
+    // If we need to scroll a specific position into view, do so.
+    if (op.scrollToPos) {
+      var rect = scrollPosIntoView(cm, clipPos(doc, op.scrollToPos.from),
+                                   clipPos(doc, op.scrollToPos.to), op.scrollToPos.margin);
+      maybeScrollWindow(cm, rect);
+    }
+
+    // Fire events for markers that are hidden/unidden by editing or
+    // undoing
+    var hidden = op.maybeHiddenMarkers, unhidden = op.maybeUnhiddenMarkers;
+    if (hidden) { for (var i = 0; i < hidden.length; ++i)
+      { if (!hidden[i].lines.length) { signal(hidden[i], "hide"); } } }
+    if (unhidden) { for (var i$1 = 0; i$1 < unhidden.length; ++i$1)
+      { if (unhidden[i$1].lines.length) { signal(unhidden[i$1], "unhide"); } } }
+
+    if (display.wrapper.offsetHeight)
+      { doc.scrollTop = cm.display.scroller.scrollTop; }
+
+    // Fire change events, and delayed event handlers
+    if (op.changeObjs)
+      { signal(cm, "changes", cm, op.changeObjs); }
+    if (op.update)
+      { op.update.finish(); }
+  }
+
+  // Run the given function in an operation
+  function runInOp(cm, f) {
+    if (cm.curOp) { return f() }
+    startOperation(cm);
+    try { return f() }
+    finally { endOperation(cm); }
+  }
+  // Wraps a function in an operation. Returns the wrapped function.
+  function operation(cm, f) {
+    return function() {
+      if (cm.curOp) { return f.apply(cm, arguments) }
+      startOperation(cm);
+      try { return f.apply(cm, arguments) }
+      finally { endOperation(cm); }
+    }
+  }
+  // Used to add methods to editor and doc instances, wrapping them in
+  // operations.
+  function methodOp(f) {
+    return function() {
+      if (this.curOp) { return f.apply(this, arguments) }
+      startOperation(this);
+      try { return f.apply(this, arguments) }
+      finally { endOperation(this); }
+    }
+  }
+  function docMethodOp(f) {
+    return function() {
+      var cm = this.cm;
+      if (!cm || cm.curOp) { return f.apply(this, arguments) }
+      startOperation(cm);
+      try { return f.apply(this, arguments) }
+      finally { endOperation(cm); }
+    }
+  }
+
+  // HIGHLIGHT WORKER
+
+  function startWorker(cm, time) {
+    if (cm.doc.highlightFrontier < cm.display.viewTo)
+      { cm.state.highlight.set(time, bind(highlightWorker, cm)); }
+  }
+
+  function highlightWorker(cm) {
+    var doc = cm.doc;
+    if (doc.highlightFrontier >= cm.display.viewTo) { return }
+    var end = +new Date + cm.options.workTime;
+    var context = getContextBefore(cm, doc.highlightFrontier);
+    var changedLines = [];
+
+    doc.iter(context.line, Math.min(doc.first + doc.size, cm.display.viewTo + 500), function (line) {
+      if (context.line >= cm.display.viewFrom) { // Visible
+        var oldStyles = line.styles;
+        var resetState = line.text.length > cm.options.maxHighlightLength ? copyState(doc.mode, context.state) : null;
+        var highlighted = highlightLine(cm, line, context, true);
+        if (resetState) { context.state = resetState; }
+        line.styles = highlighted.styles;
+        var oldCls = line.styleClasses, newCls = highlighted.classes;
+        if (newCls) { line.styleClasses = newCls; }
+        else if (oldCls) { line.styleClasses = null; }
+        var ischange = !oldStyles || oldStyles.length != line.styles.length ||
+          oldCls != newCls && (!oldCls || !newCls || oldCls.bgClass != newCls.bgClass || oldCls.textClass != newCls.textClass);
+        for (var i = 0; !ischange && i < oldStyles.length; ++i) { ischange = oldStyles[i] != line.styles[i]; }
+        if (ischange) { changedLines.push(context.line); }
+        line.stateAfter = context.save();
+        context.nextLine();
+      } else {
+        if (line.text.length <= cm.options.maxHighlightLength)
+          { processLine(cm, line.text, context); }
+        line.stateAfter = context.line % 5 == 0 ? context.save() : null;
+        context.nextLine();
+      }
+      if (+new Date > end) {
+        startWorker(cm, cm.options.workDelay);
+        return true
+      }
+    });
+    doc.highlightFrontier = context.line;
+    doc.modeFrontier = Math.max(doc.modeFrontier, context.line);
+    if (changedLines.length) { runInOp(cm, function () {
+      for (var i = 0; i < changedLines.length; i++)
+        { regLineChange(cm, changedLines[i], "text"); }
+    }); }
+  }
+
+  // DISPLAY DRAWING
+
+  var DisplayUpdate = function(cm, viewport, force) {
+    var display = cm.display;
+
+    this.viewport = viewport;
+    // Store some values that we'll need later (but don't want to force a relayout for)
+    this.visible = visibleLines(display, cm.doc, viewport);
+    this.editorIsHidden = !display.wrapper.offsetWidth;
+    this.wrapperHeight = display.wrapper.clientHeight;
+    this.wrapperWidth = display.wrapper.clientWidth;
+    this.oldDisplayWidth = displayWidth(cm);
+    this.force = force;
+    this.dims = getDimensions(cm);
+    this.events = [];
+  };
+
+  DisplayUpdate.prototype.signal = function (emitter, type) {
+    if (hasHandler(emitter, type))
+      { this.events.push(arguments); }
+  };
+  DisplayUpdate.prototype.finish = function () {
+    for (var i = 0; i < this.events.length; i++)
+      { signal.apply(null, this.events[i]); }
+  };
+
+  function maybeClipScrollbars(cm) {
+    var display = cm.display;
+    if (!display.scrollbarsClipped && display.scroller.offsetWidth) {
+      display.nativeBarWidth = display.scroller.offsetWidth - display.scroller.clientWidth;
+      display.heightForcer.style.height = scrollGap(cm) + "px";
+      display.sizer.style.marginBottom = -display.nativeBarWidth + "px";
+      display.sizer.style.borderRightWidth = scrollGap(cm) + "px";
+      display.scrollbarsClipped = true;
+    }
+  }
+
+  function selectionSnapshot(cm) {
+    if (cm.hasFocus()) { return null }
+    var active = activeElt();
+    if (!active || !contains(cm.display.lineDiv, active)) { return null }
+    var result = {activeElt: active};
+    if (window.getSelection) {
+      var sel = window.getSelection();
+      if (sel.anchorNode && sel.extend && contains(cm.display.lineDiv, sel.anchorNode)) {
+        result.anchorNode = sel.anchorNode;
+        result.anchorOffset = sel.anchorOffset;
+        result.focusNode = sel.focusNode;
+        result.focusOffset = sel.focusOffset;
+      }
+    }
+    return result
+  }
+
+  function restoreSelection(snapshot) {
+    if (!snapshot || !snapshot.activeElt || snapshot.activeElt == activeElt()) { return }
+    snapshot.activeElt.focus();
+    if (!/^(INPUT|TEXTAREA)$/.test(snapshot.activeElt.nodeName) &&
+        snapshot.anchorNode && contains(document.body, snapshot.anchorNode) && contains(document.body, snapshot.focusNode)) {
+      var sel = window.getSelection(), range = document.createRange();
+      range.setEnd(snapshot.anchorNode, snapshot.anchorOffset);
+      range.collapse(false);
+      sel.removeAllRanges();
+      sel.addRange(range);
+      sel.extend(snapshot.focusNode, snapshot.focusOffset);
+    }
+  }
+
+  // Does the actual updating of the line display. Bails out
+  // (returning false) when there is nothing to be done and forced is
+  // false.
+  function updateDisplayIfNeeded(cm, update) {
+    var display = cm.display, doc = cm.doc;
+
+    if (update.editorIsHidden) {
+      resetView(cm);
+      return false
+    }
+
+    // Bail out if the visible area is already rendered and nothing changed.
+    if (!update.force &&
+        update.visible.from >= display.viewFrom && update.visible.to <= display.viewTo &&
+        (display.updateLineNumbers == null || display.updateLineNumbers >= display.viewTo) &&
+        display.renderedView == display.view && countDirtyView(cm) == 0)
+      { return false }
+
+    if (maybeUpdateLineNumberWidth(cm)) {
+      resetView(cm);
+      update.dims = getDimensions(cm);
+    }
+
+    // Compute a suitable new viewport (from & to)
+    var end = doc.first + doc.size;
+    var from = Math.max(update.visible.from - cm.options.viewportMargin, doc.first);
+    var to = Math.min(end, update.visible.to + cm.options.viewportMargin);
+    if (display.viewFrom < from && from - display.viewFrom < 20) { from = Math.max(doc.first, display.viewFrom); }
+    if (display.viewTo > to && display.viewTo - to < 20) { to = Math.min(end, display.viewTo); }
+    if (sawCollapsedSpans) {
+      from = visualLineNo(cm.doc, from);
+      to = visualLineEndNo(cm.doc, to);
+    }
+
+    var different = from != display.viewFrom || to != display.viewTo ||
+      display.lastWrapHeight != update.wrapperHeight || display.lastWrapWidth != update.wrapperWidth;
+    adjustView(cm, from, to);
+
+    display.viewOffset = heightAtLine(getLine(cm.doc, display.viewFrom));
+    // Position the mover div to align with the current scroll position
+    cm.display.mover.style.top = display.viewOffset + "px";
+
+    var toUpdate = countDirtyView(cm);
+    if (!different && toUpdate == 0 && !update.force && display.renderedView == display.view &&
+        (display.updateLineNumbers == null || display.updateLineNumbers >= display.viewTo))
+      { return false }
+
+    // For big changes, we hide the enclosing element during the
+    // update, since that speeds up the operations on most browsers.
+    var selSnapshot = selectionSnapshot(cm);
+    if (toUpdate > 4) { display.lineDiv.style.display = "none"; }
+    patchDisplay(cm, display.updateLineNumbers, update.dims);
+    if (toUpdate > 4) { display.lineDiv.style.display = ""; }
+    display.renderedView = display.view;
+    // There might have been a widget with a focused element that got
+    // hidden or updated, if so re-focus it.
+    restoreSelection(selSnapshot);
+
+    // Prevent selection and cursors from interfering with the scroll
+    // width and height.
+    removeChildren(display.cursorDiv);
+    removeChildren(display.selectionDiv);
+    display.gutters.style.height = display.sizer.style.minHeight = 0;
+
+    if (different) {
+      display.lastWrapHeight = update.wrapperHeight;
+      display.lastWrapWidth = update.wrapperWidth;
+      startWorker(cm, 400);
+    }
+
+    display.updateLineNumbers = null;
+
+    return true
+  }
+
+  function postUpdateDisplay(cm, update) {
+    var viewport = update.viewport;
+
+    for (var first = true;; first = false) {
+      if (!first || !cm.options.lineWrapping || update.oldDisplayWidth == displayWidth(cm)) {
+        // Clip forced viewport to actual scrollable area.
+        if (viewport && viewport.top != null)
+          { viewport = {top: Math.min(cm.doc.height + paddingVert(cm.display) - displayHeight(cm), viewport.top)}; }
+        // Updated line heights might result in the drawn area not
+        // actually covering the viewport. Keep looping until it does.
+        update.visible = visibleLines(cm.display, cm.doc, viewport);
+        if (update.visible.from >= cm.display.viewFrom && update.visible.to <= cm.display.viewTo)
+          { break }
+      } else if (first) {
+        update.visible = visibleLines(cm.display, cm.doc, viewport);
+      }
+      if (!updateDisplayIfNeeded(cm, update)) { break }
+      updateHeightsInViewport(cm);
+      var barMeasure = measureForScrollbars(cm);
+      updateSelection(cm);
+      updateScrollbars(cm, barMeasure);
+      setDocumentHeight(cm, barMeasure);
+      update.force = false;
+    }
+
+    update.signal(cm, "update", cm);
+    if (cm.display.viewFrom != cm.display.reportedViewFrom || cm.display.viewTo != cm.display.reportedViewTo) {
+      update.signal(cm, "viewportChange", cm, cm.display.viewFrom, cm.display.viewTo);
+      cm.display.reportedViewFrom = cm.display.viewFrom; cm.display.reportedViewTo = cm.display.viewTo;
+    }
+  }
+
+  function updateDisplaySimple(cm, viewport) {
+    var update = new DisplayUpdate(cm, viewport);
+    if (updateDisplayIfNeeded(cm, update)) {
+      updateHeightsInViewport(cm);
+      postUpdateDisplay(cm, update);
+      var barMeasure = measureForScrollbars(cm);
+      updateSelection(cm);
+      updateScrollbars(cm, barMeasure);
+      setDocumentHeight(cm, barMeasure);
+      update.finish();
+    }
+  }
+
+  // Sync the actual display DOM structure with display.view, removing
+  // nodes for lines that are no longer in view, and creating the ones
+  // that are not there yet, and updating the ones that are out of
+  // date.
+  function patchDisplay(cm, updateNumbersFrom, dims) {
+    var display = cm.display, lineNumbers = cm.options.lineNumbers;
+    var container = display.lineDiv, cur = container.firstChild;
+
+    function rm(node) {
+      var next = node.nextSibling;
+      // Works around a throw-scroll bug in OS X Webkit
+      if (webkit && mac && cm.display.currentWheelTarget == node)
+        { node.style.display = "none"; }
+      else
+        { node.parentNode.removeChild(node); }
+      return next
+    }
+
+    var view = display.view, lineN = display.viewFrom;
+    // Loop over the elements in the view, syncing cur (the DOM nodes
+    // in display.lineDiv) with the view as we go.
+    for (var i = 0; i < view.length; i++) {
+      var lineView = view[i];
+      if (lineView.hidden) ; else if (!lineView.node || lineView.node.parentNode != container) { // Not drawn yet
+        var node = buildLineElement(cm, lineView, lineN, dims);
+        container.insertBefore(node, cur);
+      } else { // Already drawn
+        while (cur != lineView.node) { cur = rm(cur); }
+        var updateNumber = lineNumbers && updateNumbersFrom != null &&
+          updateNumbersFrom <= lineN && lineView.lineNumber;
+        if (lineView.changes) {
+          if (indexOf(lineView.changes, "gutter") > -1) { updateNumber = false; }
+          updateLineForChanges(cm, lineView, lineN, dims);
+        }
+        if (updateNumber) {
+          removeChildren(lineView.lineNumber);
+          lineView.lineNumber.appendChild(document.createTextNode(lineNumberFor(cm.options, lineN)));
+        }
+        cur = lineView.node.nextSibling;
+      }
+      lineN += lineView.size;
+    }
+    while (cur) { cur = rm(cur); }
+  }
+
+  function updateGutterSpace(display) {
+    var width = display.gutters.offsetWidth;
+    display.sizer.style.marginLeft = width + "px";
+  }
+
+  function setDocumentHeight(cm, measure) {
+    cm.display.sizer.style.minHeight = measure.docHeight + "px";
+    cm.display.heightForcer.style.top = measure.docHeight + "px";
+    cm.display.gutters.style.height = (measure.docHeight + cm.display.barHeight + scrollGap(cm)) + "px";
+  }
+
+  // Re-align line numbers and gutter marks to compensate for
+  // horizontal scrolling.
+  function alignHorizontally(cm) {
+    var display = cm.display, view = display.view;
+    if (!display.alignWidgets && (!display.gutters.firstChild || !cm.options.fixedGutter)) { return }
+    var comp = compensateForHScroll(display) - display.scroller.scrollLeft + cm.doc.scrollLeft;
+    var gutterW = display.gutters.offsetWidth, left = comp + "px";
+    for (var i = 0; i < view.length; i++) { if (!view[i].hidden) {
+      if (cm.options.fixedGutter) {
+        if (view[i].gutter)
+          { view[i].gutter.style.left = left; }
+        if (view[i].gutterBackground)
+          { view[i].gutterBackground.style.left = left; }
+      }
+      var align = view[i].alignable;
+      if (align) { for (var j = 0; j < align.length; j++)
+        { align[j].style.left = left; } }
+    } }
+    if (cm.options.fixedGutter)
+      { display.gutters.style.left = (comp + gutterW) + "px"; }
+  }
+
+  // Used to ensure that the line number gutter is still the right
+  // size for the current document size. Returns true when an update
+  // is needed.
+  function maybeUpdateLineNumberWidth(cm) {
+    if (!cm.options.lineNumbers) { return false }
+    var doc = cm.doc, last = lineNumberFor(cm.options, doc.first + doc.size - 1), display = cm.display;
+    if (last.length != display.lineNumChars) {
+      var test = display.measure.appendChild(elt("div", [elt("div", last)],
+                                                 "CodeMirror-linenumber CodeMirror-gutter-elt"));
+      var innerW = test.firstChild.offsetWidth, padding = test.offsetWidth - innerW;
+      display.lineGutter.style.width = "";
+      display.lineNumInnerWidth = Math.max(innerW, display.lineGutter.offsetWidth - padding) + 1;
+      display.lineNumWidth = display.lineNumInnerWidth + padding;
+      display.lineNumChars = display.lineNumInnerWidth ? last.length : -1;
+      display.lineGutter.style.width = display.lineNumWidth + "px";
+      updateGutterSpace(cm.display);
+      return true
+    }
+    return false
+  }
+
+  function getGutters(gutters, lineNumbers) {
+    var result = [], sawLineNumbers = false;
+    for (var i = 0; i < gutters.length; i++) {
+      var name = gutters[i], style = null;
+      if (typeof name != "string") { style = name.style; name = name.className; }
+      if (name == "CodeMirror-linenumbers") {
+        if (!lineNumbers) { continue }
+        else { sawLineNumbers = true; }
+      }
+      result.push({className: name, style: style});
+    }
+    if (lineNumbers && !sawLineNumbers) { result.push({className: "CodeMirror-linenumbers", style: null}); }
+    return result
+  }
+
+  // Rebuild the gutter elements, ensure the margin to the left of the
+  // code matches their width.
+  function renderGutters(display) {
+    var gutters = display.gutters, specs = display.gutterSpecs;
+    removeChildren(gutters);
+    display.lineGutter = null;
+    for (var i = 0; i < specs.length; ++i) {
+      var ref = specs[i];
+      var className = ref.className;
+      var style = ref.style;
+      var gElt = gutters.appendChild(elt("div", null, "CodeMirror-gutter " + className));
+      if (style) { gElt.style.cssText = style; }
+      if (className == "CodeMirror-linenumbers") {
+        display.lineGutter = gElt;
+        gElt.style.width = (display.lineNumWidth || 1) + "px";
+      }
+    }
+    gutters.style.display = specs.length ? "" : "none";
+    updateGutterSpace(display);
+  }
+
+  function updateGutters(cm) {
+    renderGutters(cm.display);
+    regChange(cm);
+    alignHorizontally(cm);
+  }
+
+  // The display handles the DOM integration, both for input reading
+  // and content drawing. It holds references to DOM nodes and
+  // display-related state.
+
+  function Display(place, doc, input, options) {
+    var d = this;
+    this.input = input;
+
+    // Covers bottom-right square when both scrollbars are present.
+    d.scrollbarFiller = elt("div", null, "CodeMirror-scrollbar-filler");
+    d.scrollbarFiller.setAttribute("cm-not-content", "true");
+    // Covers bottom of gutter when coverGutterNextToScrollbar is on
+    // and h scrollbar is present.
+    d.gutterFiller = elt("div", null, "CodeMirror-gutter-filler");
+    d.gutterFiller.setAttribute("cm-not-content", "true");
+    // Will contain the actual code, positioned to cover the viewport.
+    d.lineDiv = eltP("div", null, "CodeMirror-code");
+    // Elements are added to these to represent selection and cursors.
+    d.selectionDiv = elt("div", null, null, "position: relative; z-index: 1");
+    d.cursorDiv = elt("div", null, "CodeMirror-cursors");
+    // A visibility: hidden element used to find the size of things.
+    d.measure = elt("div", null, "CodeMirror-measure");
+    // When lines outside of the viewport are measured, they are drawn in this.
+    d.lineMeasure = elt("div", null, "CodeMirror-measure");
+    // Wraps everything that needs to exist inside the vertically-padded coordinate system
+    d.lineSpace = eltP("div", [d.measure, d.lineMeasure, d.selectionDiv, d.cursorDiv, d.lineDiv],
+                      null, "position: relative; outline: none");
+    var lines = eltP("div", [d.lineSpace], "CodeMirror-lines");
+    // Moved around its parent to cover visible view.
+    d.mover = elt("div", [lines], null, "position: relative");
+    // Set to the height of the document, allowing scrolling.
+    d.sizer = elt("div", [d.mover], "CodeMirror-sizer");
+    d.sizerWidth = null;
+    // Behavior of elts with overflow: auto and padding is
+    // inconsistent across browsers. This is used to ensure the
+    // scrollable area is big enough.
+    d.heightForcer = elt("div", null, null, "position: absolute; height: " + scrollerGap + "px; width: 1px;");
+    // Will contain the gutters, if any.
+    d.gutters = elt("div", null, "CodeMirror-gutters");
+    d.lineGutter = null;
+    // Actual scrollable element.
+    d.scroller = elt("div", [d.sizer, d.heightForcer, d.gutters], "CodeMirror-scroll");
+    d.scroller.setAttribute("tabIndex", "-1");
+    // The element in which the editor lives.
+    d.wrapper = elt("div", [d.scrollbarFiller, d.gutterFiller, d.scroller], "CodeMirror");
+
+    // Work around IE7 z-index bug (not perfect, hence IE7 not really being supported)
+    if (ie && ie_version < 8) { d.gutters.style.zIndex = -1; d.scroller.style.paddingRight = 0; }
+    if (!webkit && !(gecko && mobile)) { d.scroller.draggable = true; }
+
+    if (place) {
+      if (place.appendChild) { place.appendChild(d.wrapper); }
+      else { place(d.wrapper); }
+    }
+
+    // Current rendered range (may be bigger than the view window).
+    d.viewFrom = d.viewTo = doc.first;
+    d.reportedViewFrom = d.reportedViewTo = doc.first;
+    // Information about the rendered lines.
+    d.view = [];
+    d.renderedView = null;
+    // Holds info about a single rendered line when it was rendered
+    // for measurement, while not in view.
+    d.externalMeasured = null;
+    // Empty space (in pixels) above the view
+    d.viewOffset = 0;
+    d.lastWrapHeight = d.lastWrapWidth = 0;
+    d.updateLineNumbers = null;
+
+    d.nativeBarWidth = d.barHeight = d.barWidth = 0;
+    d.scrollbarsClipped = false;
+
+    // Used to only resize the line number gutter when necessary (when
+    // the amount of lines crosses a boundary that makes its width change)
+    d.lineNumWidth = d.lineNumInnerWidth = d.lineNumChars = null;
+    // Set to true when a non-horizontal-scrolling line widget is
+    // added. As an optimization, line widget aligning is skipped when
+    // this is false.
+    d.alignWidgets = false;
+
+    d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = null;
+
+    // Tracks the maximum line length so that the horizontal scrollbar
+    // can be kept static when scrolling.
+    d.maxLine = null;
+    d.maxLineLength = 0;
+    d.maxLineChanged = false;
+
+    // Used for measuring wheel scrolling granularity
+    d.wheelDX = d.wheelDY = d.wheelStartX = d.wheelStartY = null;
+
+    // True when shift is held down.
+    d.shift = false;
+
+    // Used to track whether anything happened since the context menu
+    // was opened.
+    d.selForContextMenu = null;
+
+    d.activeTouch = null;
+
+    d.gutterSpecs = getGutters(options.gutters, options.lineNumbers);
+    renderGutters(d);
+
+    input.init(d);
+  }
+
+  // Since the delta values reported on mouse wheel events are
+  // unstandardized between browsers and even browser versions, and
+  // generally horribly unpredictable, this code starts by measuring
+  // the scroll effect that the first few mouse wheel events have,
+  // and, from that, detects the way it can convert deltas to pixel
+  // offsets afterwards.
+  //
+  // The reason we want to know the amount a wheel event will scroll
+  // is that it gives us a chance to update the display before the
+  // actual scrolling happens, reducing flickering.
+
+  var wheelSamples = 0, wheelPixelsPerUnit = null;
+  // Fill in a browser-detected starting value on browsers where we
+  // know one. These don't have to be accurate -- the result of them
+  // being wrong would just be a slight flicker on the first wheel
+  // scroll (if it is large enough).
+  if (ie) { wheelPixelsPerUnit = -.53; }
+  else if (gecko) { wheelPixelsPerUnit = 15; }
+  else if (chrome) { wheelPixelsPerUnit = -.7; }
+  else if (safari) { wheelPixelsPerUnit = -1/3; }
+
+  function wheelEventDelta(e) {
+    var dx = e.wheelDeltaX, dy = e.wheelDeltaY;
+    if (dx == null && e.detail && e.axis == e.HORIZONTAL_AXIS) { dx = e.detail; }
+    if (dy == null && e.detail && e.axis == e.VERTICAL_AXIS) { dy = e.detail; }
+    else if (dy == null) { dy = e.wheelDelta; }
+    return {x: dx, y: dy}
+  }
+  function wheelEventPixels(e) {
+    var delta = wheelEventDelta(e);
+    delta.x *= wheelPixelsPerUnit;
+    delta.y *= wheelPixelsPerUnit;
+    return delta
+  }
+
+  function onScrollWheel(cm, e) {
+    var delta = wheelEventDelta(e), dx = delta.x, dy = delta.y;
+
+    var display = cm.display, scroll = display.scroller;
+    // Quit if there's nothing to scroll here
+    var canScrollX = scroll.scrollWidth > scroll.clientWidth;
+    var canScrollY = scroll.scrollHeight > scroll.clientHeight;
+    if (!(dx && canScrollX || dy && canScrollY)) { return }
+
+    // Webkit browsers on OS X abort momentum scrolls when the target
+    // of the scroll event is removed from the scrollable element.
+    // This hack (see related code in patchDisplay) makes sure the
+    // element is kept around.
+    if (dy && mac && webkit) {
+      outer: for (var cur = e.target, view = display.view; cur != scroll; cur = cur.parentNode) {
+        for (var i = 0; i < view.length; i++) {
+          if (view[i].node == cur) {
+            cm.display.currentWheelTarget = cur;
+            break outer
+          }
+        }
+      }
+    }
+
+    // On some browsers, horizontal scrolling will cause redraws to
+    // happen before the gutter has been realigned, causing it to
+    // wriggle around in a most unseemly way. When we have an
+    // estimated pixels/delta value, we just handle horizontal
+    // scrolling entirely here. It'll be slightly off from native, but
+    // better than glitching out.
+    if (dx && !gecko && !presto && wheelPixelsPerUnit != null) {
+      if (dy && canScrollY)
+        { updateScrollTop(cm, Math.max(0, scroll.scrollTop + dy * wheelPixelsPerUnit)); }
+      setScrollLeft(cm, Math.max(0, scroll.scrollLeft + dx * wheelPixelsPerUnit));
+      // Only prevent default scrolling if vertical scrolling is
+      // actually possible. Otherwise, it causes vertical scroll
+      // jitter on OSX trackpads when deltaX is small and deltaY
+      // is large (issue #3579)
+      if (!dy || (dy && canScrollY))
+        { e_preventDefault(e); }
+      display.wheelStartX = null; // Abort measurement, if in progress
+      return
+    }
+
+    // 'Project' the visible viewport to cover the area that is being
+    // scrolled into view (if we know enough to estimate it).
+    if (dy && wheelPixelsPerUnit != null) {
+      var pixels = dy * wheelPixelsPerUnit;
+      var top = cm.doc.scrollTop, bot = top + display.wrapper.clientHeight;
+      if (pixels < 0) { top = Math.max(0, top + pixels - 50); }
+      else { bot = Math.min(cm.doc.height, bot + pixels + 50); }
+      updateDisplaySimple(cm, {top: top, bottom: bot});
+    }
+
+    if (wheelSamples < 20) {
+      if (display.wheelStartX == null) {
+        display.wheelStartX = scroll.scrollLeft; display.wheelStartY = scroll.scrollTop;
+        display.wheelDX = dx; display.wheelDY = dy;
+        setTimeout(function () {
+          if (display.wheelStartX == null) { return }
+          var movedX = scroll.scrollLeft - display.wheelStartX;
+          var movedY = scroll.scrollTop - display.wheelStartY;
+          var sample = (movedY && display.wheelDY && movedY / display.wheelDY) ||
+            (movedX && display.wheelDX && movedX / display.wheelDX);
+          display.wheelStartX = display.wheelStartY = null;
+          if (!sample) { return }
+          wheelPixelsPerUnit = (wheelPixelsPerUnit * wheelSamples + sample) / (wheelSamples + 1);
+          ++wheelSamples;
+        }, 200);
+      } else {
+        display.wheelDX += dx; display.wheelDY += dy;
+      }
+    }
+  }
+
+  // Selection objects are immutable. A new one is created every time
+  // the selection changes. A selection is one or more non-overlapping
+  // (and non-touching) ranges, sorted, and an integer that indicates
+  // which one is the primary selection (the one that's scrolled into
+  // view, that getCursor returns, etc).
+  var Selection = function(ranges, primIndex) {
+    this.ranges = ranges;
+    this.primIndex = primIndex;
+  };
+
+  Selection.prototype.primary = function () { return this.ranges[this.primIndex] };
+
+  Selection.prototype.equals = function (other) {
+    if (other == this) { return true }
+    if (other.primIndex != this.primIndex || other.ranges.length != this.ranges.length) { return false }
+    for (var i = 0; i < this.ranges.length; i++) {
+      var here = this.ranges[i], there = other.ranges[i];
+      if (!equalCursorPos(here.anchor, there.anchor) || !equalCursorPos(here.head, there.head)) { return false }
+    }
+    return true
+  };
+
+  Selection.prototype.deepCopy = function () {
+    var out = [];
+    for (var i = 0; i < this.ranges.length; i++)
+      { out[i] = new Range(copyPos(this.ranges[i].anchor), copyPos(this.ranges[i].head)); }
+    return new Selection(out, this.primIndex)
+  };
+
+  Selection.prototype.somethingSelected = function () {
+    for (var i = 0; i < this.ranges.length; i++)
+      { if (!this.ranges[i].empty()) { return true } }
+    return false
+  };
+
+  Selection.prototype.contains = function (pos, end) {
+    if (!end) { end = pos; }
+    for (var i = 0; i < this.ranges.length; i++) {
+      var range = this.ranges[i];
+      if (cmp(end, range.from()) >= 0 && cmp(pos, range.to()) <= 0)
+        { return i }
+    }
+    return -1
+  };
+
+  var Range = function(anchor, head) {
+    this.anchor = anchor; this.head = head;
+  };
+
+  Range.prototype.from = function () { return minPos(this.anchor, this.head) };
+  Range.prototype.to = function () { return maxPos(this.anchor, this.head) };
+  Range.prototype.empty = function () { return this.head.line == this.anchor.line && this.head.ch == this.anchor.ch };
+
+  // Take an unsorted, potentially overlapping set of ranges, and
+  // build a selection out of it. 'Consumes' ranges array (modifying
+  // it).
+  function normalizeSelection(cm, ranges, primIndex) {
+    var mayTouch = cm && cm.options.selectionsMayTouch;
+    var prim = ranges[primIndex];
+    ranges.sort(function (a, b) { return cmp(a.from(), b.from()); });
+    primIndex = indexOf(ranges, prim);
+    for (var i = 1; i < ranges.length; i++) {
+      var cur = ranges[i], prev = ranges[i - 1];
+      var diff = cmp(prev.to(), cur.from());
+      if (mayTouch && !cur.empty() ? diff > 0 : diff >= 0) {
+        var from = minPos(prev.from(), cur.from()), to = maxPos(prev.to(), cur.to());
+        var inv = prev.empty() ? cur.from() == cur.head : prev.from() == prev.head;
+        if (i <= primIndex) { --primIndex; }
+        ranges.splice(--i, 2, new Range(inv ? to : from, inv ? from : to));
+      }
+    }
+    return new Selection(ranges, primIndex)
+  }
+
+  function simpleSelection(anchor, head) {
+    return new Selection([new Range(anchor, head || anchor)], 0)
+  }
+
+  // Compute the position of the end of a change (its 'to' property
+  // refers to the pre-change end).
+  function changeEnd(change) {
+    if (!change.text) { return change.to }
+    return Pos(change.from.line + change.text.length - 1,
+               lst(change.text).length + (change.text.length == 1 ? change.from.ch : 0))
+  }
+
+  // Adjust a position to refer to the post-change position of the
+  // same text, or the end of the change if the change covers it.
+  function adjustForChange(pos, change) {
+    if (cmp(pos, change.from) < 0) { return pos }
+    if (cmp(pos, change.to) <= 0) { return changeEnd(change) }
+
+    var line = pos.line + change.text.length - (change.to.line - change.from.line) - 1, ch = pos.ch;
+    if (pos.line == change.to.line) { ch += changeEnd(change).ch - change.to.ch; }
+    return Pos(line, ch)
+  }
+
+  function computeSelAfterChange(doc, change) {
+    var out = [];
+    for (var i = 0; i < doc.sel.ranges.length; i++) {
+      var range = doc.sel.ranges[i];
+      out.push(new Range(adjustForChange(range.anchor, change),
+                         adjustForChange(range.head, change)));
+    }
+    return normalizeSelection(doc.cm, out, doc.sel.primIndex)
+  }
+
+  function offsetPos(pos, old, nw) {
+    if (pos.line == old.line)
+      { return Pos(nw.line, pos.ch - old.ch + nw.ch) }
+    else
+      { return Pos(nw.line + (pos.line - old.line), pos.ch) }
+  }
+
+  // Used by replaceSelections to allow moving the selection to the
+  // start or around the replaced test. Hint may be "start" or "around".
+  function computeReplacedSel(doc, changes, hint) {
+    var out = [];
+    var oldPrev = Pos(doc.first, 0), newPrev = oldPrev;
+    for (var i = 0; i < changes.length; i++) {
+      var change = changes[i];
+      var from = offsetPos(change.from, oldPrev, newPrev);
+      var to = offsetPos(changeEnd(change), oldPrev, newPrev);
+      oldPrev = change.to;
+      newPrev = to;
+      if (hint == "around") {
+        var range = doc.sel.ranges[i], inv = cmp(range.head, range.anchor) < 0;
+        out[i] = new Range(inv ? to : from, inv ? from : to);
+      } else {
+        out[i] = new Range(from, from);
+      }
+    }
+    return new Selection(out, doc.sel.primIndex)
+  }
+
+  // Used to get the editor into a consistent state again when options change.
+
+  function loadMode(cm) {
+    cm.doc.mode = getMode(cm.options, cm.doc.modeOption);
+    resetModeState(cm);
+  }
+
+  function resetModeState(cm) {
+    cm.doc.iter(function (line) {
+      if (line.stateAfter) { line.stateAfter = null; }
+      if (line.styles) { line.styles = null; }
+    });
+    cm.doc.modeFrontier = cm.doc.highlightFrontier = cm.doc.first;
+    startWorker(cm, 100);
+    cm.state.modeGen++;
+    if (cm.curOp) { regChange(cm); }
+  }
+
+  // DOCUMENT DATA STRUCTURE
+
+  // By default, updates that start and end at the beginning of a line
+  // are treated specially, in order to make the association of line
+  // widgets and marker elements with the text behave more intuitive.
+  function isWholeLineUpdate(doc, change) {
+    return change.from.ch == 0 && change.to.ch == 0 && lst(change.text) == "" &&
+      (!doc.cm || doc.cm.options.wholeLineUpdateBefore)
+  }
+
+  // Perform a change on the document data structure.
+  function updateDoc(doc, change, markedSpans, estimateHeight) {
+    function spansFor(n) {return markedSpans ? markedSpans[n] : null}
+    function update(line, text, spans) {
+      updateLine(line, text, spans, estimateHeight);
+      signalLater(line, "change", line, change);
+    }
+    function linesFor(start, end) {
+      var result = [];
+      for (var i = start; i < end; ++i)
+        { result.push(new Line(text[i], spansFor(i), estimateHeight)); }
+      return result
+    }
+
+    var from = change.from, to = change.to, text = change.text;
+    var firstLine = getLine(doc, from.line), lastLine = getLine(doc, to.line);
+    var lastText = lst(text), lastSpans = spansFor(text.length - 1), nlines = to.line - from.line;
+
+    // Adjust the line structure
+    if (change.full) {
+      doc.insert(0, linesFor(0, text.length));
+      doc.remove(text.length, doc.size - text.length);
+    } else if (isWholeLineUpdate(doc, change)) {
+      // This is a whole-line replace. Treated specially to make
+      // sure line objects move the way they are supposed to.
+      var added = linesFor(0, text.length - 1);
+      update(lastLine, lastLine.text, lastSpans);
+      if (nlines) { doc.remove(from.line, nlines); }
+      if (added.length) { doc.insert(from.line, added); }
+    } else if (firstLine == lastLine) {
+      if (text.length == 1) {
+        update(firstLine, firstLine.text.slice(0, from.ch) + lastText + firstLine.text.slice(to.ch), lastSpans);
+      } else {
+        var added$1 = linesFor(1, text.length - 1);
+        added$1.push(new Line(lastText + firstLine.text.slice(to.ch), lastSpans, estimateHeight));
+        update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0));
+        doc.insert(from.line + 1, added$1);
+      }
+    } else if (text.length == 1) {
+      update(firstLine, firstLine.text.slice(0, from.ch) + text[0] + lastLine.text.slice(to.ch), spansFor(0));
+      doc.remove(from.line + 1, nlines);
+    } else {
+      update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0));
+      update(lastLine, lastText + lastLine.text.slice(to.ch), lastSpans);
+      var added$2 = linesFor(1, text.length - 1);
+      if (nlines > 1) { doc.remove(from.line + 1, nlines - 1); }
+      doc.insert(from.line + 1, added$2);
+    }
+
+    signalLater(doc, "change", doc, change);
+  }
+
+  // Call f for all linked documents.
+  function linkedDocs(doc, f, sharedHistOnly) {
+    function propagate(doc, skip, sharedHist) {
+      if (doc.linked) { for (var i = 0; i < doc.linked.length; ++i) {
+        var rel = doc.linked[i];
+        if (rel.doc == skip) { continue }
+        var shared = sharedHist && rel.sharedHist;
+        if (sharedHistOnly && !shared) { continue }
+        f(rel.doc, shared);
+        propagate(rel.doc, doc, shared);
+      } }
+    }
+    propagate(doc, null, true);
+  }
+
+  // Attach a document to an editor.
+  function attachDoc(cm, doc) {
+    if (doc.cm) { throw new Error("This document is already in use.") }
+    cm.doc = doc;
+    doc.cm = cm;
+    estimateLineHeights(cm);
+    loadMode(cm);
+    setDirectionClass(cm);
+    if (!cm.options.lineWrapping) { findMaxLine(cm); }
+    cm.options.mode = doc.modeOption;
+    regChange(cm);
+  }
+
+  function setDirectionClass(cm) {
+  (cm.doc.direction == "rtl" ? addClass : rmClass)(cm.display.lineDiv, "CodeMirror-rtl");
+  }
+
+  function directionChanged(cm) {
+    runInOp(cm, function () {
+      setDirectionClass(cm);
+      regChange(cm);
+    });
+  }
+
+  function History(startGen) {
+    // Arrays of change events and selections. Doing something adds an
+    // event to done and clears undo. Undoing moves events from done
+    // to undone, redoing moves them in the other direction.
+    this.done = []; this.undone = [];
+    this.undoDepth = Infinity;
+    // Used to track when changes can be merged into a single undo
+    // event
+    this.lastModTime = this.lastSelTime = 0;
+    this.lastOp = this.lastSelOp = null;
+    this.lastOrigin = this.lastSelOrigin = null;
+    // Used by the isClean() method
+    this.generation = this.maxGeneration = startGen || 1;
+  }
+
+  // Create a history change event from an updateDoc-style change
+  // object.
+  function historyChangeFromChange(doc, change) {
+    var histChange = {from: copyPos(change.from), to: changeEnd(change), text: getBetween(doc, change.from, change.to)};
+    attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1);
+    linkedDocs(doc, function (doc) { return attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1); }, true);
+    return histChange
+  }
+
+  // Pop all selection events off the end of a history array. Stop at
+  // a change event.
+  function clearSelectionEvents(array) {
+    while (array.length) {
+      var last = lst(array);
+      if (last.ranges) { array.pop(); }
+      else { break }
+    }
+  }
+
+  // Find the top change event in the history. Pop off selection
+  // events that are in the way.
+  function lastChangeEvent(hist, force) {
+    if (force) {
+      clearSelectionEvents(hist.done);
+      return lst(hist.done)
+    } else if (hist.done.length && !lst(hist.done).ranges) {
+      return lst(hist.done)
+    } else if (hist.done.length > 1 && !hist.done[hist.done.length - 2].ranges) {
+      hist.done.pop();
+      return lst(hist.done)
+    }
+  }
+
+  // Register a change in the history. Merges changes that are within
+  // a single operation, or are close together with an origin that
+  // allows merging (starting with "+") into a single event.
+  function addChangeToHistory(doc, change, selAfter, opId) {
+    var hist = doc.history;
+    hist.undone.length = 0;
+    var time = +new Date, cur;
+    var last;
+
+    if ((hist.lastOp == opId ||
+         hist.lastOrigin == change.origin && change.origin &&
+         ((change.origin.charAt(0) == "+" && hist.lastModTime > time - (doc.cm ? doc.cm.options.historyEventDelay : 500)) ||
+          change.origin.charAt(0) == "*")) &&
+        (cur = lastChangeEvent(hist, hist.lastOp == opId))) {
+      // Merge this change into the last event
+      last = lst(cur.changes);
+      if (cmp(change.from, change.to) == 0 && cmp(change.from, last.to) == 0) {
+        // Optimized case for simple insertion -- don't want to add
+        // new changesets for every character typed
+        last.to = changeEnd(change);
+      } else {
+        // Add new sub-event
+        cur.changes.push(historyChangeFromChange(doc, change));
+      }
+    } else {
+      // Can not be merged, start a new event.
+      var before = lst(hist.done);
+      if (!before || !before.ranges)
+        { pushSelectionToHistory(doc.sel, hist.done); }
+      cur = {changes: [historyChangeFromChange(doc, change)],
+             generation: hist.generation};
+      hist.done.push(cur);
+      while (hist.done.length > hist.undoDepth) {
+        hist.done.shift();
+        if (!hist.done[0].ranges) { hist.done.shift(); }
+      }
+    }
+    hist.done.push(selAfter);
+    hist.generation = ++hist.maxGeneration;
+    hist.lastModTime = hist.lastSelTime = time;
+    hist.lastOp = hist.lastSelOp = opId;
+    hist.lastOrigin = hist.lastSelOrigin = change.origin;
+
+    if (!last) { signal(doc, "historyAdded"); }
+  }
+
+  function selectionEventCanBeMerged(doc, origin, prev, sel) {
+    var ch = origin.charAt(0);
+    return ch == "*" ||
+      ch == "+" &&
+      prev.ranges.length == sel.ranges.length &&
+      prev.somethingSelected() == sel.somethingSelected() &&
+      new Date - doc.history.lastSelTime <= (doc.cm ? doc.cm.options.historyEventDelay : 500)
+  }
+
+  // Called whenever the selection changes, sets the new selection as
+  // the pending selection in the history, and pushes the old pending
+  // selection into the 'done' array when it was significantly
+  // different (in number of selected ranges, emptiness, or time).
+  function addSelectionToHistory(doc, sel, opId, options) {
+    var hist = doc.history, origin = options && options.origin;
+
+    // A new event is started when the previous origin does not match
+    // the current, or the origins don't allow matching. Origins
+    // starting with * are always merged, those starting with + are
+    // merged when similar and close together in time.
+    if (opId == hist.lastSelOp ||
+        (origin && hist.lastSelOrigin == origin &&
+         (hist.lastModTime == hist.lastSelTime && hist.lastOrigin == origin ||
+          selectionEventCanBeMerged(doc, origin, lst(hist.done), sel))))
+      { hist.done[hist.done.length - 1] = sel; }
+    else
+      { pushSelectionToHistory(sel, hist.done); }
+
+    hist.lastSelTime = +new Date;
+    hist.lastSelOrigin = origin;
+    hist.lastSelOp = opId;
+    if (options && options.clearRedo !== false)
+      { clearSelectionEvents(hist.undone); }
+  }
+
+  function pushSelectionToHistory(sel, dest) {
+    var top = lst(dest);
+    if (!(top && top.ranges && top.equals(sel)))
+      { dest.push(sel); }
+  }
+
+  // Used to store marked span information in the history.
+  function attachLocalSpans(doc, change, from, to) {
+    var existing = change["spans_" + doc.id], n = 0;
+    doc.iter(Math.max(doc.first, from), Math.min(doc.first + doc.size, to), function (line) {
+      if (line.markedSpans)
+        { (existing || (existing = change["spans_" + doc.id] = {}))[n] = line.markedSpans; }
+      ++n;
+    });
+  }
+
+  // When un/re-doing restores text containing marked spans, those
+  // that have been explicitly cleared should not be restored.
+  function removeClearedSpans(spans) {
+    if (!spans) { return null }
+    var out;
+    for (var i = 0; i < spans.length; ++i) {
+      if (spans[i].marker.explicitlyCleared) { if (!out) { out = spans.slice(0, i); } }
+      else if (out) { out.push(spans[i]); }
+    }
+    return !out ? spans : out.length ? out : null
+  }
+
+  // Retrieve and filter the old marked spans stored in a change event.
+  function getOldSpans(doc, change) {
+    var found = change["spans_" + doc.id];
+    if (!found) { return null }
+    var nw = [];
+    for (var i = 0; i < change.text.length; ++i)
+      { nw.push(removeClearedSpans(found[i])); }
+    return nw
+  }
+
+  // Used for un/re-doing changes from the history. Combines the
+  // result of computing the existing spans with the set of spans that
+  // existed in the history (so that deleting around a span and then
+  // undoing brings back the span).
+  function mergeOldSpans(doc, change) {
+    var old = getOldSpans(doc, change);
+    var stretched = stretchSpansOverChange(doc, change);
+    if (!old) { return stretched }
+    if (!stretched) { return old }
+
+    for (var i = 0; i < old.length; ++i) {
+      var oldCur = old[i], stretchCur = stretched[i];
+      if (oldCur && stretchCur) {
+        spans: for (var j = 0; j < stretchCur.length; ++j) {
+          var span = stretchCur[j];
+          for (var k = 0; k < oldCur.length; ++k)
+            { if (oldCur[k].marker == span.marker) { continue spans } }
+          oldCur.push(span);
+        }
+      } else if (stretchCur) {
+        old[i] = stretchCur;
+      }
+    }
+    return old
+  }
+
+  // Used both to provide a JSON-safe object in .getHistory, and, when
+  // detaching a document, to split the history in two
+  function copyHistoryArray(events, newGroup, instantiateSel) {
+    var copy = [];
+    for (var i = 0; i < events.length; ++i) {
+      var event = events[i];
+      if (event.ranges) {
+        copy.push(instantiateSel ? Selection.prototype.deepCopy.call(event) : event);
+        continue
+      }
+      var changes = event.changes, newChanges = [];
+      copy.push({changes: newChanges});
+      for (var j = 0; j < changes.length; ++j) {
+        var change = changes[j], m = (void 0);
+        newChanges.push({from: change.from, to: change.to, text: change.text});
+        if (newGroup) { for (var prop in change) { if (m = prop.match(/^spans_(\d+)$/)) {
+          if (indexOf(newGroup, Number(m[1])) > -1) {
+            lst(newChanges)[prop] = change[prop];
+            delete change[prop];
+          }
+        } } }
+      }
+    }
+    return copy
+  }
+
+  // The 'scroll' parameter given to many of these indicated whether
+  // the new cursor position should be scrolled into view after
+  // modifying the selection.
+
+  // If shift is held or the extend flag is set, extends a range to
+  // include a given position (and optionally a second position).
+  // Otherwise, simply returns the range between the given positions.
+  // Used for cursor motion and such.
+  function extendRange(range, head, other, extend) {
+    if (extend) {
+      var anchor = range.anchor;
+      if (other) {
+        var posBefore = cmp(head, anchor) < 0;
+        if (posBefore != (cmp(other, anchor) < 0)) {
+          anchor = head;
+          head = other;
+        } else if (posBefore != (cmp(head, other) < 0)) {
+          head = other;
+        }
+      }
+      return new Range(anchor, head)
+    } else {
+      return new Range(other || head, head)
+    }
+  }
+
+  // Extend the primary selection range, discard the rest.
+  function extendSelection(doc, head, other, options, extend) {
+    if (extend == null) { extend = doc.cm && (doc.cm.display.shift || doc.extend); }
+    setSelection(doc, new Selection([extendRange(doc.sel.primary(), head, other, extend)], 0), options);
+  }
+
+  // Extend all selections (pos is an array of selections with length
+  // equal the number of selections)
+  function extendSelections(doc, heads, options) {
+    var out = [];
+    var extend = doc.cm && (doc.cm.display.shift || doc.extend);
+    for (var i = 0; i < doc.sel.ranges.length; i++)
+      { out[i] = extendRange(doc.sel.ranges[i], heads[i], null, extend); }
+    var newSel = normalizeSelection(doc.cm, out, doc.sel.primIndex);
+    setSelection(doc, newSel, options);
+  }
+
+  // Updates a single range in the selection.
+  function replaceOneSelection(doc, i, range, options) {
+    var ranges = doc.sel.ranges.slice(0);
+    ranges[i] = range;
+    setSelection(doc, normalizeSelection(doc.cm, ranges, doc.sel.primIndex), options);
+  }
+
+  // Reset the selection to a single range.
+  function setSimpleSelection(doc, anchor, head, options) {
+    setSelection(doc, simpleSelection(anchor, head), options);
+  }
+
+  // Give beforeSelectionChange handlers a change to influence a
+  // selection update.
+  function filterSelectionChange(doc, sel, options) {
+    var obj = {
+      ranges: sel.ranges,
+      update: function(ranges) {
+        this.ranges = [];
+        for (var i = 0; i < ranges.length; i++)
+          { this.ranges[i] = new Range(clipPos(doc, ranges[i].anchor),
+                                     clipPos(doc, ranges[i].head)); }
+      },
+      origin: options && options.origin
+    };
+    signal(doc, "beforeSelectionChange", doc, obj);
+    if (doc.cm) { signal(doc.cm, "beforeSelectionChange", doc.cm, obj); }
+    if (obj.ranges != sel.ranges) { return normalizeSelection(doc.cm, obj.ranges, obj.ranges.length - 1) }
+    else { return sel }
+  }
+
+  function setSelectionReplaceHistory(doc, sel, options) {
+    var done = doc.history.done, last = lst(done);
+    if (last && last.ranges) {
+      done[done.length - 1] = sel;
+      setSelectionNoUndo(doc, sel, options);
+    } else {
+      setSelection(doc, sel, options);
+    }
+  }
+
+  // Set a new selection.
+  function setSelection(doc, sel, options) {
+    setSelectionNoUndo(doc, sel, options);
+    addSelectionToHistory(doc, doc.sel, doc.cm ? doc.cm.curOp.id : NaN, options);
+  }
+
+  function setSelectionNoUndo(doc, sel, options) {
+    if (hasHandler(doc, "beforeSelectionChange") || doc.cm && hasHandler(doc.cm, "beforeSelectionChange"))
+      { sel = filterSelectionChange(doc, sel, options); }
+
+    var bias = options && options.bias ||
+      (cmp(sel.primary().head, doc.sel.primary().head) < 0 ? -1 : 1);
+    setSelectionInner(doc, skipAtomicInSelection(doc, sel, bias, true));
+
+    if (!(options && options.scroll === false) && doc.cm)
+      { ensureCursorVisible(doc.cm); }
+  }
+
+  function setSelectionInner(doc, sel) {
+    if (sel.equals(doc.sel)) { return }
+
+    doc.sel = sel;
+
+    if (doc.cm) {
+      doc.cm.curOp.updateInput = 1;
+      doc.cm.curOp.selectionChanged = true;
+      signalCursorActivity(doc.cm);
+    }
+    signalLater(doc, "cursorActivity", doc);
+  }
+
+  // Verify that the selection does not partially select any atomic
+  // marked ranges.
+  function reCheckSelection(doc) {
+    setSelectionInner(doc, skipAtomicInSelection(doc, doc.sel, null, false));
+  }
+
+  // Return a selection that does not partially select any atomic
+  // ranges.
+  function skipAtomicInSelection(doc, sel, bias, mayClear) {
+    var out;
+    for (var i = 0; i < sel.ranges.length; i++) {
+      var range = sel.ranges[i];
+      var old = sel.ranges.length == doc.sel.ranges.length && doc.sel.ranges[i];
+      var newAnchor = skipAtomic(doc, range.anchor, old && old.anchor, bias, mayClear);
+      var newHead = skipAtomic(doc, range.head, old && old.head, bias, mayClear);
+      if (out || newAnchor != range.anchor || newHead != range.head) {
+        if (!out) { out = sel.ranges.slice(0, i); }
+        out[i] = new Range(newAnchor, newHead);
+      }
+    }
+    return out ? normalizeSelection(doc.cm, out, sel.primIndex) : sel
+  }
+
+  function skipAtomicInner(doc, pos, oldPos, dir, mayClear) {
+    var line = getLine(doc, pos.line);
+    if (line.markedSpans) { for (var i = 0; i < line.markedSpans.length; ++i) {
+      var sp = line.markedSpans[i], m = sp.marker;
+
+      // Determine if we should prevent the cursor being placed to the left/right of an atomic marker
+      // Historically this was determined using the inclusiveLeft/Right option, but the new way to control it
+      // is with selectLeft/Right
+      var preventCursorLeft = ("selectLeft" in m) ? !m.selectLeft : m.inclusiveLeft;
+      var preventCursorRight = ("selectRight" in m) ? !m.selectRight : m.inclusiveRight;
+
+      if ((sp.from == null || (preventCursorLeft ? sp.from <= pos.ch : sp.from < pos.ch)) &&
+          (sp.to == null || (preventCursorRight ? sp.to >= pos.ch : sp.to > pos.ch))) {
+        if (mayClear) {
+          signal(m, "beforeCursorEnter");
+          if (m.explicitlyCleared) {
+            if (!line.markedSpans) { break }
+            else {--i; continue}
+          }
+        }
+        if (!m.atomic) { continue }
+
+        if (oldPos) {
+          var near = m.find(dir < 0 ? 1 : -1), diff = (void 0);
+          if (dir < 0 ? preventCursorRight : preventCursorLeft)
+            { near = movePos(doc, near, -dir, near && near.line == pos.line ? line : null); }
+          if (near && near.line == pos.line && (diff = cmp(near, oldPos)) && (dir < 0 ? diff < 0 : diff > 0))
+            { return skipAtomicInner(doc, near, pos, dir, mayClear) }
+        }
+
+        var far = m.find(dir < 0 ? -1 : 1);
+        if (dir < 0 ? preventCursorLeft : preventCursorRight)
+          { far = movePos(doc, far, dir, far.line == pos.line ? line : null); }
+        return far ? skipAtomicInner(doc, far, pos, dir, mayClear) : null
+      }
+    } }
+    return pos
+  }
+
+  // Ensure a given position is not inside an atomic range.
+  function skipAtomic(doc, pos, oldPos, bias, mayClear) {
+    var dir = bias || 1;
+    var found = skipAtomicInner(doc, pos, oldPos, dir, mayClear) ||
+        (!mayClear && skipAtomicInner(doc, pos, oldPos, dir, true)) ||
+        skipAtomicInner(doc, pos, oldPos, -dir, mayClear) ||
+        (!mayClear && skipAtomicInner(doc, pos, oldPos, -dir, true));
+    if (!found) {
+      doc.cantEdit = true;
+      return Pos(doc.first, 0)
+    }
+    return found
+  }
+
+  function movePos(doc, pos, dir, line) {
+    if (dir < 0 && pos.ch == 0) {
+      if (pos.line > doc.first) { return clipPos(doc, Pos(pos.line - 1)) }
+      else { return null }
+    } else if (dir > 0 && pos.ch == (line || getLine(doc, pos.line)).text.length) {
+      if (pos.line < doc.first + doc.size - 1) { return Pos(pos.line + 1, 0) }
+      else { return null }
+    } else {
+      return new Pos(pos.line, pos.ch + dir)
+    }
+  }
+
+  function selectAll(cm) {
+    cm.setSelection(Pos(cm.firstLine(), 0), Pos(cm.lastLine()), sel_dontScroll);
+  }
+
+  // UPDATING
+
+  // Allow "beforeChange" event handlers to influence a change
+  function filterChange(doc, change, update) {
+    var obj = {
+      canceled: false,
+      from: change.from,
+      to: change.to,
+      text: change.text,
+      origin: change.origin,
+      cancel: function () { return obj.canceled = true; }
+    };
+    if (update) { obj.update = function (from, to, text, origin) {
+      if (from) { obj.from = clipPos(doc, from); }
+      if (to) { obj.to = clipPos(doc, to); }
+      if (text) { obj.text = text; }
+      if (origin !== undefined) { obj.origin = origin; }
+    }; }
+    signal(doc, "beforeChange", doc, obj);
+    if (doc.cm) { signal(doc.cm, "beforeChange", doc.cm, obj); }
+
+    if (obj.canceled) {
+      if (doc.cm) { doc.cm.curOp.updateInput = 2; }
+      return null
+    }
+    return {from: obj.from, to: obj.to, text: obj.text, origin: obj.origin}
+  }
+
+  // Apply a change to a document, and add it to the document's
+  // history, and propagating it to all linked documents.
+  function makeChange(doc, change, ignoreReadOnly) {
+    if (doc.cm) {
+      if (!doc.cm.curOp) { return operation(doc.cm, makeChange)(doc, change, ignoreReadOnly) }
+      if (doc.cm.state.suppressEdits) { return }
+    }
+
+    if (hasHandler(doc, "beforeChange") || doc.cm && hasHandler(doc.cm, "beforeChange")) {
+      change = filterChange(doc, change, true);
+      if (!change) { return }
+    }
+
+    // Possibly split or suppress the update based on the presence
+    // of read-only spans in its range.
+    var split = sawReadOnlySpans && !ignoreReadOnly && removeReadOnlyRanges(doc, change.from, change.to);
+    if (split) {
+      for (var i = split.length - 1; i >= 0; --i)
+        { makeChangeInner(doc, {from: split[i].from, to: split[i].to, text: i ? [""] : change.text, origin: change.origin}); }
+    } else {
+      makeChangeInner(doc, change);
+    }
+  }
+
+  function makeChangeInner(doc, change) {
+    if (change.text.length == 1 && change.text[0] == "" && cmp(change.from, change.to) == 0) { return }
+    var selAfter = computeSelAfterChange(doc, change);
+    addChangeToHistory(doc, change, selAfter, doc.cm ? doc.cm.curOp.id : NaN);
+
+    makeChangeSingleDoc(doc, change, selAfter, stretchSpansOverChange(doc, change));
+    var rebased = [];
+
+    linkedDocs(doc, function (doc, sharedHist) {
+      if (!sharedHist && indexOf(rebased, doc.history) == -1) {
+        rebaseHist(doc.history, change);
+        rebased.push(doc.history);
+      }
+      makeChangeSingleDoc(doc, change, null, stretchSpansOverChange(doc, change));
+    });
+  }
+
+  // Revert a change stored in a document's history.
+  function makeChangeFromHistory(doc, type, allowSelectionOnly) {
+    var suppress = doc.cm && doc.cm.state.suppressEdits;
+    if (suppress && !allowSelectionOnly) { return }
+
+    var hist = doc.history, event, selAfter = doc.sel;
+    var source = type == "undo" ? hist.done : hist.undone, dest = type == "undo" ? hist.undone : hist.done;
+
+    // Verify that there is a useable event (so that ctrl-z won't
+    // needlessly clear selection events)
+    var i = 0;
+    for (; i < source.length; i++) {
+      event = source[i];
+      if (allowSelectionOnly ? event.ranges && !event.equals(doc.sel) : !event.ranges)
+        { break }
+    }
+    if (i == source.length) { return }
+    hist.lastOrigin = hist.lastSelOrigin = null;
+
+    for (;;) {
+      event = source.pop();
+      if (event.ranges) {
+        pushSelectionToHistory(event, dest);
+        if (allowSelectionOnly && !event.equals(doc.sel)) {
+          setSelection(doc, event, {clearRedo: false});
+          return
+        }
+        selAfter = event;
+      } else if (suppress) {
+        source.push(event);
+        return
+      } else { break }
+    }
+
+    // Build up a reverse change object to add to the opposite history
+    // stack (redo when undoing, and vice versa).
+    var antiChanges = [];
+    pushSelectionToHistory(selAfter, dest);
+    dest.push({changes: antiChanges, generation: hist.generation});
+    hist.generation = event.generation || ++hist.maxGeneration;
+
+    var filter = hasHandler(doc, "beforeChange") || doc.cm && hasHandler(doc.cm, "beforeChange");
+
+    var loop = function ( i ) {
+      var change = event.changes[i];
+      change.origin = type;
+      if (filter && !filterChange(doc, change, false)) {
+        source.length = 0;
+        return {}
+      }
+
+      antiChanges.push(historyChangeFromChange(doc, change));
+
+      var after = i ? computeSelAfterChange(doc, change) : lst(source);
+      makeChangeSingleDoc(doc, change, after, mergeOldSpans(doc, change));
+      if (!i && doc.cm) { doc.cm.scrollIntoView({from: change.from, to: changeEnd(change)}); }
+      var rebased = [];
+
+      // Propagate to the linked documents
+      linkedDocs(doc, function (doc, sharedHist) {
+        if (!sharedHist && indexOf(rebased, doc.history) == -1) {
+          rebaseHist(doc.history, change);
+          rebased.push(doc.history);
+        }
+        makeChangeSingleDoc(doc, change, null, mergeOldSpans(doc, change));
+      });
+    };
+
+    for (var i$1 = event.changes.length - 1; i$1 >= 0; --i$1) {
+      var returned = loop( i$1 );
+
+      if ( returned ) return returned.v;
+    }
+  }
+
+  // Sub-views need their line numbers shifted when text is added
+  // above or below them in the parent document.
+  function shiftDoc(doc, distance) {
+    if (distance == 0) { return }
+    doc.first += distance;
+    doc.sel = new Selection(map(doc.sel.ranges, function (range) { return new Range(
+      Pos(range.anchor.line + distance, range.anchor.ch),
+      Pos(range.head.line + distance, range.head.ch)
+    ); }), doc.sel.primIndex);
+    if (doc.cm) {
+      regChange(doc.cm, doc.first, doc.first - distance, distance);
+      for (var d = doc.cm.display, l = d.viewFrom; l < d.viewTo; l++)
+        { regLineChange(doc.cm, l, "gutter"); }
+    }
+  }
+
+  // More lower-level change function, handling only a single document
+  // (not linked ones).
+  function makeChangeSingleDoc(doc, change, selAfter, spans) {
+    if (doc.cm && !doc.cm.curOp)
+      { return operation(doc.cm, makeChangeSingleDoc)(doc, change, selAfter, spans) }
+
+    if (change.to.line < doc.first) {
+      shiftDoc(doc, change.text.length - 1 - (change.to.line - change.from.line));
+      return
+    }
+    if (change.from.line > doc.lastLine()) { return }
+
+    // Clip the change to the size of this doc
+    if (change.from.line < doc.first) {
+      var shift = change.text.length - 1 - (doc.first - change.from.line);
+      shiftDoc(doc, shift);
+      change = {from: Pos(doc.first, 0), to: Pos(change.to.line + shift, change.to.ch),
+                text: [lst(change.text)], origin: change.origin};
+    }
+    var last = doc.lastLine();
+    if (change.to.line > last) {
+      change = {from: change.from, to: Pos(last, getLine(doc, last).text.length),
+                text: [change.text[0]], origin: change.origin};
+    }
+
+    change.removed = getBetween(doc, change.from, change.to);
+
+    if (!selAfter) { selAfter = computeSelAfterChange(doc, change); }
+    if (doc.cm) { makeChangeSingleDocInEditor(doc.cm, change, spans); }
+    else { updateDoc(doc, change, spans); }
+    setSelectionNoUndo(doc, selAfter, sel_dontScroll);
+
+    if (doc.cantEdit && skipAtomic(doc, Pos(doc.firstLine(), 0)))
+      { doc.cantEdit = false; }
+  }
+
+  // Handle the interaction of a change to a document with the editor
+  // that this document is part of.
+  function makeChangeSingleDocInEditor(cm, change, spans) {
+    var doc = cm.doc, display = cm.display, from = change.from, to = change.to;
+
+    var recomputeMaxLength = false, checkWidthStart = from.line;
+    if (!cm.options.lineWrapping) {
+      checkWidthStart = lineNo(visualLine(getLine(doc, from.line)));
+      doc.iter(checkWidthStart, to.line + 1, function (line) {
+        if (line == display.maxLine) {
+          recomputeMaxLength = true;
+          return true
+        }
+      });
+    }
+
+    if (doc.sel.contains(change.from, change.to) > -1)
+      { signalCursorActivity(cm); }
+
+    updateDoc(doc, change, spans, estimateHeight(cm));
+
+    if (!cm.options.lineWrapping) {
+      doc.iter(checkWidthStart, from.line + change.text.length, function (line) {
+        var len = lineLength(line);
+        if (len > display.maxLineLength) {
+          display.maxLine = line;
+          display.maxLineLength = len;
+          display.maxLineChanged = true;
+          recomputeMaxLength = false;
+        }
+      });
+      if (recomputeMaxLength) { cm.curOp.updateMaxLine = true; }
+    }
+
+    retreatFrontier(doc, from.line);
+    startWorker(cm, 400);
+
+    var lendiff = change.text.length - (to.line - from.line) - 1;
+    // Remember that these lines changed, for updating the display
+    if (change.full)
+      { regChange(cm); }
+    else if (from.line == to.line && change.text.length == 1 && !isWholeLineUpdate(cm.doc, change))
+      { regLineChange(cm, from.line, "text"); }
+    else
+      { regChange(cm, from.line, to.line + 1, lendiff); }
+
+    var changesHandler = hasHandler(cm, "changes"), changeHandler = hasHandler(cm, "change");
+    if (changeHandler || changesHandler) {
+      var obj = {
+        from: from, to: to,
+        text: change.text,
+        removed: change.removed,
+        origin: change.origin
+      };
+      if (changeHandler) { signalLater(cm, "change", cm, obj); }
+      if (changesHandler) { (cm.curOp.changeObjs || (cm.curOp.changeObjs = [])).push(obj); }
+    }
+    cm.display.selForContextMenu = null;
+  }
+
+  function replaceRange(doc, code, from, to, origin) {
+    var assign;
+
+    if (!to) { to = from; }
+    if (cmp(to, from) < 0) { (assign = [to, from], from = assign[0], to = assign[1]); }
+    if (typeof code == "string") { code = doc.splitLines(code); }
+    makeChange(doc, {from: from, to: to, text: code, origin: origin});
+  }
+
+  // Rebasing/resetting history to deal with externally-sourced changes
+
+  function rebaseHistSelSingle(pos, from, to, diff) {
+    if (to < pos.line) {
+      pos.line += diff;
+    } else if (from < pos.line) {
+      pos.line = from;
+      pos.ch = 0;
+    }
+  }
+
+  // Tries to rebase an array of history events given a change in the
+  // document. If the change touches the same lines as the event, the
+  // event, and everything 'behind' it, is discarded. If the change is
+  // before the event, the event's positions are updated. Uses a
+  // copy-on-write scheme for the positions, to avoid having to
+  // reallocate them all on every rebase, but also avoid problems with
+  // shared position objects being unsafely updated.
+  function rebaseHistArray(array, from, to, diff) {
+    for (var i = 0; i < array.length; ++i) {
+      var sub = array[i], ok = true;
+      if (sub.ranges) {
+        if (!sub.copied) { sub = array[i] = sub.deepCopy(); sub.copied = true; }
+        for (var j = 0; j < sub.ranges.length; j++) {
+          rebaseHistSelSingle(sub.ranges[j].anchor, from, to, diff);
+          rebaseHistSelSingle(sub.ranges[j].head, from, to, diff);
+        }
+        continue
+      }
+      for (var j$1 = 0; j$1 < sub.changes.length; ++j$1) {
+        var cur = sub.changes[j$1];
+        if (to < cur.from.line) {
+          cur.from = Pos(cur.from.line + diff, cur.from.ch);
+          cur.to = Pos(cur.to.line + diff, cur.to.ch);
+        } else if (from <= cur.to.line) {
+          ok = false;
+          break
+        }
+      }
+      if (!ok) {
+        array.splice(0, i + 1);
+        i = 0;
+      }
+    }
+  }
+
+  function rebaseHist(hist, change) {
+    var from = change.from.line, to = change.to.line, diff = change.text.length - (to - from) - 1;
+    rebaseHistArray(hist.done, from, to, diff);
+    rebaseHistArray(hist.undone, from, to, diff);
+  }
+
+  // Utility for applying a change to a line by handle or number,
+  // returning the number and optionally registering the line as
+  // changed.
+  function changeLine(doc, handle, changeType, op) {
+    var no = handle, line = handle;
+    if (typeof handle == "number") { line = getLine(doc, clipLine(doc, handle)); }
+    else { no = lineNo(handle); }
+    if (no == null) { return null }
+    if (op(line, no) && doc.cm) { regLineChange(doc.cm, no, changeType); }
+    return line
+  }
+
+  // The document is represented as a BTree consisting of leaves, with
+  // chunk of lines in them, and branches, with up to ten leaves or
+  // other branch nodes below them. The top node is always a branch
+  // node, and is the document object itself (meaning it has
+  // additional methods and properties).
+  //
+  // All nodes have parent links. The tree is used both to go from
+  // line numbers to line objects, and to go from objects to numbers.
+  // It also indexes by height, and is used to convert between height
+  // and line object, and to find the total height of the document.
+  //
+  // See also http://marijnhaverbeke.nl/blog/codemirror-line-tree.html
+
+  function LeafChunk(lines) {
+    this.lines = lines;
+    this.parent = null;
+    var height = 0;
+    for (var i = 0; i < lines.length; ++i) {
+      lines[i].parent = this;
+      height += lines[i].height;
+    }
+    this.height = height;
+  }
+
+  LeafChunk.prototype = {
+    chunkSize: function() { return this.lines.length },
+
+    // Remove the n lines at offset 'at'.
+    removeInner: function(at, n) {
+      for (var i = at, e = at + n; i < e; ++i) {
+        var line = this.lines[i];
+        this.height -= line.height;
+        cleanUpLine(line);
+        signalLater(line, "delete");
+      }
+      this.lines.splice(at, n);
+    },
+
+    // Helper used to collapse a small branch into a single leaf.
+    collapse: function(lines) {
+      lines.push.apply(lines, this.lines);
+    },
+
+    // Insert the given array of lines at offset 'at', count them as
+    // having the given height.
+    insertInner: function(at, lines, height) {
+      this.height += height;
+      this.lines = this.lines.slice(0, at).concat(lines).concat(this.lines.slice(at));
+      for (var i = 0; i < lines.length; ++i) { lines[i].parent = this; }
+    },
+
+    // Used to iterate over a part of the tree.
+    iterN: function(at, n, op) {
+      for (var e = at + n; at < e; ++at)
+        { if (op(this.lines[at])) { return true } }
+    }
+  };
+
+  function BranchChunk(children) {
+    this.children = children;
+    var size = 0, height = 0;
+    for (var i = 0; i < children.length; ++i) {
+      var ch = children[i];
+      size += ch.chunkSize(); height += ch.height;
+      ch.parent = this;
+    }
+    this.size = size;
+    this.height = height;
+    this.parent = null;
+  }
+
+  BranchChunk.prototype = {
+    chunkSize: function() { return this.size },
+
+    removeInner: function(at, n) {
+      this.size -= n;
+      for (var i = 0; i < this.children.length; ++i) {
+        var child = this.children[i], sz = child.chunkSize();
+        if (at < sz) {
+          var rm = Math.min(n, sz - at), oldHeight = child.height;
+          child.removeInner(at, rm);
+          this.height -= oldHeight - child.height;
+          if (sz == rm) { this.children.splice(i--, 1); child.parent = null; }
+          if ((n -= rm) == 0) { break }
+          at = 0;
+        } else { at -= sz; }
+      }
+      // If the result is smaller than 25 lines, ensure that it is a
+      // single leaf node.
+      if (this.size - n < 25 &&
+          (this.children.length > 1 || !(this.children[0] instanceof LeafChunk))) {
+        var lines = [];
+        this.collapse(lines);
+        this.children = [new LeafChunk(lines)];
+        this.children[0].parent = this;
+      }
+    },
+
+    collapse: function(lines) {
+      for (var i = 0; i < this.children.length; ++i) { this.children[i].collapse(lines); }
+    },
+
+    insertInner: function(at, lines, height) {
+      this.size += lines.length;
+      this.height += height;
+      for (var i = 0; i < this.children.length; ++i) {
+        var child = this.children[i], sz = child.chunkSize();
+        if (at <= sz) {
+          child.insertInner(at, lines, height);
+          if (child.lines && child.lines.length > 50) {
+            // To avoid memory thrashing when child.lines is huge (e.g. first view of a large file), it's never spliced.
+            // Instead, small slices are taken. They're taken in order because sequential memory accesses are fastest.
+            var remaining = child.lines.length % 25 + 25;
+            for (var pos = remaining; pos < child.lines.length;) {
+              var leaf = new LeafChunk(child.lines.slice(pos, pos += 25));
+              child.height -= leaf.height;
+              this.children.splice(++i, 0, leaf);
+              leaf.parent = this;
+            }
+            child.lines = child.lines.slice(0, remaining);
+            this.maybeSpill();
+          }
+          break
+        }
+        at -= sz;
+      }
+    },
+
+    // When a node has grown, check whether it should be split.
+    maybeSpill: function() {
+      if (this.children.length <= 10) { return }
+      var me = this;
+      do {
+        var spilled = me.children.splice(me.children.length - 5, 5);
+        var sibling = new BranchChunk(spilled);
+        if (!me.parent) { // Become the parent node
+          var copy = new BranchChunk(me.children);
+          copy.parent = me;
+          me.children = [copy, sibling];
+          me = copy;
+       } else {
+          me.size -= sibling.size;
+          me.height -= sibling.height;
+          var myIndex = indexOf(me.parent.children, me);
+          me.parent.children.splice(myIndex + 1, 0, sibling);
+        }
+        sibling.parent = me.parent;
+      } while (me.children.length > 10)
+      me.parent.maybeSpill();
+    },
+
+    iterN: function(at, n, op) {
+      for (var i = 0; i < this.children.length; ++i) {
+        var child = this.children[i], sz = child.chunkSize();
+        if (at < sz) {
+          var used = Math.min(n, sz - at);
+          if (child.iterN(at, used, op)) { return true }
+          if ((n -= used) == 0) { break }
+          at = 0;
+        } else { at -= sz; }
+      }
+    }
+  };
+
+  // Line widgets are block elements displayed above or below a line.
+
+  var LineWidget = function(doc, node, options) {
+    if (options) { for (var opt in options) { if (options.hasOwnProperty(opt))
+      { this[opt] = options[opt]; } } }
+    this.doc = doc;
+    this.node = node;
+  };
+
+  LineWidget.prototype.clear = function () {
+    var cm = this.doc.cm, ws = this.line.widgets, line = this.line, no = lineNo(line);
+    if (no == null || !ws) { return }
+    for (var i = 0; i < ws.length; ++i) { if (ws[i] == this) { ws.splice(i--, 1); } }
+    if (!ws.length) { line.widgets = null; }
+    var height = widgetHeight(this);
+    updateLineHeight(line, Math.max(0, line.height - height));
+    if (cm) {
+      runInOp(cm, function () {
+        adjustScrollWhenAboveVisible(cm, line, -height);
+        regLineChange(cm, no, "widget");
+      });
+      signalLater(cm, "lineWidgetCleared", cm, this, no);
+    }
+  };
+
+  LineWidget.prototype.changed = function () {
+      var this$1 = this;
+
+    var oldH = this.height, cm = this.doc.cm, line = this.line;
+    this.height = null;
+    var diff = widgetHeight(this) - oldH;
+    if (!diff) { return }
+    if (!lineIsHidden(this.doc, line)) { updateLineHeight(line, line.height + diff); }
+    if (cm) {
+      runInOp(cm, function () {
+        cm.curOp.forceUpdate = true;
+        adjustScrollWhenAboveVisible(cm, line, diff);
+        signalLater(cm, "lineWidgetChanged", cm, this$1, lineNo(line));
+      });
+    }
+  };
+  eventMixin(LineWidget);
+
+  function adjustScrollWhenAboveVisible(cm, line, diff) {
+    if (heightAtLine(line) < ((cm.curOp && cm.curOp.scrollTop) || cm.doc.scrollTop))
+      { addToScrollTop(cm, diff); }
+  }
+
+  function addLineWidget(doc, handle, node, options) {
+    var widget = new LineWidget(doc, node, options);
+    var cm = doc.cm;
+    if (cm && widget.noHScroll) { cm.display.alignWidgets = true; }
+    changeLine(doc, handle, "widget", function (line) {
+      var widgets = line.widgets || (line.widgets = []);
+      if (widget.insertAt == null) { widgets.push(widget); }
+      else { widgets.splice(Math.min(widgets.length, Math.max(0, widget.insertAt)), 0, widget); }
+      widget.line = line;
+      if (cm && !lineIsHidden(doc, line)) {
+        var aboveVisible = heightAtLine(line) < doc.scrollTop;
+        updateLineHeight(line, line.height + widgetHeight(widget));
+        if (aboveVisible) { addToScrollTop(cm, widget.height); }
+        cm.curOp.forceUpdate = true;
+      }
+      return true
+    });
+    if (cm) { signalLater(cm, "lineWidgetAdded", cm, widget, typeof handle == "number" ? handle : lineNo(handle)); }
+    return widget
+  }
+
+  // TEXTMARKERS
+
+  // Created with markText and setBookmark methods. A TextMarker is a
+  // handle that can be used to clear or find a marked position in the
+  // document. Line objects hold arrays (markedSpans) containing
+  // {from, to, marker} object pointing to such marker objects, and
+  // indicating that such a marker is present on that line. Multiple
+  // lines may point to the same marker when it spans across lines.
+  // The spans will have null for their from/to properties when the
+  // marker continues beyond the start/end of the line. Markers have
+  // links back to the lines they currently touch.
+
+  // Collapsed markers have unique ids, in order to be able to order
+  // them, which is needed for uniquely determining an outer marker
+  // when they overlap (they may nest, but not partially overlap).
+  var nextMarkerId = 0;
+
+  var TextMarker = function(doc, type) {
+    this.lines = [];
+    this.type = type;
+    this.doc = doc;
+    this.id = ++nextMarkerId;
+  };
+
+  // Clear the marker.
+  TextMarker.prototype.clear = function () {
+    if (this.explicitlyCleared) { return }
+    var cm = this.doc.cm, withOp = cm && !cm.curOp;
+    if (withOp) { startOperation(cm); }
+    if (hasHandler(this, "clear")) {
+      var found = this.find();
+      if (found) { signalLater(this, "clear", found.from, found.to); }
+    }
+    var min = null, max = null;
+    for (var i = 0; i < this.lines.length; ++i) {
+      var line = this.lines[i];
+      var span = getMarkedSpanFor(line.markedSpans, this);
+      if (cm && !this.collapsed) { regLineChange(cm, lineNo(line), "text"); }
+      else if (cm) {
+        if (span.to != null) { max = lineNo(line); }
+        if (span.from != null) { min = lineNo(line); }
+      }
+      line.markedSpans = removeMarkedSpan(line.markedSpans, span);
+      if (span.from == null && this.collapsed && !lineIsHidden(this.doc, line) && cm)
+        { updateLineHeight(line, textHeight(cm.display)); }
+    }
+    if (cm && this.collapsed && !cm.options.lineWrapping) { for (var i$1 = 0; i$1 < this.lines.length; ++i$1) {
+      var visual = visualLine(this.lines[i$1]), len = lineLength(visual);
+      if (len > cm.display.maxLineLength) {
+        cm.display.maxLine = visual;
+        cm.display.maxLineLength = len;
+        cm.display.maxLineChanged = true;
+      }
+    } }
+
+    if (min != null && cm && this.collapsed) { regChange(cm, min, max + 1); }
+    this.lines.length = 0;
+    this.explicitlyCleared = true;
+    if (this.atomic && this.doc.cantEdit) {
+      this.doc.cantEdit = false;
+      if (cm) { reCheckSelection(cm.doc); }
+    }
+    if (cm) { signalLater(cm, "markerCleared", cm, this, min, max); }
+    if (withOp) { endOperation(cm); }
+    if (this.parent) { this.parent.clear(); }
+  };
+
+  // Find the position of the marker in the document. Returns a {from,
+  // to} object by default. Side can be passed to get a specific side
+  // -- 0 (both), -1 (left), or 1 (right). When lineObj is true, the
+  // Pos objects returned contain a line object, rather than a line
+  // number (used to prevent looking up the same line twice).
+  TextMarker.prototype.find = function (side, lineObj) {
+    if (side == null && this.type == "bookmark") { side = 1; }
+    var from, to;
+    for (var i = 0; i < this.lines.length; ++i) {
+      var line = this.lines[i];
+      var span = getMarkedSpanFor(line.markedSpans, this);
+      if (span.from != null) {
+        from = Pos(lineObj ? line : lineNo(line), span.from);
+        if (side == -1) { return from }
+      }
+      if (span.to != null) {
+        to = Pos(lineObj ? line : lineNo(line), span.to);
+        if (side == 1) { return to }
+      }
+    }
+    return from && {from: from, to: to}
+  };
+
+  // Signals that the marker's widget changed, and surrounding layout
+  // should be recomputed.
+  TextMarker.prototype.changed = function () {
+      var this$1 = this;
+
+    var pos = this.find(-1, true), widget = this, cm = this.doc.cm;
+    if (!pos || !cm) { return }
+    runInOp(cm, function () {
+      var line = pos.line, lineN = lineNo(pos.line);
+      var view = findViewForLine(cm, lineN);
+      if (view) {
+        clearLineMeasurementCacheFor(view);
+        cm.curOp.selectionChanged = cm.curOp.forceUpdate = true;
+      }
+      cm.curOp.updateMaxLine = true;
+      if (!lineIsHidden(widget.doc, line) && widget.height != null) {
+        var oldHeight = widget.height;
+        widget.height = null;
+        var dHeight = widgetHeight(widget) - oldHeight;
+        if (dHeight)
+          { updateLineHeight(line, line.height + dHeight); }
+      }
+      signalLater(cm, "markerChanged", cm, this$1);
+    });
+  };
+
+  TextMarker.prototype.attachLine = function (line) {
+    if (!this.lines.length && this.doc.cm) {
+      var op = this.doc.cm.curOp;
+      if (!op.maybeHiddenMarkers || indexOf(op.maybeHiddenMarkers, this) == -1)
+        { (op.maybeUnhiddenMarkers || (op.maybeUnhiddenMarkers = [])).push(this); }
+    }
+    this.lines.push(line);
+  };
+
+  TextMarker.prototype.detachLine = function (line) {
+    this.lines.splice(indexOf(this.lines, line), 1);
+    if (!this.lines.length && this.doc.cm) {
+      var op = this.doc.cm.curOp
+      ;(op.maybeHiddenMarkers || (op.maybeHiddenMarkers = [])).push(this);
+    }
+  };
+  eventMixin(TextMarker);
+
+  // Create a marker, wire it up to the right lines, and
+  function markText(doc, from, to, options, type) {
+    // Shared markers (across linked documents) are handled separately
+    // (markTextShared will call out to this again, once per
+    // document).
+    if (options && options.shared) { return markTextShared(doc, from, to, options, type) }
+    // Ensure we are in an operation.
+    if (doc.cm && !doc.cm.curOp) { return operation(doc.cm, markText)(doc, from, to, options, type) }
+
+    var marker = new TextMarker(doc, type), diff = cmp(from, to);
+    if (options) { copyObj(options, marker, false); }
+    // Don't connect empty markers unless clearWhenEmpty is false
+    if (diff > 0 || diff == 0 && marker.clearWhenEmpty !== false)
+      { return marker }
+    if (marker.replacedWith) {
+      // Showing up as a widget implies collapsed (widget replaces text)
+      marker.collapsed = true;
+      marker.widgetNode = eltP("span", [marker.replacedWith], "CodeMirror-widget");
+      if (!options.handleMouseEvents) { marker.widgetNode.setAttribute("cm-ignore-events", "true"); }
+      if (options.insertLeft) { marker.widgetNode.insertLeft = true; }
+    }
+    if (marker.collapsed) {
+      if (conflictingCollapsedRange(doc, from.line, from, to, marker) ||
+          from.line != to.line && conflictingCollapsedRange(doc, to.line, from, to, marker))
+        { throw new Error("Inserting collapsed marker partially overlapping an existing one") }
+      seeCollapsedSpans();
+    }
+
+    if (marker.addToHistory)
+      { addChangeToHistory(doc, {from: from, to: to, origin: "markText"}, doc.sel, NaN); }
+
+    var curLine = from.line, cm = doc.cm, updateMaxLine;
+    doc.iter(curLine, to.line + 1, function (line) {
+      if (cm && marker.collapsed && !cm.options.lineWrapping && visualLine(line) == cm.display.maxLine)
+        { updateMaxLine = true; }
+      if (marker.collapsed && curLine != from.line) { updateLineHeight(line, 0); }
+      addMarkedSpan(line, new MarkedSpan(marker,
+                                         curLine == from.line ? from.ch : null,
+                                         curLine == to.line ? to.ch : null));
+      ++curLine;
+    });
+    // lineIsHidden depends on the presence of the spans, so needs a second pass
+    if (marker.collapsed) { doc.iter(from.line, to.line + 1, function (line) {
+      if (lineIsHidden(doc, line)) { updateLineHeight(line, 0); }
+    }); }
+
+    if (marker.clearOnEnter) { on(marker, "beforeCursorEnter", function () { return marker.clear(); }); }
+
+    if (marker.readOnly) {
+      seeReadOnlySpans();
+      if (doc.history.done.length || doc.history.undone.length)
+        { doc.clearHistory(); }
+    }
+    if (marker.collapsed) {
+      marker.id = ++nextMarkerId;
+      marker.atomic = true;
+    }
+    if (cm) {
+      // Sync editor state
+      if (updateMaxLine) { cm.curOp.updateMaxLine = true; }
+      if (marker.collapsed)
+        { regChange(cm, from.line, to.line + 1); }
+      else if (marker.className || marker.startStyle || marker.endStyle || marker.css ||
+               marker.attributes || marker.title)
+        { for (var i = from.line; i <= to.line; i++) { regLineChange(cm, i, "text"); } }
+      if (marker.atomic) { reCheckSelection(cm.doc); }
+      signalLater(cm, "markerAdded", cm, marker);
+    }
+    return marker
+  }
+
+  // SHARED TEXTMARKERS
+
+  // A shared marker spans multiple linked documents. It is
+  // implemented as a meta-marker-object controlling multiple normal
+  // markers.
+  var SharedTextMarker = function(markers, primary) {
+    this.markers = markers;
+    this.primary = primary;
+    for (var i = 0; i < markers.length; ++i)
+      { markers[i].parent = this; }
+  };
+
+  SharedTextMarker.prototype.clear = function () {
+    if (this.explicitlyCleared) { return }
+    this.explicitlyCleared = true;
+    for (var i = 0; i < this.markers.length; ++i)
+      { this.markers[i].clear(); }
+    signalLater(this, "clear");
+  };
+
+  SharedTextMarker.prototype.find = function (side, lineObj) {
+    return this.primary.find(side, lineObj)
+  };
+  eventMixin(SharedTextMarker);
+
+  function markTextShared(doc, from, to, options, type) {
+    options = copyObj(options);
+    options.shared = false;
+    var markers = [markText(doc, from, to, options, type)], primary = markers[0];
+    var widget = options.widgetNode;
+    linkedDocs(doc, function (doc) {
+      if (widget) { options.widgetNode = widget.cloneNode(true); }
+      markers.push(markText(doc, clipPos(doc, from), clipPos(doc, to), options, type));
+      for (var i = 0; i < doc.linked.length; ++i)
+        { if (doc.linked[i].isParent) { return } }
+      primary = lst(markers);
+    });
+    return new SharedTextMarker(markers, primary)
+  }
+
+  function findSharedMarkers(doc) {
+    return doc.findMarks(Pos(doc.first, 0), doc.clipPos(Pos(doc.lastLine())), function (m) { return m.parent; })
+  }
+
+  function copySharedMarkers(doc, markers) {
+    for (var i = 0; i < markers.length; i++) {
+      var marker = markers[i], pos = marker.find();
+      var mFrom = doc.clipPos(pos.from), mTo = doc.clipPos(pos.to);
+      if (cmp(mFrom, mTo)) {
+        var subMark = markText(doc, mFrom, mTo, marker.primary, marker.primary.type);
+        marker.markers.push(subMark);
+        subMark.parent = marker;
+      }
+    }
+  }
+
+  function detachSharedMarkers(markers) {
+    var loop = function ( i ) {
+      var marker = markers[i], linked = [marker.primary.doc];
+      linkedDocs(marker.primary.doc, function (d) { return linked.push(d); });
+      for (var j = 0; j < marker.markers.length; j++) {
+        var subMarker = marker.markers[j];
+        if (indexOf(linked, subMarker.doc) == -1) {
+          subMarker.parent = null;
+          marker.markers.splice(j--, 1);
+        }
+      }
+    };
+
+    for (var i = 0; i < markers.length; i++) loop( i );
+  }
+
+  var nextDocId = 0;
+  var Doc = function(text, mode, firstLine, lineSep, direction) {
+    if (!(this instanceof Doc)) { return new Doc(text, mode, firstLine, lineSep, direction) }
+    if (firstLine == null) { firstLine = 0; }
+
+    BranchChunk.call(this, [new LeafChunk([new Line("", null)])]);
+    this.first = firstLine;
+    this.scrollTop = this.scrollLeft = 0;
+    this.cantEdit = false;
+    this.cleanGeneration = 1;
+    this.modeFrontier = this.highlightFrontier = firstLine;
+    var start = Pos(firstLine, 0);
+    this.sel = simpleSelection(start);
+    this.history = new History(null);
+    this.id = ++nextDocId;
+    this.modeOption = mode;
+    this.lineSep = lineSep;
+    this.direction = (direction == "rtl") ? "rtl" : "ltr";
+    this.extend = false;
+
+    if (typeof text == "string") { text = this.splitLines(text); }
+    updateDoc(this, {from: start, to: start, text: text});
+    setSelection(this, simpleSelection(start), sel_dontScroll);
+  };
+
+  Doc.prototype = createObj(BranchChunk.prototype, {
+    constructor: Doc,
+    // Iterate over the document. Supports two forms -- with only one
+    // argument, it calls that for each line in the document. With
+    // three, it iterates over the range given by the first two (with
+    // the second being non-inclusive).
+    iter: function(from, to, op) {
+      if (op) { this.iterN(from - this.first, to - from, op); }
+      else { this.iterN(this.first, this.first + this.size, from); }
+    },
+
+    // Non-public interface for adding and removing lines.
+    insert: function(at, lines) {
+      var height = 0;
+      for (var i = 0; i < lines.length; ++i) { height += lines[i].height; }
+      this.insertInner(at - this.first, lines, height);
+    },
+    remove: function(at, n) { this.removeInner(at - this.first, n); },
+
+    // From here, the methods are part of the public interface. Most
+    // are also available from CodeMirror (editor) instances.
+
+    getValue: function(lineSep) {
+      var lines = getLines(this, this.first, this.first + this.size);
+      if (lineSep === false) { return lines }
+      return lines.join(lineSep || this.lineSeparator())
+    },
+    setValue: docMethodOp(function(code) {
+      var top = Pos(this.first, 0), last = this.first + this.size - 1;
+      makeChange(this, {from: top, to: Pos(last, getLine(this, last).text.length),
+                        text: this.splitLines(code), origin: "setValue", full: true}, true);
+      if (this.cm) { scrollToCoords(this.cm, 0, 0); }
+      setSelection(this, simpleSelection(top), sel_dontScroll);
+    }),
+    replaceRange: function(code, from, to, origin) {
+      from = clipPos(this, from);
+      to = to ? clipPos(this, to) : from;
+      replaceRange(this, code, from, to, origin);
+    },
+    getRange: function(from, to, lineSep) {
+      var lines = getBetween(this, clipPos(this, from), clipPos(this, to));
+      if (lineSep === false) { return lines }
+      return lines.join(lineSep || this.lineSeparator())
+    },
+
+    getLine: function(line) {var l = this.getLineHandle(line); return l && l.text},
+
+    getLineHandle: function(line) {if (isLine(this, line)) { return getLine(this, line) }},
+    getLineNumber: function(line) {return lineNo(line)},
+
+    getLineHandleVisualStart: function(line) {
+      if (typeof line == "number") { line = getLine(this, line); }
+      return visualLine(line)
+    },
+
+    lineCount: function() {return this.size},
+    firstLine: function() {return this.first},
+    lastLine: function() {return this.first + this.size - 1},
+
+    clipPos: function(pos) {return clipPos(this, pos)},
+
+    getCursor: function(start) {
+      var range = this.sel.primary(), pos;
+      if (start == null || start == "head") { pos = range.head; }
+      else if (start == "anchor") { pos = range.anchor; }
+      else if (start == "end" || start == "to" || start === false) { pos = range.to(); }
+      else { pos = range.from(); }
+      return pos
+    },
+    listSelections: function() { return this.sel.ranges },
+    somethingSelected: function() {return this.sel.somethingSelected()},
+
+    setCursor: docMethodOp(function(line, ch, options) {
+      setSimpleSelection(this, clipPos(this, typeof line == "number" ? Pos(line, ch || 0) : line), null, options);
+    }),
+    setSelection: docMethodOp(function(anchor, head, options) {
+      setSimpleSelection(this, clipPos(this, anchor), clipPos(this, head || anchor), options);
+    }),
+    extendSelection: docMethodOp(function(head, other, options) {
+      extendSelection(this, clipPos(this, head), other && clipPos(this, other), options);
+    }),
+    extendSelections: docMethodOp(function(heads, options) {
+      extendSelections(this, clipPosArray(this, heads), options);
+    }),
+    extendSelectionsBy: docMethodOp(function(f, options) {
+      var heads = map(this.sel.ranges, f);
+      extendSelections(this, clipPosArray(this, heads), options);
+    }),
+    setSelections: docMethodOp(function(ranges, primary, options) {
+      if (!ranges.length) { return }
+      var out = [];
+      for (var i = 0; i < ranges.length; i++)
+        { out[i] = new Range(clipPos(this, ranges[i].anchor),
+                           clipPos(this, ranges[i].head)); }
+      if (primary == null) { primary = Math.min(ranges.length - 1, this.sel.primIndex); }
+      setSelection(this, normalizeSelection(this.cm, out, primary), options);
+    }),
+    addSelection: docMethodOp(function(anchor, head, options) {
+      var ranges = this.sel.ranges.slice(0);
+      ranges.push(new Range(clipPos(this, anchor), clipPos(this, head || anchor)));
+      setSelection(this, normalizeSelection(this.cm, ranges, ranges.length - 1), options);
+    }),
+
+    getSelection: function(lineSep) {
+      var ranges = this.sel.ranges, lines;
+      for (var i = 0; i < ranges.length; i++) {
+        var sel = getBetween(this, ranges[i].from(), ranges[i].to());
+        lines = lines ? lines.concat(sel) : sel;
+      }
+      if (lineSep === false) { return lines }
+      else { return lines.join(lineSep || this.lineSeparator()) }
+    },
+    getSelections: function(lineSep) {
+      var parts = [], ranges = this.sel.ranges;
+      for (var i = 0; i < ranges.length; i++) {
+        var sel = getBetween(this, ranges[i].from(), ranges[i].to());
+        if (lineSep !== false) { sel = sel.join(lineSep || this.lineSeparator()); }
+        parts[i] = sel;
+      }
+      return parts
+    },
+    replaceSelection: function(code, collapse, origin) {
+      var dup = [];
+      for (var i = 0; i < this.sel.ranges.length; i++)
+        { dup[i] = code; }
+      this.replaceSelections(dup, collapse, origin || "+input");
+    },
+    replaceSelections: docMethodOp(function(code, collapse, origin) {
+      var changes = [], sel = this.sel;
+      for (var i = 0; i < sel.ranges.length; i++) {
+        var range = sel.ranges[i];
+        changes[i] = {from: range.from(), to: range.to(), text: this.splitLines(code[i]), origin: origin};
+      }
+      var newSel = collapse && collapse != "end" && computeReplacedSel(this, changes, collapse);
+      for (var i$1 = changes.length - 1; i$1 >= 0; i$1--)
+        { makeChange(this, changes[i$1]); }
+      if (newSel) { setSelectionReplaceHistory(this, newSel); }
+      else if (this.cm) { ensureCursorVisible(this.cm); }
+    }),
+    undo: docMethodOp(function() {makeChangeFromHistory(this, "undo");}),
+    redo: docMethodOp(function() {makeChangeFromHistory(this, "redo");}),
+    undoSelection: docMethodOp(function() {makeChangeFromHistory(this, "undo", true);}),
+    redoSelection: docMethodOp(function() {makeChangeFromHistory(this, "redo", true);}),
+
+    setExtending: function(val) {this.extend = val;},
+    getExtending: function() {return this.extend},
+
+    historySize: function() {
+      var hist = this.history, done = 0, undone = 0;
+      for (var i = 0; i < hist.done.length; i++) { if (!hist.done[i].ranges) { ++done; } }
+      for (var i$1 = 0; i$1 < hist.undone.length; i$1++) { if (!hist.undone[i$1].ranges) { ++undone; } }
+      return {undo: done, redo: undone}
+    },
+    clearHistory: function() {
+      var this$1 = this;
+
+      this.history = new History(this.history.maxGeneration);
+      linkedDocs(this, function (doc) { return doc.history = this$1.history; }, true);
+    },
+
+    markClean: function() {
+      this.cleanGeneration = this.changeGeneration(true);
+    },
+    changeGeneration: function(forceSplit) {
+      if (forceSplit)
+        { this.history.lastOp = this.history.lastSelOp = this.history.lastOrigin = null; }
+      return this.history.generation
+    },
+    isClean: function (gen) {
+      return this.history.generation == (gen || this.cleanGeneration)
+    },
+
+    getHistory: function() {
+      return {done: copyHistoryArray(this.history.done),
+              undone: copyHistoryArray(this.history.undone)}
+    },
+    setHistory: function(histData) {
+      var hist = this.history = new History(this.history.maxGeneration);
+      hist.done = copyHistoryArray(histData.done.slice(0), null, true);
+      hist.undone = copyHistoryArray(histData.undone.slice(0), null, true);
+    },
+
+    setGutterMarker: docMethodOp(function(line, gutterID, value) {
+      return changeLine(this, line, "gutter", function (line) {
+        var markers = line.gutterMarkers || (line.gutterMarkers = {});
+        markers[gutterID] = value;
+        if (!value && isEmpty(markers)) { line.gutterMarkers = null; }
+        return true
+      })
+    }),
+
+    clearGutter: docMethodOp(function(gutterID) {
+      var this$1 = this;
+
+      this.iter(function (line) {
+        if (line.gutterMarkers && line.gutterMarkers[gutterID]) {
+          changeLine(this$1, line, "gutter", function () {
+            line.gutterMarkers[gutterID] = null;
+            if (isEmpty(line.gutterMarkers)) { line.gutterMarkers = null; }
+            return true
+          });
+        }
+      });
+    }),
+
+    lineInfo: function(line) {
+      var n;
+      if (typeof line == "number") {
+        if (!isLine(this, line)) { return null }
+        n = line;
+        line = getLine(this, line);
+        if (!line) { return null }
+      } else {
+        n = lineNo(line);
+        if (n == null) { return null }
+      }
+      return {line: n, handle: line, text: line.text, gutterMarkers: line.gutterMarkers,
+              textClass: line.textClass, bgClass: line.bgClass, wrapClass: line.wrapClass,
+              widgets: line.widgets}
+    },
+
+    addLineClass: docMethodOp(function(handle, where, cls) {
+      return changeLine(this, handle, where == "gutter" ? "gutter" : "class", function (line) {
+        var prop = where == "text" ? "textClass"
+                 : where == "background" ? "bgClass"
+                 : where == "gutter" ? "gutterClass" : "wrapClass";
+        if (!line[prop]) { line[prop] = cls; }
+        else if (classTest(cls).test(line[prop])) { return false }
+        else { line[prop] += " " + cls; }
+        return true
+      })
+    }),
+    removeLineClass: docMethodOp(function(handle, where, cls) {
+      return changeLine(this, handle, where == "gutter" ? "gutter" : "class", function (line) {
+        var prop = where == "text" ? "textClass"
+                 : where == "background" ? "bgClass"
+                 : where == "gutter" ? "gutterClass" : "wrapClass";
+        var cur = line[prop];
+        if (!cur) { return false }
+        else if (cls == null) { line[prop] = null; }
+        else {
+          var found = cur.match(classTest(cls));
+          if (!found) { return false }
+          var end = found.index + found[0].length;
+          line[prop] = cur.slice(0, found.index) + (!found.index || end == cur.length ? "" : " ") + cur.slice(end) || null;
+        }
+        return true
+      })
+    }),
+
+    addLineWidget: docMethodOp(function(handle, node, options) {
+      return addLineWidget(this, handle, node, options)
+    }),
+    removeLineWidget: function(widget) { widget.clear(); },
+
+    markText: function(from, to, options) {
+      return markText(this, clipPos(this, from), clipPos(this, to), options, options && options.type || "range")
+    },
+    setBookmark: function(pos, options) {
+      var realOpts = {replacedWith: options && (options.nodeType == null ? options.widget : options),
+                      insertLeft: options && options.insertLeft,
+                      clearWhenEmpty: false, shared: options && options.shared,
+                      handleMouseEvents: options && options.handleMouseEvents};
+      pos = clipPos(this, pos);
+      return markText(this, pos, pos, realOpts, "bookmark")
+    },
+    findMarksAt: function(pos) {
+      pos = clipPos(this, pos);
+      var markers = [], spans = getLine(this, pos.line).markedSpans;
+      if (spans) { for (var i = 0; i < spans.length; ++i) {
+        var span = spans[i];
+        if ((span.from == null || span.from <= pos.ch) &&
+            (span.to == null || span.to >= pos.ch))
+          { markers.push(span.marker.parent || span.marker); }
+      } }
+      return markers
+    },
+    findMarks: function(from, to, filter) {
+      from = clipPos(this, from); to = clipPos(this, to);
+      var found = [], lineNo = from.line;
+      this.iter(from.line, to.line + 1, function (line) {
+        var spans = line.markedSpans;
+        if (spans) { for (var i = 0; i < spans.length; i++) {
+          var span = spans[i];
+          if (!(span.to != null && lineNo == from.line && from.ch >= span.to ||
+                span.from == null && lineNo != from.line ||
+                span.from != null && lineNo == to.line && span.from >= to.ch) &&
+              (!filter || filter(span.marker)))
+            { found.push(span.marker.parent || span.marker); }
+        } }
+        ++lineNo;
+      });
+      return found
+    },
+    getAllMarks: function() {
+      var markers = [];
+      this.iter(function (line) {
+        var sps = line.markedSpans;
+        if (sps) { for (var i = 0; i < sps.length; ++i)
+          { if (sps[i].from != null) { markers.push(sps[i].marker); } } }
+      });
+      return markers
+    },
+
+    posFromIndex: function(off) {
+      var ch, lineNo = this.first, sepSize = this.lineSeparator().length;
+      this.iter(function (line) {
+        var sz = line.text.length + sepSize;
+        if (sz > off) { ch = off; return true }
+        off -= sz;
+        ++lineNo;
+      });
+      return clipPos(this, Pos(lineNo, ch))
+    },
+    indexFromPos: function (coords) {
+      coords = clipPos(this, coords);
+      var index = coords.ch;
+      if (coords.line < this.first || coords.ch < 0) { return 0 }
+      var sepSize = this.lineSeparator().length;
+      this.iter(this.first, coords.line, function (line) { // iter aborts when callback returns a truthy value
+        index += line.text.length + sepSize;
+      });
+      return index
+    },
+
+    copy: function(copyHistory) {
+      var doc = new Doc(getLines(this, this.first, this.first + this.size),
+                        this.modeOption, this.first, this.lineSep, this.direction);
+      doc.scrollTop = this.scrollTop; doc.scrollLeft = this.scrollLeft;
+      doc.sel = this.sel;
+      doc.extend = false;
+      if (copyHistory) {
+        doc.history.undoDepth = this.history.undoDepth;
+        doc.setHistory(this.getHistory());
+      }
+      return doc
+    },
+
+    linkedDoc: function(options) {
+      if (!options) { options = {}; }
+      var from = this.first, to = this.first + this.size;
+      if (options.from != null && options.from > from) { from = options.from; }
+      if (options.to != null && options.to < to) { to = options.to; }
+      var copy = new Doc(getLines(this, from, to), options.mode || this.modeOption, from, this.lineSep, this.direction);
+      if (options.sharedHist) { copy.history = this.history
+      ; }(this.linked || (this.linked = [])).push({doc: copy, sharedHist: options.sharedHist});
+      copy.linked = [{doc: this, isParent: true, sharedHist: options.sharedHist}];
+      copySharedMarkers(copy, findSharedMarkers(this));
+      return copy
+    },
+    unlinkDoc: function(other) {
+      if (other instanceof CodeMirror) { other = other.doc; }
+      if (this.linked) { for (var i = 0; i < this.linked.length; ++i) {
+        var link = this.linked[i];
+        if (link.doc != other) { continue }
+        this.linked.splice(i, 1);
+        other.unlinkDoc(this);
+        detachSharedMarkers(findSharedMarkers(this));
+        break
+      } }
+      // If the histories were shared, split them again
+      if (other.history == this.history) {
+        var splitIds = [other.id];
+        linkedDocs(other, function (doc) { return splitIds.push(doc.id); }, true);
+        other.history = new History(null);
+        other.history.done = copyHistoryArray(this.history.done, splitIds);
+        other.history.undone = copyHistoryArray(this.history.undone, splitIds);
+      }
+    },
+    iterLinkedDocs: function(f) {linkedDocs(this, f);},
+
+    getMode: function() {return this.mode},
+    getEditor: function() {return this.cm},
+
+    splitLines: function(str) {
+      if (this.lineSep) { return str.split(this.lineSep) }
+      return splitLinesAuto(str)
+    },
+    lineSeparator: function() { return this.lineSep || "\n" },
+
+    setDirection: docMethodOp(function (dir) {
+      if (dir != "rtl") { dir = "ltr"; }
+      if (dir == this.direction) { return }
+      this.direction = dir;
+      this.iter(function (line) { return line.order = null; });
+      if (this.cm) { directionChanged(this.cm); }
+    })
+  });
+
+  // Public alias.
+  Doc.prototype.eachLine = Doc.prototype.iter;
+
+  // Kludge to work around strange IE behavior where it'll sometimes
+  // re-fire a series of drag-related events right after the drop (#1551)
+  var lastDrop = 0;
+
+  function onDrop(e) {
+    var cm = this;
+    clearDragCursor(cm);
+    if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e))
+      { return }
+    e_preventDefault(e);
+    if (ie) { lastDrop = +new Date; }
+    var pos = posFromMouse(cm, e, true), files = e.dataTransfer.files;
+    if (!pos || cm.isReadOnly()) { return }
+    // Might be a file drop, in which case we simply extract the text
+    // and insert it.
+    if (files && files.length && window.FileReader && window.File) {
+      var n = files.length, text = Array(n), read = 0;
+      var markAsReadAndPasteIfAllFilesAreRead = function () {
+        if (++read == n) {
+          operation(cm, function () {
+            pos = clipPos(cm.doc, pos);
+            var change = {from: pos, to: pos,
+                          text: cm.doc.splitLines(
+                              text.filter(function (t) { return t != null; }).join(cm.doc.lineSeparator())),
+                          origin: "paste"};
+            makeChange(cm.doc, change);
+            setSelectionReplaceHistory(cm.doc, simpleSelection(clipPos(cm.doc, pos), clipPos(cm.doc, changeEnd(change))));
+          })();
+        }
+      };
+      var readTextFromFile = function (file, i) {
+        if (cm.options.allowDropFileTypes &&
+            indexOf(cm.options.allowDropFileTypes, file.type) == -1) {
+          markAsReadAndPasteIfAllFilesAreRead();
+          return
+        }
+        var reader = new FileReader;
+        reader.onerror = function () { return markAsReadAndPasteIfAllFilesAreRead(); };
+        reader.onload = function () {
+          var content = reader.result;
+          if (/[\x00-\x08\x0e-\x1f]{2}/.test(content)) {
+            markAsReadAndPasteIfAllFilesAreRead();
+            return
+          }
+          text[i] = content;
+          markAsReadAndPasteIfAllFilesAreRead();
+        };
+        reader.readAsText(file);
+      };
+      for (var i = 0; i < files.length; i++) { readTextFromFile(files[i], i); }
+    } else { // Normal drop
+      // Don't do a replace if the drop happened inside of the selected text.
+      if (cm.state.draggingText && cm.doc.sel.contains(pos) > -1) {
+        cm.state.draggingText(e);
+        // Ensure the editor is re-focused
+        setTimeout(function () { return cm.display.input.focus(); }, 20);
+        return
+      }
+      try {
+        var text$1 = e.dataTransfer.getData("Text");
+        if (text$1) {
+          var selected;
+          if (cm.state.draggingText && !cm.state.draggingText.copy)
+            { selected = cm.listSelections(); }
+          setSelectionNoUndo(cm.doc, simpleSelection(pos, pos));
+          if (selected) { for (var i$1 = 0; i$1 < selected.length; ++i$1)
+            { replaceRange(cm.doc, "", selected[i$1].anchor, selected[i$1].head, "drag"); } }
+          cm.replaceSelection(text$1, "around", "paste");
+          cm.display.input.focus();
+        }
+      }
+      catch(e$1){}
+    }
+  }
+
+  function onDragStart(cm, e) {
+    if (ie && (!cm.state.draggingText || +new Date - lastDrop < 100)) { e_stop(e); return }
+    if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e)) { return }
+
+    e.dataTransfer.setData("Text", cm.getSelection());
+    e.dataTransfer.effectAllowed = "copyMove";
+
+    // Use dummy image instead of default browsers image.
+    // Recent Safari (~6.0.2) have a tendency to segfault when this happens, so we don't do it there.
+    if (e.dataTransfer.setDragImage && !safari) {
+      var img = elt("img", null, null, "position: fixed; left: 0; top: 0;");
+      img.src = "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==";
+      if (presto) {
+        img.width = img.height = 1;
+        cm.display.wrapper.appendChild(img);
+        // Force a relayout, or Opera won't use our image for some obscure reason
+        img._top = img.offsetTop;
+      }
+      e.dataTransfer.setDragImage(img, 0, 0);
+      if (presto) { img.parentNode.removeChild(img); }
+    }
+  }
+
+  function onDragOver(cm, e) {
+    var pos = posFromMouse(cm, e);
+    if (!pos) { return }
+    var frag = document.createDocumentFragment();
+    drawSelectionCursor(cm, pos, frag);
+    if (!cm.display.dragCursor) {
+      cm.display.dragCursor = elt("div", null, "CodeMirror-cursors CodeMirror-dragcursors");
+      cm.display.lineSpace.insertBefore(cm.display.dragCursor, cm.display.cursorDiv);
+    }
+    removeChildrenAndAdd(cm.display.dragCursor, frag);
+  }
+
+  function clearDragCursor(cm) {
+    if (cm.display.dragCursor) {
+      cm.display.lineSpace.removeChild(cm.display.dragCursor);
+      cm.display.dragCursor = null;
+    }
+  }
+
+  // These must be handled carefully, because naively registering a
+  // handler for each editor will cause the editors to never be
+  // garbage collected.
+
+  function forEachCodeMirror(f) {
+    if (!document.getElementsByClassName) { return }
+    var byClass = document.getElementsByClassName("CodeMirror"), editors = [];
+    for (var i = 0; i < byClass.length; i++) {
+      var cm = byClass[i].CodeMirror;
+      if (cm) { editors.push(cm); }
+    }
+    if (editors.length) { editors[0].operation(function () {
+      for (var i = 0; i < editors.length; i++) { f(editors[i]); }
+    }); }
+  }
+
+  var globalsRegistered = false;
+  function ensureGlobalHandlers() {
+    if (globalsRegistered) { return }
+    registerGlobalHandlers();
+    globalsRegistered = true;
+  }
+  function registerGlobalHandlers() {
+    // When the window resizes, we need to refresh active editors.
+    var resizeTimer;
+    on(window, "resize", function () {
+      if (resizeTimer == null) { resizeTimer = setTimeout(function () {
+        resizeTimer = null;
+        forEachCodeMirror(onResize);
+      }, 100); }
+    });
+    // When the window loses focus, we want to show the editor as blurred
+    on(window, "blur", function () { return forEachCodeMirror(onBlur); });
+  }
+  // Called when the window resizes
+  function onResize(cm) {
+    var d = cm.display;
+    // Might be a text scaling operation, clear size caches.
+    d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = null;
+    d.scrollbarsClipped = false;
+    cm.setSize();
+  }
+
+  var keyNames = {
+    3: "Pause", 8: "Backspace", 9: "Tab", 13: "Enter", 16: "Shift", 17: "Ctrl", 18: "Alt",
+    19: "Pause", 20: "CapsLock", 27: "Esc", 32: "Space", 33: "PageUp", 34: "PageDown", 35: "End",
+    36: "Home", 37: "Left", 38: "Up", 39: "Right", 40: "Down", 44: "PrintScrn", 45: "Insert",
+    46: "Delete", 59: ";", 61: "=", 91: "Mod", 92: "Mod", 93: "Mod",
+    106: "*", 107: "=", 109: "-", 110: ".", 111: "/", 145: "ScrollLock",
+    173: "-", 186: ";", 187: "=", 188: ",", 189: "-", 190: ".", 191: "/", 192: "`", 219: "[", 220: "\\",
+    221: "]", 222: "'", 224: "Mod", 63232: "Up", 63233: "Down", 63234: "Left", 63235: "Right", 63272: "Delete",
+    63273: "Home", 63275: "End", 63276: "PageUp", 63277: "PageDown", 63302: "Insert"
+  };
+
+  // Number keys
+  for (var i = 0; i < 10; i++) { keyNames[i + 48] = keyNames[i + 96] = String(i); }
+  // Alphabetic keys
+  for (var i$1 = 65; i$1 <= 90; i$1++) { keyNames[i$1] = String.fromCharCode(i$1); }
+  // Function keys
+  for (var i$2 = 1; i$2 <= 12; i$2++) { keyNames[i$2 + 111] = keyNames[i$2 + 63235] = "F" + i$2; }
+
+  var keyMap = {};
+
+  keyMap.basic = {
+    "Left": "goCharLeft", "Right": "goCharRight", "Up": "goLineUp", "Down": "goLineDown",
+    "End": "goLineEnd", "Home": "goLineStartSmart", "PageUp": "goPageUp", "PageDown": "goPageDown",
+    "Delete": "delCharAfter", "Backspace": "delCharBefore", "Shift-Backspace": "delCharBefore",
+    "Tab": "defaultTab", "Shift-Tab": "indentAuto",
+    "Enter": "newlineAndIndent", "Insert": "toggleOverwrite",
+    "Esc": "singleSelection"
+  };
+  // Note that the save and find-related commands aren't defined by
+  // default. User code or addons can define them. Unknown commands
+  // are simply ignored.
+  keyMap.pcDefault = {
+    "Ctrl-A": "selectAll", "Ctrl-D": "deleteLine", "Ctrl-Z": "undo", "Shift-Ctrl-Z": "redo", "Ctrl-Y": "redo",
+    "Ctrl-Home": "goDocStart", "Ctrl-End": "goDocEnd", "Ctrl-Up": "goLineUp", "Ctrl-Down": "goLineDown",
+    "Ctrl-Left": "goGroupLeft", "Ctrl-Right": "goGroupRight", "Alt-Left": "goLineStart", "Alt-Right": "goLineEnd",
+    "Ctrl-Backspace": "delGroupBefore", "Ctrl-Delete": "delGroupAfter", "Ctrl-S": "save", "Ctrl-F": "find",
+    "Ctrl-G": "findNext", "Shift-Ctrl-G": "findPrev", "Shift-Ctrl-F": "replace", "Shift-Ctrl-R": "replaceAll",
+    "Ctrl-[": "indentLess", "Ctrl-]": "indentMore",
+    "Ctrl-U": "undoSelection", "Shift-Ctrl-U": "redoSelection", "Alt-U": "redoSelection",
+    "fallthrough": "basic"
+  };
+  // Very basic readline/emacs-style bindings, which are standard on Mac.
+  keyMap.emacsy = {
+    "Ctrl-F": "goCharRight", "Ctrl-B": "goCharLeft", "Ctrl-P": "goLineUp", "Ctrl-N": "goLineDown",
+    "Alt-F": "goWordRight", "Alt-B": "goWordLeft", "Ctrl-A": "goLineStart", "Ctrl-E": "goLineEnd",
+    "Ctrl-V": "goPageDown", "Shift-Ctrl-V": "goPageUp", "Ctrl-D": "delCharAfter", "Ctrl-H": "delCharBefore",
+    "Alt-D": "delWordAfter", "Alt-Backspace": "delWordBefore", "Ctrl-K": "killLine", "Ctrl-T": "transposeChars",
+    "Ctrl-O": "openLine"
+  };
+  keyMap.macDefault = {
+    "Cmd-A": "selectAll", "Cmd-D": "deleteLine", "Cmd-Z": "undo", "Shift-Cmd-Z": "redo", "Cmd-Y": "redo",
+    "Cmd-Home": "goDocStart", "Cmd-Up": "goDocStart", "Cmd-End": "goDocEnd", "Cmd-Down": "goDocEnd", "Alt-Left": "goGroupLeft",
+    "Alt-Right": "goGroupRight", "Cmd-Left": "goLineLeft", "Cmd-Right": "goLineRight", "Alt-Backspace": "delGroupBefore",
+    "Ctrl-Alt-Backspace": "delGroupAfter", "Alt-Delete": "delGroupAfter", "Cmd-S": "save", "Cmd-F": "find",
+    "Cmd-G": "findNext", "Shift-Cmd-G": "findPrev", "Cmd-Alt-F": "replace", "Shift-Cmd-Alt-F": "replaceAll",
+    "Cmd-[": "indentLess", "Cmd-]": "indentMore", "Cmd-Backspace": "delWrappedLineLeft", "Cmd-Delete": "delWrappedLineRight",
+    "Cmd-U": "undoSelection", "Shift-Cmd-U": "redoSelection", "Ctrl-Up": "goDocStart", "Ctrl-Down": "goDocEnd",
+    "fallthrough": ["basic", "emacsy"]
+  };
+  keyMap["default"] = mac ? keyMap.macDefault : keyMap.pcDefault;
+
+  // KEYMAP DISPATCH
+
+  function normalizeKeyName(name) {
+    var parts = name.split(/-(?!$)/);
+    name = parts[parts.length - 1];
+    var alt, ctrl, shift, cmd;
+    for (var i = 0; i < parts.length - 1; i++) {
+      var mod = parts[i];
+      if (/^(cmd|meta|m)$/i.test(mod)) { cmd = true; }
+      else if (/^a(lt)?$/i.test(mod)) { alt = true; }
+      else if (/^(c|ctrl|control)$/i.test(mod)) { ctrl = true; }
+      else if (/^s(hift)?$/i.test(mod)) { shift = true; }
+      else { throw new Error("Unrecognized modifier name: " + mod) }
+    }
+    if (alt) { name = "Alt-" + name; }
+    if (ctrl) { name = "Ctrl-" + name; }
+    if (cmd) { name = "Cmd-" + name; }
+    if (shift) { name = "Shift-" + name; }
+    return name
+  }
+
+  // This is a kludge to keep keymaps mostly working as raw objects
+  // (backwards compatibility) while at the same time support features
+  // like normalization and multi-stroke key bindings. It compiles a
+  // new normalized keymap, and then updates the old object to reflect
+  // this.
+  function normalizeKeyMap(keymap) {
+    var copy = {};
+    for (var keyname in keymap) { if (keymap.hasOwnProperty(keyname)) {
+      var value = keymap[keyname];
+      if (/^(name|fallthrough|(de|at)tach)$/.test(keyname)) { continue }
+      if (value == "...") { delete keymap[keyname]; continue }
+
+      var keys = map(keyname.split(" "), normalizeKeyName);
+      for (var i = 0; i < keys.length; i++) {
+        var val = (void 0), name = (void 0);
+        if (i == keys.length - 1) {
+          name = keys.join(" ");
+          val = value;
+        } else {
+          name = keys.slice(0, i + 1).join(" ");
+          val = "...";
+        }
+        var prev = copy[name];
+        if (!prev) { copy[name] = val; }
+        else if (prev != val) { throw new Error("Inconsistent bindings for " + name) }
+      }
+      delete keymap[keyname];
+    } }
+    for (var prop in copy) { keymap[prop] = copy[prop]; }
+    return keymap
+  }
+
+  function lookupKey(key, map, handle, context) {
+    map = getKeyMap(map);
+    var found = map.call ? map.call(key, context) : map[key];
+    if (found === false) { return "nothing" }
+    if (found === "...") { return "multi" }
+    if (found != null && handle(found)) { return "handled" }
+
+    if (map.fallthrough) {
+      if (Object.prototype.toString.call(map.fallthrough) != "[object Array]")
+        { return lookupKey(key, map.fallthrough, handle, context) }
+      for (var i = 0; i < map.fallthrough.length; i++) {
+        var result = lookupKey(key, map.fallthrough[i], handle, context);
+        if (result) { return result }
+      }
+    }
+  }
+
+  // Modifier key presses don't count as 'real' key presses for the
+  // purpose of keymap fallthrough.
+  function isModifierKey(value) {
+    var name = typeof value == "string" ? value : keyNames[value.keyCode];
+    return name == "Ctrl" || name == "Alt" || name == "Shift" || name == "Mod"
+  }
+
+  function addModifierNames(name, event, noShift) {
+    var base = name;
+    if (event.altKey && base != "Alt") { name = "Alt-" + name; }
+    if ((flipCtrlCmd ? event.metaKey : event.ctrlKey) && base != "Ctrl") { name = "Ctrl-" + name; }
+    if ((flipCtrlCmd ? event.ctrlKey : event.metaKey) && base != "Mod") { name = "Cmd-" + name; }
+    if (!noShift && event.shiftKey && base != "Shift") { name = "Shift-" + name; }
+    return name
+  }
+
+  // Look up the name of a key as indicated by an event object.
+  function keyName(event, noShift) {
+    if (presto && event.keyCode == 34 && event["char"]) { return false }
+    var name = keyNames[event.keyCode];
+    if (name == null || event.altGraphKey) { return false }
+    // Ctrl-ScrollLock has keyCode 3, same as Ctrl-Pause,
+    // so we'll use event.code when available (Chrome 48+, FF 38+, Safari 10.1+)
+    if (event.keyCode == 3 && event.code) { name = event.code; }
+    return addModifierNames(name, event, noShift)
+  }
+
+  function getKeyMap(val) {
+    return typeof val == "string" ? keyMap[val] : val
+  }
+
+  // Helper for deleting text near the selection(s), used to implement
+  // backspace, delete, and similar functionality.
+  function deleteNearSelection(cm, compute) {
+    var ranges = cm.doc.sel.ranges, kill = [];
+    // Build up a set of ranges to kill first, merging overlapping
+    // ranges.
+    for (var i = 0; i < ranges.length; i++) {
+      var toKill = compute(ranges[i]);
+      while (kill.length && cmp(toKill.from, lst(kill).to) <= 0) {
+        var replaced = kill.pop();
+        if (cmp(replaced.from, toKill.from) < 0) {
+          toKill.from = replaced.from;
+          break
+        }
+      }
+      kill.push(toKill);
+    }
+    // Next, remove those actual ranges.
+    runInOp(cm, function () {
+      for (var i = kill.length - 1; i >= 0; i--)
+        { replaceRange(cm.doc, "", kill[i].from, kill[i].to, "+delete"); }
+      ensureCursorVisible(cm);
+    });
+  }
+
+  function moveCharLogically(line, ch, dir) {
+    var target = skipExtendingChars(line.text, ch + dir, dir);
+    return target < 0 || target > line.text.length ? null : target
+  }
+
+  function moveLogically(line, start, dir) {
+    var ch = moveCharLogically(line, start.ch, dir);
+    return ch == null ? null : new Pos(start.line, ch, dir < 0 ? "after" : "before")
+  }
+
+  function endOfLine(visually, cm, lineObj, lineNo, dir) {
+    if (visually) {
+      if (cm.doc.direction == "rtl") { dir = -dir; }
+      var order = getOrder(lineObj, cm.doc.direction);
+      if (order) {
+        var part = dir < 0 ? lst(order) : order[0];
+        var moveInStorageOrder = (dir < 0) == (part.level == 1);
+        var sticky = moveInStorageOrder ? "after" : "before";
+        var ch;
+        // With a wrapped rtl chunk (possibly spanning multiple bidi parts),
+        // it could be that the last bidi part is not on the last visual line,
+        // since visual lines contain content order-consecutive chunks.
+        // Thus, in rtl, we are looking for the first (content-order) character
+        // in the rtl chunk that is on the last line (that is, the same line
+        // as the last (content-order) character).
+        if (part.level > 0 || cm.doc.direction == "rtl") {
+          var prep = prepareMeasureForLine(cm, lineObj);
+          ch = dir < 0 ? lineObj.text.length - 1 : 0;
+          var targetTop = measureCharPrepared(cm, prep, ch).top;
+          ch = findFirst(function (ch) { return measureCharPrepared(cm, prep, ch).top == targetTop; }, (dir < 0) == (part.level == 1) ? part.from : part.to - 1, ch);
+          if (sticky == "before") { ch = moveCharLogically(lineObj, ch, 1); }
+        } else { ch = dir < 0 ? part.to : part.from; }
+        return new Pos(lineNo, ch, sticky)
+      }
+    }
+    return new Pos(lineNo, dir < 0 ? lineObj.text.length : 0, dir < 0 ? "before" : "after")
+  }
+
+  function moveVisually(cm, line, start, dir) {
+    var bidi = getOrder(line, cm.doc.direction);
+    if (!bidi) { return moveLogically(line, start, dir) }
+    if (start.ch >= line.text.length) {
+      start.ch = line.text.length;
+      start.sticky = "before";
+    } else if (start.ch <= 0) {
+      start.ch = 0;
+      start.sticky = "after";
+    }
+    var partPos = getBidiPartAt(bidi, start.ch, start.sticky), part = bidi[partPos];
+    if (cm.doc.direction == "ltr" && part.level % 2 == 0 && (dir > 0 ? part.to > start.ch : part.from < start.ch)) {
+      // Case 1: We move within an ltr part in an ltr editor. Even with wrapped lines,
+      // nothing interesting happens.
+      return moveLogically(line, start, dir)
+    }
+
+    var mv = function (pos, dir) { return moveCharLogically(line, pos instanceof Pos ? pos.ch : pos, dir); };
+    var prep;
+    var getWrappedLineExtent = function (ch) {
+      if (!cm.options.lineWrapping) { return {begin: 0, end: line.text.length} }
+      prep = prep || prepareMeasureForLine(cm, line);
+      return wrappedLineExtentChar(cm, line, prep, ch)
+    };
+    var wrappedLineExtent = getWrappedLineExtent(start.sticky == "before" ? mv(start, -1) : start.ch);
+
+    if (cm.doc.direction == "rtl" || part.level == 1) {
+      var moveInStorageOrder = (part.level == 1) == (dir < 0);
+      var ch = mv(start, moveInStorageOrder ? 1 : -1);
+      if (ch != null && (!moveInStorageOrder ? ch >= part.from && ch >= wrappedLineExtent.begin : ch <= part.to && ch <= wrappedLineExtent.end)) {
+        // Case 2: We move within an rtl part or in an rtl editor on the same visual line
+        var sticky = moveInStorageOrder ? "before" : "after";
+        return new Pos(start.line, ch, sticky)
+      }
+    }
+
+    // Case 3: Could not move within this bidi part in this visual line, so leave
+    // the current bidi part
+
+    var searchInVisualLine = function (partPos, dir, wrappedLineExtent) {
+      var getRes = function (ch, moveInStorageOrder) { return moveInStorageOrder
+        ? new Pos(start.line, mv(ch, 1), "before")
+        : new Pos(start.line, ch, "after"); };
+
+      for (; partPos >= 0 && partPos < bidi.length; partPos += dir) {
+        var part = bidi[partPos];
+        var moveInStorageOrder = (dir > 0) == (part.level != 1);
+        var ch = moveInStorageOrder ? wrappedLineExtent.begin : mv(wrappedLineExtent.end, -1);
+        if (part.from <= ch && ch < part.to) { return getRes(ch, moveInStorageOrder) }
+        ch = moveInStorageOrder ? part.from : mv(part.to, -1);
+        if (wrappedLineExtent.begin <= ch && ch < wrappedLineExtent.end) { return getRes(ch, moveInStorageOrder) }
+      }
+    };
+
+    // Case 3a: Look for other bidi parts on the same visual line
+    var res = searchInVisualLine(partPos + dir, dir, wrappedLineExtent);
+    if (res) { return res }
+
+    // Case 3b: Look for other bidi parts on the next visual line
+    var nextCh = dir > 0 ? wrappedLineExtent.end : mv(wrappedLineExtent.begin, -1);
+    if (nextCh != null && !(dir > 0 && nextCh == line.text.length)) {
+      res = searchInVisualLine(dir > 0 ? 0 : bidi.length - 1, dir, getWrappedLineExtent(nextCh));
+      if (res) { return res }
+    }
+
+    // Case 4: Nowhere to move
+    return null
+  }
+
+  // Commands are parameter-less actions that can be performed on an
+  // editor, mostly used for keybindings.
+  var commands = {
+    selectAll: selectAll,
+    singleSelection: function (cm) { return cm.setSelection(cm.getCursor("anchor"), cm.getCursor("head"), sel_dontScroll); },
+    killLine: function (cm) { return deleteNearSelection(cm, function (range) {
+      if (range.empty()) {
+        var len = getLine(cm.doc, range.head.line).text.length;
+        if (range.head.ch == len && range.head.line < cm.lastLine())
+          { return {from: range.head, to: Pos(range.head.line + 1, 0)} }
+        else
+          { return {from: range.head, to: Pos(range.head.line, len)} }
+      } else {
+        return {from: range.from(), to: range.to()}
+      }
+    }); },
+    deleteLine: function (cm) { return deleteNearSelection(cm, function (range) { return ({
+      from: Pos(range.from().line, 0),
+      to: clipPos(cm.doc, Pos(range.to().line + 1, 0))
+    }); }); },
+    delLineLeft: function (cm) { return deleteNearSelection(cm, function (range) { return ({
+      from: Pos(range.from().line, 0), to: range.from()
+    }); }); },
+    delWrappedLineLeft: function (cm) { return deleteNearSelection(cm, function (range) {
+      var top = cm.charCoords(range.head, "div").top + 5;
+      var leftPos = cm.coordsChar({left: 0, top: top}, "div");
+      return {from: leftPos, to: range.from()}
+    }); },
+    delWrappedLineRight: function (cm) { return deleteNearSelection(cm, function (range) {
+      var top = cm.charCoords(range.head, "div").top + 5;
+      var rightPos = cm.coordsChar({left: cm.display.lineDiv.offsetWidth + 100, top: top}, "div");
+      return {from: range.from(), to: rightPos }
+    }); },
+    undo: function (cm) { return cm.undo(); },
+    redo: function (cm) { return cm.redo(); },
+    undoSelection: function (cm) { return cm.undoSelection(); },
+    redoSelection: function (cm) { return cm.redoSelection(); },
+    goDocStart: function (cm) { return cm.extendSelection(Pos(cm.firstLine(), 0)); },
+    goDocEnd: function (cm) { return cm.extendSelection(Pos(cm.lastLine())); },
+    goLineStart: function (cm) { return cm.extendSelectionsBy(function (range) { return lineStart(cm, range.head.line); },
+      {origin: "+move", bias: 1}
+    ); },
+    goLineStartSmart: function (cm) { return cm.extendSelectionsBy(function (range) { return lineStartSmart(cm, range.head); },
+      {origin: "+move", bias: 1}
+    ); },
+    goLineEnd: function (cm) { return cm.extendSelectionsBy(function (range) { return lineEnd(cm, range.head.line); },
+      {origin: "+move", bias: -1}
+    ); },
+    goLineRight: function (cm) { return cm.extendSelectionsBy(function (range) {
+      var top = cm.cursorCoords(range.head, "div").top + 5;
+      return cm.coordsChar({left: cm.display.lineDiv.offsetWidth + 100, top: top}, "div")
+    }, sel_move); },
+    goLineLeft: function (cm) { return cm.extendSelectionsBy(function (range) {
+      var top = cm.cursorCoords(range.head, "div").top + 5;
+      return cm.coordsChar({left: 0, top: top}, "div")
+    }, sel_move); },
+    goLineLeftSmart: function (cm) { return cm.extendSelectionsBy(function (range) {
+      var top = cm.cursorCoords(range.head, "div").top + 5;
+      var pos = cm.coordsChar({left: 0, top: top}, "div");
+      if (pos.ch < cm.getLine(pos.line).search(/\S/)) { return lineStartSmart(cm, range.head) }
+      return pos
+    }, sel_move); },
+    goLineUp: function (cm) { return cm.moveV(-1, "line"); },
+    goLineDown: function (cm) { return cm.moveV(1, "line"); },
+    goPageUp: function (cm) { return cm.moveV(-1, "page"); },
+    goPageDown: function (cm) { return cm.moveV(1, "page"); },
+    goCharLeft: function (cm) { return cm.moveH(-1, "char"); },
+    goCharRight: function (cm) { return cm.moveH(1, "char"); },
+    goColumnLeft: function (cm) { return cm.moveH(-1, "column"); },
+    goColumnRight: function (cm) { return cm.moveH(1, "column"); },
+    goWordLeft: function (cm) { return cm.moveH(-1, "word"); },
+    goGroupRight: function (cm) { return cm.moveH(1, "group"); },
+    goGroupLeft: function (cm) { return cm.moveH(-1, "group"); },
+    goWordRight: function (cm) { return cm.moveH(1, "word"); },
+    delCharBefore: function (cm) { return cm.deleteH(-1, "codepoint"); },
+    delCharAfter: function (cm) { return cm.deleteH(1, "char"); },
+    delWordBefore: function (cm) { return cm.deleteH(-1, "word"); },
+    delWordAfter: function (cm) { return cm.deleteH(1, "word"); },
+    delGroupBefore: function (cm) { return cm.deleteH(-1, "group"); },
+    delGroupAfter: function (cm) { return cm.deleteH(1, "group"); },
+    indentAuto: function (cm) { return cm.indentSelection("smart"); },
+    indentMore: function (cm) { return cm.indentSelection("add"); },
+    indentLess: function (cm) { return cm.indentSelection("subtract"); },
+    insertTab: function (cm) { return cm.replaceSelection("\t"); },
+    insertSoftTab: function (cm) {
+      var spaces = [], ranges = cm.listSelections(), tabSize = cm.options.tabSize;
+      for (var i = 0; i < ranges.length; i++) {
+        var pos = ranges[i].from();
+        var col = countColumn(cm.getLine(pos.line), pos.ch, tabSize);
+        spaces.push(spaceStr(tabSize - col % tabSize));
+      }
+      cm.replaceSelections(spaces);
+    },
+    defaultTab: function (cm) {
+      if (cm.somethingSelected()) { cm.indentSelection("add"); }
+      else { cm.execCommand("insertTab"); }
+    },
+    // Swap the two chars left and right of each selection's head.
+    // Move cursor behind the two swapped characters afterwards.
+    //
+    // Doesn't consider line feeds a character.
+    // Doesn't scan more than one line above to find a character.
+    // Doesn't do anything on an empty line.
+    // Doesn't do anything with non-empty selections.
+    transposeChars: function (cm) { return runInOp(cm, function () {
+      var ranges = cm.listSelections(), newSel = [];
+      for (var i = 0; i < ranges.length; i++) {
+        if (!ranges[i].empty()) { continue }
+        var cur = ranges[i].head, line = getLine(cm.doc, cur.line).text;
+        if (line) {
+          if (cur.ch == line.length) { cur = new Pos(cur.line, cur.ch - 1); }
+          if (cur.ch > 0) {
+            cur = new Pos(cur.line, cur.ch + 1);
+            cm.replaceRange(line.charAt(cur.ch - 1) + line.charAt(cur.ch - 2),
+                            Pos(cur.line, cur.ch - 2), cur, "+transpose");
+          } else if (cur.line > cm.doc.first) {
+            var prev = getLine(cm.doc, cur.line - 1).text;
+            if (prev) {
+              cur = new Pos(cur.line, 1);
+              cm.replaceRange(line.charAt(0) + cm.doc.lineSeparator() +
+                              prev.charAt(prev.length - 1),
+                              Pos(cur.line - 1, prev.length - 1), cur, "+transpose");
+            }
+          }
+        }
+        newSel.push(new Range(cur, cur));
+      }
+      cm.setSelections(newSel);
+    }); },
+    newlineAndIndent: function (cm) { return runInOp(cm, function () {
+      var sels = cm.listSelections();
+      for (var i = sels.length - 1; i >= 0; i--)
+        { cm.replaceRange(cm.doc.lineSeparator(), sels[i].anchor, sels[i].head, "+input"); }
+      sels = cm.listSelections();
+      for (var i$1 = 0; i$1 < sels.length; i$1++)
+        { cm.indentLine(sels[i$1].from().line, null, true); }
+      ensureCursorVisible(cm);
+    }); },
+    openLine: function (cm) { return cm.replaceSelection("\n", "start"); },
+    toggleOverwrite: function (cm) { return cm.toggleOverwrite(); }
+  };
+
+
+  function lineStart(cm, lineN) {
+    var line = getLine(cm.doc, lineN);
+    var visual = visualLine(line);
+    if (visual != line) { lineN = lineNo(visual); }
+    return endOfLine(true, cm, visual, lineN, 1)
+  }
+  function lineEnd(cm, lineN) {
+    var line = getLine(cm.doc, lineN);
+    var visual = visualLineEnd(line);
+    if (visual != line) { lineN = lineNo(visual); }
+    return endOfLine(true, cm, line, lineN, -1)
+  }
+  function lineStartSmart(cm, pos) {
+    var start = lineStart(cm, pos.line);
+    var line = getLine(cm.doc, start.line);
+    var order = getOrder(line, cm.doc.direction);
+    if (!order || order[0].level == 0) {
+      var firstNonWS = Math.max(start.ch, line.text.search(/\S/));
+      var inWS = pos.line == start.line && pos.ch <= firstNonWS && pos.ch;
+      return Pos(start.line, inWS ? 0 : firstNonWS, start.sticky)
+    }
+    return start
+  }
+
+  // Run a handler that was bound to a key.
+  function doHandleBinding(cm, bound, dropShift) {
+    if (typeof bound == "string") {
+      bound = commands[bound];
+      if (!bound) { return false }
+    }
+    // Ensure previous input has been read, so that the handler sees a
+    // consistent view of the document
+    cm.display.input.ensurePolled();
+    var prevShift = cm.display.shift, done = false;
+    try {
+      if (cm.isReadOnly()) { cm.state.suppressEdits = true; }
+      if (dropShift) { cm.display.shift = false; }
+      done = bound(cm) != Pass;
+    } finally {
+      cm.display.shift = prevShift;
+      cm.state.suppressEdits = false;
+    }
+    return done
+  }
+
+  function lookupKeyForEditor(cm, name, handle) {
+    for (var i = 0; i < cm.state.keyMaps.length; i++) {
+      var result = lookupKey(name, cm.state.keyMaps[i], handle, cm);
+      if (result) { return result }
+    }
+    return (cm.options.extraKeys && lookupKey(name, cm.options.extraKeys, handle, cm))
+      || lookupKey(name, cm.options.keyMap, handle, cm)
+  }
+
+  // Note that, despite the name, this function is also used to check
+  // for bound mouse clicks.
+
+  var stopSeq = new Delayed;
+
+  function dispatchKey(cm, name, e, handle) {
+    var seq = cm.state.keySeq;
+    if (seq) {
+      if (isModifierKey(name)) { return "handled" }
+      if (/\'$/.test(name))
+        { cm.state.keySeq = null; }
+      else
+        { stopSeq.set(50, function () {
+          if (cm.state.keySeq == seq) {
+            cm.state.keySeq = null;
+            cm.display.input.reset();
+          }
+        }); }
+      if (dispatchKeyInner(cm, seq + " " + name, e, handle)) { return true }
+    }
+    return dispatchKeyInner(cm, name, e, handle)
+  }
+
+  function dispatchKeyInner(cm, name, e, handle) {
+    var result = lookupKeyForEditor(cm, name, handle);
+
+    if (result == "multi")
+      { cm.state.keySeq = name; }
+    if (result == "handled")
+      { signalLater(cm, "keyHandled", cm, name, e); }
+
+    if (result == "handled" || result == "multi") {
+      e_preventDefault(e);
+      restartBlink(cm);
+    }
+
+    return !!result
+  }
+
+  // Handle a key from the keydown event.
+  function handleKeyBinding(cm, e) {
+    var name = keyName(e, true);
+    if (!name) { return false }
+
+    if (e.shiftKey && !cm.state.keySeq) {
+      // First try to resolve full name (including 'Shift-'). Failing
+      // that, see if there is a cursor-motion command (starting with
+      // 'go') bound to the keyname without 'Shift-'.
+      return dispatchKey(cm, "Shift-" + name, e, function (b) { return doHandleBinding(cm, b, true); })
+          || dispatchKey(cm, name, e, function (b) {
+               if (typeof b == "string" ? /^go[A-Z]/.test(b) : b.motion)
+                 { return doHandleBinding(cm, b) }
+             })
+    } else {
+      return dispatchKey(cm, name, e, function (b) { return doHandleBinding(cm, b); })
+    }
+  }
+
+  // Handle a key from the keypress event
+  function handleCharBinding(cm, e, ch) {
+    return dispatchKey(cm, "'" + ch + "'", e, function (b) { return doHandleBinding(cm, b, true); })
+  }
+
+  var lastStoppedKey = null;
+  function onKeyDown(e) {
+    var cm = this;
+    if (e.target && e.target != cm.display.input.getField()) { return }
+    cm.curOp.focus = activeElt();
+    if (signalDOMEvent(cm, e)) { return }
+    // IE does strange things with escape.
+    if (ie && ie_version < 11 && e.keyCode == 27) { e.returnValue = false; }
+    var code = e.keyCode;
+    cm.display.shift = code == 16 || e.shiftKey;
+    var handled = handleKeyBinding(cm, e);
+    if (presto) {
+      lastStoppedKey = handled ? code : null;
+      // Opera has no cut event... we try to at least catch the key combo
+      if (!handled && code == 88 && !hasCopyEvent && (mac ? e.metaKey : e.ctrlKey))
+        { cm.replaceSelection("", null, "cut"); }
+    }
+    if (gecko && !mac && !handled && code == 46 && e.shiftKey && !e.ctrlKey && document.execCommand)
+      { document.execCommand("cut"); }
+
+    // Turn mouse into crosshair when Alt is held on Mac.
+    if (code == 18 && !/\bCodeMirror-crosshair\b/.test(cm.display.lineDiv.className))
+      { showCrossHair(cm); }
+  }
+
+  function showCrossHair(cm) {
+    var lineDiv = cm.display.lineDiv;
+    addClass(lineDiv, "CodeMirror-crosshair");
+
+    function up(e) {
+      if (e.keyCode == 18 || !e.altKey) {
+        rmClass(lineDiv, "CodeMirror-crosshair");
+        off(document, "keyup", up);
+        off(document, "mouseover", up);
+      }
+    }
+    on(document, "keyup", up);
+    on(document, "mouseover", up);
+  }
+
+  function onKeyUp(e) {
+    if (e.keyCode == 16) { this.doc.sel.shift = false; }
+    signalDOMEvent(this, e);
+  }
+
+  function onKeyPress(e) {
+    var cm = this;
+    if (e.target && e.target != cm.display.input.getField()) { return }
+    if (eventInWidget(cm.display, e) || signalDOMEvent(cm, e) || e.ctrlKey && !e.altKey || mac && e.metaKey) { return }
+    var keyCode = e.keyCode, charCode = e.charCode;
+    if (presto && keyCode == lastStoppedKey) {lastStoppedKey = null; e_preventDefault(e); return}
+    if ((presto && (!e.which || e.which < 10)) && handleKeyBinding(cm, e)) { return }
+    var ch = String.fromCharCode(charCode == null ? keyCode : charCode);
+    // Some browsers fire keypress events for backspace
+    if (ch == "\x08") { return }
+    if (handleCharBinding(cm, e, ch)) { return }
+    cm.display.input.onKeyPress(e);
+  }
+
+  var DOUBLECLICK_DELAY = 400;
+
+  var PastClick = function(time, pos, button) {
+    this.time = time;
+    this.pos = pos;
+    this.button = button;
+  };
+
+  PastClick.prototype.compare = function (time, pos, button) {
+    return this.time + DOUBLECLICK_DELAY > time &&
+      cmp(pos, this.pos) == 0 && button == this.button
+  };
+
+  var lastClick, lastDoubleClick;
+  function clickRepeat(pos, button) {
+    var now = +new Date;
+    if (lastDoubleClick && lastDoubleClick.compare(now, pos, button)) {
+      lastClick = lastDoubleClick = null;
+      return "triple"
+    } else if (lastClick && lastClick.compare(now, pos, button)) {
+      lastDoubleClick = new PastClick(now, pos, button);
+      lastClick = null;
+      return "double"
+    } else {
+      lastClick = new PastClick(now, pos, button);
+      lastDoubleClick = null;
+      return "single"
+    }
+  }
+
+  // A mouse down can be a single click, double click, triple click,
+  // start of selection drag, start of text drag, new cursor
+  // (ctrl-click), rectangle drag (alt-drag), or xwin
+  // middle-click-paste. Or it might be a click on something we should
+  // not interfere with, such as a scrollbar or widget.
+  function onMouseDown(e) {
+    var cm = this, display = cm.display;
+    if (signalDOMEvent(cm, e) || display.activeTouch && display.input.supportsTouch()) { return }
+    display.input.ensurePolled();
+    display.shift = e.shiftKey;
+
+    if (eventInWidget(display, e)) {
+      if (!webkit) {
+        // Briefly turn off draggability, to allow widgets to do
+        // normal dragging things.
+        display.scroller.draggable = false;
+        setTimeout(function () { return display.scroller.draggable = true; }, 100);
+      }
+      return
+    }
+    if (clickInGutter(cm, e)) { return }
+    var pos = posFromMouse(cm, e), button = e_button(e), repeat = pos ? clickRepeat(pos, button) : "single";
+    window.focus();
+
+    // #3261: make sure, that we're not starting a second selection
+    if (button == 1 && cm.state.selectingText)
+      { cm.state.selectingText(e); }
+
+    if (pos && handleMappedButton(cm, button, pos, repeat, e)) { return }
+
+    if (button == 1) {
+      if (pos) { leftButtonDown(cm, pos, repeat, e); }
+      else if (e_target(e) == display.scroller) { e_preventDefault(e); }
+    } else if (button == 2) {
+      if (pos) { extendSelection(cm.doc, pos); }
+      setTimeout(function () { return display.input.focus(); }, 20);
+    } else if (button == 3) {
+      if (captureRightClick) { cm.display.input.onContextMenu(e); }
+      else { delayBlurEvent(cm); }
+    }
+  }
+
+  function handleMappedButton(cm, button, pos, repeat, event) {
+    var name = "Click";
+    if (repeat == "double") { name = "Double" + name; }
+    else if (repeat == "triple") { name = "Triple" + name; }
+    name = (button == 1 ? "Left" : button == 2 ? "Middle" : "Right") + name;
+
+    return dispatchKey(cm,  addModifierNames(name, event), event, function (bound) {
+      if (typeof bound == "string") { bound = commands[bound]; }
+      if (!bound) { return false }
+      var done = false;
+      try {
+        if (cm.isReadOnly()) { cm.state.suppressEdits = true; }
+        done = bound(cm, pos) != Pass;
+      } finally {
+        cm.state.suppressEdits = false;
+      }
+      return done
+    })
+  }
+
+  function configureMouse(cm, repeat, event) {
+    var option = cm.getOption("configureMouse");
+    var value = option ? option(cm, repeat, event) : {};
+    if (value.unit == null) {
+      var rect = chromeOS ? event.shiftKey && event.metaKey : event.altKey;
+      value.unit = rect ? "rectangle" : repeat == "single" ? "char" : repeat == "double" ? "word" : "line";
+    }
+    if (value.extend == null || cm.doc.extend) { value.extend = cm.doc.extend || event.shiftKey; }
+    if (value.addNew == null) { value.addNew = mac ? event.metaKey : event.ctrlKey; }
+    if (value.moveOnDrag == null) { value.moveOnDrag = !(mac ? event.altKey : event.ctrlKey); }
+    return value
+  }
+
+  function leftButtonDown(cm, pos, repeat, event) {
+    if (ie) { setTimeout(bind(ensureFocus, cm), 0); }
+    else { cm.curOp.focus = activeElt(); }
+
+    var behavior = configureMouse(cm, repeat, event);
+
+    var sel = cm.doc.sel, contained;
+    if (cm.options.dragDrop && dragAndDrop && !cm.isReadOnly() &&
+        repeat == "single" && (contained = sel.contains(pos)) > -1 &&
+        (cmp((contained = sel.ranges[contained]).from(), pos) < 0 || pos.xRel > 0) &&
+        (cmp(contained.to(), pos) > 0 || pos.xRel < 0))
+      { leftButtonStartDrag(cm, event, pos, behavior); }
+    else
+      { leftButtonSelect(cm, event, pos, behavior); }
+  }
+
+  // Start a text drag. When it ends, see if any dragging actually
+  // happen, and treat as a click if it didn't.
+  function leftButtonStartDrag(cm, event, pos, behavior) {
+    var display = cm.display, moved = false;
+    var dragEnd = operation(cm, function (e) {
+      if (webkit) { display.scroller.draggable = false; }
+      cm.state.draggingText = false;
+      if (cm.state.delayingBlurEvent) {
+        if (cm.hasFocus()) { cm.state.delayingBlurEvent = false; }
+        else { delayBlurEvent(cm); }
+      }
+      off(display.wrapper.ownerDocument, "mouseup", dragEnd);
+      off(display.wrapper.ownerDocument, "mousemove", mouseMove);
+      off(display.scroller, "dragstart", dragStart);
+      off(display.scroller, "drop", dragEnd);
+      if (!moved) {
+        e_preventDefault(e);
+        if (!behavior.addNew)
+          { extendSelection(cm.doc, pos, null, null, behavior.extend); }
+        // Work around unexplainable focus problem in IE9 (#2127) and Chrome (#3081)
+        if ((webkit && !safari) || ie && ie_version == 9)
+          { setTimeout(function () {display.wrapper.ownerDocument.body.focus({preventScroll: true}); display.input.focus();}, 20); }
+        else
+          { display.input.focus(); }
+      }
+    });
+    var mouseMove = function(e2) {
+      moved = moved || Math.abs(event.clientX - e2.clientX) + Math.abs(event.clientY - e2.clientY) >= 10;
+    };
+    var dragStart = function () { return moved = true; };
+    // Let the drag handler handle this.
+    if (webkit) { display.scroller.draggable = true; }
+    cm.state.draggingText = dragEnd;
+    dragEnd.copy = !behavior.moveOnDrag;
+    on(display.wrapper.ownerDocument, "mouseup", dragEnd);
+    on(display.wrapper.ownerDocument, "mousemove", mouseMove);
+    on(display.scroller, "dragstart", dragStart);
+    on(display.scroller, "drop", dragEnd);
+
+    cm.state.delayingBlurEvent = true;
+    setTimeout(function () { return display.input.focus(); }, 20);
+    // IE's approach to draggable
+    if (display.scroller.dragDrop) { display.scroller.dragDrop(); }
+  }
+
+  function rangeForUnit(cm, pos, unit) {
+    if (unit == "char") { return new Range(pos, pos) }
+    if (unit == "word") { return cm.findWordAt(pos) }
+    if (unit == "line") { return new Range(Pos(pos.line, 0), clipPos(cm.doc, Pos(pos.line + 1, 0))) }
+    var result = unit(cm, pos);
+    return new Range(result.from, result.to)
+  }
+
+  // Normal selection, as opposed to text dragging.
+  function leftButtonSelect(cm, event, start, behavior) {
+    if (ie) { delayBlurEvent(cm); }
+    var display = cm.display, doc = cm.doc;
+    e_preventDefault(event);
+
+    var ourRange, ourIndex, startSel = doc.sel, ranges = startSel.ranges;
+    if (behavior.addNew && !behavior.extend) {
+      ourIndex = doc.sel.contains(start);
+      if (ourIndex > -1)
+        { ourRange = ranges[ourIndex]; }
+      else
+        { ourRange = new Range(start, start); }
+    } else {
+      ourRange = doc.sel.primary();
+      ourIndex = doc.sel.primIndex;
+    }
+
+    if (behavior.unit == "rectangle") {
+      if (!behavior.addNew) { ourRange = new Range(start, start); }
+      start = posFromMouse(cm, event, true, true);
+      ourIndex = -1;
+    } else {
+      var range = rangeForUnit(cm, start, behavior.unit);
+      if (behavior.extend)
+        { ourRange = extendRange(ourRange, range.anchor, range.head, behavior.extend); }
+      else
+        { ourRange = range; }
+    }
+
+    if (!behavior.addNew) {
+      ourIndex = 0;
+      setSelection(doc, new Selection([ourRange], 0), sel_mouse);
+      startSel = doc.sel;
+    } else if (ourIndex == -1) {
+      ourIndex = ranges.length;
+      setSelection(doc, normalizeSelection(cm, ranges.concat([ourRange]), ourIndex),
+                   {scroll: false, origin: "*mouse"});
+    } else if (ranges.length > 1 && ranges[ourIndex].empty() && behavior.unit == "char" && !behavior.extend) {
+      setSelection(doc, normalizeSelection(cm, ranges.slice(0, ourIndex).concat(ranges.slice(ourIndex + 1)), 0),
+                   {scroll: false, origin: "*mouse"});
+      startSel = doc.sel;
+    } else {
+      replaceOneSelection(doc, ourIndex, ourRange, sel_mouse);
+    }
+
+    var lastPos = start;
+    function extendTo(pos) {
+      if (cmp(lastPos, pos) == 0) { return }
+      lastPos = pos;
+
+      if (behavior.unit == "rectangle") {
+        var ranges = [], tabSize = cm.options.tabSize;
+        var startCol = countColumn(getLine(doc, start.line).text, start.ch, tabSize);
+        var posCol = countColumn(getLine(doc, pos.line).text, pos.ch, tabSize);
+        var left = Math.min(startCol, posCol), right = Math.max(startCol, posCol);
+        for (var line = Math.min(start.line, pos.line), end = Math.min(cm.lastLine(), Math.max(start.line, pos.line));
+             line <= end; line++) {
+          var text = getLine(doc, line).text, leftPos = findColumn(text, left, tabSize);
+          if (left == right)
+            { ranges.push(new Range(Pos(line, leftPos), Pos(line, leftPos))); }
+          else if (text.length > leftPos)
+            { ranges.push(new Range(Pos(line, leftPos), Pos(line, findColumn(text, right, tabSize)))); }
+        }
+        if (!ranges.length) { ranges.push(new Range(start, start)); }
+        setSelection(doc, normalizeSelection(cm, startSel.ranges.slice(0, ourIndex).concat(ranges), ourIndex),
+                     {origin: "*mouse", scroll: false});
+        cm.scrollIntoView(pos);
+      } else {
+        var oldRange = ourRange;
+        var range = rangeForUnit(cm, pos, behavior.unit);
+        var anchor = oldRange.anchor, head;
+        if (cmp(range.anchor, anchor) > 0) {
+          head = range.head;
+          anchor = minPos(oldRange.from(), range.anchor);
+        } else {
+          head = range.anchor;
+          anchor = maxPos(oldRange.to(), range.head);
+        }
+        var ranges$1 = startSel.ranges.slice(0);
+        ranges$1[ourIndex] = bidiSimplify(cm, new Range(clipPos(doc, anchor), head));
+        setSelection(doc, normalizeSelection(cm, ranges$1, ourIndex), sel_mouse);
+      }
+    }
+
+    var editorSize = display.wrapper.getBoundingClientRect();
+    // Used to ensure timeout re-tries don't fire when another extend
+    // happened in the meantime (clearTimeout isn't reliable -- at
+    // least on Chrome, the timeouts still happen even when cleared,
+    // if the clear happens after their scheduled firing time).
+    var counter = 0;
+
+    function extend(e) {
+      var curCount = ++counter;
+      var cur = posFromMouse(cm, e, true, behavior.unit == "rectangle");
+      if (!cur) { return }
+      if (cmp(cur, lastPos) != 0) {
+        cm.curOp.focus = activeElt();
+        extendTo(cur);
+        var visible = visibleLines(display, doc);
+        if (cur.line >= visible.to || cur.line < visible.from)
+          { setTimeout(operation(cm, function () {if (counter == curCount) { extend(e); }}), 150); }
+      } else {
+        var outside = e.clientY < editorSize.top ? -20 : e.clientY > editorSize.bottom ? 20 : 0;
+        if (outside) { setTimeout(operation(cm, function () {
+          if (counter != curCount) { return }
+          display.scroller.scrollTop += outside;
+          extend(e);
+        }), 50); }
+      }
+    }
+
+    function done(e) {
+      cm.state.selectingText = false;
+      counter = Infinity;
+      // If e is null or undefined we interpret this as someone trying
+      // to explicitly cancel the selection rather than the user
+      // letting go of the mouse button.
+      if (e) {
+        e_preventDefault(e);
+        display.input.focus();
+      }
+      off(display.wrapper.ownerDocument, "mousemove", move);
+      off(display.wrapper.ownerDocument, "mouseup", up);
+      doc.history.lastSelOrigin = null;
+    }
+
+    var move = operation(cm, function (e) {
+      if (e.buttons === 0 || !e_button(e)) { done(e); }
+      else { extend(e); }
+    });
+    var up = operation(cm, done);
+    cm.state.selectingText = up;
+    on(display.wrapper.ownerDocument, "mousemove", move);
+    on(display.wrapper.ownerDocument, "mouseup", up);
+  }
+
+  // Used when mouse-selecting to adjust the anchor to the proper side
+  // of a bidi jump depending on the visual position of the head.
+  function bidiSimplify(cm, range) {
+    var anchor = range.anchor;
+    var head = range.head;
+    var anchorLine = getLine(cm.doc, anchor.line);
+    if (cmp(anchor, head) == 0 && anchor.sticky == head.sticky) { return range }
+    var order = getOrder(anchorLine);
+    if (!order) { return range }
+    var index = getBidiPartAt(order, anchor.ch, anchor.sticky), part = order[index];
+    if (part.from != anchor.ch && part.to != anchor.ch) { return range }
+    var boundary = index + ((part.from == anchor.ch) == (part.level != 1) ? 0 : 1);
+    if (boundary == 0 || boundary == order.length) { return range }
+
+    // Compute the relative visual position of the head compared to the
+    // anchor (<0 is to the left, >0 to the right)
+    var leftSide;
+    if (head.line != anchor.line) {
+      leftSide = (head.line - anchor.line) * (cm.doc.direction == "ltr" ? 1 : -1) > 0;
+    } else {
+      var headIndex = getBidiPartAt(order, head.ch, head.sticky);
+      var dir = headIndex - index || (head.ch - anchor.ch) * (part.level == 1 ? -1 : 1);
+      if (headIndex == boundary - 1 || headIndex == boundary)
+        { leftSide = dir < 0; }
+      else
+        { leftSide = dir > 0; }
+    }
+
+    var usePart = order[boundary + (leftSide ? -1 : 0)];
+    var from = leftSide == (usePart.level == 1);
+    var ch = from ? usePart.from : usePart.to, sticky = from ? "after" : "before";
+    return anchor.ch == ch && anchor.sticky == sticky ? range : new Range(new Pos(anchor.line, ch, sticky), head)
+  }
+
+
+  // Determines whether an event happened in the gutter, and fires the
+  // handlers for the corresponding event.
+  function gutterEvent(cm, e, type, prevent) {
+    var mX, mY;
+    if (e.touches) {
+      mX = e.touches[0].clientX;
+      mY = e.touches[0].clientY;
+    } else {
+      try { mX = e.clientX; mY = e.clientY; }
+      catch(e$1) { return false }
+    }
+    if (mX >= Math.floor(cm.display.gutters.getBoundingClientRect().right)) { return false }
+    if (prevent) { e_preventDefault(e); }
+
+    var display = cm.display;
+    var lineBox = display.lineDiv.getBoundingClientRect();
+
+    if (mY > lineBox.bottom || !hasHandler(cm, type)) { return e_defaultPrevented(e) }
+    mY -= lineBox.top - display.viewOffset;
+
+    for (var i = 0; i < cm.display.gutterSpecs.length; ++i) {
+      var g = display.gutters.childNodes[i];
+      if (g && g.getBoundingClientRect().right >= mX) {
+        var line = lineAtHeight(cm.doc, mY);
+        var gutter = cm.display.gutterSpecs[i];
+        signal(cm, type, cm, line, gutter.className, e);
+        return e_defaultPrevented(e)
+      }
+    }
+  }
+
+  function clickInGutter(cm, e) {
+    return gutterEvent(cm, e, "gutterClick", true)
+  }
+
+  // CONTEXT MENU HANDLING
+
+  // To make the context menu work, we need to briefly unhide the
+  // textarea (making it as unobtrusive as possible) to let the
+  // right-click take effect on it.
+  function onContextMenu(cm, e) {
+    if (eventInWidget(cm.display, e) || contextMenuInGutter(cm, e)) { return }
+    if (signalDOMEvent(cm, e, "contextmenu")) { return }
+    if (!captureRightClick) { cm.display.input.onContextMenu(e); }
+  }
+
+  function contextMenuInGutter(cm, e) {
+    if (!hasHandler(cm, "gutterContextMenu")) { return false }
+    return gutterEvent(cm, e, "gutterContextMenu", false)
+  }
+
+  function themeChanged(cm) {
+    cm.display.wrapper.className = cm.display.wrapper.className.replace(/\s*cm-s-\S+/g, "") +
+      cm.options.theme.replace(/(^|\s)\s*/g, " cm-s-");
+    clearCaches(cm);
+  }
+
+  var Init = {toString: function(){return "CodeMirror.Init"}};
+
+  var defaults = {};
+  var optionHandlers = {};
+
+  function defineOptions(CodeMirror) {
+    var optionHandlers = CodeMirror.optionHandlers;
+
+    function option(name, deflt, handle, notOnInit) {
+      CodeMirror.defaults[name] = deflt;
+      if (handle) { optionHandlers[name] =
+        notOnInit ? function (cm, val, old) {if (old != Init) { handle(cm, val, old); }} : handle; }
+    }
+
+    CodeMirror.defineOption = option;
+
+    // Passed to option handlers when there is no old value.
+    CodeMirror.Init = Init;
+
+    // These two are, on init, called from the constructor because they
+    // have to be initialized before the editor can start at all.
+    option("value", "", function (cm, val) { return cm.setValue(val); }, true);
+    option("mode", null, function (cm, val) {
+      cm.doc.modeOption = val;
+      loadMode(cm);
+    }, true);
+
+    option("indentUnit", 2, loadMode, true);
+    option("indentWithTabs", false);
+    option("smartIndent", true);
+    option("tabSize", 4, function (cm) {
+      resetModeState(cm);
+      clearCaches(cm);
+      regChange(cm);
+    }, true);
+
+    option("lineSeparator", null, function (cm, val) {
+      cm.doc.lineSep = val;
+      if (!val) { return }
+      var newBreaks = [], lineNo = cm.doc.first;
+      cm.doc.iter(function (line) {
+        for (var pos = 0;;) {
+          var found = line.text.indexOf(val, pos);
+          if (found == -1) { break }
+          pos = found + val.length;
+          newBreaks.push(Pos(lineNo, found));
+        }
+        lineNo++;
+      });
+      for (var i = newBreaks.length - 1; i >= 0; i--)
+        { replaceRange(cm.doc, val, newBreaks[i], Pos(newBreaks[i].line, newBreaks[i].ch + val.length)); }
+    });
+    option("specialChars", /[\u0000-\u001f\u007f-\u009f\u00ad\u061c\u200b-\u200c\u200e\u200f\u2028\u2029\ufeff\ufff9-\ufffc]/g, function (cm, val, old) {
+      cm.state.specialChars = new RegExp(val.source + (val.test("\t") ? "" : "|\t"), "g");
+      if (old != Init) { cm.refresh(); }
+    });
+    option("specialCharPlaceholder", defaultSpecialCharPlaceholder, function (cm) { return cm.refresh(); }, true);
+    option("electricChars", true);
+    option("inputStyle", mobile ? "contenteditable" : "textarea", function () {
+      throw new Error("inputStyle can not (yet) be changed in a running editor") // FIXME
+    }, true);
+    option("spellcheck", false, function (cm, val) { return cm.getInputField().spellcheck = val; }, true);
+    option("autocorrect", false, function (cm, val) { return cm.getInputField().autocorrect = val; }, true);
+    option("autocapitalize", false, function (cm, val) { return cm.getInputField().autocapitalize = val; }, true);
+    option("rtlMoveVisually", !windows);
+    option("wholeLineUpdateBefore", true);
+
+    option("theme", "default", function (cm) {
+      themeChanged(cm);
+      updateGutters(cm);
+    }, true);
+    option("keyMap", "default", function (cm, val, old) {
+      var next = getKeyMap(val);
+      var prev = old != Init && getKeyMap(old);
+      if (prev && prev.detach) { prev.detach(cm, next); }
+      if (next.attach) { next.attach(cm, prev || null); }
+    });
+    option("extraKeys", null);
+    option("configureMouse", null);
+
+    option("lineWrapping", false, wrappingChanged, true);
+    option("gutters", [], function (cm, val) {
+      cm.display.gutterSpecs = getGutters(val, cm.options.lineNumbers);
+      updateGutters(cm);
+    }, true);
+    option("fixedGutter", true, function (cm, val) {
+      cm.display.gutters.style.left = val ? compensateForHScroll(cm.display) + "px" : "0";
+      cm.refresh();
+    }, true);
+    option("coverGutterNextToScrollbar", false, function (cm) { return updateScrollbars(cm); }, true);
+    option("scrollbarStyle", "native", function (cm) {
+      initScrollbars(cm);
+      updateScrollbars(cm);
+      cm.display.scrollbars.setScrollTop(cm.doc.scrollTop);
+      cm.display.scrollbars.setScrollLeft(cm.doc.scrollLeft);
+    }, true);
+    option("lineNumbers", false, function (cm, val) {
+      cm.display.gutterSpecs = getGutters(cm.options.gutters, val);
+      updateGutters(cm);
+    }, true);
+    option("firstLineNumber", 1, updateGutters, true);
+    option("lineNumberFormatter", function (integer) { return integer; }, updateGutters, true);
+    option("showCursorWhenSelecting", false, updateSelection, true);
+
+    option("resetSelectionOnContextMenu", true);
+    option("lineWiseCopyCut", true);
+    option("pasteLinesPerSelection", true);
+    option("selectionsMayTouch", false);
+
+    option("readOnly", false, function (cm, val) {
+      if (val == "nocursor") {
+        onBlur(cm);
+        cm.display.input.blur();
+      }
+      cm.display.input.readOnlyChanged(val);
+    });
+
+    option("screenReaderLabel", null, function (cm, val) {
+      val = (val === '') ? null : val;
+      cm.display.input.screenReaderLabelChanged(val);
+    });
+
+    option("disableInput", false, function (cm, val) {if (!val) { cm.display.input.reset(); }}, true);
+    option("dragDrop", true, dragDropChanged);
+    option("allowDropFileTypes", null);
+
+    option("cursorBlinkRate", 530);
+    option("cursorScrollMargin", 0);
+    option("cursorHeight", 1, updateSelection, true);
+    option("singleCursorHeightPerLine", true, updateSelection, true);
+    option("workTime", 100);
+    option("workDelay", 100);
+    option("flattenSpans", true, resetModeState, true);
+    option("addModeClass", false, resetModeState, true);
+    option("pollInterval", 100);
+    option("undoDepth", 200, function (cm, val) { return cm.doc.history.undoDepth = val; });
+    option("historyEventDelay", 1250);
+    option("viewportMargin", 10, function (cm) { return cm.refresh(); }, true);
+    option("maxHighlightLength", 10000, resetModeState, true);
+    option("moveInputWithCursor", true, function (cm, val) {
+      if (!val) { cm.display.input.resetPosition(); }
+    });
+
+    option("tabindex", null, function (cm, val) { return cm.display.input.getField().tabIndex = val || ""; });
+    option("autofocus", null);
+    option("direction", "ltr", function (cm, val) { return cm.doc.setDirection(val); }, true);
+    option("phrases", null);
+  }
+
+  function dragDropChanged(cm, value, old) {
+    var wasOn = old && old != Init;
+    if (!value != !wasOn) {
+      var funcs = cm.display.dragFunctions;
+      var toggle = value ? on : off;
+      toggle(cm.display.scroller, "dragstart", funcs.start);
+      toggle(cm.display.scroller, "dragenter", funcs.enter);
+      toggle(cm.display.scroller, "dragover", funcs.over);
+      toggle(cm.display.scroller, "dragleave", funcs.leave);
+      toggle(cm.display.scroller, "drop", funcs.drop);
+    }
+  }
+
+  function wrappingChanged(cm) {
+    if (cm.options.lineWrapping) {
+      addClass(cm.display.wrapper, "CodeMirror-wrap");
+      cm.display.sizer.style.minWidth = "";
+      cm.display.sizerWidth = null;
+    } else {
+      rmClass(cm.display.wrapper, "CodeMirror-wrap");
+      findMaxLine(cm);
+    }
+    estimateLineHeights(cm);
+    regChange(cm);
+    clearCaches(cm);
+    setTimeout(function () { return updateScrollbars(cm); }, 100);
+  }
+
+  // A CodeMirror instance represents an editor. This is the object
+  // that user code is usually dealing with.
+
+  function CodeMirror(place, options) {
+    var this$1 = this;
+
+    if (!(this instanceof CodeMirror)) { return new CodeMirror(place, options) }
+
+    this.options = options = options ? copyObj(options) : {};
+    // Determine effective options based on given values and defaults.
+    copyObj(defaults, options, false);
+
+    var doc = options.value;
+    if (typeof doc == "string") { doc = new Doc(doc, options.mode, null, options.lineSeparator, options.direction); }
+    else if (options.mode) { doc.modeOption = options.mode; }
+    this.doc = doc;
+
+    var input = new CodeMirror.inputStyles[options.inputStyle](this);
+    var display = this.display = new Display(place, doc, input, options);
+    display.wrapper.CodeMirror = this;
+    themeChanged(this);
+    if (options.lineWrapping)
+      { this.display.wrapper.className += " CodeMirror-wrap"; }
+    initScrollbars(this);
+
+    this.state = {
+      keyMaps: [],  // stores maps added by addKeyMap
+      overlays: [], // highlighting overlays, as added by addOverlay
+      modeGen: 0,   // bumped when mode/overlay changes, used to invalidate highlighting info
+      overwrite: false,
+      delayingBlurEvent: false,
+      focused: false,
+      suppressEdits: false, // used to disable editing during key handlers when in readOnly mode
+      pasteIncoming: -1, cutIncoming: -1, // help recognize paste/cut edits in input.poll
+      selectingText: false,
+      draggingText: false,
+      highlight: new Delayed(), // stores highlight worker timeout
+      keySeq: null,  // Unfinished key sequence
+      specialChars: null
+    };
+
+    if (options.autofocus && !mobile) { display.input.focus(); }
+
+    // Override magic textarea content restore that IE sometimes does
+    // on our hidden textarea on reload
+    if (ie && ie_version < 11) { setTimeout(function () { return this$1.display.input.reset(true); }, 20); }
+
+    registerEventHandlers(this);
+    ensureGlobalHandlers();
+
+    startOperation(this);
+    this.curOp.forceUpdate = true;
+    attachDoc(this, doc);
+
+    if ((options.autofocus && !mobile) || this.hasFocus())
+      { setTimeout(function () {
+        if (this$1.hasFocus() && !this$1.state.focused) { onFocus(this$1); }
+      }, 20); }
+    else
+      { onBlur(this); }
+
+    for (var opt in optionHandlers) { if (optionHandlers.hasOwnProperty(opt))
+      { optionHandlers[opt](this, options[opt], Init); } }
+    maybeUpdateLineNumberWidth(this);
+    if (options.finishInit) { options.finishInit(this); }
+    for (var i = 0; i < initHooks.length; ++i) { initHooks[i](this); }
+    endOperation(this);
+    // Suppress optimizelegibility in Webkit, since it breaks text
+    // measuring on line wrapping boundaries.
+    if (webkit && options.lineWrapping &&
+        getComputedStyle(display.lineDiv).textRendering == "optimizelegibility")
+      { display.lineDiv.style.textRendering = "auto"; }
+  }
+
+  // The default configuration options.
+  CodeMirror.defaults = defaults;
+  // Functions to run when options are changed.
+  CodeMirror.optionHandlers = optionHandlers;
+
+  // Attach the necessary event handlers when initializing the editor
+  function registerEventHandlers(cm) {
+    var d = cm.display;
+    on(d.scroller, "mousedown", operation(cm, onMouseDown));
+    // Older IE's will not fire a second mousedown for a double click
+    if (ie && ie_version < 11)
+      { on(d.scroller, "dblclick", operation(cm, function (e) {
+        if (signalDOMEvent(cm, e)) { return }
+        var pos = posFromMouse(cm, e);
+        if (!pos || clickInGutter(cm, e) || eventInWidget(cm.display, e)) { return }
+        e_preventDefault(e);
+        var word = cm.findWordAt(pos);
+        extendSelection(cm.doc, word.anchor, word.head);
+      })); }
+    else
+      { on(d.scroller, "dblclick", function (e) { return signalDOMEvent(cm, e) || e_preventDefault(e); }); }
+    // Some browsers fire contextmenu *after* opening the menu, at
+    // which point we can't mess with it anymore. Context menu is
+    // handled in onMouseDown for these browsers.
+    on(d.scroller, "contextmenu", function (e) { return onContextMenu(cm, e); });
+    on(d.input.getField(), "contextmenu", function (e) {
+      if (!d.scroller.contains(e.target)) { onContextMenu(cm, e); }
+    });
+
+    // Used to suppress mouse event handling when a touch happens
+    var touchFinished, prevTouch = {end: 0};
+    function finishTouch() {
+      if (d.activeTouch) {
+        touchFinished = setTimeout(function () { return d.activeTouch = null; }, 1000);
+        prevTouch = d.activeTouch;
+        prevTouch.end = +new Date;
+      }
+    }
+    function isMouseLikeTouchEvent(e) {
+      if (e.touches.length != 1) { return false }
+      var touch = e.touches[0];
+      return touch.radiusX <= 1 && touch.radiusY <= 1
+    }
+    function farAway(touch, other) {
+      if (other.left == null) { return true }
+      var dx = other.left - touch.left, dy = other.top - touch.top;
+      return dx * dx + dy * dy > 20 * 20
+    }
+    on(d.scroller, "touchstart", function (e) {
+      if (!signalDOMEvent(cm, e) && !isMouseLikeTouchEvent(e) && !clickInGutter(cm, e)) {
+        d.input.ensurePolled();
+        clearTimeout(touchFinished);
+        var now = +new Date;
+        d.activeTouch = {start: now, moved: false,
+                         prev: now - prevTouch.end <= 300 ? prevTouch : null};
+        if (e.touches.length == 1) {
+          d.activeTouch.left = e.touches[0].pageX;
+          d.activeTouch.top = e.touches[0].pageY;
+        }
+      }
+    });
+    on(d.scroller, "touchmove", function () {
+      if (d.activeTouch) { d.activeTouch.moved = true; }
+    });
+    on(d.scroller, "touchend", function (e) {
+      var touch = d.activeTouch;
+      if (touch && !eventInWidget(d, e) && touch.left != null &&
+          !touch.moved && new Date - touch.start < 300) {
+        var pos = cm.coordsChar(d.activeTouch, "page"), range;
+        if (!touch.prev || farAway(touch, touch.prev)) // Single tap
+          { range = new Range(pos, pos); }
+        else if (!touch.prev.prev || farAway(touch, touch.prev.prev)) // Double tap
+          { range = cm.findWordAt(pos); }
+        else // Triple tap
+          { range = new Range(Pos(pos.line, 0), clipPos(cm.doc, Pos(pos.line + 1, 0))); }
+        cm.setSelection(range.anchor, range.head);
+        cm.focus();
+        e_preventDefault(e);
+      }
+      finishTouch();
+    });
+    on(d.scroller, "touchcancel", finishTouch);
+
+    // Sync scrolling between fake scrollbars and real scrollable
+    // area, ensure viewport is updated when scrolling.
+    on(d.scroller, "scroll", function () {
+      if (d.scroller.clientHeight) {
+        updateScrollTop(cm, d.scroller.scrollTop);
+        setScrollLeft(cm, d.scroller.scrollLeft, true);
+        signal(cm, "scroll", cm);
+      }
+    });
+
+    // Listen to wheel events in order to try and update the viewport on time.
+    on(d.scroller, "mousewheel", function (e) { return onScrollWheel(cm, e); });
+    on(d.scroller, "DOMMouseScroll", function (e) { return onScrollWheel(cm, e); });
+
+    // Prevent wrapper from ever scrolling
+    on(d.wrapper, "scroll", function () { return d.wrapper.scrollTop = d.wrapper.scrollLeft = 0; });
+
+    d.dragFunctions = {
+      enter: function (e) {if (!signalDOMEvent(cm, e)) { e_stop(e); }},
+      over: function (e) {if (!signalDOMEvent(cm, e)) { onDragOver(cm, e); e_stop(e); }},
+      start: function (e) { return onDragStart(cm, e); },
+      drop: operation(cm, onDrop),
+      leave: function (e) {if (!signalDOMEvent(cm, e)) { clearDragCursor(cm); }}
+    };
+
+    var inp = d.input.getField();
+    on(inp, "keyup", function (e) { return onKeyUp.call(cm, e); });
+    on(inp, "keydown", operation(cm, onKeyDown));
+    on(inp, "keypress", operation(cm, onKeyPress));
+    on(inp, "focus", function (e) { return onFocus(cm, e); });
+    on(inp, "blur", function (e) { return onBlur(cm, e); });
+  }
+
+  var initHooks = [];
+  CodeMirror.defineInitHook = function (f) { return initHooks.push(f); };
+
+  // Indent the given line. The how parameter can be "smart",
+  // "add"/null, "subtract", or "prev". When aggressive is false
+  // (typically set to true for forced single-line indents), empty
+  // lines are not indented, and places where the mode returns Pass
+  // are left alone.
+  function indentLine(cm, n, how, aggressive) {
+    var doc = cm.doc, state;
+    if (how == null) { how = "add"; }
+    if (how == "smart") {
+      // Fall back to "prev" when the mode doesn't have an indentation
+      // method.
+      if (!doc.mode.indent) { how = "prev"; }
+      else { state = getContextBefore(cm, n).state; }
+    }
+
+    var tabSize = cm.options.tabSize;
+    var line = getLine(doc, n), curSpace = countColumn(line.text, null, tabSize);
+    if (line.stateAfter) { line.stateAfter = null; }
+    var curSpaceString = line.text.match(/^\s*/)[0], indentation;
+    if (!aggressive && !/\S/.test(line.text)) {
+      indentation = 0;
+      how = "not";
+    } else if (how == "smart") {
+      indentation = doc.mode.indent(state, line.text.slice(curSpaceString.length), line.text);
+      if (indentation == Pass || indentation > 150) {
+        if (!aggressive) { return }
+        how = "prev";
+      }
+    }
+    if (how == "prev") {
+      if (n > doc.first) { indentation = countColumn(getLine(doc, n-1).text, null, tabSize); }
+      else { indentation = 0; }
+    } else if (how == "add") {
+      indentation = curSpace + cm.options.indentUnit;
+    } else if (how == "subtract") {
+      indentation = curSpace - cm.options.indentUnit;
+    } else if (typeof how == "number") {
+      indentation = curSpace + how;
+    }
+    indentation = Math.max(0, indentation);
+
+    var indentString = "", pos = 0;
+    if (cm.options.indentWithTabs)
+      { for (var i = Math.floor(indentation / tabSize); i; --i) {pos += tabSize; indentString += "\t";} }
+    if (pos < indentation) { indentString += spaceStr(indentation - pos); }
+
+    if (indentString != curSpaceString) {
+      replaceRange(doc, indentString, Pos(n, 0), Pos(n, curSpaceString.length), "+input");
+      line.stateAfter = null;
+      return true
+    } else {
+      // Ensure that, if the cursor was in the whitespace at the start
+      // of the line, it is moved to the end of that space.
+      for (var i$1 = 0; i$1 < doc.sel.ranges.length; i$1++) {
+        var range = doc.sel.ranges[i$1];
+        if (range.head.line == n && range.head.ch < curSpaceString.length) {
+          var pos$1 = Pos(n, curSpaceString.length);
+          replaceOneSelection(doc, i$1, new Range(pos$1, pos$1));
+          break
+        }
+      }
+    }
+  }
+
+  // This will be set to a {lineWise: bool, text: [string]} object, so
+  // that, when pasting, we know what kind of selections the copied
+  // text was made out of.
+  var lastCopied = null;
+
+  function setLastCopied(newLastCopied) {
+    lastCopied = newLastCopied;
+  }
+
+  function applyTextInput(cm, inserted, deleted, sel, origin) {
+    var doc = cm.doc;
+    cm.display.shift = false;
+    if (!sel) { sel = doc.sel; }
+
+    var recent = +new Date - 200;
+    var paste = origin == "paste" || cm.state.pasteIncoming > recent;
+    var textLines = splitLinesAuto(inserted), multiPaste = null;
+    // When pasting N lines into N selections, insert one line per selection
+    if (paste && sel.ranges.length > 1) {
+      if (lastCopied && lastCopied.text.join("\n") == inserted) {
+        if (sel.ranges.length % lastCopied.text.length == 0) {
+          multiPaste = [];
+          for (var i = 0; i < lastCopied.text.length; i++)
+            { multiPaste.push(doc.splitLines(lastCopied.text[i])); }
+        }
+      } else if (textLines.length == sel.ranges.length && cm.options.pasteLinesPerSelection) {
+        multiPaste = map(textLines, function (l) { return [l]; });
+      }
+    }
+
+    var updateInput = cm.curOp.updateInput;
+    // Normal behavior is to insert the new text into every selection
+    for (var i$1 = sel.ranges.length - 1; i$1 >= 0; i$1--) {
+      var range = sel.ranges[i$1];
+      var from = range.from(), to = range.to();
+      if (range.empty()) {
+        if (deleted && deleted > 0) // Handle deletion
+          { from = Pos(from.line, from.ch - deleted); }
+        else if (cm.state.overwrite && !paste) // Handle overwrite
+          { to = Pos(to.line, Math.min(getLine(doc, to.line).text.length, to.ch + lst(textLines).length)); }
+        else if (paste && lastCopied && lastCopied.lineWise && lastCopied.text.join("\n") == textLines.join("\n"))
+          { from = to = Pos(from.line, 0); }
+      }
+      var changeEvent = {from: from, to: to, text: multiPaste ? multiPaste[i$1 % multiPaste.length] : textLines,
+                         origin: origin || (paste ? "paste" : cm.state.cutIncoming > recent ? "cut" : "+input")};
+      makeChange(cm.doc, changeEvent);
+      signalLater(cm, "inputRead", cm, changeEvent);
+    }
+    if (inserted && !paste)
+      { triggerElectric(cm, inserted); }
+
+    ensureCursorVisible(cm);
+    if (cm.curOp.updateInput < 2) { cm.curOp.updateInput = updateInput; }
+    cm.curOp.typing = true;
+    cm.state.pasteIncoming = cm.state.cutIncoming = -1;
+  }
+
+  function handlePaste(e, cm) {
+    var pasted = e.clipboardData && e.clipboardData.getData("Text");
+    if (pasted) {
+      e.preventDefault();
+      if (!cm.isReadOnly() && !cm.options.disableInput)
+        { runInOp(cm, function () { return applyTextInput(cm, pasted, 0, null, "paste"); }); }
+      return true
+    }
+  }
+
+  function triggerElectric(cm, inserted) {
+    // When an 'electric' character is inserted, immediately trigger a reindent
+    if (!cm.options.electricChars || !cm.options.smartIndent) { return }
+    var sel = cm.doc.sel;
+
+    for (var i = sel.ranges.length - 1; i >= 0; i--) {
+      var range = sel.ranges[i];
+      if (range.head.ch > 100 || (i && sel.ranges[i - 1].head.line == range.head.line)) { continue }
+      var mode = cm.getModeAt(range.head);
+      var indented = false;
+      if (mode.electricChars) {
+        for (var j = 0; j < mode.electricChars.length; j++)
+          { if (inserted.indexOf(mode.electricChars.charAt(j)) > -1) {
+            indented = indentLine(cm, range.head.line, "smart");
+            break
+          } }
+      } else if (mode.electricInput) {
+        if (mode.electricInput.test(getLine(cm.doc, range.head.line).text.slice(0, range.head.ch)))
+          { indented = indentLine(cm, range.head.line, "smart"); }
+      }
+      if (indented) { signalLater(cm, "electricInput", cm, range.head.line); }
+    }
+  }
+
+  function copyableRanges(cm) {
+    var text = [], ranges = [];
+    for (var i = 0; i < cm.doc.sel.ranges.length; i++) {
+      var line = cm.doc.sel.ranges[i].head.line;
+      var lineRange = {anchor: Pos(line, 0), head: Pos(line + 1, 0)};
+      ranges.push(lineRange);
+      text.push(cm.getRange(lineRange.anchor, lineRange.head));
+    }
+    return {text: text, ranges: ranges}
+  }
+
+  function disableBrowserMagic(field, spellcheck, autocorrect, autocapitalize) {
+    field.setAttribute("autocorrect", autocorrect ? "" : "off");
+    field.setAttribute("autocapitalize", autocapitalize ? "" : "off");
+    field.setAttribute("spellcheck", !!spellcheck);
+  }
+
+  function hiddenTextarea() {
+    var te = elt("textarea", null, null, "position: absolute; bottom: -1em; padding: 0; width: 1px; height: 1em; outline: none");
+    var div = elt("div", [te], null, "overflow: hidden; position: relative; width: 3px; height: 0px;");
+    // The textarea is kept positioned near the cursor to prevent the
+    // fact that it'll be scrolled into view on input from scrolling
+    // our fake cursor out of view. On webkit, when wrap=off, paste is
+    // very slow. So make the area wide instead.
+    if (webkit) { te.style.width = "1000px"; }
+    else { te.setAttribute("wrap", "off"); }
+    // If border: 0; -- iOS fails to open keyboard (issue #1287)
+    if (ios) { te.style.border = "1px solid black"; }
+    disableBrowserMagic(te);
+    return div
+  }
+
+  // The publicly visible API. Note that methodOp(f) means
+  // 'wrap f in an operation, performed on its `this` parameter'.
+
+  // This is not the complete set of editor methods. Most of the
+  // methods defined on the Doc type are also injected into
+  // CodeMirror.prototype, for backwards compatibility and
+  // convenience.
+
+  function addEditorMethods(CodeMirror) {
+    var optionHandlers = CodeMirror.optionHandlers;
+
+    var helpers = CodeMirror.helpers = {};
+
+    CodeMirror.prototype = {
+      constructor: CodeMirror,
+      focus: function(){window.focus(); this.display.input.focus();},
+
+      setOption: function(option, value) {
+        var options = this.options, old = options[option];
+        if (options[option] == value && option != "mode") { return }
+        options[option] = value;
+        if (optionHandlers.hasOwnProperty(option))
+          { operation(this, optionHandlers[option])(this, value, old); }
+        signal(this, "optionChange", this, option);
+      },
+
+      getOption: function(option) {return this.options[option]},
+      getDoc: function() {return this.doc},
+
+      addKeyMap: function(map, bottom) {
+        this.state.keyMaps[bottom ? "push" : "unshift"](getKeyMap(map));
+      },
+      removeKeyMap: function(map) {
+        var maps = this.state.keyMaps;
+        for (var i = 0; i < maps.length; ++i)
+          { if (maps[i] == map || maps[i].name == map) {
+            maps.splice(i, 1);
+            return true
+          } }
+      },
+
+      addOverlay: methodOp(function(spec, options) {
+        var mode = spec.token ? spec : CodeMirror.getMode(this.options, spec);
+        if (mode.startState) { throw new Error("Overlays may not be stateful.") }
+        insertSorted(this.state.overlays,
+                     {mode: mode, modeSpec: spec, opaque: options && options.opaque,
+                      priority: (options && options.priority) || 0},
+                     function (overlay) { return overlay.priority; });
+        this.state.modeGen++;
+        regChange(this);
+      }),
+      removeOverlay: methodOp(function(spec) {
+        var overlays = this.state.overlays;
+        for (var i = 0; i < overlays.length; ++i) {
+          var cur = overlays[i].modeSpec;
+          if (cur == spec || typeof spec == "string" && cur.name == spec) {
+            overlays.splice(i, 1);
+            this.state.modeGen++;
+            regChange(this);
+            return
+          }
+        }
+      }),
+
+      indentLine: methodOp(function(n, dir, aggressive) {
+        if (typeof dir != "string" && typeof dir != "number") {
+          if (dir == null) { dir = this.options.smartIndent ? "smart" : "prev"; }
+          else { dir = dir ? "add" : "subtract"; }
+        }
+        if (isLine(this.doc, n)) { indentLine(this, n, dir, aggressive); }
+      }),
+      indentSelection: methodOp(function(how) {
+        var ranges = this.doc.sel.ranges, end = -1;
+        for (var i = 0; i < ranges.length; i++) {
+          var range = ranges[i];
+          if (!range.empty()) {
+            var from = range.from(), to = range.to();
+            var start = Math.max(end, from.line);
+            end = Math.min(this.lastLine(), to.line - (to.ch ? 0 : 1)) + 1;
+            for (var j = start; j < end; ++j)
+              { indentLine(this, j, how); }
+            var newRanges = this.doc.sel.ranges;
+            if (from.ch == 0 && ranges.length == newRanges.length && newRanges[i].from().ch > 0)
+              { replaceOneSelection(this.doc, i, new Range(from, newRanges[i].to()), sel_dontScroll); }
+          } else if (range.head.line > end) {
+            indentLine(this, range.head.line, how, true);
+            end = range.head.line;
+            if (i == this.doc.sel.primIndex) { ensureCursorVisible(this); }
+          }
+        }
+      }),
+
+      // Fetch the parser token for a given character. Useful for hacks
+      // that want to inspect the mode state (say, for completion).
+      getTokenAt: function(pos, precise) {
+        return takeToken(this, pos, precise)
+      },
+
+      getLineTokens: function(line, precise) {
+        return takeToken(this, Pos(line), precise, true)
+      },
+
+      getTokenTypeAt: function(pos) {
+        pos = clipPos(this.doc, pos);
+        var styles = getLineStyles(this, getLine(this.doc, pos.line));
+        var before = 0, after = (styles.length - 1) / 2, ch = pos.ch;
+        var type;
+        if (ch == 0) { type = styles[2]; }
+        else { for (;;) {
+          var mid = (before + after) >> 1;
+          if ((mid ? styles[mid * 2 - 1] : 0) >= ch) { after = mid; }
+          else if (styles[mid * 2 + 1] < ch) { before = mid + 1; }
+          else { type = styles[mid * 2 + 2]; break }
+        } }
+        var cut = type ? type.indexOf("overlay ") : -1;
+        return cut < 0 ? type : cut == 0 ? null : type.slice(0, cut - 1)
+      },
+
+      getModeAt: function(pos) {
+        var mode = this.doc.mode;
+        if (!mode.innerMode) { return mode }
+        return CodeMirror.innerMode(mode, this.getTokenAt(pos).state).mode
+      },
+
+      getHelper: function(pos, type) {
+        return this.getHelpers(pos, type)[0]
+      },
+
+      getHelpers: function(pos, type) {
+        var found = [];
+        if (!helpers.hasOwnProperty(type)) { return found }
+        var help = helpers[type], mode = this.getModeAt(pos);
+        if (typeof mode[type] == "string") {
+          if (help[mode[type]]) { found.push(help[mode[type]]); }
+        } else if (mode[type]) {
+          for (var i = 0; i < mode[type].length; i++) {
+            var val = help[mode[type][i]];
+            if (val) { found.push(val); }
+          }
+        } else if (mode.helperType && help[mode.helperType]) {
+          found.push(help[mode.helperType]);
+        } else if (help[mode.name]) {
+          found.push(help[mode.name]);
+        }
+        for (var i$1 = 0; i$1 < help._global.length; i$1++) {
+          var cur = help._global[i$1];
+          if (cur.pred(mode, this) && indexOf(found, cur.val) == -1)
+            { found.push(cur.val); }
+        }
+        return found
+      },
+
+      getStateAfter: function(line, precise) {
+        var doc = this.doc;
+        line = clipLine(doc, line == null ? doc.first + doc.size - 1: line);
+        return getContextBefore(this, line + 1, precise).state
+      },
+
+      cursorCoords: function(start, mode) {
+        var pos, range = this.doc.sel.primary();
+        if (start == null) { pos = range.head; }
+        else if (typeof start == "object") { pos = clipPos(this.doc, start); }
+        else { pos = start ? range.from() : range.to(); }
+        return cursorCoords(this, pos, mode || "page")
+      },
+
+      charCoords: function(pos, mode) {
+        return charCoords(this, clipPos(this.doc, pos), mode || "page")
+      },
+
+      coordsChar: function(coords, mode) {
+        coords = fromCoordSystem(this, coords, mode || "page");
+        return coordsChar(this, coords.left, coords.top)
+      },
+
+      lineAtHeight: function(height, mode) {
+        height = fromCoordSystem(this, {top: height, left: 0}, mode || "page").top;
+        return lineAtHeight(this.doc, height + this.display.viewOffset)
+      },
+      heightAtLine: function(line, mode, includeWidgets) {
+        var end = false, lineObj;
+        if (typeof line == "number") {
+          var last = this.doc.first + this.doc.size - 1;
+          if (line < this.doc.first) { line = this.doc.first; }
+          else if (line > last) { line = last; end = true; }
+          lineObj = getLine(this.doc, line);
+        } else {
+          lineObj = line;
+        }
+        return intoCoordSystem(this, lineObj, {top: 0, left: 0}, mode || "page", includeWidgets || end).top +
+          (end ? this.doc.height - heightAtLine(lineObj) : 0)
+      },
+
+      defaultTextHeight: function() { return textHeight(this.display) },
+      defaultCharWidth: function() { return charWidth(this.display) },
+
+      getViewport: function() { return {from: this.display.viewFrom, to: this.display.viewTo}},
+
+      addWidget: function(pos, node, scroll, vert, horiz) {
+        var display = this.display;
+        pos = cursorCoords(this, clipPos(this.doc, pos));
+        var top = pos.bottom, left = pos.left;
+        node.style.position = "absolute";
+        node.setAttribute("cm-ignore-events", "true");
+        this.display.input.setUneditable(node);
+        display.sizer.appendChild(node);
+        if (vert == "over") {
+          top = pos.top;
+        } else if (vert == "above" || vert == "near") {
+          var vspace = Math.max(display.wrapper.clientHeight, this.doc.height),
+          hspace = Math.max(display.sizer.clientWidth, display.lineSpace.clientWidth);
+          // Default to positioning above (if specified and possible); otherwise default to positioning below
+          if ((vert == 'above' || pos.bottom + node.offsetHeight > vspace) && pos.top > node.offsetHeight)
+            { top = pos.top - node.offsetHeight; }
+          else if (pos.bottom + node.offsetHeight <= vspace)
+            { top = pos.bottom; }
+          if (left + node.offsetWidth > hspace)
+            { left = hspace - node.offsetWidth; }
+        }
+        node.style.top = top + "px";
+        node.style.left = node.style.right = "";
+        if (horiz == "right") {
+          left = display.sizer.clientWidth - node.offsetWidth;
+          node.style.right = "0px";
+        } else {
+          if (horiz == "left") { left = 0; }
+          else if (horiz == "middle") { left = (display.sizer.clientWidth - node.offsetWidth) / 2; }
+          node.style.left = left + "px";
+        }
+        if (scroll)
+          { scrollIntoView(this, {left: left, top: top, right: left + node.offsetWidth, bottom: top + node.offsetHeight}); }
+      },
+
+      triggerOnKeyDown: methodOp(onKeyDown),
+      triggerOnKeyPress: methodOp(onKeyPress),
+      triggerOnKeyUp: onKeyUp,
+      triggerOnMouseDown: methodOp(onMouseDown),
+
+      execCommand: function(cmd) {
+        if (commands.hasOwnProperty(cmd))
+          { return commands[cmd].call(null, this) }
+      },
+
+      triggerElectric: methodOp(function(text) { triggerElectric(this, text); }),
+
+      findPosH: function(from, amount, unit, visually) {
+        var dir = 1;
+        if (amount < 0) { dir = -1; amount = -amount; }
+        var cur = clipPos(this.doc, from);
+        for (var i = 0; i < amount; ++i) {
+          cur = findPosH(this.doc, cur, dir, unit, visually);
+          if (cur.hitSide) { break }
+        }
+        return cur
+      },
+
+      moveH: methodOp(function(dir, unit) {
+        var this$1 = this;
+
+        this.extendSelectionsBy(function (range) {
+          if (this$1.display.shift || this$1.doc.extend || range.empty())
+            { return findPosH(this$1.doc, range.head, dir, unit, this$1.options.rtlMoveVisually) }
+          else
+            { return dir < 0 ? range.from() : range.to() }
+        }, sel_move);
+      }),
+
+      deleteH: methodOp(function(dir, unit) {
+        var sel = this.doc.sel, doc = this.doc;
+        if (sel.somethingSelected())
+          { doc.replaceSelection("", null, "+delete"); }
+        else
+          { deleteNearSelection(this, function (range) {
+            var other = findPosH(doc, range.head, dir, unit, false);
+            return dir < 0 ? {from: other, to: range.head} : {from: range.head, to: other}
+          }); }
+      }),
+
+      findPosV: function(from, amount, unit, goalColumn) {
+        var dir = 1, x = goalColumn;
+        if (amount < 0) { dir = -1; amount = -amount; }
+        var cur = clipPos(this.doc, from);
+        for (var i = 0; i < amount; ++i) {
+          var coords = cursorCoords(this, cur, "div");
+          if (x == null) { x = coords.left; }
+          else { coords.left = x; }
+          cur = findPosV(this, coords, dir, unit);
+          if (cur.hitSide) { break }
+        }
+        return cur
+      },
+
+      moveV: methodOp(function(dir, unit) {
+        var this$1 = this;
+
+        var doc = this.doc, goals = [];
+        var collapse = !this.display.shift && !doc.extend && doc.sel.somethingSelected();
+        doc.extendSelectionsBy(function (range) {
+          if (collapse)
+            { return dir < 0 ? range.from() : range.to() }
+          var headPos = cursorCoords(this$1, range.head, "div");
+          if (range.goalColumn != null) { headPos.left = range.goalColumn; }
+          goals.push(headPos.left);
+          var pos = findPosV(this$1, headPos, dir, unit);
+          if (unit == "page" && range == doc.sel.primary())
+            { addToScrollTop(this$1, charCoords(this$1, pos, "div").top - headPos.top); }
+          return pos
+        }, sel_move);
+        if (goals.length) { for (var i = 0; i < doc.sel.ranges.length; i++)
+          { doc.sel.ranges[i].goalColumn = goals[i]; } }
+      }),
+
+      // Find the word at the given position (as returned by coordsChar).
+      findWordAt: function(pos) {
+        var doc = this.doc, line = getLine(doc, pos.line).text;
+        var start = pos.ch, end = pos.ch;
+        if (line) {
+          var helper = this.getHelper(pos, "wordChars");
+          if ((pos.sticky == "before" || end == line.length) && start) { --start; } else { ++end; }
+          var startChar = line.charAt(start);
+          var check = isWordChar(startChar, helper)
+            ? function (ch) { return isWordChar(ch, helper); }
+            : /\s/.test(startChar) ? function (ch) { return /\s/.test(ch); }
+            : function (ch) { return (!/\s/.test(ch) && !isWordChar(ch)); };
+          while (start > 0 && check(line.charAt(start - 1))) { --start; }
+          while (end < line.length && check(line.charAt(end))) { ++end; }
+        }
+        return new Range(Pos(pos.line, start), Pos(pos.line, end))
+      },
+
+      toggleOverwrite: function(value) {
+        if (value != null && value == this.state.overwrite) { return }
+        if (this.state.overwrite = !this.state.overwrite)
+          { addClass(this.display.cursorDiv, "CodeMirror-overwrite"); }
+        else
+          { rmClass(this.display.cursorDiv, "CodeMirror-overwrite"); }
+
+        signal(this, "overwriteToggle", this, this.state.overwrite);
+      },
+      hasFocus: function() { return this.display.input.getField() == activeElt() },
+      isReadOnly: function() { return !!(this.options.readOnly || this.doc.cantEdit) },
+
+      scrollTo: methodOp(function (x, y) { scrollToCoords(this, x, y); }),
+      getScrollInfo: function() {
+        var scroller = this.display.scroller;
+        return {left: scroller.scrollLeft, top: scroller.scrollTop,
+                height: scroller.scrollHeight - scrollGap(this) - this.display.barHeight,
+                width: scroller.scrollWidth - scrollGap(this) - this.display.barWidth,
+                clientHeight: displayHeight(this), clientWidth: displayWidth(this)}
+      },
+
+      scrollIntoView: methodOp(function(range, margin) {
+        if (range == null) {
+          range = {from: this.doc.sel.primary().head, to: null};
+          if (margin == null) { margin = this.options.cursorScrollMargin; }
+        } else if (typeof range == "number") {
+          range = {from: Pos(range, 0), to: null};
+        } else if (range.from == null) {
+          range = {from: range, to: null};
+        }
+        if (!range.to) { range.to = range.from; }
+        range.margin = margin || 0;
+
+        if (range.from.line != null) {
+          scrollToRange(this, range);
+        } else {
+          scrollToCoordsRange(this, range.from, range.to, range.margin);
+        }
+      }),
+
+      setSize: methodOp(function(width, height) {
+        var this$1 = this;
+
+        var interpret = function (val) { return typeof val == "number" || /^\d+$/.test(String(val)) ? val + "px" : val; };
+        if (width != null) { this.display.wrapper.style.width = interpret(width); }
+        if (height != null) { this.display.wrapper.style.height = interpret(height); }
+        if (this.options.lineWrapping) { clearLineMeasurementCache(this); }
+        var lineNo = this.display.viewFrom;
+        this.doc.iter(lineNo, this.display.viewTo, function (line) {
+          if (line.widgets) { for (var i = 0; i < line.widgets.length; i++)
+            { if (line.widgets[i].noHScroll) { regLineChange(this$1, lineNo, "widget"); break } } }
+          ++lineNo;
+        });
+        this.curOp.forceUpdate = true;
+        signal(this, "refresh", this);
+      }),
+
+      operation: function(f){return runInOp(this, f)},
+      startOperation: function(){return startOperation(this)},
+      endOperation: function(){return endOperation(this)},
+
+      refresh: methodOp(function() {
+        var oldHeight = this.display.cachedTextHeight;
+        regChange(this);
+        this.curOp.forceUpdate = true;
+        clearCaches(this);
+        scrollToCoords(this, this.doc.scrollLeft, this.doc.scrollTop);
+        updateGutterSpace(this.display);
+        if (oldHeight == null || Math.abs(oldHeight - textHeight(this.display)) > .5 || this.options.lineWrapping)
+          { estimateLineHeights(this); }
+        signal(this, "refresh", this);
+      }),
+
+      swapDoc: methodOp(function(doc) {
+        var old = this.doc;
+        old.cm = null;
+        // Cancel the current text selection if any (#5821)
+        if (this.state.selectingText) { this.state.selectingText(); }
+        attachDoc(this, doc);
+        clearCaches(this);
+        this.display.input.reset();
+        scrollToCoords(this, doc.scrollLeft, doc.scrollTop);
+        this.curOp.forceScroll = true;
+        signalLater(this, "swapDoc", this, old);
+        return old
+      }),
+
+      phrase: function(phraseText) {
+        var phrases = this.options.phrases;
+        return phrases && Object.prototype.hasOwnProperty.call(phrases, phraseText) ? phrases[phraseText] : phraseText
+      },
+
+      getInputField: function(){return this.display.input.getField()},
+      getWrapperElement: function(){return this.display.wrapper},
+      getScrollerElement: function(){return this.display.scroller},
+      getGutterElement: function(){return this.display.gutters}
+    };
+    eventMixin(CodeMirror);
+
+    CodeMirror.registerHelper = function(type, name, value) {
+      if (!helpers.hasOwnProperty(type)) { helpers[type] = CodeMirror[type] = {_global: []}; }
+      helpers[type][name] = value;
+    };
+    CodeMirror.registerGlobalHelper = function(type, name, predicate, value) {
+      CodeMirror.registerHelper(type, name, value);
+      helpers[type]._global.push({pred: predicate, val: value});
+    };
+  }
+
+  // Used for horizontal relative motion. Dir is -1 or 1 (left or
+  // right), unit can be "codepoint", "char", "column" (like char, but
+  // doesn't cross line boundaries), "word" (across next word), or
+  // "group" (to the start of next group of word or
+  // non-word-non-whitespace chars). The visually param controls
+  // whether, in right-to-left text, direction 1 means to move towards
+  // the next index in the string, or towards the character to the right
+  // of the current position. The resulting position will have a
+  // hitSide=true property if it reached the end of the document.
+  function findPosH(doc, pos, dir, unit, visually) {
+    var oldPos = pos;
+    var origDir = dir;
+    var lineObj = getLine(doc, pos.line);
+    var lineDir = visually && doc.direction == "rtl" ? -dir : dir;
+    function findNextLine() {
+      var l = pos.line + lineDir;
+      if (l < doc.first || l >= doc.first + doc.size) { return false }
+      pos = new Pos(l, pos.ch, pos.sticky);
+      return lineObj = getLine(doc, l)
+    }
+    function moveOnce(boundToLine) {
+      var next;
+      if (unit == "codepoint") {
+        var ch = lineObj.text.charCodeAt(pos.ch + (unit > 0 ? 0 : -1));
+        if (isNaN(ch)) { next = null; }
+        else { next = new Pos(pos.line, Math.max(0, Math.min(lineObj.text.length, pos.ch + dir * (ch >= 0xD800 && ch < 0xDC00 ? 2 : 1))),
+                            -dir); }
+      } else if (visually) {
+        next = moveVisually(doc.cm, lineObj, pos, dir);
+      } else {
+        next = moveLogically(lineObj, pos, dir);
+      }
+      if (next == null) {
+        if (!boundToLine && findNextLine())
+          { pos = endOfLine(visually, doc.cm, lineObj, pos.line, lineDir); }
+        else
+          { return false }
+      } else {
+        pos = next;
+      }
+      return true
+    }
+
+    if (unit == "char" || unit == "codepoint") {
+      moveOnce();
+    } else if (unit == "column") {
+      moveOnce(true);
+    } else if (unit == "word" || unit == "group") {
+      var sawType = null, group = unit == "group";
+      var helper = doc.cm && doc.cm.getHelper(pos, "wordChars");
+      for (var first = true;; first = false) {
+        if (dir < 0 && !moveOnce(!first)) { break }
+        var cur = lineObj.text.charAt(pos.ch) || "\n";
+        var type = isWordChar(cur, helper) ? "w"
+          : group && cur == "\n" ? "n"
+          : !group || /\s/.test(cur) ? null
+          : "p";
+        if (group && !first && !type) { type = "s"; }
+        if (sawType && sawType != type) {
+          if (dir < 0) {dir = 1; moveOnce(); pos.sticky = "after";}
+          break
+        }
+
+        if (type) { sawType = type; }
+        if (dir > 0 && !moveOnce(!first)) { break }
+      }
+    }
+    var result = skipAtomic(doc, pos, oldPos, origDir, true);
+    if (equalCursorPos(oldPos, result)) { result.hitSide = true; }
+    return result
+  }
+
+  // For relative vertical movement. Dir may be -1 or 1. Unit can be
+  // "page" or "line". The resulting position will have a hitSide=true
+  // property if it reached the end of the document.
+  function findPosV(cm, pos, dir, unit) {
+    var doc = cm.doc, x = pos.left, y;
+    if (unit == "page") {
+      var pageSize = Math.min(cm.display.wrapper.clientHeight, window.innerHeight || document.documentElement.clientHeight);
+      var moveAmount = Math.max(pageSize - .5 * textHeight(cm.display), 3);
+      y = (dir > 0 ? pos.bottom : pos.top) + dir * moveAmount;
+
+    } else if (unit == "line") {
+      y = dir > 0 ? pos.bottom + 3 : pos.top - 3;
+    }
+    var target;
+    for (;;) {
+      target = coordsChar(cm, x, y);
+      if (!target.outside) { break }
+      if (dir < 0 ? y <= 0 : y >= doc.height) { target.hitSide = true; break }
+      y += dir * 5;
+    }
+    return target
+  }
+
+  // CONTENTEDITABLE INPUT STYLE
+
+  var ContentEditableInput = function(cm) {
+    this.cm = cm;
+    this.lastAnchorNode = this.lastAnchorOffset = this.lastFocusNode = this.lastFocusOffset = null;
+    this.polling = new Delayed();
+    this.composing = null;
+    this.gracePeriod = false;
+    this.readDOMTimeout = null;
+  };
+
+  ContentEditableInput.prototype.init = function (display) {
+      var this$1 = this;
+
+    var input = this, cm = input.cm;
+    var div = input.div = display.lineDiv;
+    disableBrowserMagic(div, cm.options.spellcheck, cm.options.autocorrect, cm.options.autocapitalize);
+
+    function belongsToInput(e) {
+      for (var t = e.target; t; t = t.parentNode) {
+        if (t == div) { return true }
+        if (/\bCodeMirror-(?:line)?widget\b/.test(t.className)) { break }
+      }
+      return false
+    }
+
+    on(div, "paste", function (e) {
+      if (!belongsToInput(e) || signalDOMEvent(cm, e) || handlePaste(e, cm)) { return }
+      // IE doesn't fire input events, so we schedule a read for the pasted content in this way
+      if (ie_version <= 11) { setTimeout(operation(cm, function () { return this$1.updateFromDOM(); }), 20); }
+    });
+
+    on(div, "compositionstart", function (e) {
+      this$1.composing = {data: e.data, done: false};
+    });
+    on(div, "compositionupdate", function (e) {
+      if (!this$1.composing) { this$1.composing = {data: e.data, done: false}; }
+    });
+    on(div, "compositionend", function (e) {
+      if (this$1.composing) {
+        if (e.data != this$1.composing.data) { this$1.readFromDOMSoon(); }
+        this$1.composing.done = true;
+      }
+    });
+
+    on(div, "touchstart", function () { return input.forceCompositionEnd(); });
+
+    on(div, "input", function () {
+      if (!this$1.composing) { this$1.readFromDOMSoon(); }
+    });
+
+    function onCopyCut(e) {
+      if (!belongsToInput(e) || signalDOMEvent(cm, e)) { return }
+      if (cm.somethingSelected()) {
+        setLastCopied({lineWise: false, text: cm.getSelections()});
+        if (e.type == "cut") { cm.replaceSelection("", null, "cut"); }
+      } else if (!cm.options.lineWiseCopyCut) {
+        return
+      } else {
+        var ranges = copyableRanges(cm);
+        setLastCopied({lineWise: true, text: ranges.text});
+        if (e.type == "cut") {
+          cm.operation(function () {
+            cm.setSelections(ranges.ranges, 0, sel_dontScroll);
+            cm.replaceSelection("", null, "cut");
+          });
+        }
+      }
+      if (e.clipboardData) {
+        e.clipboardData.clearData();
+        var content = lastCopied.text.join("\n");
+        // iOS exposes the clipboard API, but seems to discard content inserted into it
+        e.clipboardData.setData("Text", content);
+        if (e.clipboardData.getData("Text") == content) {
+          e.preventDefault();
+          return
+        }
+      }
+      // Old-fashioned briefly-focus-a-textarea hack
+      var kludge = hiddenTextarea(), te = kludge.firstChild;
+      cm.display.lineSpace.insertBefore(kludge, cm.display.lineSpace.firstChild);
+      te.value = lastCopied.text.join("\n");
+      var hadFocus = document.activeElement;
+      selectInput(te);
+      setTimeout(function () {
+        cm.display.lineSpace.removeChild(kludge);
+        hadFocus.focus();
+        if (hadFocus == div) { input.showPrimarySelection(); }
+      }, 50);
+    }
+    on(div, "copy", onCopyCut);
+    on(div, "cut", onCopyCut);
+  };
+
+  ContentEditableInput.prototype.screenReaderLabelChanged = function (label) {
+    // Label for screenreaders, accessibility
+    if(label) {
+      this.div.setAttribute('aria-label', label);
+    } else {
+      this.div.removeAttribute('aria-label');
+    }
+  };
+
+  ContentEditableInput.prototype.prepareSelection = function () {
+    var result = prepareSelection(this.cm, false);
+    result.focus = document.activeElement == this.div;
+    return result
+  };
+
+  ContentEditableInput.prototype.showSelection = function (info, takeFocus) {
+    if (!info || !this.cm.display.view.length) { return }
+    if (info.focus || takeFocus) { this.showPrimarySelection(); }
+    this.showMultipleSelections(info);
+  };
+
+  ContentEditableInput.prototype.getSelection = function () {
+    return this.cm.display.wrapper.ownerDocument.getSelection()
+  };
+
+  ContentEditableInput.prototype.showPrimarySelection = function () {
+    var sel = this.getSelection(), cm = this.cm, prim = cm.doc.sel.primary();
+    var from = prim.from(), to = prim.to();
+
+    if (cm.display.viewTo == cm.display.viewFrom || from.line >= cm.display.viewTo || to.line < cm.display.viewFrom) {
+      sel.removeAllRanges();
+      return
+    }
+
+    var curAnchor = domToPos(cm, sel.anchorNode, sel.anchorOffset);
+    var curFocus = domToPos(cm, sel.focusNode, sel.focusOffset);
+    if (curAnchor && !curAnchor.bad && curFocus && !curFocus.bad &&
+        cmp(minPos(curAnchor, curFocus), from) == 0 &&
+        cmp(maxPos(curAnchor, curFocus), to) == 0)
+      { return }
+
+    var view = cm.display.view;
+    var start = (from.line >= cm.display.viewFrom && posToDOM(cm, from)) ||
+        {node: view[0].measure.map[2], offset: 0};
+    var end = to.line < cm.display.viewTo && posToDOM(cm, to);
+    if (!end) {
+      var measure = view[view.length - 1].measure;
+      var map = measure.maps ? measure.maps[measure.maps.length - 1] : measure.map;
+      end = {node: map[map.length - 1], offset: map[map.length - 2] - map[map.length - 3]};
+    }
+
+    if (!start || !end) {
+      sel.removeAllRanges();
+      return
+    }
+
+    var old = sel.rangeCount && sel.getRangeAt(0), rng;
+    try { rng = range(start.node, start.offset, end.offset, end.node); }
+    catch(e) {} // Our model of the DOM might be outdated, in which case the range we try to set can be impossible
+    if (rng) {
+      if (!gecko && cm.state.focused) {
+        sel.collapse(start.node, start.offset);
+        if (!rng.collapsed) {
+          sel.removeAllRanges();
+          sel.addRange(rng);
+        }
+      } else {
+        sel.removeAllRanges();
+        sel.addRange(rng);
+      }
+      if (old && sel.anchorNode == null) { sel.addRange(old); }
+      else if (gecko) { this.startGracePeriod(); }
+    }
+    this.rememberSelection();
+  };
+
+  ContentEditableInput.prototype.startGracePeriod = function () {
+      var this$1 = this;
+
+    clearTimeout(this.gracePeriod);
+    this.gracePeriod = setTimeout(function () {
+      this$1.gracePeriod = false;
+      if (this$1.selectionChanged())
+        { this$1.cm.operation(function () { return this$1.cm.curOp.selectionChanged = true; }); }
+    }, 20);
+  };
+
+  ContentEditableInput.prototype.showMultipleSelections = function (info) {
+    removeChildrenAndAdd(this.cm.display.cursorDiv, info.cursors);
+    removeChildrenAndAdd(this.cm.display.selectionDiv, info.selection);
+  };
+
+  ContentEditableInput.prototype.rememberSelection = function () {
+    var sel = this.getSelection();
+    this.lastAnchorNode = sel.anchorNode; this.lastAnchorOffset = sel.anchorOffset;
+    this.lastFocusNode = sel.focusNode; this.lastFocusOffset = sel.focusOffset;
+  };
+
+  ContentEditableInput.prototype.selectionInEditor = function () {
+    var sel = this.getSelection();
+    if (!sel.rangeCount) { return false }
+    var node = sel.getRangeAt(0).commonAncestorContainer;
+    return contains(this.div, node)
+  };
+
+  ContentEditableInput.prototype.focus = function () {
+    if (this.cm.options.readOnly != "nocursor") {
+      if (!this.selectionInEditor() || document.activeElement != this.div)
+        { this.showSelection(this.prepareSelection(), true); }
+      this.div.focus();
+    }
+  };
+  ContentEditableInput.prototype.blur = function () { this.div.blur(); };
+  ContentEditableInput.prototype.getField = function () { return this.div };
+
+  ContentEditableInput.prototype.supportsTouch = function () { return true };
+
+  ContentEditableInput.prototype.receivedFocus = function () {
+    var input = this;
+    if (this.selectionInEditor())
+      { this.pollSelection(); }
+    else
+      { runInOp(this.cm, function () { return input.cm.curOp.selectionChanged = true; }); }
+
+    function poll() {
+      if (input.cm.state.focused) {
+        input.pollSelection();
+        input.polling.set(input.cm.options.pollInterval, poll);
+      }
+    }
+    this.polling.set(this.cm.options.pollInterval, poll);
+  };
+
+  ContentEditableInput.prototype.selectionChanged = function () {
+    var sel = this.getSelection();
+    return sel.anchorNode != this.lastAnchorNode || sel.anchorOffset != this.lastAnchorOffset ||
+      sel.focusNode != this.lastFocusNode || sel.focusOffset != this.lastFocusOffset
+  };
+
+  ContentEditableInput.prototype.pollSelection = function () {
+    if (this.readDOMTimeout != null || this.gracePeriod || !this.selectionChanged()) { return }
+    var sel = this.getSelection(), cm = this.cm;
+    // On Android Chrome (version 56, at least), backspacing into an
+    // uneditable block element will put the cursor in that element,
+    // and then, because it's not editable, hide the virtual keyboard.
+    // Because Android doesn't allow us to actually detect backspace
+    // presses in a sane way, this code checks for when that happens
+    // and simulates a backspace press in this case.
+    if (android && chrome && this.cm.display.gutterSpecs.length && isInGutter(sel.anchorNode)) {
+      this.cm.triggerOnKeyDown({type: "keydown", keyCode: 8, preventDefault: Math.abs});
+      this.blur();
+      this.focus();
+      return
+    }
+    if (this.composing) { return }
+    this.rememberSelection();
+    var anchor = domToPos(cm, sel.anchorNode, sel.anchorOffset);
+    var head = domToPos(cm, sel.focusNode, sel.focusOffset);
+    if (anchor && head) { runInOp(cm, function () {
+      setSelection(cm.doc, simpleSelection(anchor, head), sel_dontScroll);
+      if (anchor.bad || head.bad) { cm.curOp.selectionChanged = true; }
+    }); }
+  };
+
+  ContentEditableInput.prototype.pollContent = function () {
+    if (this.readDOMTimeout != null) {
+      clearTimeout(this.readDOMTimeout);
+      this.readDOMTimeout = null;
+    }
+
+    var cm = this.cm, display = cm.display, sel = cm.doc.sel.primary();
+    var from = sel.from(), to = sel.to();
+    if (from.ch == 0 && from.line > cm.firstLine())
+      { from = Pos(from.line - 1, getLine(cm.doc, from.line - 1).length); }
+    if (to.ch == getLine(cm.doc, to.line).text.length && to.line < cm.lastLine())
+      { to = Pos(to.line + 1, 0); }
+    if (from.line < display.viewFrom || to.line > display.viewTo - 1) { return false }
+
+    var fromIndex, fromLine, fromNode;
+    if (from.line == display.viewFrom || (fromIndex = findViewIndex(cm, from.line)) == 0) {
+      fromLine = lineNo(display.view[0].line);
+      fromNode = display.view[0].node;
+    } else {
+      fromLine = lineNo(display.view[fromIndex].line);
+      fromNode = display.view[fromIndex - 1].node.nextSibling;
+    }
+    var toIndex = findViewIndex(cm, to.line);
+    var toLine, toNode;
+    if (toIndex == display.view.length - 1) {
+      toLine = display.viewTo - 1;
+      toNode = display.lineDiv.lastChild;
+    } else {
+      toLine = lineNo(display.view[toIndex + 1].line) - 1;
+      toNode = display.view[toIndex + 1].node.previousSibling;
+    }
+
+    if (!fromNode) { return false }
+    var newText = cm.doc.splitLines(domTextBetween(cm, fromNode, toNode, fromLine, toLine));
+    var oldText = getBetween(cm.doc, Pos(fromLine, 0), Pos(toLine, getLine(cm.doc, toLine).text.length));
+    while (newText.length > 1 && oldText.length > 1) {
+      if (lst(newText) == lst(oldText)) { newText.pop(); oldText.pop(); toLine--; }
+      else if (newText[0] == oldText[0]) { newText.shift(); oldText.shift(); fromLine++; }
+      else { break }
+    }
+
+    var cutFront = 0, cutEnd = 0;
+    var newTop = newText[0], oldTop = oldText[0], maxCutFront = Math.min(newTop.length, oldTop.length);
+    while (cutFront < maxCutFront && newTop.charCodeAt(cutFront) == oldTop.charCodeAt(cutFront))
+      { ++cutFront; }
+    var newBot = lst(newText), oldBot = lst(oldText);
+    var maxCutEnd = Math.min(newBot.length - (newText.length == 1 ? cutFront : 0),
+                             oldBot.length - (oldText.length == 1 ? cutFront : 0));
+    while (cutEnd < maxCutEnd &&
+           newBot.charCodeAt(newBot.length - cutEnd - 1) == oldBot.charCodeAt(oldBot.length - cutEnd - 1))
+      { ++cutEnd; }
+    // Try to move start of change to start of selection if ambiguous
+    if (newText.length == 1 && oldText.length == 1 && fromLine == from.line) {
+      while (cutFront && cutFront > from.ch &&
+             newBot.charCodeAt(newBot.length - cutEnd - 1) == oldBot.charCodeAt(oldBot.length - cutEnd - 1)) {
+        cutFront--;
+        cutEnd++;
+      }
+    }
+
+    newText[newText.length - 1] = newBot.slice(0, newBot.length - cutEnd).replace(/^\u200b+/, "");
+    newText[0] = newText[0].slice(cutFront).replace(/\u200b+$/, "");
+
+    var chFrom = Pos(fromLine, cutFront);
+    var chTo = Pos(toLine, oldText.length ? lst(oldText).length - cutEnd : 0);
+    if (newText.length > 1 || newText[0] || cmp(chFrom, chTo)) {
+      replaceRange(cm.doc, newText, chFrom, chTo, "+input");
+      return true
+    }
+  };
+
+  ContentEditableInput.prototype.ensurePolled = function () {
+    this.forceCompositionEnd();
+  };
+  ContentEditableInput.prototype.reset = function () {
+    this.forceCompositionEnd();
+  };
+  ContentEditableInput.prototype.forceCompositionEnd = function () {
+    if (!this.composing) { return }
+    clearTimeout(this.readDOMTimeout);
+    this.composing = null;
+    this.updateFromDOM();
+    this.div.blur();
+    this.div.focus();
+  };
+  ContentEditableInput.prototype.readFromDOMSoon = function () {
+      var this$1 = this;
+
+    if (this.readDOMTimeout != null) { return }
+    this.readDOMTimeout = setTimeout(function () {
+      this$1.readDOMTimeout = null;
+      if (this$1.composing) {
+        if (this$1.composing.done) { this$1.composing = null; }
+        else { return }
+      }
+      this$1.updateFromDOM();
+    }, 80);
+  };
+
+  ContentEditableInput.prototype.updateFromDOM = function () {
+      var this$1 = this;
+
+    if (this.cm.isReadOnly() || !this.pollContent())
+      { runInOp(this.cm, function () { return regChange(this$1.cm); }); }
+  };
+
+  ContentEditableInput.prototype.setUneditable = function (node) {
+    node.contentEditable = "false";
+  };
+
+  ContentEditableInput.prototype.onKeyPress = function (e) {
+    if (e.charCode == 0 || this.composing) { return }
+    e.preventDefault();
+    if (!this.cm.isReadOnly())
+      { operation(this.cm, applyTextInput)(this.cm, String.fromCharCode(e.charCode == null ? e.keyCode : e.charCode), 0); }
+  };
+
+  ContentEditableInput.prototype.readOnlyChanged = function (val) {
+    this.div.contentEditable = String(val != "nocursor");
+  };
+
+  ContentEditableInput.prototype.onContextMenu = function () {};
+  ContentEditableInput.prototype.resetPosition = function () {};
+
+  ContentEditableInput.prototype.needsContentAttribute = true;
+
+  function posToDOM(cm, pos) {
+    var view = findViewForLine(cm, pos.line);
+    if (!view || view.hidden) { return null }
+    var line = getLine(cm.doc, pos.line);
+    var info = mapFromLineView(view, line, pos.line);
+
+    var order = getOrder(line, cm.doc.direction), side = "left";
+    if (order) {
+      var partPos = getBidiPartAt(order, pos.ch);
+      side = partPos % 2 ? "right" : "left";
+    }
+    var result = nodeAndOffsetInLineMap(info.map, pos.ch, side);
+    result.offset = result.collapse == "right" ? result.end : result.start;
+    return result
+  }
+
+  function isInGutter(node) {
+    for (var scan = node; scan; scan = scan.parentNode)
+      { if (/CodeMirror-gutter-wrapper/.test(scan.className)) { return true } }
+    return false
+  }
+
+  function badPos(pos, bad) { if (bad) { pos.bad = true; } return pos }
+
+  function domTextBetween(cm, from, to, fromLine, toLine) {
+    var text = "", closing = false, lineSep = cm.doc.lineSeparator(), extraLinebreak = false;
+    function recognizeMarker(id) { return function (marker) { return marker.id == id; } }
+    function close() {
+      if (closing) {
+        text += lineSep;
+        if (extraLinebreak) { text += lineSep; }
+        closing = extraLinebreak = false;
+      }
+    }
+    function addText(str) {
+      if (str) {
+        close();
+        text += str;
+      }
+    }
+    function walk(node) {
+      if (node.nodeType == 1) {
+        var cmText = node.getAttribute("cm-text");
+        if (cmText) {
+          addText(cmText);
+          return
+        }
+        var markerID = node.getAttribute("cm-marker"), range;
+        if (markerID) {
+          var found = cm.findMarks(Pos(fromLine, 0), Pos(toLine + 1, 0), recognizeMarker(+markerID));
+          if (found.length && (range = found[0].find(0)))
+            { addText(getBetween(cm.doc, range.from, range.to).join(lineSep)); }
+          return
+        }
+        if (node.getAttribute("contenteditable") == "false") { return }
+        var isBlock = /^(pre|div|p|li|table|br)$/i.test(node.nodeName);
+        if (!/^br$/i.test(node.nodeName) && node.textContent.length == 0) { return }
+
+        if (isBlock) { close(); }
+        for (var i = 0; i < node.childNodes.length; i++)
+          { walk(node.childNodes[i]); }
+
+        if (/^(pre|p)$/i.test(node.nodeName)) { extraLinebreak = true; }
+        if (isBlock) { closing = true; }
+      } else if (node.nodeType == 3) {
+        addText(node.nodeValue.replace(/\u200b/g, "").replace(/\u00a0/g, " "));
+      }
+    }
+    for (;;) {
+      walk(from);
+      if (from == to) { break }
+      from = from.nextSibling;
+      extraLinebreak = false;
+    }
+    return text
+  }
+
+  function domToPos(cm, node, offset) {
+    var lineNode;
+    if (node == cm.display.lineDiv) {
+      lineNode = cm.display.lineDiv.childNodes[offset];
+      if (!lineNode) { return badPos(cm.clipPos(Pos(cm.display.viewTo - 1)), true) }
+      node = null; offset = 0;
+    } else {
+      for (lineNode = node;; lineNode = lineNode.parentNode) {
+        if (!lineNode || lineNode == cm.display.lineDiv) { return null }
+        if (lineNode.parentNode && lineNode.parentNode == cm.display.lineDiv) { break }
+      }
+    }
+    for (var i = 0; i < cm.display.view.length; i++) {
+      var lineView = cm.display.view[i];
+      if (lineView.node == lineNode)
+        { return locateNodeInLineView(lineView, node, offset) }
+    }
+  }
+
+  function locateNodeInLineView(lineView, node, offset) {
+    var wrapper = lineView.text.firstChild, bad = false;
+    if (!node || !contains(wrapper, node)) { return badPos(Pos(lineNo(lineView.line), 0), true) }
+    if (node == wrapper) {
+      bad = true;
+      node = wrapper.childNodes[offset];
+      offset = 0;
+      if (!node) {
+        var line = lineView.rest ? lst(lineView.rest) : lineView.line;
+        return badPos(Pos(lineNo(line), line.text.length), bad)
+      }
+    }
+
+    var textNode = node.nodeType == 3 ? node : null, topNode = node;
+    if (!textNode && node.childNodes.length == 1 && node.firstChild.nodeType == 3) {
+      textNode = node.firstChild;
+      if (offset) { offset = textNode.nodeValue.length; }
+    }
+    while (topNode.parentNode != wrapper) { topNode = topNode.parentNode; }
+    var measure = lineView.measure, maps = measure.maps;
+
+    function find(textNode, topNode, offset) {
+      for (var i = -1; i < (maps ? maps.length : 0); i++) {
+        var map = i < 0 ? measure.map : maps[i];
+        for (var j = 0; j < map.length; j += 3) {
+          var curNode = map[j + 2];
+          if (curNode == textNode || curNode == topNode) {
+            var line = lineNo(i < 0 ? lineView.line : lineView.rest[i]);
+            var ch = map[j] + offset;
+            if (offset < 0 || curNode != textNode) { ch = map[j + (offset ? 1 : 0)]; }
+            return Pos(line, ch)
+          }
+        }
+      }
+    }
+    var found = find(textNode, topNode, offset);
+    if (found) { return badPos(found, bad) }
+
+    // FIXME this is all really shaky. might handle the few cases it needs to handle, but likely to cause problems
+    for (var after = topNode.nextSibling, dist = textNode ? textNode.nodeValue.length - offset : 0; after; after = after.nextSibling) {
+      found = find(after, after.firstChild, 0);
+      if (found)
+        { return badPos(Pos(found.line, found.ch - dist), bad) }
+      else
+        { dist += after.textContent.length; }
+    }
+    for (var before = topNode.previousSibling, dist$1 = offset; before; before = before.previousSibling) {
+      found = find(before, before.firstChild, -1);
+      if (found)
+        { return badPos(Pos(found.line, found.ch + dist$1), bad) }
+      else
+        { dist$1 += before.textContent.length; }
+    }
+  }
+
+  // TEXTAREA INPUT STYLE
+
+  var TextareaInput = function(cm) {
+    this.cm = cm;
+    // See input.poll and input.reset
+    this.prevInput = "";
+
+    // Flag that indicates whether we expect input to appear real soon
+    // now (after some event like 'keypress' or 'input') and are
+    // polling intensively.
+    this.pollingFast = false;
+    // Self-resetting timeout for the poller
+    this.polling = new Delayed();
+    // Used to work around IE issue with selection being forgotten when focus moves away from textarea
+    this.hasSelection = false;
+    this.composing = null;
+  };
+
+  TextareaInput.prototype.init = function (display) {
+      var this$1 = this;
+
+    var input = this, cm = this.cm;
+    this.createField(display);
+    var te = this.textarea;
+
+    display.wrapper.insertBefore(this.wrapper, display.wrapper.firstChild);
+
+    // Needed to hide big blue blinking cursor on Mobile Safari (doesn't seem to work in iOS 8 anymore)
+    if (ios) { te.style.width = "0px"; }
+
+    on(te, "input", function () {
+      if (ie && ie_version >= 9 && this$1.hasSelection) { this$1.hasSelection = null; }
+      input.poll();
+    });
+
+    on(te, "paste", function (e) {
+      if (signalDOMEvent(cm, e) || handlePaste(e, cm)) { return }
+
+      cm.state.pasteIncoming = +new Date;
+      input.fastPoll();
+    });
+
+    function prepareCopyCut(e) {
+      if (signalDOMEvent(cm, e)) { return }
+      if (cm.somethingSelected()) {
+        setLastCopied({lineWise: false, text: cm.getSelections()});
+      } else if (!cm.options.lineWiseCopyCut) {
+        return
+      } else {
+        var ranges = copyableRanges(cm);
+        setLastCopied({lineWise: true, text: ranges.text});
+        if (e.type == "cut") {
+          cm.setSelections(ranges.ranges, null, sel_dontScroll);
+        } else {
+          input.prevInput = "";
+          te.value = ranges.text.join("\n");
+          selectInput(te);
+        }
+      }
+      if (e.type == "cut") { cm.state.cutIncoming = +new Date; }
+    }
+    on(te, "cut", prepareCopyCut);
+    on(te, "copy", prepareCopyCut);
+
+    on(display.scroller, "paste", function (e) {
+      if (eventInWidget(display, e) || signalDOMEvent(cm, e)) { return }
+      if (!te.dispatchEvent) {
+        cm.state.pasteIncoming = +new Date;
+        input.focus();
+        return
+      }
+
+      // Pass the `paste` event to the textarea so it's handled by its event listener.
+      var event = new Event("paste");
+      event.clipboardData = e.clipboardData;
+      te.dispatchEvent(event);
+    });
+
+    // Prevent normal selection in the editor (we handle our own)
+    on(display.lineSpace, "selectstart", function (e) {
+      if (!eventInWidget(display, e)) { e_preventDefault(e); }
+    });
+
+    on(te, "compositionstart", function () {
+      var start = cm.getCursor("from");
+      if (input.composing) { input.composing.range.clear(); }
+      input.composing = {
+        start: start,
+        range: cm.markText(start, cm.getCursor("to"), {className: "CodeMirror-composing"})
+      };
+    });
+    on(te, "compositionend", function () {
+      if (input.composing) {
+        input.poll();
+        input.composing.range.clear();
+        input.composing = null;
+      }
+    });
+  };
+
+  TextareaInput.prototype.createField = function (_display) {
+    // Wraps and hides input textarea
+    this.wrapper = hiddenTextarea();
+    // The semihidden textarea that is focused when the editor is
+    // focused, and receives input.
+    this.textarea = this.wrapper.firstChild;
+  };
+
+  TextareaInput.prototype.screenReaderLabelChanged = function (label) {
+    // Label for screenreaders, accessibility
+    if(label) {
+      this.textarea.setAttribute('aria-label', label);
+    } else {
+      this.textarea.removeAttribute('aria-label');
+    }
+  };
+
+  TextareaInput.prototype.prepareSelection = function () {
+    // Redraw the selection and/or cursor
+    var cm = this.cm, display = cm.display, doc = cm.doc;
+    var result = prepareSelection(cm);
+
+    // Move the hidden textarea near the cursor to prevent scrolling artifacts
+    if (cm.options.moveInputWithCursor) {
+      var headPos = cursorCoords(cm, doc.sel.primary().head, "div");
+      var wrapOff = display.wrapper.getBoundingClientRect(), lineOff = display.lineDiv.getBoundingClientRect();
+      result.teTop = Math.max(0, Math.min(display.wrapper.clientHeight - 10,
+                                          headPos.top + lineOff.top - wrapOff.top));
+      result.teLeft = Math.max(0, Math.min(display.wrapper.clientWidth - 10,
+                                           headPos.left + lineOff.left - wrapOff.left));
+    }
+
+    return result
+  };
+
+  TextareaInput.prototype.showSelection = function (drawn) {
+    var cm = this.cm, display = cm.display;
+    removeChildrenAndAdd(display.cursorDiv, drawn.cursors);
+    removeChildrenAndAdd(display.selectionDiv, drawn.selection);
+    if (drawn.teTop != null) {
+      this.wrapper.style.top = drawn.teTop + "px";
+      this.wrapper.style.left = drawn.teLeft + "px";
+    }
+  };
+
+  // Reset the input to correspond to the selection (or to be empty,
+  // when not typing and nothing is selected)
+  TextareaInput.prototype.reset = function (typing) {
+    if (this.contextMenuPending || this.composing) { return }
+    var cm = this.cm;
+    if (cm.somethingSelected()) {
+      this.prevInput = "";
+      var content = cm.getSelection();
+      this.textarea.value = content;
+      if (cm.state.focused) { selectInput(this.textarea); }
+      if (ie && ie_version >= 9) { this.hasSelection = content; }
+    } else if (!typing) {
+      this.prevInput = this.textarea.value = "";
+      if (ie && ie_version >= 9) { this.hasSelection = null; }
+    }
+  };
+
+  TextareaInput.prototype.getField = function () { return this.textarea };
+
+  TextareaInput.prototype.supportsTouch = function () { return false };
+
+  TextareaInput.prototype.focus = function () {
+    if (this.cm.options.readOnly != "nocursor" && (!mobile || activeElt() != this.textarea)) {
+      try { this.textarea.focus(); }
+      catch (e) {} // IE8 will throw if the textarea is display: none or not in DOM
+    }
+  };
+
+  TextareaInput.prototype.blur = function () { this.textarea.blur(); };
+
+  TextareaInput.prototype.resetPosition = function () {
+    this.wrapper.style.top = this.wrapper.style.left = 0;
+  };
+
+  TextareaInput.prototype.receivedFocus = function () { this.slowPoll(); };
+
+  // Poll for input changes, using the normal rate of polling. This
+  // runs as long as the editor is focused.
+  TextareaInput.prototype.slowPoll = function () {
+      var this$1 = this;
+
+    if (this.pollingFast) { return }
+    this.polling.set(this.cm.options.pollInterval, function () {
+      this$1.poll();
+      if (this$1.cm.state.focused) { this$1.slowPoll(); }
+    });
+  };
+
+  // When an event has just come in that is likely to add or change
+  // something in the input textarea, we poll faster, to ensure that
+  // the change appears on the screen quickly.
+  TextareaInput.prototype.fastPoll = function () {
+    var missed = false, input = this;
+    input.pollingFast = true;
+    function p() {
+      var changed = input.poll();
+      if (!changed && !missed) {missed = true; input.polling.set(60, p);}
+      else {input.pollingFast = false; input.slowPoll();}
+    }
+    input.polling.set(20, p);
+  };
+
+  // Read input from the textarea, and update the document to match.
+  // When something is selected, it is present in the textarea, and
+  // selected (unless it is huge, in which case a placeholder is
+  // used). When nothing is selected, the cursor sits after previously
+  // seen text (can be empty), which is stored in prevInput (we must
+  // not reset the textarea when typing, because that breaks IME).
+  TextareaInput.prototype.poll = function () {
+      var this$1 = this;
+
+    var cm = this.cm, input = this.textarea, prevInput = this.prevInput;
+    // Since this is called a *lot*, try to bail out as cheaply as
+    // possible when it is clear that nothing happened. hasSelection
+    // will be the case when there is a lot of text in the textarea,
+    // in which case reading its value would be expensive.
+    if (this.contextMenuPending || !cm.state.focused ||
+        (hasSelection(input) && !prevInput && !this.composing) ||
+        cm.isReadOnly() || cm.options.disableInput || cm.state.keySeq)
+      { return false }
+
+    var text = input.value;
+    // If nothing changed, bail.
+    if (text == prevInput && !cm.somethingSelected()) { return false }
+    // Work around nonsensical selection resetting in IE9/10, and
+    // inexplicable appearance of private area unicode characters on
+    // some key combos in Mac (#2689).
+    if (ie && ie_version >= 9 && this.hasSelection === text ||
+        mac && /[\uf700-\uf7ff]/.test(text)) {
+      cm.display.input.reset();
+      return false
+    }
+
+    if (cm.doc.sel == cm.display.selForContextMenu) {
+      var first = text.charCodeAt(0);
+      if (first == 0x200b && !prevInput) { prevInput = "\u200b"; }
+      if (first == 0x21da) { this.reset(); return this.cm.execCommand("undo") }
+    }
+    // Find the part of the input that is actually new
+    var same = 0, l = Math.min(prevInput.length, text.length);
+    while (same < l && prevInput.charCodeAt(same) == text.charCodeAt(same)) { ++same; }
+
+    runInOp(cm, function () {
+      applyTextInput(cm, text.slice(same), prevInput.length - same,
+                     null, this$1.composing ? "*compose" : null);
+
+      // Don't leave long text in the textarea, since it makes further polling slow
+      if (text.length > 1000 || text.indexOf("\n") > -1) { input.value = this$1.prevInput = ""; }
+      else { this$1.prevInput = text; }
+
+      if (this$1.composing) {
+        this$1.composing.range.clear();
+        this$1.composing.range = cm.markText(this$1.composing.start, cm.getCursor("to"),
+                                           {className: "CodeMirror-composing"});
+      }
+    });
+    return true
+  };
+
+  TextareaInput.prototype.ensurePolled = function () {
+    if (this.pollingFast && this.poll()) { this.pollingFast = false; }
+  };
+
+  TextareaInput.prototype.onKeyPress = function () {
+    if (ie && ie_version >= 9) { this.hasSelection = null; }
+    this.fastPoll();
+  };
+
+  TextareaInput.prototype.onContextMenu = function (e) {
+    var input = this, cm = input.cm, display = cm.display, te = input.textarea;
+    if (input.contextMenuPending) { input.contextMenuPending(); }
+    var pos = posFromMouse(cm, e), scrollPos = display.scroller.scrollTop;
+    if (!pos || presto) { return } // Opera is difficult.
+
+    // Reset the current text selection only if the click is done outside of the selection
+    // and 'resetSelectionOnContextMenu' option is true.
+    var reset = cm.options.resetSelectionOnContextMenu;
+    if (reset && cm.doc.sel.contains(pos) == -1)
+      { operation(cm, setSelection)(cm.doc, simpleSelection(pos), sel_dontScroll); }
+
+    var oldCSS = te.style.cssText, oldWrapperCSS = input.wrapper.style.cssText;
+    var wrapperBox = input.wrapper.offsetParent.getBoundingClientRect();
+    input.wrapper.style.cssText = "position: static";
+    te.style.cssText = "position: absolute; width: 30px; height: 30px;\n      top: " + (e.clientY - wrapperBox.top - 5) + "px; left: " + (e.clientX - wrapperBox.left - 5) + "px;\n      z-index: 1000; background: " + (ie ? "rgba(255, 255, 255, .05)" : "transparent") + ";\n      outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);";
+    var oldScrollY;
+    if (webkit) { oldScrollY = window.scrollY; } // Work around Chrome issue (#2712)
+    display.input.focus();
+    if (webkit) { window.scrollTo(null, oldScrollY); }
+    display.input.reset();
+    // Adds "Select all" to context menu in FF
+    if (!cm.somethingSelected()) { te.value = input.prevInput = " "; }
+    input.contextMenuPending = rehide;
+    display.selForContextMenu = cm.doc.sel;
+    clearTimeout(display.detectingSelectAll);
+
+    // Select-all will be greyed out if there's nothing to select, so
+    // this adds a zero-width space so that we can later check whether
+    // it got selected.
+    function prepareSelectAllHack() {
+      if (te.selectionStart != null) {
+        var selected = cm.somethingSelected();
+        var extval = "\u200b" + (selected ? te.value : "");
+        te.value = "\u21da"; // Used to catch context-menu undo
+        te.value = extval;
+        input.prevInput = selected ? "" : "\u200b";
+        te.selectionStart = 1; te.selectionEnd = extval.length;
+        // Re-set this, in case some other handler touched the
+        // selection in the meantime.
+        display.selForContextMenu = cm.doc.sel;
+      }
+    }
+    function rehide() {
+      if (input.contextMenuPending != rehide) { return }
+      input.contextMenuPending = false;
+      input.wrapper.style.cssText = oldWrapperCSS;
+      te.style.cssText = oldCSS;
+      if (ie && ie_version < 9) { display.scrollbars.setScrollTop(display.scroller.scrollTop = scrollPos); }
+
+      // Try to detect the user choosing select-all
+      if (te.selectionStart != null) {
+        if (!ie || (ie && ie_version < 9)) { prepareSelectAllHack(); }
+        var i = 0, poll = function () {
+          if (display.selForContextMenu == cm.doc.sel && te.selectionStart == 0 &&
+              te.selectionEnd > 0 && input.prevInput == "\u200b") {
+            operation(cm, selectAll)(cm);
+          } else if (i++ < 10) {
+            display.detectingSelectAll = setTimeout(poll, 500);
+          } else {
+            display.selForContextMenu = null;
+            display.input.reset();
+          }
+        };
+        display.detectingSelectAll = setTimeout(poll, 200);
+      }
+    }
+
+    if (ie && ie_version >= 9) { prepareSelectAllHack(); }
+    if (captureRightClick) {
+      e_stop(e);
+      var mouseup = function () {
+        off(window, "mouseup", mouseup);
+        setTimeout(rehide, 20);
+      };
+      on(window, "mouseup", mouseup);
+    } else {
+      setTimeout(rehide, 50);
+    }
+  };
+
+  TextareaInput.prototype.readOnlyChanged = function (val) {
+    if (!val) { this.reset(); }
+    this.textarea.disabled = val == "nocursor";
+    this.textarea.readOnly = !!val;
+  };
+
+  TextareaInput.prototype.setUneditable = function () {};
+
+  TextareaInput.prototype.needsContentAttribute = false;
+
+  function fromTextArea(textarea, options) {
+    options = options ? copyObj(options) : {};
+    options.value = textarea.value;
+    if (!options.tabindex && textarea.tabIndex)
+      { options.tabindex = textarea.tabIndex; }
+    if (!options.placeholder && textarea.placeholder)
+      { options.placeholder = textarea.placeholder; }
+    // Set autofocus to true if this textarea is focused, or if it has
+    // autofocus and no other element is focused.
+    if (options.autofocus == null) {
+      var hasFocus = activeElt();
+      options.autofocus = hasFocus == textarea ||
+        textarea.getAttribute("autofocus") != null && hasFocus == document.body;
+    }
+
+    function save() {textarea.value = cm.getValue();}
+
+    var realSubmit;
+    if (textarea.form) {
+      on(textarea.form, "submit", save);
+      // Deplorable hack to make the submit method do the right thing.
+      if (!options.leaveSubmitMethodAlone) {
+        var form = textarea.form;
+        realSubmit = form.submit;
+        try {
+          var wrappedSubmit = form.submit = function () {
+            save();
+            form.submit = realSubmit;
+            form.submit();
+            form.submit = wrappedSubmit;
+          };
+        } catch(e) {}
+      }
+    }
+
+    options.finishInit = function (cm) {
+      cm.save = save;
+      cm.getTextArea = function () { return textarea; };
+      cm.toTextArea = function () {
+        cm.toTextArea = isNaN; // Prevent this from being ran twice
+        save();
+        textarea.parentNode.removeChild(cm.getWrapperElement());
+        textarea.style.display = "";
+        if (textarea.form) {
+          off(textarea.form, "submit", save);
+          if (!options.leaveSubmitMethodAlone && typeof textarea.form.submit == "function")
+            { textarea.form.submit = realSubmit; }
+        }
+      };
+    };
+
+    textarea.style.display = "none";
+    var cm = CodeMirror(function (node) { return textarea.parentNode.insertBefore(node, textarea.nextSibling); },
+      options);
+    return cm
+  }
+
+  function addLegacyProps(CodeMirror) {
+    CodeMirror.off = off;
+    CodeMirror.on = on;
+    CodeMirror.wheelEventPixels = wheelEventPixels;
+    CodeMirror.Doc = Doc;
+    CodeMirror.splitLines = splitLinesAuto;
+    CodeMirror.countColumn = countColumn;
+    CodeMirror.findColumn = findColumn;
+    CodeMirror.isWordChar = isWordCharBasic;
+    CodeMirror.Pass = Pass;
+    CodeMirror.signal = signal;
+    CodeMirror.Line = Line;
+    CodeMirror.changeEnd = changeEnd;
+    CodeMirror.scrollbarModel = scrollbarModel;
+    CodeMirror.Pos = Pos;
+    CodeMirror.cmpPos = cmp;
+    CodeMirror.modes = modes;
+    CodeMirror.mimeModes = mimeModes;
+    CodeMirror.resolveMode = resolveMode;
+    CodeMirror.getMode = getMode;
+    CodeMirror.modeExtensions = modeExtensions;
+    CodeMirror.extendMode = extendMode;
+    CodeMirror.copyState = copyState;
+    CodeMirror.startState = startState;
+    CodeMirror.innerMode = innerMode;
+    CodeMirror.commands = commands;
+    CodeMirror.keyMap = keyMap;
+    CodeMirror.keyName = keyName;
+    CodeMirror.isModifierKey = isModifierKey;
+    CodeMirror.lookupKey = lookupKey;
+    CodeMirror.normalizeKeyMap = normalizeKeyMap;
+    CodeMirror.StringStream = StringStream;
+    CodeMirror.SharedTextMarker = SharedTextMarker;
+    CodeMirror.TextMarker = TextMarker;
+    CodeMirror.LineWidget = LineWidget;
+    CodeMirror.e_preventDefault = e_preventDefault;
+    CodeMirror.e_stopPropagation = e_stopPropagation;
+    CodeMirror.e_stop = e_stop;
+    CodeMirror.addClass = addClass;
+    CodeMirror.contains = contains;
+    CodeMirror.rmClass = rmClass;
+    CodeMirror.keyNames = keyNames;
+  }
+
+  // EDITOR CONSTRUCTOR
+
+  defineOptions(CodeMirror);
+
+  addEditorMethods(CodeMirror);
+
+  // Set up methods on CodeMirror's prototype to redirect to the editor's document.
+  var dontDelegate = "iter insert remove copy getEditor constructor".split(" ");
+  for (var prop in Doc.prototype) { if (Doc.prototype.hasOwnProperty(prop) && indexOf(dontDelegate, prop) < 0)
+    { CodeMirror.prototype[prop] = (function(method) {
+      return function() {return method.apply(this.doc, arguments)}
+    })(Doc.prototype[prop]); } }
+
+  eventMixin(Doc);
+  CodeMirror.inputStyles = {"textarea": TextareaInput, "contenteditable": ContentEditableInput};
+
+  // Extra arguments are stored as the mode's dependencies, which is
+  // used by (legacy) mechanisms like loadmode.js to automatically
+  // load a mode. (Preferred mechanism is the require/define calls.)
+  CodeMirror.defineMode = function(name/*, mode, …*/) {
+    if (!CodeMirror.defaults.mode && name != "null") { CodeMirror.defaults.mode = name; }
+    defineMode.apply(this, arguments);
+  };
+
+  CodeMirror.defineMIME = defineMIME;
+
+  // Minimal default mode.
+  CodeMirror.defineMode("null", function () { return ({token: function (stream) { return stream.skipToEnd(); }}); });
+  CodeMirror.defineMIME("text/plain", "null");
+
+  // EXTENSIONS
+
+  CodeMirror.defineExtension = function (name, func) {
+    CodeMirror.prototype[name] = func;
+  };
+  CodeMirror.defineDocExtension = function (name, func) {
+    Doc.prototype[name] = func;
+  };
+
+  CodeMirror.fromTextArea = fromTextArea;
+
+  addLegacyProps(CodeMirror);
+
+  CodeMirror.version = "5.58.3";
+
+  return CodeMirror;
+
+})));
diff --git a/htdocs/Libs/Codemirror/codemirror.min.js b/htdocs/Libs/Codemirror/codemirror.min.js
deleted file mode 100644
index 587863b..0000000
--- a/htdocs/Libs/Codemirror/codemirror.min.js
+++ /dev/null
@@ -1,37 +0,0 @@
-/* CodeMirror - Minified & Bundled
-   Generated on 2015. 08. 31. with http://codemirror.net/doc/compress.html
-   Version: HEAD
-
-   CodeMirror Library:
-   - codemirror.js
-   Modes:
-   - css.js
-   - htmlmixed.js
-   - javascript.js
-   - perl.js
-   - python.js
-   - shell.js
-   - xml.js
-   Add-ons:
-   - active-line.js
-   - brace-fold.js
-   - closebrackets.js
-   - closetag.js
-   - foldcode.js
-   - foldgutter.js
-   - indent-fold.js
-   - match-highlighter.js
-   - matchbrackets.js
-   - matchtags.js
-   - search.js
-   - xml-fold.js
- */
-
-!function(a){if("object"==typeof exports&&"object"==typeof module)module.exports=a();else{if("function"==typeof define&&define.amd)return define([],a);this.CodeMirror=a()}}(function(){"use strict";function v(a,b){if(!(this instanceof v))return new v(a,b);this.options=b=b?hg(b):{},hg(Ad,b,!1),I(b);var c=b.value;"string"==typeof c&&(c=new af(c,b.mode,null,b.lineSeparator)),this.doc=c;var g=new v.inputStyles[b.inputStyle](this),h=this.display=new w(a,c,g);h.wrapper.CodeMirror=this,E(this),C(this),b.lineWrapping&&(this.display.wrapper.className+=" CodeMirror-wrap"),b.autofocus&&!n&&h.input.focus(),M(this),this.state={keyMaps:[],overlays:[],modeGen:0,overwrite:!1,delayingBlurEvent:!1,focused:!1,suppressEdits:!1,pasteIncoming:!1,cutIncoming:!1,selectingText:!1,draggingText:!1,highlight:new Yf,keySeq:null,specialChars:null};var i=this;d&&11>e&&setTimeout(function(){i.display.input.reset(!0)},20),pc(this),Bg(),Vb(this),this.curOp.forceUpdate=!0,ef(this,c),b.autofocus&&!n||i.hasFocus()?setTimeout(ig(Zc,this),20):$c(this);for(var j in Bd)Bd.hasOwnProperty(j)&&Bd[j](this,b[j],Dd);R(this),b.finishInit&&b.finishInit(this);for(var k=0;k<Hd.length;++k)Hd[k](this);Xb(this),f&&b.lineWrapping&&"optimizelegibility"==getComputedStyle(h.lineDiv).textRendering&&(h.lineDiv.style.textRendering="auto")}function w(b,c,g){var h=this;this.input=g,h.scrollbarFiller=pg("div",null,"CodeMirror-scrollbar-filler"),h.scrollbarFiller.setAttribute("cm-not-content","true"),h.gutterFiller=pg("div",null,"CodeMirror-gutter-filler"),h.gutterFiller.setAttribute("cm-not-content","true"),h.lineDiv=pg("div",null,"CodeMirror-code"),h.selectionDiv=pg("div",null,null,"position: relative; z-index: 1"),h.cursorDiv=pg("div",null,"CodeMirror-cursors"),h.measure=pg("div",null,"CodeMirror-measure"),h.lineMeasure=pg("div",null,"CodeMirror-measure"),h.lineSpace=pg("div",[h.measure,h.lineMeasure,h.selectionDiv,h.cursorDiv,h.lineDiv],null,"position: relative; outline: none"),h.mover=pg("div",[pg("div",[h.lineSpace],"CodeMirror-lines")],null,"position: relative"),h.sizer=pg("div",[h.mover],"CodeMirror-sizer"),h.sizerWidth=null,h.heightForcer=pg("div",null,null,"position: absolute; height: "+Tf+"px; width: 1px;"),h.gutters=pg("div",null,"CodeMirror-gutters"),h.lineGutter=null,h.scroller=pg("div",[h.sizer,h.heightForcer,h.gutters],"CodeMirror-scroll"),h.scroller.setAttribute("tabIndex","-1"),h.wrapper=pg("div",[h.scrollbarFiller,h.gutterFiller,h.scroller],"CodeMirror"),d&&8>e&&(h.gutters.style.zIndex=-1,h.scroller.style.paddingRight=0),f||a&&n||(h.scroller.draggable=!0),b&&(b.appendChild?b.appendChild(h.wrapper):b(h.wrapper)),h.viewFrom=h.viewTo=c.first,h.reportedViewFrom=h.reportedViewTo=c.first,h.view=[],h.renderedView=null,h.externalMeasured=null,h.viewOffset=0,h.lastWrapHeight=h.lastWrapWidth=0,h.updateLineNumbers=null,h.nativeBarWidth=h.barHeight=h.barWidth=0,h.scrollbarsClipped=!1,h.lineNumWidth=h.lineNumInnerWidth=h.lineNumChars=null,h.alignWidgets=!1,h.cachedCharWidth=h.cachedTextHeight=h.cachedPaddingH=null,h.maxLine=null,h.maxLineLength=0,h.maxLineChanged=!1,h.wheelDX=h.wheelDY=h.wheelStartX=h.wheelStartY=null,h.shift=!1,h.selForContextMenu=null,h.activeTouch=null,g.init(h)}function x(a){a.doc.mode=v.getMode(a.options,a.doc.modeOption),y(a)}function y(a){a.doc.iter(function(a){a.stateAfter&&(a.stateAfter=null),a.styles&&(a.styles=null)}),a.doc.frontier=a.doc.first,ib(a,100),a.state.modeGen++,a.curOp&&ic(a)}function z(a){a.options.lineWrapping?(xg(a.display.wrapper,"CodeMirror-wrap"),a.display.sizer.style.minWidth="",a.display.sizerWidth=null):(wg(a.display.wrapper,"CodeMirror-wrap"),H(a)),B(a),ic(a),Fb(a),setTimeout(function(){N(a)},100)}function A(a){var b=Rb(a.display),c=a.options.lineWrapping,d=c&&Math.max(5,a.display.scroller.clientWidth/Sb(a.display)-3);return function(e){if(we(a.doc,e))return 0;var f=0;if(e.widgets)for(var g=0;g<e.widgets.length;g++)e.widgets[g].height&&(f+=e.widgets[g].height);return c?f+(Math.ceil(e.text.length/d)||1)*b:f+b}}function B(a){var b=a.doc,c=A(a);b.iter(function(a){var b=c(a);b!=a.height&&jf(a,b)})}function C(a){a.display.wrapper.className=a.display.wrapper.className.replace(/\s*cm-s-\S+/g,"")+a.options.theme.replace(/(^|\s)\s*/g," cm-s-"),Fb(a)}function D(a){E(a),ic(a),setTimeout(function(){Q(a)},20)}function E(a){var b=a.display.gutters,c=a.options.gutters;rg(b);for(var d=0;d<c.length;++d){var e=c[d],f=b.appendChild(pg("div",null,"CodeMirror-gutter "+e));"CodeMirror-linenumbers"==e&&(a.display.lineGutter=f,f.style.width=(a.display.lineNumWidth||1)+"px")}b.style.display=d?"":"none",F(a)}function F(a){var b=a.display.gutters.offsetWidth;a.display.sizer.style.marginLeft=b+"px"}function G(a){if(0==a.height)return 0;for(var c,b=a.text.length,d=a;c=pe(d);){var e=c.find(0,!0);d=e.from.line,b+=e.from.ch-e.to.ch}for(d=a;c=qe(d);){var e=c.find(0,!0);b-=d.text.length-e.from.ch,d=e.to.line,b+=d.text.length-e.to.ch}return b}function H(a){var b=a.display,c=a.doc;b.maxLine=ff(c,c.first),b.maxLineLength=G(b.maxLine),b.maxLineChanged=!0,c.iter(function(a){var c=G(a);c>b.maxLineLength&&(b.maxLineLength=c,b.maxLine=a)})}function I(a){var b=dg(a.gutters,"CodeMirror-linenumbers");-1==b&&a.lineNumbers?a.gutters=a.gutters.concat(["CodeMirror-linenumbers"]):b>-1&&!a.lineNumbers&&(a.gutters=a.gutters.slice(0),a.gutters.splice(b,1))}function J(a){var b=a.display,c=b.gutters.offsetWidth,d=Math.round(a.doc.height+nb(a.display));return{clientHeight:b.scroller.clientHeight,viewHeight:b.wrapper.clientHeight,scrollWidth:b.scroller.scrollWidth,clientWidth:b.scroller.clientWidth,viewWidth:b.wrapper.clientWidth,barLeft:a.options.fixedGutter?c:0,docHeight:d,scrollHeight:d+pb(a)+b.barHeight,nativeBarWidth:b.nativeBarWidth,gutterWidth:c}}function K(a,b,c){this.cm=c;var f=this.vert=pg("div",[pg("div",null,null,"min-width: 1px")],"CodeMirror-vscrollbar"),g=this.horiz=pg("div",[pg("div",null,null,"height: 100%; min-height: 1px")],"CodeMirror-hscrollbar");a(f),a(g),Jf(f,"scroll",function(){f.clientHeight&&b(f.scrollTop,"vertical")}),Jf(g,"scroll",function(){g.clientWidth&&b(g.scrollLeft,"horizontal")}),this.checkedOverlay=!1,d&&8>e&&(this.horiz.style.minHeight=this.vert.style.minWidth="18px")}function L(){}function M(a){a.display.scrollbars&&(a.display.scrollbars.clear(),a.display.scrollbars.addClass&&wg(a.display.wrapper,a.display.scrollbars.addClass)),a.display.scrollbars=new v.scrollbarModel[a.options.scrollbarStyle](function(b){a.display.wrapper.insertBefore(b,a.display.scrollbarFiller),Jf(b,"mousedown",function(){a.state.focused&&setTimeout(function(){a.display.input.focus()},0)}),b.setAttribute("cm-not-content","true")},function(b,c){"horizontal"==c?Ic(a,b):Hc(a,b)},a),a.display.scrollbars.addClass&&xg(a.display.wrapper,a.display.scrollbars.addClass)}function N(a,b){b||(b=J(a));var c=a.display.barWidth,d=a.display.barHeight;O(a,b);for(var e=0;4>e&&c!=a.display.barWidth||d!=a.display.barHeight;e++)c!=a.display.barWidth&&a.options.lineWrapping&&$(a),O(a,J(a)),c=a.display.barWidth,d=a.display.barHeight}function O(a,b){var c=a.display,d=c.scrollbars.update(b);c.sizer.style.paddingRight=(c.barWidth=d.right)+"px",c.sizer.style.paddingBottom=(c.barHeight=d.bottom)+"px",d.right&&d.bottom?(c.scrollbarFiller.style.display="block",c.scrollbarFiller.style.height=d.bottom+"px",c.scrollbarFiller.style.width=d.right+"px"):c.scrollbarFiller.style.display="",d.bottom&&a.options.coverGutterNextToScrollbar&&a.options.fixedGutter?(c.gutterFiller.style.display="block",c.gutterFiller.style.height=d.bottom+"px",c.gutterFiller.style.width=b.gutterWidth+"px"):c.gutterFiller.style.display=""}function P(a,b,c){var d=c&&null!=c.top?Math.max(0,c.top):a.scroller.scrollTop;d=Math.floor(d-mb(a));var e=c&&null!=c.bottom?c.bottom:d+a.wrapper.clientHeight,f=lf(b,d),g=lf(b,e);if(c&&c.ensure){var h=c.ensure.from.line,i=c.ensure.to.line;f>h?(f=h,g=lf(b,mf(ff(b,h))+a.wrapper.clientHeight)):Math.min(i,b.lastLine())>=g&&(f=lf(b,mf(ff(b,i))-a.wrapper.clientHeight),g=i)}return{from:f,to:Math.max(g,f+1)}}function Q(a){var b=a.display,c=b.view;if(b.alignWidgets||b.gutters.firstChild&&a.options.fixedGutter){for(var d=T(b)-b.scroller.scrollLeft+a.doc.scrollLeft,e=b.gutters.offsetWidth,f=d+"px",g=0;g<c.length;g++)if(!c[g].hidden){a.options.fixedGutter&&c[g].gutter&&(c[g].gutter.style.left=f);var h=c[g].alignable;if(h)for(var i=0;i<h.length;i++)h[i].style.left=f}a.options.fixedGutter&&(b.gutters.style.left=d+e+"px")}}function R(a){if(!a.options.lineNumbers)return!1;var b=a.doc,c=S(a.options,b.first+b.size-1),d=a.display;if(c.length!=d.lineNumChars){var e=d.measure.appendChild(pg("div",[pg("div",c)],"CodeMirror-linenumber CodeMirror-gutter-elt")),f=e.firstChild.offsetWidth,g=e.offsetWidth-f;return d.lineGutter.style.width="",d.lineNumInnerWidth=Math.max(f,d.lineGutter.offsetWidth-g)+1,d.lineNumWidth=d.lineNumInnerWidth+g,d.lineNumChars=d.lineNumInnerWidth?c.length:-1,d.lineGutter.style.width=d.lineNumWidth+"px",F(a),!0}return!1}function S(a,b){return String(a.lineNumberFormatter(b+a.firstLineNumber))}function T(a){return a.scroller.getBoundingClientRect().left-a.sizer.getBoundingClientRect().left}function U(a,b,c){var d=a.display;this.viewport=b,this.visible=P(d,a.doc,b),this.editorIsHidden=!d.wrapper.offsetWidth,this.wrapperHeight=d.wrapper.clientHeight,this.wrapperWidth=d.wrapper.clientWidth,this.oldDisplayWidth=qb(a),this.force=c,this.dims=aa(a),this.events=[]}function V(a){var b=a.display;!b.scrollbarsClipped&&b.scroller.offsetWidth&&(b.nativeBarWidth=b.scroller.offsetWidth-b.scroller.clientWidth,b.heightForcer.style.height=pb(a)+"px",b.sizer.style.marginBottom=-b.nativeBarWidth+"px",b.sizer.style.borderRightWidth=pb(a)+"px",b.scrollbarsClipped=!0)}function W(a,b){var c=a.display,d=a.doc;if(b.editorIsHidden)return kc(a),!1;if(!b.force&&b.visible.from>=c.viewFrom&&b.visible.to<=c.viewTo&&(null==c.updateLineNumbers||c.updateLineNumbers>=c.viewTo)&&c.renderedView==c.view&&0==oc(a))return!1;R(a)&&(kc(a),b.dims=aa(a));var e=d.first+d.size,f=Math.max(b.visible.from-a.options.viewportMargin,d.first),g=Math.min(e,b.visible.to+a.options.viewportMargin);c.viewFrom<f&&f-c.viewFrom<20&&(f=Math.max(d.first,c.viewFrom)),c.viewTo>g&&c.viewTo-g<20&&(g=Math.min(e,c.viewTo)),u&&(f=ue(a.doc,f),g=ve(a.doc,g));var h=f!=c.viewFrom||g!=c.viewTo||c.lastWrapHeight!=b.wrapperHeight||c.lastWrapWidth!=b.wrapperWidth;nc(a,f,g),c.viewOffset=mf(ff(a.doc,c.viewFrom)),a.display.mover.style.top=c.viewOffset+"px";var i=oc(a);if(!h&&0==i&&!b.force&&c.renderedView==c.view&&(null==c.updateLineNumbers||c.updateLineNumbers>=c.viewTo))return!1;var j=ug();return i>4&&(c.lineDiv.style.display="none"),ba(a,c.updateLineNumbers,b.dims),i>4&&(c.lineDiv.style.display=""),c.renderedView=c.view,j&&ug()!=j&&j.offsetHeight&&j.focus(),rg(c.cursorDiv),rg(c.selectionDiv),c.gutters.style.height=c.sizer.style.minHeight=0,h&&(c.lastWrapHeight=b.wrapperHeight,c.lastWrapWidth=b.wrapperWidth,ib(a,400)),c.updateLineNumbers=null,!0}function X(a,b){for(var c=b.viewport,d=!0;(d&&a.options.lineWrapping&&b.oldDisplayWidth!=qb(a)||(c&&null!=c.top&&(c={top:Math.min(a.doc.height+nb(a.display)-rb(a),c.top)}),b.visible=P(a.display,a.doc,c),!(b.visible.from>=a.display.viewFrom&&b.visible.to<=a.display.viewTo)))&&W(a,b);d=!1){$(a);var e=J(a);db(a),Z(a,e),N(a,e)}b.signal(a,"update",a),(a.display.viewFrom!=a.display.reportedViewFrom||a.display.viewTo!=a.display.reportedViewTo)&&(b.signal(a,"viewportChange",a,a.display.viewFrom,a.display.viewTo),a.display.reportedViewFrom=a.display.viewFrom,a.display.reportedViewTo=a.display.viewTo)}function Y(a,b){var c=new U(a,b);if(W(a,c)){$(a),X(a,c);var d=J(a);db(a),Z(a,d),N(a,d),c.finish()}}function Z(a,b){a.display.sizer.style.minHeight=b.docHeight+"px";var c=b.docHeight+a.display.barHeight;a.display.heightForcer.style.top=c+"px",a.display.gutters.style.height=Math.max(c+pb(a),b.clientHeight)+"px"}function $(a){for(var b=a.display,c=b.lineDiv.offsetTop,f=0;f<b.view.length;f++){var h,g=b.view[f];if(!g.hidden){if(d&&8>e){var i=g.node.offsetTop+g.node.offsetHeight;h=i-c,c=i}else{var j=g.node.getBoundingClientRect();h=j.bottom-j.top}var k=g.line.height-h;if(2>h&&(h=Rb(b)),(k>.001||-.001>k)&&(jf(g.line,h),_(g.line),g.rest))for(var l=0;l<g.rest.length;l++)_(g.rest[l])}}}function _(a){if(a.widgets)for(var b=0;b<a.widgets.length;++b)a.widgets[b].height=a.widgets[b].node.offsetHeight}function aa(a){for(var b=a.display,c={},d={},e=b.gutters.clientLeft,f=b.gutters.firstChild,g=0;f;f=f.nextSibling,++g)c[a.options.gutters[g]]=f.offsetLeft+f.clientLeft+e,d[a.options.gutters[g]]=f.clientWidth;return{fixedPos:T(b),gutterTotalWidth:b.gutters.offsetWidth,gutterLeft:c,gutterWidth:d,wrapperWidth:b.wrapper.clientWidth}}function ba(a,b,c){function i(b){var c=b.nextSibling;return f&&o&&a.display.currentWheelTarget==b?b.style.display="none":b.parentNode.removeChild(b),c}for(var d=a.display,e=a.options.lineNumbers,g=d.lineDiv,h=g.firstChild,j=d.view,k=d.viewFrom,l=0;l<j.length;l++){var m=j[l];if(m.hidden);else if(m.node&&m.node.parentNode==g){for(;h!=m.node;)h=i(h);var p=e&&null!=b&&k>=b&&m.lineNumber;m.changes&&(dg(m.changes,"gutter")>-1&&(p=!1),ca(a,m,k,c)),p&&(rg(m.lineNumber),m.lineNumber.appendChild(document.createTextNode(S(a.options,k)))),h=m.node.nextSibling}else{var n=ka(a,m,k,c);g.insertBefore(n,h)}k+=m.size}for(;h;)h=i(h)}function ca(a,b,c,d){for(var e=0;e<b.changes.length;e++){var f=b.changes[e];"text"==f?ga(a,b):"gutter"==f?ia(a,b,c,d):"class"==f?ha(b):"widget"==f&&ja(a,b,d)}b.changes=null}function da(a){return a.node==a.text&&(a.node=pg("div",null,null,"position: relative"),a.text.parentNode&&a.text.parentNode.replaceChild(a.node,a.text),a.node.appendChild(a.text),d&&8>e&&(a.node.style.zIndex=2)),a.node}function ea(a){var b=a.bgClass?a.bgClass+" "+(a.line.bgClass||""):a.line.bgClass;if(b&&(b+=" CodeMirror-linebackground"),a.background)b?a.background.className=b:(a.background.parentNode.removeChild(a.background),a.background=null);else if(b){var c=da(a);a.background=c.insertBefore(pg("div",null,b),c.firstChild)}}function fa(a,b){var c=a.display.externalMeasured;return c&&c.line==b.line?(a.display.externalMeasured=null,b.measure=c.measure,c.built):Qe(a,b)}function ga(a,b){var c=b.text.className,d=fa(a,b);b.text==b.node&&(b.node=d.pre),b.text.parentNode.replaceChild(d.pre,b.text),b.text=d.pre,d.bgClass!=b.bgClass||d.textClass!=b.textClass?(b.bgClass=d.bgClass,b.textClass=d.textClass,ha(b)):c&&(b.text.className=c)}function ha(a){ea(a),a.line.wrapClass?da(a).className=a.line.wrapClass:a.node!=a.text&&(a.node.className="");var b=a.textClass?a.textClass+" "+(a.line.textClass||""):a.line.textClass;a.text.className=b||""}function ia(a,b,c,d){if(b.gutter&&(b.node.removeChild(b.gutter),b.gutter=null),b.gutterBackground&&(b.node.removeChild(b.gutterBackground),b.gutterBackground=null),b.line.gutterClass){var e=da(b);b.gutterBackground=pg("div",null,"CodeMirror-gutter-background "+b.line.gutterClass,"left: "+(a.options.fixedGutter?d.fixedPos:-d.gutterTotalWidth)+"px; width: "+d.gutterTotalWidth+"px"),e.insertBefore(b.gutterBackground,b.text)}var f=b.line.gutterMarkers;if(a.options.lineNumbers||f){var e=da(b),g=b.gutter=pg("div",null,"CodeMirror-gutter-wrapper","left: "+(a.options.fixedGutter?d.fixedPos:-d.gutterTotalWidth)+"px");if(a.display.input.setUneditable(g),e.insertBefore(g,b.text),b.line.gutterClass&&(g.className+=" "+b.line.gutterClass),!a.options.lineNumbers||f&&f["CodeMirror-linenumbers"]||(b.lineNumber=g.appendChild(pg("div",S(a.options,c),"CodeMirror-linenumber CodeMirror-gutter-elt","left: "+d.gutterLeft["CodeMirror-linenumbers"]+"px; width: "+a.display.lineNumInnerWidth+"px"))),f)for(var h=0;h<a.options.gutters.length;++h){var i=a.options.gutters[h],j=f.hasOwnProperty(i)&&f[i];j&&g.appendChild(pg("div",[j],"CodeMirror-gutter-elt","left: "+d.gutterLeft[i]+"px; width: "+d.gutterWidth[i]+"px"))}}}function ja(a,b,c){b.alignable&&(b.alignable=null);for(var e,d=b.node.firstChild;d;d=e){var e=d.nextSibling;"CodeMirror-linewidget"==d.className&&b.node.removeChild(d)}la(a,b,c)}function ka(a,b,c,d){var e=fa(a,b);return b.text=b.node=e.pre,e.bgClass&&(b.bgClass=e.bgClass),e.textClass&&(b.textClass=e.textClass),ha(b),ia(a,b,c,d),la(a,b,d),b.node}function la(a,b,c){if(ma(a,b.line,b,c,!0),b.rest)for(var d=0;d<b.rest.length;d++)ma(a,b.rest[d],b,c,!1)}function ma(a,b,c,d,e){if(b.widgets)for(var f=da(c),g=0,h=b.widgets;g<h.length;++g){var i=h[g],j=pg("div",[i.node],"CodeMirror-linewidget");i.handleMouseEvents||j.setAttribute("cm-ignore-events","true"),na(i,j,c,d),a.display.input.setUneditable(j),e&&i.above?f.insertBefore(j,c.gutter||c.text):f.appendChild(j),Nf(i,"redraw")}}function na(a,b,c,d){if(a.noHScroll){(c.alignable||(c.alignable=[])).push(b);var e=d.wrapperWidth;b.style.left=d.fixedPos+"px",a.coverGutter||(e-=d.gutterTotalWidth,b.style.paddingLeft=d.gutterTotalWidth+"px"),b.style.width=e+"px"}a.coverGutter&&(b.style.zIndex=5,b.style.position="relative",a.noHScroll||(b.style.marginLeft=-d.gutterTotalWidth+"px"))}function qa(a){return oa(a.line,a.ch)}function ra(a,b){return pa(a,b)<0?b:a}function sa(a,b){return pa(a,b)<0?a:b}function ta(a){a.state.focused||(a.display.input.focus(),Zc(a))}function ua(a){return a.options.readOnly||a.doc.cantEdit}function wa(a,b,c,d,e){var f=a.doc;a.display.shift=!1,d||(d=f.sel);var g=a.state.pasteIncoming||"paste"==e,h=f.splitLines(b),i=null;if(g&&d.ranges.length>1)if(va&&va.join("\n")==b){if(d.ranges.length%va.length==0){i=[];for(var j=0;j<va.length;j++)i.push(f.splitLines(va[j]))}}else h.length==d.ranges.length&&(i=eg(h,function(a){return[a]}));for(var j=d.ranges.length-1;j>=0;j--){var k=d.ranges[j],l=k.from(),m=k.to();k.empty()&&(c&&c>0?l=oa(l.line,l.ch-c):a.state.overwrite&&!g&&(m=oa(m.line,Math.min(ff(f,m.line).text.length,m.ch+bg(h).length))));var n=a.curOp.updateInput,o={from:l,to:m,text:i?i[j%i.length]:h,origin:e||(g?"paste":a.state.cutIncoming?"cut":"+input")};hd(a.doc,o),Nf(a,"inputRead",a,o)}b&&!g&&ya(a,b),td(a),a.curOp.updateInput=n,a.curOp.typing=!0,a.state.pasteIncoming=a.state.cutIncoming=!1}function xa(a,b){var c=a.clipboardData&&a.clipboardData.getData("text/plain");return c?(a.preventDefault(),ua(b)||b.options.disableInput||cc(b,function(){wa(b,c,0,null,"paste")}),!0):void 0}function ya(a,b){if(a.options.electricChars&&a.options.smartIndent)for(var c=a.doc.sel,d=c.ranges.length-1;d>=0;d--){var e=c.ranges[d];if(!(e.head.ch>100||d&&c.ranges[d-1].head.line==e.head.line)){var f=a.getModeAt(e.head),g=!1;if(f.electricChars){for(var h=0;h<f.electricChars.length;h++)if(b.indexOf(f.electricChars.charAt(h))>-1){g=vd(a,e.head.line,"smart");break}}else f.electricInput&&f.electricInput.test(ff(a.doc,e.head.line).text.slice(0,e.head.ch))&&(g=vd(a,e.head.line,"smart"));g&&Nf(a,"electricInput",a,e.head.line)}}}function za(a){for(var b=[],c=[],d=0;d<a.doc.sel.ranges.length;d++){var e=a.doc.sel.ranges[d].head.line,f={anchor:oa(e,0),head:oa(e+1,0)};c.push(f),b.push(a.getRange(f.anchor,f.head))}return{text:b,ranges:c}}function Aa(a){a.setAttribute("autocorrect","off"),a.setAttribute("autocapitalize","off"),a.setAttribute("spellcheck","false")}function Ba(a){this.cm=a,this.prevInput="",this.pollingFast=!1,this.polling=new Yf,this.inaccurateSelection=!1,this.hasSelection=!1,this.composing=null}function Ca(){var a=pg("textarea",null,null,"position: absolute; padding: 0; width: 1px; height: 1em; outline: none"),b=pg("div",[a],null,"overflow: hidden; position: relative; width: 3px; height: 0px;");return f?a.style.width="1000px":a.setAttribute("wrap","off"),m&&(a.style.border="1px solid black"),Aa(a),b}function Da(a){this.cm=a,this.lastAnchorNode=this.lastAnchorOffset=this.lastFocusNode=this.lastFocusOffset=null,this.polling=new Yf,this.gracePeriod=!1}function Ea(a,b){var c=wb(a,b.line);if(!c||c.hidden)return null;var d=ff(a.doc,b.line),e=tb(c,d,b.line),f=nf(d),g="left";if(f){var h=Yg(f,b.ch);g=h%2?"right":"left"}var i=Ab(e.map,b.ch,g);return i.offset="right"==i.collapse?i.end:i.start,i}function Fa(a,b){return b&&(a.bad=!0),a}function Ga(a,b,c){var d;if(b==a.display.lineDiv){if(d=a.display.lineDiv.childNodes[c],!d)return Fa(a.clipPos(oa(a.display.viewTo-1)),!0);b=null,c=0}else for(d=b;;d=d.parentNode){if(!d||d==a.display.lineDiv)return null;if(d.parentNode&&d.parentNode==a.display.lineDiv)break}for(var e=0;e<a.display.view.length;e++){var f=a.display.view[e];if(f.node==d)return Ha(f,b,c)}}function Ha(a,b,c){function k(b,c,d){for(var e=-1;e<(j?j.length:0);e++)for(var f=0>e?i.map:j[e],g=0;g<f.length;g+=3){var h=f[g+2];if(h==b||h==c){var k=kf(0>e?a.line:a.rest[e]),l=f[g]+d;return(0>d||h!=b)&&(l=f[g+(d?1:0)]),oa(k,l)}}}var d=a.text.firstChild,e=!1;if(!b||!tg(d,b))return Fa(oa(kf(a.line),0),!0);if(b==d&&(e=!0,b=d.childNodes[c],c=0,!b)){var f=a.rest?bg(a.rest):a.line;return Fa(oa(kf(f),f.text.length),e)}var g=3==b.nodeType?b:null,h=b;for(g||1!=b.childNodes.length||3!=b.firstChild.nodeType||(g=b.firstChild,c&&(c=g.nodeValue.length));h.parentNode!=d;)h=h.parentNode;var i=a.measure,j=i.maps,l=k(g,h,c);if(l)return Fa(l,e);for(var m=h.nextSibling,n=g?g.nodeValue.length-c:0;m;m=m.nextSibling){if(l=k(m,m.firstChild,0))return Fa(oa(l.line,l.ch-n),e);n+=m.textContent.length}for(var o=h.previousSibling,n=c;o;o=o.previousSibling){if(l=k(o,o.firstChild,-1))return Fa(oa(l.line,l.ch+n),e);n+=m.textContent.length}}function Ia(a,b,c,d,e){function i(a){return function(b){return b.id==a}}function j(b){if(1==b.nodeType){var c=b.getAttribute("cm-text");if(null!=c)return""==c&&(c=b.textContent.replace(/\u200b/g,"")),void(f+=c);var l,k=b.getAttribute("cm-marker");if(k){var m=a.findMarks(oa(d,0),oa(e+1,0),i(+k));return void(m.length&&(l=m[0].find())&&(f+=gf(a.doc,l.from,l.to).join(h)))}if("false"==b.getAttribute("contenteditable"))return;for(var n=0;n<b.childNodes.length;n++)j(b.childNodes[n]);/^(pre|div|p)$/i.test(b.nodeName)&&(g=!0)}else if(3==b.nodeType){var o=b.nodeValue;if(!o)return;g&&(f+=h,g=!1),f+=o}}for(var f="",g=!1,h=a.doc.lineSeparator();j(b),b!=c;)b=b.nextSibling;return f}function Ja(a,b){this.ranges=a,this.primIndex=b}function Ka(a,b){this.anchor=a,this.head=b}function La(a,b){var c=a[b];a.sort(function(a,b){return pa(a.from(),b.from())}),b=dg(a,c);for(var d=1;d<a.length;d++){var e=a[d],f=a[d-1];if(pa(f.to(),e.from())>=0){var g=sa(f.from(),e.from()),h=ra(f.to(),e.to()),i=f.empty()?e.from()==e.head:f.from()==f.head;b>=d&&--b,a.splice(--d,2,new Ka(i?h:g,i?g:h))}}return new Ja(a,b)}function Ma(a,b){return new Ja([new Ka(a,b||a)],0)}function Na(a,b){return Math.max(a.first,Math.min(b,a.first+a.size-1))}function Oa(a,b){if(b.line<a.first)return oa(a.first,0);var c=a.first+a.size-1;return b.line>c?oa(c,ff(a,c).text.length):Pa(b,ff(a,b.line).text.length)}function Pa(a,b){var c=a.ch;return null==c||c>b?oa(a.line,b):0>c?oa(a.line,0):a}function Qa(a,b){return b>=a.first&&b<a.first+a.size}function Ra(a,b){for(var c=[],d=0;d<b.length;d++)c[d]=Oa(a,b[d]);return c}function Sa(a,b,c,d){if(a.cm&&a.cm.display.shift||a.extend){var e=b.anchor;if(d){var f=pa(c,e)<0;f!=pa(d,e)<0?(e=c,c=d):f!=pa(c,d)<0&&(c=d)}return new Ka(e,c)}return new Ka(d||c,c)}function Ta(a,b,c,d){Za(a,new Ja([Sa(a,a.sel.primary(),b,c)],0),d)}function Ua(a,b,c){for(var d=[],e=0;e<a.sel.ranges.length;e++)d[e]=Sa(a,a.sel.ranges[e],b[e],null);var f=La(d,a.sel.primIndex);Za(a,f,c)}function Va(a,b,c,d){var e=a.sel.ranges.slice(0);e[b]=c,Za(a,La(e,a.sel.primIndex),d)}function Wa(a,b,c,d){Za(a,Ma(b,c),d)}function Xa(a,b){var c={ranges:b.ranges,update:function(b){this.ranges=[];for(var c=0;c<b.length;c++)this.ranges[c]=new Ka(Oa(a,b[c].anchor),Oa(a,b[c].head))}};return Lf(a,"beforeSelectionChange",a,c),a.cm&&Lf(a.cm,"beforeSelectionChange",a.cm,c),c.ranges!=b.ranges?La(c.ranges,c.ranges.length-1):b}function Ya(a,b,c){var d=a.history.done,e=bg(d);e&&e.ranges?(d[d.length-1]=b,$a(a,b,c)):Za(a,b,c)}function Za(a,b,c){$a(a,b,c),uf(a,a.sel,a.cm?a.cm.curOp.id:NaN,c)}function $a(a,b,c){(Rf(a,"beforeSelectionChange")||a.cm&&Rf(a.cm,"beforeSelectionChange"))&&(b=Xa(a,b));var d=c&&c.bias||(pa(b.primary().head,a.sel.primary().head)<0?-1:1);_a(a,bb(a,b,d,!0)),c&&c.scroll===!1||!a.cm||td(a.cm)}function _a(a,b){b.equals(a.sel)||(a.sel=b,a.cm&&(a.cm.curOp.updateInput=a.cm.curOp.selectionChanged=!0,Qf(a.cm)),Nf(a,"cursorActivity",a))}function ab(a){_a(a,bb(a,a.sel,null,!1),Vf)}function bb(a,b,c,d){for(var e,f=0;f<b.ranges.length;f++){var g=b.ranges[f],h=cb(a,g.anchor,c,d),i=cb(a,g.head,c,d);(e||h!=g.anchor||i!=g.head)&&(e||(e=b.ranges.slice(0,f)),e[f]=new Ka(h,i))}return e?La(e,b.primIndex):b}function cb(a,b,c,d){var e=!1,f=b,g=c||1;a.cantEdit=!1;a:for(;;){var h=ff(a,f.line);if(h.markedSpans)for(var i=0;i<h.markedSpans.length;++i){var j=h.markedSpans[i],k=j.marker;if((null==j.from||(k.inclusiveLeft?j.from<=f.ch:j.from<f.ch))&&(null==j.to||(k.inclusiveRight?j.to>=f.ch:j.to>f.ch))){if(d&&(Lf(k,"beforeCursorEnter"),k.explicitlyCleared)){if(h.markedSpans){--i;continue}break}if(!k.atomic)continue;var l=k.find(0>g?-1:1);if(0==pa(l,f)&&(l.ch+=g,l.ch<0?l=l.line>a.first?Oa(a,oa(l.line-1)):null:l.ch>h.text.length&&(l=l.line<a.first+a.size-1?oa(l.line+1,0):null),!l)){if(e)return d?(a.cantEdit=!0,oa(a.first,0)):cb(a,b,c,!0);e=!0,l=b,g=-g}f=l;continue a}}return f}}function db(a){a.display.input.showSelection(a.display.input.prepareSelection())}function eb(a,b){for(var c=a.doc,d={},e=d.cursors=document.createDocumentFragment(),f=d.selection=document.createDocumentFragment(),g=0;g<c.sel.ranges.length;g++)if(b!==!1||g!=c.sel.primIndex){var h=c.sel.ranges[g],i=h.empty();(i||a.options.showCursorWhenSelecting)&&fb(a,h.head,e),i||gb(a,h,f)}return d}function fb(a,b,c){var d=Lb(a,b,"div",null,null,!a.options.singleCursorHeightPerLine),e=c.appendChild(pg("div","\xa0","CodeMirror-cursor"));if(e.style.left=d.left+"px",e.style.top=d.top+"px",e.style.height=Math.max(0,d.bottom-d.top)*a.options.cursorHeight+"px",d.other){var f=c.appendChild(pg("div","\xa0","CodeMirror-cursor CodeMirror-secondarycursor"));f.style.display="",f.style.left=d.other.left+"px",f.style.top=d.other.top+"px",f.style.height=.85*(d.other.bottom-d.other.top)+"px"}}function gb(a,b,c){function j(a,b,c,d){0>b&&(b=0),b=Math.round(b),d=Math.round(d),f.appendChild(pg("div",null,"CodeMirror-selected","position: absolute; left: "+a+"px; top: "+b+"px; width: "+(null==c?i-a:c)+"px; height: "+(d-b)+"px"))}function k(b,c,d){function m(c,d){return Kb(a,oa(b,c),"div",f,d)}var k,l,f=ff(e,b),g=f.text.length;return Og(nf(f),c||0,null==d?g:d,function(a,b,e){var n,o,p,f=m(a,"left");if(a==b)n=f,o=p=f.left;else{if(n=m(b-1,"right"),"rtl"==e){var q=f;f=n,n=q}o=f.left,p=n.right}null==c&&0==a&&(o=h),n.top-f.top>3&&(j(o,f.top,null,f.bottom),o=h,f.bottom<n.top&&j(o,f.bottom,null,n.top)),null==d&&b==g&&(p=i),(!k||f.top<k.top||f.top==k.top&&f.left<k.left)&&(k=f),(!l||n.bottom>l.bottom||n.bottom==l.bottom&&n.right>l.right)&&(l=n),h+1>o&&(o=h),j(o,n.top,p-o,n.bottom)}),{start:k,end:l}}var d=a.display,e=a.doc,f=document.createDocumentFragment(),g=ob(a.display),h=g.left,i=Math.max(d.sizerWidth,qb(a)-d.sizer.offsetLeft)-g.right,l=b.from(),m=b.to();if(l.line==m.line)k(l.line,l.ch,m.ch);else{var n=ff(e,l.line),o=ff(e,m.line),p=se(n)==se(o),q=k(l.line,l.ch,p?n.text.length+1:null).end,r=k(m.line,p?0:null,m.ch).start;p&&(q.top<r.top-2?(j(q.right,q.top,null,q.bottom),j(h,r.top,r.left,r.bottom)):j(q.right,q.top,r.left-q.right,q.bottom)),q.bottom<r.top&&j(h,q.bottom,null,r.top)}c.appendChild(f)}function hb(a){if(a.state.focused){var b=a.display;clearInterval(b.blinker);var c=!0;b.cursorDiv.style.visibility="",a.options.cursorBlinkRate>0?b.blinker=setInterval(function(){b.cursorDiv.style.visibility=(c=!c)?"":"hidden"},a.options.cursorBlinkRate):a.options.cursorBlinkRate<0&&(b.cursorDiv.style.visibility="hidden")}}function ib(a,b){a.doc.mode.startState&&a.doc.frontier<a.display.viewTo&&a.state.highlight.set(b,ig(jb,a))}function jb(a){var b=a.doc;if(b.frontier<b.first&&(b.frontier=b.first),!(b.frontier>=a.display.viewTo)){var c=+new Date+a.options.workTime,d=Jd(b.mode,lb(a,b.frontier)),e=[];b.iter(b.frontier,Math.min(b.first+b.size,a.display.viewTo+500),function(f){if(b.frontier>=a.display.viewFrom){var g=f.styles,h=f.text.length>a.options.maxHighlightLength,i=Ke(a,f,h?Jd(b.mode,d):d,!0);f.styles=i.styles;var j=f.styleClasses,k=i.classes;k?f.styleClasses=k:j&&(f.styleClasses=null);for(var l=!g||g.length!=f.styles.length||j!=k&&(!j||!k||j.bgClass!=k.bgClass||j.textClass!=k.textClass),m=0;!l&&m<g.length;++m)l=g[m]!=f.styles[m];l&&e.push(b.frontier),f.stateAfter=h?d:Jd(b.mode,d)}else f.text.length<=a.options.maxHighlightLength&&Me(a,f.text,d),f.stateAfter=b.frontier%5==0?Jd(b.mode,d):null;return++b.frontier,+new Date>c?(ib(a,a.options.workDelay),!0):void 0}),e.length&&cc(a,function(){for(var b=0;b<e.length;b++)jc(a,e[b],"text")})}}function kb(a,b,c){for(var d,e,f=a.doc,g=c?-1:b-(a.doc.mode.innerMode?1e3:100),h=b;h>g;--h){if(h<=f.first)return f.first;var i=ff(f,h-1);if(i.stateAfter&&(!c||h<=f.frontier))return h;var j=Zf(i.text,null,a.options.tabSize);(null==e||d>j)&&(e=h-1,d=j)}return e}function lb(a,b,c){var d=a.doc,e=a.display;if(!d.mode.startState)return!0;var f=kb(a,b,c),g=f>d.first&&ff(d,f-1).stateAfter;return g=g?Jd(d.mode,g):Kd(d.mode),d.iter(f,b,function(c){Me(a,c.text,g);var h=f==b-1||f%5==0||f>=e.viewFrom&&f<e.viewTo;c.stateAfter=h?Jd(d.mode,g):null,++f}),c&&(d.frontier=f),g}function mb(a){return a.lineSpace.offsetTop}function nb(a){return a.mover.offsetHeight-a.lineSpace.offsetHeight}function ob(a){if(a.cachedPaddingH)return a.cachedPaddingH;var b=sg(a.measure,pg("pre","x")),c=window.getComputedStyle?window.getComputedStyle(b):b.currentStyle,d={left:parseInt(c.paddingLeft),right:parseInt(c.paddingRight)};return isNaN(d.left)||isNaN(d.right)||(a.cachedPaddingH=d),d}function pb(a){return Tf-a.display.nativeBarWidth}function qb(a){return a.display.scroller.clientWidth-pb(a)-a.display.barWidth}function rb(a){return a.display.scroller.clientHeight-pb(a)-a.display.barHeight}function sb(a,b,c){var d=a.options.lineWrapping,e=d&&qb(a);if(!b.measure.heights||d&&b.measure.width!=e){var f=b.measure.heights=[];if(d){b.measure.width=e;for(var g=b.text.firstChild.getClientRects(),h=0;h<g.length-1;h++){var i=g[h],j=g[h+1];Math.abs(i.bottom-j.bottom)>2&&f.push((i.bottom+j.top)/2-c.top)}}f.push(c.bottom-c.top)}}function tb(a,b,c){if(a.line==b)return{map:a.measure.map,cache:a.measure.cache};for(var d=0;d<a.rest.length;d++)if(a.rest[d]==b)return{map:a.measure.maps[d],cache:a.measure.caches[d]};for(var d=0;d<a.rest.length;d++)if(kf(a.rest[d])>c)return{map:a.measure.maps[d],cache:a.measure.caches[d],before:!0}}function ub(a,b){b=se(b);var c=kf(b),d=a.display.externalMeasured=new gc(a.doc,b,c);d.lineN=c;var e=d.built=Qe(a,d);return d.text=e.pre,sg(a.display.lineMeasure,e.pre),d}function vb(a,b,c,d){return yb(a,xb(a,b),c,d)}function wb(a,b){if(b>=a.display.viewFrom&&b<a.display.viewTo)return a.display.view[lc(a,b)];var c=a.display.externalMeasured;return c&&b>=c.lineN&&b<c.lineN+c.size?c:void 0}function xb(a,b){var c=kf(b),d=wb(a,c);d&&!d.text?d=null:d&&d.changes&&(ca(a,d,c,aa(a)),a.curOp.forceUpdate=!0),d||(d=ub(a,b));var e=tb(d,b,c);return{line:b,view:d,rect:null,map:e.map,cache:e.cache,before:e.before,hasHeights:!1}}function yb(a,b,c,d,e){b.before&&(c=-1);var g,f=c+(d||"");return b.cache.hasOwnProperty(f)?g=b.cache[f]:(b.rect||(b.rect=b.view.text.getBoundingClientRect()),b.hasHeights||(sb(a,b.view,b.rect),b.hasHeights=!0),g=Bb(a,b,c,d),g.bogus||(b.cache[f]=g)),{left:g.left,right:g.right,top:e?g.rtop:g.top,bottom:e?g.rbottom:g.bottom}}function Ab(a,b,c){for(var d,e,f,g,h=0;h<a.length;h+=3){var i=a[h],j=a[h+1];if(i>b?(e=0,f=1,g="left"):j>b?(e=b-i,f=e+1):(h==a.length-3||b==j&&a[h+3]>b)&&(f=j-i,e=f-1,b>=j&&(g="right")),null!=e){if(d=a[h+2],i==j&&c==(d.insertLeft?"left":"right")&&(g=c),"left"==c&&0==e)for(;h&&a[h-2]==a[h-3]&&a[h-1].insertLeft;)d=a[(h-=3)+2],g="left";if("right"==c&&e==j-i)for(;h<a.length-3&&a[h+3]==a[h+4]&&!a[h+5].insertLeft;)d=a[(h+=3)+2],g="right";break}}return{node:d,start:e,end:f,collapse:g,coverStart:i,coverEnd:j}}function Bb(a,b,c,f){var l,g=Ab(b.map,c,f),h=g.node,i=g.start,j=g.end,k=g.collapse;if(3==h.nodeType){for(var m=0;4>m;m++){for(;i&&og(b.line.text.charAt(g.coverStart+i));)--i;for(;g.coverStart+j<g.coverEnd&&og(b.line.text.charAt(g.coverStart+j));)++j;
-if(d&&9>e&&0==i&&j==g.coverEnd-g.coverStart)l=h.parentNode.getBoundingClientRect();else if(d&&a.options.lineWrapping){var n=qg(h,i,j).getClientRects();l=n.length?n["right"==f?n.length-1:0]:zb}else l=qg(h,i,j).getBoundingClientRect()||zb;if(l.left||l.right||0==i)break;j=i,i-=1,k="right"}d&&11>e&&(l=Cb(a.display.measure,l))}else{i>0&&(k=f="right");var n;l=a.options.lineWrapping&&(n=h.getClientRects()).length>1?n["right"==f?n.length-1:0]:h.getBoundingClientRect()}if(d&&9>e&&!i&&(!l||!l.left&&!l.right)){var o=h.parentNode.getClientRects()[0];l=o?{left:o.left,right:o.left+Sb(a.display),top:o.top,bottom:o.bottom}:zb}for(var p=l.top-b.rect.top,q=l.bottom-b.rect.top,r=(p+q)/2,s=b.view.measure.heights,m=0;m<s.length-1&&!(r<s[m]);m++);var t=m?s[m-1]:0,u=s[m],v={left:("right"==k?l.right:l.left)-b.rect.left,right:("left"==k?l.left:l.right)-b.rect.left,top:t,bottom:u};return l.left||l.right||(v.bogus=!0),a.options.singleCursorHeightPerLine||(v.rtop=p,v.rbottom=q),v}function Cb(a,b){if(!window.screen||null==screen.logicalXDPI||screen.logicalXDPI==screen.deviceXDPI||!Mg(a))return b;var c=screen.logicalXDPI/screen.deviceXDPI,d=screen.logicalYDPI/screen.deviceYDPI;return{left:b.left*c,right:b.right*c,top:b.top*d,bottom:b.bottom*d}}function Db(a){if(a.measure&&(a.measure.cache={},a.measure.heights=null,a.rest))for(var b=0;b<a.rest.length;b++)a.measure.caches[b]={}}function Eb(a){a.display.externalMeasure=null,rg(a.display.lineMeasure);for(var b=0;b<a.display.view.length;b++)Db(a.display.view[b])}function Fb(a){Eb(a),a.display.cachedCharWidth=a.display.cachedTextHeight=a.display.cachedPaddingH=null,a.options.lineWrapping||(a.display.maxLineChanged=!0),a.display.lineNumChars=null}function Gb(){return window.pageXOffset||(document.documentElement||document.body).scrollLeft}function Hb(){return window.pageYOffset||(document.documentElement||document.body).scrollTop}function Ib(a,b,c,d){if(b.widgets)for(var e=0;e<b.widgets.length;++e)if(b.widgets[e].above){var f=Ae(b.widgets[e]);c.top+=f,c.bottom+=f}if("line"==d)return c;d||(d="local");var g=mf(b);if("local"==d?g+=mb(a.display):g-=a.display.viewOffset,"page"==d||"window"==d){var h=a.display.lineSpace.getBoundingClientRect();g+=h.top+("window"==d?0:Hb());var i=h.left+("window"==d?0:Gb());c.left+=i,c.right+=i}return c.top+=g,c.bottom+=g,c}function Jb(a,b,c){if("div"==c)return b;var d=b.left,e=b.top;if("page"==c)d-=Gb(),e-=Hb();else if("local"==c||!c){var f=a.display.sizer.getBoundingClientRect();d+=f.left,e+=f.top}var g=a.display.lineSpace.getBoundingClientRect();return{left:d-g.left,top:e-g.top}}function Kb(a,b,c,d,e){return d||(d=ff(a.doc,b.line)),Ib(a,d,vb(a,d,b.ch,e),c)}function Lb(a,b,c,d,e,f){function g(b,g){var h=yb(a,e,b,g?"right":"left",f);return g?h.left=h.right:h.right=h.left,Ib(a,d,h,c)}function h(a,b){var c=i[b],d=c.level%2;return a==Pg(c)&&b&&c.level<i[b-1].level?(c=i[--b],a=Qg(c)-(c.level%2?0:1),d=!0):a==Qg(c)&&b<i.length-1&&c.level<i[b+1].level&&(c=i[++b],a=Pg(c)-c.level%2,d=!1),d&&a==c.to&&a>c.from?g(a-1):g(a,d)}d=d||ff(a.doc,b.line),e||(e=xb(a,d));var i=nf(d),j=b.ch;if(!i)return g(j);var k=Yg(i,j),l=h(j,k);return null!=Xg&&(l.other=h(j,Xg)),l}function Mb(a,b){var c=0,b=Oa(a.doc,b);a.options.lineWrapping||(c=Sb(a.display)*b.ch);var d=ff(a.doc,b.line),e=mf(d)+mb(a.display);return{left:c,right:c,top:e,bottom:e+d.height}}function Nb(a,b,c,d){var e=oa(a,b);return e.xRel=d,c&&(e.outside=!0),e}function Ob(a,b,c){var d=a.doc;if(c+=a.display.viewOffset,0>c)return Nb(d.first,0,!0,-1);var e=lf(d,c),f=d.first+d.size-1;if(e>f)return Nb(d.first+d.size-1,ff(d,f).text.length,!0,1);0>b&&(b=0);for(var g=ff(d,e);;){var h=Pb(a,g,e,b,c),i=qe(g),j=i&&i.find(0,!0);if(!i||!(h.ch>j.from.ch||h.ch==j.from.ch&&h.xRel>0))return h;e=kf(g=j.to.line)}}function Pb(a,b,c,d,e){function j(d){var e=Lb(a,oa(c,d),"line",b,i);return g=!0,f>e.bottom?e.left-h:f<e.top?e.left+h:(g=!1,e.left)}var f=e-mf(b),g=!1,h=2*a.display.wrapper.clientWidth,i=xb(a,b),k=nf(b),l=b.text.length,m=Rg(b),n=Sg(b),o=j(m),p=g,q=j(n),r=g;if(d>q)return Nb(c,n,r,1);for(;;){if(k?n==m||n==$g(b,m,1):1>=n-m){for(var s=o>d||q-d>=d-o?m:n,t=d-(s==m?o:q);og(b.text.charAt(s));)++s;var u=Nb(c,s,s==m?p:r,-1>t?-1:t>1?1:0);return u}var v=Math.ceil(l/2),w=m+v;if(k){w=m;for(var x=0;v>x;++x)w=$g(b,w,1)}var y=j(w);y>d?(n=w,q=y,(r=g)&&(q+=1e3),l=v):(m=w,o=y,p=g,l-=v)}}function Rb(a){if(null!=a.cachedTextHeight)return a.cachedTextHeight;if(null==Qb){Qb=pg("pre");for(var b=0;49>b;++b)Qb.appendChild(document.createTextNode("x")),Qb.appendChild(pg("br"));Qb.appendChild(document.createTextNode("x"))}sg(a.measure,Qb);var c=Qb.offsetHeight/50;return c>3&&(a.cachedTextHeight=c),rg(a.measure),c||1}function Sb(a){if(null!=a.cachedCharWidth)return a.cachedCharWidth;var b=pg("span","xxxxxxxxxx"),c=pg("pre",[b]);sg(a.measure,c);var d=b.getBoundingClientRect(),e=(d.right-d.left)/10;return e>2&&(a.cachedCharWidth=e),e||10}function Vb(a){a.curOp={cm:a,viewChanged:!1,startHeight:a.doc.height,forceUpdate:!1,updateInput:null,typing:!1,changeObjs:null,cursorActivityHandlers:null,cursorActivityCalled:0,selectionChanged:!1,updateMaxLine:!1,scrollLeft:null,scrollTop:null,scrollToPos:null,focus:!1,id:++Ub},Tb?Tb.ops.push(a.curOp):a.curOp.ownsGroup=Tb={ops:[a.curOp],delayedCallbacks:[]}}function Wb(a){var b=a.delayedCallbacks,c=0;do{for(;c<b.length;c++)b[c].call(null);for(var d=0;d<a.ops.length;d++){var e=a.ops[d];if(e.cursorActivityHandlers)for(;e.cursorActivityCalled<e.cursorActivityHandlers.length;)e.cursorActivityHandlers[e.cursorActivityCalled++].call(null,e.cm)}}while(c<b.length)}function Xb(a){var b=a.curOp,c=b.ownsGroup;if(c)try{Wb(c)}finally{Tb=null;for(var d=0;d<c.ops.length;d++)c.ops[d].cm.curOp=null;Yb(c)}}function Yb(a){for(var b=a.ops,c=0;c<b.length;c++)Zb(b[c]);for(var c=0;c<b.length;c++)$b(b[c]);for(var c=0;c<b.length;c++)_b(b[c]);for(var c=0;c<b.length;c++)ac(b[c]);for(var c=0;c<b.length;c++)bc(b[c])}function Zb(a){var b=a.cm,c=b.display;V(b),a.updateMaxLine&&H(b),a.mustUpdate=a.viewChanged||a.forceUpdate||null!=a.scrollTop||a.scrollToPos&&(a.scrollToPos.from.line<c.viewFrom||a.scrollToPos.to.line>=c.viewTo)||c.maxLineChanged&&b.options.lineWrapping,a.update=a.mustUpdate&&new U(b,a.mustUpdate&&{top:a.scrollTop,ensure:a.scrollToPos},a.forceUpdate)}function $b(a){a.updatedDisplay=a.mustUpdate&&W(a.cm,a.update)}function _b(a){var b=a.cm,c=b.display;a.updatedDisplay&&$(b),a.barMeasure=J(b),c.maxLineChanged&&!b.options.lineWrapping&&(a.adjustWidthTo=vb(b,c.maxLine,c.maxLine.text.length).left+3,b.display.sizerWidth=a.adjustWidthTo,a.barMeasure.scrollWidth=Math.max(c.scroller.clientWidth,c.sizer.offsetLeft+a.adjustWidthTo+pb(b)+b.display.barWidth),a.maxScrollLeft=Math.max(0,c.sizer.offsetLeft+a.adjustWidthTo-qb(b))),(a.updatedDisplay||a.selectionChanged)&&(a.preparedSelection=c.input.prepareSelection())}function ac(a){var b=a.cm;null!=a.adjustWidthTo&&(b.display.sizer.style.minWidth=a.adjustWidthTo+"px",a.maxScrollLeft<b.doc.scrollLeft&&Ic(b,Math.min(b.display.scroller.scrollLeft,a.maxScrollLeft),!0),b.display.maxLineChanged=!1),a.preparedSelection&&b.display.input.showSelection(a.preparedSelection),a.updatedDisplay&&Z(b,a.barMeasure),(a.updatedDisplay||a.startHeight!=b.doc.height)&&N(b,a.barMeasure),a.selectionChanged&&hb(b),b.state.focused&&a.updateInput&&b.display.input.reset(a.typing),a.focus&&a.focus==ug()&&ta(a.cm)}function bc(a){var b=a.cm,c=b.display,d=b.doc;if(a.updatedDisplay&&X(b,a.update),null==c.wheelStartX||null==a.scrollTop&&null==a.scrollLeft&&!a.scrollToPos||(c.wheelStartX=c.wheelStartY=null),null==a.scrollTop||c.scroller.scrollTop==a.scrollTop&&!a.forceScroll||(d.scrollTop=Math.max(0,Math.min(c.scroller.scrollHeight-c.scroller.clientHeight,a.scrollTop)),c.scrollbars.setScrollTop(d.scrollTop),c.scroller.scrollTop=d.scrollTop),null==a.scrollLeft||c.scroller.scrollLeft==a.scrollLeft&&!a.forceScroll||(d.scrollLeft=Math.max(0,Math.min(c.scroller.scrollWidth-qb(b),a.scrollLeft)),c.scrollbars.setScrollLeft(d.scrollLeft),c.scroller.scrollLeft=d.scrollLeft,Q(b)),a.scrollToPos){var e=pd(b,Oa(d,a.scrollToPos.from),Oa(d,a.scrollToPos.to),a.scrollToPos.margin);a.scrollToPos.isCursor&&b.state.focused&&od(b,e)}var f=a.maybeHiddenMarkers,g=a.maybeUnhiddenMarkers;if(f)for(var h=0;h<f.length;++h)f[h].lines.length||Lf(f[h],"hide");if(g)for(var h=0;h<g.length;++h)g[h].lines.length&&Lf(g[h],"unhide");c.wrapper.offsetHeight&&(d.scrollTop=b.display.scroller.scrollTop),a.changeObjs&&Lf(b,"changes",b,a.changeObjs),a.update&&a.update.finish()}function cc(a,b){if(a.curOp)return b();Vb(a);try{return b()}finally{Xb(a)}}function dc(a,b){return function(){if(a.curOp)return b.apply(a,arguments);Vb(a);try{return b.apply(a,arguments)}finally{Xb(a)}}}function ec(a){return function(){if(this.curOp)return a.apply(this,arguments);Vb(this);try{return a.apply(this,arguments)}finally{Xb(this)}}}function fc(a){return function(){var b=this.cm;if(!b||b.curOp)return a.apply(this,arguments);Vb(b);try{return a.apply(this,arguments)}finally{Xb(b)}}}function gc(a,b,c){this.line=b,this.rest=te(b),this.size=this.rest?kf(bg(this.rest))-c+1:1,this.node=this.text=null,this.hidden=we(a,b)}function hc(a,b,c){for(var e,d=[],f=b;c>f;f=e){var g=new gc(a.doc,ff(a.doc,f),f);e=f+g.size,d.push(g)}return d}function ic(a,b,c,d){null==b&&(b=a.doc.first),null==c&&(c=a.doc.first+a.doc.size),d||(d=0);var e=a.display;if(d&&c<e.viewTo&&(null==e.updateLineNumbers||e.updateLineNumbers>b)&&(e.updateLineNumbers=b),a.curOp.viewChanged=!0,b>=e.viewTo)u&&ue(a.doc,b)<e.viewTo&&kc(a);else if(c<=e.viewFrom)u&&ve(a.doc,c+d)>e.viewFrom?kc(a):(e.viewFrom+=d,e.viewTo+=d);else if(b<=e.viewFrom&&c>=e.viewTo)kc(a);else if(b<=e.viewFrom){var f=mc(a,c,c+d,1);f?(e.view=e.view.slice(f.index),e.viewFrom=f.lineN,e.viewTo+=d):kc(a)}else if(c>=e.viewTo){var f=mc(a,b,b,-1);f?(e.view=e.view.slice(0,f.index),e.viewTo=f.lineN):kc(a)}else{var g=mc(a,b,b,-1),h=mc(a,c,c+d,1);g&&h?(e.view=e.view.slice(0,g.index).concat(hc(a,g.lineN,h.lineN)).concat(e.view.slice(h.index)),e.viewTo+=d):kc(a)}var i=e.externalMeasured;i&&(c<i.lineN?i.lineN+=d:b<i.lineN+i.size&&(e.externalMeasured=null))}function jc(a,b,c){a.curOp.viewChanged=!0;var d=a.display,e=a.display.externalMeasured;if(e&&b>=e.lineN&&b<e.lineN+e.size&&(d.externalMeasured=null),!(b<d.viewFrom||b>=d.viewTo)){var f=d.view[lc(a,b)];if(null!=f.node){var g=f.changes||(f.changes=[]);-1==dg(g,c)&&g.push(c)}}}function kc(a){a.display.viewFrom=a.display.viewTo=a.doc.first,a.display.view=[],a.display.viewOffset=0}function lc(a,b){if(b>=a.display.viewTo)return null;if(b-=a.display.viewFrom,0>b)return null;for(var c=a.display.view,d=0;d<c.length;d++)if(b-=c[d].size,0>b)return d}function mc(a,b,c,d){var f,e=lc(a,b),g=a.display.view;if(!u||c==a.doc.first+a.doc.size)return{index:e,lineN:c};for(var h=0,i=a.display.viewFrom;e>h;h++)i+=g[h].size;if(i!=b){if(d>0){if(e==g.length-1)return null;f=i+g[e].size-b,e++}else f=i-b;b+=f,c+=f}for(;ue(a.doc,c)!=c;){if(e==(0>d?0:g.length-1))return null;c+=d*g[e-(0>d?1:0)].size,e+=d}return{index:e,lineN:c}}function nc(a,b,c){var d=a.display,e=d.view;0==e.length||b>=d.viewTo||c<=d.viewFrom?(d.view=hc(a,b,c),d.viewFrom=b):(d.viewFrom>b?d.view=hc(a,b,d.viewFrom).concat(d.view):d.viewFrom<b&&(d.view=d.view.slice(lc(a,b))),d.viewFrom=b,d.viewTo<c?d.view=d.view.concat(hc(a,d.viewTo,c)):d.viewTo>c&&(d.view=d.view.slice(0,lc(a,c)))),d.viewTo=c}function oc(a){for(var b=a.display.view,c=0,d=0;d<b.length;d++){var e=b[d];e.hidden||e.node&&!e.changes||++c}return c}function pc(a){function g(){b.activeTouch&&(c=setTimeout(function(){b.activeTouch=null},1e3),f=b.activeTouch,f.end=+new Date)}function h(a){if(1!=a.touches.length)return!1;var b=a.touches[0];return b.radiusX<=1&&b.radiusY<=1}function i(a,b){if(null==b.left)return!0;var c=b.left-a.left,d=b.top-a.top;return c*c+d*d>400}var b=a.display;Jf(b.scroller,"mousedown",dc(a,uc)),d&&11>e?Jf(b.scroller,"dblclick",dc(a,function(b){if(!Pf(a,b)){var c=tc(a,b);if(c&&!Bc(a,b)&&!sc(a.display,b)){Df(b);var d=a.findWordAt(c);Ta(a.doc,d.anchor,d.head)}}})):Jf(b.scroller,"dblclick",function(b){Pf(a,b)||Df(b)}),s||Jf(b.scroller,"contextmenu",function(b){_c(a,b)});var c,f={end:0};Jf(b.scroller,"touchstart",function(a){if(!h(a)){clearTimeout(c);var d=+new Date;b.activeTouch={start:d,moved:!1,prev:d-f.end<=300?f:null},1==a.touches.length&&(b.activeTouch.left=a.touches[0].pageX,b.activeTouch.top=a.touches[0].pageY)}}),Jf(b.scroller,"touchmove",function(){b.activeTouch&&(b.activeTouch.moved=!0)}),Jf(b.scroller,"touchend",function(c){var d=b.activeTouch;if(d&&!sc(b,c)&&null!=d.left&&!d.moved&&new Date-d.start<300){var f,e=a.coordsChar(b.activeTouch,"page");f=!d.prev||i(d,d.prev)?new Ka(e,e):!d.prev.prev||i(d,d.prev.prev)?a.findWordAt(e):new Ka(oa(e.line,0),Oa(a.doc,oa(e.line+1,0))),a.setSelection(f.anchor,f.head),a.focus(),Df(c)}g()}),Jf(b.scroller,"touchcancel",g),Jf(b.scroller,"scroll",function(){b.scroller.clientHeight&&(Hc(a,b.scroller.scrollTop),Ic(a,b.scroller.scrollLeft,!0),Lf(a,"scroll",a))}),Jf(b.scroller,"mousewheel",function(b){Mc(a,b)}),Jf(b.scroller,"DOMMouseScroll",function(b){Mc(a,b)}),Jf(b.wrapper,"scroll",function(){b.wrapper.scrollTop=b.wrapper.scrollLeft=0}),b.dragFunctions={enter:function(b){Pf(a,b)||Gf(b)},over:function(b){Pf(a,b)||(Fc(a,b),Gf(b))},start:function(b){Ec(a,b)},drop:dc(a,Dc),leave:function(){Gc(a)}};var j=b.input.getField();Jf(j,"keyup",function(b){Wc.call(a,b)}),Jf(j,"keydown",dc(a,Uc)),Jf(j,"keypress",dc(a,Xc)),Jf(j,"focus",ig(Zc,a)),Jf(j,"blur",ig($c,a))}function qc(a,b,c){var d=c&&c!=v.Init;if(!b!=!d){var e=a.display.dragFunctions,f=b?Jf:Kf;f(a.display.scroller,"dragstart",e.start),f(a.display.scroller,"dragenter",e.enter),f(a.display.scroller,"dragover",e.over),f(a.display.scroller,"dragleave",e.leave),f(a.display.scroller,"drop",e.drop)}}function rc(a){var b=a.display;(b.lastWrapHeight!=b.wrapper.clientHeight||b.lastWrapWidth!=b.wrapper.clientWidth)&&(b.cachedCharWidth=b.cachedTextHeight=b.cachedPaddingH=null,b.scrollbarsClipped=!1,a.setSize())}function sc(a,b){for(var c=Hf(b);c!=a.wrapper;c=c.parentNode)if(!c||1==c.nodeType&&"true"==c.getAttribute("cm-ignore-events")||c.parentNode==a.sizer&&c!=a.mover)return!0}function tc(a,b,c,d){var e=a.display;if(!c&&"true"==Hf(b).getAttribute("cm-not-content"))return null;var f,g,h=e.lineSpace.getBoundingClientRect();try{f=b.clientX-h.left,g=b.clientY-h.top}catch(b){return null}var j,i=Ob(a,f,g);if(d&&1==i.xRel&&(j=ff(a.doc,i.line).text).length==i.ch){var k=Zf(j,j.length,a.options.tabSize)-j.length;i=oa(i.line,Math.max(0,Math.round((f-ob(a.display).left)/Sb(a.display))-k))}return i}function uc(a){var b=this,c=b.display;if(!(c.activeTouch&&c.input.supportsTouch()||Pf(b,a))){if(c.shift=a.shiftKey,sc(c,a))return void(f||(c.scroller.draggable=!1,setTimeout(function(){c.scroller.draggable=!0},100)));if(!Bc(b,a)){var d=tc(b,a);switch(window.focus(),If(a)){case 1:b.state.selectingText?b.state.selectingText(a):d?xc(b,a,d):Hf(a)==c.scroller&&Df(a);break;case 2:f&&(b.state.lastMiddleDown=+new Date),d&&Ta(b.doc,d),setTimeout(function(){c.input.focus()},20),Df(a);break;case 3:s?_c(b,a):Yc(b)}}}}function xc(a,b,c){d?setTimeout(ig(ta,a),0):a.curOp.focus=ug();var f,e=+new Date;wc&&wc.time>e-400&&0==pa(wc.pos,c)?f="triple":vc&&vc.time>e-400&&0==pa(vc.pos,c)?(f="double",wc={time:e,pos:c}):(f="single",vc={time:e,pos:c});var i,g=a.doc.sel,h=o?b.metaKey:b.ctrlKey;a.options.dragDrop&&Dg&&!ua(a)&&"single"==f&&(i=g.contains(c))>-1&&(pa((i=g.ranges[i]).from(),c)<0||c.xRel>0)&&(pa(i.to(),c)>0||c.xRel<0)?yc(a,b,c,h):zc(a,b,c,f,h)}function yc(a,b,c,g){var h=a.display,i=+new Date,j=dc(a,function(k){f&&(h.scroller.draggable=!1),a.state.draggingText=!1,Kf(document,"mouseup",j),Kf(h.scroller,"drop",j),Math.abs(b.clientX-k.clientX)+Math.abs(b.clientY-k.clientY)<10&&(Df(k),!g&&+new Date-200<i&&Ta(a.doc,c),f||d&&9==e?setTimeout(function(){document.body.focus(),h.input.focus()},20):h.input.focus())});f&&(h.scroller.draggable=!0),a.state.draggingText=j,h.scroller.dragDrop&&h.scroller.dragDrop(),Jf(document,"mouseup",j),Jf(h.scroller,"drop",j)}function zc(a,b,c,d,e){function o(b){if(0!=pa(n,b))if(n=b,"rect"==d){for(var e=[],f=a.options.tabSize,k=Zf(ff(g,c.line).text,c.ch,f),l=Zf(ff(g,b.line).text,b.ch,f),m=Math.min(k,l),o=Math.max(k,l),p=Math.min(c.line,b.line),q=Math.min(a.lastLine(),Math.max(c.line,b.line));q>=p;p++){var r=ff(g,p).text,s=$f(r,m,f);m==o?e.push(new Ka(oa(p,s),oa(p,s))):r.length>s&&e.push(new Ka(oa(p,s),oa(p,$f(r,o,f))))}e.length||e.push(new Ka(c,c)),Za(g,La(j.ranges.slice(0,i).concat(e),i),{origin:"*mouse",scroll:!1}),a.scrollIntoView(b)}else{var t=h,u=t.anchor,v=b;if("single"!=d){if("double"==d)var w=a.findWordAt(b);else var w=new Ka(oa(b.line,0),Oa(g,oa(b.line+1,0)));pa(w.anchor,u)>0?(v=w.head,u=sa(t.from(),w.anchor)):(v=w.anchor,u=ra(t.to(),w.head))}var e=j.ranges.slice(0);e[i]=new Ka(Oa(g,u),v),Za(g,La(e,i),Wf)}}function r(b){var c=++q,e=tc(a,b,!0,"rect"==d);if(e)if(0!=pa(e,n)){a.curOp.focus=ug(),o(e);var h=P(f,g);(e.line>=h.to||e.line<h.from)&&setTimeout(dc(a,function(){q==c&&r(b)}),150)}else{var i=b.clientY<p.top?-20:b.clientY>p.bottom?20:0;i&&setTimeout(dc(a,function(){q==c&&(f.scroller.scrollTop+=i,r(b))}),50)}}function s(b){a.state.selectingText=!1,q=1/0,Df(b),f.input.focus(),Kf(document,"mousemove",t),Kf(document,"mouseup",u),g.history.lastSelOrigin=null}var f=a.display,g=a.doc;Df(b);var h,i,j=g.sel,k=j.ranges;if(e&&!b.shiftKey?(i=g.sel.contains(c),h=i>-1?k[i]:new Ka(c,c)):(h=g.sel.primary(),i=g.sel.primIndex),b.altKey)d="rect",e||(h=new Ka(c,c)),c=tc(a,b,!0,!0),i=-1;else if("double"==d){var l=a.findWordAt(c);h=a.display.shift||g.extend?Sa(g,h,l.anchor,l.head):l}else if("triple"==d){var m=new Ka(oa(c.line,0),Oa(g,oa(c.line+1,0)));h=a.display.shift||g.extend?Sa(g,h,m.anchor,m.head):m}else h=Sa(g,h,c);e?-1==i?(i=k.length,Za(g,La(k.concat([h]),i),{scroll:!1,origin:"*mouse"})):k.length>1&&k[i].empty()&&"single"==d&&!b.shiftKey?(Za(g,La(k.slice(0,i).concat(k.slice(i+1)),0),{scroll:!1,origin:"*mouse"}),j=g.sel):Va(g,i,h,Wf):(i=0,Za(g,new Ja([h],0),Wf),j=g.sel);var n=c,p=f.wrapper.getBoundingClientRect(),q=0,t=dc(a,function(a){If(a)?r(a):s(a)}),u=dc(a,s);a.state.selectingText=u,Jf(document,"mousemove",t),Jf(document,"mouseup",u)}function Ac(a,b,c,d,e){try{var f=b.clientX,g=b.clientY}catch(b){return!1}if(f>=Math.floor(a.display.gutters.getBoundingClientRect().right))return!1;d&&Df(b);var h=a.display,i=h.lineDiv.getBoundingClientRect();if(g>i.bottom||!Rf(a,c))return Ff(b);g-=i.top-h.viewOffset;for(var j=0;j<a.options.gutters.length;++j){var k=h.gutters.childNodes[j];if(k&&k.getBoundingClientRect().right>=f){var l=lf(a.doc,g),m=a.options.gutters[j];return e(a,c,a,l,m,b),Ff(b)}}}function Bc(a,b){return Ac(a,b,"gutterClick",!0,Nf)}function Dc(a){var b=this;if(Gc(b),!Pf(b,a)&&!sc(b.display,a)){Df(a),d&&(Cc=+new Date);var c=tc(b,a,!0),e=a.dataTransfer.files;if(c&&!ua(b))if(e&&e.length&&window.FileReader&&window.File)for(var f=e.length,g=Array(f),h=0,i=function(a,d){var e=new FileReader;e.onload=dc(b,function(){if(g[d]=e.result,++h==f){c=Oa(b.doc,c);var a={from:c,to:c,text:b.doc.splitLines(g.join(b.doc.lineSeparator())),origin:"paste"};hd(b.doc,a),Ya(b.doc,Ma(c,bd(a)))}}),e.readAsText(a)},j=0;f>j;++j)i(e[j],j);else{if(b.state.draggingText&&b.doc.sel.contains(c)>-1)return b.state.draggingText(a),void setTimeout(function(){b.display.input.focus()},20);try{var g=a.dataTransfer.getData("Text");if(g){if(b.state.draggingText&&!(o?a.altKey:a.ctrlKey))var k=b.listSelections();if($a(b.doc,Ma(c,c)),k)for(var j=0;j<k.length;++j)nd(b.doc,"",k[j].anchor,k[j].head,"drag");b.replaceSelection(g,"around","paste"),b.display.input.focus()}}catch(a){}}}}function Ec(a,b){if(d&&(!a.state.draggingText||+new Date-Cc<100))return void Gf(b);if(!Pf(a,b)&&!sc(a.display,b)&&(b.dataTransfer.setData("Text",a.getSelection()),b.dataTransfer.setDragImage&&!j)){var c=pg("img",null,null,"position: fixed; left: 0; top: 0;");c.src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==",i&&(c.width=c.height=1,a.display.wrapper.appendChild(c),c._top=c.offsetTop),b.dataTransfer.setDragImage(c,0,0),i&&c.parentNode.removeChild(c)}}function Fc(a,b){var c=tc(a,b);if(c){var d=document.createDocumentFragment();fb(a,c,d),a.display.dragCursor||(a.display.dragCursor=pg("div",null,"CodeMirror-cursors CodeMirror-dragcursors"),a.display.lineSpace.insertBefore(a.display.dragCursor,a.display.cursorDiv)),sg(a.display.dragCursor,d)}}function Gc(a){a.display.dragCursor&&(a.display.lineSpace.removeChild(a.display.dragCursor),a.display.dragCursor=null)}function Hc(b,c){Math.abs(b.doc.scrollTop-c)<2||(b.doc.scrollTop=c,a||Y(b,{top:c}),b.display.scroller.scrollTop!=c&&(b.display.scroller.scrollTop=c),b.display.scrollbars.setScrollTop(c),a&&Y(b),ib(b,100))}function Ic(a,b,c){(c?b==a.doc.scrollLeft:Math.abs(a.doc.scrollLeft-b)<2)||(b=Math.min(b,a.display.scroller.scrollWidth-a.display.scroller.clientWidth),a.doc.scrollLeft=b,Q(a),a.display.scroller.scrollLeft!=b&&(a.display.scroller.scrollLeft=b),a.display.scrollbars.setScrollLeft(b))}function Mc(b,c){var d=Lc(c),e=d.x,g=d.y,h=b.display,j=h.scroller;if(e&&j.scrollWidth>j.clientWidth||g&&j.scrollHeight>j.clientHeight){if(g&&o&&f)a:for(var k=c.target,l=h.view;k!=j;k=k.parentNode)for(var m=0;m<l.length;m++)if(l[m].node==k){b.display.currentWheelTarget=k;break a}if(e&&!a&&!i&&null!=Kc)return g&&Hc(b,Math.max(0,Math.min(j.scrollTop+g*Kc,j.scrollHeight-j.clientHeight))),Ic(b,Math.max(0,Math.min(j.scrollLeft+e*Kc,j.scrollWidth-j.clientWidth))),Df(c),void(h.wheelStartX=null);if(g&&null!=Kc){var n=g*Kc,p=b.doc.scrollTop,q=p+h.wrapper.clientHeight;0>n?p=Math.max(0,p+n-50):q=Math.min(b.doc.height,q+n+50),Y(b,{top:p,bottom:q})}20>Jc&&(null==h.wheelStartX?(h.wheelStartX=j.scrollLeft,h.wheelStartY=j.scrollTop,h.wheelDX=e,h.wheelDY=g,setTimeout(function(){if(null!=h.wheelStartX){var a=j.scrollLeft-h.wheelStartX,b=j.scrollTop-h.wheelStartY,c=b&&h.wheelDY&&b/h.wheelDY||a&&h.wheelDX&&a/h.wheelDX;h.wheelStartX=h.wheelStartY=null,c&&(Kc=(Kc*Jc+c)/(Jc+1),++Jc)}},200)):(h.wheelDX+=e,h.wheelDY+=g))}}function Nc(a,b,c){if("string"==typeof b&&(b=Ld[b],!b))return!1;a.display.input.ensurePolled();var d=a.display.shift,e=!1;try{ua(a)&&(a.state.suppressEdits=!0),c&&(a.display.shift=!1),e=b(a)!=Uf}finally{a.display.shift=d,a.state.suppressEdits=!1}return e}function Oc(a,b,c){for(var d=0;d<a.state.keyMaps.length;d++){var e=Od(b,a.state.keyMaps[d],c,a);if(e)return e}return a.options.extraKeys&&Od(b,a.options.extraKeys,c,a)||Od(b,a.options.keyMap,c,a)}function Qc(a,b,c,d){var e=a.state.keySeq;if(e){if(Pd(b))return"handled";Pc.set(50,function(){a.state.keySeq==e&&(a.state.keySeq=null,a.display.input.reset())}),b=e+" "+b}var f=Oc(a,b,d);return"multi"==f&&(a.state.keySeq=b),"handled"==f&&Nf(a,"keyHandled",a,b,c),("handled"==f||"multi"==f)&&(Df(c),hb(a)),e&&!f&&/\'$/.test(b)?(Df(c),!0):!!f}function Rc(a,b){var c=Qd(b,!0);return c?b.shiftKey&&!a.state.keySeq?Qc(a,"Shift-"+c,b,function(b){return Nc(a,b,!0)})||Qc(a,c,b,function(b){return("string"==typeof b?/^go[A-Z]/.test(b):b.motion)?Nc(a,b):void 0}):Qc(a,c,b,function(b){return Nc(a,b)}):!1}function Sc(a,b,c){return Qc(a,"'"+c+"'",b,function(b){return Nc(a,b,!0)})}function Uc(a){var b=this;if(b.curOp.focus=ug(),!Pf(b,a)){d&&11>e&&27==a.keyCode&&(a.returnValue=!1);var c=a.keyCode;b.display.shift=16==c||a.shiftKey;var f=Rc(b,a);i&&(Tc=f?c:null,!f&&88==c&&!Kg&&(o?a.metaKey:a.ctrlKey)&&b.replaceSelection("",null,"cut")),18!=c||/\bCodeMirror-crosshair\b/.test(b.display.lineDiv.className)||Vc(b)}}function Vc(a){function c(a){18!=a.keyCode&&a.altKey||(wg(b,"CodeMirror-crosshair"),Kf(document,"keyup",c),Kf(document,"mouseover",c))}var b=a.display.lineDiv;xg(b,"CodeMirror-crosshair"),Jf(document,"keyup",c),Jf(document,"mouseover",c)}function Wc(a){16==a.keyCode&&(this.doc.sel.shift=!1),Pf(this,a)}function Xc(a){var b=this;if(!(sc(b.display,a)||Pf(b,a)||a.ctrlKey&&!a.altKey||o&&a.metaKey)){var c=a.keyCode,d=a.charCode;if(i&&c==Tc)return Tc=null,void Df(a);if(!i||a.which&&!(a.which<10)||!Rc(b,a)){var e=String.fromCharCode(null==d?c:d);Sc(b,a,e)||b.display.input.onKeyPress(a)}}}function Yc(a){a.state.delayingBlurEvent=!0,setTimeout(function(){a.state.delayingBlurEvent&&(a.state.delayingBlurEvent=!1,$c(a))},100)}function Zc(a){a.state.delayingBlurEvent&&(a.state.delayingBlurEvent=!1),"nocursor"!=a.options.readOnly&&(a.state.focused||(Lf(a,"focus",a),a.state.focused=!0,xg(a.display.wrapper,"CodeMirror-focused"),a.curOp||a.display.selForContextMenu==a.doc.sel||(a.display.input.reset(),f&&setTimeout(function(){a.display.input.reset(!0)},20)),a.display.input.receivedFocus()),hb(a))}function $c(a){a.state.delayingBlurEvent||(a.state.focused&&(Lf(a,"blur",a),a.state.focused=!1,wg(a.display.wrapper,"CodeMirror-focused")),clearInterval(a.display.blinker),setTimeout(function(){a.state.focused||(a.display.shift=!1)},150))}function _c(a,b){sc(a.display,b)||ad(a,b)||a.display.input.onContextMenu(b)}function ad(a,b){return Rf(a,"gutterContextMenu")?Ac(a,b,"gutterContextMenu",!1,Lf):!1}function cd(a,b){if(pa(a,b.from)<0)return a;if(pa(a,b.to)<=0)return bd(b);var c=a.line+b.text.length-(b.to.line-b.from.line)-1,d=a.ch;return a.line==b.to.line&&(d+=bd(b).ch-b.to.ch),oa(c,d)}function dd(a,b){for(var c=[],d=0;d<a.sel.ranges.length;d++){var e=a.sel.ranges[d];c.push(new Ka(cd(e.anchor,b),cd(e.head,b)))}return La(c,a.sel.primIndex)}function ed(a,b,c){return a.line==b.line?oa(c.line,a.ch-b.ch+c.ch):oa(c.line+(a.line-b.line),a.ch)}function fd(a,b,c){for(var d=[],e=oa(a.first,0),f=e,g=0;g<b.length;g++){var h=b[g],i=ed(h.from,e,f),j=ed(bd(h),e,f);if(e=h.to,f=j,"around"==c){var k=a.sel.ranges[g],l=pa(k.head,k.anchor)<0;d[g]=new Ka(l?j:i,l?i:j)}else d[g]=new Ka(i,i)}return new Ja(d,a.sel.primIndex)}function gd(a,b,c){var d={canceled:!1,from:b.from,to:b.to,text:b.text,origin:b.origin,cancel:function(){this.canceled=!0}};return c&&(d.update=function(b,c,d,e){b&&(this.from=Oa(a,b)),c&&(this.to=Oa(a,c)),d&&(this.text=d),void 0!==e&&(this.origin=e)}),Lf(a,"beforeChange",a,d),a.cm&&Lf(a.cm,"beforeChange",a.cm,d),d.canceled?null:{from:d.from,to:d.to,text:d.text,origin:d.origin}}function hd(a,b,c){if(a.cm){if(!a.cm.curOp)return dc(a.cm,hd)(a,b,c);if(a.cm.state.suppressEdits)return}if(!(Rf(a,"beforeChange")||a.cm&&Rf(a.cm,"beforeChange"))||(b=gd(a,b,!0))){var d=t&&!c&&ie(a,b.from,b.to);if(d)for(var e=d.length-1;e>=0;--e)id(a,{from:d[e].from,to:d[e].to,text:e?[""]:b.text});else id(a,b)}}function id(a,b){if(1!=b.text.length||""!=b.text[0]||0!=pa(b.from,b.to)){var c=dd(a,b);sf(a,b,c,a.cm?a.cm.curOp.id:NaN),ld(a,b,c,fe(a,b));var d=[];df(a,function(a,c){c||-1!=dg(d,a.history)||(Cf(a.history,b),d.push(a.history)),ld(a,b,null,fe(a,b))})}}function jd(a,b,c){if(!a.cm||!a.cm.state.suppressEdits){for(var e,d=a.history,f=a.sel,g="undo"==b?d.done:d.undone,h="undo"==b?d.undone:d.done,i=0;i<g.length&&(e=g[i],c?!e.ranges||e.equals(a.sel):e.ranges);i++);if(i!=g.length){for(d.lastOrigin=d.lastSelOrigin=null;e=g.pop(),e.ranges;){if(vf(e,h),c&&!e.equals(a.sel))return void Za(a,e,{clearRedo:!1});f=e}var j=[];vf(f,h),h.push({changes:j,generation:d.generation}),d.generation=e.generation||++d.maxGeneration;for(var k=Rf(a,"beforeChange")||a.cm&&Rf(a.cm,"beforeChange"),i=e.changes.length-1;i>=0;--i){var l=e.changes[i];if(l.origin=b,k&&!gd(a,l,!1))return void(g.length=0);j.push(pf(a,l));var m=i?dd(a,l):bg(g);ld(a,l,m,he(a,l)),!i&&a.cm&&a.cm.scrollIntoView({from:l.from,to:bd(l)});var n=[];df(a,function(a,b){b||-1!=dg(n,a.history)||(Cf(a.history,l),n.push(a.history)),ld(a,l,null,he(a,l))})}}}}function kd(a,b){if(0!=b&&(a.first+=b,a.sel=new Ja(eg(a.sel.ranges,function(a){return new Ka(oa(a.anchor.line+b,a.anchor.ch),oa(a.head.line+b,a.head.ch))}),a.sel.primIndex),a.cm)){ic(a.cm,a.first,a.first-b,b);for(var c=a.cm.display,d=c.viewFrom;d<c.viewTo;d++)jc(a.cm,d,"gutter")}}function ld(a,b,c,d){if(a.cm&&!a.cm.curOp)return dc(a.cm,ld)(a,b,c,d);if(b.to.line<a.first)return void kd(a,b.text.length-1-(b.to.line-b.from.line));if(!(b.from.line>a.lastLine())){if(b.from.line<a.first){var e=b.text.length-1-(a.first-b.from.line);kd(a,e),b={from:oa(a.first,0),to:oa(b.to.line+e,b.to.ch),text:[bg(b.text)],origin:b.origin}}var f=a.lastLine();b.to.line>f&&(b={from:b.from,to:oa(f,ff(a,f).text.length),text:[b.text[0]],origin:b.origin}),b.removed=gf(a,b.from,b.to),c||(c=dd(a,b)),a.cm?md(a.cm,b,d):Ye(a,b,d),$a(a,c,Vf)}}function md(a,b,c){var d=a.doc,e=a.display,f=b.from,g=b.to,h=!1,i=f.line;a.options.lineWrapping||(i=kf(se(ff(d,f.line))),d.iter(i,g.line+1,function(a){return a==e.maxLine?(h=!0,!0):void 0})),d.sel.contains(b.from,b.to)>-1&&Qf(a),Ye(d,b,c,A(a)),a.options.lineWrapping||(d.iter(i,f.line+b.text.length,function(a){var b=G(a);b>e.maxLineLength&&(e.maxLine=a,e.maxLineLength=b,e.maxLineChanged=!0,h=!1)}),h&&(a.curOp.updateMaxLine=!0)),d.frontier=Math.min(d.frontier,f.line),ib(a,400);var j=b.text.length-(g.line-f.line)-1;b.full?ic(a):f.line!=g.line||1!=b.text.length||Xe(a.doc,b)?ic(a,f.line,g.line+1,j):jc(a,f.line,"text");var k=Rf(a,"changes"),l=Rf(a,"change");if(l||k){var m={from:f,to:g,text:b.text,removed:b.removed,origin:b.origin};l&&Nf(a,"change",a,m),k&&(a.curOp.changeObjs||(a.curOp.changeObjs=[])).push(m)}a.display.selForContextMenu=null}function nd(a,b,c,d,e){if(d||(d=c),pa(d,c)<0){var f=d;d=c,c=f}"string"==typeof b&&(b=a.splitLines(b)),hd(a,{from:c,to:d,text:b,origin:e})}function od(a,b){if(!Pf(a,"scrollCursorIntoView")){var c=a.display,d=c.sizer.getBoundingClientRect(),e=null;if(b.top+d.top<0?e=!0:b.bottom+d.top>(window.innerHeight||document.documentElement.clientHeight)&&(e=!1),null!=e&&!l){var f=pg("div","\u200b",null,"position: absolute; top: "+(b.top-c.viewOffset-mb(a.display))+"px; height: "+(b.bottom-b.top+pb(a)+c.barHeight)+"px; left: "+b.left+"px; width: 2px;");a.display.lineSpace.appendChild(f),f.scrollIntoView(e),a.display.lineSpace.removeChild(f)}}}function pd(a,b,c,d){null==d&&(d=0);for(var e=0;5>e;e++){var f=!1,g=Lb(a,b),h=c&&c!=b?Lb(a,c):g,i=rd(a,Math.min(g.left,h.left),Math.min(g.top,h.top)-d,Math.max(g.left,h.left),Math.max(g.bottom,h.bottom)+d),j=a.doc.scrollTop,k=a.doc.scrollLeft;if(null!=i.scrollTop&&(Hc(a,i.scrollTop),Math.abs(a.doc.scrollTop-j)>1&&(f=!0)),null!=i.scrollLeft&&(Ic(a,i.scrollLeft),Math.abs(a.doc.scrollLeft-k)>1&&(f=!0)),!f)break}return g}function qd(a,b,c,d,e){var f=rd(a,b,c,d,e);null!=f.scrollTop&&Hc(a,f.scrollTop),null!=f.scrollLeft&&Ic(a,f.scrollLeft)}function rd(a,b,c,d,e){var f=a.display,g=Rb(a.display);0>c&&(c=0);var h=a.curOp&&null!=a.curOp.scrollTop?a.curOp.scrollTop:f.scroller.scrollTop,i=rb(a),j={};e-c>i&&(e=c+i);var k=a.doc.height+nb(f),l=g>c,m=e>k-g;if(h>c)j.scrollTop=l?0:c;else if(e>h+i){var n=Math.min(c,(m?k:e)-i);n!=h&&(j.scrollTop=n)}var o=a.curOp&&null!=a.curOp.scrollLeft?a.curOp.scrollLeft:f.scroller.scrollLeft,p=qb(a)-(a.options.fixedGutter?f.gutters.offsetWidth:0),q=d-b>p;return q&&(d=b+p),10>b?j.scrollLeft=0:o>b?j.scrollLeft=Math.max(0,b-(q?0:10)):d>p+o-3&&(j.scrollLeft=d+(q?0:10)-p),j}function sd(a,b,c){(null!=b||null!=c)&&ud(a),null!=b&&(a.curOp.scrollLeft=(null==a.curOp.scrollLeft?a.doc.scrollLeft:a.curOp.scrollLeft)+b),null!=c&&(a.curOp.scrollTop=(null==a.curOp.scrollTop?a.doc.scrollTop:a.curOp.scrollTop)+c)}function td(a){ud(a);var b=a.getCursor(),c=b,d=b;a.options.lineWrapping||(c=b.ch?oa(b.line,b.ch-1):b,d=oa(b.line,b.ch+1)),a.curOp.scrollToPos={from:c,to:d,margin:a.options.cursorScrollMargin,isCursor:!0}}function ud(a){var b=a.curOp.scrollToPos;if(b){a.curOp.scrollToPos=null;var c=Mb(a,b.from),d=Mb(a,b.to),e=rd(a,Math.min(c.left,d.left),Math.min(c.top,d.top)-b.margin,Math.max(c.right,d.right),Math.max(c.bottom,d.bottom)+b.margin);a.scrollTo(e.scrollLeft,e.scrollTop)}}function vd(a,b,c,d){var f,e=a.doc;null==c&&(c="add"),"smart"==c&&(e.mode.indent?f=lb(a,b):c="prev");var g=a.options.tabSize,h=ff(e,b),i=Zf(h.text,null,g);h.stateAfter&&(h.stateAfter=null);var k,j=h.text.match(/^\s*/)[0];if(d||/\S/.test(h.text)){if("smart"==c&&(k=e.mode.indent(f,h.text.slice(j.length),h.text),k==Uf||k>150)){if(!d)return;c="prev"}}else k=0,c="not";"prev"==c?k=b>e.first?Zf(ff(e,b-1).text,null,g):0:"add"==c?k=i+a.options.indentUnit:"subtract"==c?k=i-a.options.indentUnit:"number"==typeof c&&(k=i+c),k=Math.max(0,k);
-var l="",m=0;if(a.options.indentWithTabs)for(var n=Math.floor(k/g);n;--n)m+=g,l+="	";if(k>m&&(l+=ag(k-m)),l!=j)return nd(e,l,oa(b,0),oa(b,j.length),"+input"),h.stateAfter=null,!0;for(var n=0;n<e.sel.ranges.length;n++){var o=e.sel.ranges[n];if(o.head.line==b&&o.head.ch<j.length){var m=oa(b,j.length);Va(e,n,new Ka(m,m));break}}}function wd(a,b,c,d){var e=b,f=b;return"number"==typeof b?f=ff(a,Na(a,b)):e=kf(b),null==e?null:(d(f,e)&&a.cm&&jc(a.cm,e,c),f)}function xd(a,b){for(var c=a.doc.sel.ranges,d=[],e=0;e<c.length;e++){for(var f=b(c[e]);d.length&&pa(f.from,bg(d).to)<=0;){var g=d.pop();if(pa(g.from,f.from)<0){f.from=g.from;break}}d.push(f)}cc(a,function(){for(var b=d.length-1;b>=0;b--)nd(a.doc,"",d[b].from,d[b].to,"+delete");td(a)})}function yd(a,b,c,d,e){function k(){var b=f+c;return b<a.first||b>=a.first+a.size?j=!1:(f=b,i=ff(a,b))}function l(a){var b=(e?$g:_g)(i,g,c,!0);if(null==b){if(a||!k())return j=!1;g=e?(0>c?Sg:Rg)(i):0>c?i.text.length:0}else g=b;return!0}var f=b.line,g=b.ch,h=c,i=ff(a,f),j=!0;if("char"==d)l();else if("column"==d)l(!0);else if("word"==d||"group"==d)for(var m=null,n="group"==d,o=a.cm&&a.cm.getHelper(b,"wordChars"),p=!0;!(0>c)||l(!p);p=!1){var q=i.text.charAt(g)||"\n",r=lg(q,o)?"w":n&&"\n"==q?"n":!n||/\s/.test(q)?null:"p";if(!n||p||r||(r="s"),m&&m!=r){0>c&&(c=1,l());break}if(r&&(m=r),c>0&&!l(!p))break}var s=cb(a,oa(f,g),h,!0);return j||(s.hitSide=!0),s}function zd(a,b,c,d){var g,e=a.doc,f=b.left;if("page"==d){var h=Math.min(a.display.wrapper.clientHeight,window.innerHeight||document.documentElement.clientHeight);g=b.top+c*(h-(0>c?1.5:.5)*Rb(a.display))}else"line"==d&&(g=c>0?b.bottom+3:b.top-3);for(;;){var i=Ob(a,f,g);if(!i.outside)break;if(0>c?0>=g:g>=e.height){i.hitSide=!0;break}g+=5*c}return i}function Cd(a,b,c,d){v.defaults[a]=b,c&&(Bd[a]=d?function(a,b,d){d!=Dd&&c(a,b,d)}:c)}function Nd(a){for(var c,d,e,f,b=a.split(/-(?!$)/),a=b[b.length-1],g=0;g<b.length-1;g++){var h=b[g];if(/^(cmd|meta|m)$/i.test(h))f=!0;else if(/^a(lt)?$/i.test(h))c=!0;else if(/^(c|ctrl|control)$/i.test(h))d=!0;else{if(!/^s(hift)$/i.test(h))throw new Error("Unrecognized modifier name: "+h);e=!0}}return c&&(a="Alt-"+a),d&&(a="Ctrl-"+a),f&&(a="Cmd-"+a),e&&(a="Shift-"+a),a}function Rd(a){return"string"==typeof a?Md[a]:a}function Vd(a,b,c,d,e){if(d&&d.shared)return Xd(a,b,c,d,e);if(a.cm&&!a.cm.curOp)return dc(a.cm,Vd)(a,b,c,d,e);var f=new Ud(a,e),g=pa(b,c);if(d&&hg(d,f,!1),g>0||0==g&&f.clearWhenEmpty!==!1)return f;if(f.replacedWith&&(f.collapsed=!0,f.widgetNode=pg("span",[f.replacedWith],"CodeMirror-widget"),d.handleMouseEvents||f.widgetNode.setAttribute("cm-ignore-events","true"),d.insertLeft&&(f.widgetNode.insertLeft=!0)),f.collapsed){if(re(a,b.line,b,c,f)||b.line!=c.line&&re(a,c.line,b,c,f))throw new Error("Inserting collapsed marker partially overlapping an existing one");u=!0}f.addToHistory&&sf(a,{from:b,to:c,origin:"markText"},a.sel,NaN);var j,h=b.line,i=a.cm;if(a.iter(h,c.line+1,function(a){i&&f.collapsed&&!i.options.lineWrapping&&se(a)==i.display.maxLine&&(j=!0),f.collapsed&&h!=b.line&&jf(a,0),ce(a,new _d(f,h==b.line?b.ch:null,h==c.line?c.ch:null)),++h}),f.collapsed&&a.iter(b.line,c.line+1,function(b){we(a,b)&&jf(b,0)}),f.clearOnEnter&&Jf(f,"beforeCursorEnter",function(){f.clear()}),f.readOnly&&(t=!0,(a.history.done.length||a.history.undone.length)&&a.clearHistory()),f.collapsed&&(f.id=++Td,f.atomic=!0),i){if(j&&(i.curOp.updateMaxLine=!0),f.collapsed)ic(i,b.line,c.line+1);else if(f.className||f.title||f.startStyle||f.endStyle||f.css)for(var k=b.line;k<=c.line;k++)jc(i,k,"text");f.atomic&&ab(i.doc),Nf(i,"markerAdded",i,f)}return f}function Xd(a,b,c,d,e){d=hg(d),d.shared=!1;var f=[Vd(a,b,c,d,e)],g=f[0],h=d.widgetNode;return df(a,function(a){h&&(d.widgetNode=h.cloneNode(!0)),f.push(Vd(a,Oa(a,b),Oa(a,c),d,e));for(var i=0;i<a.linked.length;++i)if(a.linked[i].isParent)return;g=bg(f)}),new Wd(f,g)}function Yd(a){return a.findMarks(oa(a.first,0),a.clipPos(oa(a.lastLine())),function(a){return a.parent})}function Zd(a,b){for(var c=0;c<b.length;c++){var d=b[c],e=d.find(),f=a.clipPos(e.from),g=a.clipPos(e.to);if(pa(f,g)){var h=Vd(a,f,g,d.primary,d.primary.type);d.markers.push(h),h.parent=d}}}function $d(a){for(var b=0;b<a.length;b++){var c=a[b],d=[c.primary.doc];df(c.primary.doc,function(a){d.push(a)});for(var e=0;e<c.markers.length;e++){var f=c.markers[e];-1==dg(d,f.doc)&&(f.parent=null,c.markers.splice(e--,1))}}}function _d(a,b,c){this.marker=a,this.from=b,this.to=c}function ae(a,b){if(a)for(var c=0;c<a.length;++c){var d=a[c];if(d.marker==b)return d}}function be(a,b){for(var c,d=0;d<a.length;++d)a[d]!=b&&(c||(c=[])).push(a[d]);return c}function ce(a,b){a.markedSpans=a.markedSpans?a.markedSpans.concat([b]):[b],b.marker.attachLine(a)}function de(a,b,c){if(a)for(var e,d=0;d<a.length;++d){var f=a[d],g=f.marker,h=null==f.from||(g.inclusiveLeft?f.from<=b:f.from<b);if(h||f.from==b&&"bookmark"==g.type&&(!c||!f.marker.insertLeft)){var i=null==f.to||(g.inclusiveRight?f.to>=b:f.to>b);(e||(e=[])).push(new _d(g,f.from,i?null:f.to))}}return e}function ee(a,b,c){if(a)for(var e,d=0;d<a.length;++d){var f=a[d],g=f.marker,h=null==f.to||(g.inclusiveRight?f.to>=b:f.to>b);if(h||f.from==b&&"bookmark"==g.type&&(!c||f.marker.insertLeft)){var i=null==f.from||(g.inclusiveLeft?f.from<=b:f.from<b);(e||(e=[])).push(new _d(g,i?null:f.from-b,null==f.to?null:f.to-b))}}return e}function fe(a,b){if(b.full)return null;var c=Qa(a,b.from.line)&&ff(a,b.from.line).markedSpans,d=Qa(a,b.to.line)&&ff(a,b.to.line).markedSpans;if(!c&&!d)return null;var e=b.from.ch,f=b.to.ch,g=0==pa(b.from,b.to),h=de(c,e,g),i=ee(d,f,g),j=1==b.text.length,k=bg(b.text).length+(j?e:0);if(h)for(var l=0;l<h.length;++l){var m=h[l];if(null==m.to){var n=ae(i,m.marker);n?j&&(m.to=null==n.to?null:n.to+k):m.to=e}}if(i)for(var l=0;l<i.length;++l){var m=i[l];if(null!=m.to&&(m.to+=k),null==m.from){var n=ae(h,m.marker);n||(m.from=k,j&&(h||(h=[])).push(m))}else m.from+=k,j&&(h||(h=[])).push(m)}h&&(h=ge(h)),i&&i!=h&&(i=ge(i));var o=[h];if(!j){var q,p=b.text.length-2;if(p>0&&h)for(var l=0;l<h.length;++l)null==h[l].to&&(q||(q=[])).push(new _d(h[l].marker,null,null));for(var l=0;p>l;++l)o.push(q);o.push(i)}return o}function ge(a){for(var b=0;b<a.length;++b){var c=a[b];null!=c.from&&c.from==c.to&&c.marker.clearWhenEmpty!==!1&&a.splice(b--,1)}return a.length?a:null}function he(a,b){var c=yf(a,b),d=fe(a,b);if(!c)return d;if(!d)return c;for(var e=0;e<c.length;++e){var f=c[e],g=d[e];if(f&&g)a:for(var h=0;h<g.length;++h){for(var i=g[h],j=0;j<f.length;++j)if(f[j].marker==i.marker)continue a;f.push(i)}else g&&(c[e]=g)}return c}function ie(a,b,c){var d=null;if(a.iter(b.line,c.line+1,function(a){if(a.markedSpans)for(var b=0;b<a.markedSpans.length;++b){var c=a.markedSpans[b].marker;!c.readOnly||d&&-1!=dg(d,c)||(d||(d=[])).push(c)}}),!d)return null;for(var e=[{from:b,to:c}],f=0;f<d.length;++f)for(var g=d[f],h=g.find(0),i=0;i<e.length;++i){var j=e[i];if(!(pa(j.to,h.from)<0||pa(j.from,h.to)>0)){var k=[i,1],l=pa(j.from,h.from),m=pa(j.to,h.to);(0>l||!g.inclusiveLeft&&!l)&&k.push({from:j.from,to:h.from}),(m>0||!g.inclusiveRight&&!m)&&k.push({from:h.to,to:j.to}),e.splice.apply(e,k),i+=k.length-1}}return e}function je(a){var b=a.markedSpans;if(b){for(var c=0;c<b.length;++c)b[c].marker.detachLine(a);a.markedSpans=null}}function ke(a,b){if(b){for(var c=0;c<b.length;++c)b[c].marker.attachLine(a);a.markedSpans=b}}function le(a){return a.inclusiveLeft?-1:0}function me(a){return a.inclusiveRight?1:0}function ne(a,b){var c=a.lines.length-b.lines.length;if(0!=c)return c;var d=a.find(),e=b.find(),f=pa(d.from,e.from)||le(a)-le(b);if(f)return-f;var g=pa(d.to,e.to)||me(a)-me(b);return g?g:b.id-a.id}function oe(a,b){var d,c=u&&a.markedSpans;if(c)for(var e,f=0;f<c.length;++f)e=c[f],e.marker.collapsed&&null==(b?e.from:e.to)&&(!d||ne(d,e.marker)<0)&&(d=e.marker);return d}function pe(a){return oe(a,!0)}function qe(a){return oe(a,!1)}function re(a,b,c,d,e){var f=ff(a,b),g=u&&f.markedSpans;if(g)for(var h=0;h<g.length;++h){var i=g[h];if(i.marker.collapsed){var j=i.marker.find(0),k=pa(j.from,c)||le(i.marker)-le(e),l=pa(j.to,d)||me(i.marker)-me(e);if(!(k>=0&&0>=l||0>=k&&l>=0)&&(0>=k&&(pa(j.to,c)>0||i.marker.inclusiveRight&&e.inclusiveLeft)||k>=0&&(pa(j.from,d)<0||i.marker.inclusiveLeft&&e.inclusiveRight)))return!0}}}function se(a){for(var b;b=pe(a);)a=b.find(-1,!0).line;return a}function te(a){for(var b,c;b=qe(a);)a=b.find(1,!0).line,(c||(c=[])).push(a);return c}function ue(a,b){var c=ff(a,b),d=se(c);return c==d?b:kf(d)}function ve(a,b){if(b>a.lastLine())return b;var d,c=ff(a,b);if(!we(a,c))return b;for(;d=qe(c);)c=d.find(1,!0).line;return kf(c)+1}function we(a,b){var c=u&&b.markedSpans;if(c)for(var d,e=0;e<c.length;++e)if(d=c[e],d.marker.collapsed){if(null==d.from)return!0;if(!d.marker.widgetNode&&0==d.from&&d.marker.inclusiveLeft&&xe(a,b,d))return!0}}function xe(a,b,c){if(null==c.to){var d=c.marker.find(1,!0);return xe(a,d.line,ae(d.line.markedSpans,c.marker))}if(c.marker.inclusiveRight&&c.to==b.text.length)return!0;for(var e,f=0;f<b.markedSpans.length;++f)if(e=b.markedSpans[f],e.marker.collapsed&&!e.marker.widgetNode&&e.from==c.to&&(null==e.to||e.to!=c.from)&&(e.marker.inclusiveLeft||c.marker.inclusiveRight)&&xe(a,b,e))return!0}function ze(a,b,c){mf(b)<(a.curOp&&a.curOp.scrollTop||a.doc.scrollTop)&&sd(a,null,c)}function Ae(a){if(null!=a.height)return a.height;var b=a.doc.cm;if(!b)return 0;if(!tg(document.body,a.node)){var c="position: relative;";a.coverGutter&&(c+="margin-left: -"+b.display.gutters.offsetWidth+"px;"),a.noHScroll&&(c+="width: "+b.display.wrapper.clientWidth+"px;"),sg(b.display.measure,pg("div",[a.node],null,c))}return a.height=a.node.offsetHeight}function Be(a,b,c,d){var e=new ye(a,c,d),f=a.cm;return f&&e.noHScroll&&(f.display.alignWidgets=!0),wd(a,b,"widget",function(b){var c=b.widgets||(b.widgets=[]);if(null==e.insertAt?c.push(e):c.splice(Math.min(c.length-1,Math.max(0,e.insertAt)),0,e),e.line=b,f&&!we(a,b)){var d=mf(b)<a.scrollTop;jf(b,b.height+Ae(e)),d&&sd(f,null,e.height),f.curOp.forceUpdate=!0}return!0}),e}function De(a,b,c,d){a.text=b,a.stateAfter&&(a.stateAfter=null),a.styles&&(a.styles=null),null!=a.order&&(a.order=null),je(a),ke(a,c);var e=d?d(a):1;e!=a.height&&jf(a,e)}function Ee(a){a.parent=null,je(a)}function Fe(a,b){if(a)for(;;){var c=a.match(/(?:^|\s+)line-(background-)?(\S+)/);if(!c)break;a=a.slice(0,c.index)+a.slice(c.index+c[0].length);var d=c[1]?"bgClass":"textClass";null==b[d]?b[d]=c[2]:new RegExp("(?:^|s)"+c[2]+"(?:$|s)").test(b[d])||(b[d]+=" "+c[2])}return a}function Ge(a,b){if(a.blankLine)return a.blankLine(b);if(a.innerMode){var c=v.innerMode(a,b);return c.mode.blankLine?c.mode.blankLine(c.state):void 0}}function He(a,b,c,d){for(var e=0;10>e;e++){d&&(d[0]=v.innerMode(a,c).mode);var f=a.token(b,c);if(b.pos>b.start)return f}throw new Error("Mode "+a.name+" failed to advance stream.")}function Ie(a,b,c,d){function e(a){return{start:k.start,end:k.pos,string:k.current(),type:h||null,state:a?Jd(f.mode,j):j}}var h,f=a.doc,g=f.mode;b=Oa(f,b);var l,i=ff(f,b.line),j=lb(a,b.line,c),k=new Sd(i.text,a.options.tabSize);for(d&&(l=[]);(d||k.pos<b.ch)&&!k.eol();)k.start=k.pos,h=He(g,k,j),d&&l.push(e(!0));return d?l:e()}function Je(a,b,c,d,e,f,g){var h=c.flattenSpans;null==h&&(h=a.options.flattenSpans);var l,i=0,j=null,k=new Sd(b,a.options.tabSize),m=a.options.addModeClass&&[null];for(""==b&&Fe(Ge(c,d),f);!k.eol();){if(k.pos>a.options.maxHighlightLength?(h=!1,g&&Me(a,b,d,k.pos),k.pos=b.length,l=null):l=Fe(He(c,k,d,m),f),m){var n=m[0].name;n&&(l="m-"+(l?n+" "+l:n))}if(!h||j!=l){for(;i<k.start;)i=Math.min(k.start,i+5e4),e(i,j);j=l}k.start=k.pos}for(;i<k.pos;){var o=Math.min(k.pos,i+5e4);e(o,j),i=o}}function Ke(a,b,c,d){var e=[a.state.modeGen],f={};Je(a,b.text,a.doc.mode,c,function(a,b){e.push(a,b)},f,d);for(var g=0;g<a.state.overlays.length;++g){var h=a.state.overlays[g],i=1,j=0;Je(a,b.text,h.mode,!0,function(a,b){for(var c=i;a>j;){var d=e[i];d>a&&e.splice(i,1,a,e[i+1],d),i+=2,j=Math.min(a,d)}if(b)if(h.opaque)e.splice(c,i-c,a,"cm-overlay "+b),i=c+2;else for(;i>c;c+=2){var f=e[c+1];e[c+1]=(f?f+" ":"")+"cm-overlay "+b}},f)}return{styles:e,classes:f.bgClass||f.textClass?f:null}}function Le(a,b,c){if(!b.styles||b.styles[0]!=a.state.modeGen){var d=lb(a,kf(b)),e=Ke(a,b,b.text.length>a.options.maxHighlightLength?Jd(a.doc.mode,d):d);b.stateAfter=d,b.styles=e.styles,e.classes?b.styleClasses=e.classes:b.styleClasses&&(b.styleClasses=null),c===a.doc.frontier&&a.doc.frontier++}return b.styles}function Me(a,b,c,d){var e=a.doc.mode,f=new Sd(b,a.options.tabSize);for(f.start=f.pos=d||0,""==b&&Ge(e,c);!f.eol();)He(e,f,c),f.start=f.pos}function Pe(a,b){if(!a||/^\s*$/.test(a))return null;var c=b.addModeClass?Oe:Ne;return c[a]||(c[a]=a.replace(/\S+/g,"cm-$&"))}function Qe(a,b){var c=pg("span",null,null,f?"padding-right: .1px":null),e={pre:pg("pre",[c],"CodeMirror-line"),content:c,col:0,pos:0,cm:a,splitSpaces:(d||f)&&a.getOption("lineWrapping")};b.measure={};for(var g=0;g<=(b.rest?b.rest.length:0);g++){var i,h=g?b.rest[g-1]:b.line;e.pos=0,e.addToken=Se,Hg(a.display.measure)&&(i=nf(h))&&(e.addToken=Ue(e.addToken,i)),e.map=[];var j=b!=a.display.externalMeasured&&kf(h);We(h,e,Le(a,h,j)),h.styleClasses&&(h.styleClasses.bgClass&&(e.bgClass=yg(h.styleClasses.bgClass,e.bgClass||"")),h.styleClasses.textClass&&(e.textClass=yg(h.styleClasses.textClass,e.textClass||""))),0==e.map.length&&e.map.push(0,0,e.content.appendChild(Fg(a.display.measure))),0==g?(b.measure.map=e.map,b.measure.cache={}):((b.measure.maps||(b.measure.maps=[])).push(e.map),(b.measure.caches||(b.measure.caches=[])).push({}))}return f&&/\bcm-tab\b/.test(e.content.lastChild.className)&&(e.content.className="cm-tab-wrap-hack"),Lf(a,"renderLine",a,b.line,e.pre),e.pre.className&&(e.textClass=yg(e.pre.className,e.textClass||"")),e}function Re(a){var b=pg("span","\u2022","cm-invalidchar");return b.title="\\u"+a.charCodeAt(0).toString(16),b.setAttribute("aria-label",b.title),b}function Se(a,b,c,f,g,h,i){if(b){var j=a.splitSpaces?b.replace(/ {3,}/g,Te):b,k=a.cm.state.specialChars,l=!1;if(k.test(b))for(var m=document.createDocumentFragment(),n=0;;){k.lastIndex=n;var o=k.exec(b),p=o?o.index-n:b.length-n;if(p){var q=document.createTextNode(j.slice(n,n+p));d&&9>e?m.appendChild(pg("span",[q])):m.appendChild(q),a.map.push(a.pos,a.pos+p,q),a.col+=p,a.pos+=p}if(!o)break;if(n+=p+1,"	"==o[0]){var r=a.cm.options.tabSize,s=r-a.col%r,q=m.appendChild(pg("span",ag(s),"cm-tab"));q.setAttribute("role","presentation"),q.setAttribute("cm-text","	"),a.col+=s}else if("\r"==o[0]||"\n"==o[0]){var q=m.appendChild(pg("span","\r"==o[0]?"\u240d":"\u2424","cm-invalidchar"));q.setAttribute("cm-text",o[0]),a.col+=1}else{var q=a.cm.options.specialCharPlaceholder(o[0]);q.setAttribute("cm-text",o[0]),d&&9>e?m.appendChild(pg("span",[q])):m.appendChild(q),a.col+=1}a.map.push(a.pos,a.pos+1,q),a.pos++}else{a.col+=b.length;var m=document.createTextNode(j);a.map.push(a.pos,a.pos+b.length,m),d&&9>e&&(l=!0),a.pos+=b.length}if(c||f||g||l||i){var t=c||"";f&&(t+=f),g&&(t+=g);var u=pg("span",[m],t,i);return h&&(u.title=h),a.content.appendChild(u)}a.content.appendChild(m)}}function Te(a){for(var b=" ",c=0;c<a.length-2;++c)b+=c%2?" ":"\xa0";return b+=" "}function Ue(a,b){return function(c,d,e,f,g,h,i){e=e?e+" cm-force-border":"cm-force-border";for(var j=c.pos,k=j+d.length;;){for(var l=0;l<b.length;l++){var m=b[l];if(m.to>j&&m.from<=j)break}if(m.to>=k)return a(c,d,e,f,g,h,i);a(c,d.slice(0,m.to-j),e,f,null,h,i),f=null,d=d.slice(m.to-j),j=m.to}}}function Ve(a,b,c,d){var e=!d&&c.widgetNode;e&&a.map.push(a.pos,a.pos+b,e),!d&&a.cm.display.input.needsContentAttribute&&(e||(e=a.content.appendChild(document.createElement("span"))),e.setAttribute("cm-marker",c.id)),e&&(a.cm.display.input.setUneditable(e),a.content.appendChild(e)),a.pos+=b}function We(a,b,c){var d=a.markedSpans,e=a.text,f=0;if(d)for(var k,l,n,o,p,q,r,h=e.length,i=0,g=1,j="",m=0;;){if(m==i){n=o=p=q=l="",r=null,m=1/0;for(var s=[],t=0;t<d.length;++t){var u=d[t],v=u.marker;"bookmark"==v.type&&u.from==i&&v.widgetNode?s.push(v):u.from<=i&&(null==u.to||u.to>i||v.collapsed&&u.to==i&&u.from==i)?(null!=u.to&&u.to!=i&&m>u.to&&(m=u.to,o=""),v.className&&(n+=" "+v.className),v.css&&(l=v.css),v.startStyle&&u.from==i&&(p+=" "+v.startStyle),v.endStyle&&u.to==m&&(o+=" "+v.endStyle),v.title&&!q&&(q=v.title),v.collapsed&&(!r||ne(r.marker,v)<0)&&(r=u)):u.from>i&&m>u.from&&(m=u.from)}if(r&&(r.from||0)==i){if(Ve(b,(null==r.to?h+1:r.to)-i,r.marker,null==r.from),null==r.to)return;r.to==i&&(r=!1)}if(!r&&s.length)for(var t=0;t<s.length;++t)Ve(b,0,s[t])}if(i>=h)break;for(var w=Math.min(h,m);;){if(j){var x=i+j.length;if(!r){var y=x>w?j.slice(0,w-i):j;b.addToken(b,y,k?k+n:n,p,i+y.length==m?o:"",q,l)}if(x>=w){j=j.slice(w-i),i=w;break}i=x,p=""}j=e.slice(f,f=c[g++]),k=Pe(c[g++],b.cm.options)}}else for(var g=1;g<c.length;g+=2)b.addToken(b,e.slice(f,f=c[g]),Pe(c[g+1],b.cm.options))}function Xe(a,b){return 0==b.from.ch&&0==b.to.ch&&""==bg(b.text)&&(!a.cm||a.cm.options.wholeLineUpdateBefore)}function Ye(a,b,c,d){function e(a){return c?c[a]:null}function f(a,c,e){De(a,c,e,d),Nf(a,"change",a,b)}function g(a,b){for(var c=a,f=[];b>c;++c)f.push(new Ce(j[c],e(c),d));return f}var h=b.from,i=b.to,j=b.text,k=ff(a,h.line),l=ff(a,i.line),m=bg(j),n=e(j.length-1),o=i.line-h.line;if(b.full)a.insert(0,g(0,j.length)),a.remove(j.length,a.size-j.length);else if(Xe(a,b)){var p=g(0,j.length-1);f(l,l.text,n),o&&a.remove(h.line,o),p.length&&a.insert(h.line,p)}else if(k==l)if(1==j.length)f(k,k.text.slice(0,h.ch)+m+k.text.slice(i.ch),n);else{var p=g(1,j.length-1);p.push(new Ce(m+k.text.slice(i.ch),n,d)),f(k,k.text.slice(0,h.ch)+j[0],e(0)),a.insert(h.line+1,p)}else if(1==j.length)f(k,k.text.slice(0,h.ch)+j[0]+l.text.slice(i.ch),e(0)),a.remove(h.line+1,o);else{f(k,k.text.slice(0,h.ch)+j[0],e(0)),f(l,m+l.text.slice(i.ch),n);var p=g(1,j.length-1);o>1&&a.remove(h.line+1,o-1),a.insert(h.line+1,p)}Nf(a,"change",a,b)}function Ze(a){this.lines=a,this.parent=null;for(var b=0,c=0;b<a.length;++b)a[b].parent=this,c+=a[b].height;this.height=c}function $e(a){this.children=a;for(var b=0,c=0,d=0;d<a.length;++d){var e=a[d];b+=e.chunkSize(),c+=e.height,e.parent=this}this.size=b,this.height=c,this.parent=null}function df(a,b,c){function d(a,e,f){if(a.linked)for(var g=0;g<a.linked.length;++g){var h=a.linked[g];if(h.doc!=e){var i=f&&h.sharedHist;(!c||i)&&(b(h.doc,i),d(h.doc,a,i))}}}d(a,null,!0)}function ef(a,b){if(b.cm)throw new Error("This document is already in use.");a.doc=b,b.cm=a,B(a),x(a),a.options.lineWrapping||H(a),a.options.mode=b.modeOption,ic(a)}function ff(a,b){if(b-=a.first,0>b||b>=a.size)throw new Error("There is no line "+(b+a.first)+" in the document.");for(var c=a;!c.lines;)for(var d=0;;++d){var e=c.children[d],f=e.chunkSize();if(f>b){c=e;break}b-=f}return c.lines[b]}function gf(a,b,c){var d=[],e=b.line;return a.iter(b.line,c.line+1,function(a){var f=a.text;e==c.line&&(f=f.slice(0,c.ch)),e==b.line&&(f=f.slice(b.ch)),d.push(f),++e}),d}function hf(a,b,c){var d=[];return a.iter(b,c,function(a){d.push(a.text)}),d}function jf(a,b){var c=b-a.height;if(c)for(var d=a;d;d=d.parent)d.height+=c}function kf(a){if(null==a.parent)return null;for(var b=a.parent,c=dg(b.lines,a),d=b.parent;d;b=d,d=d.parent)for(var e=0;d.children[e]!=b;++e)c+=d.children[e].chunkSize();return c+b.first}function lf(a,b){var c=a.first;a:do{for(var d=0;d<a.children.length;++d){var e=a.children[d],f=e.height;if(f>b){a=e;continue a}b-=f,c+=e.chunkSize()}return c}while(!a.lines);for(var d=0;d<a.lines.length;++d){var g=a.lines[d],h=g.height;if(h>b)break;b-=h}return c+d}function mf(a){a=se(a);for(var b=0,c=a.parent,d=0;d<c.lines.length;++d){var e=c.lines[d];if(e==a)break;b+=e.height}for(var f=c.parent;f;c=f,f=c.parent)for(var d=0;d<f.children.length;++d){var g=f.children[d];if(g==c)break;b+=g.height}return b}function nf(a){var b=a.order;return null==b&&(b=a.order=ah(a.text)),b}function of(a){this.done=[],this.undone=[],this.undoDepth=1/0,this.lastModTime=this.lastSelTime=0,this.lastOp=this.lastSelOp=null,this.lastOrigin=this.lastSelOrigin=null,this.generation=this.maxGeneration=a||1}function pf(a,b){var c={from:qa(b.from),to:bd(b),text:gf(a,b.from,b.to)};return wf(a,c,b.from.line,b.to.line+1),df(a,function(a){wf(a,c,b.from.line,b.to.line+1)},!0),c}function qf(a){for(;a.length;){var b=bg(a);if(!b.ranges)break;a.pop()}}function rf(a,b){return b?(qf(a.done),bg(a.done)):a.done.length&&!bg(a.done).ranges?bg(a.done):a.done.length>1&&!a.done[a.done.length-2].ranges?(a.done.pop(),bg(a.done)):void 0}function sf(a,b,c,d){var e=a.history;e.undone.length=0;var g,f=+new Date;if((e.lastOp==d||e.lastOrigin==b.origin&&b.origin&&("+"==b.origin.charAt(0)&&a.cm&&e.lastModTime>f-a.cm.options.historyEventDelay||"*"==b.origin.charAt(0)))&&(g=rf(e,e.lastOp==d))){var h=bg(g.changes);0==pa(b.from,b.to)&&0==pa(b.from,h.to)?h.to=bd(b):g.changes.push(pf(a,b))}else{var i=bg(e.done);for(i&&i.ranges||vf(a.sel,e.done),g={changes:[pf(a,b)],generation:e.generation},e.done.push(g);e.done.length>e.undoDepth;)e.done.shift(),e.done[0].ranges||e.done.shift()}e.done.push(c),e.generation=++e.maxGeneration,e.lastModTime=e.lastSelTime=f,e.lastOp=e.lastSelOp=d,e.lastOrigin=e.lastSelOrigin=b.origin,h||Lf(a,"historyAdded")}function tf(a,b,c,d){var e=b.charAt(0);return"*"==e||"+"==e&&c.ranges.length==d.ranges.length&&c.somethingSelected()==d.somethingSelected()&&new Date-a.history.lastSelTime<=(a.cm?a.cm.options.historyEventDelay:500)}function uf(a,b,c,d){var e=a.history,f=d&&d.origin;c==e.lastSelOp||f&&e.lastSelOrigin==f&&(e.lastModTime==e.lastSelTime&&e.lastOrigin==f||tf(a,f,bg(e.done),b))?e.done[e.done.length-1]=b:vf(b,e.done),e.lastSelTime=+new Date,e.lastSelOrigin=f,e.lastSelOp=c,d&&d.clearRedo!==!1&&qf(e.undone)}function vf(a,b){var c=bg(b);c&&c.ranges&&c.equals(a)||b.push(a)}function wf(a,b,c,d){var e=b["spans_"+a.id],f=0;a.iter(Math.max(a.first,c),Math.min(a.first+a.size,d),function(c){c.markedSpans&&((e||(e=b["spans_"+a.id]={}))[f]=c.markedSpans),++f})}function xf(a){if(!a)return null;for(var c,b=0;b<a.length;++b)a[b].marker.explicitlyCleared?c||(c=a.slice(0,b)):c&&c.push(a[b]);return c?c.length?c:null:a}function yf(a,b){var c=b["spans_"+a.id];if(!c)return null;for(var d=0,e=[];d<b.text.length;++d)e.push(xf(c[d]));return e}function zf(a,b,c){for(var d=0,e=[];d<a.length;++d){var f=a[d];if(f.ranges)e.push(c?Ja.prototype.deepCopy.call(f):f);else{var g=f.changes,h=[];e.push({changes:h});for(var i=0;i<g.length;++i){var k,j=g[i];if(h.push({from:j.from,to:j.to,text:j.text}),b)for(var l in j)(k=l.match(/^spans_(\d+)$/))&&dg(b,Number(k[1]))>-1&&(bg(h)[l]=j[l],delete j[l])}}}return e}function Af(a,b,c,d){c<a.line?a.line+=d:b<a.line&&(a.line=b,a.ch=0)}function Bf(a,b,c,d){for(var e=0;e<a.length;++e){var f=a[e],g=!0;if(f.ranges){f.copied||(f=a[e]=f.deepCopy(),f.copied=!0);for(var h=0;h<f.ranges.length;h++)Af(f.ranges[h].anchor,b,c,d),Af(f.ranges[h].head,b,c,d)}else{for(var h=0;h<f.changes.length;++h){var i=f.changes[h];if(c<i.from.line)i.from=oa(i.from.line+d,i.from.ch),i.to=oa(i.to.line+d,i.to.ch);else if(b<=i.to.line){g=!1;break}}g||(a.splice(0,e+1),e=0)}}}function Cf(a,b){var c=b.from.line,d=b.to.line,e=b.text.length-(d-c)-1;Bf(a.done,c,d,e),Bf(a.undone,c,d,e)}function Ff(a){return null!=a.defaultPrevented?a.defaultPrevented:0==a.returnValue}function Hf(a){return a.target||a.srcElement}function If(a){var b=a.which;return null==b&&(1&a.button?b=1:2&a.button?b=3:4&a.button&&(b=2)),o&&a.ctrlKey&&1==b&&(b=3),b}function Nf(a,b){function f(a){return function(){a.apply(null,d)}}var c=a._handlers&&a._handlers[b];if(c){var e,d=Array.prototype.slice.call(arguments,2);Tb?e=Tb.delayedCallbacks:Mf?e=Mf:(e=Mf=[],setTimeout(Of,0));for(var g=0;g<c.length;++g)e.push(f(c[g]))}}function Of(){var a=Mf;Mf=null;for(var b=0;b<a.length;++b)a[b]()}function Pf(a,b,c){return"string"==typeof b&&(b={type:b,preventDefault:function(){this.defaultPrevented=!0}}),Lf(a,c||b.type,a,b),Ff(b)||b.codemirrorIgnore}function Qf(a){var b=a._handlers&&a._handlers.cursorActivity;if(b)for(var c=a.curOp.cursorActivityHandlers||(a.curOp.cursorActivityHandlers=[]),d=0;d<b.length;++d)-1==dg(c,b[d])&&c.push(b[d])}function Rf(a,b){var c=a._handlers&&a._handlers[b];return c&&c.length>0}function Sf(a){a.prototype.on=function(a,b){Jf(this,a,b)},a.prototype.off=function(a,b){Kf(this,a,b)}}function Yf(){this.id=null}function ag(a){for(;_f.length<=a;)_f.push(bg(_f)+" ");return _f[a]}function bg(a){return a[a.length-1]}function dg(a,b){for(var c=0;c<a.length;++c)if(a[c]==b)return c;return-1}function eg(a,b){for(var c=[],d=0;d<a.length;d++)c[d]=b(a[d],d);return c}function fg(){}function gg(a,b){var c;return Object.create?c=Object.create(a):(fg.prototype=a,c=new fg),b&&hg(b,c),c}function hg(a,b,c){b||(b={});for(var d in a)!a.hasOwnProperty(d)||c===!1&&b.hasOwnProperty(d)||(b[d]=a[d]);return b}function ig(a){var b=Array.prototype.slice.call(arguments,1);return function(){return a.apply(null,b)}}function lg(a,b){return b?b.source.indexOf("\\w")>-1&&kg(a)?!0:b.test(a):kg(a)}function mg(a){for(var b in a)if(a.hasOwnProperty(b)&&a[b])return!1;return!0}function og(a){return a.charCodeAt(0)>=768&&ng.test(a)}function pg(a,b,c,d){var e=document.createElement(a);if(c&&(e.className=c),d&&(e.style.cssText=d),"string"==typeof b)e.appendChild(document.createTextNode(b));else if(b)for(var f=0;f<b.length;++f)e.appendChild(b[f]);return e}function rg(a){for(var b=a.childNodes.length;b>0;--b)a.removeChild(a.firstChild);return a}function sg(a,b){return rg(a).appendChild(b)}function ug(){for(var a=document.activeElement;a&&a.root&&a.root.activeElement;)a=a.root.activeElement;return a}function vg(a){return new RegExp("(^|\\s)"+a+"(?:$|\\s)\\s*")}function yg(a,b){for(var c=a.split(" "),d=0;d<c.length;d++)c[d]&&!vg(c[d]).test(b)&&(b+=" "+c[d]);return b}function zg(a){if(document.body.getElementsByClassName)for(var b=document.body.getElementsByClassName("CodeMirror"),c=0;c<b.length;c++){var d=b[c].CodeMirror;d&&a(d)}}function Bg(){Ag||(Cg(),Ag=!0)}function Cg(){var a;Jf(window,"resize",function(){null==a&&(a=setTimeout(function(){a=null,zg(rc)},100))}),Jf(window,"blur",function(){zg($c)})}function Fg(a){if(null==Eg){var b=pg("span","\u200b");sg(a,pg("span",[b,document.createTextNode("x")])),0!=a.firstChild.offsetHeight&&(Eg=b.offsetWidth<=1&&b.offsetHeight>2&&!(d&&8>e))}var c=Eg?pg("span","\u200b"):pg("span","\xa0",null,"display: inline-block; width: 1px; margin-right: -1px");return c.setAttribute("cm-text",""),c}function Hg(a){if(null!=Gg)return Gg;var b=sg(a,document.createTextNode("A\u062eA")),c=qg(b,0,1).getBoundingClientRect();if(!c||c.left==c.right)return!1;var d=qg(b,1,2).getBoundingClientRect();return Gg=d.right-c.right<3}function Mg(a){if(null!=Lg)return Lg;var b=sg(a,pg("span","x")),c=b.getBoundingClientRect(),d=qg(b,0,1).getBoundingClientRect();return Lg=Math.abs(c.left-d.left)>1}function Og(a,b,c,d){if(!a)return d(b,c,"ltr");for(var e=!1,f=0;f<a.length;++f){var g=a[f];(g.from<c&&g.to>b||b==c&&g.to==b)&&(d(Math.max(g.from,b),Math.min(g.to,c),1==g.level?"rtl":"ltr"),e=!0)}e||d(b,c,"ltr")}function Pg(a){return a.level%2?a.to:a.from}function Qg(a){return a.level%2?a.from:a.to}function Rg(a){var b=nf(a);return b?Pg(b[0]):0}function Sg(a){var b=nf(a);return b?Qg(bg(b)):a.text.length}function Tg(a,b){var c=ff(a.doc,b),d=se(c);d!=c&&(b=kf(d));var e=nf(d),f=e?e[0].level%2?Sg(d):Rg(d):0;return oa(b,f)}function Ug(a,b){for(var c,d=ff(a.doc,b);c=qe(d);)d=c.find(1,!0).line,b=null;var e=nf(d),f=e?e[0].level%2?Rg(d):Sg(d):d.text.length;return oa(null==b?kf(d):b,f)}function Vg(a,b){var c=Tg(a,b.line),d=ff(a.doc,c.line),e=nf(d);if(!e||0==e[0].level){var f=Math.max(0,d.text.search(/\S/)),g=b.line==c.line&&b.ch<=f&&b.ch;return oa(c.line,g?0:f)}return c}function Wg(a,b,c){var d=a[0].level;return b==d?!0:c==d?!1:c>b}function Yg(a,b){Xg=null;for(var d,c=0;c<a.length;++c){var e=a[c];if(e.from<b&&e.to>b)return c;if(e.from==b||e.to==b){if(null!=d)return Wg(a,e.level,a[d].level)?(e.from!=e.to&&(Xg=d),c):(e.from!=e.to&&(Xg=c),d);d=c}}return d}function Zg(a,b,c,d){if(!d)return b+c;do b+=c;while(b>0&&og(a.text.charAt(b)));return b}function $g(a,b,c,d){var e=nf(a);if(!e)return _g(a,b,c,d);for(var f=Yg(e,b),g=e[f],h=Zg(a,b,g.level%2?-c:c,d);;){if(h>g.from&&h<g.to)return h;if(h==g.from||h==g.to)return Yg(e,h)==f?h:(g=e[f+=c],c>0==g.level%2?g.to:g.from);if(g=e[f+=c],!g)return null;h=c>0==g.level%2?Zg(a,g.to,-1,d):Zg(a,g.from,1,d)}}function _g(a,b,c,d){var e=b+c;if(d)for(;e>0&&og(a.text.charAt(e));)e+=c;return 0>e||e>a.text.length?null:e}var a=/gecko\/\d/i.test(navigator.userAgent),b=/MSIE \d/.test(navigator.userAgent),c=/Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(navigator.userAgent),d=b||c,e=d&&(b?document.documentMode||6:c[1]),f=/WebKit\//.test(navigator.userAgent),g=f&&/Qt\/\d+\.\d+/.test(navigator.userAgent),h=/Chrome\//.test(navigator.userAgent),i=/Opera\//.test(navigator.userAgent),j=/Apple Computer/.test(navigator.vendor),k=/Mac OS X 1\d\D([8-9]|\d\d)\D/.test(navigator.userAgent),l=/PhantomJS/.test(navigator.userAgent),m=/AppleWebKit/.test(navigator.userAgent)&&/Mobile\/\w+/.test(navigator.userAgent),n=m||/Android|webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(navigator.userAgent),o=m||/Mac/.test(navigator.platform),p=/win/i.test(navigator.platform),q=i&&navigator.userAgent.match(/Version\/(\d*\.\d*)/);q&&(q=Number(q[1])),q&&q>=15&&(i=!1,f=!0);var r=o&&(g||i&&(null==q||12.11>q)),s=a||d&&e>=9,t=!1,u=!1;K.prototype=hg({update:function(a){var b=a.scrollWidth>a.clientWidth+1,c=a.scrollHeight>a.clientHeight+1,d=a.nativeBarWidth;if(c){this.vert.style.display="block",this.vert.style.bottom=b?d+"px":"0";var e=a.viewHeight-(b?d:0);this.vert.firstChild.style.height=Math.max(0,a.scrollHeight-a.clientHeight+e)+"px"}else this.vert.style.display="",this.vert.firstChild.style.height="0";if(b){this.horiz.style.display="block",this.horiz.style.right=c?d+"px":"0",this.horiz.style.left=a.barLeft+"px";var f=a.viewWidth-a.barLeft-(c?d:0);this.horiz.firstChild.style.width=a.scrollWidth-a.clientWidth+f+"px"}else this.horiz.style.display="",this.horiz.firstChild.style.width="0";return!this.checkedOverlay&&a.clientHeight>0&&(0==d&&this.overlayHack(),this.checkedOverlay=!0),{right:c?d:0,bottom:b?d:0}},setScrollLeft:function(a){this.horiz.scrollLeft!=a&&(this.horiz.scrollLeft=a)},setScrollTop:function(a){this.vert.scrollTop!=a&&(this.vert.scrollTop=a)},overlayHack:function(){var a=o&&!k?"12px":"18px";this.horiz.style.minHeight=this.vert.style.minWidth=a;var b=this,c=function(a){Hf(a)!=b.vert&&Hf(a)!=b.horiz&&dc(b.cm,uc)(a)};Jf(this.vert,"mousedown",c),Jf(this.horiz,"mousedown",c)},clear:function(){var a=this.horiz.parentNode;a.removeChild(this.horiz),a.removeChild(this.vert)}},K.prototype),L.prototype=hg({update:function(){return{bottom:0,right:0}},setScrollLeft:function(){},setScrollTop:function(){},clear:function(){}},L.prototype),v.scrollbarModel={"native":K,"null":L},U.prototype.signal=function(a,b){Rf(a,b)&&this.events.push(arguments)},U.prototype.finish=function(){for(var a=0;a<this.events.length;a++)Lf.apply(null,this.events[a])};var oa=v.Pos=function(a,b){return this instanceof oa?(this.line=a,void(this.ch=b)):new oa(a,b)},pa=v.cmpPos=function(a,b){return a.line-b.line||a.ch-b.ch},va=null;Ba.prototype=hg({init:function(a){function h(a){if(c.somethingSelected())va=c.getSelections(),b.inaccurateSelection&&(b.prevInput="",b.inaccurateSelection=!1,g.value=va.join("\n"),cg(g));else{if(!c.options.lineWiseCopyCut)return;var d=za(c);va=d.text,"cut"==a.type?c.setSelections(d.ranges,null,Vf):(b.prevInput="",g.value=d.text.join("\n"),cg(g))}"cut"==a.type&&(c.state.cutIncoming=!0)}var b=this,c=this.cm,f=this.wrapper=Ca(),g=this.textarea=f.firstChild;a.wrapper.insertBefore(f,a.wrapper.firstChild),m&&(g.style.width="0px"),Jf(g,"input",function(){d&&e>=9&&b.hasSelection&&(b.hasSelection=null),b.poll()}),Jf(g,"paste",function(a){return xa(a,c)?!0:(c.state.pasteIncoming=!0,void b.fastPoll())}),Jf(g,"cut",h),Jf(g,"copy",h),Jf(a.scroller,"paste",function(d){sc(a,d)||(c.state.pasteIncoming=!0,b.focus())}),Jf(a.lineSpace,"selectstart",function(b){sc(a,b)||Df(b)}),Jf(g,"compositionstart",function(){var a=c.getCursor("from");b.composing={
-start:a,range:c.markText(a,c.getCursor("to"),{className:"CodeMirror-composing"})}}),Jf(g,"compositionend",function(){b.composing&&(b.poll(),b.composing.range.clear(),b.composing=null)})},prepareSelection:function(){var a=this.cm,b=a.display,c=a.doc,d=eb(a);if(a.options.moveInputWithCursor){var e=Lb(a,c.sel.primary().head,"div"),f=b.wrapper.getBoundingClientRect(),g=b.lineDiv.getBoundingClientRect();d.teTop=Math.max(0,Math.min(b.wrapper.clientHeight-10,e.top+g.top-f.top)),d.teLeft=Math.max(0,Math.min(b.wrapper.clientWidth-10,e.left+g.left-f.left))}return d},showSelection:function(a){var b=this.cm,c=b.display;sg(c.cursorDiv,a.cursors),sg(c.selectionDiv,a.selection),null!=a.teTop&&(this.wrapper.style.top=a.teTop+"px",this.wrapper.style.left=a.teLeft+"px")},reset:function(a){if(!this.contextMenuPending){var b,c,f=this.cm,g=f.doc;if(f.somethingSelected()){this.prevInput="";var h=g.sel.primary();b=Kg&&(h.to().line-h.from().line>100||(c=f.getSelection()).length>1e3);var i=b?"-":c||f.getSelection();this.textarea.value=i,f.state.focused&&cg(this.textarea),d&&e>=9&&(this.hasSelection=i)}else a||(this.prevInput=this.textarea.value="",d&&e>=9&&(this.hasSelection=null));this.inaccurateSelection=b}},getField:function(){return this.textarea},supportsTouch:function(){return!1},focus:function(){if("nocursor"!=this.cm.options.readOnly&&(!n||ug()!=this.textarea))try{this.textarea.focus()}catch(a){}},blur:function(){this.textarea.blur()},resetPosition:function(){this.wrapper.style.top=this.wrapper.style.left=0},receivedFocus:function(){this.slowPoll()},slowPoll:function(){var a=this;a.pollingFast||a.polling.set(this.cm.options.pollInterval,function(){a.poll(),a.cm.state.focused&&a.slowPoll()})},fastPoll:function(){function c(){var d=b.poll();d||a?(b.pollingFast=!1,b.slowPoll()):(a=!0,b.polling.set(60,c))}var a=!1,b=this;b.pollingFast=!0,b.polling.set(20,c)},poll:function(){var a=this.cm,b=this.textarea,c=this.prevInput;if(this.contextMenuPending||!a.state.focused||Jg(b)&&!c&&!this.composing||ua(a)||a.options.disableInput||a.state.keySeq)return!1;var f=b.value;if(f==c&&!a.somethingSelected())return!1;if(d&&e>=9&&this.hasSelection===f||o&&/[\uf700-\uf7ff]/.test(f))return a.display.input.reset(),!1;if(a.doc.sel==a.display.selForContextMenu){var g=f.charCodeAt(0);if(8203!=g||c||(c="\u200b"),8666==g)return this.reset(),this.cm.execCommand("undo")}for(var h=0,i=Math.min(c.length,f.length);i>h&&c.charCodeAt(h)==f.charCodeAt(h);)++h;var j=this;return cc(a,function(){wa(a,f.slice(h),c.length-h,null,j.composing?"*compose":null),f.length>1e3||f.indexOf("\n")>-1?b.value=j.prevInput="":j.prevInput=f,j.composing&&(j.composing.range.clear(),j.composing.range=a.markText(j.composing.start,a.getCursor("to"),{className:"CodeMirror-composing"}))}),!0},ensurePolled:function(){this.pollingFast&&this.poll()&&(this.pollingFast=!1)},onKeyPress:function(){d&&e>=9&&(this.hasSelection=null),this.fastPoll()},onContextMenu:function(a){function o(){if(null!=h.selectionStart){var a=c.somethingSelected(),d="\u200b"+(a?h.value:"");h.value="\u21da",h.value=d,b.prevInput=a?"":"\u200b",h.selectionStart=1,h.selectionEnd=d.length,g.selForContextMenu=c.doc.sel}}function p(){if(b.contextMenuPending=!1,b.wrapper.style.position="relative",h.style.cssText=m,d&&9>e&&g.scrollbars.setScrollTop(g.scroller.scrollTop=k),null!=h.selectionStart){(!d||d&&9>e)&&o();var a=0,f=function(){g.selForContextMenu==c.doc.sel&&0==h.selectionStart&&h.selectionEnd>0&&"\u200b"==b.prevInput?dc(c,Ld.selectAll)(c):a++<10?g.detectingSelectAll=setTimeout(f,500):g.input.reset()};g.detectingSelectAll=setTimeout(f,200)}}var b=this,c=b.cm,g=c.display,h=b.textarea,j=tc(c,a),k=g.scroller.scrollTop;if(j&&!i){var l=c.options.resetSelectionOnContextMenu;l&&-1==c.doc.sel.contains(j)&&dc(c,Za)(c.doc,Ma(j),Vf);var m=h.style.cssText;if(b.wrapper.style.position="absolute",h.style.cssText="position: fixed; width: 30px; height: 30px; top: "+(a.clientY-5)+"px; left: "+(a.clientX-5)+"px; z-index: 1000; background: "+(d?"rgba(255, 255, 255, .05)":"transparent")+"; outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);",f)var n=window.scrollY;if(g.input.focus(),f&&window.scrollTo(null,n),g.input.reset(),c.somethingSelected()||(h.value=b.prevInput=" "),b.contextMenuPending=!0,g.selForContextMenu=c.doc.sel,clearTimeout(g.detectingSelectAll),d&&e>=9&&o(),s){Gf(a);var q=function(){Kf(window,"mouseup",q),setTimeout(p,20)};Jf(window,"mouseup",q)}else setTimeout(p,50)}},setUneditable:fg,needsContentAttribute:!1},Ba.prototype),Da.prototype=hg({init:function(a){function e(a){if(c.somethingSelected())va=c.getSelections(),"cut"==a.type&&c.replaceSelection("",null,"cut");else{if(!c.options.lineWiseCopyCut)return;var b=za(c);va=b.text,"cut"==a.type&&c.operation(function(){c.setSelections(b.ranges,0,Vf),c.replaceSelection("",null,"cut")})}if(a.clipboardData&&!m)a.preventDefault(),a.clipboardData.clearData(),a.clipboardData.setData("text/plain",va.join("\n"));else{var d=Ca(),e=d.firstChild;c.display.lineSpace.insertBefore(d,c.display.lineSpace.firstChild),e.value=va.join("\n");var f=document.activeElement;cg(e),setTimeout(function(){c.display.lineSpace.removeChild(d),f.focus()},50)}}var b=this,c=b.cm,d=b.div=a.lineDiv;d.contentEditable="true",Aa(d),Jf(d,"paste",function(a){xa(a,c)}),Jf(d,"compositionstart",function(a){var d=a.data;if(b.composing={sel:c.doc.sel,data:d,startData:d},d){var e=c.doc.sel.primary(),f=c.getLine(e.head.line),g=f.indexOf(d,Math.max(0,e.head.ch-d.length));g>-1&&g<=e.head.ch&&(b.composing.sel=Ma(oa(e.head.line,g),oa(e.head.line,g+d.length)))}}),Jf(d,"compositionupdate",function(a){b.composing.data=a.data}),Jf(d,"compositionend",function(a){var c=b.composing;c&&(a.data==c.startData||/\u200b/.test(a.data)||(c.data=a.data),setTimeout(function(){c.handled||b.applyComposition(c),b.composing==c&&(b.composing=null)},50))}),Jf(d,"touchstart",function(){b.forceCompositionEnd()}),Jf(d,"input",function(){b.composing||b.pollContent()||cc(b.cm,function(){ic(c)})}),Jf(d,"copy",e),Jf(d,"cut",e)},prepareSelection:function(){var a=eb(this.cm,!1);return a.focus=this.cm.state.focused,a},showSelection:function(a){a&&this.cm.display.view.length&&(a.focus&&this.showPrimarySelection(),this.showMultipleSelections(a))},showPrimarySelection:function(){var b=window.getSelection(),c=this.cm.doc.sel.primary(),d=Ga(this.cm,b.anchorNode,b.anchorOffset),e=Ga(this.cm,b.focusNode,b.focusOffset);if(!d||d.bad||!e||e.bad||0!=pa(sa(d,e),c.from())||0!=pa(ra(d,e),c.to())){var f=Ea(this.cm,c.from()),g=Ea(this.cm,c.to());if(f||g){var h=this.cm.display.view,i=b.rangeCount&&b.getRangeAt(0);if(f){if(!g){var j=h[h.length-1].measure,k=j.maps?j.maps[j.maps.length-1]:j.map;g={node:k[k.length-1],offset:k[k.length-2]-k[k.length-3]}}}else f={node:h[0].measure.map[2],offset:0};try{var l=qg(f.node,f.offset,g.offset,g.node)}catch(m){}l&&(b.removeAllRanges(),b.addRange(l),i&&null==b.anchorNode?b.addRange(i):a&&this.startGracePeriod()),this.rememberSelection()}}},startGracePeriod:function(){var a=this;clearTimeout(this.gracePeriod),this.gracePeriod=setTimeout(function(){a.gracePeriod=!1,a.selectionChanged()&&a.cm.operation(function(){a.cm.curOp.selectionChanged=!0})},20)},showMultipleSelections:function(a){sg(this.cm.display.cursorDiv,a.cursors),sg(this.cm.display.selectionDiv,a.selection)},rememberSelection:function(){var a=window.getSelection();this.lastAnchorNode=a.anchorNode,this.lastAnchorOffset=a.anchorOffset,this.lastFocusNode=a.focusNode,this.lastFocusOffset=a.focusOffset},selectionInEditor:function(){var a=window.getSelection();if(!a.rangeCount)return!1;var b=a.getRangeAt(0).commonAncestorContainer;return tg(this.div,b)},focus:function(){"nocursor"!=this.cm.options.readOnly&&this.div.focus()},blur:function(){this.div.blur()},getField:function(){return this.div},supportsTouch:function(){return!0},receivedFocus:function(){function b(){a.cm.state.focused&&(a.pollSelection(),a.polling.set(a.cm.options.pollInterval,b))}var a=this;this.selectionInEditor()?this.pollSelection():cc(this.cm,function(){a.cm.curOp.selectionChanged=!0}),this.polling.set(this.cm.options.pollInterval,b)},selectionChanged:function(){var a=window.getSelection();return a.anchorNode!=this.lastAnchorNode||a.anchorOffset!=this.lastAnchorOffset||a.focusNode!=this.lastFocusNode||a.focusOffset!=this.lastFocusOffset},pollSelection:function(){if(!this.composing&&!this.gracePeriod&&this.selectionChanged()){var a=window.getSelection(),b=this.cm;this.rememberSelection();var c=Ga(b,a.anchorNode,a.anchorOffset),d=Ga(b,a.focusNode,a.focusOffset);c&&d&&cc(b,function(){Za(b.doc,Ma(c,d),Vf),(c.bad||d.bad)&&(b.curOp.selectionChanged=!0)})}},pollContent:function(){var a=this.cm,b=a.display,c=a.doc.sel.primary(),d=c.from(),e=c.to();if(d.line<b.viewFrom||e.line>b.viewTo-1)return!1;var f;if(d.line==b.viewFrom||0==(f=lc(a,d.line)))var g=kf(b.view[0].line),h=b.view[0].node;else var g=kf(b.view[f].line),h=b.view[f-1].node.nextSibling;var i=lc(a,e.line);if(i==b.view.length-1)var j=b.viewTo-1,k=b.lineDiv.lastChild;else var j=kf(b.view[i+1].line)-1,k=b.view[i+1].node.previousSibling;for(var l=a.doc.splitLines(Ia(a,h,k,g,j)),m=gf(a.doc,oa(g,0),oa(j,ff(a.doc,j).text.length));l.length>1&&m.length>1;)if(bg(l)==bg(m))l.pop(),m.pop(),j--;else{if(l[0]!=m[0])break;l.shift(),m.shift(),g++}for(var n=0,o=0,p=l[0],q=m[0],r=Math.min(p.length,q.length);r>n&&p.charCodeAt(n)==q.charCodeAt(n);)++n;for(var s=bg(l),t=bg(m),u=Math.min(s.length-(1==l.length?n:0),t.length-(1==m.length?n:0));u>o&&s.charCodeAt(s.length-o-1)==t.charCodeAt(t.length-o-1);)++o;l[l.length-1]=s.slice(0,s.length-o),l[0]=l[0].slice(n);var v=oa(g,n),w=oa(j,m.length?bg(m).length-o:0);return l.length>1||l[0]||pa(v,w)?(nd(a.doc,l,v,w,"+input"),!0):void 0},ensurePolled:function(){this.forceCompositionEnd()},reset:function(){this.forceCompositionEnd()},forceCompositionEnd:function(){this.composing&&!this.composing.handled&&(this.applyComposition(this.composing),this.composing.handled=!0,this.div.blur(),this.div.focus())},applyComposition:function(a){a.data&&a.data!=a.startData&&dc(this.cm,wa)(this.cm,a.data,0,a.sel)},setUneditable:function(a){a.setAttribute("contenteditable","false")},onKeyPress:function(a){a.preventDefault(),dc(this.cm,wa)(this.cm,String.fromCharCode(null==a.charCode?a.keyCode:a.charCode),0)},onContextMenu:fg,resetPosition:fg,needsContentAttribute:!0},Da.prototype),v.inputStyles={textarea:Ba,contenteditable:Da},Ja.prototype={primary:function(){return this.ranges[this.primIndex]},equals:function(a){if(a==this)return!0;if(a.primIndex!=this.primIndex||a.ranges.length!=this.ranges.length)return!1;for(var b=0;b<this.ranges.length;b++){var c=this.ranges[b],d=a.ranges[b];if(0!=pa(c.anchor,d.anchor)||0!=pa(c.head,d.head))return!1}return!0},deepCopy:function(){for(var a=[],b=0;b<this.ranges.length;b++)a[b]=new Ka(qa(this.ranges[b].anchor),qa(this.ranges[b].head));return new Ja(a,this.primIndex)},somethingSelected:function(){for(var a=0;a<this.ranges.length;a++)if(!this.ranges[a].empty())return!0;return!1},contains:function(a,b){b||(b=a);for(var c=0;c<this.ranges.length;c++){var d=this.ranges[c];if(pa(b,d.from())>=0&&pa(a,d.to())<=0)return c}return-1}},Ka.prototype={from:function(){return sa(this.anchor,this.head)},to:function(){return ra(this.anchor,this.head)},empty:function(){return this.head.line==this.anchor.line&&this.head.ch==this.anchor.ch}};var Qb,vc,wc,zb={left:0,right:0,top:0,bottom:0},Tb=null,Ub=0,Cc=0,Jc=0,Kc=null;d?Kc=-.53:a?Kc=15:h?Kc=-.7:j&&(Kc=-1/3);var Lc=function(a){var b=a.wheelDeltaX,c=a.wheelDeltaY;return null==b&&a.detail&&a.axis==a.HORIZONTAL_AXIS&&(b=a.detail),null==c&&a.detail&&a.axis==a.VERTICAL_AXIS?c=a.detail:null==c&&(c=a.wheelDelta),{x:b,y:c}};v.wheelEventPixels=function(a){var b=Lc(a);return b.x*=Kc,b.y*=Kc,b};var Pc=new Yf,Tc=null,bd=v.changeEnd=function(a){return a.text?oa(a.from.line+a.text.length-1,bg(a.text).length+(1==a.text.length?a.from.ch:0)):a.to};v.prototype={constructor:v,focus:function(){window.focus(),this.display.input.focus()},setOption:function(a,b){var c=this.options,d=c[a];(c[a]!=b||"mode"==a)&&(c[a]=b,Bd.hasOwnProperty(a)&&dc(this,Bd[a])(this,b,d))},getOption:function(a){return this.options[a]},getDoc:function(){return this.doc},addKeyMap:function(a,b){this.state.keyMaps[b?"push":"unshift"](Rd(a))},removeKeyMap:function(a){for(var b=this.state.keyMaps,c=0;c<b.length;++c)if(b[c]==a||b[c].name==a)return b.splice(c,1),!0},addOverlay:ec(function(a,b){var c=a.token?a:v.getMode(this.options,a);if(c.startState)throw new Error("Overlays may not be stateful.");this.state.overlays.push({mode:c,modeSpec:a,opaque:b&&b.opaque}),this.state.modeGen++,ic(this)}),removeOverlay:ec(function(a){for(var b=this.state.overlays,c=0;c<b.length;++c){var d=b[c].modeSpec;if(d==a||"string"==typeof a&&d.name==a)return b.splice(c,1),this.state.modeGen++,void ic(this)}}),indentLine:ec(function(a,b,c){"string"!=typeof b&&"number"!=typeof b&&(b=null==b?this.options.smartIndent?"smart":"prev":b?"add":"subtract"),Qa(this.doc,a)&&vd(this,a,b,c)}),indentSelection:ec(function(a){for(var b=this.doc.sel.ranges,c=-1,d=0;d<b.length;d++){var e=b[d];if(e.empty())e.head.line>c&&(vd(this,e.head.line,a,!0),c=e.head.line,d==this.doc.sel.primIndex&&td(this));else{var f=e.from(),g=e.to(),h=Math.max(c,f.line);c=Math.min(this.lastLine(),g.line-(g.ch?0:1))+1;for(var i=h;c>i;++i)vd(this,i,a);var j=this.doc.sel.ranges;0==f.ch&&b.length==j.length&&j[d].from().ch>0&&Va(this.doc,d,new Ka(f,j[d].to()),Vf)}}}),getTokenAt:function(a,b){return Ie(this,a,b)},getLineTokens:function(a,b){return Ie(this,oa(a),b,!0)},getTokenTypeAt:function(a){a=Oa(this.doc,a);var f,b=Le(this,ff(this.doc,a.line)),c=0,d=(b.length-1)/2,e=a.ch;if(0==e)f=b[2];else for(;;){var g=c+d>>1;if((g?b[2*g-1]:0)>=e)d=g;else{if(!(b[2*g+1]<e)){f=b[2*g+2];break}c=g+1}}var h=f?f.indexOf("cm-overlay "):-1;return 0>h?f:0==h?null:f.slice(0,h-1)},getModeAt:function(a){var b=this.doc.mode;return b.innerMode?v.innerMode(b,this.getTokenAt(a).state).mode:b},getHelper:function(a,b){return this.getHelpers(a,b)[0]},getHelpers:function(a,b){var c=[];if(!Id.hasOwnProperty(b))return c;var d=Id[b],e=this.getModeAt(a);if("string"==typeof e[b])d[e[b]]&&c.push(d[e[b]]);else if(e[b])for(var f=0;f<e[b].length;f++){var g=d[e[b][f]];g&&c.push(g)}else e.helperType&&d[e.helperType]?c.push(d[e.helperType]):d[e.name]&&c.push(d[e.name]);for(var f=0;f<d._global.length;f++){var h=d._global[f];h.pred(e,this)&&-1==dg(c,h.val)&&c.push(h.val)}return c},getStateAfter:function(a,b){var c=this.doc;return a=Na(c,null==a?c.first+c.size-1:a),lb(this,a+1,b)},cursorCoords:function(a,b){var c,d=this.doc.sel.primary();return c=null==a?d.head:"object"==typeof a?Oa(this.doc,a):a?d.from():d.to(),Lb(this,c,b||"page")},charCoords:function(a,b){return Kb(this,Oa(this.doc,a),b||"page")},coordsChar:function(a,b){return a=Jb(this,a,b||"page"),Ob(this,a.left,a.top)},lineAtHeight:function(a,b){return a=Jb(this,{top:a,left:0},b||"page").top,lf(this.doc,a+this.display.viewOffset)},heightAtLine:function(a,b){var d,c=!1;if("number"==typeof a){var e=this.doc.first+this.doc.size-1;a<this.doc.first?a=this.doc.first:a>e&&(a=e,c=!0),d=ff(this.doc,a)}else d=a;return Ib(this,d,{top:0,left:0},b||"page").top+(c?this.doc.height-mf(d):0)},defaultTextHeight:function(){return Rb(this.display)},defaultCharWidth:function(){return Sb(this.display)},setGutterMarker:ec(function(a,b,c){return wd(this.doc,a,"gutter",function(a){var d=a.gutterMarkers||(a.gutterMarkers={});return d[b]=c,!c&&mg(d)&&(a.gutterMarkers=null),!0})}),clearGutter:ec(function(a){var b=this,c=b.doc,d=c.first;c.iter(function(c){c.gutterMarkers&&c.gutterMarkers[a]&&(c.gutterMarkers[a]=null,jc(b,d,"gutter"),mg(c.gutterMarkers)&&(c.gutterMarkers=null)),++d})}),lineInfo:function(a){if("number"==typeof a){if(!Qa(this.doc,a))return null;var b=a;if(a=ff(this.doc,a),!a)return null}else{var b=kf(a);if(null==b)return null}return{line:b,handle:a,text:a.text,gutterMarkers:a.gutterMarkers,textClass:a.textClass,bgClass:a.bgClass,wrapClass:a.wrapClass,widgets:a.widgets}},getViewport:function(){return{from:this.display.viewFrom,to:this.display.viewTo}},addWidget:function(a,b,c,d,e){var f=this.display;a=Lb(this,Oa(this.doc,a));var g=a.bottom,h=a.left;if(b.style.position="absolute",b.setAttribute("cm-ignore-events","true"),this.display.input.setUneditable(b),f.sizer.appendChild(b),"over"==d)g=a.top;else if("above"==d||"near"==d){var i=Math.max(f.wrapper.clientHeight,this.doc.height),j=Math.max(f.sizer.clientWidth,f.lineSpace.clientWidth);("above"==d||a.bottom+b.offsetHeight>i)&&a.top>b.offsetHeight?g=a.top-b.offsetHeight:a.bottom+b.offsetHeight<=i&&(g=a.bottom),h+b.offsetWidth>j&&(h=j-b.offsetWidth)}b.style.top=g+"px",b.style.left=b.style.right="","right"==e?(h=f.sizer.clientWidth-b.offsetWidth,b.style.right="0px"):("left"==e?h=0:"middle"==e&&(h=(f.sizer.clientWidth-b.offsetWidth)/2),b.style.left=h+"px"),c&&qd(this,h,g,h+b.offsetWidth,g+b.offsetHeight)},triggerOnKeyDown:ec(Uc),triggerOnKeyPress:ec(Xc),triggerOnKeyUp:Wc,execCommand:function(a){return Ld.hasOwnProperty(a)?Ld[a].call(null,this):void 0},triggerElectric:ec(function(a){ya(this,a)}),findPosH:function(a,b,c,d){var e=1;0>b&&(e=-1,b=-b);for(var f=0,g=Oa(this.doc,a);b>f&&(g=yd(this.doc,g,e,c,d),!g.hitSide);++f);return g},moveH:ec(function(a,b){var c=this;c.extendSelectionsBy(function(d){return c.display.shift||c.doc.extend||d.empty()?yd(c.doc,d.head,a,b,c.options.rtlMoveVisually):0>a?d.from():d.to()},Xf)}),deleteH:ec(function(a,b){var c=this.doc.sel,d=this.doc;c.somethingSelected()?d.replaceSelection("",null,"+delete"):xd(this,function(c){var e=yd(d,c.head,a,b,!1);return 0>a?{from:e,to:c.head}:{from:c.head,to:e}})}),findPosV:function(a,b,c,d){var e=1,f=d;0>b&&(e=-1,b=-b);for(var g=0,h=Oa(this.doc,a);b>g;++g){var i=Lb(this,h,"div");if(null==f?f=i.left:i.left=f,h=zd(this,i,e,c),h.hitSide)break}return h},moveV:ec(function(a,b){var c=this,d=this.doc,e=[],f=!c.display.shift&&!d.extend&&d.sel.somethingSelected();if(d.extendSelectionsBy(function(g){if(f)return 0>a?g.from():g.to();var h=Lb(c,g.head,"div");null!=g.goalColumn&&(h.left=g.goalColumn),e.push(h.left);var i=zd(c,h,a,b);return"page"==b&&g==d.sel.primary()&&sd(c,null,Kb(c,i,"div").top-h.top),i},Xf),e.length)for(var g=0;g<d.sel.ranges.length;g++)d.sel.ranges[g].goalColumn=e[g]}),findWordAt:function(a){var b=this.doc,c=ff(b,a.line).text,d=a.ch,e=a.ch;if(c){var f=this.getHelper(a,"wordChars");(a.xRel<0||e==c.length)&&d?--d:++e;for(var g=c.charAt(d),h=lg(g,f)?function(a){return lg(a,f)}:/\s/.test(g)?function(a){return/\s/.test(a)}:function(a){return!/\s/.test(a)&&!lg(a)};d>0&&h(c.charAt(d-1));)--d;for(;e<c.length&&h(c.charAt(e));)++e}return new Ka(oa(a.line,d),oa(a.line,e))},toggleOverwrite:function(a){(null==a||a!=this.state.overwrite)&&((this.state.overwrite=!this.state.overwrite)?xg(this.display.cursorDiv,"CodeMirror-overwrite"):wg(this.display.cursorDiv,"CodeMirror-overwrite"),Lf(this,"overwriteToggle",this,this.state.overwrite))},hasFocus:function(){return this.display.input.getField()==ug()},scrollTo:ec(function(a,b){(null!=a||null!=b)&&ud(this),null!=a&&(this.curOp.scrollLeft=a),null!=b&&(this.curOp.scrollTop=b)}),getScrollInfo:function(){var a=this.display.scroller;return{left:a.scrollLeft,top:a.scrollTop,height:a.scrollHeight-pb(this)-this.display.barHeight,width:a.scrollWidth-pb(this)-this.display.barWidth,clientHeight:rb(this),clientWidth:qb(this)}},scrollIntoView:ec(function(a,b){if(null==a?(a={from:this.doc.sel.primary().head,to:null},null==b&&(b=this.options.cursorScrollMargin)):"number"==typeof a?a={from:oa(a,0),to:null}:null==a.from&&(a={from:a,to:null}),a.to||(a.to=a.from),a.margin=b||0,null!=a.from.line)ud(this),this.curOp.scrollToPos=a;else{var c=rd(this,Math.min(a.from.left,a.to.left),Math.min(a.from.top,a.to.top)-a.margin,Math.max(a.from.right,a.to.right),Math.max(a.from.bottom,a.to.bottom)+a.margin);this.scrollTo(c.scrollLeft,c.scrollTop)}}),setSize:ec(function(a,b){function d(a){return"number"==typeof a||/^\d+$/.test(String(a))?a+"px":a}var c=this;null!=a&&(c.display.wrapper.style.width=d(a)),null!=b&&(c.display.wrapper.style.height=d(b)),c.options.lineWrapping&&Eb(this);var e=c.display.viewFrom;c.doc.iter(e,c.display.viewTo,function(a){if(a.widgets)for(var b=0;b<a.widgets.length;b++)if(a.widgets[b].noHScroll){jc(c,e,"widget");break}++e}),c.curOp.forceUpdate=!0,Lf(c,"refresh",this)}),operation:function(a){return cc(this,a)},refresh:ec(function(){var a=this.display.cachedTextHeight;ic(this),this.curOp.forceUpdate=!0,Fb(this),this.scrollTo(this.doc.scrollLeft,this.doc.scrollTop),F(this),(null==a||Math.abs(a-Rb(this.display))>.5)&&B(this),Lf(this,"refresh",this)}),swapDoc:ec(function(a){var b=this.doc;return b.cm=null,ef(this,a),Fb(this),this.display.input.reset(),this.scrollTo(a.scrollLeft,a.scrollTop),this.curOp.forceScroll=!0,Nf(this,"swapDoc",this,b),b}),getInputField:function(){return this.display.input.getField()},getWrapperElement:function(){return this.display.wrapper},getScrollerElement:function(){return this.display.scroller},getGutterElement:function(){return this.display.gutters}},Sf(v);var Ad=v.defaults={},Bd=v.optionHandlers={},Dd=v.Init={toString:function(){return"CodeMirror.Init"}};Cd("value","",function(a,b){a.setValue(b)},!0),Cd("mode",null,function(a,b){a.doc.modeOption=b,x(a)},!0),Cd("indentUnit",2,x,!0),Cd("indentWithTabs",!1),Cd("smartIndent",!0),Cd("tabSize",4,function(a){y(a),Fb(a),ic(a)},!0),Cd("lineSeparator",null,function(a,b){if(a.doc.lineSep=b,b){var c=[],d=a.doc.first;a.doc.iter(function(a){for(var e=0;;){var f=a.text.indexOf(b,e);if(-1==f)break;e=f+b.length,c.push(oa(d,f))}d++});for(var e=c.length-1;e>=0;e--)nd(a.doc,b,c[e],oa(c[e].line,c[e].ch+b.length))}}),Cd("specialChars",/[\t\u0000-\u0019\u00ad\u200b-\u200f\u2028\u2029\ufeff]/g,function(a,b,c){a.state.specialChars=new RegExp(b.source+(b.test("	")?"":"|	"),"g"),c!=v.Init&&a.refresh()}),Cd("specialCharPlaceholder",Re,function(a){a.refresh()},!0),Cd("electricChars",!0),Cd("inputStyle",n?"contenteditable":"textarea",function(){throw new Error("inputStyle can not (yet) be changed in a running editor")},!0),Cd("rtlMoveVisually",!p),Cd("wholeLineUpdateBefore",!0),Cd("theme","default",function(a){C(a),D(a)},!0),Cd("keyMap","default",function(a,b,c){var d=Rd(b),e=c!=v.Init&&Rd(c);e&&e.detach&&e.detach(a,d),d.attach&&d.attach(a,e||null)}),Cd("extraKeys",null),Cd("lineWrapping",!1,z,!0),Cd("gutters",[],function(a){I(a.options),D(a)},!0),Cd("fixedGutter",!0,function(a,b){a.display.gutters.style.left=b?T(a.display)+"px":"0",a.refresh()},!0),Cd("coverGutterNextToScrollbar",!1,function(a){N(a)},!0),Cd("scrollbarStyle","native",function(a){M(a),N(a),a.display.scrollbars.setScrollTop(a.doc.scrollTop),a.display.scrollbars.setScrollLeft(a.doc.scrollLeft)},!0),Cd("lineNumbers",!1,function(a){I(a.options),D(a)},!0),Cd("firstLineNumber",1,D,!0),Cd("lineNumberFormatter",function(a){return a},D,!0),Cd("showCursorWhenSelecting",!1,db,!0),Cd("resetSelectionOnContextMenu",!0),Cd("lineWiseCopyCut",!0),Cd("readOnly",!1,function(a,b){"nocursor"==b?($c(a),a.display.input.blur(),a.display.disabled=!0):(a.display.disabled=!1,b||a.display.input.reset())}),Cd("disableInput",!1,function(a,b){b||a.display.input.reset()},!0),Cd("dragDrop",!0,qc),Cd("cursorBlinkRate",530),Cd("cursorScrollMargin",0),Cd("cursorHeight",1,db,!0),Cd("singleCursorHeightPerLine",!0,db,!0),Cd("workTime",100),Cd("workDelay",100),Cd("flattenSpans",!0,y,!0),Cd("addModeClass",!1,y,!0),Cd("pollInterval",100),Cd("undoDepth",200,function(a,b){a.doc.history.undoDepth=b}),Cd("historyEventDelay",1250),Cd("viewportMargin",10,function(a){a.refresh()},!0),Cd("maxHighlightLength",1e4,y,!0),Cd("moveInputWithCursor",!0,function(a,b){b||a.display.input.resetPosition()}),Cd("tabindex",null,function(a,b){a.display.input.getField().tabIndex=b||""}),Cd("autofocus",null);var Ed=v.modes={},Fd=v.mimeModes={};v.defineMode=function(a,b){v.defaults.mode||"null"==a||(v.defaults.mode=a),arguments.length>2&&(b.dependencies=Array.prototype.slice.call(arguments,2)),Ed[a]=b},v.defineMIME=function(a,b){Fd[a]=b},v.resolveMode=function(a){if("string"==typeof a&&Fd.hasOwnProperty(a))a=Fd[a];else if(a&&"string"==typeof a.name&&Fd.hasOwnProperty(a.name)){var b=Fd[a.name];"string"==typeof b&&(b={name:b}),a=gg(b,a),a.name=b.name}else if("string"==typeof a&&/^[\w\-]+\/[\w\-]+\+xml$/.test(a))return v.resolveMode("application/xml");return"string"==typeof a?{name:a}:a||{name:"null"}},v.getMode=function(a,b){var b=v.resolveMode(b),c=Ed[b.name];if(!c)return v.getMode(a,"text/plain");var d=c(a,b);if(Gd.hasOwnProperty(b.name)){var e=Gd[b.name];for(var f in e)e.hasOwnProperty(f)&&(d.hasOwnProperty(f)&&(d["_"+f]=d[f]),d[f]=e[f])}if(d.name=b.name,b.helperType&&(d.helperType=b.helperType),b.modeProps)for(var f in b.modeProps)d[f]=b.modeProps[f];return d},v.defineMode("null",function(){return{token:function(a){a.skipToEnd()}}}),v.defineMIME("text/plain","null");var Gd=v.modeExtensions={};v.extendMode=function(a,b){var c=Gd.hasOwnProperty(a)?Gd[a]:Gd[a]={};hg(b,c)},v.defineExtension=function(a,b){v.prototype[a]=b},v.defineDocExtension=function(a,b){af.prototype[a]=b},v.defineOption=Cd;var Hd=[];v.defineInitHook=function(a){Hd.push(a)};var Id=v.helpers={};v.registerHelper=function(a,b,c){Id.hasOwnProperty(a)||(Id[a]=v[a]={_global:[]}),Id[a][b]=c},v.registerGlobalHelper=function(a,b,c,d){v.registerHelper(a,b,d),Id[a]._global.push({pred:c,val:d})};var Jd=v.copyState=function(a,b){if(b===!0)return b;if(a.copyState)return a.copyState(b);var c={};for(var d in b){var e=b[d];e instanceof Array&&(e=e.concat([])),c[d]=e}return c},Kd=v.startState=function(a,b,c){return a.startState?a.startState(b,c):!0};v.innerMode=function(a,b){for(;a.innerMode;){var c=a.innerMode(b);if(!c||c.mode==a)break;b=c.state,a=c.mode}return c||{mode:a,state:b}};var Ld=v.commands={selectAll:function(a){a.setSelection(oa(a.firstLine(),0),oa(a.lastLine()),Vf)},singleSelection:function(a){a.setSelection(a.getCursor("anchor"),a.getCursor("head"),Vf)},killLine:function(a){xd(a,function(b){if(b.empty()){var c=ff(a.doc,b.head.line).text.length;return b.head.ch==c&&b.head.line<a.lastLine()?{from:b.head,to:oa(b.head.line+1,0)}:{from:b.head,to:oa(b.head.line,c)}}return{from:b.from(),to:b.to()}})},deleteLine:function(a){xd(a,function(b){return{from:oa(b.from().line,0),to:Oa(a.doc,oa(b.to().line+1,0))}})},delLineLeft:function(a){xd(a,function(a){return{from:oa(a.from().line,0),to:a.from()}})},delWrappedLineLeft:function(a){xd(a,function(b){var c=a.charCoords(b.head,"div").top+5,d=a.coordsChar({left:0,top:c},"div");return{from:d,to:b.from()}})},delWrappedLineRight:function(a){xd(a,function(b){var c=a.charCoords(b.head,"div").top+5,d=a.coordsChar({left:a.display.lineDiv.offsetWidth+100,top:c},"div");return{from:b.from(),to:d}})},undo:function(a){a.undo()},redo:function(a){a.redo()},undoSelection:function(a){a.undoSelection()},redoSelection:function(a){a.redoSelection()},goDocStart:function(a){a.extendSelection(oa(a.firstLine(),0))},goDocEnd:function(a){a.extendSelection(oa(a.lastLine()))},goLineStart:function(a){a.extendSelectionsBy(function(b){return Tg(a,b.head.line)},{origin:"+move",bias:1})},goLineStartSmart:function(a){a.extendSelectionsBy(function(b){return Vg(a,b.head)},{origin:"+move",bias:1})},goLineEnd:function(a){a.extendSelectionsBy(function(b){return Ug(a,b.head.line)},{origin:"+move",bias:-1})},goLineRight:function(a){a.extendSelectionsBy(function(b){var c=a.charCoords(b.head,"div").top+5;return a.coordsChar({left:a.display.lineDiv.offsetWidth+100,top:c},"div")},Xf)},goLineLeft:function(a){a.extendSelectionsBy(function(b){var c=a.charCoords(b.head,"div").top+5;return a.coordsChar({left:0,top:c},"div")},Xf)},goLineLeftSmart:function(a){a.extendSelectionsBy(function(b){var c=a.charCoords(b.head,"div").top+5,d=a.coordsChar({left:0,top:c},"div");return d.ch<a.getLine(d.line).search(/\S/)?Vg(a,b.head):d},Xf)},goLineUp:function(a){a.moveV(-1,"line")},goLineDown:function(a){a.moveV(1,"line")},goPageUp:function(a){a.moveV(-1,"page")},goPageDown:function(a){a.moveV(1,"page")},goCharLeft:function(a){a.moveH(-1,"char")},goCharRight:function(a){a.moveH(1,"char")},goColumnLeft:function(a){a.moveH(-1,"column")},goColumnRight:function(a){a.moveH(1,"column")},goWordLeft:function(a){a.moveH(-1,"word")},goGroupRight:function(a){a.moveH(1,"group")},goGroupLeft:function(a){a.moveH(-1,"group")},goWordRight:function(a){a.moveH(1,"word")},delCharBefore:function(a){a.deleteH(-1,"char")},delCharAfter:function(a){a.deleteH(1,"char")},delWordBefore:function(a){a.deleteH(-1,"word")},delWordAfter:function(a){a.deleteH(1,"word")},delGroupBefore:function(a){a.deleteH(-1,"group")},delGroupAfter:function(a){a.deleteH(1,"group")},indentAuto:function(a){a.indentSelection("smart")},indentMore:function(a){a.indentSelection("add")},indentLess:function(a){a.indentSelection("subtract")},insertTab:function(a){a.replaceSelection("	")},insertSoftTab:function(a){for(var b=[],c=a.listSelections(),d=a.options.tabSize,e=0;e<c.length;e++){var f=c[e].from(),g=Zf(a.getLine(f.line),f.ch,d);b.push(new Array(d-g%d+1).join(" "))}a.replaceSelections(b)},defaultTab:function(a){a.somethingSelected()?a.indentSelection("add"):a.execCommand("insertTab")},transposeChars:function(a){cc(a,function(){for(var b=a.listSelections(),c=[],d=0;d<b.length;d++){var e=b[d].head,f=ff(a.doc,e.line).text;if(f)if(e.ch==f.length&&(e=new oa(e.line,e.ch-1)),e.ch>0)e=new oa(e.line,e.ch+1),a.replaceRange(f.charAt(e.ch-1)+f.charAt(e.ch-2),oa(e.line,e.ch-2),e,"+transpose");else if(e.line>a.doc.first){var g=ff(a.doc,e.line-1).text;g&&a.replaceRange(f.charAt(0)+a.doc.lineSeparator()+g.charAt(g.length-1),oa(e.line-1,g.length-1),oa(e.line,1),"+transpose")}c.push(new Ka(e,e))}a.setSelections(c)})},newlineAndIndent:function(a){cc(a,function(){for(var b=a.listSelections().length,c=0;b>c;c++){var d=a.listSelections()[c];a.replaceRange(a.doc.lineSeparator(),d.anchor,d.head,"+input"),a.indentLine(d.from().line+1,null,!0),td(a)}})},toggleOverwrite:function(a){a.toggleOverwrite()}},Md=v.keyMap={};Md.basic={Left:"goCharLeft",Right:"goCharRight",Up:"goLineUp",Down:"goLineDown",End:"goLineEnd",Home:"goLineStartSmart",PageUp:"goPageUp",PageDown:"goPageDown",Delete:"delCharAfter",Backspace:"delCharBefore","Shift-Backspace":"delCharBefore",Tab:"defaultTab","Shift-Tab":"indentAuto",Enter:"newlineAndIndent",Insert:"toggleOverwrite",Esc:"singleSelection"},Md.pcDefault={"Ctrl-A":"selectAll","Ctrl-D":"deleteLine","Ctrl-Z":"undo","Shift-Ctrl-Z":"redo","Ctrl-Y":"redo","Ctrl-Home":"goDocStart","Ctrl-End":"goDocEnd","Ctrl-Up":"goLineUp","Ctrl-Down":"goLineDown","Ctrl-Left":"goGroupLeft","Ctrl-Right":"goGroupRight","Alt-Left":"goLineStart","Alt-Right":"goLineEnd","Ctrl-Backspace":"delGroupBefore","Ctrl-Delete":"delGroupAfter","Ctrl-S":"save","Ctrl-F":"find","Ctrl-G":"findNext","Shift-Ctrl-G":"findPrev","Shift-Ctrl-F":"replace","Shift-Ctrl-R":"replaceAll","Ctrl-[":"indentLess","Ctrl-]":"indentMore","Ctrl-U":"undoSelection","Shift-Ctrl-U":"redoSelection","Alt-U":"redoSelection",fallthrough:"basic"},Md.emacsy={"Ctrl-F":"goCharRight","Ctrl-B":"goCharLeft","Ctrl-P":"goLineUp","Ctrl-N":"goLineDown","Alt-F":"goWordRight","Alt-B":"goWordLeft","Ctrl-A":"goLineStart","Ctrl-E":"goLineEnd","Ctrl-V":"goPageDown","Shift-Ctrl-V":"goPageUp","Ctrl-D":"delCharAfter","Ctrl-H":"delCharBefore","Alt-D":"delWordAfter","Alt-Backspace":"delWordBefore","Ctrl-K":"killLine","Ctrl-T":"transposeChars"},Md.macDefault={"Cmd-A":"selectAll","Cmd-D":"deleteLine","Cmd-Z":"undo","Shift-Cmd-Z":"redo","Cmd-Y":"redo","Cmd-Home":"goDocStart","Cmd-Up":"goDocStart","Cmd-End":"goDocEnd","Cmd-Down":"goDocEnd","Alt-Left":"goGroupLeft","Alt-Right":"goGroupRight","Cmd-Left":"goLineLeft","Cmd-Right":"goLineRight","Alt-Backspace":"delGroupBefore","Ctrl-Alt-Backspace":"delGroupAfter","Alt-Delete":"delGroupAfter","Cmd-S":"save","Cmd-F":"find","Cmd-G":"findNext","Shift-Cmd-G":"findPrev","Cmd-Alt-F":"replace","Shift-Cmd-Alt-F":"replaceAll","Cmd-[":"indentLess","Cmd-]":"indentMore","Cmd-Backspace":"delWrappedLineLeft","Cmd-Delete":"delWrappedLineRight","Cmd-U":"undoSelection",
-"Shift-Cmd-U":"redoSelection","Ctrl-Up":"goDocStart","Ctrl-Down":"goDocEnd",fallthrough:["basic","emacsy"]},Md["default"]=o?Md.macDefault:Md.pcDefault,v.normalizeKeyMap=function(a){var b={};for(var c in a)if(a.hasOwnProperty(c)){var d=a[c];if(/^(name|fallthrough|(de|at)tach)$/.test(c))continue;if("..."==d){delete a[c];continue}for(var e=eg(c.split(" "),Nd),f=0;f<e.length;f++){var g,h;f==e.length-1?(h=e.join(" "),g=d):(h=e.slice(0,f+1).join(" "),g="...");var i=b[h];if(i){if(i!=g)throw new Error("Inconsistent bindings for "+h)}else b[h]=g}delete a[c]}for(var j in b)a[j]=b[j];return a};var Od=v.lookupKey=function(a,b,c,d){b=Rd(b);var e=b.call?b.call(a,d):b[a];if(e===!1)return"nothing";if("..."===e)return"multi";if(null!=e&&c(e))return"handled";if(b.fallthrough){if("[object Array]"!=Object.prototype.toString.call(b.fallthrough))return Od(a,b.fallthrough,c,d);for(var f=0;f<b.fallthrough.length;f++){var g=Od(a,b.fallthrough[f],c,d);if(g)return g}}},Pd=v.isModifierKey=function(a){var b="string"==typeof a?a:Ng[a.keyCode];return"Ctrl"==b||"Alt"==b||"Shift"==b||"Mod"==b},Qd=v.keyName=function(a,b){if(i&&34==a.keyCode&&a["char"])return!1;var c=Ng[a.keyCode],d=c;return null==d||a.altGraphKey?!1:(a.altKey&&"Alt"!=c&&(d="Alt-"+d),(r?a.metaKey:a.ctrlKey)&&"Ctrl"!=c&&(d="Ctrl-"+d),(r?a.ctrlKey:a.metaKey)&&"Cmd"!=c&&(d="Cmd-"+d),!b&&a.shiftKey&&"Shift"!=c&&(d="Shift-"+d),d)};v.fromTextArea=function(a,b){function d(){a.value=i.getValue()}if(b=b?hg(b):{},b.value=a.value,!b.tabindex&&a.tabIndex&&(b.tabindex=a.tabIndex),!b.placeholder&&a.placeholder&&(b.placeholder=a.placeholder),null==b.autofocus){var c=ug();b.autofocus=c==a||null!=a.getAttribute("autofocus")&&c==document.body}if(a.form&&(Jf(a.form,"submit",d),!b.leaveSubmitMethodAlone)){var e=a.form,f=e.submit;try{var g=e.submit=function(){d(),e.submit=f,e.submit(),e.submit=g}}catch(h){}}b.finishInit=function(b){b.save=d,b.getTextArea=function(){return a},b.toTextArea=function(){b.toTextArea=isNaN,d(),a.parentNode.removeChild(b.getWrapperElement()),a.style.display="",a.form&&(Kf(a.form,"submit",d),"function"==typeof a.form.submit&&(a.form.submit=f))}},a.style.display="none";var i=v(function(b){a.parentNode.insertBefore(b,a.nextSibling)},b);return i};var Sd=v.StringStream=function(a,b){this.pos=this.start=0,this.string=a,this.tabSize=b||8,this.lastColumnPos=this.lastColumnValue=0,this.lineStart=0};Sd.prototype={eol:function(){return this.pos>=this.string.length},sol:function(){return this.pos==this.lineStart},peek:function(){return this.string.charAt(this.pos)||void 0},next:function(){return this.pos<this.string.length?this.string.charAt(this.pos++):void 0},eat:function(a){var b=this.string.charAt(this.pos);if("string"==typeof a)var c=b==a;else var c=b&&(a.test?a.test(b):a(b));return c?(++this.pos,b):void 0},eatWhile:function(a){for(var b=this.pos;this.eat(a););return this.pos>b},eatSpace:function(){for(var a=this.pos;/[\s\u00a0]/.test(this.string.charAt(this.pos));)++this.pos;return this.pos>a},skipToEnd:function(){this.pos=this.string.length},skipTo:function(a){var b=this.string.indexOf(a,this.pos);return b>-1?(this.pos=b,!0):void 0},backUp:function(a){this.pos-=a},column:function(){return this.lastColumnPos<this.start&&(this.lastColumnValue=Zf(this.string,this.start,this.tabSize,this.lastColumnPos,this.lastColumnValue),this.lastColumnPos=this.start),this.lastColumnValue-(this.lineStart?Zf(this.string,this.lineStart,this.tabSize):0)},indentation:function(){return Zf(this.string,null,this.tabSize)-(this.lineStart?Zf(this.string,this.lineStart,this.tabSize):0)},match:function(a,b,c){if("string"!=typeof a){var f=this.string.slice(this.pos).match(a);return f&&f.index>0?null:(f&&b!==!1&&(this.pos+=f[0].length),f)}var d=function(a){return c?a.toLowerCase():a},e=this.string.substr(this.pos,a.length);return d(e)==d(a)?(b!==!1&&(this.pos+=a.length),!0):void 0},current:function(){return this.string.slice(this.start,this.pos)},hideFirstChars:function(a,b){this.lineStart+=a;try{return b()}finally{this.lineStart-=a}}};var Td=0,Ud=v.TextMarker=function(a,b){this.lines=[],this.type=b,this.doc=a,this.id=++Td};Sf(Ud),Ud.prototype.clear=function(){if(!this.explicitlyCleared){var a=this.doc.cm,b=a&&!a.curOp;if(b&&Vb(a),Rf(this,"clear")){var c=this.find();c&&Nf(this,"clear",c.from,c.to)}for(var d=null,e=null,f=0;f<this.lines.length;++f){var g=this.lines[f],h=ae(g.markedSpans,this);a&&!this.collapsed?jc(a,kf(g),"text"):a&&(null!=h.to&&(e=kf(g)),null!=h.from&&(d=kf(g))),g.markedSpans=be(g.markedSpans,h),null==h.from&&this.collapsed&&!we(this.doc,g)&&a&&jf(g,Rb(a.display))}if(a&&this.collapsed&&!a.options.lineWrapping)for(var f=0;f<this.lines.length;++f){var i=se(this.lines[f]),j=G(i);j>a.display.maxLineLength&&(a.display.maxLine=i,a.display.maxLineLength=j,a.display.maxLineChanged=!0)}null!=d&&a&&this.collapsed&&ic(a,d,e+1),this.lines.length=0,this.explicitlyCleared=!0,this.atomic&&this.doc.cantEdit&&(this.doc.cantEdit=!1,a&&ab(a.doc)),a&&Nf(a,"markerCleared",a,this),b&&Xb(a),this.parent&&this.parent.clear()}},Ud.prototype.find=function(a,b){null==a&&"bookmark"==this.type&&(a=1);for(var c,d,e=0;e<this.lines.length;++e){var f=this.lines[e],g=ae(f.markedSpans,this);if(null!=g.from&&(c=oa(b?f:kf(f),g.from),-1==a))return c;if(null!=g.to&&(d=oa(b?f:kf(f),g.to),1==a))return d}return c&&{from:c,to:d}},Ud.prototype.changed=function(){var a=this.find(-1,!0),b=this,c=this.doc.cm;a&&c&&cc(c,function(){var d=a.line,e=kf(a.line),f=wb(c,e);if(f&&(Db(f),c.curOp.selectionChanged=c.curOp.forceUpdate=!0),c.curOp.updateMaxLine=!0,!we(b.doc,d)&&null!=b.height){var g=b.height;b.height=null;var h=Ae(b)-g;h&&jf(d,d.height+h)}})},Ud.prototype.attachLine=function(a){if(!this.lines.length&&this.doc.cm){var b=this.doc.cm.curOp;b.maybeHiddenMarkers&&-1!=dg(b.maybeHiddenMarkers,this)||(b.maybeUnhiddenMarkers||(b.maybeUnhiddenMarkers=[])).push(this)}this.lines.push(a)},Ud.prototype.detachLine=function(a){if(this.lines.splice(dg(this.lines,a),1),!this.lines.length&&this.doc.cm){var b=this.doc.cm.curOp;(b.maybeHiddenMarkers||(b.maybeHiddenMarkers=[])).push(this)}};var Td=0,Wd=v.SharedTextMarker=function(a,b){this.markers=a,this.primary=b;for(var c=0;c<a.length;++c)a[c].parent=this};Sf(Wd),Wd.prototype.clear=function(){if(!this.explicitlyCleared){this.explicitlyCleared=!0;for(var a=0;a<this.markers.length;++a)this.markers[a].clear();Nf(this,"clear")}},Wd.prototype.find=function(a,b){return this.primary.find(a,b)};var ye=v.LineWidget=function(a,b,c){if(c)for(var d in c)c.hasOwnProperty(d)&&(this[d]=c[d]);this.doc=a,this.node=b};Sf(ye),ye.prototype.clear=function(){var a=this.doc.cm,b=this.line.widgets,c=this.line,d=kf(c);if(null!=d&&b){for(var e=0;e<b.length;++e)b[e]==this&&b.splice(e--,1);b.length||(c.widgets=null);var f=Ae(this);jf(c,Math.max(0,c.height-f)),a&&cc(a,function(){ze(a,c,-f),jc(a,d,"widget")})}},ye.prototype.changed=function(){var a=this.height,b=this.doc.cm,c=this.line;this.height=null;var d=Ae(this)-a;d&&(jf(c,c.height+d),b&&cc(b,function(){b.curOp.forceUpdate=!0,ze(b,c,d)}))};var Ce=v.Line=function(a,b,c){this.text=a,ke(this,b),this.height=c?c(this):1};Sf(Ce),Ce.prototype.lineNo=function(){return kf(this)};var Ne={},Oe={};Ze.prototype={chunkSize:function(){return this.lines.length},removeInner:function(a,b){for(var c=a,d=a+b;d>c;++c){var e=this.lines[c];this.height-=e.height,Ee(e),Nf(e,"delete")}this.lines.splice(a,b)},collapse:function(a){a.push.apply(a,this.lines)},insertInner:function(a,b,c){this.height+=c,this.lines=this.lines.slice(0,a).concat(b).concat(this.lines.slice(a));for(var d=0;d<b.length;++d)b[d].parent=this},iterN:function(a,b,c){for(var d=a+b;d>a;++a)if(c(this.lines[a]))return!0}},$e.prototype={chunkSize:function(){return this.size},removeInner:function(a,b){this.size-=b;for(var c=0;c<this.children.length;++c){var d=this.children[c],e=d.chunkSize();if(e>a){var f=Math.min(b,e-a),g=d.height;if(d.removeInner(a,f),this.height-=g-d.height,e==f&&(this.children.splice(c--,1),d.parent=null),0==(b-=f))break;a=0}else a-=e}if(this.size-b<25&&(this.children.length>1||!(this.children[0]instanceof Ze))){var h=[];this.collapse(h),this.children=[new Ze(h)],this.children[0].parent=this}},collapse:function(a){for(var b=0;b<this.children.length;++b)this.children[b].collapse(a)},insertInner:function(a,b,c){this.size+=b.length,this.height+=c;for(var d=0;d<this.children.length;++d){var e=this.children[d],f=e.chunkSize();if(f>=a){if(e.insertInner(a,b,c),e.lines&&e.lines.length>50){for(;e.lines.length>50;){var g=e.lines.splice(e.lines.length-25,25),h=new Ze(g);e.height-=h.height,this.children.splice(d+1,0,h),h.parent=this}this.maybeSpill()}break}a-=f}},maybeSpill:function(){if(!(this.children.length<=10)){var a=this;do{var b=a.children.splice(a.children.length-5,5),c=new $e(b);if(a.parent){a.size-=c.size,a.height-=c.height;var e=dg(a.parent.children,a);a.parent.children.splice(e+1,0,c)}else{var d=new $e(a.children);d.parent=a,a.children=[d,c],a=d}c.parent=a.parent}while(a.children.length>10);a.parent.maybeSpill()}},iterN:function(a,b,c){for(var d=0;d<this.children.length;++d){var e=this.children[d],f=e.chunkSize();if(f>a){var g=Math.min(b,f-a);if(e.iterN(a,g,c))return!0;if(0==(b-=g))break;a=0}else a-=f}}};var _e=0,af=v.Doc=function(a,b,c,d){if(!(this instanceof af))return new af(a,b,c,d);null==c&&(c=0),$e.call(this,[new Ze([new Ce("",null)])]),this.first=c,this.scrollTop=this.scrollLeft=0,this.cantEdit=!1,this.cleanGeneration=1,this.frontier=c;var e=oa(c,0);this.sel=Ma(e),this.history=new of(null),this.id=++_e,this.modeOption=b,this.lineSep=d,"string"==typeof a&&(a=this.splitLines(a)),Ye(this,{from:e,to:e,text:a}),Za(this,Ma(e),Vf)};af.prototype=gg($e.prototype,{constructor:af,iter:function(a,b,c){c?this.iterN(a-this.first,b-a,c):this.iterN(this.first,this.first+this.size,a)},insert:function(a,b){for(var c=0,d=0;d<b.length;++d)c+=b[d].height;this.insertInner(a-this.first,b,c)},remove:function(a,b){this.removeInner(a-this.first,b)},getValue:function(a){var b=hf(this,this.first,this.first+this.size);return a===!1?b:b.join(a||this.lineSeparator())},setValue:fc(function(a){var b=oa(this.first,0),c=this.first+this.size-1;hd(this,{from:b,to:oa(c,ff(this,c).text.length),text:this.splitLines(a),origin:"setValue",full:!0},!0),Za(this,Ma(b))}),replaceRange:function(a,b,c,d){b=Oa(this,b),c=c?Oa(this,c):b,nd(this,a,b,c,d)},getRange:function(a,b,c){var d=gf(this,Oa(this,a),Oa(this,b));return c===!1?d:d.join(c||this.lineSeparator())},getLine:function(a){var b=this.getLineHandle(a);return b&&b.text},getLineHandle:function(a){return Qa(this,a)?ff(this,a):void 0},getLineNumber:function(a){return kf(a)},getLineHandleVisualStart:function(a){return"number"==typeof a&&(a=ff(this,a)),se(a)},lineCount:function(){return this.size},firstLine:function(){return this.first},lastLine:function(){return this.first+this.size-1},clipPos:function(a){return Oa(this,a)},getCursor:function(a){var c,b=this.sel.primary();return c=null==a||"head"==a?b.head:"anchor"==a?b.anchor:"end"==a||"to"==a||a===!1?b.to():b.from()},listSelections:function(){return this.sel.ranges},somethingSelected:function(){return this.sel.somethingSelected()},setCursor:fc(function(a,b,c){Wa(this,Oa(this,"number"==typeof a?oa(a,b||0):a),null,c)}),setSelection:fc(function(a,b,c){Wa(this,Oa(this,a),Oa(this,b||a),c)}),extendSelection:fc(function(a,b,c){Ta(this,Oa(this,a),b&&Oa(this,b),c)}),extendSelections:fc(function(a,b){Ua(this,Ra(this,a,b))}),extendSelectionsBy:fc(function(a,b){Ua(this,eg(this.sel.ranges,a),b)}),setSelections:fc(function(a,b,c){if(a.length){for(var d=0,e=[];d<a.length;d++)e[d]=new Ka(Oa(this,a[d].anchor),Oa(this,a[d].head));null==b&&(b=Math.min(a.length-1,this.sel.primIndex)),Za(this,La(e,b),c)}}),addSelection:fc(function(a,b,c){var d=this.sel.ranges.slice(0);d.push(new Ka(Oa(this,a),Oa(this,b||a))),Za(this,La(d,d.length-1),c)}),getSelection:function(a){for(var c,b=this.sel.ranges,d=0;d<b.length;d++){var e=gf(this,b[d].from(),b[d].to());c=c?c.concat(e):e}return a===!1?c:c.join(a||this.lineSeparator())},getSelections:function(a){for(var b=[],c=this.sel.ranges,d=0;d<c.length;d++){var e=gf(this,c[d].from(),c[d].to());a!==!1&&(e=e.join(a||this.lineSeparator())),b[d]=e}return b},replaceSelection:function(a,b,c){for(var d=[],e=0;e<this.sel.ranges.length;e++)d[e]=a;this.replaceSelections(d,b,c||"+input")},replaceSelections:fc(function(a,b,c){for(var d=[],e=this.sel,f=0;f<e.ranges.length;f++){var g=e.ranges[f];d[f]={from:g.from(),to:g.to(),text:this.splitLines(a[f]),origin:c}}for(var h=b&&"end"!=b&&fd(this,d,b),f=d.length-1;f>=0;f--)hd(this,d[f]);h?Ya(this,h):this.cm&&td(this.cm)}),undo:fc(function(){jd(this,"undo")}),redo:fc(function(){jd(this,"redo")}),undoSelection:fc(function(){jd(this,"undo",!0)}),redoSelection:fc(function(){jd(this,"redo",!0)}),setExtending:function(a){this.extend=a},getExtending:function(){return this.extend},historySize:function(){for(var a=this.history,b=0,c=0,d=0;d<a.done.length;d++)a.done[d].ranges||++b;for(var d=0;d<a.undone.length;d++)a.undone[d].ranges||++c;return{undo:b,redo:c}},clearHistory:function(){this.history=new of(this.history.maxGeneration)},markClean:function(){this.cleanGeneration=this.changeGeneration(!0)},changeGeneration:function(a){return a&&(this.history.lastOp=this.history.lastSelOp=this.history.lastOrigin=null),this.history.generation},isClean:function(a){return this.history.generation==(a||this.cleanGeneration)},getHistory:function(){return{done:zf(this.history.done),undone:zf(this.history.undone)}},setHistory:function(a){var b=this.history=new of(this.history.maxGeneration);b.done=zf(a.done.slice(0),null,!0),b.undone=zf(a.undone.slice(0),null,!0)},addLineClass:fc(function(a,b,c){return wd(this,a,"gutter"==b?"gutter":"class",function(a){var d="text"==b?"textClass":"background"==b?"bgClass":"gutter"==b?"gutterClass":"wrapClass";if(a[d]){if(vg(c).test(a[d]))return!1;a[d]+=" "+c}else a[d]=c;return!0})}),removeLineClass:fc(function(a,b,c){return wd(this,a,"gutter"==b?"gutter":"class",function(a){var d="text"==b?"textClass":"background"==b?"bgClass":"gutter"==b?"gutterClass":"wrapClass",e=a[d];if(!e)return!1;if(null==c)a[d]=null;else{var f=e.match(vg(c));if(!f)return!1;var g=f.index+f[0].length;a[d]=e.slice(0,f.index)+(f.index&&g!=e.length?" ":"")+e.slice(g)||null}return!0})}),addLineWidget:fc(function(a,b,c){return Be(this,a,b,c)}),removeLineWidget:function(a){a.clear()},markText:function(a,b,c){return Vd(this,Oa(this,a),Oa(this,b),c,"range")},setBookmark:function(a,b){var c={replacedWith:b&&(null==b.nodeType?b.widget:b),insertLeft:b&&b.insertLeft,clearWhenEmpty:!1,shared:b&&b.shared,handleMouseEvents:b&&b.handleMouseEvents};return a=Oa(this,a),Vd(this,a,a,c,"bookmark")},findMarksAt:function(a){a=Oa(this,a);var b=[],c=ff(this,a.line).markedSpans;if(c)for(var d=0;d<c.length;++d){var e=c[d];(null==e.from||e.from<=a.ch)&&(null==e.to||e.to>=a.ch)&&b.push(e.marker.parent||e.marker)}return b},findMarks:function(a,b,c){a=Oa(this,a),b=Oa(this,b);var d=[],e=a.line;return this.iter(a.line,b.line+1,function(f){var g=f.markedSpans;if(g)for(var h=0;h<g.length;h++){var i=g[h];e==a.line&&a.ch>i.to||null==i.from&&e!=a.line||e==b.line&&i.from>b.ch||c&&!c(i.marker)||d.push(i.marker.parent||i.marker)}++e}),d},getAllMarks:function(){var a=[];return this.iter(function(b){var c=b.markedSpans;if(c)for(var d=0;d<c.length;++d)null!=c[d].from&&a.push(c[d].marker)}),a},posFromIndex:function(a){var b,c=this.first;return this.iter(function(d){var e=d.text.length+1;return e>a?(b=a,!0):(a-=e,void++c)}),Oa(this,oa(c,b))},indexFromPos:function(a){a=Oa(this,a);var b=a.ch;return a.line<this.first||a.ch<0?0:(this.iter(this.first,a.line,function(a){b+=a.text.length+1}),b)},copy:function(a){var b=new af(hf(this,this.first,this.first+this.size),this.modeOption,this.first,this.lineSep);return b.scrollTop=this.scrollTop,b.scrollLeft=this.scrollLeft,b.sel=this.sel,b.extend=!1,a&&(b.history.undoDepth=this.history.undoDepth,b.setHistory(this.getHistory())),b},linkedDoc:function(a){a||(a={});var b=this.first,c=this.first+this.size;null!=a.from&&a.from>b&&(b=a.from),null!=a.to&&a.to<c&&(c=a.to);var d=new af(hf(this,b,c),a.mode||this.modeOption,b,this.lineSep);return a.sharedHist&&(d.history=this.history),(this.linked||(this.linked=[])).push({doc:d,sharedHist:a.sharedHist}),d.linked=[{doc:this,isParent:!0,sharedHist:a.sharedHist}],Zd(d,Yd(this)),d},unlinkDoc:function(a){if(a instanceof v&&(a=a.doc),this.linked)for(var b=0;b<this.linked.length;++b){var c=this.linked[b];if(c.doc==a){this.linked.splice(b,1),a.unlinkDoc(this),$d(Yd(this));break}}if(a.history==this.history){var d=[a.id];df(a,function(a){d.push(a.id)},!0),a.history=new of(null),a.history.done=zf(this.history.done,d),a.history.undone=zf(this.history.undone,d)}},iterLinkedDocs:function(a){df(this,a)},getMode:function(){return this.mode},getEditor:function(){return this.cm},splitLines:function(a){return this.lineSep?a.split(this.lineSep):Ig(a)},lineSeparator:function(){return this.lineSep||"\n"}}),af.prototype.eachLine=af.prototype.iter;var bf="iter insert remove copy getEditor constructor".split(" ");for(var cf in af.prototype)af.prototype.hasOwnProperty(cf)&&dg(bf,cf)<0&&(v.prototype[cf]=function(a){return function(){return a.apply(this.doc,arguments)}}(af.prototype[cf]));Sf(af);var Df=v.e_preventDefault=function(a){a.preventDefault?a.preventDefault():a.returnValue=!1},Ef=v.e_stopPropagation=function(a){a.stopPropagation?a.stopPropagation():a.cancelBubble=!0},Gf=v.e_stop=function(a){Df(a),Ef(a)},Jf=v.on=function(a,b,c){if(a.addEventListener)a.addEventListener(b,c,!1);else if(a.attachEvent)a.attachEvent("on"+b,c);else{var d=a._handlers||(a._handlers={}),e=d[b]||(d[b]=[]);e.push(c)}},Kf=v.off=function(a,b,c){if(a.removeEventListener)a.removeEventListener(b,c,!1);else if(a.detachEvent)a.detachEvent("on"+b,c);else{var d=a._handlers&&a._handlers[b];if(!d)return;for(var e=0;e<d.length;++e)if(d[e]==c){d.splice(e,1);break}}},Lf=v.signal=function(a,b){var c=a._handlers&&a._handlers[b];if(c)for(var d=Array.prototype.slice.call(arguments,2),e=0;e<c.length;++e)c[e].apply(null,d)},Mf=null,Tf=30,Uf=v.Pass={toString:function(){return"CodeMirror.Pass"}},Vf={scroll:!1},Wf={origin:"*mouse"},Xf={origin:"+move"};Yf.prototype.set=function(a,b){clearTimeout(this.id),this.id=setTimeout(b,a)};var Zf=v.countColumn=function(a,b,c,d,e){null==b&&(b=a.search(/[^\s\u00a0]/),-1==b&&(b=a.length));for(var f=d||0,g=e||0;;){var h=a.indexOf("	",f);if(0>h||h>=b)return g+(b-f);g+=h-f,g+=c-g%c,f=h+1}},$f=v.findColumn=function(a,b,c){for(var d=0,e=0;;){var f=a.indexOf("	",d);-1==f&&(f=a.length);var g=f-d;if(f==a.length||e+g>=b)return d+Math.min(g,b-e);if(e+=f-d,e+=c-e%c,d=f+1,e>=b)return d}},_f=[""],cg=function(a){a.select()};m?cg=function(a){a.selectionStart=0,a.selectionEnd=a.value.length}:d&&(cg=function(a){try{a.select()}catch(b){}});var qg,jg=/[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/,kg=v.isWordChar=function(a){return/\w/.test(a)||a>"\x80"&&(a.toUpperCase()!=a.toLowerCase()||jg.test(a))},ng=/[\u0300-\u036f\u0483-\u0489\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u065e\u0670\u06d6-\u06dc\u06de-\u06e4\u06e7\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0900-\u0902\u093c\u0941-\u0948\u094d\u0951-\u0955\u0962\u0963\u0981\u09bc\u09be\u09c1-\u09c4\u09cd\u09d7\u09e2\u09e3\u0a01\u0a02\u0a3c\u0a41\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a70\u0a71\u0a75\u0a81\u0a82\u0abc\u0ac1-\u0ac5\u0ac7\u0ac8\u0acd\u0ae2\u0ae3\u0b01\u0b3c\u0b3e\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b82\u0bbe\u0bc0\u0bcd\u0bd7\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0cbc\u0cbf\u0cc2\u0cc6\u0ccc\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0d3e\u0d41-\u0d44\u0d4d\u0d57\u0d62\u0d63\u0dca\u0dcf\u0dd2-\u0dd4\u0dd6\u0ddf\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0f18\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86\u0f87\u0f90-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039\u103a\u103d\u103e\u1058\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085\u1086\u108d\u109d\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927\u1928\u1932\u1939-\u193b\u1a17\u1a18\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80\u1b81\u1ba2-\u1ba5\u1ba8\u1ba9\u1c2c-\u1c33\u1c36\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1dc0-\u1de6\u1dfd-\u1dff\u200c\u200d\u20d0-\u20f0\u2cef-\u2cf1\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua66f-\ua672\ua67c\ua67d\ua6f0\ua6f1\ua802\ua806\ua80b\ua825\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\uaa29-\uaa2e\uaa31\uaa32\uaa35\uaa36\uaa43\uaa4c\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uabe5\uabe8\uabed\udc00-\udfff\ufb1e\ufe00-\ufe0f\ufe20-\ufe26\uff9e\uff9f]/;qg=document.createRange?function(a,b,c,d){var e=document.createRange();return e.setEnd(d||a,c),e.setStart(a,b),e}:function(a,b,c){var d=document.body.createTextRange();try{d.moveToElementText(a.parentNode)}catch(e){return d}return d.collapse(!0),d.moveEnd("character",c),d.moveStart("character",b),d};var tg=v.contains=function(a,b){if(3==b.nodeType&&(b=b.parentNode),a.contains)return a.contains(b);do if(11==b.nodeType&&(b=b.host),b==a)return!0;while(b=b.parentNode)};d&&11>e&&(ug=function(){try{return document.activeElement}catch(a){return document.body}});var Eg,Gg,wg=v.rmClass=function(a,b){var c=a.className,d=vg(b).exec(c);if(d){var e=c.slice(d.index+d[0].length);a.className=c.slice(0,d.index)+(e?d[1]+e:"")}},xg=v.addClass=function(a,b){var c=a.className;vg(b).test(c)||(a.className+=(c?" ":"")+b)},Ag=!1,Dg=function(){if(d&&9>e)return!1;var a=pg("div");return"draggable"in a||"dragDrop"in a}(),Ig=v.splitLines=3!="\n\nb".split(/\n/).length?function(a){for(var b=0,c=[],d=a.length;d>=b;){var e=a.indexOf("\n",b);-1==e&&(e=a.length);var f=a.slice(b,"\r"==a.charAt(e-1)?e-1:e),g=f.indexOf("\r");-1!=g?(c.push(f.slice(0,g)),b+=g+1):(c.push(f),b=e+1)}return c}:function(a){return a.split(/\r\n?|\n/)},Jg=window.getSelection?function(a){try{return a.selectionStart!=a.selectionEnd}catch(b){return!1}}:function(a){try{var b=a.ownerDocument.selection.createRange()}catch(c){}return b&&b.parentElement()==a?0!=b.compareEndPoints("StartToEnd",b):!1},Kg=function(){var a=pg("div");return"oncopy"in a?!0:(a.setAttribute("oncopy","return;"),"function"==typeof a.oncopy)}(),Lg=null,Ng={3:"Enter",8:"Backspace",9:"Tab",13:"Enter",16:"Shift",17:"Ctrl",18:"Alt",19:"Pause",20:"CapsLock",27:"Esc",32:"Space",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"Left",38:"Up",39:"Right",40:"Down",44:"PrintScrn",45:"Insert",46:"Delete",59:";",61:"=",91:"Mod",92:"Mod",93:"Mod",107:"=",109:"-",127:"Delete",173:"-",186:";",187:"=",188:",",189:"-",190:".",191:"/",192:"`",219:"[",220:"\\",221:"]",222:"'",63232:"Up",63233:"Down",63234:"Left",63235:"Right",63272:"Delete",63273:"Home",63275:"End",63276:"PageUp",63277:"PageDown",63302:"Insert"};v.keyNames=Ng,function(){for(var a=0;10>a;a++)Ng[a+48]=Ng[a+96]=String(a);for(var a=65;90>=a;a++)Ng[a]=String.fromCharCode(a);for(var a=1;12>=a;a++)Ng[a+111]=Ng[a+63235]="F"+a}();var Xg,ah=function(){function c(c){return 247>=c?a.charAt(c):c>=1424&&1524>=c?"R":c>=1536&&1773>=c?b.charAt(c-1536):c>=1774&&2220>=c?"r":c>=8192&&8203>=c?"w":8204==c?"b":"L"}function j(a,b,c){this.level=a,this.from=b,this.to=c}var a="bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN",b="rrrrrrrrrrrr,rNNmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmrrrrrrrnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmNmmmm",d=/[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac]/,e=/[stwN]/,f=/[LRr]/,g=/[Lb1n]/,h=/[1n]/,i="L";return function(a){if(!d.test(a))return!1;for(var m,b=a.length,k=[],l=0;b>l;++l)k.push(m=c(a.charCodeAt(l)));for(var l=0,n=i;b>l;++l){var m=k[l];"m"==m?k[l]=n:n=m}for(var l=0,o=i;b>l;++l){var m=k[l];"1"==m&&"r"==o?k[l]="n":f.test(m)&&(o=m,"r"==m&&(k[l]="R"))}for(var l=1,n=k[0];b-1>l;++l){var m=k[l];"+"==m&&"1"==n&&"1"==k[l+1]?k[l]="1":","!=m||n!=k[l+1]||"1"!=n&&"n"!=n||(k[l]=n),n=m}for(var l=0;b>l;++l){var m=k[l];if(","==m)k[l]="N";else if("%"==m){for(var p=l+1;b>p&&"%"==k[p];++p);for(var q=l&&"!"==k[l-1]||b>p&&"1"==k[p]?"1":"N",r=l;p>r;++r)k[r]=q;l=p-1}}for(var l=0,o=i;b>l;++l){var m=k[l];"L"==o&&"1"==m?k[l]="L":f.test(m)&&(o=m)}for(var l=0;b>l;++l)if(e.test(k[l])){for(var p=l+1;b>p&&e.test(k[p]);++p);for(var s="L"==(l?k[l-1]:i),t="L"==(b>p?k[p]:i),q=s||t?"L":"R",r=l;p>r;++r)k[r]=q;l=p-1}for(var v,u=[],l=0;b>l;)if(g.test(k[l])){var w=l;for(++l;b>l&&g.test(k[l]);++l);u.push(new j(0,w,l))}else{var x=l,y=u.length;for(++l;b>l&&"L"!=k[l];++l);for(var r=x;l>r;)if(h.test(k[r])){r>x&&u.splice(y,0,new j(1,x,r));var z=r;for(++r;l>r&&h.test(k[r]);++r);u.splice(y,0,new j(2,z,r)),x=r}else++r;l>x&&u.splice(y,0,new j(1,x,l))}return 1==u[0].level&&(v=a.match(/^\s+/))&&(u[0].from=v[0].length,u.unshift(new j(0,0,v[0].length))),1==bg(u).level&&(v=a.match(/\s+$/))&&(bg(u).to-=v[0].length,u.push(new j(0,b-v[0].length,b))),2==u[0].level&&u.unshift(new j(1,u[0].to,u[0].to)),u[0].level!=bg(u).level&&u.push(new j(u[0].level,b,b)),u}}();return v.version="5.6.1",v}),function(a){"object"==typeof exports&&"object"==typeof module?a(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],a):a(CodeMirror)}(function(a){"use strict";function b(a){for(var b={},c=0;c<a.length;++c)b[a[c]]=!0;return b}function x(a,b){for(var d,c=!1;null!=(d=a.next());){if(c&&"/"==d){b.tokenize=null;break}c="*"==d}return["comment","comment"]}a.defineMode("css",function(b,c){function u(a,b){return s=b,a}function v(a,b){var c=a.next();if(f[c]){var d=f[c](a,b);if(d!==!1)return d}return"@"==c?(a.eatWhile(/[\w\\\-]/),u("def",a.current())):"="==c||("~"==c||"|"==c)&&a.eat("=")?u(null,"compare"):'"'==c||"'"==c?(b.tokenize=w(c),b.tokenize(a,b)):"#"==c?(a.eatWhile(/[\w\\\-]/),u("atom","hash")):"!"==c?(a.match(/^\s*\w*/),u("keyword","important")):/\d/.test(c)||"."==c&&a.eat(/\d/)?(a.eatWhile(/[\w.%]/),u("number","unit")):"-"!==c?/[,+>*\/]/.test(c)?u(null,"select-op"):"."==c&&a.match(/^-?[_a-z][_a-z0-9-]*/i)?u("qualifier","qualifier"):/[:;{}\[\]\(\)]/.test(c)?u(null,c):"u"==c&&a.match(/rl(-prefix)?\(/)||"d"==c&&a.match("omain(")||"r"==c&&a.match("egexp(")?(a.backUp(1),b.tokenize=x,u("property","word")):/[\w\\\-]/.test(c)?(a.eatWhile(/[\w\\\-]/),u("property","word")):u(null,null):/[\d.]/.test(a.peek())?(a.eatWhile(/[\w.%]/),u("number","unit")):a.match(/^-[\w\\\-]+/)?(a.eatWhile(/[\w\\\-]/),a.match(/^\s*:/,!1)?u("variable-2","variable-definition"):u("variable-2","variable")):a.match(/^\w+-/)?u("meta","meta"):void 0}function w(a){return function(b,c){for(var e,d=!1;null!=(e=b.next());){if(e==a&&!d){")"==a&&b.backUp(1);break}d=!d&&"\\"==e}return(e==a||!d&&")"!=a)&&(c.tokenize=null),u("string","string")}}function x(a,b){return a.next(),a.match(/\s*[\"\')]/,!1)?b.tokenize=null:b.tokenize=w(")"),u(null,"(")}function y(a,b,c){this.type=a,this.indent=b,this.prev=c}function z(a,b,c,d){return a.context=new y(c,b.indentation()+(d===!1?0:e),a.context),c}function A(a){return a.context.prev&&(a.context=a.context.prev),a.context.type}function B(a,b,c){return E[c.context.type](a,b,c)}function C(a,b,c,d){for(var e=d||1;e>0;e--)c.context=c.context.prev;return B(a,b,c)}function D(a){var b=a.current().toLowerCase();t=p.hasOwnProperty(b)?"atom":o.hasOwnProperty(b)?"keyword":"variable"}var d=c;c.propertyKeywords||(c=a.resolveMode("text/css")),c.inline=d.inline;var s,t,e=b.indentUnit,f=c.tokenHooks,g=c.documentTypes||{},h=c.mediaTypes||{},i=c.mediaFeatures||{},j=c.mediaValueKeywords||{},k=c.propertyKeywords||{},l=c.nonStandardPropertyKeywords||{},m=c.fontProperties||{},n=c.counterDescriptors||{},o=c.colorKeywords||{},p=c.valueKeywords||{},q=c.allowNested,r=c.supportsAtComponent===!0,E={};return E.top=function(a,b,c){if("{"==a)return z(c,b,"block");if("}"==a&&c.context.prev)return A(c);if(r&&/@component/.test(a))return z(c,b,"atComponentBlock");if(/^@(-moz-)?document$/.test(a))return z(c,b,"documentTypes");if(/^@(media|supports|(-moz-)?document|import)$/.test(a))return z(c,b,"atBlock");if(/^@(font-face|counter-style)/.test(a))return c.stateArg=a,"restricted_atBlock_before";if(/^@(-(moz|ms|o|webkit)-)?keyframes$/.test(a))return"keyframes";if(a&&"@"==a.charAt(0))return z(c,b,"at");if("hash"==a)t="builtin";else if("word"==a)t="tag";else{if("variable-definition"==a)return"maybeprop";if("interpolation"==a)return z(c,b,"interpolation");if(":"==a)return"pseudo";if(q&&"("==a)return z(c,b,"parens")}return c.context.type},E.block=function(a,b,c){if("word"==a){var d=b.current().toLowerCase();return k.hasOwnProperty(d)?(t="property","maybeprop"):l.hasOwnProperty(d)?(t="string-2","maybeprop"):q?(t=b.match(/^\s*:(?:\s|$)/,!1)?"property":"tag","block"):(t+=" error","maybeprop")}return"meta"==a?"block":q||"hash"!=a&&"qualifier"!=a?E.top(a,b,c):(t="error","block")},E.maybeprop=function(a,b,c){return":"==a?z(c,b,"prop"):B(a,b,c)},E.prop=function(a,b,c){if(";"==a)return A(c);if("{"==a&&q)return z(c,b,"propBlock");if("}"==a||"{"==a)return C(a,b,c);if("("==a)return z(c,b,"parens");if("hash"!=a||/^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/.test(b.current())){if("word"==a)D(b);else if("interpolation"==a)return z(c,b,"interpolation")}else t+=" error";return"prop"},E.propBlock=function(a,b,c){return"}"==a?A(c):"word"==a?(t="property","maybeprop"):c.context.type},E.parens=function(a,b,c){return"{"==a||"}"==a?C(a,b,c):")"==a?A(c):"("==a?z(c,b,"parens"):"interpolation"==a?z(c,b,"interpolation"):("word"==a&&D(b),"parens")},E.pseudo=function(a,b,c){return"word"==a?(t="variable-3",c.context.type):B(a,b,c)},E.documentTypes=function(a,b,c){return"word"==a&&g.hasOwnProperty(b.current())?(t="tag",c.context.type):E.atBlock(a,b,c)},E.atBlock=function(a,b,c){if("("==a)return z(c,b,"atBlock_parens");if("}"==a||";"==a)return C(a,b,c);if("{"==a)return A(c)&&z(c,b,q?"block":"top");if("word"==a){var d=b.current().toLowerCase();t="only"==d||"not"==d||"and"==d||"or"==d?"keyword":h.hasOwnProperty(d)?"attribute":i.hasOwnProperty(d)?"property":j.hasOwnProperty(d)?"keyword":k.hasOwnProperty(d)?"property":l.hasOwnProperty(d)?"string-2":p.hasOwnProperty(d)?"atom":o.hasOwnProperty(d)?"keyword":"error"}return c.context.type},E.atComponentBlock=function(a,b,c){return"}"==a?C(a,b,c):"{"==a?A(c)&&z(c,b,q?"block":"top",!1):("word"==a&&(t="error"),c.context.type)},E.atBlock_parens=function(a,b,c){return")"==a?A(c):"{"==a||"}"==a?C(a,b,c,2):E.atBlock(a,b,c)},E.restricted_atBlock_before=function(a,b,c){return"{"==a?z(c,b,"restricted_atBlock"):"word"==a&&"@counter-style"==c.stateArg?(t="variable","restricted_atBlock_before"):B(a,b,c)},E.restricted_atBlock=function(a,b,c){return"}"==a?(c.stateArg=null,A(c)):"word"==a?(t="@font-face"==c.stateArg&&!m.hasOwnProperty(b.current().toLowerCase())||"@counter-style"==c.stateArg&&!n.hasOwnProperty(b.current().toLowerCase())?"error":"property","maybeprop"):"restricted_atBlock"},E.keyframes=function(a,b,c){return"word"==a?(t="variable","keyframes"):"{"==a?z(c,b,"top"):B(a,b,c)},E.at=function(a,b,c){return";"==a?A(c):"{"==a||"}"==a?C(a,b,c):("word"==a?t="tag":"hash"==a&&(t="builtin"),"at")},E.interpolation=function(a,b,c){return"}"==a?A(c):"{"==a||";"==a?C(a,b,c):("word"==a?t="variable":"variable"!=a&&"("!=a&&")"!=a&&(t="error"),"interpolation")},{startState:function(a){return{tokenize:null,state:c.inline?"block":"top",stateArg:null,context:new y(c.inline?"block":"top",a||0,null)}},token:function(a,b){if(!b.tokenize&&a.eatSpace())return null;var c=(b.tokenize||v)(a,b);return c&&"object"==typeof c&&(s=c[1],c=c[0]),t=c,b.state=E[b.state](s,a,b),t},indent:function(a,b){var c=a.context,d=b&&b.charAt(0),f=c.indent;
-return"prop"!=c.type||"}"!=d&&")"!=d||(c=c.prev),c.prev&&("}"!=d||"block"!=c.type&&"top"!=c.type&&"interpolation"!=c.type&&"restricted_atBlock"!=c.type?(")"==d&&("parens"==c.type||"atBlock_parens"==c.type)||"{"==d&&("at"==c.type||"atBlock"==c.type))&&(f=Math.max(0,c.indent-e),c=c.prev):(c=c.prev,f=c.indent)),f},electricChars:"}",blockCommentStart:"/*",blockCommentEnd:"*/",fold:"brace"}});var c=["domain","regexp","url","url-prefix"],d=b(c),e=["all","aural","braille","handheld","print","projection","screen","tty","tv","embossed"],f=b(e),g=["width","min-width","max-width","height","min-height","max-height","device-width","min-device-width","max-device-width","device-height","min-device-height","max-device-height","aspect-ratio","min-aspect-ratio","max-aspect-ratio","device-aspect-ratio","min-device-aspect-ratio","max-device-aspect-ratio","color","min-color","max-color","color-index","min-color-index","max-color-index","monochrome","min-monochrome","max-monochrome","resolution","min-resolution","max-resolution","scan","grid","orientation","device-pixel-ratio","min-device-pixel-ratio","max-device-pixel-ratio","pointer","any-pointer","hover","any-hover"],h=b(g),i=["landscape","portrait","none","coarse","fine","on-demand","hover","interlace","progressive"],j=b(i),k=["align-content","align-items","align-self","alignment-adjust","alignment-baseline","anchor-point","animation","animation-delay","animation-direction","animation-duration","animation-fill-mode","animation-iteration-count","animation-name","animation-play-state","animation-timing-function","appearance","azimuth","backface-visibility","background","background-attachment","background-clip","background-color","background-image","background-origin","background-position","background-repeat","background-size","baseline-shift","binding","bleed","bookmark-label","bookmark-level","bookmark-state","bookmark-target","border","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","bottom","box-decoration-break","box-shadow","box-sizing","break-after","break-before","break-inside","caption-side","clear","clip","color","color-profile","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","cue-after","cue-before","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","flex","flex-basis","flex-direction","flex-flow","flex-grow","flex-shrink","flex-wrap","float","float-offset","flow-from","flow-into","font","font-feature-settings","font-family","font-kerning","font-language-override","font-size","font-size-adjust","font-stretch","font-style","font-synthesis","font-variant","font-variant-alternates","font-variant-caps","font-variant-east-asian","font-variant-ligatures","font-variant-numeric","font-variant-position","font-weight","grid","grid-area","grid-auto-columns","grid-auto-flow","grid-auto-position","grid-auto-rows","grid-column","grid-column-end","grid-column-start","grid-row","grid-row-end","grid-row-start","grid-template","grid-template-areas","grid-template-columns","grid-template-rows","hanging-punctuation","height","hyphens","icon","image-orientation","image-rendering","image-resolution","inline-box-align","justify-content","left","letter-spacing","line-break","line-height","line-stacking","line-stacking-ruby","line-stacking-shift","line-stacking-strategy","list-style","list-style-image","list-style-position","list-style-type","margin","margin-bottom","margin-left","margin-right","margin-top","marker-offset","marks","marquee-direction","marquee-loop","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","object-fit","object-position","opacity","order","orphans","outline","outline-color","outline-offset","outline-style","outline-width","overflow","overflow-style","overflow-wrap","overflow-x","overflow-y","padding","padding-bottom","padding-left","padding-right","padding-top","page","page-break-after","page-break-before","page-break-inside","page-policy","pause","pause-after","pause-before","perspective","perspective-origin","pitch","pitch-range","play-during","position","presentation-level","punctuation-trim","quotes","region-break-after","region-break-before","region-break-inside","region-fragment","rendering-intent","resize","rest","rest-after","rest-before","richness","right","rotation","rotation-point","ruby-align","ruby-overhang","ruby-position","ruby-span","shape-image-threshold","shape-inside","shape-margin","shape-outside","size","speak","speak-as","speak-header","speak-numeral","speak-punctuation","speech-rate","stress","string-set","tab-size","table-layout","target","target-name","target-new","target-position","text-align","text-align-last","text-decoration","text-decoration-color","text-decoration-line","text-decoration-skip","text-decoration-style","text-emphasis","text-emphasis-color","text-emphasis-position","text-emphasis-style","text-height","text-indent","text-justify","text-outline","text-overflow","text-shadow","text-size-adjust","text-space-collapse","text-transform","text-underline-position","text-wrap","top","transform","transform-origin","transform-style","transition","transition-delay","transition-duration","transition-property","transition-timing-function","unicode-bidi","vertical-align","visibility","voice-balance","voice-duration","voice-family","voice-pitch","voice-range","voice-rate","voice-stress","voice-volume","volume","white-space","widows","width","word-break","word-spacing","word-wrap","z-index","clip-path","clip-rule","mask","enable-background","filter","flood-color","flood-opacity","lighting-color","stop-color","stop-opacity","pointer-events","color-interpolation","color-interpolation-filters","color-rendering","fill","fill-opacity","fill-rule","image-rendering","marker","marker-end","marker-mid","marker-start","shape-rendering","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","text-rendering","baseline-shift","dominant-baseline","glyph-orientation-horizontal","glyph-orientation-vertical","text-anchor","writing-mode"],l=b(k),m=["scrollbar-arrow-color","scrollbar-base-color","scrollbar-dark-shadow-color","scrollbar-face-color","scrollbar-highlight-color","scrollbar-shadow-color","scrollbar-3d-light-color","scrollbar-track-color","shape-inside","searchfield-cancel-button","searchfield-decoration","searchfield-results-button","searchfield-results-decoration","zoom"],n=b(m),o=["font-family","src","unicode-range","font-variant","font-feature-settings","font-stretch","font-weight","font-style"],p=b(o),q=["additive-symbols","fallback","negative","pad","prefix","range","speak-as","suffix","symbols","system"],r=b(q),s=["aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","grey","green","greenyellow","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgreen","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","rebeccapurple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","snow","springgreen","steelblue","tan","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen"],t=b(s),u=["above","absolute","activeborder","additive","activecaption","afar","after-white-space","ahead","alias","all","all-scroll","alphabetic","alternate","always","amharic","amharic-abegede","antialiased","appworkspace","arabic-indic","armenian","asterisks","attr","auto","avoid","avoid-column","avoid-page","avoid-region","background","backwards","baseline","below","bidi-override","binary","bengali","blink","block","block-axis","bold","bolder","border","border-box","both","bottom","break","break-all","break-word","bullets","button","button-bevel","buttonface","buttonhighlight","buttonshadow","buttontext","calc","cambodian","capitalize","caps-lock-indicator","caption","captiontext","caret","cell","center","checkbox","circle","cjk-decimal","cjk-earthly-branch","cjk-heavenly-stem","cjk-ideographic","clear","clip","close-quote","col-resize","collapse","column","column-reverse","compact","condensed","contain","content","content-box","context-menu","continuous","copy","counter","counters","cover","crop","cross","crosshair","currentcolor","cursive","cyclic","dashed","decimal","decimal-leading-zero","default","default-button","destination-atop","destination-in","destination-out","destination-over","devanagari","disc","discard","disclosure-closed","disclosure-open","document","dot-dash","dot-dot-dash","dotted","double","down","e-resize","ease","ease-in","ease-in-out","ease-out","element","ellipse","ellipsis","embed","end","ethiopic","ethiopic-abegede","ethiopic-abegede-am-et","ethiopic-abegede-gez","ethiopic-abegede-ti-er","ethiopic-abegede-ti-et","ethiopic-halehame-aa-er","ethiopic-halehame-aa-et","ethiopic-halehame-am-et","ethiopic-halehame-gez","ethiopic-halehame-om-et","ethiopic-halehame-sid-et","ethiopic-halehame-so-et","ethiopic-halehame-ti-er","ethiopic-halehame-ti-et","ethiopic-halehame-tig","ethiopic-numeric","ew-resize","expanded","extends","extra-condensed","extra-expanded","fantasy","fast","fill","fixed","flat","flex","flex-end","flex-start","footnotes","forwards","from","geometricPrecision","georgian","graytext","groove","gujarati","gurmukhi","hand","hangul","hangul-consonant","hebrew","help","hidden","hide","higher","highlight","highlighttext","hiragana","hiragana-iroha","horizontal","hsl","hsla","icon","ignore","inactiveborder","inactivecaption","inactivecaptiontext","infinite","infobackground","infotext","inherit","initial","inline","inline-axis","inline-block","inline-flex","inline-table","inset","inside","intrinsic","invert","italic","japanese-formal","japanese-informal","justify","kannada","katakana","katakana-iroha","keep-all","khmer","korean-hangul-formal","korean-hanja-formal","korean-hanja-informal","landscape","lao","large","larger","left","level","lighter","line-through","linear","linear-gradient","lines","list-item","listbox","listitem","local","logical","loud","lower","lower-alpha","lower-armenian","lower-greek","lower-hexadecimal","lower-latin","lower-norwegian","lower-roman","lowercase","ltr","malayalam","match","matrix","matrix3d","media-controls-background","media-current-time-display","media-fullscreen-button","media-mute-button","media-play-button","media-return-to-realtime-button","media-rewind-button","media-seek-back-button","media-seek-forward-button","media-slider","media-sliderthumb","media-time-remaining-display","media-volume-slider","media-volume-slider-container","media-volume-sliderthumb","medium","menu","menulist","menulist-button","menulist-text","menulist-textfield","menutext","message-box","middle","min-intrinsic","mix","mongolian","monospace","move","multiple","myanmar","n-resize","narrower","ne-resize","nesw-resize","no-close-quote","no-drop","no-open-quote","no-repeat","none","normal","not-allowed","nowrap","ns-resize","numbers","numeric","nw-resize","nwse-resize","oblique","octal","open-quote","optimizeLegibility","optimizeSpeed","oriya","oromo","outset","outside","outside-shape","overlay","overline","padding","padding-box","painted","page","paused","persian","perspective","plus-darker","plus-lighter","pointer","polygon","portrait","pre","pre-line","pre-wrap","preserve-3d","progress","push-button","radial-gradient","radio","read-only","read-write","read-write-plaintext-only","rectangle","region","relative","repeat","repeating-linear-gradient","repeating-radial-gradient","repeat-x","repeat-y","reset","reverse","rgb","rgba","ridge","right","rotate","rotate3d","rotateX","rotateY","rotateZ","round","row","row-resize","row-reverse","rtl","run-in","running","s-resize","sans-serif","scale","scale3d","scaleX","scaleY","scaleZ","scroll","scrollbar","se-resize","searchfield","searchfield-cancel-button","searchfield-decoration","searchfield-results-button","searchfield-results-decoration","semi-condensed","semi-expanded","separate","serif","show","sidama","simp-chinese-formal","simp-chinese-informal","single","skew","skewX","skewY","skip-white-space","slide","slider-horizontal","slider-vertical","sliderthumb-horizontal","sliderthumb-vertical","slow","small","small-caps","small-caption","smaller","solid","somali","source-atop","source-in","source-out","source-over","space","space-around","space-between","spell-out","square","square-button","start","static","status-bar","stretch","stroke","sub","subpixel-antialiased","super","sw-resize","symbolic","symbols","table","table-caption","table-cell","table-column","table-column-group","table-footer-group","table-header-group","table-row","table-row-group","tamil","telugu","text","text-bottom","text-top","textarea","textfield","thai","thick","thin","threeddarkshadow","threedface","threedhighlight","threedlightshadow","threedshadow","tibetan","tigre","tigrinya-er","tigrinya-er-abegede","tigrinya-et","tigrinya-et-abegede","to","top","trad-chinese-formal","trad-chinese-informal","translate","translate3d","translateX","translateY","translateZ","transparent","ultra-condensed","ultra-expanded","underline","up","upper-alpha","upper-armenian","upper-greek","upper-hexadecimal","upper-latin","upper-norwegian","upper-roman","uppercase","urdu","url","var","vertical","vertical-text","visible","visibleFill","visiblePainted","visibleStroke","visual","w-resize","wait","wave","wider","window","windowframe","windowtext","words","wrap","wrap-reverse","x-large","x-small","xor","xx-large","xx-small"],v=b(u),w=c.concat(e).concat(g).concat(i).concat(k).concat(m).concat(s).concat(u);a.registerHelper("hintWords","css",w),a.defineMIME("text/css",{documentTypes:d,mediaTypes:f,mediaFeatures:h,mediaValueKeywords:j,propertyKeywords:l,nonStandardPropertyKeywords:n,fontProperties:p,counterDescriptors:r,colorKeywords:t,valueKeywords:v,tokenHooks:{"/":function(a,b){return a.eat("*")?(b.tokenize=x,x(a,b)):!1}},name:"css"}),a.defineMIME("text/x-scss",{mediaTypes:f,mediaFeatures:h,mediaValueKeywords:j,propertyKeywords:l,nonStandardPropertyKeywords:n,colorKeywords:t,valueKeywords:v,fontProperties:p,allowNested:!0,tokenHooks:{"/":function(a,b){return a.eat("/")?(a.skipToEnd(),["comment","comment"]):a.eat("*")?(b.tokenize=x,x(a,b)):["operator","operator"]},":":function(a){return a.match(/\s*\{/)?[null,"{"]:!1},$:function(a){return a.match(/^[\w-]+/),a.match(/^\s*:/,!1)?["variable-2","variable-definition"]:["variable-2","variable"]},"#":function(a){return a.eat("{")?[null,"interpolation"]:!1}},name:"css",helperType:"scss"}),a.defineMIME("text/x-less",{mediaTypes:f,mediaFeatures:h,mediaValueKeywords:j,propertyKeywords:l,nonStandardPropertyKeywords:n,colorKeywords:t,valueKeywords:v,fontProperties:p,allowNested:!0,tokenHooks:{"/":function(a,b){return a.eat("/")?(a.skipToEnd(),["comment","comment"]):a.eat("*")?(b.tokenize=x,x(a,b)):["operator","operator"]},"@":function(a){return a.eat("{")?[null,"interpolation"]:a.match(/^(charset|document|font-face|import|(-(moz|ms|o|webkit)-)?keyframes|media|namespace|page|supports)\b/,!1)?!1:(a.eatWhile(/[\w\\\-]/),a.match(/^\s*:/,!1)?["variable-2","variable-definition"]:["variable-2","variable"])},"&":function(){return["atom","atom"]}},name:"css",helperType:"less"}),a.defineMIME("text/x-gss",{documentTypes:d,mediaTypes:f,mediaFeatures:h,propertyKeywords:l,nonStandardPropertyKeywords:n,fontProperties:p,counterDescriptors:r,colorKeywords:t,valueKeywords:v,supportsAtComponent:!0,tokenHooks:{"/":function(a,b){return a.eat("*")?(b.tokenize=x,x(a,b)):!1}},name:"css",helperType:"gss"})}),function(a){"object"==typeof exports&&"object"==typeof module?a(require("../../lib/codemirror"),require("../xml/xml"),require("../javascript/javascript"),require("../css/css")):"function"==typeof define&&define.amd?define(["../../lib/codemirror","../xml/xml","../javascript/javascript","../css/css"],a):a(CodeMirror)}(function(a){"use strict";function c(a,b,c){var d=a.current(),e=d.search(b);return e>-1?a.backUp(d.length-e):d.match(/<\/?$/)&&(a.backUp(d.length),a.match(b,!1)||a.match(d)),c}function e(a){var b=d[a];return b?b:d[a]=new RegExp("\\s+"+a+"\\s*=\\s*('|\")?([^'\"]+)('|\")?\\s*")}function f(a,b){for(var d,c=a.pos;c>=0&&"<"!==a.string.charAt(c);)c--;return 0>c?c:(d=a.string.slice(c,a.pos).match(e(b)))?d[2]:""}function g(a,b){return new RegExp((b?"^":"")+"</s*"+a+"s*>","i")}function h(a,b){for(var c in a)for(var d=b[c]||(b[c]=[]),e=a[c],f=e.length-1;f>=0;f--)d.unshift(e[f])}function i(a,b){for(var c=0;c<a.length;c++){var d=a[c];if(!d[0]||d[1].test(f(b,d[0])))return d[2]}}var b={script:[["lang",/(javascript|babel)/i,"javascript"],["type",/^(?:text|application)\/(?:x-)?(?:java|ecma)script$|^$/i,"javascript"],["type",/./,"text/plain"],[null,null,"javascript"]],style:[["lang",/^css$/i,"css"],["type",/^(text\/)?(x-)?(stylesheet|css)$/i,"css"],["type",/./,"text/plain"],[null,null,"css"]]},d={};a.defineMode("htmlmixed",function(d,e){function n(b,e){var m,h=e.htmlState.tagName,k=h&&j[h.toLowerCase()],l=f.token(b,e.htmlState);if(k&&/\btag\b/.test(l)&&">"===b.current()&&(m=i(k,b))){var o=a.getMode(d,m),p=g(h,!0),q=g(h,!1);e.token=function(a,b){return a.match(p,!1)?(b.token=n,b.localState=b.localMode=null,null):c(a,q,b.localMode.token(a,b.localState))},e.localMode=o,e.localState=a.startState(o,f.indent(e.htmlState,""))}return l}var f=a.getMode(d,{name:"xml",htmlMode:!0,multilineTagIndentFactor:e.multilineTagIndentFactor,multilineTagIndentPastTag:e.multilineTagIndentPastTag}),j={},k=e&&e.tags,l=e&&e.scriptTypes;if(h(b,j),k&&h(k,j),l)for(var m=l.length-1;m>=0;m--)j.script.unshift(["type",l[m].matches,l[m].mode]);return{startState:function(){var a=f.startState();return{token:n,localMode:null,localState:null,htmlState:a}},copyState:function(b){var c;return b.localState&&(c=a.copyState(b.localMode,b.localState)),{token:b.token,localMode:b.localMode,localState:c,htmlState:a.copyState(f,b.htmlState)}},token:function(a,b){return b.token(a,b)},indent:function(b,c){return!b.localMode||/^\s*<\//.test(c)?f.indent(b.htmlState,c):b.localMode.indent?b.localMode.indent(b.localState,c):a.Pass},innerMode:function(a){return{state:a.localState||a.htmlState,mode:a.localMode||f}}}},"xml","javascript","css"),a.defineMIME("text/html","htmlmixed")}),function(a){"object"==typeof exports&&"object"==typeof module?a(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],a):a(CodeMirror)}(function(a){"use strict";a.defineMode("javascript",function(b,c){function m(a){for(var c,b=!1,d=!1;null!=(c=a.next());){if(!b){if("/"==c&&!d)return;"["==c?d=!0:d&&"]"==c&&(d=!1)}b=!b&&"\\"==c}}function p(a,b,c){return n=a,o=c,b}function q(a,b){var c=a.next();if('"'==c||"'"==c)return b.tokenize=r(c),b.tokenize(a,b);if("."==c&&a.match(/^\d+(?:[eE][+\-]?\d+)?/))return p("number","number");if("."==c&&a.match(".."))return p("spread","meta");if(/[\[\]{}\(\),;\:\.]/.test(c))return p(c);if("="==c&&a.eat(">"))return p("=>","operator");if("0"==c&&a.eat(/x/i))return a.eatWhile(/[\da-f]/i),p("number","number");if(/\d/.test(c))return a.match(/^\d*(?:\.\d*)?(?:[eE][+\-]?\d+)?/),p("number","number");if("/"==c)return a.eat("*")?(b.tokenize=s,s(a,b)):a.eat("/")?(a.skipToEnd(),p("comment","comment")):"operator"==b.lastType||"keyword c"==b.lastType||"sof"==b.lastType||/^[\[{}\(,;:]$/.test(b.lastType)?(m(a),a.match(/^\b(([gimyu])(?![gimyu]*\2))+\b/),p("regexp","string-2")):(a.eatWhile(k),p("operator","operator",a.current()));if("`"==c)return b.tokenize=t,t(a,b);if("#"==c)return a.skipToEnd(),p("error","error");if(k.test(c))return a.eatWhile(k),p("operator","operator",a.current());if(i.test(c)){a.eatWhile(i);var d=a.current(),e=j.propertyIsEnumerable(d)&&j[d];return e&&"."!=b.lastType?p(e.type,e.style,d):p("variable","variable",d)}}function r(a){return function(b,c){var e,d=!1;if(f&&"@"==b.peek()&&b.match(l))return c.tokenize=q,p("jsonld-keyword","meta");for(;null!=(e=b.next())&&(e!=a||d);)d=!d&&"\\"==e;return d||(c.tokenize=q),p("string","string")}}function s(a,b){for(var d,c=!1;d=a.next();){if("/"==d&&c){b.tokenize=q;break}c="*"==d}return p("comment","comment")}function t(a,b){for(var d,c=!1;null!=(d=a.next());){if(!c&&("`"==d||"$"==d&&a.eat("{"))){b.tokenize=q;break}c=!c&&"\\"==d}return p("quasi","string-2",a.current())}function v(a,b){b.fatArrowAt&&(b.fatArrowAt=null);var c=a.string.indexOf("=>",a.start);if(!(0>c)){for(var d=0,e=!1,f=c-1;f>=0;--f){var g=a.string.charAt(f),h=u.indexOf(g);if(h>=0&&3>h){if(!d){++f;break}if(0==--d)break}else if(h>=3&&6>h)++d;else if(i.test(g))e=!0;else{if(/["'\/]/.test(g))return;if(e&&!d){++f;break}}}e&&!d&&(b.fatArrowAt=f)}}function x(a,b,c,d,e,f){this.indented=a,this.column=b,this.type=c,this.prev=e,this.info=f,null!=d&&(this.align=d)}function y(a,b){for(var c=a.localVars;c;c=c.next)if(c.name==b)return!0;for(var d=a.context;d;d=d.prev)for(var c=d.vars;c;c=c.next)if(c.name==b)return!0}function z(a,b,c,d,e){var f=a.cc;for(A.state=a,A.stream=e,A.marked=null,A.cc=f,A.style=b,a.lexical.hasOwnProperty("align")||(a.lexical.align=!0);;){var h=f.length?f.pop():g?L:K;if(h(c,d)){for(;f.length&&f[f.length-1].lex;)f.pop()();return A.marked?A.marked:"variable"==c&&y(a,d)?"variable-2":b}}}function B(){for(var a=arguments.length-1;a>=0;a--)A.cc.push(arguments[a])}function C(){return B.apply(null,arguments),!0}function D(a){function b(b){for(var c=b;c;c=c.next)if(c.name==a)return!0;return!1}var d=A.state;if(d.context){if(A.marked="def",b(d.localVars))return;d.localVars={name:a,next:d.localVars}}else{if(b(d.globalVars))return;c.globalVars&&(d.globalVars={name:a,next:d.globalVars})}}function F(){A.state.context={prev:A.state.context,vars:A.state.localVars},A.state.localVars=E}function G(){A.state.localVars=A.state.context.vars,A.state.context=A.state.context.prev}function H(a,b){var c=function(){var c=A.state,d=c.indented;if("stat"==c.lexical.type)d=c.lexical.indented;else for(var e=c.lexical;e&&")"==e.type&&e.align;e=e.prev)d=e.indented;c.lexical=new x(d,A.stream.column(),a,null,c.lexical,b)};return c.lex=!0,c}function I(){var a=A.state;a.lexical.prev&&(")"==a.lexical.type&&(a.indented=a.lexical.indented),a.lexical=a.lexical.prev)}function J(a){function b(c){return c==a?C():";"==a?B():C(b)}return b}function K(a,b){return"var"==a?C(H("vardef",b.length),fa,J(";"),I):"keyword a"==a?C(H("form"),L,K,I):"keyword b"==a?C(H("form"),K,I):"{"==a?C(H("}"),ba,I):";"==a?C():"if"==a?("else"==A.state.lexical.info&&A.state.cc[A.state.cc.length-1]==I&&A.state.cc.pop()(),C(H("form"),L,K,I,ka)):"function"==a?C(qa):"for"==a?C(H("form"),la,K,I):"variable"==a?C(H("stat"),W):"switch"==a?C(H("form"),L,H("}","switch"),J("{"),ba,I,I):"case"==a?C(L,J(":")):"default"==a?C(J(":")):"catch"==a?C(H("form"),F,J("("),ra,J(")"),K,I,G):"class"==a?C(H("form"),sa,I):"export"==a?C(H("form"),wa,I):"import"==a?C(H("form"),xa,I):B(H("stat"),L,J(";"),I)}function L(a){return N(a,!1)}function M(a){return N(a,!0)}function N(a,b){if(A.state.fatArrowAt==A.stream.start){var c=b?V:U;if("("==a)return C(F,H(")"),_(ga,")"),I,J("=>"),c,G);if("variable"==a)return B(F,ga,J("=>"),c,G)}var d=b?R:Q;return w.hasOwnProperty(a)?C(d):"async"==a?C(L):"function"==a?C(qa,d):"keyword c"==a?C(b?P:O):"("==a?C(H(")"),O,Da,J(")"),I,d):"operator"==a||"spread"==a?C(b?M:L):"["==a?C(H("]"),Ba,I,d):"{"==a?aa(Y,"}",null,d):"quasi"==a?B(S,d):C()}function O(a){return a.match(/[;\}\)\],]/)?B():B(L)}function P(a){return a.match(/[;\}\)\],]/)?B():B(M)}function Q(a,b){return","==a?C(L):R(a,b,!1)}function R(a,b,c){var d=0==c?Q:R,e=0==c?L:M;return"=>"==a?C(F,c?V:U,G):"operator"==a?/\+\+|--/.test(b)?C(d):"?"==b?C(L,J(":"),e):C(e):"quasi"==a?B(S,d):";"!=a?"("==a?aa(M,")","call",d):"."==a?C(X,d):"["==a?C(H("]"),O,J("]"),I,d):void 0:void 0}function S(a,b){return"quasi"!=a?B():"${"!=b.slice(b.length-2)?C(S):C(L,T)}function T(a){return"}"==a?(A.marked="string-2",A.state.tokenize=t,C(S)):void 0}function U(a){return v(A.stream,A.state),B("{"==a?K:L)}function V(a){return v(A.stream,A.state),B("{"==a?K:M)}function W(a){return":"==a?C(I,K):B(Q,J(";"),I)}function X(a){return"variable"==a?(A.marked="property",C()):void 0}function Y(a,b){return"async"==a?C(Y):"variable"==a||"keyword"==A.style?(A.marked="property",C("get"==b||"set"==b?Z:$)):"number"==a||"string"==a?(A.marked=f?"property":A.style+" property",C($)):"jsonld-keyword"==a?C($):"["==a?C(L,J("]"),$):void 0}function Z(a){return"variable"!=a?B($):(A.marked="property",C(qa))}function $(a){return":"==a?C(M):"("==a?B(qa):void 0}function _(a,b){function c(d){if(","==d){var e=A.state.lexical;return"call"==e.info&&(e.pos=(e.pos||0)+1),C(a,c)}return d==b?C():C(J(b))}return function(d){return d==b?C():B(a,c)}}function aa(a,b,c){for(var d=3;d<arguments.length;d++)A.cc.push(arguments[d]);return C(H(b,c),_(a,b),I)}function ba(a){return"}"==a?C():B(K,ba)}function ca(a){return h&&":"==a?C(ea):void 0}function da(a,b){return"="==b?C(M):void 0}function ea(a){return"variable"==a?(A.marked="variable-3",C()):void 0}function fa(){return B(ga,ca,ia,ja)}function ga(a,b){return"variable"==a?(D(b),C()):"["==a?aa(ga,"]"):"{"==a?aa(ha,"}"):void 0}function ha(a,b){return"variable"!=a||A.stream.match(/^\s*:/,!1)?("variable"==a&&(A.marked="property"),C(J(":"),ga,ia)):(D(b),C(ia))}function ia(a,b){return"="==b?C(M):void 0}function ja(a){return","==a?C(fa):void 0}function ka(a,b){return"keyword b"==a&&"else"==b?C(H("form","else"),K,I):void 0}function la(a){return"("==a?C(H(")"),ma,J(")"),I):void 0}function ma(a){return"var"==a?C(fa,J(";"),oa):";"==a?C(oa):"variable"==a?C(na):B(L,J(";"),oa)}function na(a,b){return"in"==b||"of"==b?(A.marked="keyword",C(L)):C(Q,oa)}function oa(a,b){return";"==a?C(pa):"in"==b||"of"==b?(A.marked="keyword",C(L)):B(L,J(";"),pa)}function pa(a){")"!=a&&C(L)}function qa(a,b){return"*"==b?(A.marked="keyword",C(qa)):"variable"==a?(D(b),C(qa)):"("==a?C(F,H(")"),_(ra,")"),I,K,G):void 0}function ra(a){return"spread"==a?C(ra):B(ga,ca,da)}function sa(a,b){return"variable"==a?(D(b),C(ta)):void 0}function ta(a,b){return"extends"==b?C(L,ta):"{"==a?C(H("}"),ua,I):void 0}function ua(a,b){return"variable"==a||"keyword"==A.style?"static"==b?(A.marked="keyword",C(ua)):(A.marked="property","get"==b||"set"==b?C(va,qa,ua):C(qa,ua)):"*"==b?(A.marked="keyword",C(ua)):";"==a?C(ua):"}"==a?C():void 0}function va(a){return"variable"!=a?B():(A.marked="property",C())}function wa(a,b){return"*"==b?(A.marked="keyword",C(Aa,J(";"))):"default"==b?(A.marked="keyword",C(L,J(";"))):B(K)}function xa(a){return"string"==a?C():B(ya,Aa)}function ya(a,b){return"{"==a?aa(ya,"}"):("variable"==a&&D(b),"*"==b&&(A.marked="keyword"),C(za))}function za(a,b){return"as"==b?(A.marked="keyword",C(ya)):void 0}function Aa(a,b){return"from"==b?(A.marked="keyword",C(L)):void 0}function Ba(a){return"]"==a?C():B(M,Ca)}function Ca(a){return"for"==a?B(Da,J("]")):","==a?C(_(P,"]")):B(_(M,"]"))}function Da(a){return"for"==a?C(la,Da):"if"==a?C(L,Da):void 0}function Ea(a,b){return"operator"==a.lastType||","==a.lastType||k.test(b.charAt(0))||/[,.]/.test(b.charAt(0))}var n,o,d=b.indentUnit,e=c.statementIndent,f=c.jsonld,g=c.json||f,h=c.typescript,i=c.wordCharacters||/[\w$\xa1-\uffff]/,j=function(){function a(a){return{type:a,style:"keyword"}}var b=a("keyword a"),c=a("keyword b"),d=a("keyword c"),e=a("operator"),f={type:"atom",style:"atom"},g={"if":a("if"),"while":b,"with":b,"else":c,"do":c,"try":c,"finally":c,"return":d,"break":d,"continue":d,"new":d,"delete":d,"throw":d,"debugger":d,"var":a("var"),"const":a("var"),let:a("var"),async:a("async"),"function":a("function"),"catch":a("catch"),"for":a("for"),"switch":a("switch"),"case":a("case"),"default":a("default"),"in":e,"typeof":e,"instanceof":e,"true":f,"false":f,"null":f,undefined:f,NaN:f,Infinity:f,"this":a("this"),"class":a("class"),"super":a("atom"),await:d,"yield":d,"export":a("export"),"import":a("import"),"extends":d};if(h){var i={type:"variable",style:"variable-3"},j={"interface":a("interface"),"extends":a("extends"),constructor:a("constructor"),"public":a("public"),"private":a("private"),"protected":a("protected"),"static":a("static"),string:i,number:i,bool:i,any:i};for(var k in j)g[k]=j[k]}return g}(),k=/[+\-*&%=<>!?|~^]/,l=/^@(context|id|value|language|type|container|list|set|reverse|index|base|vocab|graph)"/,u="([{}])",w={atom:!0,number:!0,variable:!0,string:!0,regexp:!0,"this":!0,"jsonld-keyword":!0},A={state:null,column:null,marked:null,cc:null},E={name:"this",next:{name:"arguments"}};return I.lex=!0,{startState:function(a){var b={tokenize:q,lastType:"sof",cc:[],lexical:new x((a||0)-d,0,"block",!1),localVars:c.localVars,context:c.localVars&&{vars:c.localVars},indented:0};return c.globalVars&&"object"==typeof c.globalVars&&(b.globalVars=c.globalVars),b},token:function(a,b){if(a.sol()&&(b.lexical.hasOwnProperty("align")||(b.lexical.align=!1),b.indented=a.indentation(),v(a,b)),b.tokenize!=s&&a.eatSpace())return null;var c=b.tokenize(a,b);return"comment"==n?c:(b.lastType="operator"!=n||"++"!=o&&"--"!=o?n:"incdec",z(b,c,n,o,a))},indent:function(b,f){if(b.tokenize==s)return a.Pass;if(b.tokenize!=q)return 0;var g=f&&f.charAt(0),h=b.lexical;if(!/^\s*else\b/.test(f))for(var i=b.cc.length-1;i>=0;--i){var j=b.cc[i];if(j==I)h=h.prev;else if(j!=ka)break}"stat"==h.type&&"}"==g&&(h=h.prev),e&&")"==h.type&&"stat"==h.prev.type&&(h=h.prev);var k=h.type,l=g==k;return"vardef"==k?h.indented+("operator"==b.lastType||","==b.lastType?h.info+1:0):"form"==k&&"{"==g?h.indented:"form"==k?h.indented+d:"stat"==k?h.indented+(Ea(b,f)?e||d:0):"switch"!=h.info||l||0==c.doubleIndentSwitch?h.align?h.column+(l?0:1):h.indented+(l?0:d):h.indented+(/^(?:case|default)\b/.test(f)?d:2*d)},electricInput:/^\s*(?:case .*?:|default:|\{|\})$/,blockCommentStart:g?null:"/*",blockCommentEnd:g?null:"*/",lineComment:g?null:"//",fold:"brace",closeBrackets:"()[]{}''\"\"``",helperType:g?"json":"javascript",jsonldMode:f,jsonMode:g}}),a.registerHelper("wordChars","javascript",/[\w$]/),a.defineMIME("text/javascript","javascript"),a.defineMIME("text/ecmascript","javascript"),a.defineMIME("application/javascript","javascript"),
-a.defineMIME("application/x-javascript","javascript"),a.defineMIME("application/ecmascript","javascript"),a.defineMIME("application/json",{name:"javascript",json:!0}),a.defineMIME("application/x-json",{name:"javascript",json:!0}),a.defineMIME("application/ld+json",{name:"javascript",jsonld:!0}),a.defineMIME("text/typescript",{name:"javascript",typescript:!0}),a.defineMIME("application/typescript",{name:"javascript",typescript:!0})}),function(a){"object"==typeof exports&&"object"==typeof module?a(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],a):a(CodeMirror)}(function(a){"use strict";function b(a,b){return a.string.charAt(a.pos+(b||0))}function c(a,b){if(b){var c=a.pos-b;return a.string.substr(c>=0?c:0,b)}return a.string.substr(0,a.pos-1)}function d(a,b){var c=a.string.length,d=c-a.pos+1;return a.string.substr(a.pos,b&&c>b?b:d)}function e(a,b){var d,c=a.pos+b;0>=c?a.pos=0:c>=(d=a.string.length-1)?a.pos=d:a.pos=c}a.defineMode("perl",function(){function h(a,b,c,d,e){return b.chain=null,b.style=null,b.tail=null,b.tokenize=function(a,b){for(var g,f=!1,h=0;g=a.next();){if(g===c[h]&&!f)return void 0!==c[++h]?(b.chain=c[h],b.style=d,b.tail=e):e&&a.eatWhile(e),b.tokenize=j,d;f=!f&&"\\"==g}return d},b.tokenize(a,b)}function i(a,b,c){return b.tokenize=function(a,b){return a.string==c&&(b.tokenize=j),a.skipToEnd(),"string"},b.tokenize(a,b)}function j(j,k){if(j.eatSpace())return null;if(k.chain)return h(j,k,k.chain,k.style,k.tail);if(j.match(/^\-?[\d\.]/,!1)&&j.match(/^(\-?(\d*\.\d+(e[+-]?\d+)?|\d+\.\d*)|0x[\da-fA-F]+|0b[01]+|\d+(e[+-]?\d+)?)/))return"number";if(j.match(/^<<(?=\w)/))return j.eatWhile(/\w/),i(j,k,j.current().substr(2));if(j.sol()&&j.match(/^\=item(?!\w)/))return i(j,k,"=cut");var l=j.next();if('"'==l||"'"==l){if(c(j,3)=="<<"+l){var m=j.pos;j.eatWhile(/\w/);var n=j.current().substr(1);if(n&&j.eat(l))return i(j,k,n);j.pos=m}return h(j,k,[l],"string")}if("q"==l){var o=b(j,-2);if(!o||!/\w/.test(o))if(o=b(j,0),"x"==o){if(o=b(j,1),"("==o)return e(j,2),h(j,k,[")"],f,g);if("["==o)return e(j,2),h(j,k,["]"],f,g);if("{"==o)return e(j,2),h(j,k,["}"],f,g);if("<"==o)return e(j,2),h(j,k,[">"],f,g);if(/[\^'"!~\/]/.test(o))return e(j,1),h(j,k,[j.eat(o)],f,g)}else if("q"==o){if(o=b(j,1),"("==o)return e(j,2),h(j,k,[")"],"string");if("["==o)return e(j,2),h(j,k,["]"],"string");if("{"==o)return e(j,2),h(j,k,["}"],"string");if("<"==o)return e(j,2),h(j,k,[">"],"string");if(/[\^'"!~\/]/.test(o))return e(j,1),h(j,k,[j.eat(o)],"string")}else if("w"==o){if(o=b(j,1),"("==o)return e(j,2),h(j,k,[")"],"bracket");if("["==o)return e(j,2),h(j,k,["]"],"bracket");if("{"==o)return e(j,2),h(j,k,["}"],"bracket");if("<"==o)return e(j,2),h(j,k,[">"],"bracket");if(/[\^'"!~\/]/.test(o))return e(j,1),h(j,k,[j.eat(o)],"bracket")}else if("r"==o){if(o=b(j,1),"("==o)return e(j,2),h(j,k,[")"],f,g);if("["==o)return e(j,2),h(j,k,["]"],f,g);if("{"==o)return e(j,2),h(j,k,["}"],f,g);if("<"==o)return e(j,2),h(j,k,[">"],f,g);if(/[\^'"!~\/]/.test(o))return e(j,1),h(j,k,[j.eat(o)],f,g)}else if(/[\^'"!~\/(\[{<]/.test(o)){if("("==o)return e(j,1),h(j,k,[")"],"string");if("["==o)return e(j,1),h(j,k,["]"],"string");if("{"==o)return e(j,1),h(j,k,["}"],"string");if("<"==o)return e(j,1),h(j,k,[">"],"string");if(/[\^'"!~\/]/.test(o))return h(j,k,[j.eat(o)],"string")}}if("m"==l){var o=b(j,-2);if((!o||!/\w/.test(o))&&(o=j.eat(/[(\[{<\^'"!~\/]/))){if(/[\^'"!~\/]/.test(o))return h(j,k,[o],f,g);if("("==o)return h(j,k,[")"],f,g);if("["==o)return h(j,k,["]"],f,g);if("{"==o)return h(j,k,["}"],f,g);if("<"==o)return h(j,k,[">"],f,g)}}if("s"==l){var o=/[\/>\]})\w]/.test(b(j,-2));if(!o&&(o=j.eat(/[(\[{<\^'"!~\/]/)))return"["==o?h(j,k,["]","]"],f,g):"{"==o?h(j,k,["}","}"],f,g):"<"==o?h(j,k,[">",">"],f,g):"("==o?h(j,k,[")",")"],f,g):h(j,k,[o,o],f,g)}if("y"==l){var o=/[\/>\]})\w]/.test(b(j,-2));if(!o&&(o=j.eat(/[(\[{<\^'"!~\/]/)))return"["==o?h(j,k,["]","]"],f,g):"{"==o?h(j,k,["}","}"],f,g):"<"==o?h(j,k,[">",">"],f,g):"("==o?h(j,k,[")",")"],f,g):h(j,k,[o,o],f,g)}if("t"==l){var o=/[\/>\]})\w]/.test(b(j,-2));if(!o&&(o=j.eat("r"),o&&(o=j.eat(/[(\[{<\^'"!~\/]/))))return"["==o?h(j,k,["]","]"],f,g):"{"==o?h(j,k,["}","}"],f,g):"<"==o?h(j,k,[">",">"],f,g):"("==o?h(j,k,[")",")"],f,g):h(j,k,[o,o],f,g)}if("`"==l)return h(j,k,[l],"variable-2");if("/"==l)return/~\s*$/.test(c(j))?h(j,k,[l],f,g):"operator";if("$"==l){var m=j.pos;if(j.eatWhile(/\d/)||j.eat("{")&&j.eatWhile(/\d/)&&j.eat("}"))return"variable-2";j.pos=m}if(/[$@%]/.test(l)){var m=j.pos;if(j.eat("^")&&j.eat(/[A-Z]/)||!/[@$%&]/.test(b(j,-2))&&j.eat(/[=|\\\-#?@;:&`~\^!\[\]*'"$+.,\/<>()]/)){var o=j.current();if(a[o])return"variable-2"}j.pos=m}if(/[$@%&]/.test(l)&&(j.eatWhile(/[\w$\[\]]/)||j.eat("{")&&j.eatWhile(/[\w$\[\]]/)&&j.eat("}"))){var o=j.current();return a[o]?"variable-2":"variable"}if("#"==l&&"$"!=b(j,-2))return j.skipToEnd(),"comment";if(/[:+\-\^*$&%@=<>!?|\/~\.]/.test(l)){var m=j.pos;if(j.eatWhile(/[:+\-\^*$&%@=<>!?|\/~\.]/),a[j.current()])return"operator";j.pos=m}if("_"==l&&1==j.pos){if("_END__"==d(j,6))return h(j,k,["\x00"],"comment");if("_DATA__"==d(j,7))return h(j,k,["\x00"],"variable-2");if("_C__"==d(j,7))return h(j,k,["\x00"],"string")}if(/\w/.test(l)){var m=j.pos;if("{"==b(j,-2)&&("}"==b(j,0)||j.eatWhile(/\w/)&&"}"==b(j,0)))return"string";j.pos=m}if(/[A-Z]/.test(l)){var p=b(j,-2),m=j.pos;if(j.eatWhile(/[A-Z_]/),!/[\da-z]/.test(b(j,0))){var o=a[j.current()];return o?(o[1]&&(o=o[0]),":"!=p?1==o?"keyword":2==o?"def":3==o?"atom":4==o?"operator":5==o?"variable-2":"meta":"meta"):"meta"}j.pos=m}if(/[a-zA-Z_]/.test(l)){var p=b(j,-2);j.eatWhile(/\w/);var o=a[j.current()];return o?(o[1]&&(o=o[0]),":"!=p?1==o?"keyword":2==o?"def":3==o?"atom":4==o?"operator":5==o?"variable-2":"meta":"meta"):"meta"}return null}var a={"->":4,"++":4,"--":4,"**":4,"=~":4,"!~":4,"*":4,"/":4,"%":4,x:4,"+":4,"-":4,".":4,"<<":4,">>":4,"<":4,">":4,"<=":4,">=":4,lt:4,gt:4,le:4,ge:4,"==":4,"!=":4,"<=>":4,eq:4,ne:4,cmp:4,"~~":4,"&":4,"|":4,"^":4,"&&":4,"||":4,"//":4,"..":4,"...":4,"?":4,":":4,"=":4,"+=":4,"-=":4,"*=":4,",":4,"=>":4,"::":4,not:4,and:4,or:4,xor:4,BEGIN:[5,1],END:[5,1],PRINT:[5,1],PRINTF:[5,1],GETC:[5,1],READ:[5,1],READLINE:[5,1],DESTROY:[5,1],TIE:[5,1],TIEHANDLE:[5,1],UNTIE:[5,1],STDIN:5,STDIN_TOP:5,STDOUT:5,STDOUT_TOP:5,STDERR:5,STDERR_TOP:5,$ARG:5,$_:5,"@ARG":5,"@_":5,$LIST_SEPARATOR:5,'$"':5,$PROCESS_ID:5,$PID:5,$$:5,$REAL_GROUP_ID:5,$GID:5,"$(":5,$EFFECTIVE_GROUP_ID:5,$EGID:5,"$)":5,$PROGRAM_NAME:5,$0:5,$SUBSCRIPT_SEPARATOR:5,$SUBSEP:5,"$;":5,$REAL_USER_ID:5,$UID:5,"$<":5,$EFFECTIVE_USER_ID:5,$EUID:5,"$>":5,$a:5,$b:5,$COMPILING:5,"$^C":5,$DEBUGGING:5,"$^D":5,"${^ENCODING}":5,$ENV:5,"%ENV":5,$SYSTEM_FD_MAX:5,"$^F":5,"@F":5,"${^GLOBAL_PHASE}":5,"$^H":5,"%^H":5,"@INC":5,"%INC":5,$INPLACE_EDIT:5,"$^I":5,"$^M":5,$OSNAME:5,"$^O":5,"${^OPEN}":5,$PERLDB:5,"$^P":5,$SIG:5,"%SIG":5,$BASETIME:5,"$^T":5,"${^TAINT}":5,"${^UNICODE}":5,"${^UTF8CACHE}":5,"${^UTF8LOCALE}":5,$PERL_VERSION:5,"$^V":5,"${^WIN32_SLOPPY_STAT}":5,$EXECUTABLE_NAME:5,"$^X":5,$1:5,$MATCH:5,"$&":5,"${^MATCH}":5,$PREMATCH:5,"$`":5,"${^PREMATCH}":5,$POSTMATCH:5,"$'":5,"${^POSTMATCH}":5,$LAST_PAREN_MATCH:5,"$+":5,$LAST_SUBMATCH_RESULT:5,"$^N":5,"@LAST_MATCH_END":5,"@+":5,"%LAST_PAREN_MATCH":5,"%+":5,"@LAST_MATCH_START":5,"@-":5,"%LAST_MATCH_START":5,"%-":5,$LAST_REGEXP_CODE_RESULT:5,"$^R":5,"${^RE_DEBUG_FLAGS}":5,"${^RE_TRIE_MAXBUF}":5,$ARGV:5,"@ARGV":5,ARGV:5,ARGVOUT:5,$OUTPUT_FIELD_SEPARATOR:5,$OFS:5,"$,":5,$INPUT_LINE_NUMBER:5,$NR:5,"$.":5,$INPUT_RECORD_SEPARATOR:5,$RS:5,"$/":5,$OUTPUT_RECORD_SEPARATOR:5,$ORS:5,"$\\":5,$OUTPUT_AUTOFLUSH:5,"$|":5,$ACCUMULATOR:5,"$^A":5,$FORMAT_FORMFEED:5,"$^L":5,$FORMAT_PAGE_NUMBER:5,"$%":5,$FORMAT_LINES_LEFT:5,"$-":5,$FORMAT_LINE_BREAK_CHARACTERS:5,"$:":5,$FORMAT_LINES_PER_PAGE:5,"$=":5,$FORMAT_TOP_NAME:5,"$^":5,$FORMAT_NAME:5,"$~":5,"${^CHILD_ERROR_NATIVE}":5,$EXTENDED_OS_ERROR:5,"$^E":5,$EXCEPTIONS_BEING_CAUGHT:5,"$^S":5,$WARNING:5,"$^W":5,"${^WARNING_BITS}":5,$OS_ERROR:5,$ERRNO:5,"$!":5,"%OS_ERROR":5,"%ERRNO":5,"%!":5,$CHILD_ERROR:5,"$?":5,$EVAL_ERROR:5,"$@":5,$OFMT:5,"$#":5,"$*":5,$ARRAY_BASE:5,"$[":5,$OLD_PERL_VERSION:5,"$]":5,"if":[1,1],elsif:[1,1],"else":[1,1],"while":[1,1],unless:[1,1],"for":[1,1],foreach:[1,1],abs:1,accept:1,alarm:1,atan2:1,bind:1,binmode:1,bless:1,bootstrap:1,"break":1,caller:1,chdir:1,chmod:1,chomp:1,chop:1,chown:1,chr:1,chroot:1,close:1,closedir:1,connect:1,"continue":[1,1],cos:1,crypt:1,dbmclose:1,dbmopen:1,"default":1,defined:1,"delete":1,die:1,"do":1,dump:1,each:1,endgrent:1,endhostent:1,endnetent:1,endprotoent:1,endpwent:1,endservent:1,eof:1,eval:1,exec:1,exists:1,exit:1,exp:1,fcntl:1,fileno:1,flock:1,fork:1,format:1,formline:1,getc:1,getgrent:1,getgrgid:1,getgrnam:1,gethostbyaddr:1,gethostbyname:1,gethostent:1,getlogin:1,getnetbyaddr:1,getnetbyname:1,getnetent:1,getpeername:1,getpgrp:1,getppid:1,getpriority:1,getprotobyname:1,getprotobynumber:1,getprotoent:1,getpwent:1,getpwnam:1,getpwuid:1,getservbyname:1,getservbyport:1,getservent:1,getsockname:1,getsockopt:1,given:1,glob:1,gmtime:1,"goto":1,grep:1,hex:1,"import":1,index:1,"int":1,ioctl:1,join:1,keys:1,kill:1,last:1,lc:1,lcfirst:1,length:1,link:1,listen:1,local:2,localtime:1,lock:1,log:1,lstat:1,m:null,map:1,mkdir:1,msgctl:1,msgget:1,msgrcv:1,msgsnd:1,my:2,"new":1,next:1,no:1,oct:1,open:1,opendir:1,ord:1,our:2,pack:1,"package":1,pipe:1,pop:1,pos:1,print:1,printf:1,prototype:1,push:1,q:null,qq:null,qr:null,quotemeta:null,qw:null,qx:null,rand:1,read:1,readdir:1,readline:1,readlink:1,readpipe:1,recv:1,redo:1,ref:1,rename:1,require:1,reset:1,"return":1,reverse:1,rewinddir:1,rindex:1,rmdir:1,s:null,say:1,scalar:1,seek:1,seekdir:1,select:1,semctl:1,semget:1,semop:1,send:1,setgrent:1,sethostent:1,setnetent:1,setpgrp:1,setpriority:1,setprotoent:1,setpwent:1,setservent:1,setsockopt:1,shift:1,shmctl:1,shmget:1,shmread:1,shmwrite:1,shutdown:1,sin:1,sleep:1,socket:1,socketpair:1,sort:1,splice:1,split:1,sprintf:1,sqrt:1,srand:1,stat:1,state:1,study:1,sub:1,substr:1,symlink:1,syscall:1,sysopen:1,sysread:1,sysseek:1,system:1,syswrite:1,tell:1,telldir:1,tie:1,tied:1,time:1,times:1,tr:null,truncate:1,uc:1,ucfirst:1,umask:1,undef:1,unlink:1,unpack:1,unshift:1,untie:1,use:1,utime:1,values:1,vec:1,wait:1,waitpid:1,wantarray:1,warn:1,when:1,write:1,y:null},f="string-2",g=/[goseximacplud]/;return{startState:function(){return{tokenize:j,chain:null,style:null,tail:null}},token:function(a,b){return(b.tokenize||j)(a,b)},lineComment:"#"}}),a.registerHelper("wordChars","perl",/[\w$]/),a.defineMIME("text/x-perl","perl")}),function(a){"object"==typeof exports&&"object"==typeof module?a(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],a):a(CodeMirror)}(function(a){"use strict";function b(a){return new RegExp("^(("+a.join(")|(")+"))\\b")}function h(a){return a.scopes[a.scopes.length-1]}var c=b(["and","or","not","is"]),d=["as","assert","break","class","continue","def","del","elif","else","except","finally","for","from","global","if","import","lambda","pass","raise","return","try","while","with","yield","in"],e=["abs","all","any","bin","bool","bytearray","callable","chr","classmethod","compile","complex","delattr","dict","dir","divmod","enumerate","eval","filter","float","format","frozenset","getattr","globals","hasattr","hash","help","hex","id","input","int","isinstance","issubclass","iter","len","list","locals","map","max","memoryview","min","next","object","oct","open","ord","pow","property","range","repr","reversed","round","set","setattr","slice","sorted","staticmethod","str","sum","super","tuple","type","vars","zip","__import__","NotImplemented","Ellipsis","__debug__"],f={builtins:["apply","basestring","buffer","cmp","coerce","execfile","file","intern","long","raw_input","reduce","reload","unichr","unicode","xrange","False","True","None"],keywords:["exec","print"]},g={builtins:["ascii","bytes","exec","print"],keywords:["nonlocal","False","True","None","async","await"]};a.registerHelper("hintWords","python",d.concat(e)),a.defineMode("python",function(i,j){function x(a,b){if(a.sol()&&"py"==h(b).type){var c=h(b).offset;if(a.eatSpace()){var d=a.indentation();return d>c?A(a,b,"py"):c>d&&B(a,b)&&(b.errorToken=!0),null}var e=y(a,b);return c>0&&B(a,b)&&(e+=" "+k),e}return y(a,b)}function y(a,b){if(a.eatSpace())return null;var d=a.peek();if("#"==d)return a.skipToEnd(),"comment";if(a.match(/^[0-9\.]/,!1)){var e=!1;if(a.match(/^\d*\.\d+(e[\+\-]?\d+)?/i)&&(e=!0),a.match(/^\d+\.\d*/)&&(e=!0),a.match(/^\.\d+/)&&(e=!0),e)return a.eat(/J/i),"number";var f=!1;if(a.match(/^0x[0-9a-f]+/i)&&(f=!0),a.match(/^0b[01]+/i)&&(f=!0),a.match(/^0o[0-7]+/i)&&(f=!0),a.match(/^[1-9]\d*(e[\+\-]?\d+)?/)&&(a.eat(/J/i),f=!0),a.match(/^0(?![\dx])/i)&&(f=!0),f)return a.eat(/L/i),"number"}return a.match(u)?(b.tokenize=z(a.current()),b.tokenize(a,b)):a.match(o)||a.match(n)?null:a.match(m)||a.match(p)?"operator":a.match(l)?null:a.match(v)||a.match(c)?"keyword":a.match(w)?"builtin":a.match(/^(self|cls)\b/)?"variable-2":a.match(q)?"def"==b.lastToken||"class"==b.lastToken?"def":"variable":(a.next(),k)}function z(a){function d(d,e){for(;!d.eol();)if(d.eatWhile(/[^'"\\]/),d.eat("\\")){if(d.next(),b&&d.eol())return c}else{if(d.match(a))return e.tokenize=x,c;d.eat(/['"]/)}if(b){if(j.singleLineStringErrors)return k;e.tokenize=x}return c}for(;"rub".indexOf(a.charAt(0).toLowerCase())>=0;)a=a.substr(1);var b=1==a.length,c="string";return d.isString=!0,d}function A(a,b,c){var d=0,e=null;if("py"==c)for(;"py"!=h(b).type;)b.scopes.pop();d=h(b).offset+("py"==c?i.indentUnit:r),"py"==c||a.match(/^(\s|#.*)*$/,!1)||(e=a.column()+1),b.scopes.push({offset:d,type:c,align:e})}function B(a,b){for(var c=a.indentation();h(b).offset>c;){if("py"!=h(b).type)return!0;b.scopes.pop()}return h(b).offset!=c}function C(a,b){var c=b.tokenize(a,b),d=a.current();if("."==d)return c=a.match(q,!1)?null:k,null==c&&"meta"==b.lastStyle&&(c="meta"),c;if("@"==d)return j.version&&3==parseInt(j.version,10)?a.match(q,!1)?"meta":"operator":a.match(q,!1)?"meta":k;"variable"!=c&&"builtin"!=c||"meta"!=b.lastStyle||(c="meta"),("pass"==d||"return"==d)&&(b.dedent+=1),"lambda"==d&&(b.lambda=!0),":"!=d||b.lambda||"py"!=h(b).type||A(a,b,"py");var e=1==d.length?"[({".indexOf(d):-1;if(-1!=e&&A(a,b,"])}".slice(e,e+1)),e="])}".indexOf(d),-1!=e){if(h(b).type!=d)return k;b.scopes.pop()}return b.dedent>0&&a.eol()&&"py"==h(b).type&&(b.scopes.length>1&&b.scopes.pop(),b.dedent-=1),c}var k="error",l=j.singleDelimiters||new RegExp("^[\\(\\)\\[\\]\\{\\}@,:`=;\\.]"),m=j.doubleOperators||new RegExp("^((==)|(!=)|(<=)|(>=)|(<>)|(<<)|(>>)|(//)|(\\*\\*))"),n=j.doubleDelimiters||new RegExp("^((\\+=)|(\\-=)|(\\*=)|(%=)|(/=)|(&=)|(\\|=)|(\\^=))"),o=j.tripleDelimiters||new RegExp("^((//=)|(>>=)|(<<=)|(\\*\\*=))");if(j.version&&3==parseInt(j.version,10))var p=j.singleOperators||new RegExp("^[\\+\\-\\*/%&|\\^~<>!@]"),q=j.identifiers||new RegExp("^[_A-Za-z\xa1-\uffff][_A-Za-z0-9\xa1-\uffff]*");else var p=j.singleOperators||new RegExp("^[\\+\\-\\*/%&|\\^~<>!]"),q=j.identifiers||new RegExp("^[_A-Za-z][_A-Za-z0-9]*");var r=j.hangingIndent||i.indentUnit,s=d,t=e;if(void 0!=j.extra_keywords&&(s=s.concat(j.extra_keywords)),void 0!=j.extra_builtins&&(t=t.concat(j.extra_builtins)),j.version&&3==parseInt(j.version,10)){s=s.concat(g.keywords),t=t.concat(g.builtins);var u=new RegExp("^(([rb]|(br))?('{3}|\"{3}|['\"]))","i")}else{s=s.concat(f.keywords),t=t.concat(f.builtins);var u=new RegExp("^(([rub]|(ur)|(br))?('{3}|\"{3}|['\"]))","i")}var v=b(s),w=b(t),D={startState:function(a){return{tokenize:x,scopes:[{offset:a||0,type:"py",align:null}],lastStyle:null,lastToken:null,lambda:!1,dedent:0}},token:function(a,b){var c=b.errorToken;c&&(b.errorToken=!1);var d=C(a,b);b.lastStyle=d;var e=a.current();return e&&d&&(b.lastToken=e),a.eol()&&b.lambda&&(b.lambda=!1),c?d+" "+k:d},indent:function(b,c){if(b.tokenize!=x)return b.tokenize.isString?a.Pass:0;var d=h(b),e=c&&c.charAt(0)==d.type;return null!=d.align?d.align-(e?1:0):e&&b.scopes.length>1?b.scopes[b.scopes.length-2].offset:d.offset},closeBrackets:{triples:"'\""},lineComment:"#",fold:"indent"};return D}),a.defineMIME("text/x-python","python");var i=function(a){return a.split(" ")};a.defineMIME("text/x-cython",{name:"python",extra_keywords:i("by cdef cimport cpdef ctypedef enum exceptextern gil include nogil property publicreadonly struct union DEF IF ELIF ELSE")})}),function(a){"object"==typeof exports&&"object"==typeof module?a(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],a):a(CodeMirror)}(function(a){"use strict";a.defineMode("shell",function(){function b(b,c){for(var d=c.split(" "),e=0;e<d.length;e++)a[d[e]]=b}function c(b,c){if(b.eatSpace())return null;var g=b.sol(),h=b.next();if("\\"===h)return b.next(),null;if("'"===h||'"'===h||"`"===h)return c.tokens.unshift(d(h)),f(b,c);if("#"===h)return g&&b.eat("!")?(b.skipToEnd(),"meta"):(b.skipToEnd(),"comment");if("$"===h)return c.tokens.unshift(e),f(b,c);if("+"===h||"="===h)return"operator";if("-"===h)return b.eat("-"),b.eatWhile(/\w/),"attribute";if(/\d/.test(h)&&(b.eatWhile(/\d/),b.eol()||!/\w/.test(b.peek())))return"number";b.eatWhile(/[\w-]/);var i=b.current();return"="===b.peek()&&/\w+/.test(i)?"def":a.hasOwnProperty(i)?a[i]:null}function d(a){return function(b,c){for(var d,f=!1,g=!1;null!=(d=b.next());){if(d===a&&!g){f=!0;break}if("$"===d&&!g&&"'"!==a){g=!0,b.backUp(1),c.tokens.unshift(e);break}g=!g&&"\\"===d}return(f||!g)&&c.tokens.shift(),"`"===a||")"===a?"quote":"string"}}function f(a,b){return(b.tokens[0]||c)(a,b)}var a={};b("atom","true false"),b("keyword","if then do else elif while until for in esac fi fin fil done exit set unset export function"),b("builtin","ab awk bash beep cat cc cd chown chmod chroot clear cp curl cut diff echo find gawk gcc get git grep kill killall ln ls make mkdir openssl mv nc node npm ping ps restart rm rmdir sed service sh shopt shred source sort sleep ssh start stop su sudo tee telnet top touch vi vim wall wc wget who write yes zsh");var e=function(a,b){b.tokens.length>1&&a.eat("$");var c=a.next(),e=/\w/;return"{"===c&&(e=/[^}]/),"("===c?(b.tokens[0]=d(")"),f(a,b)):(/\d/.test(c)||(a.eatWhile(e),a.eat("}")),b.tokens.shift(),"def")};return{startState:function(){return{tokens:[]}},token:function(a,b){return f(a,b)},lineComment:"#",fold:"brace"}}),a.defineMIME("text/x-sh","shell")}),function(a){"object"==typeof exports&&"object"==typeof module?a(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],a):a(CodeMirror)}(function(a){"use strict";a.defineMode("xml",function(b,c){function k(a,b){function c(c){return b.tokenize=c,c(a,b)}var d=a.next();if("<"==d)return a.eat("!")?a.eat("[")?a.match("CDATA[")?c(n("atom","]]>")):null:a.match("--")?c(n("comment","-->")):a.match("DOCTYPE",!0,!0)?(a.eatWhile(/[\w\._\-]/),c(o(1))):null:a.eat("?")?(a.eatWhile(/[\w\._\-]/),b.tokenize=n("meta","?>"),"meta"):(i=a.eat("/")?"closeTag":"openTag",b.tokenize=l,"tag bracket");if("&"==d){var e;return e=a.eat("#")?a.eat("x")?a.eatWhile(/[a-fA-F\d]/)&&a.eat(";"):a.eatWhile(/[\d]/)&&a.eat(";"):a.eatWhile(/[\w\.\-:]/)&&a.eat(";"),e?"atom":"error"}return a.eatWhile(/[^&<]/),null}function l(a,b){var c=a.next();if(">"==c||"/"==c&&a.eat(">"))return b.tokenize=k,i=">"==c?"endTag":"selfcloseTag","tag bracket";if("="==c)return i="equals",null;if("<"==c){b.tokenize=k,b.state=s,b.tagName=b.tagStart=null;var d=b.tokenize(a,b);return d?d+" tag error":"tag error"}return/[\'\"]/.test(c)?(b.tokenize=m(c),b.stringStartCol=a.column(),b.tokenize(a,b)):(a.match(/^[^\s\u00a0=<>\"\']*[^\s\u00a0=<>\"\'\/]/),"word")}function m(a){var b=function(b,c){for(;!b.eol();)if(b.next()==a){c.tokenize=l;break}return"string"};return b.isInAttribute=!0,b}function n(a,b){return function(c,d){for(;!c.eol();){if(c.match(b)){d.tokenize=k;break}c.next()}return a}}function o(a){return function(b,c){for(var d;null!=(d=b.next());){if("<"==d)return c.tokenize=o(a+1),c.tokenize(b,c);if(">"==d){if(1==a){c.tokenize=k;break}return c.tokenize=o(a-1),c.tokenize(b,c)}}return"meta"}}function p(a,b,c){this.prev=a.context,this.tagName=b,this.indent=a.indented,this.startOfLine=c,(g.doNotIndent.hasOwnProperty(b)||a.context&&a.context.noIndent)&&(this.noIndent=!0)}function q(a){a.context&&(a.context=a.context.prev)}function r(a,b){for(var c;;){if(!a.context)return;if(c=a.context.tagName,!g.contextGrabbers.hasOwnProperty(c)||!g.contextGrabbers[c].hasOwnProperty(b))return;q(a)}}function s(a,b,c){return"openTag"==a?(c.tagStart=b.column(),t):"closeTag"==a?u:s}function t(a,b,c){return"word"==a?(c.tagName=b.current(),j="tag",x):(j="error",t)}function u(a,b,c){if("word"==a){var d=b.current();return c.context&&c.context.tagName!=d&&g.implicitlyClosed.hasOwnProperty(c.context.tagName)&&q(c),c.context&&c.context.tagName==d?(j="tag",v):(j="tag error",w)}return j="error",w}function v(a,b,c){return"endTag"!=a?(j="error",v):(q(c),s)}function w(a,b,c){return j="error",v(a,b,c)}function x(a,b,c){if("word"==a)return j="attribute",y;if("endTag"==a||"selfcloseTag"==a){var d=c.tagName,e=c.tagStart;return c.tagName=c.tagStart=null,"selfcloseTag"==a||g.autoSelfClosers.hasOwnProperty(d)?r(c,d):(r(c,d),c.context=new p(c,d,e==c.indented)),s}return j="error",x}function y(a,b,c){return"equals"==a?z:(g.allowMissing||(j="error"),x(a,b,c))}function z(a,b,c){return"string"==a?A:"word"==a&&g.allowUnquoted?(j="string",x):(j="error",x(a,b,c))}function A(a,b,c){return"string"==a?A:x(a,b,c)}var d=b.indentUnit,e=c.multilineTagIndentFactor||1,f=c.multilineTagIndentPastTag;null==f&&(f=!0);var i,j,g=c.htmlMode?{autoSelfClosers:{area:!0,base:!0,br:!0,col:!0,command:!0,embed:!0,frame:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0,menuitem:!0},implicitlyClosed:{dd:!0,li:!0,optgroup:!0,option:!0,p:!0,rp:!0,rt:!0,tbody:!0,td:!0,tfoot:!0,th:!0,tr:!0},contextGrabbers:{dd:{dd:!0,dt:!0},dt:{dd:!0,dt:!0},li:{li:!0},option:{option:!0,optgroup:!0},optgroup:{optgroup:!0},p:{address:!0,article:!0,aside:!0,blockquote:!0,dir:!0,div:!0,dl:!0,fieldset:!0,footer:!0,form:!0,h1:!0,h2:!0,h3:!0,h4:!0,h5:!0,h6:!0,header:!0,hgroup:!0,hr:!0,menu:!0,nav:!0,ol:!0,p:!0,pre:!0,section:!0,table:!0,ul:!0},rp:{rp:!0,rt:!0},rt:{rp:!0,rt:!0},tbody:{tbody:!0,tfoot:!0},td:{td:!0,th:!0},tfoot:{tbody:!0},th:{td:!0,th:!0},thead:{tbody:!0,tfoot:!0},tr:{tr:!0}},doNotIndent:{pre:!0},allowUnquoted:!0,allowMissing:!0,caseFold:!0}:{autoSelfClosers:{},implicitlyClosed:{},contextGrabbers:{},doNotIndent:{},allowUnquoted:!1,allowMissing:!1,caseFold:!1},h=c.alignCDATA;return k.isInText=!0,{startState:function(){return{tokenize:k,state:s,indented:0,tagName:null,tagStart:null,context:null}},token:function(a,b){if(!b.tagName&&a.sol()&&(b.indented=a.indentation()),a.eatSpace())return null;i=null;var c=b.tokenize(a,b);return(c||i)&&"comment"!=c&&(j=null,b.state=b.state(i||c,a,b),j&&(c="error"==j?c+" error":j)),c},indent:function(b,c,i){var j=b.context;if(b.tokenize.isInAttribute)return b.tagStart==b.indented?b.stringStartCol+1:b.indented+d;if(j&&j.noIndent)return a.Pass;if(b.tokenize!=l&&b.tokenize!=k)return i?i.match(/^(\s*)/)[0].length:0;if(b.tagName)return f?b.tagStart+b.tagName.length+2:b.tagStart+d*e;if(h&&/<!\[CDATA\[/.test(c))return 0;var m=c&&/^<(\/)?([\w_:\.-]*)/.exec(c);if(m&&m[1])for(;j;){if(j.tagName==m[2]){j=j.prev;break}if(!g.implicitlyClosed.hasOwnProperty(j.tagName))break;j=j.prev}else if(m)for(;j;){var n=g.contextGrabbers[j.tagName];if(!n||!n.hasOwnProperty(m[2]))break;j=j.prev}for(;j&&!j.startOfLine;)j=j.prev;return j?j.indent+d:0},electricInput:/<\/[\s\w:]+>$/,blockCommentStart:"<!--",blockCommentEnd:"-->",configuration:c.htmlMode?"html":"xml",helperType:c.htmlMode?"html":"xml"}}),a.defineMIME("text/xml","xml"),a.defineMIME("application/xml","xml"),a.mimeModes.hasOwnProperty("text/html")||a.defineMIME("text/html",{name:"xml",htmlMode:!0})}),function(a){"object"==typeof exports&&"object"==typeof module?a(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],a):a(CodeMirror)}(function(a){"use strict";function d(a){for(var d=0;d<a.state.activeLines.length;d++)a.removeLineClass(a.state.activeLines[d],"wrap",b),a.removeLineClass(a.state.activeLines[d],"background",c)}function e(a,b){if(a.length!=b.length)return!1;for(var c=0;c<a.length;c++)if(a[c]!=b[c])return!1;return!0}function f(a,f){for(var g=[],h=0;h<f.length;h++){var i=f[h];if(i.empty()){var j=a.getLineHandleVisualStart(i.head.line);g[g.length-1]!=j&&g.push(j)}}e(a.state.activeLines,g)||a.operation(function(){d(a);for(var e=0;e<g.length;e++)a.addLineClass(g[e],"wrap",b),a.addLineClass(g[e],"background",c);a.state.activeLines=g})}function g(a,b){f(a,b.ranges)}var b="CodeMirror-activeline",c="CodeMirror-activeline-background";a.defineOption("styleActiveLine",!1,function(b,c,e){var h=e&&e!=a.Init;c&&!h?(b.state.activeLines=[],f(b,b.listSelections()),b.on("beforeSelectionChange",g)):!c&&h&&(b.off("beforeSelectionChange",g),d(b),delete b.state.activeLines)})}),function(a){"object"==typeof exports&&"object"==typeof module?a(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],a):a(CodeMirror)}(function(a){"use strict";a.registerHelper("fold","brace",function(b,c){function h(f){for(var h=c.ch,i=0;;){var j=0>=h?-1:e.lastIndexOf(f,h-1);if(-1!=j){if(1==i&&j<c.ch)break;if(g=b.getTokenTypeAt(a.Pos(d,j+1)),!/^(comment|string)/.test(g))return j+1;h=j-1}else{if(1==i)break;i=1,h=e.length}}}var f,g,d=c.line,e=b.getLine(d),i="{",j="}",f=h("{");if(null==f&&(i="[",j="]",f=h("[")),null!=f){var m,n,k=1,l=b.lastLine();a:for(var o=d;l>=o;++o)for(var p=b.getLine(o),q=o==d?f:0;;){var r=p.indexOf(i,q),s=p.indexOf(j,q);if(0>r&&(r=p.length),0>s&&(s=p.length),q=Math.min(r,s),q==p.length)break;if(b.getTokenTypeAt(a.Pos(o,q+1))==g)if(q==r)++k;else if(!--k){m=o,n=q;break a}++q}if(null!=m&&(d!=m||n!=f))return{from:a.Pos(d,f),to:a.Pos(m,n)}}}),a.registerHelper("fold","import",function(b,c){function d(c){if(c<b.firstLine()||c>b.lastLine())return null;var d=b.getTokenAt(a.Pos(c,1));if(/\S/.test(d.string)||(d=b.getTokenAt(a.Pos(c,d.end+1))),"keyword"!=d.type||"import"!=d.string)return null;for(var e=c,f=Math.min(b.lastLine(),c+10);f>=e;++e){var g=b.getLine(e),h=g.indexOf(";");if(-1!=h)return{startCh:d.end,end:a.Pos(e,h)}}}var f,c=c.line,e=d(c);if(!e||d(c-1)||(f=d(c-2))&&f.end.line==c-1)return null;for(var g=e.end;;){var h=d(g.line+1);if(null==h)break;g=h.end}return{from:b.clipPos(a.Pos(c,e.startCh+1)),to:g}}),a.registerHelper("fold","include",function(b,c){function d(c){if(c<b.firstLine()||c>b.lastLine())return null;var d=b.getTokenAt(a.Pos(c,1));return/\S/.test(d.string)||(d=b.getTokenAt(a.Pos(c,d.end+1))),"meta"==d.type&&"#include"==d.string.slice(0,8)?d.start+8:void 0}var c=c.line,e=d(c);if(null==e||null!=d(c-1))return null;for(var f=c;;){var g=d(f+1);if(null==g)break;++f}return{from:a.Pos(c,e+1),to:b.clipPos(a.Pos(f))}})}),function(a){"object"==typeof exports&&"object"==typeof module?a(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],a):a(CodeMirror)}(function(a){function d(a,c){return"pairs"==c&&"string"==typeof a?a:"object"==typeof a&&null!=a[c]?a[c]:b[c]}function h(a){return function(b){return l(b,a)}}function i(a){var b=a.state.closeBrackets;if(!b)return null;var c=a.getModeAt(a.getCursor());return c.closeBrackets||b}function j(b){var e=i(b);if(!e||b.getOption("disableInput"))return a.Pass;for(var f=d(e,"pairs"),g=b.listSelections(),h=0;h<g.length;h++){if(!g[h].empty())return a.Pass;var j=n(b,g[h].head);if(!j||f.indexOf(j)%2!=0)return a.Pass}for(var h=g.length-1;h>=0;h--){var k=g[h].head;b.replaceRange("",c(k.line,k.ch-1),c(k.line,k.ch+1))}}function k(b){var c=i(b),e=c&&d(c,"explode");if(!e||b.getOption("disableInput"))return a.Pass;for(var f=b.listSelections(),g=0;g<f.length;g++){if(!f[g].empty())return a.Pass;var h=n(b,f[g].head);if(!h||e.indexOf(h)%2!=0)return a.Pass}b.operation(function(){b.replaceSelection("\n\n",null),b.execCommand("goCharLeft"),f=b.listSelections();for(var a=0;a<f.length;a++){var c=f[a].head.line;b.indentLine(c,null,!0),b.indentLine(c+1,null,!0)}})}function l(b,e){var f=i(b);if(!f||b.getOption("disableInput"))return a.Pass;var g=d(f,"pairs"),h=g.indexOf(e);if(-1==h)return a.Pass;for(var p,q,j=d(f,"triples"),k=g.charAt(h+1)==e,l=b.listSelections(),n=h%2==0,r=0;r<l.length;r++){var u,s=l[r],t=s.head,q=b.getRange(t,c(t.line,t.ch+1));if(n&&!s.empty())u="surround";else if(!k&&n||q!=e)if(k&&t.ch>1&&j.indexOf(e)>=0&&b.getRange(c(t.line,t.ch-2),t)==e+e&&(t.ch<=2||b.getRange(c(t.line,t.ch-3),c(t.line,t.ch-2))!=e))u="addFour";else if(k){if(a.isWordChar(q)||!o(b,t,e))return a.Pass;u="both"}else{if(!n||b.getLine(t.line).length!=t.ch&&!m(q,g)&&!/\s/.test(q))return a.Pass;u="both"}else u=j.indexOf(e)>=0&&b.getRange(t,c(t.line,t.ch+3))==e+e+e?"skipThree":"skip";if(p){if(p!=u)return a.Pass}else p=u}var v=h%2?g.charAt(h-1):e,w=h%2?e:g.charAt(h+1);b.operation(function(){if("skip"==p)b.execCommand("goCharRight");else if("skipThree"==p)for(var a=0;3>a;a++)b.execCommand("goCharRight");else if("surround"==p){for(var c=b.getSelections(),a=0;a<c.length;a++)c[a]=v+c[a]+w;b.replaceSelections(c,"around")}else"both"==p?(b.replaceSelection(v+w,null),b.triggerElectric(v+w),b.execCommand("goCharLeft")):"addFour"==p&&(b.replaceSelection(v+v+v+v,"before"),b.execCommand("goCharRight"))})}function m(a,b){var c=b.lastIndexOf(a);return c>-1&&c%2==1}function n(a,b){var d=a.getRange(c(b.line,b.ch-1),c(b.line,b.ch+1));return 2==d.length?d:null}function o(b,c,d){var e=b.getLine(c.line),f=b.getTokenAt(c);if(/\bstring2?\b/.test(f.type))return!1;var g=new a.StringStream(e.slice(0,c.ch)+d+e.slice(c.ch),4);for(g.pos=g.start=f.start;;){var h=b.getMode().token(g,f.state);if(g.pos>=c.ch+1)return/\bstring2?\b/.test(h);g.start=g.pos}}var b={pairs:"()[]{}''\"\"",triples:"",explode:"[]{}"},c=a.Pos;a.defineOption("autoCloseBrackets",!1,function(b,c,d){d&&d!=a.Init&&(b.removeKeyMap(f),b.state.closeBrackets=null),c&&(b.state.closeBrackets=c,b.addKeyMap(f))});for(var e=b.pairs+"`",f={Backspace:j,Enter:k},g=0;g<e.length;g++)f["'"+e.charAt(g)+"'"]=h(e.charAt(g))}),function(a){"object"==typeof exports&&"object"==typeof module?a(require("../../lib/codemirror"),require("../fold/xml-fold")):"function"==typeof define&&define.amd?define(["../../lib/codemirror","../fold/xml-fold"],a):a(CodeMirror)}(function(a){function d(d){if(d.getOption("disableInput"))return a.Pass;for(var e=d.listSelections(),f=[],i=0;i<e.length;i++){if(!e[i].empty())return a.Pass;var j=e[i].head,k=d.getTokenAt(j),l=a.innerMode(d.getMode(),k.state),m=l.state;if("xml"!=l.mode.name||!m.tagName)return a.Pass;var n=d.getOption("autoCloseTags"),o="html"==l.mode.configuration,p="object"==typeof n&&n.dontCloseTags||o&&b,q="object"==typeof n&&n.indentTags||o&&c,r=m.tagName;k.end>j.ch&&(r=r.slice(0,r.length-k.end+j.ch));var s=r.toLowerCase();if(!r||"string"==k.type&&(k.end!=j.ch||!/[\"\']/.test(k.string.charAt(k.string.length-1))||1==k.string.length)||"tag"==k.type&&"closeTag"==m.type||k.string.indexOf("/")==k.string.length-1||p&&g(p,s)>-1||h(d,r,j,m,!0))return a.Pass;var t=q&&g(q,s)>-1;f[i]={indent:t,text:">"+(t?"\n\n":"")+"</"+r+">",newPos:t?a.Pos(j.line+1,0):a.Pos(j.line,j.ch+1)}}for(var i=e.length-1;i>=0;i--){var u=f[i];d.replaceRange(u.text,e[i].head,e[i].anchor,"+insert");var v=d.listSelections().slice(0);v[i]={head:u.newPos,anchor:u.newPos},d.setSelections(v),u.indent&&(d.indentLine(u.newPos.line,null,!0),d.indentLine(u.newPos.line+1,null,!0))}}function e(b,c){for(var d=b.listSelections(),e=[],f=c?"/":"</",g=0;g<d.length;g++){if(!d[g].empty())return a.Pass;var i=d[g].head,j=b.getTokenAt(i),k=a.innerMode(b.getMode(),j.state),l=k.state;if(c&&("string"==j.type||"<"!=j.string.charAt(0)||j.start!=i.ch-1))return a.Pass;var m;if("xml"!=k.mode.name)if("htmlmixed"==b.getMode().name&&"javascript"==k.mode.name)m=f+"script";else{if("htmlmixed"!=b.getMode().name||"css"!=k.mode.name)return a.Pass;m=f+"style"}else{if(!l.context||!l.context.tagName||h(b,l.context.tagName,i,l))return a.Pass;m=f+l.context.tagName;
-}">"!=b.getLine(i.line).charAt(j.end)&&(m+=">"),e[g]=m}b.replaceSelections(e),d=b.listSelections();for(var g=0;g<d.length;g++)(g==d.length-1||d[g].head.line<d[g+1].head.line)&&b.indentLine(d[g].head.line)}function f(b){return b.getOption("disableInput")?a.Pass:e(b,!0)}function g(a,b){if(a.indexOf)return a.indexOf(b);for(var c=0,d=a.length;d>c;++c)if(a[c]==b)return c;return-1}function h(b,c,d,e,f){if(!a.scanForClosingTag)return!1;var g=Math.min(b.lastLine()+1,d.line+500),h=a.scanForClosingTag(b,d,null,g);if(!h||h.tag!=c)return!1;for(var i=e.context,j=f?1:0;i&&i.tagName==c;i=i.prev)++j;d=h.to;for(var k=1;j>k;k++){var l=a.scanForClosingTag(b,d,null,g);if(!l||l.tag!=c)return!1;d=l.to}return!0}a.defineOption("autoCloseTags",!1,function(b,c,e){if(e!=a.Init&&e&&b.removeKeyMap("autoCloseTags"),c){var g={name:"autoCloseTags"};("object"!=typeof c||c.whenClosing)&&(g["'/'"]=function(a){return f(a)}),("object"!=typeof c||c.whenOpening)&&(g["'>'"]=function(a){return d(a)}),b.addKeyMap(g)}});var b=["area","base","br","col","command","embed","hr","img","input","keygen","link","meta","param","source","track","wbr"],c=["applet","blockquote","body","button","div","dl","fieldset","form","frameset","h1","h2","h3","h4","h5","h6","head","html","iframe","layer","legend","object","ol","p","select","table","ul"];a.commands.closeTag=function(a){return e(a)}}),function(a){"object"==typeof exports&&"object"==typeof module?a(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],a):a(CodeMirror)}(function(a){"use strict";function b(b,d,f,g){function j(a){var c=h(b,d);if(!c||c.to.line-c.from.line<i)return null;for(var e=b.findMarksAt(c.from),f=0;f<e.length;++f)if(e[f].__isFold&&"fold"!==g){if(!a)return null;c.cleared=!0,e[f].clear()}return c}if(f&&f.call){var h=f;f=null}else var h=e(b,f,"rangeFinder");"number"==typeof d&&(d=a.Pos(d,0));var i=e(b,f,"minFoldSize"),k=j(!0);if(e(b,f,"scanUp"))for(;!k&&d.line>b.firstLine();)d=a.Pos(d.line-1,0),k=j(!1);if(k&&!k.cleared&&"unfold"!==g){var l=c(b,f);a.on(l,"mousedown",function(b){m.clear(),a.e_preventDefault(b)});var m=b.markText(k.from,k.to,{replacedWith:l,clearOnEnter:!0,__isFold:!0});m.on("clear",function(c,d){a.signal(b,"unfold",b,c,d)}),a.signal(b,"fold",b,k.from,k.to)}}function c(a,b){var c=e(a,b,"widget");if("string"==typeof c){var d=document.createTextNode(c);c=document.createElement("span"),c.appendChild(d),c.className="CodeMirror-foldmarker"}return c}function e(a,b,c){if(b&&void 0!==b[c])return b[c];var e=a.options.foldOptions;return e&&void 0!==e[c]?e[c]:d[c]}a.newFoldFunction=function(a,c){return function(d,e){b(d,e,{rangeFinder:a,widget:c})}},a.defineExtension("foldCode",function(a,c,d){b(this,a,c,d)}),a.defineExtension("isFolded",function(a){for(var b=this.findMarksAt(a),c=0;c<b.length;++c)if(b[c].__isFold)return!0}),a.commands.toggleFold=function(a){a.foldCode(a.getCursor())},a.commands.fold=function(a){a.foldCode(a.getCursor(),null,"fold")},a.commands.unfold=function(a){a.foldCode(a.getCursor(),null,"unfold")},a.commands.foldAll=function(b){b.operation(function(){for(var c=b.firstLine(),d=b.lastLine();d>=c;c++)b.foldCode(a.Pos(c,0),null,"fold")})},a.commands.unfoldAll=function(b){b.operation(function(){for(var c=b.firstLine(),d=b.lastLine();d>=c;c++)b.foldCode(a.Pos(c,0),null,"unfold")})},a.registerHelper("fold","combine",function(){var a=Array.prototype.slice.call(arguments,0);return function(b,c){for(var d=0;d<a.length;++d){var e=a[d](b,c);if(e)return e}}}),a.registerHelper("fold","auto",function(a,b){for(var c=a.getHelpers(b,"fold"),d=0;d<c.length;d++){var e=c[d](a,b);if(e)return e}});var d={rangeFinder:a.fold.auto,widget:"\u2194",minFoldSize:0,scanUp:!1};a.defineOption("foldOptions",null),a.defineExtension("foldOption",function(a,b){return e(this,a,b)})}),function(a){"object"==typeof exports&&"object"==typeof module?a(require("../../lib/codemirror"),require("./foldcode")):"function"==typeof define&&define.amd?define(["../../lib/codemirror","./foldcode"],a):a(CodeMirror)}(function(a){"use strict";function c(a){this.options=a,this.from=this.to=0}function d(a){return a===!0&&(a={}),null==a.gutter&&(a.gutter="CodeMirror-foldgutter"),null==a.indicatorOpen&&(a.indicatorOpen="CodeMirror-foldgutter-open"),null==a.indicatorFolded&&(a.indicatorFolded="CodeMirror-foldgutter-folded"),a}function e(a,c){for(var d=a.findMarksAt(b(c)),e=0;e<d.length;++e)if(d[e].__isFold&&d[e].find().from.line==c)return d[e]}function f(a){if("string"==typeof a){var b=document.createElement("div");return b.className=a+" CodeMirror-guttermarker-subtle",b}return a.cloneNode(!0)}function g(a,c,d){var g=a.state.foldGutter.options,h=c,i=a.foldOption(g,"minFoldSize"),j=a.foldOption(g,"rangeFinder");a.eachLine(c,d,function(c){var d=null;if(e(a,h))d=f(g.indicatorFolded);else{var k=b(h,0),l=j&&j(a,k);l&&l.to.line-l.from.line>=i&&(d=f(g.indicatorOpen))}a.setGutterMarker(c,g.gutter,d),++h})}function h(a){var b=a.getViewport(),c=a.state.foldGutter;c&&(a.operation(function(){g(a,b.from,b.to)}),c.from=b.from,c.to=b.to)}function i(a,c,d){var f=a.state.foldGutter;if(f){var g=f.options;if(d==g.gutter){var h=e(a,c);h?h.clear():a.foldCode(b(c,0),g.rangeFinder)}}}function j(a){var b=a.state.foldGutter;if(b){var c=b.options;b.from=b.to=0,clearTimeout(b.changeUpdate),b.changeUpdate=setTimeout(function(){h(a)},c.foldOnChangeTimeSpan||600)}}function k(a){var b=a.state.foldGutter;if(b){var c=b.options;clearTimeout(b.changeUpdate),b.changeUpdate=setTimeout(function(){var c=a.getViewport();b.from==b.to||c.from-b.to>20||b.from-c.to>20?h(a):a.operation(function(){c.from<b.from&&(g(a,c.from,b.from),b.from=c.from),c.to>b.to&&(g(a,b.to,c.to),b.to=c.to)})},c.updateViewportTimeSpan||400)}}function l(a,b){var c=a.state.foldGutter;if(c){var d=b.line;d>=c.from&&d<c.to&&g(a,d,d+1)}}a.defineOption("foldGutter",!1,function(b,e,f){f&&f!=a.Init&&(b.clearGutter(b.state.foldGutter.options.gutter),b.state.foldGutter=null,b.off("gutterClick",i),b.off("change",j),b.off("viewportChange",k),b.off("fold",l),b.off("unfold",l),b.off("swapDoc",h)),e&&(b.state.foldGutter=new c(d(e)),h(b),b.on("gutterClick",i),b.on("change",j),b.on("viewportChange",k),b.on("fold",l),b.on("unfold",l),b.on("swapDoc",h))});var b=a.Pos}),function(a){"object"==typeof exports&&"object"==typeof module?a(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],a):a(CodeMirror)}(function(a){"use strict";a.registerHelper("fold","indent",function(b,c){var d=b.getOption("tabSize"),e=b.getLine(c.line);if(/\S/.test(e)){for(var f=function(b){return a.countColumn(b,null,d)},g=f(e),h=null,i=c.line+1,j=b.lastLine();j>=i;++i){var k=b.getLine(i),l=f(k);if(l>g)h=i;else if(/\S/.test(k))break}return h?{from:a.Pos(c.line,e.length),to:a.Pos(h,b.getLine(h).length)}:void 0}})}),function(a){"object"==typeof exports&&"object"==typeof module?a(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],a):a(CodeMirror)}(function(a){"use strict";function f(a){"object"==typeof a&&(this.minChars=a.minChars,this.style=a.style,this.showToken=a.showToken,this.delay=a.delay,this.wordsOnly=a.wordsOnly),null==this.style&&(this.style=c),null==this.minChars&&(this.minChars=b),null==this.delay&&(this.delay=d),null==this.wordsOnly&&(this.wordsOnly=e),this.overlay=this.timeout=null}function g(a){var b=a.state.matchHighlighter;clearTimeout(b.timeout),b.timeout=setTimeout(function(){h(a)},b.delay)}function h(a){a.operation(function(){var b=a.state.matchHighlighter;if(b.overlay&&(a.removeOverlay(b.overlay),b.overlay=null),!a.somethingSelected()&&b.showToken){for(var c=b.showToken===!0?/[\w$]/:b.showToken,d=a.getCursor(),e=a.getLine(d.line),f=d.ch,g=f;f&&c.test(e.charAt(f-1));)--f;for(;g<e.length&&c.test(e.charAt(g));)++g;return void(g>f&&a.addOverlay(b.overlay=k(e.slice(f,g),c,b.style)))}var h=a.getCursor("from"),j=a.getCursor("to");if(h.line==j.line&&(!b.wordsOnly||i(a,h,j))){var l=a.getRange(h,j).replace(/^\s+|\s+$/g,"");l.length>=b.minChars&&a.addOverlay(b.overlay=k(l,!1,b.style))}})}function i(a,b,c){var d=a.getRange(b,c);if(null!==d.match(/^\w+$/)){if(b.ch>0){var e={line:b.line,ch:b.ch-1},f=a.getRange(e,b);if(null===f.match(/\W/))return!1}if(c.ch<a.getLine(b.line).length){var e={line:c.line,ch:c.ch+1},f=a.getRange(c,e);if(null===f.match(/\W/))return!1}return!0}return!1}function j(a,b){return!(a.start&&b.test(a.string.charAt(a.start-1))||a.pos!=a.string.length&&b.test(a.string.charAt(a.pos)))}function k(a,b,c){return{token:function(d){return!d.match(a)||b&&!j(d,b)?(d.next(),void(d.skipTo(a.charAt(0))||d.skipToEnd())):c}}}var b=2,c="matchhighlight",d=100,e=!1;a.defineOption("highlightSelectionMatches",!1,function(b,c,d){if(d&&d!=a.Init){var e=b.state.matchHighlighter.overlay;e&&b.removeOverlay(e),clearTimeout(b.state.matchHighlighter.timeout),b.state.matchHighlighter=null,b.off("cursorActivity",g)}c&&(b.state.matchHighlighter=new f(c),h(b),b.on("cursorActivity",g))})}),function(a){"object"==typeof exports&&"object"==typeof module?a(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],a):a(CodeMirror)}(function(a){function e(a,b,e,g){var h=a.getLineHandle(b.line),i=b.ch-1,j=i>=0&&d[h.text.charAt(i)]||d[h.text.charAt(++i)];if(!j)return null;var k=">"==j.charAt(1)?1:-1;if(e&&k>0!=(i==b.ch))return null;var l=a.getTokenTypeAt(c(b.line,i+1)),m=f(a,c(b.line,i+(k>0?1:0)),k,l||null,g);return null==m?null:{from:c(b.line,i),to:m&&m.pos,match:m&&m.ch==j.charAt(0),forward:k>0}}function f(a,b,e,f,g){for(var h=g&&g.maxScanLineLength||1e4,i=g&&g.maxScanLines||1e3,j=[],k=g&&g.bracketRegex?g.bracketRegex:/[(){}[\]]/,l=e>0?Math.min(b.line+i,a.lastLine()+1):Math.max(a.firstLine()-1,b.line-i),m=b.line;m!=l;m+=e){var n=a.getLine(m);if(n){var o=e>0?0:n.length-1,p=e>0?n.length:-1;if(!(n.length>h))for(m==b.line&&(o=b.ch-(0>e?1:0));o!=p;o+=e){var q=n.charAt(o);if(k.test(q)&&(void 0===f||a.getTokenTypeAt(c(m,o+1))==f)){var r=d[q];if(">"==r.charAt(1)==e>0)j.push(q);else{if(!j.length)return{pos:c(m,o),ch:q};j.pop()}}}}}return m-e==(e>0?a.lastLine():a.firstLine())?!1:null}function g(a,d,f){for(var g=a.state.matchBrackets.maxHighlightLineLength||1e3,h=[],i=a.listSelections(),j=0;j<i.length;j++){var k=i[j].empty()&&e(a,i[j].head,!1,f);if(k&&a.getLine(k.from.line).length<=g){var l=k.match?"CodeMirror-matchingbracket":"CodeMirror-nonmatchingbracket";h.push(a.markText(k.from,c(k.from.line,k.from.ch+1),{className:l})),k.to&&a.getLine(k.to.line).length<=g&&h.push(a.markText(k.to,c(k.to.line,k.to.ch+1),{className:l}))}}if(h.length){b&&a.state.focused&&a.focus();var m=function(){a.operation(function(){for(var a=0;a<h.length;a++)h[a].clear()})};if(!d)return m;setTimeout(m,800)}}function i(a){a.operation(function(){h&&(h(),h=null),h=g(a,!1,a.state.matchBrackets)})}var b=/MSIE \d/.test(navigator.userAgent)&&(null==document.documentMode||document.documentMode<8),c=a.Pos,d={"(":")>",")":"(<","[":"]>","]":"[<","{":"}>","}":"{<"},h=null;a.defineOption("matchBrackets",!1,function(b,c,d){d&&d!=a.Init&&b.off("cursorActivity",i),c&&(b.state.matchBrackets="object"==typeof c?c:{},b.on("cursorActivity",i))}),a.defineExtension("matchBrackets",function(){g(this,!0)}),a.defineExtension("findMatchingBracket",function(a,b,c){return e(this,a,b,c)}),a.defineExtension("scanForBracket",function(a,b,c,d){return f(this,a,b,c,d)})}),function(a){"object"==typeof exports&&"object"==typeof module?a(require("../../lib/codemirror"),require("../fold/xml-fold")):"function"==typeof define&&define.amd?define(["../../lib/codemirror","../fold/xml-fold"],a):a(CodeMirror)}(function(a){"use strict";function b(a){a.state.tagHit&&a.state.tagHit.clear(),a.state.tagOther&&a.state.tagOther.clear(),a.state.tagHit=a.state.tagOther=null}function c(c){c.state.failedTagMatch=!1,c.operation(function(){if(b(c),!c.somethingSelected()){var d=c.getCursor(),e=c.getViewport();e.from=Math.min(e.from,d.line),e.to=Math.max(d.line+1,e.to);var f=a.findMatchingTag(c,d,e);if(f){if(c.state.matchBothTags){var g="open"==f.at?f.open:f.close;g&&(c.state.tagHit=c.markText(g.from,g.to,{className:"CodeMirror-matchingtag"}))}var h="close"==f.at?f.open:f.close;h?c.state.tagOther=c.markText(h.from,h.to,{className:"CodeMirror-matchingtag"}):c.state.failedTagMatch=!0}}})}function d(a){a.state.failedTagMatch&&c(a)}a.defineOption("matchTags",!1,function(e,f,g){g&&g!=a.Init&&(e.off("cursorActivity",c),e.off("viewportChange",d),b(e)),f&&(e.state.matchBothTags="object"==typeof f&&f.bothTags,e.on("cursorActivity",c),e.on("viewportChange",d),c(e))}),a.commands.toMatchingTag=function(b){var c=a.findMatchingTag(b,b.getCursor());if(c){var d="close"==c.at?c.open:c.close;d&&b.extendSelection(d.to,d.from)}}}),function(a){"object"==typeof exports&&"object"==typeof module?a(require("../../lib/codemirror"),require("./searchcursor"),require("../dialog/dialog")):"function"==typeof define&&define.amd?define(["../../lib/codemirror","./searchcursor","../dialog/dialog"],a):a(CodeMirror)}(function(a){"use strict";function b(a,b){return"string"==typeof a?a=new RegExp(a.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&"),b?"gi":"g"):a.global||(a=new RegExp(a.source,a.ignoreCase?"gi":"g")),{token:function(b){a.lastIndex=b.pos;var c=a.exec(b.string);return c&&c.index==b.pos?(b.pos+=c[0].length,"searching"):void(c?b.pos=c.index:b.skipToEnd())}}}function c(){this.posFrom=this.posTo=this.lastQuery=this.query=null,this.overlay=null}function d(a){return a.state.search||(a.state.search=new c)}function e(a){return"string"==typeof a&&a==a.toLowerCase()}function f(a,b,c){return a.getSearchCursor(b,c,e(b))}function g(a,b,c,d){a.openDialog(b,d,{value:c,selectValueOnOpen:!0,closeOnEnter:!1,onClose:function(){p(a)}})}function h(a,b,c,d,e){a.openDialog?a.openDialog(b,e,{value:d,selectValueOnOpen:!0}):e(prompt(c,d))}function i(a,b,c,d){a.openConfirm?a.openConfirm(b,d):confirm(c)&&d[0]()}function j(a){return a.replace(/\\(.)/g,function(a,b){return"n"==b?"\n":"r"==b?"\r":b})}function k(a){var b=a.match(/^\/(.*)\/([a-z]*)$/);if(b)try{a=new RegExp(b[1],-1==b[2].indexOf("i")?"":"i")}catch(c){}else a=j(a);return("string"==typeof a?""==a:a.test(""))&&(a=/x^/),a}function m(a,c,d){c.queryText=d,c.query=k(d),a.removeOverlay(c.overlay,e(c.query)),c.overlay=b(c.query,e(c.query)),a.addOverlay(c.overlay),a.showMatchesOnScrollbar&&(c.annotate&&(c.annotate.clear(),c.annotate=null),c.annotate=a.showMatchesOnScrollbar(c.query,e(c.query)))}function n(b,c,e){var f=d(b);if(f.query)return o(b,c);var i=b.getSelection()||f.lastQuery;e&&b.openDialog?g(b,l,i,function(c,d){a.e_stop(d),c&&(c!=f.queryText&&m(b,f,c),o(b,d.shiftKey))}):h(b,l,"Search for:",i,function(a){a&&!f.query&&b.operation(function(){m(b,f,a),f.posFrom=f.posTo=b.getCursor(),o(b,c)})})}function o(b,c){b.operation(function(){var e=d(b),g=f(b,e.query,c?e.posFrom:e.posTo);(g.find(c)||(g=f(b,e.query,c?a.Pos(b.lastLine()):a.Pos(b.firstLine(),0)),g.find(c)))&&(b.setSelection(g.from(),g.to()),b.scrollIntoView({from:g.from(),to:g.to()},20),e.posFrom=g.from(),e.posTo=g.to())})}function p(a){a.operation(function(){var b=d(a);b.lastQuery=b.query,b.query&&(b.query=b.queryText=null,a.removeOverlay(b.overlay),b.annotate&&(b.annotate.clear(),b.annotate=null))})}function t(a,b){if(!a.getOption("readOnly")){var c=a.getSelection()||d(a).lastQuery;h(a,q,"Replace:",c,function(c){c&&(c=k(c),h(a,r,"Replace with:","",function(d){if(d=j(d),b)a.operation(function(){for(var b=f(a,c);b.findNext();)if("string"!=typeof c){var e=a.getRange(b.from(),b.to()).match(c);b.replace(d.replace(/\$(\d)/g,function(a,b){return e[b]}))}else b.replace(d)});else{p(a);var e=f(a,c,a.getCursor()),g=function(){var d,b=e.from();!(d=e.findNext())&&(e=f(a,c),!(d=e.findNext())||b&&e.from().line==b.line&&e.from().ch==b.ch)||(a.setSelection(e.from(),e.to()),a.scrollIntoView({from:e.from(),to:e.to()}),i(a,s,"Replace?",[function(){h(d)},g]))},h=function(a){e.replace("string"==typeof c?d:d.replace(/\$(\d)/g,function(b,c){return a[c]})),g()};g()}}))})}}var l='Search: <input type="text" style="width: 10em" class="CodeMirror-search-field"/> <span style="color: #888" class="CodeMirror-search-hint">(Use /re/ syntax for regexp search)</span>',q='Replace: <input type="text" style="width: 10em" class="CodeMirror-search-field"/> <span style="color: #888" class="CodeMirror-search-hint">(Use /re/ syntax for regexp search)</span>',r='With: <input type="text" style="width: 10em" class="CodeMirror-search-field"/>',s="Replace? <button>Yes</button> <button>No</button> <button>Stop</button>";a.commands.find=function(a){p(a),n(a)},a.commands.findPersistent=function(a){p(a),n(a,!1,!0)},a.commands.findNext=n,a.commands.findPrev=function(a){n(a,!0)},a.commands.clearSearch=p,a.commands.replace=t,a.commands.replaceAll=function(a){t(a,!0)}}),function(a){"object"==typeof exports&&"object"==typeof module?a(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],a):a(CodeMirror)}(function(a){"use strict";function c(a,b){return a.line-b.line||a.ch-b.ch}function g(a,b,c,d){this.line=b,this.ch=c,this.cm=a,this.text=a.getLine(b),this.min=d?d.from:a.firstLine(),this.max=d?d.to-1:a.lastLine()}function h(a,c){var d=a.cm.getTokenTypeAt(b(a.line,c));return d&&/\btag\b/.test(d)}function i(a){return a.line>=a.max?void 0:(a.ch=0,a.text=a.cm.getLine(++a.line),!0)}function j(a){return a.line<=a.min?void 0:(a.text=a.cm.getLine(--a.line),a.ch=a.text.length,!0)}function k(a){for(;;){var b=a.text.indexOf(">",a.ch);if(-1==b){if(i(a))continue;return}{if(h(a,b+1)){var c=a.text.lastIndexOf("/",b),d=c>-1&&!/\S/.test(a.text.slice(c+1,b));return a.ch=b+1,d?"selfClose":"regular"}a.ch=b+1}}}function l(a){for(;;){var b=a.ch?a.text.lastIndexOf("<",a.ch-1):-1;if(-1==b){if(j(a))continue;return}if(h(a,b+1)){f.lastIndex=b,a.ch=b;var c=f.exec(a.text);if(c&&c.index==b)return c}else a.ch=b}}function m(a){for(;;){f.lastIndex=a.ch;var b=f.exec(a.text);if(!b){if(i(a))continue;return}{if(h(a,b.index+1))return a.ch=b.index+b[0].length,b;a.ch=b.index+1}}}function n(a){for(;;){var b=a.ch?a.text.lastIndexOf(">",a.ch-1):-1;if(-1==b){if(j(a))continue;return}{if(h(a,b+1)){var c=a.text.lastIndexOf("/",b),d=c>-1&&!/\S/.test(a.text.slice(c+1,b));return a.ch=b+1,d?"selfClose":"regular"}a.ch=b}}}function o(a,c){for(var d=[];;){var f,e=m(a),g=a.line,h=a.ch-(e?e[0].length:0);if(!e||!(f=k(a)))return;if("selfClose"!=f)if(e[1]){for(var i=d.length-1;i>=0;--i)if(d[i]==e[2]){d.length=i;break}if(0>i&&(!c||c==e[2]))return{tag:e[2],from:b(g,h),to:b(a.line,a.ch)}}else d.push(e[2])}}function p(a,c){for(var d=[];;){var e=n(a);if(!e)return;if("selfClose"!=e){var f=a.line,g=a.ch,h=l(a);if(!h)return;if(h[1])d.push(h[2]);else{for(var i=d.length-1;i>=0;--i)if(d[i]==h[2]){d.length=i;break}if(0>i&&(!c||c==h[2]))return{tag:h[2],from:b(a.line,a.ch),to:b(f,g)}}}else l(a)}}var b=a.Pos,d="A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD",e=d+"-:.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040",f=new RegExp("<(/?)(["+d+"]["+e+"]*)","g");a.registerHelper("fold","xml",function(a,c){for(var d=new g(a,c.line,0);;){var f,e=m(d);if(!e||d.line!=c.line||!(f=k(d)))return;if(!e[1]&&"selfClose"!=f){var c=b(d.line,d.ch),h=o(d,e[2]);return h&&{from:c,to:h.from}}}}),a.findMatchingTag=function(a,d,e){var f=new g(a,d.line,d.ch,e);if(-1!=f.text.indexOf(">")||-1!=f.text.indexOf("<")){var h=k(f),i=h&&b(f.line,f.ch),j=h&&l(f);if(h&&j&&!(c(f,d)>0)){var m={from:b(f.line,f.ch),to:i,tag:j[2]};return"selfClose"==h?{open:m,close:null,at:"open"}:j[1]?{open:p(f,j[2]),close:m,at:"close"}:(f=new g(a,i.line,i.ch,e),{open:m,close:o(f,j[2]),at:"open"})}}},a.findEnclosingTag=function(a,b,c){for(var d=new g(a,b.line,b.ch,c);;){var e=p(d);if(!e)break;var f=new g(a,b.line,b.ch,c),h=o(f,e.tag);if(h)return{open:e,close:h}}},a.scanForClosingTag=function(a,b,c,d){var e=new g(a,b.line,b.ch,d?{from:0,to:d}:null);return o(e,c)}});
\ No newline at end of file
diff --git a/htdocs/Libs/Codemirror/codemirror.orig.css b/htdocs/Libs/Codemirror/codemirror.orig.css
new file mode 100644
index 0000000..f1aa66d
--- /dev/null
+++ b/htdocs/Libs/Codemirror/codemirror.orig.css
@@ -0,0 +1,368 @@
+/* BASICS */
+
+.CodeMirror {
+  /* Set height, width, borders, and global font properties here */
+  font-family: monospace;
+  height: 300px;
+  color: black;
+  direction: ltr;
+}
+
+/* PADDING */
+
+.CodeMirror-lines {
+  padding: 4px 0; /* Vertical padding around content */
+}
+.CodeMirror pre.CodeMirror-line,
+.CodeMirror pre.CodeMirror-line-like {
+  padding: 0 4px; /* Horizontal padding of content */
+}
+
+.CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {
+  background-color: white; /* The little square between H and V scrollbars */
+}
+
+/* GUTTER */
+
+.CodeMirror-gutters {
+  border-right: 1px solid #ddd;
+  background-color: #f7f7f7;
+  white-space: nowrap;
+}
+.CodeMirror-linenumbers {}
+.CodeMirror-linenumber {
+  padding: 0 3px 0 5px;
+  min-width: 20px;
+  text-align: right;
+  color: #999;
+  white-space: nowrap;
+}
+
+.CodeMirror-guttermarker { color: black; }
+.CodeMirror-guttermarker-subtle { color: #999; }
+
+/* CURSOR */
+
+.CodeMirror-cursor {
+  border-left: 1px solid black;
+  border-right: none;
+  width: 0;
+}
+/* Shown when moving in bi-directional text */
+.CodeMirror div.CodeMirror-secondarycursor {
+  border-left: 1px solid silver;
+}
+.cm-fat-cursor .CodeMirror-cursor {
+  width: auto;
+  border: 0 !important;
+  background: #7e7;
+}
+.cm-fat-cursor div.CodeMirror-cursors {
+  z-index: 1;
+}
+.cm-fat-cursor-mark {
+  background-color: rgba(20, 255, 20, 0.5);
+  -webkit-animation: blink 1.06s steps(1) infinite;
+  -moz-animation: blink 1.06s steps(1) infinite;
+  animation: blink 1.06s steps(1) infinite;
+}
+.cm-animate-fat-cursor {
+  width: auto;
+  border: 0;
+  -webkit-animation: blink 1.06s steps(1) infinite;
+  -moz-animation: blink 1.06s steps(1) infinite;
+  animation: blink 1.06s steps(1) infinite;
+  background-color: #7e7;
+}
+@-moz-keyframes blink {
+  0% {}
+  50% { background-color: transparent; }
+  100% {}
+}
+@-webkit-keyframes blink {
+  0% {}
+  50% { background-color: transparent; }
+  100% {}
+}
+@keyframes blink {
+  0% {}
+  50% { background-color: transparent; }
+  100% {}
+}
+
+/* Can style cursor different in overwrite (non-insert) mode */
+.CodeMirror-overwrite .CodeMirror-cursor {}
+
+.cm-tab { display: inline-block; text-decoration: inherit; }
+
+.CodeMirror-rulers {
+  position: absolute;
+  left: 0; right: 0; top: -50px; bottom: 0;
+  overflow: hidden;
+}
+.CodeMirror-ruler {
+  border-left: 1px solid #ccc;
+  top: 0; bottom: 0;
+  position: absolute;
+}
+
+/* DEFAULT THEME */
+
+.cm-s-default .cm-header {color: blue;}
+.cm-s-default .cm-quote {color: #090;}
+.cm-negative {color: #d44;}
+.cm-positive {color: #292;}
+.cm-header, .cm-strong {font-weight: bold;}
+.cm-em {font-style: italic;}
+.cm-link {text-decoration: underline;}
+.cm-strikethrough {text-decoration: line-through;}
+
+.cm-s-default .cm-keyword {color: #708;}
+.cm-s-default .cm-atom {color: #219;}
+.cm-s-default .cm-number {color: #164;}
+.cm-s-default .cm-def {color: #00f;}
+.cm-s-default .cm-variable,
+.cm-s-default .cm-punctuation,
+.cm-s-default .cm-property,
+.cm-s-default .cm-operator {}
+.cm-s-default .cm-variable-2 {color: #05a;}
+.cm-s-default .cm-variable-3, .cm-s-default .cm-type {color: #085;}
+.cm-s-default .cm-comment {color: #a50;}
+.cm-s-default .cm-string {color: #a11;}
+.cm-s-default .cm-string-2 {color: #f50;}
+.cm-s-default .cm-meta {color: #555;}
+.cm-s-default .cm-qualifier {color: #555;}
+.cm-s-default .cm-builtin {color: #30a;}
+.cm-s-default .cm-bracket {color: #997;}
+.cm-s-default .cm-tag {color: #170;}
+.cm-s-default .cm-attribute {color: #00c;}
+.cm-s-default .cm-hr {color: #999;}
+.cm-s-default .cm-link {color: #00c;}
+
+.cm-s-default .cm-error {color: #f00;}
+.cm-invalidchar {color: #f00;}
+
+.CodeMirror-composing { border-bottom: 2px solid; }
+
+/* Default styles for common addons */
+
+div.CodeMirror span.CodeMirror-matchingbracket {color: #0b0;}
+div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #a22;}
+.CodeMirror-matchingtag { background: rgba(255, 150, 0, .3); }
+.CodeMirror-activeline-background {background: #e8f2ff;}
+
+/* STOP */
+
+/* The rest of this file contains styles related to the mechanics of
+   the editor. You probably shouldn't touch them. */
+
+.CodeMirror {
+  position: relative;
+  overflow: hidden;
+  background: white;
+}
+
+.CodeMirror-scroll {
+  overflow: scroll !important; /* Things will break if this is overridden */
+  /* 50px is the magic margin used to hide the element's real scrollbars */
+  /* See overflow: hidden in .CodeMirror */
+  margin-bottom: -50px; margin-right: -50px;
+  padding-bottom: 50px;
+  height: 100%;
+  outline: none; /* Prevent dragging from highlighting the element */
+  position: relative;
+}
+.CodeMirror-sizer {
+  position: relative;
+  border-right: 50px solid transparent;
+}
+
+/* The fake, visible scrollbars. Used to force redraw during scrolling
+   before actual scrolling happens, thus preventing shaking and
+   flickering artifacts. */
+.CodeMirror-vscrollbar, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {
+  position: absolute;
+  z-index: 6;
+  display: none;
+  outline: none;
+}
+.CodeMirror-vscrollbar {
+  right: 0; top: 0;
+  overflow-x: hidden;
+  overflow-y: scroll;
+}
+.CodeMirror-hscrollbar {
+  bottom: 0; left: 0;
+  overflow-y: hidden;
+  overflow-x: scroll;
+}
+.CodeMirror-scrollbar-filler {
+  right: 0; bottom: 0;
+}
+.CodeMirror-gutter-filler {
+  left: 0; bottom: 0;
+}
+
+.CodeMirror-gutters {
+  position: absolute; left: 0; top: 0;
+  min-height: 100%;
+  z-index: 3;
+}
+.CodeMirror-gutter {
+  white-space: normal;
+  height: 100%;
+  display: inline-block;
+  vertical-align: top;
+  margin-bottom: -50px;
+}
+.CodeMirror-gutter-wrapper {
+  position: absolute;
+  z-index: 4;
+  background: none !important;
+  border: none !important;
+}
+.CodeMirror-gutter-background {
+  position: absolute;
+  top: 0; bottom: 0;
+  z-index: 4;
+}
+.CodeMirror-gutter-elt {
+  position: absolute;
+  cursor: default;
+  z-index: 4;
+}
+.CodeMirror-gutter-wrapper ::selection { background-color: transparent }
+.CodeMirror-gutter-wrapper ::-moz-selection { background-color: transparent }
+
+.CodeMirror-lines {
+  cursor: text;
+  min-height: 1px; /* prevents collapsing before first draw */
+}
+.CodeMirror pre.CodeMirror-line,
+.CodeMirror pre.CodeMirror-line-like {
+  /* Reset some styles that the rest of the page might have set */
+  -moz-border-radius: 0; -webkit-border-radius: 0; border-radius: 0;
+  border-width: 0;
+  background: transparent;
+  font-family: inherit;
+  font-size: inherit;
+  margin: 0;
+  white-space: pre;
+  word-wrap: normal;
+  line-height: inherit;
+  color: inherit;
+  z-index: 2;
+  position: relative;
+  overflow: visible;
+  -webkit-tap-highlight-color: transparent;
+  -webkit-font-variant-ligatures: contextual;
+  font-variant-ligatures: contextual;
+}
+.CodeMirror-wrap pre.CodeMirror-line,
+.CodeMirror-wrap pre.CodeMirror-line-like {
+  word-wrap: break-word;
+  white-space: pre-wrap;
+  word-break: normal;
+}
+
+.CodeMirror-linebackground {
+  position: absolute;
+  left: 0; right: 0; top: 0; bottom: 0;
+  z-index: 0;
+}
+
+.CodeMirror-linewidget {
+  position: relative;
+  z-index: 2;
+  padding: 0.1px; /* Force widget margins to stay inside of the container */
+}
+
+.CodeMirror-widget {}
+
+.CodeMirror-rtl pre { direction: rtl; }
+
+.CodeMirror-code {
+  outline: none;
+}
+
+/* Force content-box sizing for the elements where we expect it */
+.CodeMirror-scroll,
+.CodeMirror-sizer,
+.CodeMirror-gutter,
+.CodeMirror-gutters,
+.CodeMirror-linenumber {
+  -moz-box-sizing: content-box;
+  box-sizing: content-box;
+}
+
+.CodeMirror-measure {
+  position: absolute;
+  width: 100%;
+  height: 0;
+  overflow: hidden;
+  visibility: hidden;
+}
+
+.CodeMirror-cursor {
+  position: absolute;
+  pointer-events: none;
+}
+.CodeMirror-measure pre { position: static; }
+
+div.CodeMirror-cursors {
+  visibility: hidden;
+  position: relative;
+  z-index: 3;
+}
+div.CodeMirror-dragcursors {
+  visibility: visible;
+}
+
+.CodeMirror-focused div.CodeMirror-cursors {
+  visibility: visible;
+}
+
+.CodeMirror-selected { background: #d9d9d9; }
+.CodeMirror-focused .CodeMirror-selected { background: #d7d4f0; }
+.CodeMirror-crosshair { cursor: crosshair; }
+.CodeMirror-line::selection, .CodeMirror-line > span::selection, .CodeMirror-line > span > span::selection { background: #d7d4f0; }
+.CodeMirror-line::-moz-selection, .CodeMirror-line > span::-moz-selection, .CodeMirror-line > span > span::-moz-selection { background: #d7d4f0; }
+
+.cm-searching {
+  background-color: #ffa;
+  background-color: rgba(255, 255, 0, .4);
+}
+
+/* Used to force a border model for a node */
+.cm-force-border { padding-right: .1px; }
+
+@media print {
+  /* Hide the cursor when printing */
+  .CodeMirror div.CodeMirror-cursors {
+    visibility: hidden;
+  }
+}
+
+/* See issue #2901 */
+.cm-tab-wrap-hack:after { content: ''; }
+
+/* Help users use markselection to safely style text background */
+span.CodeMirror-selectedtext { background: none; }
+
+.CodeMirror-foldmarker {    
+  font-family: arial;
+}
+.CodeMirror-foldgutter {
+  width: .7em;
+}
+.CodeMirror-foldgutter-open,
+.CodeMirror-foldgutter-folded {
+  color: #555;
+  cursor: pointer;
+}
+.CodeMirror-foldgutter-open:after {
+  content: "\25BE";
+}
+.CodeMirror-foldgutter-folded:after {
+  content: "\25B8";
+}
diff --git a/htdocs/Libs/Codemirror/foldcode.js b/htdocs/Libs/Codemirror/foldcode.js
new file mode 100644
index 0000000..887df3f
--- /dev/null
+++ b/htdocs/Libs/Codemirror/foldcode.js
@@ -0,0 +1,157 @@
+// CodeMirror, copyright (c) by Marijn Haverbeke and others
+// Distributed under an MIT license: https://codemirror.net/LICENSE
+
+(function(mod) {
+  if (typeof exports == "object" && typeof module == "object") // CommonJS
+    mod(require("../../lib/codemirror"));
+  else if (typeof define == "function" && define.amd) // AMD
+    define(["../../lib/codemirror"], mod);
+  else // Plain browser env
+    mod(CodeMirror);
+})(function(CodeMirror) {
+  "use strict";
+
+  function doFold(cm, pos, options, force) {
+    if (options && options.call) {
+      var finder = options;
+      options = null;
+    } else {
+      var finder = getOption(cm, options, "rangeFinder");
+    }
+    if (typeof pos == "number") pos = CodeMirror.Pos(pos, 0);
+    var minSize = getOption(cm, options, "minFoldSize");
+
+    function getRange(allowFolded) {
+      var range = finder(cm, pos);
+      if (!range || range.to.line - range.from.line < minSize) return null;
+      var marks = cm.findMarksAt(range.from);
+      for (var i = 0; i < marks.length; ++i) {
+        if (marks[i].__isFold && force !== "fold") {
+          if (!allowFolded) return null;
+          range.cleared = true;
+          marks[i].clear();
+        }
+      }
+      return range;
+    }
+
+    var range = getRange(true);
+    if (getOption(cm, options, "scanUp")) while (!range && pos.line > cm.firstLine()) {
+      pos = CodeMirror.Pos(pos.line - 1, 0);
+      range = getRange(false);
+    }
+    if (!range || range.cleared || force === "unfold") return;
+
+    var myWidget = makeWidget(cm, options, range);
+    CodeMirror.on(myWidget, "mousedown", function(e) {
+      myRange.clear();
+      CodeMirror.e_preventDefault(e);
+    });
+    var myRange = cm.markText(range.from, range.to, {
+      replacedWith: myWidget,
+      clearOnEnter: getOption(cm, options, "clearOnEnter"),
+      __isFold: true
+    });
+    myRange.on("clear", function(from, to) {
+      CodeMirror.signal(cm, "unfold", cm, from, to);
+    });
+    CodeMirror.signal(cm, "fold", cm, range.from, range.to);
+  }
+
+  function makeWidget(cm, options, range) {
+    var widget = getOption(cm, options, "widget");
+
+    if (typeof widget == "function") {
+      widget = widget(range.from, range.to);
+    }
+
+    if (typeof widget == "string") {
+      var text = document.createTextNode(widget);
+      widget = document.createElement("span");
+      widget.appendChild(text);
+      widget.className = "CodeMirror-foldmarker";
+    } else if (widget) {
+      widget = widget.cloneNode(true)
+    }
+    return widget;
+  }
+
+  // Clumsy backwards-compatible interface
+  CodeMirror.newFoldFunction = function(rangeFinder, widget) {
+    return function(cm, pos) { doFold(cm, pos, {rangeFinder: rangeFinder, widget: widget}); };
+  };
+
+  // New-style interface
+  CodeMirror.defineExtension("foldCode", function(pos, options, force) {
+    doFold(this, pos, options, force);
+  });
+
+  CodeMirror.defineExtension("isFolded", function(pos) {
+    var marks = this.findMarksAt(pos);
+    for (var i = 0; i < marks.length; ++i)
+      if (marks[i].__isFold) return true;
+  });
+
+  CodeMirror.commands.toggleFold = function(cm) {
+    cm.foldCode(cm.getCursor());
+  };
+  CodeMirror.commands.fold = function(cm) {
+    cm.foldCode(cm.getCursor(), null, "fold");
+  };
+  CodeMirror.commands.unfold = function(cm) {
+    cm.foldCode(cm.getCursor(), null, "unfold");
+  };
+  CodeMirror.commands.foldAll = function(cm) {
+    cm.operation(function() {
+      for (var i = cm.firstLine(), e = cm.lastLine(); i <= e; i++)
+        cm.foldCode(CodeMirror.Pos(i, 0), null, "fold");
+    });
+  };
+  CodeMirror.commands.unfoldAll = function(cm) {
+    cm.operation(function() {
+      for (var i = cm.firstLine(), e = cm.lastLine(); i <= e; i++)
+        cm.foldCode(CodeMirror.Pos(i, 0), null, "unfold");
+    });
+  };
+
+  CodeMirror.registerHelper("fold", "combine", function() {
+    var funcs = Array.prototype.slice.call(arguments, 0);
+    return function(cm, start) {
+      for (var i = 0; i < funcs.length; ++i) {
+        var found = funcs[i](cm, start);
+        if (found) return found;
+      }
+    };
+  });
+
+  CodeMirror.registerHelper("fold", "auto", function(cm, start) {
+    var helpers = cm.getHelpers(start, "fold");
+    for (var i = 0; i < helpers.length; i++) {
+      var cur = helpers[i](cm, start);
+      if (cur) return cur;
+    }
+  });
+
+  var defaultOptions = {
+    rangeFinder: CodeMirror.fold.auto,
+    widget: "\u2194",
+    minFoldSize: 0,
+    scanUp: false,
+    clearOnEnter: true
+  };
+
+  CodeMirror.defineOption("foldOptions", null);
+
+  function getOption(cm, options, name) {
+    if (options && options[name] !== undefined)
+      return options[name];
+    var editorOptions = cm.options.foldOptions;
+    if (editorOptions && editorOptions[name] !== undefined)
+      return editorOptions[name];
+    return defaultOptions[name];
+  }
+
+  CodeMirror.defineExtension("foldOption", function(options, name) {
+    return getOption(this, options, name);
+  });
+});
diff --git a/htdocs/Libs/Codemirror/foldgutter.js b/htdocs/Libs/Codemirror/foldgutter.js
new file mode 100644
index 0000000..7d46a60
--- /dev/null
+++ b/htdocs/Libs/Codemirror/foldgutter.js
@@ -0,0 +1,163 @@
+// CodeMirror, copyright (c) by Marijn Haverbeke and others
+// Distributed under an MIT license: https://codemirror.net/LICENSE
+
+(function(mod) {
+  if (typeof exports == "object" && typeof module == "object") // CommonJS
+    mod(require("../../lib/codemirror"), require("./foldcode"));
+  else if (typeof define == "function" && define.amd) // AMD
+    define(["../../lib/codemirror", "./foldcode"], mod);
+  else // Plain browser env
+    mod(CodeMirror);
+})(function(CodeMirror) {
+  "use strict";
+
+  CodeMirror.defineOption("foldGutter", false, function(cm, val, old) {
+    if (old && old != CodeMirror.Init) {
+      cm.clearGutter(cm.state.foldGutter.options.gutter);
+      cm.state.foldGutter = null;
+      cm.off("gutterClick", onGutterClick);
+      cm.off("changes", onChange);
+      cm.off("viewportChange", onViewportChange);
+      cm.off("fold", onFold);
+      cm.off("unfold", onFold);
+      cm.off("swapDoc", onChange);
+    }
+    if (val) {
+      cm.state.foldGutter = new State(parseOptions(val));
+      updateInViewport(cm);
+      cm.on("gutterClick", onGutterClick);
+      cm.on("changes", onChange);
+      cm.on("viewportChange", onViewportChange);
+      cm.on("fold", onFold);
+      cm.on("unfold", onFold);
+      cm.on("swapDoc", onChange);
+    }
+  });
+
+  var Pos = CodeMirror.Pos;
+
+  function State(options) {
+    this.options = options;
+    this.from = this.to = 0;
+  }
+
+  function parseOptions(opts) {
+    if (opts === true) opts = {};
+    if (opts.gutter == null) opts.gutter = "CodeMirror-foldgutter";
+    if (opts.indicatorOpen == null) opts.indicatorOpen = "CodeMirror-foldgutter-open";
+    if (opts.indicatorFolded == null) opts.indicatorFolded = "CodeMirror-foldgutter-folded";
+    return opts;
+  }
+
+  function isFolded(cm, line) {
+    var marks = cm.findMarks(Pos(line, 0), Pos(line + 1, 0));
+    for (var i = 0; i < marks.length; ++i) {
+      if (marks[i].__isFold) {
+        var fromPos = marks[i].find(-1);
+        if (fromPos && fromPos.line === line)
+          return marks[i];
+      }
+    }
+  }
+
+  function marker(spec) {
+    if (typeof spec == "string") {
+      var elt = document.createElement("div");
+      elt.className = spec + " CodeMirror-guttermarker-subtle";
+      return elt;
+    } else {
+      return spec.cloneNode(true);
+    }
+  }
+
+  function updateFoldInfo(cm, from, to) {
+    var opts = cm.state.foldGutter.options, cur = from - 1;
+    var minSize = cm.foldOption(opts, "minFoldSize");
+    var func = cm.foldOption(opts, "rangeFinder");
+    // we can reuse the built-in indicator element if its className matches the new state
+    var clsFolded = typeof opts.indicatorFolded == "string" && classTest(opts.indicatorFolded);
+    var clsOpen = typeof opts.indicatorOpen == "string" && classTest(opts.indicatorOpen);
+    cm.eachLine(from, to, function(line) {
+      ++cur;
+      var mark = null;
+      var old = line.gutterMarkers;
+      if (old) old = old[opts.gutter];
+      if (isFolded(cm, cur)) {
+        if (clsFolded && old && clsFolded.test(old.className)) return;
+        mark = marker(opts.indicatorFolded);
+      } else {
+        var pos = Pos(cur, 0);
+        var range = func && func(cm, pos);
+        if (range && range.to.line - range.from.line >= minSize) {
+          if (clsOpen && old && clsOpen.test(old.className)) return;
+          mark = marker(opts.indicatorOpen);
+        }
+      }
+      if (!mark && !old) return;
+      cm.setGutterMarker(line, opts.gutter, mark);
+    });
+  }
+
+  // copied from CodeMirror/src/util/dom.js
+  function classTest(cls) { return new RegExp("(^|\\s)" + cls + "(?:$|\\s)\\s*") }
+
+  function updateInViewport(cm) {
+    var vp = cm.getViewport(), state = cm.state.foldGutter;
+    if (!state) return;
+    cm.operation(function() {
+      updateFoldInfo(cm, vp.from, vp.to);
+    });
+    state.from = vp.from; state.to = vp.to;
+  }
+
+  function onGutterClick(cm, line, gutter) {
+    var state = cm.state.foldGutter;
+    if (!state) return;
+    var opts = state.options;
+    if (gutter != opts.gutter) return;
+    var folded = isFolded(cm, line);
+    if (folded) folded.clear();
+    else cm.foldCode(Pos(line, 0), opts);
+  }
+
+  function onChange(cm) {
+    var state = cm.state.foldGutter;
+    if (!state) return;
+    var opts = state.options;
+    state.from = state.to = 0;
+    clearTimeout(state.changeUpdate);
+    state.changeUpdate = setTimeout(function() { updateInViewport(cm); }, opts.foldOnChangeTimeSpan || 600);
+  }
+
+  function onViewportChange(cm) {
+    var state = cm.state.foldGutter;
+    if (!state) return;
+    var opts = state.options;
+    clearTimeout(state.changeUpdate);
+    state.changeUpdate = setTimeout(function() {
+      var vp = cm.getViewport();
+      if (state.from == state.to || vp.from - state.to > 20 || state.from - vp.to > 20) {
+        updateInViewport(cm);
+      } else {
+        cm.operation(function() {
+          if (vp.from < state.from) {
+            updateFoldInfo(cm, vp.from, state.from);
+            state.from = vp.from;
+          }
+          if (vp.to > state.to) {
+            updateFoldInfo(cm, state.to, vp.to);
+            state.to = vp.to;
+          }
+        });
+      }
+    }, opts.updateViewportTimeSpan || 400);
+  }
+
+  function onFold(cm, from) {
+    var state = cm.state.foldGutter;
+    if (!state) return;
+    var line = from.line;
+    if (line >= state.from && line < state.to)
+      updateFoldInfo(cm, line, line + 1);
+  }
+});
diff --git a/htdocs/Libs/Codemirror/indent-fold.js b/htdocs/Libs/Codemirror/indent-fold.js
new file mode 100644
index 0000000..0cc1126
--- /dev/null
+++ b/htdocs/Libs/Codemirror/indent-fold.js
@@ -0,0 +1,48 @@
+// CodeMirror, copyright (c) by Marijn Haverbeke and others
+// Distributed under an MIT license: https://codemirror.net/LICENSE
+
+(function(mod) {
+  if (typeof exports == "object" && typeof module == "object") // CommonJS
+    mod(require("../../lib/codemirror"));
+  else if (typeof define == "function" && define.amd) // AMD
+    define(["../../lib/codemirror"], mod);
+  else // Plain browser env
+    mod(CodeMirror);
+})(function(CodeMirror) {
+"use strict";
+
+function lineIndent(cm, lineNo) {
+  var text = cm.getLine(lineNo)
+  var spaceTo = text.search(/\S/)
+  if (spaceTo == -1 || /\bcomment\b/.test(cm.getTokenTypeAt(CodeMirror.Pos(lineNo, spaceTo + 1))))
+    return -1
+  return CodeMirror.countColumn(text, null, cm.getOption("tabSize"))
+}
+
+CodeMirror.registerHelper("fold", "indent", function(cm, start) {
+  var myIndent = lineIndent(cm, start.line)
+  if (myIndent < 0) return
+  var lastLineInFold = null
+
+  // Go through lines until we find a line that definitely doesn't belong in
+  // the block we're folding, or to the end.
+  for (var i = start.line + 1, end = cm.lastLine(); i <= end; ++i) {
+    var indent = lineIndent(cm, i)
+    if (indent == -1) {
+    } else if (indent > myIndent) {
+      // Lines with a greater indent are considered part of the block.
+      lastLineInFold = i;
+    } else {
+      // If this line has non-space, non-comment content, and is
+      // indented less or equal to the start line, it is the start of
+      // another block.
+      break;
+    }
+  }
+  if (lastLineInFold) return {
+    from: CodeMirror.Pos(start.line, cm.getLine(start.line).length),
+    to: CodeMirror.Pos(lastLineInFold, cm.getLine(lastLineInFold).length)
+  };
+});
+
+});
diff --git a/htdocs/Libs/Codemirror/javascript.js b/htdocs/Libs/Codemirror/javascript.js
new file mode 100644
index 0000000..63eaa24
--- /dev/null
+++ b/htdocs/Libs/Codemirror/javascript.js
@@ -0,0 +1,934 @@
+// CodeMirror, copyright (c) by Marijn Haverbeke and others
+// Distributed under an MIT license: https://codemirror.net/LICENSE
+
+(function(mod) {
+  if (typeof exports == "object" && typeof module == "object") // CommonJS
+    mod(require("../../lib/codemirror"));
+  else if (typeof define == "function" && define.amd) // AMD
+    define(["../../lib/codemirror"], mod);
+  else // Plain browser env
+    mod(CodeMirror);
+})(function(CodeMirror) {
+"use strict";
+
+CodeMirror.defineMode("javascript", function(config, parserConfig) {
+  var indentUnit = config.indentUnit;
+  var statementIndent = parserConfig.statementIndent;
+  var jsonldMode = parserConfig.jsonld;
+  var jsonMode = parserConfig.json || jsonldMode;
+  var isTS = parserConfig.typescript;
+  var wordRE = parserConfig.wordCharacters || /[\w$\xa1-\uffff]/;
+
+  // Tokenizer
+
+  var keywords = function(){
+    function kw(type) {return {type: type, style: "keyword"};}
+    var A = kw("keyword a"), B = kw("keyword b"), C = kw("keyword c"), D = kw("keyword d");
+    var operator = kw("operator"), atom = {type: "atom", style: "atom"};
+
+    return {
+      "if": kw("if"), "while": A, "with": A, "else": B, "do": B, "try": B, "finally": B,
+      "return": D, "break": D, "continue": D, "new": kw("new"), "delete": C, "void": C, "throw": C,
+      "debugger": kw("debugger"), "var": kw("var"), "const": kw("var"), "let": kw("var"),
+      "function": kw("function"), "catch": kw("catch"),
+      "for": kw("for"), "switch": kw("switch"), "case": kw("case"), "default": kw("default"),
+      "in": operator, "typeof": operator, "instanceof": operator,
+      "true": atom, "false": atom, "null": atom, "undefined": atom, "NaN": atom, "Infinity": atom,
+      "this": kw("this"), "class": kw("class"), "super": kw("atom"),
+      "yield": C, "export": kw("export"), "import": kw("import"), "extends": C,
+      "await": C
+    };
+  }();
+
+  var isOperatorChar = /[+\-*&%=<>!?|~^@]/;
+  var isJsonldKeyword = /^@(context|id|value|language|type|container|list|set|reverse|index|base|vocab|graph)"/;
+
+  function readRegexp(stream) {
+    var escaped = false, next, inSet = false;
+    while ((next = stream.next()) != null) {
+      if (!escaped) {
+        if (next == "/" && !inSet) return;
+        if (next == "[") inSet = true;
+        else if (inSet && next == "]") inSet = false;
+      }
+      escaped = !escaped && next == "\\";
+    }
+  }
+
+  // Used as scratch variables to communicate multiple values without
+  // consing up tons of objects.
+  var type, content;
+  function ret(tp, style, cont) {
+    type = tp; content = cont;
+    return style;
+  }
+  function tokenBase(stream, state) {
+    var ch = stream.next();
+    if (ch == '"' || ch == "'") {
+      state.tokenize = tokenString(ch);
+      return state.tokenize(stream, state);
+    } else if (ch == "." && stream.match(/^\d[\d_]*(?:[eE][+\-]?[\d_]+)?/)) {
+      return ret("number", "number");
+    } else if (ch == "." && stream.match("..")) {
+      return ret("spread", "meta");
+    } else if (/[\[\]{}\(\),;\:\.]/.test(ch)) {
+      return ret(ch);
+    } else if (ch == "=" && stream.eat(">")) {
+      return ret("=>", "operator");
+    } else if (ch == "0" && stream.match(/^(?:x[\dA-Fa-f_]+|o[0-7_]+|b[01_]+)n?/)) {
+      return ret("number", "number");
+    } else if (/\d/.test(ch)) {
+      stream.match(/^[\d_]*(?:n|(?:\.[\d_]*)?(?:[eE][+\-]?[\d_]+)?)?/);
+      return ret("number", "number");
+    } else if (ch == "/") {
+      if (stream.eat("*")) {
+        state.tokenize = tokenComment;
+        return tokenComment(stream, state);
+      } else if (stream.eat("/")) {
+        stream.skipToEnd();
+        return ret("comment", "comment");
+      } else if (expressionAllowed(stream, state, 1)) {
+        readRegexp(stream);
+        stream.match(/^\b(([gimyus])(?![gimyus]*\2))+\b/);
+        return ret("regexp", "string-2");
+      } else {
+        stream.eat("=");
+        return ret("operator", "operator", stream.current());
+      }
+    } else if (ch == "`") {
+      state.tokenize = tokenQuasi;
+      return tokenQuasi(stream, state);
+    } else if (ch == "#" && stream.peek() == "!") {
+      stream.skipToEnd();
+      return ret("meta", "meta");
+    } else if (ch == "#" && stream.eatWhile(wordRE)) {
+      return ret("variable", "property")
+    } else if (ch == "<" && stream.match("!--") ||
+               (ch == "-" && stream.match("->") && !/\S/.test(stream.string.slice(0, stream.start)))) {
+      stream.skipToEnd()
+      return ret("comment", "comment")
+    } else if (isOperatorChar.test(ch)) {
+      if (ch != ">" || !state.lexical || state.lexical.type != ">") {
+        if (stream.eat("=")) {
+          if (ch == "!" || ch == "=") stream.eat("=")
+        } else if (/[<>*+\-|&?]/.test(ch)) {
+          stream.eat(ch)
+          if (ch == ">") stream.eat(ch)
+        }
+      }
+      if (ch == "?" && stream.eat(".")) return ret(".")
+      return ret("operator", "operator", stream.current());
+    } else if (wordRE.test(ch)) {
+      stream.eatWhile(wordRE);
+      var word = stream.current()
+      if (state.lastType != ".") {
+        if (keywords.propertyIsEnumerable(word)) {
+          var kw = keywords[word]
+          return ret(kw.type, kw.style, word)
+        }
+        if (word == "async" && stream.match(/^(\s|\/\*([^*]|\*(?!\/))*?\*\/)*[\[\(\w]/, false))
+          return ret("async", "keyword", word)
+      }
+      return ret("variable", "variable", word)
+    }
+  }
+
+  function tokenString(quote) {
+    return function(stream, state) {
+      var escaped = false, next;
+      if (jsonldMode && stream.peek() == "@" && stream.match(isJsonldKeyword)){
+        state.tokenize = tokenBase;
+        return ret("jsonld-keyword", "meta");
+      }
+      while ((next = stream.next()) != null) {
+        if (next == quote && !escaped) break;
+        escaped = !escaped && next == "\\";
+      }
+      if (!escaped) state.tokenize = tokenBase;
+      return ret("string", "string");
+    };
+  }
+
+  function tokenComment(stream, state) {
+    var maybeEnd = false, ch;
+    while (ch = stream.next()) {
+      if (ch == "/" && maybeEnd) {
+        state.tokenize = tokenBase;
+        break;
+      }
+      maybeEnd = (ch == "*");
+    }
+    return ret("comment", "comment");
+  }
+
+  function tokenQuasi(stream, state) {
+    var escaped = false, next;
+    while ((next = stream.next()) != null) {
+      if (!escaped && (next == "`" || next == "$" && stream.eat("{"))) {
+        state.tokenize = tokenBase;
+        break;
+      }
+      escaped = !escaped && next == "\\";
+    }
+    return ret("quasi", "string-2", stream.current());
+  }
+
+  var brackets = "([{}])";
+  // This is a crude lookahead trick to try and notice that we're
+  // parsing the argument patterns for a fat-arrow function before we
+  // actually hit the arrow token. It only works if the arrow is on
+  // the same line as the arguments and there's no strange noise
+  // (comments) in between. Fallback is to only notice when we hit the
+  // arrow, and not declare the arguments as locals for the arrow
+  // body.
+  function findFatArrow(stream, state) {
+    if (state.fatArrowAt) state.fatArrowAt = null;
+    var arrow = stream.string.indexOf("=>", stream.start);
+    if (arrow < 0) return;
+
+    if (isTS) { // Try to skip TypeScript return type declarations after the arguments
+      var m = /:\s*(?:\w+(?:<[^>]*>|\[\])?|\{[^}]*\})\s*$/.exec(stream.string.slice(stream.start, arrow))
+      if (m) arrow = m.index
+    }
+
+    var depth = 0, sawSomething = false;
+    for (var pos = arrow - 1; pos >= 0; --pos) {
+      var ch = stream.string.charAt(pos);
+      var bracket = brackets.indexOf(ch);
+      if (bracket >= 0 && bracket < 3) {
+        if (!depth) { ++pos; break; }
+        if (--depth == 0) { if (ch == "(") sawSomething = true; break; }
+      } else if (bracket >= 3 && bracket < 6) {
+        ++depth;
+      } else if (wordRE.test(ch)) {
+        sawSomething = true;
+      } else if (/["'\/`]/.test(ch)) {
+        for (;; --pos) {
+          if (pos == 0) return
+          var next = stream.string.charAt(pos - 1)
+          if (next == ch && stream.string.charAt(pos - 2) != "\\") { pos--; break }
+        }
+      } else if (sawSomething && !depth) {
+        ++pos;
+        break;
+      }
+    }
+    if (sawSomething && !depth) state.fatArrowAt = pos;
+  }
+
+  // Parser
+
+  var atomicTypes = {"atom": true, "number": true, "variable": true, "string": true, "regexp": true, "this": true, "jsonld-keyword": true};
+
+  function JSLexical(indented, column, type, align, prev, info) {
+    this.indented = indented;
+    this.column = column;
+    this.type = type;
+    this.prev = prev;
+    this.info = info;
+    if (align != null) this.align = align;
+  }
+
+  function inScope(state, varname) {
+    for (var v = state.localVars; v; v = v.next)
+      if (v.name == varname) return true;
+    for (var cx = state.context; cx; cx = cx.prev) {
+      for (var v = cx.vars; v; v = v.next)
+        if (v.name == varname) return true;
+    }
+  }
+
+  function parseJS(state, style, type, content, stream) {
+    var cc = state.cc;
+    // Communicate our context to the combinators.
+    // (Less wasteful than consing up a hundred closures on every call.)
+    cx.state = state; cx.stream = stream; cx.marked = null, cx.cc = cc; cx.style = style;
+
+    if (!state.lexical.hasOwnProperty("align"))
+      state.lexical.align = true;
+
+    while(true) {
+      var combinator = cc.length ? cc.pop() : jsonMode ? expression : statement;
+      if (combinator(type, content)) {
+        while(cc.length && cc[cc.length - 1].lex)
+          cc.pop()();
+        if (cx.marked) return cx.marked;
+        if (type == "variable" && inScope(state, content)) return "variable-2";
+        return style;
+      }
+    }
+  }
+
+  // Combinator utils
+
+  var cx = {state: null, column: null, marked: null, cc: null};
+  function pass() {
+    for (var i = arguments.length - 1; i >= 0; i--) cx.cc.push(arguments[i]);
+  }
+  function cont() {
+    pass.apply(null, arguments);
+    return true;
+  }
+  function inList(name, list) {
+    for (var v = list; v; v = v.next) if (v.name == name) return true
+    return false;
+  }
+  function register(varname) {
+    var state = cx.state;
+    cx.marked = "def";
+    if (state.context) {
+      if (state.lexical.info == "var" && state.context && state.context.block) {
+        // FIXME function decls are also not block scoped
+        var newContext = registerVarScoped(varname, state.context)
+        if (newContext != null) {
+          state.context = newContext
+          return
+        }
+      } else if (!inList(varname, state.localVars)) {
+        state.localVars = new Var(varname, state.localVars)
+        return
+      }
+    }
+    // Fall through means this is global
+    if (parserConfig.globalVars && !inList(varname, state.globalVars))
+      state.globalVars = new Var(varname, state.globalVars)
+  }
+  function registerVarScoped(varname, context) {
+    if (!context) {
+      return null
+    } else if (context.block) {
+      var inner = registerVarScoped(varname, context.prev)
+      if (!inner) return null
+      if (inner == context.prev) return context
+      return new Context(inner, context.vars, true)
+    } else if (inList(varname, context.vars)) {
+      return context
+    } else {
+      return new Context(context.prev, new Var(varname, context.vars), false)
+    }
+  }
+
+  function isModifier(name) {
+    return name == "public" || name == "private" || name == "protected" || name == "abstract" || name == "readonly"
+  }
+
+  // Combinators
+
+  function Context(prev, vars, block) { this.prev = prev; this.vars = vars; this.block = block }
+  function Var(name, next) { this.name = name; this.next = next }
+
+  var defaultVars = new Var("this", new Var("arguments", null))
+  function pushcontext() {
+    cx.state.context = new Context(cx.state.context, cx.state.localVars, false)
+    cx.state.localVars = defaultVars
+  }
+  function pushblockcontext() {
+    cx.state.context = new Context(cx.state.context, cx.state.localVars, true)
+    cx.state.localVars = null
+  }
+  function popcontext() {
+    cx.state.localVars = cx.state.context.vars
+    cx.state.context = cx.state.context.prev
+  }
+  popcontext.lex = true
+  function pushlex(type, info) {
+    var result = function() {
+      var state = cx.state, indent = state.indented;
+      if (state.lexical.type == "stat") indent = state.lexical.indented;
+      else for (var outer = state.lexical; outer && outer.type == ")" && outer.align; outer = outer.prev)
+        indent = outer.indented;
+      state.lexical = new JSLexical(indent, cx.stream.column(), type, null, state.lexical, info);
+    };
+    result.lex = true;
+    return result;
+  }
+  function poplex() {
+    var state = cx.state;
+    if (state.lexical.prev) {
+      if (state.lexical.type == ")")
+        state.indented = state.lexical.indented;
+      state.lexical = state.lexical.prev;
+    }
+  }
+  poplex.lex = true;
+
+  function expect(wanted) {
+    function exp(type) {
+      if (type == wanted) return cont();
+      else if (wanted == ";" || type == "}" || type == ")" || type == "]") return pass();
+      else return cont(exp);
+    };
+    return exp;
+  }
+
+  function statement(type, value) {
+    if (type == "var") return cont(pushlex("vardef", value), vardef, expect(";"), poplex);
+    if (type == "keyword a") return cont(pushlex("form"), parenExpr, statement, poplex);
+    if (type == "keyword b") return cont(pushlex("form"), statement, poplex);
+    if (type == "keyword d") return cx.stream.match(/^\s*$/, false) ? cont() : cont(pushlex("stat"), maybeexpression, expect(";"), poplex);
+    if (type == "debugger") return cont(expect(";"));
+    if (type == "{") return cont(pushlex("}"), pushblockcontext, block, poplex, popcontext);
+    if (type == ";") return cont();
+    if (type == "if") {
+      if (cx.state.lexical.info == "else" && cx.state.cc[cx.state.cc.length - 1] == poplex)
+        cx.state.cc.pop()();
+      return cont(pushlex("form"), parenExpr, statement, poplex, maybeelse);
+    }
+    if (type == "function") return cont(functiondef);
+    if (type == "for") return cont(pushlex("form"), forspec, statement, poplex);
+    if (type == "class" || (isTS && value == "interface")) {
+      cx.marked = "keyword"
+      return cont(pushlex("form", type == "class" ? type : value), className, poplex)
+    }
+    if (type == "variable") {
+      if (isTS && value == "declare") {
+        cx.marked = "keyword"
+        return cont(statement)
+      } else if (isTS && (value == "module" || value == "enum" || value == "type") && cx.stream.match(/^\s*\w/, false)) {
+        cx.marked = "keyword"
+        if (value == "enum") return cont(enumdef);
+        else if (value == "type") return cont(typename, expect("operator"), typeexpr, expect(";"));
+        else return cont(pushlex("form"), pattern, expect("{"), pushlex("}"), block, poplex, poplex)
+      } else if (isTS && value == "namespace") {
+        cx.marked = "keyword"
+        return cont(pushlex("form"), expression, statement, poplex)
+      } else if (isTS && value == "abstract") {
+        cx.marked = "keyword"
+        return cont(statement)
+      } else {
+        return cont(pushlex("stat"), maybelabel);
+      }
+    }
+    if (type == "switch") return cont(pushlex("form"), parenExpr, expect("{"), pushlex("}", "switch"), pushblockcontext,
+                                      block, poplex, poplex, popcontext);
+    if (type == "case") return cont(expression, expect(":"));
+    if (type == "default") return cont(expect(":"));
+    if (type == "catch") return cont(pushlex("form"), pushcontext, maybeCatchBinding, statement, poplex, popcontext);
+    if (type == "export") return cont(pushlex("stat"), afterExport, poplex);
+    if (type == "import") return cont(pushlex("stat"), afterImport, poplex);
+    if (type == "async") return cont(statement)
+    if (value == "@") return cont(expression, statement)
+    return pass(pushlex("stat"), expression, expect(";"), poplex);
+  }
+  function maybeCatchBinding(type) {
+    if (type == "(") return cont(funarg, expect(")"))
+  }
+  function expression(type, value) {
+    return expressionInner(type, value, false);
+  }
+  function expressionNoComma(type, value) {
+    return expressionInner(type, value, true);
+  }
+  function parenExpr(type) {
+    if (type != "(") return pass()
+    return cont(pushlex(")"), maybeexpression, expect(")"), poplex)
+  }
+  function expressionInner(type, value, noComma) {
+    if (cx.state.fatArrowAt == cx.stream.start) {
+      var body = noComma ? arrowBodyNoComma : arrowBody;
+      if (type == "(") return cont(pushcontext, pushlex(")"), commasep(funarg, ")"), poplex, expect("=>"), body, popcontext);
+      else if (type == "variable") return pass(pushcontext, pattern, expect("=>"), body, popcontext);
+    }
+
+    var maybeop = noComma ? maybeoperatorNoComma : maybeoperatorComma;
+    if (atomicTypes.hasOwnProperty(type)) return cont(maybeop);
+    if (type == "function") return cont(functiondef, maybeop);
+    if (type == "class" || (isTS && value == "interface")) { cx.marked = "keyword"; return cont(pushlex("form"), classExpression, poplex); }
+    if (type == "keyword c" || type == "async") return cont(noComma ? expressionNoComma : expression);
+    if (type == "(") return cont(pushlex(")"), maybeexpression, expect(")"), poplex, maybeop);
+    if (type == "operator" || type == "spread") return cont(noComma ? expressionNoComma : expression);
+    if (type == "[") return cont(pushlex("]"), arrayLiteral, poplex, maybeop);
+    if (type == "{") return contCommasep(objprop, "}", null, maybeop);
+    if (type == "quasi") return pass(quasi, maybeop);
+    if (type == "new") return cont(maybeTarget(noComma));
+    if (type == "import") return cont(expression);
+    return cont();
+  }
+  function maybeexpression(type) {
+    if (type.match(/[;\}\)\],]/)) return pass();
+    return pass(expression);
+  }
+
+  function maybeoperatorComma(type, value) {
+    if (type == ",") return cont(maybeexpression);
+    return maybeoperatorNoComma(type, value, false);
+  }
+  function maybeoperatorNoComma(type, value, noComma) {
+    var me = noComma == false ? maybeoperatorComma : maybeoperatorNoComma;
+    var expr = noComma == false ? expression : expressionNoComma;
+    if (type == "=>") return cont(pushcontext, noComma ? arrowBodyNoComma : arrowBody, popcontext);
+    if (type == "operator") {
+      if (/\+\+|--/.test(value) || isTS && value == "!") return cont(me);
+      if (isTS && value == "<" && cx.stream.match(/^([^<>]|<[^<>]*>)*>\s*\(/, false))
+        return cont(pushlex(">"), commasep(typeexpr, ">"), poplex, me);
+      if (value == "?") return cont(expression, expect(":"), expr);
+      return cont(expr);
+    }
+    if (type == "quasi") { return pass(quasi, me); }
+    if (type == ";") return;
+    if (type == "(") return contCommasep(expressionNoComma, ")", "call", me);
+    if (type == ".") return cont(property, me);
+    if (type == "[") return cont(pushlex("]"), maybeexpression, expect("]"), poplex, me);
+    if (isTS && value == "as") { cx.marked = "keyword"; return cont(typeexpr, me) }
+    if (type == "regexp") {
+      cx.state.lastType = cx.marked = "operator"
+      cx.stream.backUp(cx.stream.pos - cx.stream.start - 1)
+      return cont(expr)
+    }
+  }
+  function quasi(type, value) {
+    if (type != "quasi") return pass();
+    if (value.slice(value.length - 2) != "${") return cont(quasi);
+    return cont(expression, continueQuasi);
+  }
+  function continueQuasi(type) {
+    if (type == "}") {
+      cx.marked = "string-2";
+      cx.state.tokenize = tokenQuasi;
+      return cont(quasi);
+    }
+  }
+  function arrowBody(type) {
+    findFatArrow(cx.stream, cx.state);
+    return pass(type == "{" ? statement : expression);
+  }
+  function arrowBodyNoComma(type) {
+    findFatArrow(cx.stream, cx.state);
+    return pass(type == "{" ? statement : expressionNoComma);
+  }
+  function maybeTarget(noComma) {
+    return function(type) {
+      if (type == ".") return cont(noComma ? targetNoComma : target);
+      else if (type == "variable" && isTS) return cont(maybeTypeArgs, noComma ? maybeoperatorNoComma : maybeoperatorComma)
+      else return pass(noComma ? expressionNoComma : expression);
+    };
+  }
+  function target(_, value) {
+    if (value == "target") { cx.marked = "keyword"; return cont(maybeoperatorComma); }
+  }
+  function targetNoComma(_, value) {
+    if (value == "target") { cx.marked = "keyword"; return cont(maybeoperatorNoComma); }
+  }
+  function maybelabel(type) {
+    if (type == ":") return cont(poplex, statement);
+    return pass(maybeoperatorComma, expect(";"), poplex);
+  }
+  function property(type) {
+    if (type == "variable") {cx.marked = "property"; return cont();}
+  }
+  function objprop(type, value) {
+    if (type == "async") {
+      cx.marked = "property";
+      return cont(objprop);
+    } else if (type == "variable" || cx.style == "keyword") {
+      cx.marked = "property";
+      if (value == "get" || value == "set") return cont(getterSetter);
+      var m // Work around fat-arrow-detection complication for detecting typescript typed arrow params
+      if (isTS && cx.state.fatArrowAt == cx.stream.start && (m = cx.stream.match(/^\s*:\s*/, false)))
+        cx.state.fatArrowAt = cx.stream.pos + m[0].length
+      return cont(afterprop);
+    } else if (type == "number" || type == "string") {
+      cx.marked = jsonldMode ? "property" : (cx.style + " property");
+      return cont(afterprop);
+    } else if (type == "jsonld-keyword") {
+      return cont(afterprop);
+    } else if (isTS && isModifier(value)) {
+      cx.marked = "keyword"
+      return cont(objprop)
+    } else if (type == "[") {
+      return cont(expression, maybetype, expect("]"), afterprop);
+    } else if (type == "spread") {
+      return cont(expressionNoComma, afterprop);
+    } else if (value == "*") {
+      cx.marked = "keyword";
+      return cont(objprop);
+    } else if (type == ":") {
+      return pass(afterprop)
+    }
+  }
+  function getterSetter(type) {
+    if (type != "variable") return pass(afterprop);
+    cx.marked = "property";
+    return cont(functiondef);
+  }
+  function afterprop(type) {
+    if (type == ":") return cont(expressionNoComma);
+    if (type == "(") return pass(functiondef);
+  }
+  function commasep(what, end, sep) {
+    function proceed(type, value) {
+      if (sep ? sep.indexOf(type) > -1 : type == ",") {
+        var lex = cx.state.lexical;
+        if (lex.info == "call") lex.pos = (lex.pos || 0) + 1;
+        return cont(function(type, value) {
+          if (type == end || value == end) return pass()
+          return pass(what)
+        }, proceed);
+      }
+      if (type == end || value == end) return cont();
+      if (sep && sep.indexOf(";") > -1) return pass(what)
+      return cont(expect(end));
+    }
+    return function(type, value) {
+      if (type == end || value == end) return cont();
+      return pass(what, proceed);
+    };
+  }
+  function contCommasep(what, end, info) {
+    for (var i = 3; i < arguments.length; i++)
+      cx.cc.push(arguments[i]);
+    return cont(pushlex(end, info), commasep(what, end), poplex);
+  }
+  function block(type) {
+    if (type == "}") return cont();
+    return pass(statement, block);
+  }
+  function maybetype(type, value) {
+    if (isTS) {
+      if (type == ":") return cont(typeexpr);
+      if (value == "?") return cont(maybetype);
+    }
+  }
+  function maybetypeOrIn(type, value) {
+    if (isTS && (type == ":" || value == "in")) return cont(typeexpr)
+  }
+  function mayberettype(type) {
+    if (isTS && type == ":") {
+      if (cx.stream.match(/^\s*\w+\s+is\b/, false)) return cont(expression, isKW, typeexpr)
+      else return cont(typeexpr)
+    }
+  }
+  function isKW(_, value) {
+    if (value == "is") {
+      cx.marked = "keyword"
+      return cont()
+    }
+  }
+  function typeexpr(type, value) {
+    if (value == "keyof" || value == "typeof" || value == "infer") {
+      cx.marked = "keyword"
+      return cont(value == "typeof" ? expressionNoComma : typeexpr)
+    }
+    if (type == "variable" || value == "void") {
+      cx.marked = "type"
+      return cont(afterType)
+    }
+    if (value == "|" || value == "&") return cont(typeexpr)
+    if (type == "string" || type == "number" || type == "atom") return cont(afterType);
+    if (type == "[") return cont(pushlex("]"), commasep(typeexpr, "]", ","), poplex, afterType)
+    if (type == "{") return cont(pushlex("}"), commasep(typeprop, "}", ",;"), poplex, afterType)
+    if (type == "(") return cont(commasep(typearg, ")"), maybeReturnType, afterType)
+    if (type == "<") return cont(commasep(typeexpr, ">"), typeexpr)
+  }
+  function maybeReturnType(type) {
+    if (type == "=>") return cont(typeexpr)
+  }
+  function typeprop(type, value) {
+    if (type == "variable" || cx.style == "keyword") {
+      cx.marked = "property"
+      return cont(typeprop)
+    } else if (value == "?" || type == "number" || type == "string") {
+      return cont(typeprop)
+    } else if (type == ":") {
+      return cont(typeexpr)
+    } else if (type == "[") {
+      return cont(expect("variable"), maybetypeOrIn, expect("]"), typeprop)
+    } else if (type == "(") {
+      return pass(functiondecl, typeprop)
+    }
+  }
+  function typearg(type, value) {
+    if (type == "variable" && cx.stream.match(/^\s*[?:]/, false) || value == "?") return cont(typearg)
+    if (type == ":") return cont(typeexpr)
+    if (type == "spread") return cont(typearg)
+    return pass(typeexpr)
+  }
+  function afterType(type, value) {
+    if (value == "<") return cont(pushlex(">"), commasep(typeexpr, ">"), poplex, afterType)
+    if (value == "|" || type == "." || value == "&") return cont(typeexpr)
+    if (type == "[") return cont(typeexpr, expect("]"), afterType)
+    if (value == "extends" || value == "implements") { cx.marked = "keyword"; return cont(typeexpr) }
+    if (value == "?") return cont(typeexpr, expect(":"), typeexpr)
+  }
+  function maybeTypeArgs(_, value) {
+    if (value == "<") return cont(pushlex(">"), commasep(typeexpr, ">"), poplex, afterType)
+  }
+  function typeparam() {
+    return pass(typeexpr, maybeTypeDefault)
+  }
+  function maybeTypeDefault(_, value) {
+    if (value == "=") return cont(typeexpr)
+  }
+  function vardef(_, value) {
+    if (value == "enum") {cx.marked = "keyword"; return cont(enumdef)}
+    return pass(pattern, maybetype, maybeAssign, vardefCont);
+  }
+  function pattern(type, value) {
+    if (isTS && isModifier(value)) { cx.marked = "keyword"; return cont(pattern) }
+    if (type == "variable") { register(value); return cont(); }
+    if (type == "spread") return cont(pattern);
+    if (type == "[") return contCommasep(eltpattern, "]");
+    if (type == "{") return contCommasep(proppattern, "}");
+  }
+  function proppattern(type, value) {
+    if (type == "variable" && !cx.stream.match(/^\s*:/, false)) {
+      register(value);
+      return cont(maybeAssign);
+    }
+    if (type == "variable") cx.marked = "property";
+    if (type == "spread") return cont(pattern);
+    if (type == "}") return pass();
+    if (type == "[") return cont(expression, expect(']'), expect(':'), proppattern);
+    return cont(expect(":"), pattern, maybeAssign);
+  }
+  function eltpattern() {
+    return pass(pattern, maybeAssign)
+  }
+  function maybeAssign(_type, value) {
+    if (value == "=") return cont(expressionNoComma);
+  }
+  function vardefCont(type) {
+    if (type == ",") return cont(vardef);
+  }
+  function maybeelse(type, value) {
+    if (type == "keyword b" && value == "else") return cont(pushlex("form", "else"), statement, poplex);
+  }
+  function forspec(type, value) {
+    if (value == "await") return cont(forspec);
+    if (type == "(") return cont(pushlex(")"), forspec1, poplex);
+  }
+  function forspec1(type) {
+    if (type == "var") return cont(vardef, forspec2);
+    if (type == "variable") return cont(forspec2);
+    return pass(forspec2)
+  }
+  function forspec2(type, value) {
+    if (type == ")") return cont()
+    if (type == ";") return cont(forspec2)
+    if (value == "in" || value == "of") { cx.marked = "keyword"; return cont(expression, forspec2) }
+    return pass(expression, forspec2)
+  }
+  function functiondef(type, value) {
+    if (value == "*") {cx.marked = "keyword"; return cont(functiondef);}
+    if (type == "variable") {register(value); return cont(functiondef);}
+    if (type == "(") return cont(pushcontext, pushlex(")"), commasep(funarg, ")"), poplex, mayberettype, statement, popcontext);
+    if (isTS && value == "<") return cont(pushlex(">"), commasep(typeparam, ">"), poplex, functiondef)
+  }
+  function functiondecl(type, value) {
+    if (value == "*") {cx.marked = "keyword"; return cont(functiondecl);}
+    if (type == "variable") {register(value); return cont(functiondecl);}
+    if (type == "(") return cont(pushcontext, pushlex(")"), commasep(funarg, ")"), poplex, mayberettype, popcontext);
+    if (isTS && value == "<") return cont(pushlex(">"), commasep(typeparam, ">"), poplex, functiondecl)
+  }
+  function typename(type, value) {
+    if (type == "keyword" || type == "variable") {
+      cx.marked = "type"
+      return cont(typename)
+    } else if (value == "<") {
+      return cont(pushlex(">"), commasep(typeparam, ">"), poplex)
+    }
+  }
+  function funarg(type, value) {
+    if (value == "@") cont(expression, funarg)
+    if (type == "spread") return cont(funarg);
+    if (isTS && isModifier(value)) { cx.marked = "keyword"; return cont(funarg); }
+    if (isTS && type == "this") return cont(maybetype, maybeAssign)
+    return pass(pattern, maybetype, maybeAssign);
+  }
+  function classExpression(type, value) {
+    // Class expressions may have an optional name.
+    if (type == "variable") return className(type, value);
+    return classNameAfter(type, value);
+  }
+  function className(type, value) {
+    if (type == "variable") {register(value); return cont(classNameAfter);}
+  }
+  function classNameAfter(type, value) {
+    if (value == "<") return cont(pushlex(">"), commasep(typeparam, ">"), poplex, classNameAfter)
+    if (value == "extends" || value == "implements" || (isTS && type == ",")) {
+      if (value == "implements") cx.marked = "keyword";
+      return cont(isTS ? typeexpr : expression, classNameAfter);
+    }
+    if (type == "{") return cont(pushlex("}"), classBody, poplex);
+  }
+  function classBody(type, value) {
+    if (type == "async" ||
+        (type == "variable" &&
+         (value == "static" || value == "get" || value == "set" || (isTS && isModifier(value))) &&
+         cx.stream.match(/^\s+[\w$\xa1-\uffff]/, false))) {
+      cx.marked = "keyword";
+      return cont(classBody);
+    }
+    if (type == "variable" || cx.style == "keyword") {
+      cx.marked = "property";
+      return cont(classfield, classBody);
+    }
+    if (type == "number" || type == "string") return cont(classfield, classBody);
+    if (type == "[")
+      return cont(expression, maybetype, expect("]"), classfield, classBody)
+    if (value == "*") {
+      cx.marked = "keyword";
+      return cont(classBody);
+    }
+    if (isTS && type == "(") return pass(functiondecl, classBody)
+    if (type == ";" || type == ",") return cont(classBody);
+    if (type == "}") return cont();
+    if (value == "@") return cont(expression, classBody)
+  }
+  function classfield(type, value) {
+    if (value == "?") return cont(classfield)
+    if (type == ":") return cont(typeexpr, maybeAssign)
+    if (value == "=") return cont(expressionNoComma)
+    var context = cx.state.lexical.prev, isInterface = context && context.info == "interface"
+    return pass(isInterface ? functiondecl : functiondef)
+  }
+  function afterExport(type, value) {
+    if (value == "*") { cx.marked = "keyword"; return cont(maybeFrom, expect(";")); }
+    if (value == "default") { cx.marked = "keyword"; return cont(expression, expect(";")); }
+    if (type == "{") return cont(commasep(exportField, "}"), maybeFrom, expect(";"));
+    return pass(statement);
+  }
+  function exportField(type, value) {
+    if (value == "as") { cx.marked = "keyword"; return cont(expect("variable")); }
+    if (type == "variable") return pass(expressionNoComma, exportField);
+  }
+  function afterImport(type) {
+    if (type == "string") return cont();
+    if (type == "(") return pass(expression);
+    return pass(importSpec, maybeMoreImports, maybeFrom);
+  }
+  function importSpec(type, value) {
+    if (type == "{") return contCommasep(importSpec, "}");
+    if (type == "variable") register(value);
+    if (value == "*") cx.marked = "keyword";
+    return cont(maybeAs);
+  }
+  function maybeMoreImports(type) {
+    if (type == ",") return cont(importSpec, maybeMoreImports)
+  }
+  function maybeAs(_type, value) {
+    if (value == "as") { cx.marked = "keyword"; return cont(importSpec); }
+  }
+  function maybeFrom(_type, value) {
+    if (value == "from") { cx.marked = "keyword"; return cont(expression); }
+  }
+  function arrayLiteral(type) {
+    if (type == "]") return cont();
+    return pass(commasep(expressionNoComma, "]"));
+  }
+  function enumdef() {
+    return pass(pushlex("form"), pattern, expect("{"), pushlex("}"), commasep(enummember, "}"), poplex, poplex)
+  }
+  function enummember() {
+    return pass(pattern, maybeAssign);
+  }
+
+  function isContinuedStatement(state, textAfter) {
+    return state.lastType == "operator" || state.lastType == "," ||
+      isOperatorChar.test(textAfter.charAt(0)) ||
+      /[,.]/.test(textAfter.charAt(0));
+  }
+
+  function expressionAllowed(stream, state, backUp) {
+    return state.tokenize == tokenBase &&
+      /^(?:operator|sof|keyword [bcd]|case|new|export|default|spread|[\[{}\(,;:]|=>)$/.test(state.lastType) ||
+      (state.lastType == "quasi" && /\{\s*$/.test(stream.string.slice(0, stream.pos - (backUp || 0))))
+  }
+
+  // Interface
+
+  return {
+    startState: function(basecolumn) {
+      var state = {
+        tokenize: tokenBase,
+        lastType: "sof",
+        cc: [],
+        lexical: new JSLexical((basecolumn || 0) - indentUnit, 0, "block", false),
+        localVars: parserConfig.localVars,
+        context: parserConfig.localVars && new Context(null, null, false),
+        indented: basecolumn || 0
+      };
+      if (parserConfig.globalVars && typeof parserConfig.globalVars == "object")
+        state.globalVars = parserConfig.globalVars;
+      return state;
+    },
+
+    token: function(stream, state) {
+      if (stream.sol()) {
+        if (!state.lexical.hasOwnProperty("align"))
+          state.lexical.align = false;
+        state.indented = stream.indentation();
+        findFatArrow(stream, state);
+      }
+      if (state.tokenize != tokenComment && stream.eatSpace()) return null;
+      var style = state.tokenize(stream, state);
+      if (type == "comment") return style;
+      state.lastType = type == "operator" && (content == "++" || content == "--") ? "incdec" : type;
+      return parseJS(state, style, type, content, stream);
+    },
+
+    indent: function(state, textAfter) {
+      if (state.tokenize == tokenComment || state.tokenize == tokenQuasi) return CodeMirror.Pass;
+      if (state.tokenize != tokenBase) return 0;
+      var firstChar = textAfter && textAfter.charAt(0), lexical = state.lexical, top
+      // Kludge to prevent 'maybelse' from blocking lexical scope pops
+      if (!/^\s*else\b/.test(textAfter)) for (var i = state.cc.length - 1; i >= 0; --i) {
+        var c = state.cc[i];
+        if (c == poplex) lexical = lexical.prev;
+        else if (c != maybeelse) break;
+      }
+      while ((lexical.type == "stat" || lexical.type == "form") &&
+             (firstChar == "}" || ((top = state.cc[state.cc.length - 1]) &&
+                                   (top == maybeoperatorComma || top == maybeoperatorNoComma) &&
+                                   !/^[,\.=+\-*:?[\(]/.test(textAfter))))
+        lexical = lexical.prev;
+      if (statementIndent && lexical.type == ")" && lexical.prev.type == "stat")
+        lexical = lexical.prev;
+      var type = lexical.type, closing = firstChar == type;
+
+      if (type == "vardef") return lexical.indented + (state.lastType == "operator" || state.lastType == "," ? lexical.info.length + 1 : 0);
+      else if (type == "form" && firstChar == "{") return lexical.indented;
+      else if (type == "form") return lexical.indented + indentUnit;
+      else if (type == "stat")
+        return lexical.indented + (isContinuedStatement(state, textAfter) ? statementIndent || indentUnit : 0);
+      else if (lexical.info == "switch" && !closing && parserConfig.doubleIndentSwitch != false)
+        return lexical.indented + (/^(?:case|default)\b/.test(textAfter) ? indentUnit : 2 * indentUnit);
+      else if (lexical.align) return lexical.column + (closing ? 0 : 1);
+      else return lexical.indented + (closing ? 0 : indentUnit);
+    },
+
+    electricInput: /^\s*(?:case .*?:|default:|\{|\})$/,
+    blockCommentStart: jsonMode ? null : "/*",
+    blockCommentEnd: jsonMode ? null : "*/",
+    blockCommentContinue: jsonMode ? null : " * ",
+    lineComment: jsonMode ? null : "//",
+    fold: "brace",
+    closeBrackets: "()[]{}''\"\"``",
+
+    helperType: jsonMode ? "json" : "javascript",
+    jsonldMode: jsonldMode,
+    jsonMode: jsonMode,
+
+    expressionAllowed: expressionAllowed,
+
+    skipExpression: function(state) {
+      var top = state.cc[state.cc.length - 1]
+      if (top == expression || top == expressionNoComma) state.cc.pop()
+    }
+  };
+});
+
+CodeMirror.registerHelper("wordChars", "javascript", /[\w$]/);
+
+CodeMirror.defineMIME("text/javascript", "javascript");
+CodeMirror.defineMIME("text/ecmascript", "javascript");
+CodeMirror.defineMIME("application/javascript", "javascript");
+CodeMirror.defineMIME("application/x-javascript", "javascript");
+CodeMirror.defineMIME("application/ecmascript", "javascript");
+CodeMirror.defineMIME("application/json", {name: "javascript", json: true});
+CodeMirror.defineMIME("application/x-json", {name: "javascript", json: true});
+CodeMirror.defineMIME("application/ld+json", {name: "javascript", jsonld: true});
+CodeMirror.defineMIME("text/typescript", { name: "javascript", typescript: true });
+CodeMirror.defineMIME("application/typescript", { name: "javascript", typescript: true });
+
+});
diff --git a/htdocs/Libs/Codemirror/match-highlighter.js b/htdocs/Libs/Codemirror/match-highlighter.js
new file mode 100644
index 0000000..3a4a7de
--- /dev/null
+++ b/htdocs/Libs/Codemirror/match-highlighter.js
@@ -0,0 +1,167 @@
+// CodeMirror, copyright (c) by Marijn Haverbeke and others
+// Distributed under an MIT license: https://codemirror.net/LICENSE
+
+// Highlighting text that matches the selection
+//
+// Defines an option highlightSelectionMatches, which, when enabled,
+// will style strings that match the selection throughout the
+// document.
+//
+// The option can be set to true to simply enable it, or to a
+// {minChars, style, wordsOnly, showToken, delay} object to explicitly
+// configure it. minChars is the minimum amount of characters that should be
+// selected for the behavior to occur, and style is the token style to
+// apply to the matches. This will be prefixed by "cm-" to create an
+// actual CSS class name. If wordsOnly is enabled, the matches will be
+// highlighted only if the selected text is a word. showToken, when enabled,
+// will cause the current token to be highlighted when nothing is selected.
+// delay is used to specify how much time to wait, in milliseconds, before
+// highlighting the matches. If annotateScrollbar is enabled, the occurences
+// will be highlighted on the scrollbar via the matchesonscrollbar addon.
+
+(function(mod) {
+  if (typeof exports == "object" && typeof module == "object") // CommonJS
+    mod(require("../../lib/codemirror"), require("./matchesonscrollbar"));
+  else if (typeof define == "function" && define.amd) // AMD
+    define(["../../lib/codemirror", "./matchesonscrollbar"], mod);
+  else // Plain browser env
+    mod(CodeMirror);
+})(function(CodeMirror) {
+  "use strict";
+
+  var defaults = {
+    style: "matchhighlight",
+    minChars: 2,
+    delay: 100,
+    wordsOnly: false,
+    annotateScrollbar: false,
+    showToken: false,
+    trim: true
+  }
+
+  function State(options) {
+    this.options = {}
+    for (var name in defaults)
+      this.options[name] = (options && options.hasOwnProperty(name) ? options : defaults)[name]
+    this.overlay = this.timeout = null;
+    this.matchesonscroll = null;
+    this.active = false;
+  }
+
+  CodeMirror.defineOption("highlightSelectionMatches", false, function(cm, val, old) {
+    if (old && old != CodeMirror.Init) {
+      removeOverlay(cm);
+      clearTimeout(cm.state.matchHighlighter.timeout);
+      cm.state.matchHighlighter = null;
+      cm.off("cursorActivity", cursorActivity);
+      cm.off("focus", onFocus)
+    }
+    if (val) {
+      var state = cm.state.matchHighlighter = new State(val);
+      if (cm.hasFocus()) {
+        state.active = true
+        highlightMatches(cm)
+      } else {
+        cm.on("focus", onFocus)
+      }
+      cm.on("cursorActivity", cursorActivity);
+    }
+  });
+
+  function cursorActivity(cm) {
+    var state = cm.state.matchHighlighter;
+    if (state.active || cm.hasFocus()) scheduleHighlight(cm, state)
+  }
+
+  function onFocus(cm) {
+    var state = cm.state.matchHighlighter
+    if (!state.active) {
+      state.active = true
+      scheduleHighlight(cm, state)
+    }
+  }
+
+  function scheduleHighlight(cm, state) {
+    clearTimeout(state.timeout);
+    state.timeout = setTimeout(function() {highlightMatches(cm);}, state.options.delay);
+  }
+
+  function addOverlay(cm, query, hasBoundary, style) {
+    var state = cm.state.matchHighlighter;
+    cm.addOverlay(state.overlay = makeOverlay(query, hasBoundary, style));
+    if (state.options.annotateScrollbar && cm.showMatchesOnScrollbar) {
+      var searchFor = hasBoundary ? new RegExp((/\w/.test(query.charAt(0)) ? "\\b" : "") +
+                                               query.replace(/[\\\[.+*?(){|^$]/g, "\\$&") +
+                                               (/\w/.test(query.charAt(query.length - 1)) ? "\\b" : "")) : query;
+      state.matchesonscroll = cm.showMatchesOnScrollbar(searchFor, false,
+        {className: "CodeMirror-selection-highlight-scrollbar"});
+    }
+  }
+
+  function removeOverlay(cm) {
+    var state = cm.state.matchHighlighter;
+    if (state.overlay) {
+      cm.removeOverlay(state.overlay);
+      state.overlay = null;
+      if (state.matchesonscroll) {
+        state.matchesonscroll.clear();
+        state.matchesonscroll = null;
+      }
+    }
+  }
+
+  function highlightMatches(cm) {
+    cm.operation(function() {
+      var state = cm.state.matchHighlighter;
+      removeOverlay(cm);
+      if (!cm.somethingSelected() && state.options.showToken) {
+        var re = state.options.showToken === true ? /[\w$]/ : state.options.showToken;
+        var cur = cm.getCursor(), line = cm.getLine(cur.line), start = cur.ch, end = start;
+        while (start && re.test(line.charAt(start - 1))) --start;
+        while (end < line.length && re.test(line.charAt(end))) ++end;
+        if (start < end)
+          addOverlay(cm, line.slice(start, end), re, state.options.style);
+        return;
+      }
+      var from = cm.getCursor("from"), to = cm.getCursor("to");
+      if (from.line != to.line) return;
+      if (state.options.wordsOnly && !isWord(cm, from, to)) return;
+      var selection = cm.getRange(from, to)
+      if (state.options.trim) selection = selection.replace(/^\s+|\s+$/g, "")
+      if (selection.length >= state.options.minChars)
+        addOverlay(cm, selection, false, state.options.style);
+    });
+  }
+
+  function isWord(cm, from, to) {
+    var str = cm.getRange(from, to);
+    if (str.match(/^\w+$/) !== null) {
+        if (from.ch > 0) {
+            var pos = {line: from.line, ch: from.ch - 1};
+            var chr = cm.getRange(pos, from);
+            if (chr.match(/\W/) === null) return false;
+        }
+        if (to.ch < cm.getLine(from.line).length) {
+            var pos = {line: to.line, ch: to.ch + 1};
+            var chr = cm.getRange(to, pos);
+            if (chr.match(/\W/) === null) return false;
+        }
+        return true;
+    } else return false;
+  }
+
+  function boundariesAround(stream, re) {
+    return (!stream.start || !re.test(stream.string.charAt(stream.start - 1))) &&
+      (stream.pos == stream.string.length || !re.test(stream.string.charAt(stream.pos)));
+  }
+
+  function makeOverlay(query, hasBoundary, style) {
+    return {token: function(stream) {
+      if (stream.match(query) &&
+          (!hasBoundary || boundariesAround(stream, hasBoundary)))
+        return style;
+      stream.next();
+      stream.skipTo(query.charAt(0)) || stream.skipToEnd();
+    }};
+  }
+});
diff --git a/htdocs/Libs/Codemirror/matchbrackets.js b/htdocs/Libs/Codemirror/matchbrackets.js
new file mode 100644
index 0000000..2c47e07
--- /dev/null
+++ b/htdocs/Libs/Codemirror/matchbrackets.js
@@ -0,0 +1,158 @@
+// CodeMirror, copyright (c) by Marijn Haverbeke and others
+// Distributed under an MIT license: https://codemirror.net/LICENSE
+
+(function(mod) {
+  if (typeof exports == "object" && typeof module == "object") // CommonJS
+    mod(require("../../lib/codemirror"));
+  else if (typeof define == "function" && define.amd) // AMD
+    define(["../../lib/codemirror"], mod);
+  else // Plain browser env
+    mod(CodeMirror);
+})(function(CodeMirror) {
+  var ie_lt8 = /MSIE \d/.test(navigator.userAgent) &&
+    (document.documentMode == null || document.documentMode < 8);
+
+  var Pos = CodeMirror.Pos;
+
+  var matching = {"(": ")>", ")": "(<", "[": "]>", "]": "[<", "{": "}>", "}": "{<", "<": ">>", ">": "<<"};
+
+  function bracketRegex(config) {
+    return config && config.bracketRegex || /[(){}[\]]/
+  }
+
+  function findMatchingBracket(cm, where, config) {
+    var line = cm.getLineHandle(where.line), pos = where.ch - 1;
+    var afterCursor = config && config.afterCursor
+    if (afterCursor == null)
+      afterCursor = /(^| )cm-fat-cursor($| )/.test(cm.getWrapperElement().className)
+    var re = bracketRegex(config)
+
+    // A cursor is defined as between two characters, but in in vim command mode
+    // (i.e. not insert mode), the cursor is visually represented as a
+    // highlighted box on top of the 2nd character. Otherwise, we allow matches
+    // from before or after the cursor.
+    var match = (!afterCursor && pos >= 0 && re.test(line.text.charAt(pos)) && matching[line.text.charAt(pos)]) ||
+        re.test(line.text.charAt(pos + 1)) && matching[line.text.charAt(++pos)];
+    if (!match) return null;
+    var dir = match.charAt(1) == ">" ? 1 : -1;
+    if (config && config.strict && (dir > 0) != (pos == where.ch)) return null;
+    var style = cm.getTokenTypeAt(Pos(where.line, pos + 1));
+
+    var found = scanForBracket(cm, Pos(where.line, pos + (dir > 0 ? 1 : 0)), dir, style || null, config);
+    if (found == null) return null;
+    return {from: Pos(where.line, pos), to: found && found.pos,
+            match: found && found.ch == match.charAt(0), forward: dir > 0};
+  }
+
+  // bracketRegex is used to specify which type of bracket to scan
+  // should be a regexp, e.g. /[[\]]/
+  //
+  // Note: If "where" is on an open bracket, then this bracket is ignored.
+  //
+  // Returns false when no bracket was found, null when it reached
+  // maxScanLines and gave up
+  function scanForBracket(cm, where, dir, style, config) {
+    var maxScanLen = (config && config.maxScanLineLength) || 10000;
+    var maxScanLines = (config && config.maxScanLines) || 1000;
+
+    var stack = [];
+    var re = bracketRegex(config)
+    var lineEnd = dir > 0 ? Math.min(where.line + maxScanLines, cm.lastLine() + 1)
+                          : Math.max(cm.firstLine() - 1, where.line - maxScanLines);
+    for (var lineNo = where.line; lineNo != lineEnd; lineNo += dir) {
+      var line = cm.getLine(lineNo);
+      if (!line) continue;
+      var pos = dir > 0 ? 0 : line.length - 1, end = dir > 0 ? line.length : -1;
+      if (line.length > maxScanLen) continue;
+      if (lineNo == where.line) pos = where.ch - (dir < 0 ? 1 : 0);
+      for (; pos != end; pos += dir) {
+        var ch = line.charAt(pos);
+        if (re.test(ch) && (style === undefined || cm.getTokenTypeAt(Pos(lineNo, pos + 1)) == style)) {
+          var match = matching[ch];
+          if (match && (match.charAt(1) == ">") == (dir > 0)) stack.push(ch);
+          else if (!stack.length) return {pos: Pos(lineNo, pos), ch: ch};
+          else stack.pop();
+        }
+      }
+    }
+    return lineNo - dir == (dir > 0 ? cm.lastLine() : cm.firstLine()) ? false : null;
+  }
+
+  function matchBrackets(cm, autoclear, config) {
+    // Disable brace matching in long lines, since it'll cause hugely slow updates
+    var maxHighlightLen = cm.state.matchBrackets.maxHighlightLineLength || 1000;
+    var marks = [], ranges = cm.listSelections();
+    for (var i = 0; i < ranges.length; i++) {
+      var match = ranges[i].empty() && findMatchingBracket(cm, ranges[i].head, config);
+      if (match && cm.getLine(match.from.line).length <= maxHighlightLen) {
+        var style = match.match ? "CodeMirror-matchingbracket" : "CodeMirror-nonmatchingbracket";
+        marks.push(cm.markText(match.from, Pos(match.from.line, match.from.ch + 1), {className: style}));
+        if (match.to && cm.getLine(match.to.line).length <= maxHighlightLen)
+          marks.push(cm.markText(match.to, Pos(match.to.line, match.to.ch + 1), {className: style}));
+      }
+    }
+
+    if (marks.length) {
+      // Kludge to work around the IE bug from issue #1193, where text
+      // input stops going to the textare whever this fires.
+      if (ie_lt8 && cm.state.focused) cm.focus();
+
+      var clear = function() {
+        cm.operation(function() {
+          for (var i = 0; i < marks.length; i++) marks[i].clear();
+        });
+      };
+      if (autoclear) setTimeout(clear, 800);
+      else return clear;
+    }
+  }
+
+  function doMatchBrackets(cm) {
+    cm.operation(function() {
+      if (cm.state.matchBrackets.currentlyHighlighted) {
+        cm.state.matchBrackets.currentlyHighlighted();
+        cm.state.matchBrackets.currentlyHighlighted = null;
+      }
+      cm.state.matchBrackets.currentlyHighlighted = matchBrackets(cm, false, cm.state.matchBrackets);
+    });
+  }
+
+  CodeMirror.defineOption("matchBrackets", false, function(cm, val, old) {
+    function clear(cm) {
+      if (cm.state.matchBrackets && cm.state.matchBrackets.currentlyHighlighted) {
+        cm.state.matchBrackets.currentlyHighlighted();
+        cm.state.matchBrackets.currentlyHighlighted = null;
+      }
+    }
+
+    if (old && old != CodeMirror.Init) {
+      cm.off("cursorActivity", doMatchBrackets);
+      cm.off("focus", doMatchBrackets)
+      cm.off("blur", clear)
+      clear(cm);
+    }
+    if (val) {
+      cm.state.matchBrackets = typeof val == "object" ? val : {};
+      cm.on("cursorActivity", doMatchBrackets);
+      cm.on("focus", doMatchBrackets)
+      cm.on("blur", clear)
+    }
+  });
+
+  CodeMirror.defineExtension("matchBrackets", function() {matchBrackets(this, true);});
+  CodeMirror.defineExtension("findMatchingBracket", function(pos, config, oldConfig){
+    // Backwards-compatibility kludge
+    if (oldConfig || typeof config == "boolean") {
+      if (!oldConfig) {
+        config = config ? {strict: true} : null
+      } else {
+        oldConfig.strict = config
+        config = oldConfig
+      }
+    }
+    return findMatchingBracket(this, pos, config)
+  });
+  CodeMirror.defineExtension("scanForBracket", function(pos, dir, style, config){
+    return scanForBracket(this, pos, dir, style, config);
+  });
+});
diff --git a/htdocs/Libs/Codemirror/matchtags.js b/htdocs/Libs/Codemirror/matchtags.js
new file mode 100644
index 0000000..2203d93
--- /dev/null
+++ b/htdocs/Libs/Codemirror/matchtags.js
@@ -0,0 +1,66 @@
+// CodeMirror, copyright (c) by Marijn Haverbeke and others
+// Distributed under an MIT license: https://codemirror.net/LICENSE
+
+(function(mod) {
+  if (typeof exports == "object" && typeof module == "object") // CommonJS
+    mod(require("../../lib/codemirror"), require("../fold/xml-fold"));
+  else if (typeof define == "function" && define.amd) // AMD
+    define(["../../lib/codemirror", "../fold/xml-fold"], mod);
+  else // Plain browser env
+    mod(CodeMirror);
+})(function(CodeMirror) {
+  "use strict";
+
+  CodeMirror.defineOption("matchTags", false, function(cm, val, old) {
+    if (old && old != CodeMirror.Init) {
+      cm.off("cursorActivity", doMatchTags);
+      cm.off("viewportChange", maybeUpdateMatch);
+      clear(cm);
+    }
+    if (val) {
+      cm.state.matchBothTags = typeof val == "object" && val.bothTags;
+      cm.on("cursorActivity", doMatchTags);
+      cm.on("viewportChange", maybeUpdateMatch);
+      doMatchTags(cm);
+    }
+  });
+
+  function clear(cm) {
+    if (cm.state.tagHit) cm.state.tagHit.clear();
+    if (cm.state.tagOther) cm.state.tagOther.clear();
+    cm.state.tagHit = cm.state.tagOther = null;
+  }
+
+  function doMatchTags(cm) {
+    cm.state.failedTagMatch = false;
+    cm.operation(function() {
+      clear(cm);
+      if (cm.somethingSelected()) return;
+      var cur = cm.getCursor(), range = cm.getViewport();
+      range.from = Math.min(range.from, cur.line); range.to = Math.max(cur.line + 1, range.to);
+      var match = CodeMirror.findMatchingTag(cm, cur, range);
+      if (!match) return;
+      if (cm.state.matchBothTags) {
+        var hit = match.at == "open" ? match.open : match.close;
+        if (hit) cm.state.tagHit = cm.markText(hit.from, hit.to, {className: "CodeMirror-matchingtag"});
+      }
+      var other = match.at == "close" ? match.open : match.close;
+      if (other)
+        cm.state.tagOther = cm.markText(other.from, other.to, {className: "CodeMirror-matchingtag"});
+      else
+        cm.state.failedTagMatch = true;
+    });
+  }
+
+  function maybeUpdateMatch(cm) {
+    if (cm.state.failedTagMatch) doMatchTags(cm);
+  }
+
+  CodeMirror.commands.toMatchingTag = function(cm) {
+    var found = CodeMirror.findMatchingTag(cm, cm.getCursor());
+    if (found) {
+      var other = found.at == "close" ? found.open : found.close;
+      if (other) cm.extendSelection(other.to, other.from);
+    }
+  };
+});
diff --git a/htdocs/Libs/Codemirror/version.txt b/htdocs/Libs/Codemirror/version.txt
new file mode 100644
index 0000000..f169928
--- /dev/null
+++ b/htdocs/Libs/Codemirror/version.txt
@@ -0,0 +1 @@
+5.58.3
\ No newline at end of file
diff --git a/htdocs/Libs/JQuery/jquery-3.4.0.min.js b/htdocs/Libs/JQuery/jquery-3.4.0.min.js
deleted file mode 100644
index 769a1d9..0000000
--- a/htdocs/Libs/JQuery/jquery-3.4.0.min.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/*! jQuery v3.4.0 | (c) JS Foundation and other contributors | jquery.org/license */
-!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.4.0",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0<t&&t-1 in e)}k.fn=k.prototype={jquery:f,constructor:k,length:0,toArray:function(){return s.call(this)},get:function(e){return null==e?s.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=k.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return k.each(this,e)},map:function(n){return this.pushStack(k.map(this,function(e,t){return n.call(e,t,e)}))},slice:function(){return this.pushStack(s.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(0<=n&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:u,sort:t.sort,splice:t.splice},k.extend=k.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||m(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)r=e[t],"__proto__"!==t&&a!==r&&(l&&r&&(k.isPlainObject(r)||(i=Array.isArray(r)))?(n=a[t],o=i&&!Array.isArray(n)?[]:i||k.isPlainObject(n)?n:{},i=!1,a[t]=k.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},k.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||"[object Object]"!==o.call(e))&&(!(t=r(e))||"function"==typeof(n=v.call(t,"constructor")&&t.constructor)&&a.call(n)===l)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e,t){b(e,{nonce:t&&t.nonce})},each:function(e,t){var n,r=0;if(d(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},trim:function(e){return null==e?"":(e+"").replace(p,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(d(Object(e))?k.merge(n,"string"==typeof e?[e]:e):u.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:i.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r=[],i=0,o=e.length,a=!n;i<o;i++)!t(e[i],i)!==a&&r.push(e[i]);return r},map:function(e,t,n){var r,i,o=0,a=[];if(d(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&a.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&a.push(i);return g.apply([],a)},guid:1,support:y}),"function"==typeof Symbol&&(k.fn[Symbol.iterator]=t[Symbol.iterator]),k.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){n["[object "+t+"]"]=t.toLowerCase()});var h=function(n){var e,d,b,o,i,h,f,g,w,u,l,T,C,a,E,v,s,c,y,k="sizzle"+1*new Date,m=n.document,S=0,r=0,p=ue(),x=ue(),A=ue(),N=ue(),D=function(e,t){return e===t&&(l=!0),0},j={}.hasOwnProperty,t=[],q=t.pop,L=t.push,H=t.push,O=t.slice,P=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},R="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",I="(?:\\\\.|[\\w-]|[^\0-\\xa0])+",W="\\["+M+"*("+I+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+I+"))|)"+M+"*\\]",$=":("+I+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+W+")*)|.*)\\)|)",F=new RegExp(M+"+","g"),B=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),_=new RegExp("^"+M+"*,"+M+"*"),z=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(m.childNodes),m.childNodes),t[m.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&((e?e.ownerDocument||e:m)!==C&&T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[k]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=k,!C.getElementsByName||!C.getElementsByName(k).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){a.appendChild(e).innerHTML="<a id='"+k+"'></a><select id='"+k+"-\r\\' msallowcapture=''><option selected=''></option></select>",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),ce(function(e){e.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",$)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e===C||e.ownerDocument===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===C?-1:t===C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0<se(t,C,null,[e]).length},se.contains=function(e,t){return(e.ownerDocument||e)!==C&&T(e),y(e,t)},se.attr=function(e,t){(e.ownerDocument||e)!==C&&T(e);var n=b.attrHandle[t.toLowerCase()],r=n&&j.call(b.attrHandle,t.toLowerCase())?n(e,t,!E):void 0;return void 0!==r?r:d.attributes||!E?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},se.escape=function(e){return(e+"").replace(re,ie)},se.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},se.uniqueSort=function(e){var t,n=[],r=0,i=0;if(l=!d.detectDuplicates,u=!d.sortStable&&e.slice(0),e.sort(D),l){while(t=e[i++])t===e[i]&&(r=n.push(i));while(r--)e.splice(n[r],1)}return u=null,e},o=se.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else while(t=e[r++])n+=o(t);return n},(b=se.selectors={cacheLength:50,createPseudo:le,match:G,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1<t.indexOf(i):"$="===r?i&&t.slice(-i.length)===i:"~="===r?-1<(" "+t.replace(F," ")+" ").indexOf(i):"|="===r&&(t===i||t.slice(0,i.length+1)===i+"-"))}},CHILD:function(h,e,t,g,v){var y="nth"!==h.slice(0,3),m="last"!==h.slice(-4),x="of-type"===e;return 1===g&&0===v?function(e){return!!e.parentNode}:function(e,t,n){var r,i,o,a,s,u,l=y!==m?"nextSibling":"previousSibling",c=e.parentNode,f=x&&e.nodeName.toLowerCase(),p=!n&&!x,d=!1;if(c){if(y){while(l){a=e;while(a=a[l])if(x?a.nodeName.toLowerCase()===f:1===a.nodeType)return!1;u=l="only"===h&&!u&&"nextSibling"}return!0}if(u=[m?c.firstChild:c.lastChild],m&&p){d=(s=(r=(i=(o=(a=c)[k]||(a[k]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===S&&r[1])&&r[2],a=s&&c.childNodes[s];while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if(1===a.nodeType&&++d&&a===e){i[h]=[S,s,d];break}}else if(p&&(d=s=(r=(i=(o=(a=e)[k]||(a[k]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===S&&r[1]),!1===d)while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if((x?a.nodeName.toLowerCase()===f:1===a.nodeType)&&++d&&(p&&((i=(o=a[k]||(a[k]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]=[S,d]),a===e))break;return(d-=v)===g||d%g==0&&0<=d/g}}},PSEUDO:function(e,o){var t,a=b.pseudos[e]||b.setFilters[e.toLowerCase()]||se.error("unsupported pseudo: "+e);return a[k]?a(o):1<a.length?(t=[e,e,"",o],b.setFilters.hasOwnProperty(e.toLowerCase())?le(function(e,t){var n,r=a(e,o),i=r.length;while(i--)e[n=P(e,r[i])]=!(t[n]=r[i])}):function(e){return a(e,0,t)}):a}},pseudos:{not:le(function(e){var r=[],i=[],s=f(e.replace(B,"$1"));return s[k]?le(function(e,t,n,r){var i,o=s(e,null,r,[]),a=e.length;while(a--)(i=o[a])&&(e[a]=!(t[a]=i))}):function(e,t,n){return r[0]=e,s(r,null,n,i),r[0]=null,!i.pop()}}),has:le(function(t){return function(e){return 0<se(t,e).length}}),contains:le(function(t){return t=t.replace(te,ne),function(e){return-1<(e.textContent||o(e)).indexOf(t)}}),lang:le(function(n){return V.test(n||"")||se.error("unsupported lang: "+n),n=n.replace(te,ne).toLowerCase(),function(e){var t;do{if(t=E?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(t=t.toLowerCase())===n||0===t.indexOf(n+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var t=n.location&&n.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===a},focus:function(e){return e===C.activeElement&&(!C.hasFocus||C.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:ge(!1),disabled:ge(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!b.pseudos.empty(e)},header:function(e){return J.test(e.nodeName)},input:function(e){return Q.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:ve(function(){return[0]}),last:ve(function(e,t){return[t-1]}),eq:ve(function(e,t,n){return[n<0?n+t:n]}),even:ve(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:ve(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:ve(function(e,t,n){for(var r=n<0?n+t:t<n?t:n;0<=--r;)e.push(r);return e}),gt:ve(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=b.pseudos.eq,{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})b.pseudos[e]=de(e);for(e in{submit:!0,reset:!0})b.pseudos[e]=he(e);function me(){}function xe(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function be(s,e,t){var u=e.dir,l=e.next,c=l||u,f=t&&"parentNode"===c,p=r++;return e.first?function(e,t,n){while(e=e[u])if(1===e.nodeType||f)return s(e,t,n);return!1}:function(e,t,n){var r,i,o,a=[S,p];if(n){while(e=e[u])if((1===e.nodeType||f)&&s(e,t,n))return!0}else while(e=e[u])if(1===e.nodeType||f)if(i=(o=e[k]||(e[k]={}))[e.uniqueID]||(o[e.uniqueID]={}),l&&l===e.nodeName.toLowerCase())e=e[u]||e;else{if((r=i[c])&&r[0]===S&&r[1]===p)return a[2]=r[2];if((i[c]=a)[2]=s(e,t,n))return!0}return!1}}function we(i){return 1<i.length?function(e,t,n){var r=i.length;while(r--)if(!i[r](e,t,n))return!1;return!0}:i[0]}function Te(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function Ce(d,h,g,v,y,e){return v&&!v[k]&&(v=Ce(v)),y&&!y[k]&&(y=Ce(y,e)),le(function(e,t,n,r){var i,o,a,s=[],u=[],l=t.length,c=e||function(e,t,n){for(var r=0,i=t.length;r<i;r++)se(e,t[r],n);return n}(h||"*",n.nodeType?[n]:n,[]),f=!d||!e&&h?c:Te(c,s,d,n,r),p=g?y||(e?d:l||v)?[]:t:f;if(g&&g(f,p,n,r),v){i=Te(p,u),v(i,[],n,r),o=i.length;while(o--)(a=i[o])&&(p[u[o]]=!(f[u[o]]=a))}if(e){if(y||d){if(y){i=[],o=p.length;while(o--)(a=p[o])&&i.push(f[o]=a);y(null,p=[],i,r)}o=p.length;while(o--)(a=p[o])&&-1<(i=y?P(e,a):s[o])&&(e[i]=!(t[i]=a))}}else p=Te(p===t?p.splice(l,p.length):p),y?y(null,t,p,r):H.apply(t,p)})}function Ee(e){for(var i,t,n,r=e.length,o=b.relative[e[0].type],a=o||b.relative[" "],s=o?1:0,u=be(function(e){return e===i},a,!0),l=be(function(e){return-1<P(i,e)},a,!0),c=[function(e,t,n){var r=!o&&(n||t!==w)||((i=t).nodeType?u(e,t,n):l(e,t,n));return i=null,r}];s<r;s++)if(t=b.relative[e[s].type])c=[be(we(c),t)];else{if((t=b.filter[e[s].type].apply(null,e[s].matches))[k]){for(n=++s;n<r;n++)if(b.relative[e[n].type])break;return Ce(1<s&&we(c),1<s&&xe(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace(B,"$1"),t,s<n&&Ee(e.slice(s,n)),n<r&&Ee(e=e.slice(n)),n<r&&xe(e))}c.push(t)}return we(c)}return me.prototype=b.filters=b.pseudos,b.setFilters=new me,h=se.tokenize=function(e,t){var n,r,i,o,a,s,u,l=x[e+" "];if(l)return t?0:l.slice(0);a=e,s=[],u=b.preFilter;while(a){for(o in n&&!(r=_.exec(a))||(r&&(a=a.slice(r[0].length)||a),s.push(i=[])),n=!1,(r=z.exec(a))&&(n=r.shift(),i.push({value:n,type:r[0].replace(B," ")}),a=a.slice(n.length)),b.filter)!(r=G[o].exec(a))||u[o]&&!(r=u[o](r))||(n=r.shift(),i.push({value:n,type:o,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?se.error(e):x(e,s).slice(0)},f=se.compile=function(e,t){var n,v,y,m,x,r,i=[],o=[],a=A[e+" "];if(!a){t||(t=h(e)),n=t.length;while(n--)(a=Ee(t[n]))[k]?i.push(a):o.push(a);(a=A(e,(v=o,m=0<(y=i).length,x=0<v.length,r=function(e,t,n,r,i){var o,a,s,u=0,l="0",c=e&&[],f=[],p=w,d=e||x&&b.find.TAG("*",i),h=S+=null==p?1:Math.random()||.1,g=d.length;for(i&&(w=t===C||t||i);l!==g&&null!=(o=d[l]);l++){if(x&&o){a=0,t||o.ownerDocument===C||(T(o),n=!E);while(s=v[a++])if(s(o,t||C,n)){r.push(o);break}i&&(S=h)}m&&((o=!s&&o)&&u--,e&&c.push(o))}if(u+=l,m&&l!==u){a=0;while(s=y[a++])s(c,f,t,n);if(e){if(0<u)while(l--)c[l]||f[l]||(f[l]=q.call(r));f=Te(f)}H.apply(r,f),i&&!e&&0<f.length&&1<u+y.length&&se.uniqueSort(r)}return i&&(S=h,w=p),c},m?le(r):r))).selector=e}return a},g=se.select=function(e,t,n,r){var i,o,a,s,u,l="function"==typeof e&&e,c=!r&&h(e=l.selector||e);if(n=n||[],1===c.length){if(2<(o=c[0]=c[0].slice(0)).length&&"ID"===(a=o[0]).type&&9===t.nodeType&&E&&b.relative[o[1].type]){if(!(t=(b.find.ID(a.matches[0].replace(te,ne),t)||[])[0]))return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}i=G.needsContext.test(e)?0:o.length;while(i--){if(a=o[i],b.relative[s=a.type])break;if((u=b.find[s])&&(r=u(a.matches[0].replace(te,ne),ee.test(o[0].type)&&ye(t.parentNode)||t))){if(o.splice(i,1),!(e=r.length&&xe(o)))return H.apply(n,r),n;break}}}return(l||f(e,c))(r,t,!E,n,!t||ee.test(e)&&ye(t.parentNode)||t),n},d.sortStable=k.split("").sort(D).join("")===k,d.detectDuplicates=!!l,T(),d.sortDetached=ce(function(e){return 1&e.compareDocumentPosition(C.createElement("fieldset"))}),ce(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||fe("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),d.attributes&&ce(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||fe("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ce(function(e){return null==e.getAttribute("disabled")})||fe(R,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),se}(C);k.find=h,k.expr=h.selectors,k.expr[":"]=k.expr.pseudos,k.uniqueSort=k.unique=h.uniqueSort,k.text=h.getText,k.isXMLDoc=h.isXML,k.contains=h.contains,k.escapeSelector=h.escape;var T=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&k(e).is(n))break;r.push(e)}return r},S=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},A=k.expr.match.needsContext;function N(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var D=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1<i.call(n,e)!==r}):k.filter(n,e,r)}k.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?k.find.matchesSelector(r,e)?[r]:[]:k.find.matches(e,k.grep(t,function(e){return 1===e.nodeType}))},k.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(k(e).filter(function(){for(t=0;t<r;t++)if(k.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)k.find(e,i[t],n);return 1<r?k.uniqueSort(n):n},filter:function(e){return this.pushStack(j(this,e||[],!1))},not:function(e){return this.pushStack(j(this,e||[],!0))},is:function(e){return!!j(this,"string"==typeof e&&A.test(e)?k(e):e||[],!1).length}});var q,L=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(k.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a="string"!=typeof e&&k(e);if(!A.test(e))for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?-1<a.index(n):1===n.nodeType&&k.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(1<o.length?k.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?i.call(k(e),this[0]):i.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(k.uniqueSort(k.merge(this.get(),k(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),k.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return T(e,"parentNode")},parentsUntil:function(e,t,n){return T(e,"parentNode",n)},next:function(e){return P(e,"nextSibling")},prev:function(e){return P(e,"previousSibling")},nextAll:function(e){return T(e,"nextSibling")},prevAll:function(e){return T(e,"previousSibling")},nextUntil:function(e,t,n){return T(e,"nextSibling",n)},prevUntil:function(e,t,n){return T(e,"previousSibling",n)},siblings:function(e){return S((e.parentNode||{}).firstChild,e)},children:function(e){return S(e.firstChild)},contents:function(e){return"undefined"!=typeof e.contentDocument?e.contentDocument:(N(e,"template")&&(e=e.content||e),k.merge([],e.childNodes))}},function(r,i){k.fn[r]=function(e,t){var n=k.map(this,i,e);return"Until"!==r.slice(-5)&&(t=e),t&&"string"==typeof t&&(n=k.filter(t,n)),1<this.length&&(O[r]||k.uniqueSort(n),H.test(r)&&n.reverse()),this.pushStack(n)}});var R=/[^\x20\t\r\n\f]+/g;function M(e){return e}function I(e){throw e}function W(e,t,n,r){var i;try{e&&m(i=e.promise)?i.call(e).done(t).fail(n):e&&m(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}k.Callbacks=function(r){var e,n;r="string"==typeof r?(e=r,n={},k.each(e.match(R)||[],function(e,t){n[t]=!0}),n):k.extend({},r);var i,t,o,a,s=[],u=[],l=-1,c=function(){for(a=a||r.once,o=i=!0;u.length;l=-1){t=u.shift();while(++l<s.length)!1===s[l].apply(t[0],t[1])&&r.stopOnFalse&&(l=s.length,t=!1)}r.memory||(t=!1),i=!1,a&&(s=t?[]:"")},f={add:function(){return s&&(t&&!i&&(l=s.length-1,u.push(t)),function n(e){k.each(e,function(e,t){m(t)?r.unique&&f.has(t)||s.push(t):t&&t.length&&"string"!==w(t)&&n(t)})}(arguments),t&&!i&&c()),this},remove:function(){return k.each(arguments,function(e,t){var n;while(-1<(n=k.inArray(t,s,n)))s.splice(n,1),n<=l&&l--}),this},has:function(e){return e?-1<k.inArray(e,s):0<s.length},empty:function(){return s&&(s=[]),this},disable:function(){return a=u=[],s=t="",this},disabled:function(){return!s},lock:function(){return a=u=[],t||i||(s=t=""),this},locked:function(){return!!a},fireWith:function(e,t){return a||(t=[e,(t=t||[]).slice?t.slice():t],u.push(t),i||c()),this},fire:function(){return f.fireWith(this,arguments),this},fired:function(){return!!o}};return f},k.extend({Deferred:function(e){var o=[["notify","progress",k.Callbacks("memory"),k.Callbacks("memory"),2],["resolve","done",k.Callbacks("once memory"),k.Callbacks("once memory"),0,"resolved"],["reject","fail",k.Callbacks("once memory"),k.Callbacks("once memory"),1,"rejected"]],i="pending",a={state:function(){return i},always:function(){return s.done(arguments).fail(arguments),this},"catch":function(e){return a.then(null,e)},pipe:function(){var i=arguments;return k.Deferred(function(r){k.each(o,function(e,t){var n=m(i[t[4]])&&i[t[4]];s[t[1]](function(){var e=n&&n.apply(this,arguments);e&&m(e.promise)?e.promise().progress(r.notify).done(r.resolve).fail(r.reject):r[t[0]+"With"](this,n?[e]:arguments)})}),i=null}).promise()},then:function(t,n,r){var u=0;function l(i,o,a,s){return function(){var n=this,r=arguments,e=function(){var e,t;if(!(i<u)){if((e=a.apply(n,r))===o.promise())throw new TypeError("Thenable self-resolution");t=e&&("object"==typeof e||"function"==typeof e)&&e.then,m(t)?s?t.call(e,l(u,o,M,s),l(u,o,I,s)):(u++,t.call(e,l(u,o,M,s),l(u,o,I,s),l(u,o,M,o.notifyWith))):(a!==M&&(n=void 0,r=[e]),(s||o.resolveWith)(n,r))}},t=s?e:function(){try{e()}catch(e){k.Deferred.exceptionHook&&k.Deferred.exceptionHook(e,t.stackTrace),u<=i+1&&(a!==I&&(n=void 0,r=[e]),o.rejectWith(n,r))}};i?t():(k.Deferred.getStackHook&&(t.stackTrace=k.Deferred.getStackHook()),C.setTimeout(t))}}return k.Deferred(function(e){o[0][3].add(l(0,e,m(r)?r:M,e.notifyWith)),o[1][3].add(l(0,e,m(t)?t:M)),o[2][3].add(l(0,e,m(n)?n:I))}).promise()},promise:function(e){return null!=e?k.extend(e,a):a}},s={};return k.each(o,function(e,t){var n=t[2],r=t[5];a[t[1]]=n.add,r&&n.add(function(){i=r},o[3-e][2].disable,o[3-e][3].disable,o[0][2].lock,o[0][3].lock),n.add(t[3].fire),s[t[0]]=function(){return s[t[0]+"With"](this===s?void 0:this,arguments),this},s[t[0]+"With"]=n.fireWith}),a.promise(s),e&&e.call(s,s),s},when:function(e){var n=arguments.length,t=n,r=Array(t),i=s.call(arguments),o=k.Deferred(),a=function(t){return function(e){r[t]=this,i[t]=1<arguments.length?s.call(arguments):e,--n||o.resolveWith(r,i)}};if(n<=1&&(W(e,o.done(a(t)).resolve,o.reject,!n),"pending"===o.state()||m(i[t]&&i[t].then)))return o.then();while(t--)W(i[t],a(t),o.reject);return o.promise()}});var $=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;k.Deferred.exceptionHook=function(e,t){C.console&&C.console.warn&&e&&$.test(e.name)&&C.console.warn("jQuery.Deferred exception: "+e.message,e.stack,t)},k.readyException=function(e){C.setTimeout(function(){throw e})};var F=k.Deferred();function B(){E.removeEventListener("DOMContentLoaded",B),C.removeEventListener("load",B),k.ready()}k.fn.ready=function(e){return F.then(e)["catch"](function(e){k.readyException(e)}),this},k.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--k.readyWait:k.isReady)||(k.isReady=!0)!==e&&0<--k.readyWait||F.resolveWith(E,[k])}}),k.ready.then=F.then,"complete"===E.readyState||"loading"!==E.readyState&&!E.documentElement.doScroll?C.setTimeout(k.ready):(E.addEventListener("DOMContentLoaded",B),C.addEventListener("load",B));var _=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===w(n))for(s in i=!0,n)_(e,t,s,n[s],!0,o,a);else if(void 0!==r&&(i=!0,m(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(k(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},z=/^-ms-/,U=/-([a-z])/g;function X(e,t){return t.toUpperCase()}function V(e){return e.replace(z,"ms-").replace(U,X)}var G=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function Y(){this.expando=k.expando+Y.uid++}Y.uid=1,Y.prototype={cache:function(e){var t=e[this.expando];return t||(t={},G(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if("string"==typeof t)i[V(t)]=n;else for(r in t)i[V(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][V(t)]},access:function(e,t,n){return void 0===t||t&&"string"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){n=(t=Array.isArray(t)?t.map(V):(t=V(t))in r?[t]:t.match(R)||[]).length;while(n--)delete r[t[n]]}(void 0===t||k.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!k.isEmptyObject(t)}};var Q=new Y,J=new Y,K=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,Z=/[A-Z]/g;function ee(e,t,n){var r,i;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(Z,"-$&").toLowerCase(),"string"==typeof(n=e.getAttribute(r))){try{n="true"===(i=n)||"false"!==i&&("null"===i?null:i===+i+""?+i:K.test(i)?JSON.parse(i):i)}catch(e){}J.set(e,t,n)}else n=void 0;return n}k.extend({hasData:function(e){return J.hasData(e)||Q.hasData(e)},data:function(e,t,n){return J.access(e,t,n)},removeData:function(e,t){J.remove(e,t)},_data:function(e,t,n){return Q.access(e,t,n)},_removeData:function(e,t){Q.remove(e,t)}}),k.fn.extend({data:function(n,e){var t,r,i,o=this[0],a=o&&o.attributes;if(void 0===n){if(this.length&&(i=J.get(o),1===o.nodeType&&!Q.get(o,"hasDataAttrs"))){t=a.length;while(t--)a[t]&&0===(r=a[t].name).indexOf("data-")&&(r=V(r.slice(5)),ee(o,r,i[r]));Q.set(o,"hasDataAttrs",!0)}return i}return"object"==typeof n?this.each(function(){J.set(this,n)}):_(this,function(e){var t;if(o&&void 0===e)return void 0!==(t=J.get(o,n))?t:void 0!==(t=ee(o,n))?t:void 0;this.each(function(){J.set(this,n,e)})},null,e,1<arguments.length,null,!0)},removeData:function(e){return this.each(function(){J.remove(this,e)})}}),k.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=Q.get(e,t),n&&(!r||Array.isArray(n)?r=Q.access(e,t,k.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=k.queue(e,t),r=n.length,i=n.shift(),o=k._queueHooks(e,t);"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,function(){k.dequeue(e,t)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return Q.get(e,n)||Q.access(e,n,{empty:k.Callbacks("once memory").add(function(){Q.remove(e,[t+"queue",n])})})}}),k.fn.extend({queue:function(t,n){var e=2;return"string"!=typeof t&&(n=t,t="fx",e--),arguments.length<e?k.queue(this[0],t):void 0===n?this:this.each(function(){var e=k.queue(this,t,n);k._queueHooks(this,t),"fx"===t&&"inprogress"!==e[0]&&k.dequeue(this,t)})},dequeue:function(e){return this.each(function(){k.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=k.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=void 0),e=e||"fx";while(a--)(n=Q.get(o[a],e+"queueHooks"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var te=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,ne=new RegExp("^(?:([+-])=|)("+te+")([a-z%]*)$","i"),re=["Top","Right","Bottom","Left"],ie=E.documentElement,oe=function(e){return k.contains(e.ownerDocument,e)},ae={composed:!0};ie.attachShadow&&(oe=function(e){return k.contains(e.ownerDocument,e)||e.getRootNode(ae)===e.ownerDocument});var se=function(e,t){return"none"===(e=t||e).style.display||""===e.style.display&&oe(e)&&"none"===k.css(e,"display")},ue=function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];for(o in i=n.apply(e,r||[]),t)e.style[o]=a[o];return i};function le(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return k.css(e,t,"")},u=s(),l=n&&n[3]||(k.cssNumber[t]?"":"px"),c=e.nodeType&&(k.cssNumber[t]||"px"!==l&&+u)&&ne.exec(k.css(e,t));if(c&&c[3]!==l){u/=2,l=l||c[3],c=+u||1;while(a--)k.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;c*=2,k.style(e,t,c+l),n=n||[]}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}var ce={};function fe(e,t){for(var n,r,i,o,a,s,u,l=[],c=0,f=e.length;c<f;c++)(r=e[c]).style&&(n=r.style.display,t?("none"===n&&(l[c]=Q.get(r,"display")||null,l[c]||(r.style.display="")),""===r.style.display&&se(r)&&(l[c]=(u=a=o=void 0,a=(i=r).ownerDocument,s=i.nodeName,(u=ce[s])||(o=a.body.appendChild(a.createElement(s)),u=k.css(o,"display"),o.parentNode.removeChild(o),"none"===u&&(u="block"),ce[s]=u)))):"none"!==n&&(l[c]="none",Q.set(r,"display",n)));for(c=0;c<f;c++)null!=l[c]&&(e[c].style.display=l[c]);return e}k.fn.extend({show:function(){return fe(this,!0)},hide:function(){return fe(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){se(this)?k(this).show():k(this).hide()})}});var pe=/^(?:checkbox|radio)$/i,de=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&N(e,t)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n<r;n++)Q.set(e[n],"globalEval",!t||Q.get(t[n],"globalEval"))}ge.optgroup=ge.option,ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td;var me,xe,be=/<|&#?\w+;/;function we(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d<h;d++)if((o=e[d])||0===o)if("object"===w(o))k.merge(p,o.nodeType?[o]:o);else if(be.test(o)){a=a||f.appendChild(t.createElement("div")),s=(de.exec(o)||["",""])[1].toLowerCase(),u=ge[s]||ge._default,a.innerHTML=u[1]+k.htmlPrefilter(o)+u[2],c=u[0];while(c--)a=a.lastChild;k.merge(p,a.childNodes),(a=f.firstChild).textContent=""}else p.push(t.createTextNode(o));f.textContent="",d=0;while(o=p[d++])if(r&&-1<k.inArray(o,r))i&&i.push(o);else if(l=oe(o),a=ve(f.appendChild(o),"script"),l&&ye(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}me=E.createDocumentFragment().appendChild(E.createElement("div")),(xe=E.createElement("input")).setAttribute("type","radio"),xe.setAttribute("checked","checked"),xe.setAttribute("name","t"),me.appendChild(xe),y.checkClone=me.cloneNode(!0).cloneNode(!0).lastChild.checked,me.innerHTML="<textarea>x</textarea>",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ae(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ne(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ne(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n=void 0,r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n}else r&&(Q.set(this,i,k.event.trigger(k.extend(r.shift(),k.Event.prototype),r,this)),e.stopImmediatePropagation())}})):k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t<arguments.length;t++)u[t]=arguments[t];if(s.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,s)){a=k.event.handlers.call(this,s,l),t=0;while((i=a[t++])&&!s.isPropagationStopped()){s.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!s.isImmediatePropagationStopped())s.rnamespace&&!1!==o.namespace&&!s.rnamespace.test(o.namespace)||(s.handleObj=o,s.data=o.data,void 0!==(r=((k.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,u))&&!1===(s.result=r)&&(s.preventDefault(),s.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,s),s.result}},handlers:function(e,t){var n,r,i,o,a,s=[],u=t.delegateCount,l=e.target;if(u&&l.nodeType&&!("click"===e.type&&1<=e.button))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n<u;n++)void 0===a[i=(r=t[n]).selector+" "]&&(a[i]=r.needsContext?-1<k(i,this).index(l):k.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(t,e){Object.defineProperty(k.Event.prototype,t,{enumerable:!0,configurable:!0,get:m(e)?function(){if(this.originalEvent)return e(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[t]},set:function(e){Object.defineProperty(this,t,{enumerable:!0,configurable:!0,writable:!0,value:e})}})},fix:function(e){return e[k.expando]?e:new k.Event(e)},special:{load:{noBubble:!0},click:{setup:function(e){var t=this||e;return pe.test(t.type)&&t.click&&N(t,"input")&&void 0===Q.get(t,"click")&&De(t,"click",ke),!1},trigger:function(e){var t=this||e;return pe.test(t.type)&&t.click&&N(t,"input")&&void 0===Q.get(t,"click")&&De(t,"click"),!0},_default:function(e){var t=e.target;return pe.test(t.type)&&t.click&&N(t,"input")&&Q.get(t,"click")||N(t,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},k.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},k.Event=function(e,t){if(!(this instanceof k.Event))return new k.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?ke:Se,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&k.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[k.expando]=!0},k.Event.prototype={constructor:k.Event,isDefaultPrevented:Se,isPropagationStopped:Se,isImmediatePropagationStopped:Se,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=ke,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=ke,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=ke,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},k.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,code:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:function(e){var t=e.button;return null==e.which&&Te.test(e.type)?null!=e.charCode?e.charCode:e.keyCode:!e.which&&void 0!==t&&Ce.test(e.type)?1&t?1:2&t?3:4&t?2:0:e.which}},k.event.addProp),k.each({focus:"focusin",blur:"focusout"},function(e,t){k.event.special[e]={setup:function(){return De(this,e,Ae),!1},trigger:function(){return De(this,e),!0},delegateType:t}}),k.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,i){k.event.special[e]={delegateType:i,bindType:i,handle:function(e){var t,n=e.relatedTarget,r=e.handleObj;return n&&(n===this||k.contains(this,n))||(e.type=r.origType,t=r.handler.apply(this,arguments),e.type=i),t}}}),k.fn.extend({on:function(e,t,n,r){return Ne(this,e,t,n,r)},one:function(e,t,n,r){return Ne(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,k(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return!1!==t&&"function"!=typeof t||(n=t,t=void 0),!1===n&&(n=Se),this.each(function(){k.event.remove(this,e,n,t)})}});var je=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/<script|<style|<link/i,Le=/checked\s*(?:[^=]|=\s*.checked.)/i,He=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function Oe(e,t){return N(e,"table")&&N(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n<r;n++)k.event.add(t,i,l[i][n]);J.hasData(e)&&(s=J.access(e),u=k.extend({},s),J.set(t,u))}}function Ie(n,r,i,o){r=g.apply([],r);var e,t,a,s,u,l,c=0,f=n.length,p=f-1,d=r[0],h=m(d);if(h||1<f&&"string"==typeof d&&!y.checkClone&&Le.test(d))return n.each(function(e){var t=n.eq(e);h&&(r[0]=d.call(this,e,t.html())),Ie(t,r,i,o)});if(f&&(t=(e=we(r,n[0].ownerDocument,!1,n,o)).firstChild,1===e.childNodes.length&&(e=t),t||o)){for(s=(a=k.map(ve(e,"script"),Pe)).length;c<f;c++)u=e,c!==p&&(u=k.clone(u,!0,!0),s&&k.merge(a,ve(u,"script"))),i.call(n[c],u,c);if(s)for(l=a[a.length-1].ownerDocument,k.map(a,Re),c=0;c<s;c++)u=a[c],he.test(u.type||"")&&!Q.access(u,"globalEval")&&k.contains(l,u)&&(u.src&&"module"!==(u.type||"").toLowerCase()?k._evalUrl&&!u.noModule&&k._evalUrl(u.src,{nonce:u.nonce||u.getAttribute("nonce")}):b(u.textContent.replace(He,""),u,l))}return n}function We(e,t,n){for(var r,i=t?k.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||k.cleanData(ve(r)),r.parentNode&&(n&&oe(r)&&ye(ve(r,"script")),r.parentNode.removeChild(r));return e}k.extend({htmlPrefilter:function(e){return e.replace(je,"<$1></$2>")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r<i;r++)s=o[r],u=a[r],void 0,"input"===(l=u.nodeName.toLowerCase())&&pe.test(s.type)?u.checked=s.checked:"input"!==l&&"textarea"!==l||(u.defaultValue=s.defaultValue);if(t)if(n)for(o=o||ve(e),a=a||ve(c),r=0,i=o.length;r<i;r++)Me(o[r],a[r]);else Me(e,c);return 0<(a=ve(c,"script")).length&&ye(a,!f&&ve(e,"script")),c},cleanData:function(e){for(var t,n,r,i=k.event.special,o=0;void 0!==(n=e[o]);o++)if(G(n)){if(t=n[Q.expando]){if(t.events)for(r in t.events)i[r]?k.event.remove(n,r):k.removeEvent(n,r,t.handle);n[Q.expando]=void 0}n[J.expando]&&(n[J.expando]=void 0)}}}),k.fn.extend({detach:function(e){return We(this,e,!0)},remove:function(e){return We(this,e)},text:function(e){return _(this,function(e){return void 0===e?k.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return Ie(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Oe(this,e).appendChild(e)})},prepend:function(){return Ie(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Oe(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return Ie(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return Ie(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(k.cleanData(ve(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return k.clone(this,e,t)})},html:function(e){return _(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!qe.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=k.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(k.cleanData(ve(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var n=[];return Ie(this,arguments,function(e){var t=this.parentNode;k.inArray(this,n)<0&&(k.cleanData(ve(this)),t&&t.replaceChild(e,this))},n)}}),k.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,a){k.fn[e]=function(e){for(var t,n=[],r=k(e),i=r.length-1,o=0;o<=i;o++)t=o===i?this:this.clone(!0),k(r[o])[a](t),u.apply(n,t.get());return this.pushStack(n)}});var $e=new RegExp("^("+te+")(?!px)[a-z%]+$","i"),Fe=function(e){var t=e.ownerDocument.defaultView;return t&&t.opener||(t=C),t.getComputedStyle(e)},Be=new RegExp(re.join("|"),"i");function _e(e,t,n){var r,i,o,a,s=e.style;return(n=n||Fe(e))&&(""!==(a=n.getPropertyValue(t)||n[t])||oe(e)||(a=k.style(e,t)),!y.pixelBoxStyles()&&$e.test(a)&&Be.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o)),void 0!==a?a+"":a}function ze(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}!function(){function e(){if(u){s.style.cssText="position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0",u.style.cssText="position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%",ie.appendChild(s).appendChild(u);var e=C.getComputedStyle(u);n="1%"!==e.top,a=12===t(e.marginLeft),u.style.right="60%",o=36===t(e.right),r=36===t(e.width),u.style.position="absolute",i=12===t(u.offsetWidth/3),ie.removeChild(s),u=null}}function t(e){return Math.round(parseFloat(e))}var n,r,i,o,a,s=E.createElement("div"),u=E.createElement("div");u.style&&(u.style.backgroundClip="content-box",u.cloneNode(!0).style.backgroundClip="",y.clearCloneStyle="content-box"===u.style.backgroundClip,k.extend(y,{boxSizingReliable:function(){return e(),r},pixelBoxStyles:function(){return e(),o},pixelPosition:function(){return e(),n},reliableMarginLeft:function(){return e(),a},scrollboxSize:function(){return e(),i}}))}();var Ue=["Webkit","Moz","ms"],Xe=E.createElement("div").style,Ve={};function Ge(e){var t=k.cssProps[e]||Ve[e];return t||(e in Xe?e:Ve[e]=function(e){var t=e[0].toUpperCase()+e.slice(1),n=Ue.length;while(n--)if((e=Ue[n]+t)in Xe)return e}(e)||e)}var Ye=/^(none|table(?!-c[ea]).+)/,Qe=/^--/,Je={position:"absolute",visibility:"hidden",display:"block"},Ke={letterSpacing:"0",fontWeight:"400"};function Ze(e,t,n){var r=ne.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function et(e,t,n,r,i,o){var a="width"===t?1:0,s=0,u=0;if(n===(r?"border":"content"))return 0;for(;a<4;a+=2)"margin"===n&&(u+=k.css(e,n+re[a],!0,i)),r?("content"===n&&(u-=k.css(e,"padding"+re[a],!0,i)),"margin"!==n&&(u-=k.css(e,"border"+re[a]+"Width",!0,i))):(u+=k.css(e,"padding"+re[a],!0,i),"padding"!==n?u+=k.css(e,"border"+re[a]+"Width",!0,i):s+=k.css(e,"border"+re[a]+"Width",!0,i));return!r&&0<=o&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))||0),u}function tt(e,t,n){var r=Fe(e),i=(!y.boxSizingReliable()||n)&&"border-box"===k.css(e,"boxSizing",!1,r),o=i,a=_e(e,t,r),s="offset"+t[0].toUpperCase()+t.slice(1);if($e.test(a)){if(!n)return a;a="auto"}return(!y.boxSizingReliable()&&i||"auto"===a||!parseFloat(a)&&"inline"===k.css(e,"display",!1,r))&&e.getClientRects().length&&(i="border-box"===k.css(e,"boxSizing",!1,r),(o=s in e)&&(a=e[s])),(a=parseFloat(a)||0)+et(e,t,n||(i?"border":"content"),o,r,a)+"px"}function nt(e,t,n,r,i){return new nt.prototype.init(e,t,n,r,i)}k.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=_e(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=V(t),u=Qe.test(t),l=e.style;if(u||(t=Ge(s)),a=k.cssHooks[t]||k.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"===(o=typeof n)&&(i=ne.exec(n))&&i[1]&&(n=le(e,t,i),o="number"),null!=n&&n==n&&("number"!==o||u||(n+=i&&i[3]||(k.cssNumber[s]?"":"px")),y.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=V(t);return Qe.test(t)||(t=Ge(s)),(a=k.cssHooks[t]||k.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=_e(e,t,r)),"normal"===i&&t in Ke&&(i=Ke[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),k.each(["height","width"],function(e,u){k.cssHooks[u]={get:function(e,t,n){if(t)return!Ye.test(k.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?tt(e,u,n):ue(e,Je,function(){return tt(e,u,n)})},set:function(e,t,n){var r,i=Fe(e),o=!y.scrollboxSize()&&"absolute"===i.position,a=(o||n)&&"border-box"===k.css(e,"boxSizing",!1,i),s=n?et(e,u,n,a,i):0;return a&&o&&(s-=Math.ceil(e["offset"+u[0].toUpperCase()+u.slice(1)]-parseFloat(i[u])-et(e,u,"border",!1,i)-.5)),s&&(r=ne.exec(t))&&"px"!==(r[3]||"px")&&(e.style[u]=t,t=k.css(e,u)),Ze(0,t,s)}}}),k.cssHooks.marginLeft=ze(y.reliableMarginLeft,function(e,t){if(t)return(parseFloat(_e(e,"marginLeft"))||e.getBoundingClientRect().left-ue(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),k.each({margin:"",padding:"",border:"Width"},function(i,o){k.cssHooks[i+o]={expand:function(e){for(var t=0,n={},r="string"==typeof e?e.split(" "):[e];t<4;t++)n[i+re[t]+o]=r[t]||r[t-2]||r[0];return n}},"margin"!==i&&(k.cssHooks[i+o].set=Ze)}),k.fn.extend({css:function(e,t){return _(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=Fe(e),i=t.length;a<i;a++)o[t[a]]=k.css(e,t[a],!1,r);return o}return void 0!==n?k.style(e,t,n):k.css(e,t)},e,t,1<arguments.length)}}),((k.Tween=nt).prototype={constructor:nt,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||k.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(k.cssNumber[n]?"":"px")},cur:function(){var e=nt.propHooks[this.prop];return e&&e.get?e.get(this):nt.propHooks._default.get(this)},run:function(e){var t,n=nt.propHooks[this.prop];return this.options.duration?this.pos=t=k.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):nt.propHooks._default.set(this),this}}).init.prototype=nt.prototype,(nt.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=k.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){k.fx.step[e.prop]?k.fx.step[e.prop](e):1!==e.elem.nodeType||!k.cssHooks[e.prop]&&null==e.elem.style[Ge(e.prop)]?e.elem[e.prop]=e.now:k.style(e.elem,e.prop,e.now+e.unit)}}}).scrollTop=nt.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},k.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},k.fx=nt.prototype.init,k.fx.step={};var rt,it,ot,at,st=/^(?:toggle|show|hide)$/,ut=/queueHooks$/;function lt(){it&&(!1===E.hidden&&C.requestAnimationFrame?C.requestAnimationFrame(lt):C.setTimeout(lt,k.fx.interval),k.fx.tick())}function ct(){return C.setTimeout(function(){rt=void 0}),rt=Date.now()}function ft(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=re[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function pt(e,t,n){for(var r,i=(dt.tweeners[t]||[]).concat(dt.tweeners["*"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function dt(o,e,t){var n,a,r=0,i=dt.prefilters.length,s=k.Deferred().always(function(){delete u.elem}),u=function(){if(a)return!1;for(var e=rt||ct(),t=Math.max(0,l.startTime+l.duration-e),n=1-(t/l.duration||0),r=0,i=l.tweens.length;r<i;r++)l.tweens[r].run(n);return s.notifyWith(o,[l,n,t]),n<1&&i?t:(i||s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l]),!1)},l=s.promise({elem:o,props:k.extend({},e),opts:k.extend(!0,{specialEasing:{},easing:k.easing._default},t),originalProperties:e,originalOptions:t,startTime:rt||ct(),duration:t.duration,tweens:[],createTween:function(e,t){var n=k.Tween(o,l.opts,e,t,l.opts.specialEasing[e]||l.opts.easing);return l.tweens.push(n),n},stop:function(e){var t=0,n=e?l.tweens.length:0;if(a)return this;for(a=!0;t<n;t++)l.tweens[t].run(1);return e?(s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l,e])):s.rejectWith(o,[l,e]),this}}),c=l.props;for(!function(e,t){var n,r,i,o,a;for(n in e)if(i=t[r=V(n)],o=e[n],Array.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),(a=k.cssHooks[r])&&"expand"in a)for(n in o=a.expand(o),delete e[r],o)n in e||(e[n]=o[n],t[n]=i);else t[r]=i}(c,l.opts.specialEasing);r<i;r++)if(n=dt.prefilters[r].call(l,o,c,l.opts))return m(n.stop)&&(k._queueHooks(l.elem,l.opts.queue).stop=n.stop.bind(n)),n;return k.map(c,pt,l),m(l.opts.start)&&l.opts.start.call(o,l),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always),k.fx.timer(k.extend(u,{elem:o,anim:l,queue:l.opts.queue})),l}k.Animation=k.extend(dt,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return le(n.elem,e,ne.exec(t),n),n}]},tweener:function(e,t){m(e)?(t=e,e=["*"]):e=e.match(R);for(var n,r=0,i=e.length;r<i;r++)n=e[r],dt.tweeners[n]=dt.tweeners[n]||[],dt.tweeners[n].unshift(t)},prefilters:[function(e,t,n){var r,i,o,a,s,u,l,c,f="width"in t||"height"in t,p=this,d={},h=e.style,g=e.nodeType&&se(e),v=Q.get(e,"fxshow");for(r in n.queue||(null==(a=k._queueHooks(e,"fx")).unqueued&&(a.unqueued=0,s=a.empty.fire,a.empty.fire=function(){a.unqueued||s()}),a.unqueued++,p.always(function(){p.always(function(){a.unqueued--,k.queue(e,"fx").length||a.empty.fire()})})),t)if(i=t[r],st.test(i)){if(delete t[r],o=o||"toggle"===i,i===(g?"hide":"show")){if("show"!==i||!v||void 0===v[r])continue;g=!0}d[r]=v&&v[r]||k.style(e,r)}if((u=!k.isEmptyObject(t))||!k.isEmptyObject(d))for(r in f&&1===e.nodeType&&(n.overflow=[h.overflow,h.overflowX,h.overflowY],null==(l=v&&v.display)&&(l=Q.get(e,"display")),"none"===(c=k.css(e,"display"))&&(l?c=l:(fe([e],!0),l=e.style.display||l,c=k.css(e,"display"),fe([e]))),("inline"===c||"inline-block"===c&&null!=l)&&"none"===k.css(e,"float")&&(u||(p.done(function(){h.display=l}),null==l&&(c=h.display,l="none"===c?"":c)),h.display="inline-block")),n.overflow&&(h.overflow="hidden",p.always(function(){h.overflow=n.overflow[0],h.overflowX=n.overflow[1],h.overflowY=n.overflow[2]})),u=!1,d)u||(v?"hidden"in v&&(g=v.hidden):v=Q.access(e,"fxshow",{display:l}),o&&(v.hidden=!g),g&&fe([e],!0),p.done(function(){for(r in g||fe([e]),Q.remove(e,"fxshow"),d)k.style(e,r,d[r])})),u=pt(g?v[r]:0,r,p),r in v||(v[r]=u.start,g&&(u.end=u.start,u.start=0))}],prefilter:function(e,t){t?dt.prefilters.unshift(e):dt.prefilters.push(e)}}),k.speed=function(e,t,n){var r=e&&"object"==typeof e?k.extend({},e):{complete:n||!n&&t||m(e)&&e,duration:e,easing:n&&t||t&&!m(t)&&t};return k.fx.off?r.duration=0:"number"!=typeof r.duration&&(r.duration in k.fx.speeds?r.duration=k.fx.speeds[r.duration]:r.duration=k.fx.speeds._default),null!=r.queue&&!0!==r.queue||(r.queue="fx"),r.old=r.complete,r.complete=function(){m(r.old)&&r.old.call(this),r.queue&&k.dequeue(this,r.queue)},r},k.fn.extend({fadeTo:function(e,t,n,r){return this.filter(se).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(t,e,n,r){var i=k.isEmptyObject(t),o=k.speed(e,n,r),a=function(){var e=dt(this,k.extend({},t),o);(i||Q.get(this,"finish"))&&e.stop(!0)};return a.finish=a,i||!1===o.queue?this.each(a):this.queue(o.queue,a)},stop:function(i,e,o){var a=function(e){var t=e.stop;delete e.stop,t(o)};return"string"!=typeof i&&(o=e,e=i,i=void 0),e&&!1!==i&&this.queue(i||"fx",[]),this.each(function(){var e=!0,t=null!=i&&i+"queueHooks",n=k.timers,r=Q.get(this);if(t)r[t]&&r[t].stop&&a(r[t]);else for(t in r)r[t]&&r[t].stop&&ut.test(t)&&a(r[t]);for(t=n.length;t--;)n[t].elem!==this||null!=i&&n[t].queue!==i||(n[t].anim.stop(o),e=!1,n.splice(t,1));!e&&o||k.dequeue(this,i)})},finish:function(a){return!1!==a&&(a=a||"fx"),this.each(function(){var e,t=Q.get(this),n=t[a+"queue"],r=t[a+"queueHooks"],i=k.timers,o=n?n.length:0;for(t.finish=!0,k.queue(this,a,[]),r&&r.stop&&r.stop.call(this,!0),e=i.length;e--;)i[e].elem===this&&i[e].queue===a&&(i[e].anim.stop(!0),i.splice(e,1));for(e=0;e<o;e++)n[e]&&n[e].finish&&n[e].finish.call(this);delete t.finish})}}),k.each(["toggle","show","hide"],function(e,r){var i=k.fn[r];k.fn[r]=function(e,t,n){return null==e||"boolean"==typeof e?i.apply(this,arguments):this.animate(ft(r,!0),e,t,n)}}),k.each({slideDown:ft("show"),slideUp:ft("hide"),slideToggle:ft("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,r){k.fn[e]=function(e,t,n){return this.animate(r,e,t,n)}}),k.timers=[],k.fx.tick=function(){var e,t=0,n=k.timers;for(rt=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||k.fx.stop(),rt=void 0},k.fx.timer=function(e){k.timers.push(e),k.fx.start()},k.fx.interval=13,k.fx.start=function(){it||(it=!0,lt())},k.fx.stop=function(){it=null},k.fx.speeds={slow:600,fast:200,_default:400},k.fn.delay=function(r,e){return r=k.fx&&k.fx.speeds[r]||r,e=e||"fx",this.queue(e,function(e,t){var n=C.setTimeout(e,r);t.stop=function(){C.clearTimeout(n)}})},ot=E.createElement("input"),at=E.createElement("select").appendChild(E.createElement("option")),ot.type="checkbox",y.checkOn=""!==ot.value,y.optSelected=at.selected,(ot=E.createElement("input")).value="t",ot.type="radio",y.radioValue="t"===ot.value;var ht,gt=k.expr.attrHandle;k.fn.extend({attr:function(e,t){return _(this,k.attr,e,t,1<arguments.length)},removeAttr:function(e){return this.each(function(){k.removeAttr(this,e)})}}),k.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?k.prop(e,t,n):(1===o&&k.isXMLDoc(e)||(i=k.attrHooks[t.toLowerCase()]||(k.expr.match.bool.test(t)?ht:void 0)),void 0!==n?null===n?void k.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=k.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!y.radioValue&&"radio"===t&&N(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(R);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),ht={set:function(e,t,n){return!1===t?k.removeAttr(e,n):e.setAttribute(n,n),n}},k.each(k.expr.match.bool.source.match(/\w+/g),function(e,t){var a=gt[t]||k.find.attr;gt[t]=function(e,t,n){var r,i,o=t.toLowerCase();return n||(i=gt[o],gt[o]=r,r=null!=a(e,t,n)?o:null,gt[o]=i),r}});var vt=/^(?:input|select|textarea|button)$/i,yt=/^(?:a|area)$/i;function mt(e){return(e.match(R)||[]).join(" ")}function xt(e){return e.getAttribute&&e.getAttribute("class")||""}function bt(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(R)||[]}k.fn.extend({prop:function(e,t){return _(this,k.prop,e,t,1<arguments.length)},removeProp:function(e){return this.each(function(){delete this[k.propFix[e]||e]})}}),k.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&k.isXMLDoc(e)||(t=k.propFix[t]||t,i=k.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=k.find.attr(e,"tabindex");return t?parseInt(t,10):vt.test(e.nodeName)||yt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),y.optSelected||(k.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),k.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){k.propFix[this.toLowerCase()]=this}),k.fn.extend({addClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){k(this).addClass(t.call(this,e,xt(this)))});if((e=bt(t)).length)while(n=this[u++])if(i=xt(n),r=1===n.nodeType&&" "+mt(i)+" "){a=0;while(o=e[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=mt(r))&&n.setAttribute("class",s)}return this},removeClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){k(this).removeClass(t.call(this,e,xt(this)))});if(!arguments.length)return this.attr("class","");if((e=bt(t)).length)while(n=this[u++])if(i=xt(n),r=1===n.nodeType&&" "+mt(i)+" "){a=0;while(o=e[a++])while(-1<r.indexOf(" "+o+" "))r=r.replace(" "+o+" "," ");i!==(s=mt(r))&&n.setAttribute("class",s)}return this},toggleClass:function(i,t){var o=typeof i,a="string"===o||Array.isArray(i);return"boolean"==typeof t&&a?t?this.addClass(i):this.removeClass(i):m(i)?this.each(function(e){k(this).toggleClass(i.call(this,e,xt(this),t),t)}):this.each(function(){var e,t,n,r;if(a){t=0,n=k(this),r=bt(i);while(e=r[t++])n.hasClass(e)?n.removeClass(e):n.addClass(e)}else void 0!==i&&"boolean"!==o||((e=xt(this))&&Q.set(this,"__className__",e),this.setAttribute&&this.setAttribute("class",e||!1===i?"":Q.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&-1<(" "+mt(xt(n))+" ").indexOf(t))return!0;return!1}});var wt=/\r/g;k.fn.extend({val:function(n){var r,e,i,t=this[0];return arguments.length?(i=m(n),this.each(function(e){var t;1===this.nodeType&&(null==(t=i?n.call(this,e,k(this).val()):n)?t="":"number"==typeof t?t+="":Array.isArray(t)&&(t=k.map(t,function(e){return null==e?"":e+""})),(r=k.valHooks[this.type]||k.valHooks[this.nodeName.toLowerCase()])&&"set"in r&&void 0!==r.set(this,t,"value")||(this.value=t))})):t?(r=k.valHooks[t.type]||k.valHooks[t.nodeName.toLowerCase()])&&"get"in r&&void 0!==(e=r.get(t,"value"))?e:"string"==typeof(e=t.value)?e.replace(wt,""):null==e?"":e:void 0}}),k.extend({valHooks:{option:{get:function(e){var t=k.find.attr(e,"value");return null!=t?t:mt(k.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r<u;r++)if(((n=i[r]).selected||r===o)&&!n.disabled&&(!n.parentNode.disabled||!N(n.parentNode,"optgroup"))){if(t=k(n).val(),a)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=k.makeArray(t),a=i.length;while(a--)((r=i[a]).selected=-1<k.inArray(k.valHooks.option.get(r),o))&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),k.each(["radio","checkbox"],function(){k.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=-1<k.inArray(k(e).val(),t)}},y.checkOn||(k.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),y.focusin="onfocusin"in C;var Tt=/^(?:focusinfocus|focusoutblur)$/,Ct=function(e){e.stopPropagation()};k.extend(k.event,{trigger:function(e,t,n,r){var i,o,a,s,u,l,c,f,p=[n||E],d=v.call(e,"type")?e.type:e,h=v.call(e,"namespace")?e.namespace.split("."):[];if(o=f=a=n=n||E,3!==n.nodeType&&8!==n.nodeType&&!Tt.test(d+k.event.triggered)&&(-1<d.indexOf(".")&&(d=(h=d.split(".")).shift(),h.sort()),u=d.indexOf(":")<0&&"on"+d,(e=e[k.expando]?e:new k.Event(d,"object"==typeof e&&e)).isTrigger=r?2:3,e.namespace=h.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=n),t=null==t?[e]:k.makeArray(t,[e]),c=k.event.special[d]||{},r||!c.trigger||!1!==c.trigger.apply(n,t))){if(!r&&!c.noBubble&&!x(n)){for(s=c.delegateType||d,Tt.test(s+d)||(o=o.parentNode);o;o=o.parentNode)p.push(o),a=o;a===(n.ownerDocument||E)&&p.push(a.defaultView||a.parentWindow||C)}i=0;while((o=p[i++])&&!e.isPropagationStopped())f=o,e.type=1<i?s:c.bindType||d,(l=(Q.get(o,"events")||{})[e.type]&&Q.get(o,"handle"))&&l.apply(o,t),(l=u&&o[u])&&l.apply&&G(o)&&(e.result=l.apply(o,t),!1===e.result&&e.preventDefault());return e.type=d,r||e.isDefaultPrevented()||c._default&&!1!==c._default.apply(p.pop(),t)||!G(n)||u&&m(n[d])&&!x(n)&&((a=n[u])&&(n[u]=null),k.event.triggered=d,e.isPropagationStopped()&&f.addEventListener(d,Ct),n[d](),e.isPropagationStopped()&&f.removeEventListener(d,Ct),k.event.triggered=void 0,a&&(n[u]=a)),e.result}},simulate:function(e,t,n){var r=k.extend(new k.Event,n,{type:e,isSimulated:!0});k.event.trigger(r,null,t)}}),k.fn.extend({trigger:function(e,t){return this.each(function(){k.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return k.event.trigger(e,t,n,!0)}}),y.focusin||k.each({focus:"focusin",blur:"focusout"},function(n,r){var i=function(e){k.event.simulate(r,e.target,k.event.fix(e))};k.event.special[r]={setup:function(){var e=this.ownerDocument||this,t=Q.access(e,r);t||e.addEventListener(n,i,!0),Q.access(e,r,(t||0)+1)},teardown:function(){var e=this.ownerDocument||this,t=Q.access(e,r)-1;t?Q.access(e,r,t):(e.removeEventListener(n,i,!0),Q.remove(e,r))}}});var Et=C.location,kt=Date.now(),St=/\?/;k.parseXML=function(e){var t;if(!e||"string"!=typeof e)return null;try{t=(new C.DOMParser).parseFromString(e,"text/xml")}catch(e){t=void 0}return t&&!t.getElementsByTagName("parsererror").length||k.error("Invalid XML: "+e),t};var At=/\[\]$/,Nt=/\r?\n/g,Dt=/^(?:submit|button|image|reset|file)$/i,jt=/^(?:input|select|textarea|keygen)/i;function qt(n,e,r,i){var t;if(Array.isArray(e))k.each(e,function(e,t){r||At.test(n)?i(n,t):qt(n+"["+("object"==typeof t&&null!=t?e:"")+"]",t,r,i)});else if(r||"object"!==w(e))i(n,e);else for(t in e)qt(n+"["+t+"]",e[t],r,i)}k.param=function(e,t){var n,r=[],i=function(e,t){var n=m(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(null==e)return"";if(Array.isArray(e)||e.jquery&&!k.isPlainObject(e))k.each(e,function(){i(this.name,this.value)});else for(n in e)qt(n,e[n],t,i);return r.join("&")},k.fn.extend({serialize:function(){return k.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=k.prop(this,"elements");return e?k.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!k(this).is(":disabled")&&jt.test(this.nodeName)&&!Dt.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=k(this).val();return null==n?null:Array.isArray(n)?k.map(n,function(e){return{name:t.name,value:e.replace(Nt,"\r\n")}}):{name:t.name,value:n.replace(Nt,"\r\n")}}).get()}});var Lt=/%20/g,Ht=/#.*$/,Ot=/([?&])_=[^&]*/,Pt=/^(.*?):[ \t]*([^\r\n]*)$/gm,Rt=/^(?:GET|HEAD)$/,Mt=/^\/\//,It={},Wt={},$t="*/".concat("*"),Ft=E.createElement("a");function Bt(o){return function(e,t){"string"!=typeof e&&(t=e,e="*");var n,r=0,i=e.toLowerCase().match(R)||[];if(m(t))while(n=i[r++])"+"===n[0]?(n=n.slice(1)||"*",(o[n]=o[n]||[]).unshift(t)):(o[n]=o[n]||[]).push(t)}}function _t(t,i,o,a){var s={},u=t===Wt;function l(e){var r;return s[e]=!0,k.each(t[e]||[],function(e,t){var n=t(i,o,a);return"string"!=typeof n||u||s[n]?u?!(r=n):void 0:(i.dataTypes.unshift(n),l(n),!1)}),r}return l(i.dataTypes[0])||!s["*"]&&l("*")}function zt(e,t){var n,r,i=k.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&k.extend(!0,e,r),e}Ft.href=Et.href,k.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Et.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(Et.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":$t,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":k.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?zt(zt(e,k.ajaxSettings),t):zt(k.ajaxSettings,e)},ajaxPrefilter:Bt(It),ajaxTransport:Bt(Wt),ajax:function(e,t){"object"==typeof e&&(t=e,e=void 0),t=t||{};var c,f,p,n,d,r,h,g,i,o,v=k.ajaxSetup({},t),y=v.context||v,m=v.context&&(y.nodeType||y.jquery)?k(y):k.event,x=k.Deferred(),b=k.Callbacks("once memory"),w=v.statusCode||{},a={},s={},u="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(h){if(!n){n={};while(t=Pt.exec(p))n[t[1].toLowerCase()+" "]=(n[t[1].toLowerCase()+" "]||[]).concat(t[2])}t=n[e.toLowerCase()+" "]}return null==t?null:t.join(", ")},getAllResponseHeaders:function(){return h?p:null},setRequestHeader:function(e,t){return null==h&&(e=s[e.toLowerCase()]=s[e.toLowerCase()]||e,a[e]=t),this},overrideMimeType:function(e){return null==h&&(v.mimeType=e),this},statusCode:function(e){var t;if(e)if(h)T.always(e[T.status]);else for(t in e)w[t]=[w[t],e[t]];return this},abort:function(e){var t=e||u;return c&&c.abort(t),l(0,t),this}};if(x.promise(T),v.url=((e||v.url||Et.href)+"").replace(Mt,Et.protocol+"//"),v.type=t.method||t.type||v.method||v.type,v.dataTypes=(v.dataType||"*").toLowerCase().match(R)||[""],null==v.crossDomain){r=E.createElement("a");try{r.href=v.url,r.href=r.href,v.crossDomain=Ft.protocol+"//"+Ft.host!=r.protocol+"//"+r.host}catch(e){v.crossDomain=!0}}if(v.data&&v.processData&&"string"!=typeof v.data&&(v.data=k.param(v.data,v.traditional)),_t(It,v,t,T),h)return T;for(i in(g=k.event&&v.global)&&0==k.active++&&k.event.trigger("ajaxStart"),v.type=v.type.toUpperCase(),v.hasContent=!Rt.test(v.type),f=v.url.replace(Ht,""),v.hasContent?v.data&&v.processData&&0===(v.contentType||"").indexOf("application/x-www-form-urlencoded")&&(v.data=v.data.replace(Lt,"+")):(o=v.url.slice(f.length),v.data&&(v.processData||"string"==typeof v.data)&&(f+=(St.test(f)?"&":"?")+v.data,delete v.data),!1===v.cache&&(f=f.replace(Ot,"$1"),o=(St.test(f)?"&":"?")+"_="+kt+++o),v.url=f+o),v.ifModified&&(k.lastModified[f]&&T.setRequestHeader("If-Modified-Since",k.lastModified[f]),k.etag[f]&&T.setRequestHeader("If-None-Match",k.etag[f])),(v.data&&v.hasContent&&!1!==v.contentType||t.contentType)&&T.setRequestHeader("Content-Type",v.contentType),T.setRequestHeader("Accept",v.dataTypes[0]&&v.accepts[v.dataTypes[0]]?v.accepts[v.dataTypes[0]]+("*"!==v.dataTypes[0]?", "+$t+"; q=0.01":""):v.accepts["*"]),v.headers)T.setRequestHeader(i,v.headers[i]);if(v.beforeSend&&(!1===v.beforeSend.call(y,T,v)||h))return T.abort();if(u="abort",b.add(v.complete),T.done(v.success),T.fail(v.error),c=_t(Wt,v,t,T)){if(T.readyState=1,g&&m.trigger("ajaxSend",[T,v]),h)return T;v.async&&0<v.timeout&&(d=C.setTimeout(function(){T.abort("timeout")},v.timeout));try{h=!1,c.send(a,l)}catch(e){if(h)throw e;l(-1,e)}}else l(-1,"No Transport");function l(e,t,n,r){var i,o,a,s,u,l=t;h||(h=!0,d&&C.clearTimeout(d),c=void 0,p=r||"",T.readyState=0<e?4:0,i=200<=e&&e<300||304===e,n&&(s=function(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}(v,T,n)),s=function(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}(v,s,T,i),i?(v.ifModified&&((u=T.getResponseHeader("Last-Modified"))&&(k.lastModified[f]=u),(u=T.getResponseHeader("etag"))&&(k.etag[f]=u)),204===e||"HEAD"===v.type?l="nocontent":304===e?l="notmodified":(l=s.state,o=s.data,i=!(a=s.error))):(a=l,!e&&l||(l="error",e<0&&(e=0))),T.status=e,T.statusText=(t||l)+"",i?x.resolveWith(y,[o,l,T]):x.rejectWith(y,[T,l,a]),T.statusCode(w),w=void 0,g&&m.trigger(i?"ajaxSuccess":"ajaxError",[T,v,i?o:a]),b.fireWith(y,[T,l]),g&&(m.trigger("ajaxComplete",[T,v]),--k.active||k.event.trigger("ajaxStop")))}return T},getJSON:function(e,t,n){return k.get(e,t,n,"json")},getScript:function(e,t){return k.get(e,void 0,t,"script")}}),k.each(["get","post"],function(e,i){k[i]=function(e,t,n,r){return m(t)&&(r=r||n,n=t,t=void 0),k.ajax(k.extend({url:e,type:i,dataType:r,data:t,success:n},k.isPlainObject(e)&&e))}}),k._evalUrl=function(e,t){return k.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(e){k.globalEval(e,t)}})},k.fn.extend({wrapAll:function(e){var t;return this[0]&&(m(e)&&(e=e.call(this[0])),t=k(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(n){return m(n)?this.each(function(e){k(this).wrapInner(n.call(this,e))}):this.each(function(){var e=k(this),t=e.contents();t.length?t.wrapAll(n):e.append(n)})},wrap:function(t){var n=m(t);return this.each(function(e){k(this).wrapAll(n?t.call(this,e):t)})},unwrap:function(e){return this.parent(e).not("body").each(function(){k(this).replaceWith(this.childNodes)}),this}}),k.expr.pseudos.hidden=function(e){return!k.expr.pseudos.visible(e)},k.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},k.ajaxSettings.xhr=function(){try{return new C.XMLHttpRequest}catch(e){}};var Ut={0:200,1223:204},Xt=k.ajaxSettings.xhr();y.cors=!!Xt&&"withCredentials"in Xt,y.ajax=Xt=!!Xt,k.ajaxTransport(function(i){var o,a;if(y.cors||Xt&&!i.crossDomain)return{send:function(e,t){var n,r=i.xhr();if(r.open(i.type,i.url,i.async,i.username,i.password),i.xhrFields)for(n in i.xhrFields)r[n]=i.xhrFields[n];for(n in i.mimeType&&r.overrideMimeType&&r.overrideMimeType(i.mimeType),i.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest"),e)r.setRequestHeader(n,e[n]);o=function(e){return function(){o&&(o=a=r.onload=r.onerror=r.onabort=r.ontimeout=r.onreadystatechange=null,"abort"===e?r.abort():"error"===e?"number"!=typeof r.status?t(0,"error"):t(r.status,r.statusText):t(Ut[r.status]||r.status,r.statusText,"text"!==(r.responseType||"text")||"string"!=typeof r.responseText?{binary:r.response}:{text:r.responseText},r.getAllResponseHeaders()))}},r.onload=o(),a=r.onerror=r.ontimeout=o("error"),void 0!==r.onabort?r.onabort=a:r.onreadystatechange=function(){4===r.readyState&&C.setTimeout(function(){o&&a()})},o=o("abort");try{r.send(i.hasContent&&i.data||null)}catch(e){if(o)throw e}},abort:function(){o&&o()}}}),k.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),k.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return k.globalEval(e),e}}}),k.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),k.ajaxTransport("script",function(n){var r,i;if(n.crossDomain||n.scriptAttrs)return{send:function(e,t){r=k("<script>").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="<form></form><form></form>",2===Vt.childNodes.length),k.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1<s&&(r=mt(e.slice(s)),e=e.slice(0,s)),m(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),0<a.length&&k.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?k("<div>").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,k.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===k.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.fn[t]=function(e){return _(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return _(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){k.fn[n]=function(e,t){return 0<arguments.length?this.on(n,null,e,t):this.trigger(n)}}),k.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),k.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)}}),k.proxy=function(e,t){var n,r,i;if("string"==typeof t&&(n=e[t],t=e,e=n),m(e))return r=s.call(arguments,2),(i=function(){return e.apply(t||this,r.concat(s.call(arguments)))}).guid=e.guid=e.guid||k.guid++,i},k.holdReady=function(e){e?k.readyWait++:k.ready(!0)},k.isArray=Array.isArray,k.parseJSON=JSON.parse,k.nodeName=N,k.isFunction=m,k.isWindow=x,k.camelCase=V,k.type=w,k.now=Date.now,k.isNumeric=function(e){var t=k.type(e);return("number"===t||"string"===t)&&!isNaN(e-parseFloat(e))},"function"==typeof define&&define.amd&&define("jquery",[],function(){return k});var Qt=C.jQuery,Jt=C.$;return k.noConflict=function(e){return C.$===k&&(C.$=Jt),e&&C.jQuery===k&&(C.jQuery=Qt),k},e||(C.jQuery=C.$=k),k});
diff --git a/htdocs/Libs/JQuery/jquery-3.5.1.min.js b/htdocs/Libs/JQuery/jquery-3.5.1.min.js
new file mode 100644
index 0000000..b061403
--- /dev/null
+++ b/htdocs/Libs/JQuery/jquery-3.5.1.min.js
@@ -0,0 +1,2 @@
+/*! jQuery v3.5.1 | (c) JS Foundation and other contributors | jquery.org/license */
+!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.5.1",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0<t&&t-1 in e)}S.fn=S.prototype={jquery:f,constructor:S,length:0,toArray:function(){return s.call(this)},get:function(e){return null==e?s.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=S.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return S.each(this,e)},map:function(n){return this.pushStack(S.map(this,function(e,t){return n.call(e,t,e)}))},slice:function(){return this.pushStack(s.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(S.grep(this,function(e,t){return(t+1)%2}))},odd:function(){return this.pushStack(S.grep(this,function(e,t){return t%2}))},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(0<=n&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:u,sort:t.sort,splice:t.splice},S.extend=S.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||m(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)r=e[t],"__proto__"!==t&&a!==r&&(l&&r&&(S.isPlainObject(r)||(i=Array.isArray(r)))?(n=a[t],o=i&&!Array.isArray(n)?[]:i||S.isPlainObject(n)?n:{},i=!1,a[t]=S.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},S.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||"[object Object]"!==o.call(e))&&(!(t=r(e))||"function"==typeof(n=v.call(t,"constructor")&&t.constructor)&&a.call(n)===l)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e,t,n){b(e,{nonce:t&&t.nonce},n)},each:function(e,t){var n,r=0;if(p(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},makeArray:function(e,t){var n=t||[];return null!=e&&(p(Object(e))?S.merge(n,"string"==typeof e?[e]:e):u.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:i.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r=[],i=0,o=e.length,a=!n;i<o;i++)!t(e[i],i)!==a&&r.push(e[i]);return r},map:function(e,t,n){var r,i,o=0,a=[];if(p(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&a.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&a.push(i);return g(a)},guid:1,support:y}),"function"==typeof Symbol&&(S.fn[Symbol.iterator]=t[Symbol.iterator]),S.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){n["[object "+t+"]"]=t.toLowerCase()});var d=function(n){var e,d,b,o,i,h,f,g,w,u,l,T,C,a,E,v,s,c,y,S="sizzle"+1*new Date,p=n.document,k=0,r=0,m=ue(),x=ue(),A=ue(),N=ue(),D=function(e,t){return e===t&&(l=!0),0},j={}.hasOwnProperty,t=[],q=t.pop,L=t.push,H=t.push,O=t.slice,P=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},R="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",I="(?:\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",W="\\["+M+"*("+I+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+I+"))|)"+M+"*\\]",F=":("+I+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+W+")*)|.*)\\)|)",B=new RegExp(M+"+","g"),$=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),_=new RegExp("^"+M+"*,"+M+"*"),z=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="<a id='"+S+"'></a><select id='"+S+"-\r\\' msallowcapture=''><option selected=''></option></select>",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0<se(t,C,null,[e]).length},se.contains=function(e,t){return(e.ownerDocument||e)!=C&&T(e),y(e,t)},se.attr=function(e,t){(e.ownerDocument||e)!=C&&T(e);var n=b.attrHandle[t.toLowerCase()],r=n&&j.call(b.attrHandle,t.toLowerCase())?n(e,t,!E):void 0;return void 0!==r?r:d.attributes||!E?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},se.escape=function(e){return(e+"").replace(re,ie)},se.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},se.uniqueSort=function(e){var t,n=[],r=0,i=0;if(l=!d.detectDuplicates,u=!d.sortStable&&e.slice(0),e.sort(D),l){while(t=e[i++])t===e[i]&&(r=n.push(i));while(r--)e.splice(n[r],1)}return u=null,e},o=se.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else while(t=e[r++])n+=o(t);return n},(b=se.selectors={cacheLength:50,createPseudo:le,match:G,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1<t.indexOf(i):"$="===r?i&&t.slice(-i.length)===i:"~="===r?-1<(" "+t.replace(B," ")+" ").indexOf(i):"|="===r&&(t===i||t.slice(0,i.length+1)===i+"-"))}},CHILD:function(h,e,t,g,v){var y="nth"!==h.slice(0,3),m="last"!==h.slice(-4),x="of-type"===e;return 1===g&&0===v?function(e){return!!e.parentNode}:function(e,t,n){var r,i,o,a,s,u,l=y!==m?"nextSibling":"previousSibling",c=e.parentNode,f=x&&e.nodeName.toLowerCase(),p=!n&&!x,d=!1;if(c){if(y){while(l){a=e;while(a=a[l])if(x?a.nodeName.toLowerCase()===f:1===a.nodeType)return!1;u=l="only"===h&&!u&&"nextSibling"}return!0}if(u=[m?c.firstChild:c.lastChild],m&&p){d=(s=(r=(i=(o=(a=c)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1])&&r[2],a=s&&c.childNodes[s];while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if(1===a.nodeType&&++d&&a===e){i[h]=[k,s,d];break}}else if(p&&(d=s=(r=(i=(o=(a=e)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1]),!1===d)while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if((x?a.nodeName.toLowerCase()===f:1===a.nodeType)&&++d&&(p&&((i=(o=a[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]=[k,d]),a===e))break;return(d-=v)===g||d%g==0&&0<=d/g}}},PSEUDO:function(e,o){var t,a=b.pseudos[e]||b.setFilters[e.toLowerCase()]||se.error("unsupported pseudo: "+e);return a[S]?a(o):1<a.length?(t=[e,e,"",o],b.setFilters.hasOwnProperty(e.toLowerCase())?le(function(e,t){var n,r=a(e,o),i=r.length;while(i--)e[n=P(e,r[i])]=!(t[n]=r[i])}):function(e){return a(e,0,t)}):a}},pseudos:{not:le(function(e){var r=[],i=[],s=f(e.replace($,"$1"));return s[S]?le(function(e,t,n,r){var i,o=s(e,null,r,[]),a=e.length;while(a--)(i=o[a])&&(e[a]=!(t[a]=i))}):function(e,t,n){return r[0]=e,s(r,null,n,i),r[0]=null,!i.pop()}}),has:le(function(t){return function(e){return 0<se(t,e).length}}),contains:le(function(t){return t=t.replace(te,ne),function(e){return-1<(e.textContent||o(e)).indexOf(t)}}),lang:le(function(n){return V.test(n||"")||se.error("unsupported lang: "+n),n=n.replace(te,ne).toLowerCase(),function(e){var t;do{if(t=E?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(t=t.toLowerCase())===n||0===t.indexOf(n+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var t=n.location&&n.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===a},focus:function(e){return e===C.activeElement&&(!C.hasFocus||C.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:ge(!1),disabled:ge(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!b.pseudos.empty(e)},header:function(e){return J.test(e.nodeName)},input:function(e){return Q.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:ve(function(){return[0]}),last:ve(function(e,t){return[t-1]}),eq:ve(function(e,t,n){return[n<0?n+t:n]}),even:ve(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:ve(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:ve(function(e,t,n){for(var r=n<0?n+t:t<n?t:n;0<=--r;)e.push(r);return e}),gt:ve(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=b.pseudos.eq,{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})b.pseudos[e]=de(e);for(e in{submit:!0,reset:!0})b.pseudos[e]=he(e);function me(){}function xe(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function be(s,e,t){var u=e.dir,l=e.next,c=l||u,f=t&&"parentNode"===c,p=r++;return e.first?function(e,t,n){while(e=e[u])if(1===e.nodeType||f)return s(e,t,n);return!1}:function(e,t,n){var r,i,o,a=[k,p];if(n){while(e=e[u])if((1===e.nodeType||f)&&s(e,t,n))return!0}else while(e=e[u])if(1===e.nodeType||f)if(i=(o=e[S]||(e[S]={}))[e.uniqueID]||(o[e.uniqueID]={}),l&&l===e.nodeName.toLowerCase())e=e[u]||e;else{if((r=i[c])&&r[0]===k&&r[1]===p)return a[2]=r[2];if((i[c]=a)[2]=s(e,t,n))return!0}return!1}}function we(i){return 1<i.length?function(e,t,n){var r=i.length;while(r--)if(!i[r](e,t,n))return!1;return!0}:i[0]}function Te(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function Ce(d,h,g,v,y,e){return v&&!v[S]&&(v=Ce(v)),y&&!y[S]&&(y=Ce(y,e)),le(function(e,t,n,r){var i,o,a,s=[],u=[],l=t.length,c=e||function(e,t,n){for(var r=0,i=t.length;r<i;r++)se(e,t[r],n);return n}(h||"*",n.nodeType?[n]:n,[]),f=!d||!e&&h?c:Te(c,s,d,n,r),p=g?y||(e?d:l||v)?[]:t:f;if(g&&g(f,p,n,r),v){i=Te(p,u),v(i,[],n,r),o=i.length;while(o--)(a=i[o])&&(p[u[o]]=!(f[u[o]]=a))}if(e){if(y||d){if(y){i=[],o=p.length;while(o--)(a=p[o])&&i.push(f[o]=a);y(null,p=[],i,r)}o=p.length;while(o--)(a=p[o])&&-1<(i=y?P(e,a):s[o])&&(e[i]=!(t[i]=a))}}else p=Te(p===t?p.splice(l,p.length):p),y?y(null,t,p,r):H.apply(t,p)})}function Ee(e){for(var i,t,n,r=e.length,o=b.relative[e[0].type],a=o||b.relative[" "],s=o?1:0,u=be(function(e){return e===i},a,!0),l=be(function(e){return-1<P(i,e)},a,!0),c=[function(e,t,n){var r=!o&&(n||t!==w)||((i=t).nodeType?u(e,t,n):l(e,t,n));return i=null,r}];s<r;s++)if(t=b.relative[e[s].type])c=[be(we(c),t)];else{if((t=b.filter[e[s].type].apply(null,e[s].matches))[S]){for(n=++s;n<r;n++)if(b.relative[e[n].type])break;return Ce(1<s&&we(c),1<s&&xe(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace($,"$1"),t,s<n&&Ee(e.slice(s,n)),n<r&&Ee(e=e.slice(n)),n<r&&xe(e))}c.push(t)}return we(c)}return me.prototype=b.filters=b.pseudos,b.setFilters=new me,h=se.tokenize=function(e,t){var n,r,i,o,a,s,u,l=x[e+" "];if(l)return t?0:l.slice(0);a=e,s=[],u=b.preFilter;while(a){for(o in n&&!(r=_.exec(a))||(r&&(a=a.slice(r[0].length)||a),s.push(i=[])),n=!1,(r=z.exec(a))&&(n=r.shift(),i.push({value:n,type:r[0].replace($," ")}),a=a.slice(n.length)),b.filter)!(r=G[o].exec(a))||u[o]&&!(r=u[o](r))||(n=r.shift(),i.push({value:n,type:o,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?se.error(e):x(e,s).slice(0)},f=se.compile=function(e,t){var n,v,y,m,x,r,i=[],o=[],a=A[e+" "];if(!a){t||(t=h(e)),n=t.length;while(n--)(a=Ee(t[n]))[S]?i.push(a):o.push(a);(a=A(e,(v=o,m=0<(y=i).length,x=0<v.length,r=function(e,t,n,r,i){var o,a,s,u=0,l="0",c=e&&[],f=[],p=w,d=e||x&&b.find.TAG("*",i),h=k+=null==p?1:Math.random()||.1,g=d.length;for(i&&(w=t==C||t||i);l!==g&&null!=(o=d[l]);l++){if(x&&o){a=0,t||o.ownerDocument==C||(T(o),n=!E);while(s=v[a++])if(s(o,t||C,n)){r.push(o);break}i&&(k=h)}m&&((o=!s&&o)&&u--,e&&c.push(o))}if(u+=l,m&&l!==u){a=0;while(s=y[a++])s(c,f,t,n);if(e){if(0<u)while(l--)c[l]||f[l]||(f[l]=q.call(r));f=Te(f)}H.apply(r,f),i&&!e&&0<f.length&&1<u+y.length&&se.uniqueSort(r)}return i&&(k=h,w=p),c},m?le(r):r))).selector=e}return a},g=se.select=function(e,t,n,r){var i,o,a,s,u,l="function"==typeof e&&e,c=!r&&h(e=l.selector||e);if(n=n||[],1===c.length){if(2<(o=c[0]=c[0].slice(0)).length&&"ID"===(a=o[0]).type&&9===t.nodeType&&E&&b.relative[o[1].type]){if(!(t=(b.find.ID(a.matches[0].replace(te,ne),t)||[])[0]))return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}i=G.needsContext.test(e)?0:o.length;while(i--){if(a=o[i],b.relative[s=a.type])break;if((u=b.find[s])&&(r=u(a.matches[0].replace(te,ne),ee.test(o[0].type)&&ye(t.parentNode)||t))){if(o.splice(i,1),!(e=r.length&&xe(o)))return H.apply(n,r),n;break}}}return(l||f(e,c))(r,t,!E,n,!t||ee.test(e)&&ye(t.parentNode)||t),n},d.sortStable=S.split("").sort(D).join("")===S,d.detectDuplicates=!!l,T(),d.sortDetached=ce(function(e){return 1&e.compareDocumentPosition(C.createElement("fieldset"))}),ce(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||fe("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),d.attributes&&ce(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||fe("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ce(function(e){return null==e.getAttribute("disabled")})||fe(R,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),se}(C);S.find=d,S.expr=d.selectors,S.expr[":"]=S.expr.pseudos,S.uniqueSort=S.unique=d.uniqueSort,S.text=d.getText,S.isXMLDoc=d.isXML,S.contains=d.contains,S.escapeSelector=d.escape;var h=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&S(e).is(n))break;r.push(e)}return r},T=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},k=S.expr.match.needsContext;function A(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var N=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function D(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1<i.call(n,e)!==r}):S.filter(n,e,r)}S.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?S.find.matchesSelector(r,e)?[r]:[]:S.find.matches(e,S.grep(t,function(e){return 1===e.nodeType}))},S.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(S(e).filter(function(){for(t=0;t<r;t++)if(S.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)S.find(e,i[t],n);return 1<r?S.uniqueSort(n):n},filter:function(e){return this.pushStack(D(this,e||[],!1))},not:function(e){return this.pushStack(D(this,e||[],!0))},is:function(e){return!!D(this,"string"==typeof e&&k.test(e)?S(e):e||[],!1).length}});var j,q=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||j,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,j=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(S.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a="string"!=typeof e&&S(e);if(!k.test(e))for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?-1<a.index(n):1===n.nodeType&&S.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(1<o.length?S.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?i.call(S(e),this[0]):i.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(S.uniqueSort(S.merge(this.get(),S(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),S.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return h(e,"parentNode")},parentsUntil:function(e,t,n){return h(e,"parentNode",n)},next:function(e){return O(e,"nextSibling")},prev:function(e){return O(e,"previousSibling")},nextAll:function(e){return h(e,"nextSibling")},prevAll:function(e){return h(e,"previousSibling")},nextUntil:function(e,t,n){return h(e,"nextSibling",n)},prevUntil:function(e,t,n){return h(e,"previousSibling",n)},siblings:function(e){return T((e.parentNode||{}).firstChild,e)},children:function(e){return T(e.firstChild)},contents:function(e){return null!=e.contentDocument&&r(e.contentDocument)?e.contentDocument:(A(e,"template")&&(e=e.content||e),S.merge([],e.childNodes))}},function(r,i){S.fn[r]=function(e,t){var n=S.map(this,i,e);return"Until"!==r.slice(-5)&&(t=e),t&&"string"==typeof t&&(n=S.filter(t,n)),1<this.length&&(H[r]||S.uniqueSort(n),L.test(r)&&n.reverse()),this.pushStack(n)}});var P=/[^\x20\t\r\n\f]+/g;function R(e){return e}function M(e){throw e}function I(e,t,n,r){var i;try{e&&m(i=e.promise)?i.call(e).done(t).fail(n):e&&m(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}S.Callbacks=function(r){var e,n;r="string"==typeof r?(e=r,n={},S.each(e.match(P)||[],function(e,t){n[t]=!0}),n):S.extend({},r);var i,t,o,a,s=[],u=[],l=-1,c=function(){for(a=a||r.once,o=i=!0;u.length;l=-1){t=u.shift();while(++l<s.length)!1===s[l].apply(t[0],t[1])&&r.stopOnFalse&&(l=s.length,t=!1)}r.memory||(t=!1),i=!1,a&&(s=t?[]:"")},f={add:function(){return s&&(t&&!i&&(l=s.length-1,u.push(t)),function n(e){S.each(e,function(e,t){m(t)?r.unique&&f.has(t)||s.push(t):t&&t.length&&"string"!==w(t)&&n(t)})}(arguments),t&&!i&&c()),this},remove:function(){return S.each(arguments,function(e,t){var n;while(-1<(n=S.inArray(t,s,n)))s.splice(n,1),n<=l&&l--}),this},has:function(e){return e?-1<S.inArray(e,s):0<s.length},empty:function(){return s&&(s=[]),this},disable:function(){return a=u=[],s=t="",this},disabled:function(){return!s},lock:function(){return a=u=[],t||i||(s=t=""),this},locked:function(){return!!a},fireWith:function(e,t){return a||(t=[e,(t=t||[]).slice?t.slice():t],u.push(t),i||c()),this},fire:function(){return f.fireWith(this,arguments),this},fired:function(){return!!o}};return f},S.extend({Deferred:function(e){var o=[["notify","progress",S.Callbacks("memory"),S.Callbacks("memory"),2],["resolve","done",S.Callbacks("once memory"),S.Callbacks("once memory"),0,"resolved"],["reject","fail",S.Callbacks("once memory"),S.Callbacks("once memory"),1,"rejected"]],i="pending",a={state:function(){return i},always:function(){return s.done(arguments).fail(arguments),this},"catch":function(e){return a.then(null,e)},pipe:function(){var i=arguments;return S.Deferred(function(r){S.each(o,function(e,t){var n=m(i[t[4]])&&i[t[4]];s[t[1]](function(){var e=n&&n.apply(this,arguments);e&&m(e.promise)?e.promise().progress(r.notify).done(r.resolve).fail(r.reject):r[t[0]+"With"](this,n?[e]:arguments)})}),i=null}).promise()},then:function(t,n,r){var u=0;function l(i,o,a,s){return function(){var n=this,r=arguments,e=function(){var e,t;if(!(i<u)){if((e=a.apply(n,r))===o.promise())throw new TypeError("Thenable self-resolution");t=e&&("object"==typeof e||"function"==typeof e)&&e.then,m(t)?s?t.call(e,l(u,o,R,s),l(u,o,M,s)):(u++,t.call(e,l(u,o,R,s),l(u,o,M,s),l(u,o,R,o.notifyWith))):(a!==R&&(n=void 0,r=[e]),(s||o.resolveWith)(n,r))}},t=s?e:function(){try{e()}catch(e){S.Deferred.exceptionHook&&S.Deferred.exceptionHook(e,t.stackTrace),u<=i+1&&(a!==M&&(n=void 0,r=[e]),o.rejectWith(n,r))}};i?t():(S.Deferred.getStackHook&&(t.stackTrace=S.Deferred.getStackHook()),C.setTimeout(t))}}return S.Deferred(function(e){o[0][3].add(l(0,e,m(r)?r:R,e.notifyWith)),o[1][3].add(l(0,e,m(t)?t:R)),o[2][3].add(l(0,e,m(n)?n:M))}).promise()},promise:function(e){return null!=e?S.extend(e,a):a}},s={};return S.each(o,function(e,t){var n=t[2],r=t[5];a[t[1]]=n.add,r&&n.add(function(){i=r},o[3-e][2].disable,o[3-e][3].disable,o[0][2].lock,o[0][3].lock),n.add(t[3].fire),s[t[0]]=function(){return s[t[0]+"With"](this===s?void 0:this,arguments),this},s[t[0]+"With"]=n.fireWith}),a.promise(s),e&&e.call(s,s),s},when:function(e){var n=arguments.length,t=n,r=Array(t),i=s.call(arguments),o=S.Deferred(),a=function(t){return function(e){r[t]=this,i[t]=1<arguments.length?s.call(arguments):e,--n||o.resolveWith(r,i)}};if(n<=1&&(I(e,o.done(a(t)).resolve,o.reject,!n),"pending"===o.state()||m(i[t]&&i[t].then)))return o.then();while(t--)I(i[t],a(t),o.reject);return o.promise()}});var W=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;S.Deferred.exceptionHook=function(e,t){C.console&&C.console.warn&&e&&W.test(e.name)&&C.console.warn("jQuery.Deferred exception: "+e.message,e.stack,t)},S.readyException=function(e){C.setTimeout(function(){throw e})};var F=S.Deferred();function B(){E.removeEventListener("DOMContentLoaded",B),C.removeEventListener("load",B),S.ready()}S.fn.ready=function(e){return F.then(e)["catch"](function(e){S.readyException(e)}),this},S.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--S.readyWait:S.isReady)||(S.isReady=!0)!==e&&0<--S.readyWait||F.resolveWith(E,[S])}}),S.ready.then=F.then,"complete"===E.readyState||"loading"!==E.readyState&&!E.documentElement.doScroll?C.setTimeout(S.ready):(E.addEventListener("DOMContentLoaded",B),C.addEventListener("load",B));var $=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===w(n))for(s in i=!0,n)$(e,t,s,n[s],!0,o,a);else if(void 0!==r&&(i=!0,m(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(S(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},_=/^-ms-/,z=/-([a-z])/g;function U(e,t){return t.toUpperCase()}function X(e){return e.replace(_,"ms-").replace(z,U)}var V=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function G(){this.expando=S.expando+G.uid++}G.uid=1,G.prototype={cache:function(e){var t=e[this.expando];return t||(t={},V(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if("string"==typeof t)i[X(t)]=n;else for(r in t)i[X(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][X(t)]},access:function(e,t,n){return void 0===t||t&&"string"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){n=(t=Array.isArray(t)?t.map(X):(t=X(t))in r?[t]:t.match(P)||[]).length;while(n--)delete r[t[n]]}(void 0===t||S.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!S.isEmptyObject(t)}};var Y=new G,Q=new G,J=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,K=/[A-Z]/g;function Z(e,t,n){var r,i;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(K,"-$&").toLowerCase(),"string"==typeof(n=e.getAttribute(r))){try{n="true"===(i=n)||"false"!==i&&("null"===i?null:i===+i+""?+i:J.test(i)?JSON.parse(i):i)}catch(e){}Q.set(e,t,n)}else n=void 0;return n}S.extend({hasData:function(e){return Q.hasData(e)||Y.hasData(e)},data:function(e,t,n){return Q.access(e,t,n)},removeData:function(e,t){Q.remove(e,t)},_data:function(e,t,n){return Y.access(e,t,n)},_removeData:function(e,t){Y.remove(e,t)}}),S.fn.extend({data:function(n,e){var t,r,i,o=this[0],a=o&&o.attributes;if(void 0===n){if(this.length&&(i=Q.get(o),1===o.nodeType&&!Y.get(o,"hasDataAttrs"))){t=a.length;while(t--)a[t]&&0===(r=a[t].name).indexOf("data-")&&(r=X(r.slice(5)),Z(o,r,i[r]));Y.set(o,"hasDataAttrs",!0)}return i}return"object"==typeof n?this.each(function(){Q.set(this,n)}):$(this,function(e){var t;if(o&&void 0===e)return void 0!==(t=Q.get(o,n))?t:void 0!==(t=Z(o,n))?t:void 0;this.each(function(){Q.set(this,n,e)})},null,e,1<arguments.length,null,!0)},removeData:function(e){return this.each(function(){Q.remove(this,e)})}}),S.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=Y.get(e,t),n&&(!r||Array.isArray(n)?r=Y.access(e,t,S.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=S.queue(e,t),r=n.length,i=n.shift(),o=S._queueHooks(e,t);"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,function(){S.dequeue(e,t)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return Y.get(e,n)||Y.access(e,n,{empty:S.Callbacks("once memory").add(function(){Y.remove(e,[t+"queue",n])})})}}),S.fn.extend({queue:function(t,n){var e=2;return"string"!=typeof t&&(n=t,t="fx",e--),arguments.length<e?S.queue(this[0],t):void 0===n?this:this.each(function(){var e=S.queue(this,t,n);S._queueHooks(this,t),"fx"===t&&"inprogress"!==e[0]&&S.dequeue(this,t)})},dequeue:function(e){return this.each(function(){S.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=S.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=void 0),e=e||"fx";while(a--)(n=Y.get(o[a],e+"queueHooks"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var ee=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,te=new RegExp("^(?:([+-])=|)("+ee+")([a-z%]*)$","i"),ne=["Top","Right","Bottom","Left"],re=E.documentElement,ie=function(e){return S.contains(e.ownerDocument,e)},oe={composed:!0};re.getRootNode&&(ie=function(e){return S.contains(e.ownerDocument,e)||e.getRootNode(oe)===e.ownerDocument});var ae=function(e,t){return"none"===(e=t||e).style.display||""===e.style.display&&ie(e)&&"none"===S.css(e,"display")};function se(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return S.css(e,t,"")},u=s(),l=n&&n[3]||(S.cssNumber[t]?"":"px"),c=e.nodeType&&(S.cssNumber[t]||"px"!==l&&+u)&&te.exec(S.css(e,t));if(c&&c[3]!==l){u/=2,l=l||c[3],c=+u||1;while(a--)S.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;c*=2,S.style(e,t,c+l),n=n||[]}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}var ue={};function le(e,t){for(var n,r,i,o,a,s,u,l=[],c=0,f=e.length;c<f;c++)(r=e[c]).style&&(n=r.style.display,t?("none"===n&&(l[c]=Y.get(r,"display")||null,l[c]||(r.style.display="")),""===r.style.display&&ae(r)&&(l[c]=(u=a=o=void 0,a=(i=r).ownerDocument,s=i.nodeName,(u=ue[s])||(o=a.body.appendChild(a.createElement(s)),u=S.css(o,"display"),o.parentNode.removeChild(o),"none"===u&&(u="block"),ue[s]=u)))):"none"!==n&&(l[c]="none",Y.set(r,"display",n)));for(c=0;c<f;c++)null!=l[c]&&(e[c].style.display=l[c]);return e}S.fn.extend({show:function(){return le(this,!0)},hide:function(){return le(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){ae(this)?S(this).show():S(this).hide()})}});var ce,fe,pe=/^(?:checkbox|radio)$/i,de=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="<textarea>x</textarea>",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="<option></option>",y.option=!!ce.lastChild;var ge={thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n<r;n++)Y.set(e[n],"globalEval",!t||Y.get(t[n],"globalEval"))}ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td,y.option||(ge.optgroup=ge.option=[1,"<select multiple='multiple'>","</select>"]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d<h;d++)if((o=e[d])||0===o)if("object"===w(o))S.merge(p,o.nodeType?[o]:o);else if(me.test(o)){a=a||f.appendChild(t.createElement("div")),s=(de.exec(o)||["",""])[1].toLowerCase(),u=ge[s]||ge._default,a.innerHTML=u[1]+S.htmlPrefilter(o)+u[2],c=u[0];while(c--)a=a.lastChild;S.merge(p,a.childNodes),(a=f.firstChild).textContent=""}else p.push(t.createTextNode(o));f.textContent="",d=0;while(o=p[d++])if(r&&-1<S.inArray(o,r))i&&i.push(o);else if(l=ie(o),a=ve(f.appendChild(o),"script"),l&&ye(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}var be=/^key/,we=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Te=/^([^.]*)(?:\.(.+)|)/;function Ce(){return!0}function Ee(){return!1}function Se(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function ke(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)ke(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Ee;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return S().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=S.guid++)),e.each(function(){S.event.add(this,t,i,r,n)})}function Ae(e,i,o){o?(Y.set(e,i,!1),S.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Y.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(S.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Y.set(this,i,r),t=o(this,i),this[i](),r!==(n=Y.get(this,i))||t?Y.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Y.set(this,i,{value:S.event.trigger(S.extend(r[0],S.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Y.get(e,i)&&S.event.add(e,i,Ce)}S.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.get(t);if(V(t)){n.handler&&(n=(o=n).handler,i=o.selector),i&&S.find.matchesSelector(re,i),n.guid||(n.guid=S.guid++),(u=v.events)||(u=v.events=Object.create(null)),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof S&&S.event.triggered!==e.type?S.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(P)||[""]).length;while(l--)d=g=(s=Te.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=S.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=S.event.special[d]||{},c=S.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&S.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),S.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.hasData(e)&&Y.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(P)||[""]).length;while(l--)if(d=g=(s=Te.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=S.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||S.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)S.event.remove(e,d+t[l],n,r,!0);S.isEmptyObject(u)&&Y.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=new Array(arguments.length),u=S.event.fix(e),l=(Y.get(this,"events")||Object.create(null))[u.type]||[],c=S.event.special[u.type]||{};for(s[0]=u,t=1;t<arguments.length;t++)s[t]=arguments[t];if(u.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,u)){a=S.event.handlers.call(this,u,l),t=0;while((i=a[t++])&&!u.isPropagationStopped()){u.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!u.isImmediatePropagationStopped())u.rnamespace&&!1!==o.namespace&&!u.rnamespace.test(o.namespace)||(u.handleObj=o,u.data=o.data,void 0!==(r=((S.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,s))&&!1===(u.result=r)&&(u.preventDefault(),u.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,u),u.result}},handlers:function(e,t){var n,r,i,o,a,s=[],u=t.delegateCount,l=e.target;if(u&&l.nodeType&&!("click"===e.type&&1<=e.button))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n<u;n++)void 0===a[i=(r=t[n]).selector+" "]&&(a[i]=r.needsContext?-1<S(i,this).index(l):S.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(t,e){Object.defineProperty(S.Event.prototype,t,{enumerable:!0,configurable:!0,get:m(e)?function(){if(this.originalEvent)return e(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[t]},set:function(e){Object.defineProperty(this,t,{enumerable:!0,configurable:!0,writable:!0,value:e})}})},fix:function(e){return e[S.expando]?e:new S.Event(e)},special:{load:{noBubble:!0},click:{setup:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Ae(t,"click",Ce),!1},trigger:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Ae(t,"click"),!0},_default:function(e){var t=e.target;return pe.test(t.type)&&t.click&&A(t,"input")&&Y.get(t,"click")||A(t,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},S.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},S.Event=function(e,t){if(!(this instanceof S.Event))return new S.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?Ce:Ee,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&S.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[S.expando]=!0},S.Event.prototype={constructor:S.Event,isDefaultPrevented:Ee,isPropagationStopped:Ee,isImmediatePropagationStopped:Ee,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=Ce,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=Ce,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=Ce,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},S.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,code:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:function(e){var t=e.button;return null==e.which&&be.test(e.type)?null!=e.charCode?e.charCode:e.keyCode:!e.which&&void 0!==t&&we.test(e.type)?1&t?1:2&t?3:4&t?2:0:e.which}},S.event.addProp),S.each({focus:"focusin",blur:"focusout"},function(e,t){S.event.special[e]={setup:function(){return Ae(this,e,Se),!1},trigger:function(){return Ae(this,e),!0},delegateType:t}}),S.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,i){S.event.special[e]={delegateType:i,bindType:i,handle:function(e){var t,n=e.relatedTarget,r=e.handleObj;return n&&(n===this||S.contains(this,n))||(e.type=r.origType,t=r.handler.apply(this,arguments),e.type=i),t}}}),S.fn.extend({on:function(e,t,n,r){return ke(this,e,t,n,r)},one:function(e,t,n,r){return ke(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,S(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return!1!==t&&"function"!=typeof t||(n=t,t=void 0),!1===n&&(n=Ee),this.each(function(){S.event.remove(this,e,n,t)})}});var Ne=/<script|<style|<link/i,De=/checked\s*(?:[^=]|=\s*.checked.)/i,je=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function qe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function Le(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function He(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Oe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n<r;n++)S.event.add(t,i,s[i][n]);Q.hasData(e)&&(o=Q.access(e),a=S.extend({},o),Q.set(t,a))}}function Pe(n,r,i,o){r=g(r);var e,t,a,s,u,l,c=0,f=n.length,p=f-1,d=r[0],h=m(d);if(h||1<f&&"string"==typeof d&&!y.checkClone&&De.test(d))return n.each(function(e){var t=n.eq(e);h&&(r[0]=d.call(this,e,t.html())),Pe(t,r,i,o)});if(f&&(t=(e=xe(r,n[0].ownerDocument,!1,n,o)).firstChild,1===e.childNodes.length&&(e=t),t||o)){for(s=(a=S.map(ve(e,"script"),Le)).length;c<f;c++)u=e,c!==p&&(u=S.clone(u,!0,!0),s&&S.merge(a,ve(u,"script"))),i.call(n[c],u,c);if(s)for(l=a[a.length-1].ownerDocument,S.map(a,He),c=0;c<s;c++)u=a[c],he.test(u.type||"")&&!Y.access(u,"globalEval")&&S.contains(l,u)&&(u.src&&"module"!==(u.type||"").toLowerCase()?S._evalUrl&&!u.noModule&&S._evalUrl(u.src,{nonce:u.nonce||u.getAttribute("nonce")},l):b(u.textContent.replace(je,""),u,l))}return n}function Re(e,t,n){for(var r,i=t?S.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||S.cleanData(ve(r)),r.parentNode&&(n&&ie(r)&&ye(ve(r,"script")),r.parentNode.removeChild(r));return e}S.extend({htmlPrefilter:function(e){return e},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=ie(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||S.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r<i;r++)s=o[r],u=a[r],void 0,"input"===(l=u.nodeName.toLowerCase())&&pe.test(s.type)?u.checked=s.checked:"input"!==l&&"textarea"!==l||(u.defaultValue=s.defaultValue);if(t)if(n)for(o=o||ve(e),a=a||ve(c),r=0,i=o.length;r<i;r++)Oe(o[r],a[r]);else Oe(e,c);return 0<(a=ve(c,"script")).length&&ye(a,!f&&ve(e,"script")),c},cleanData:function(e){for(var t,n,r,i=S.event.special,o=0;void 0!==(n=e[o]);o++)if(V(n)){if(t=n[Y.expando]){if(t.events)for(r in t.events)i[r]?S.event.remove(n,r):S.removeEvent(n,r,t.handle);n[Y.expando]=void 0}n[Q.expando]&&(n[Q.expando]=void 0)}}}),S.fn.extend({detach:function(e){return Re(this,e,!0)},remove:function(e){return Re(this,e)},text:function(e){return $(this,function(e){return void 0===e?S.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return Pe(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||qe(this,e).appendChild(e)})},prepend:function(){return Pe(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=qe(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return Pe(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return Pe(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(S.cleanData(ve(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return S.clone(this,e,t)})},html:function(e){return $(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!Ne.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=S.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(S.cleanData(ve(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var n=[];return Pe(this,arguments,function(e){var t=this.parentNode;S.inArray(this,n)<0&&(S.cleanData(ve(this)),t&&t.replaceChild(e,this))},n)}}),S.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,a){S.fn[e]=function(e){for(var t,n=[],r=S(e),i=r.length-1,o=0;o<=i;o++)t=o===i?this:this.clone(!0),S(r[o])[a](t),u.apply(n,t.get());return this.pushStack(n)}});var Me=new RegExp("^("+ee+")(?!px)[a-z%]+$","i"),Ie=function(e){var t=e.ownerDocument.defaultView;return t&&t.opener||(t=C),t.getComputedStyle(e)},We=function(e,t,n){var r,i,o={};for(i in t)o[i]=e.style[i],e.style[i]=t[i];for(i in r=n.call(e),t)e.style[i]=o[i];return r},Fe=new RegExp(ne.join("|"),"i");function Be(e,t,n){var r,i,o,a,s=e.style;return(n=n||Ie(e))&&(""!==(a=n.getPropertyValue(t)||n[t])||ie(e)||(a=S.style(e,t)),!y.pixelBoxStyles()&&Me.test(a)&&Fe.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o)),void 0!==a?a+"":a}function $e(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}!function(){function e(){if(l){u.style.cssText="position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0",l.style.cssText="position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%",re.appendChild(u).appendChild(l);var e=C.getComputedStyle(l);n="1%"!==e.top,s=12===t(e.marginLeft),l.style.right="60%",o=36===t(e.right),r=36===t(e.width),l.style.position="absolute",i=12===t(l.offsetWidth/3),re.removeChild(u),l=null}}function t(e){return Math.round(parseFloat(e))}var n,r,i,o,a,s,u=E.createElement("div"),l=E.createElement("div");l.style&&(l.style.backgroundClip="content-box",l.cloneNode(!0).style.backgroundClip="",y.clearCloneStyle="content-box"===l.style.backgroundClip,S.extend(y,{boxSizingReliable:function(){return e(),r},pixelBoxStyles:function(){return e(),o},pixelPosition:function(){return e(),n},reliableMarginLeft:function(){return e(),s},scrollboxSize:function(){return e(),i},reliableTrDimensions:function(){var e,t,n,r;return null==a&&(e=E.createElement("table"),t=E.createElement("tr"),n=E.createElement("div"),e.style.cssText="position:absolute;left:-11111px",t.style.height="1px",n.style.height="9px",re.appendChild(e).appendChild(t).appendChild(n),r=C.getComputedStyle(t),a=3<parseInt(r.height),re.removeChild(e)),a}}))}();var _e=["Webkit","Moz","ms"],ze=E.createElement("div").style,Ue={};function Xe(e){var t=S.cssProps[e]||Ue[e];return t||(e in ze?e:Ue[e]=function(e){var t=e[0].toUpperCase()+e.slice(1),n=_e.length;while(n--)if((e=_e[n]+t)in ze)return e}(e)||e)}var Ve=/^(none|table(?!-c[ea]).+)/,Ge=/^--/,Ye={position:"absolute",visibility:"hidden",display:"block"},Qe={letterSpacing:"0",fontWeight:"400"};function Je(e,t,n){var r=te.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function Ke(e,t,n,r,i,o){var a="width"===t?1:0,s=0,u=0;if(n===(r?"border":"content"))return 0;for(;a<4;a+=2)"margin"===n&&(u+=S.css(e,n+ne[a],!0,i)),r?("content"===n&&(u-=S.css(e,"padding"+ne[a],!0,i)),"margin"!==n&&(u-=S.css(e,"border"+ne[a]+"Width",!0,i))):(u+=S.css(e,"padding"+ne[a],!0,i),"padding"!==n?u+=S.css(e,"border"+ne[a]+"Width",!0,i):s+=S.css(e,"border"+ne[a]+"Width",!0,i));return!r&&0<=o&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))||0),u}function Ze(e,t,n){var r=Ie(e),i=(!y.boxSizingReliable()||n)&&"border-box"===S.css(e,"boxSizing",!1,r),o=i,a=Be(e,t,r),s="offset"+t[0].toUpperCase()+t.slice(1);if(Me.test(a)){if(!n)return a;a="auto"}return(!y.boxSizingReliable()&&i||!y.reliableTrDimensions()&&A(e,"tr")||"auto"===a||!parseFloat(a)&&"inline"===S.css(e,"display",!1,r))&&e.getClientRects().length&&(i="border-box"===S.css(e,"boxSizing",!1,r),(o=s in e)&&(a=e[s])),(a=parseFloat(a)||0)+Ke(e,t,n||(i?"border":"content"),o,r,a)+"px"}function et(e,t,n,r,i){return new et.prototype.init(e,t,n,r,i)}S.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Be(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=X(t),u=Ge.test(t),l=e.style;if(u||(t=Xe(s)),a=S.cssHooks[t]||S.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"===(o=typeof n)&&(i=te.exec(n))&&i[1]&&(n=se(e,t,i),o="number"),null!=n&&n==n&&("number"!==o||u||(n+=i&&i[3]||(S.cssNumber[s]?"":"px")),y.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=X(t);return Ge.test(t)||(t=Xe(s)),(a=S.cssHooks[t]||S.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=Be(e,t,r)),"normal"===i&&t in Qe&&(i=Qe[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),S.each(["height","width"],function(e,u){S.cssHooks[u]={get:function(e,t,n){if(t)return!Ve.test(S.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?Ze(e,u,n):We(e,Ye,function(){return Ze(e,u,n)})},set:function(e,t,n){var r,i=Ie(e),o=!y.scrollboxSize()&&"absolute"===i.position,a=(o||n)&&"border-box"===S.css(e,"boxSizing",!1,i),s=n?Ke(e,u,n,a,i):0;return a&&o&&(s-=Math.ceil(e["offset"+u[0].toUpperCase()+u.slice(1)]-parseFloat(i[u])-Ke(e,u,"border",!1,i)-.5)),s&&(r=te.exec(t))&&"px"!==(r[3]||"px")&&(e.style[u]=t,t=S.css(e,u)),Je(0,t,s)}}}),S.cssHooks.marginLeft=$e(y.reliableMarginLeft,function(e,t){if(t)return(parseFloat(Be(e,"marginLeft"))||e.getBoundingClientRect().left-We(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),S.each({margin:"",padding:"",border:"Width"},function(i,o){S.cssHooks[i+o]={expand:function(e){for(var t=0,n={},r="string"==typeof e?e.split(" "):[e];t<4;t++)n[i+ne[t]+o]=r[t]||r[t-2]||r[0];return n}},"margin"!==i&&(S.cssHooks[i+o].set=Je)}),S.fn.extend({css:function(e,t){return $(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=Ie(e),i=t.length;a<i;a++)o[t[a]]=S.css(e,t[a],!1,r);return o}return void 0!==n?S.style(e,t,n):S.css(e,t)},e,t,1<arguments.length)}}),((S.Tween=et).prototype={constructor:et,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||S.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(S.cssNumber[n]?"":"px")},cur:function(){var e=et.propHooks[this.prop];return e&&e.get?e.get(this):et.propHooks._default.get(this)},run:function(e){var t,n=et.propHooks[this.prop];return this.options.duration?this.pos=t=S.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):et.propHooks._default.set(this),this}}).init.prototype=et.prototype,(et.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=S.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){S.fx.step[e.prop]?S.fx.step[e.prop](e):1!==e.elem.nodeType||!S.cssHooks[e.prop]&&null==e.elem.style[Xe(e.prop)]?e.elem[e.prop]=e.now:S.style(e.elem,e.prop,e.now+e.unit)}}}).scrollTop=et.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},S.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},S.fx=et.prototype.init,S.fx.step={};var tt,nt,rt,it,ot=/^(?:toggle|show|hide)$/,at=/queueHooks$/;function st(){nt&&(!1===E.hidden&&C.requestAnimationFrame?C.requestAnimationFrame(st):C.setTimeout(st,S.fx.interval),S.fx.tick())}function ut(){return C.setTimeout(function(){tt=void 0}),tt=Date.now()}function lt(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=ne[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function ct(e,t,n){for(var r,i=(ft.tweeners[t]||[]).concat(ft.tweeners["*"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function ft(o,e,t){var n,a,r=0,i=ft.prefilters.length,s=S.Deferred().always(function(){delete u.elem}),u=function(){if(a)return!1;for(var e=tt||ut(),t=Math.max(0,l.startTime+l.duration-e),n=1-(t/l.duration||0),r=0,i=l.tweens.length;r<i;r++)l.tweens[r].run(n);return s.notifyWith(o,[l,n,t]),n<1&&i?t:(i||s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l]),!1)},l=s.promise({elem:o,props:S.extend({},e),opts:S.extend(!0,{specialEasing:{},easing:S.easing._default},t),originalProperties:e,originalOptions:t,startTime:tt||ut(),duration:t.duration,tweens:[],createTween:function(e,t){var n=S.Tween(o,l.opts,e,t,l.opts.specialEasing[e]||l.opts.easing);return l.tweens.push(n),n},stop:function(e){var t=0,n=e?l.tweens.length:0;if(a)return this;for(a=!0;t<n;t++)l.tweens[t].run(1);return e?(s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l,e])):s.rejectWith(o,[l,e]),this}}),c=l.props;for(!function(e,t){var n,r,i,o,a;for(n in e)if(i=t[r=X(n)],o=e[n],Array.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),(a=S.cssHooks[r])&&"expand"in a)for(n in o=a.expand(o),delete e[r],o)n in e||(e[n]=o[n],t[n]=i);else t[r]=i}(c,l.opts.specialEasing);r<i;r++)if(n=ft.prefilters[r].call(l,o,c,l.opts))return m(n.stop)&&(S._queueHooks(l.elem,l.opts.queue).stop=n.stop.bind(n)),n;return S.map(c,ct,l),m(l.opts.start)&&l.opts.start.call(o,l),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always),S.fx.timer(S.extend(u,{elem:o,anim:l,queue:l.opts.queue})),l}S.Animation=S.extend(ft,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return se(n.elem,e,te.exec(t),n),n}]},tweener:function(e,t){m(e)?(t=e,e=["*"]):e=e.match(P);for(var n,r=0,i=e.length;r<i;r++)n=e[r],ft.tweeners[n]=ft.tweeners[n]||[],ft.tweeners[n].unshift(t)},prefilters:[function(e,t,n){var r,i,o,a,s,u,l,c,f="width"in t||"height"in t,p=this,d={},h=e.style,g=e.nodeType&&ae(e),v=Y.get(e,"fxshow");for(r in n.queue||(null==(a=S._queueHooks(e,"fx")).unqueued&&(a.unqueued=0,s=a.empty.fire,a.empty.fire=function(){a.unqueued||s()}),a.unqueued++,p.always(function(){p.always(function(){a.unqueued--,S.queue(e,"fx").length||a.empty.fire()})})),t)if(i=t[r],ot.test(i)){if(delete t[r],o=o||"toggle"===i,i===(g?"hide":"show")){if("show"!==i||!v||void 0===v[r])continue;g=!0}d[r]=v&&v[r]||S.style(e,r)}if((u=!S.isEmptyObject(t))||!S.isEmptyObject(d))for(r in f&&1===e.nodeType&&(n.overflow=[h.overflow,h.overflowX,h.overflowY],null==(l=v&&v.display)&&(l=Y.get(e,"display")),"none"===(c=S.css(e,"display"))&&(l?c=l:(le([e],!0),l=e.style.display||l,c=S.css(e,"display"),le([e]))),("inline"===c||"inline-block"===c&&null!=l)&&"none"===S.css(e,"float")&&(u||(p.done(function(){h.display=l}),null==l&&(c=h.display,l="none"===c?"":c)),h.display="inline-block")),n.overflow&&(h.overflow="hidden",p.always(function(){h.overflow=n.overflow[0],h.overflowX=n.overflow[1],h.overflowY=n.overflow[2]})),u=!1,d)u||(v?"hidden"in v&&(g=v.hidden):v=Y.access(e,"fxshow",{display:l}),o&&(v.hidden=!g),g&&le([e],!0),p.done(function(){for(r in g||le([e]),Y.remove(e,"fxshow"),d)S.style(e,r,d[r])})),u=ct(g?v[r]:0,r,p),r in v||(v[r]=u.start,g&&(u.end=u.start,u.start=0))}],prefilter:function(e,t){t?ft.prefilters.unshift(e):ft.prefilters.push(e)}}),S.speed=function(e,t,n){var r=e&&"object"==typeof e?S.extend({},e):{complete:n||!n&&t||m(e)&&e,duration:e,easing:n&&t||t&&!m(t)&&t};return S.fx.off?r.duration=0:"number"!=typeof r.duration&&(r.duration in S.fx.speeds?r.duration=S.fx.speeds[r.duration]:r.duration=S.fx.speeds._default),null!=r.queue&&!0!==r.queue||(r.queue="fx"),r.old=r.complete,r.complete=function(){m(r.old)&&r.old.call(this),r.queue&&S.dequeue(this,r.queue)},r},S.fn.extend({fadeTo:function(e,t,n,r){return this.filter(ae).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(t,e,n,r){var i=S.isEmptyObject(t),o=S.speed(e,n,r),a=function(){var e=ft(this,S.extend({},t),o);(i||Y.get(this,"finish"))&&e.stop(!0)};return a.finish=a,i||!1===o.queue?this.each(a):this.queue(o.queue,a)},stop:function(i,e,o){var a=function(e){var t=e.stop;delete e.stop,t(o)};return"string"!=typeof i&&(o=e,e=i,i=void 0),e&&this.queue(i||"fx",[]),this.each(function(){var e=!0,t=null!=i&&i+"queueHooks",n=S.timers,r=Y.get(this);if(t)r[t]&&r[t].stop&&a(r[t]);else for(t in r)r[t]&&r[t].stop&&at.test(t)&&a(r[t]);for(t=n.length;t--;)n[t].elem!==this||null!=i&&n[t].queue!==i||(n[t].anim.stop(o),e=!1,n.splice(t,1));!e&&o||S.dequeue(this,i)})},finish:function(a){return!1!==a&&(a=a||"fx"),this.each(function(){var e,t=Y.get(this),n=t[a+"queue"],r=t[a+"queueHooks"],i=S.timers,o=n?n.length:0;for(t.finish=!0,S.queue(this,a,[]),r&&r.stop&&r.stop.call(this,!0),e=i.length;e--;)i[e].elem===this&&i[e].queue===a&&(i[e].anim.stop(!0),i.splice(e,1));for(e=0;e<o;e++)n[e]&&n[e].finish&&n[e].finish.call(this);delete t.finish})}}),S.each(["toggle","show","hide"],function(e,r){var i=S.fn[r];S.fn[r]=function(e,t,n){return null==e||"boolean"==typeof e?i.apply(this,arguments):this.animate(lt(r,!0),e,t,n)}}),S.each({slideDown:lt("show"),slideUp:lt("hide"),slideToggle:lt("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,r){S.fn[e]=function(e,t,n){return this.animate(r,e,t,n)}}),S.timers=[],S.fx.tick=function(){var e,t=0,n=S.timers;for(tt=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||S.fx.stop(),tt=void 0},S.fx.timer=function(e){S.timers.push(e),S.fx.start()},S.fx.interval=13,S.fx.start=function(){nt||(nt=!0,st())},S.fx.stop=function(){nt=null},S.fx.speeds={slow:600,fast:200,_default:400},S.fn.delay=function(r,e){return r=S.fx&&S.fx.speeds[r]||r,e=e||"fx",this.queue(e,function(e,t){var n=C.setTimeout(e,r);t.stop=function(){C.clearTimeout(n)}})},rt=E.createElement("input"),it=E.createElement("select").appendChild(E.createElement("option")),rt.type="checkbox",y.checkOn=""!==rt.value,y.optSelected=it.selected,(rt=E.createElement("input")).value="t",rt.type="radio",y.radioValue="t"===rt.value;var pt,dt=S.expr.attrHandle;S.fn.extend({attr:function(e,t){return $(this,S.attr,e,t,1<arguments.length)},removeAttr:function(e){return this.each(function(){S.removeAttr(this,e)})}}),S.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?S.prop(e,t,n):(1===o&&S.isXMLDoc(e)||(i=S.attrHooks[t.toLowerCase()]||(S.expr.match.bool.test(t)?pt:void 0)),void 0!==n?null===n?void S.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=S.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!y.radioValue&&"radio"===t&&A(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(P);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),pt={set:function(e,t,n){return!1===t?S.removeAttr(e,n):e.setAttribute(n,n),n}},S.each(S.expr.match.bool.source.match(/\w+/g),function(e,t){var a=dt[t]||S.find.attr;dt[t]=function(e,t,n){var r,i,o=t.toLowerCase();return n||(i=dt[o],dt[o]=r,r=null!=a(e,t,n)?o:null,dt[o]=i),r}});var ht=/^(?:input|select|textarea|button)$/i,gt=/^(?:a|area)$/i;function vt(e){return(e.match(P)||[]).join(" ")}function yt(e){return e.getAttribute&&e.getAttribute("class")||""}function mt(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(P)||[]}S.fn.extend({prop:function(e,t){return $(this,S.prop,e,t,1<arguments.length)},removeProp:function(e){return this.each(function(){delete this[S.propFix[e]||e]})}}),S.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&S.isXMLDoc(e)||(t=S.propFix[t]||t,i=S.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=S.find.attr(e,"tabindex");return t?parseInt(t,10):ht.test(e.nodeName)||gt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),y.optSelected||(S.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),S.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){S.propFix[this.toLowerCase()]=this}),S.fn.extend({addClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).addClass(t.call(this,e,yt(this)))});if((e=mt(t)).length)while(n=this[u++])if(i=yt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=e[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},removeClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).removeClass(t.call(this,e,yt(this)))});if(!arguments.length)return this.attr("class","");if((e=mt(t)).length)while(n=this[u++])if(i=yt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=e[a++])while(-1<r.indexOf(" "+o+" "))r=r.replace(" "+o+" "," ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},toggleClass:function(i,t){var o=typeof i,a="string"===o||Array.isArray(i);return"boolean"==typeof t&&a?t?this.addClass(i):this.removeClass(i):m(i)?this.each(function(e){S(this).toggleClass(i.call(this,e,yt(this),t),t)}):this.each(function(){var e,t,n,r;if(a){t=0,n=S(this),r=mt(i);while(e=r[t++])n.hasClass(e)?n.removeClass(e):n.addClass(e)}else void 0!==i&&"boolean"!==o||((e=yt(this))&&Y.set(this,"__className__",e),this.setAttribute&&this.setAttribute("class",e||!1===i?"":Y.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&-1<(" "+vt(yt(n))+" ").indexOf(t))return!0;return!1}});var xt=/\r/g;S.fn.extend({val:function(n){var r,e,i,t=this[0];return arguments.length?(i=m(n),this.each(function(e){var t;1===this.nodeType&&(null==(t=i?n.call(this,e,S(this).val()):n)?t="":"number"==typeof t?t+="":Array.isArray(t)&&(t=S.map(t,function(e){return null==e?"":e+""})),(r=S.valHooks[this.type]||S.valHooks[this.nodeName.toLowerCase()])&&"set"in r&&void 0!==r.set(this,t,"value")||(this.value=t))})):t?(r=S.valHooks[t.type]||S.valHooks[t.nodeName.toLowerCase()])&&"get"in r&&void 0!==(e=r.get(t,"value"))?e:"string"==typeof(e=t.value)?e.replace(xt,""):null==e?"":e:void 0}}),S.extend({valHooks:{option:{get:function(e){var t=S.find.attr(e,"value");return null!=t?t:vt(S.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r<u;r++)if(((n=i[r]).selected||r===o)&&!n.disabled&&(!n.parentNode.disabled||!A(n.parentNode,"optgroup"))){if(t=S(n).val(),a)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=S.makeArray(t),a=i.length;while(a--)((r=i[a]).selected=-1<S.inArray(S.valHooks.option.get(r),o))&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),S.each(["radio","checkbox"],function(){S.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=-1<S.inArray(S(e).val(),t)}},y.checkOn||(S.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),y.focusin="onfocusin"in C;var bt=/^(?:focusinfocus|focusoutblur)$/,wt=function(e){e.stopPropagation()};S.extend(S.event,{trigger:function(e,t,n,r){var i,o,a,s,u,l,c,f,p=[n||E],d=v.call(e,"type")?e.type:e,h=v.call(e,"namespace")?e.namespace.split("."):[];if(o=f=a=n=n||E,3!==n.nodeType&&8!==n.nodeType&&!bt.test(d+S.event.triggered)&&(-1<d.indexOf(".")&&(d=(h=d.split(".")).shift(),h.sort()),u=d.indexOf(":")<0&&"on"+d,(e=e[S.expando]?e:new S.Event(d,"object"==typeof e&&e)).isTrigger=r?2:3,e.namespace=h.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=n),t=null==t?[e]:S.makeArray(t,[e]),c=S.event.special[d]||{},r||!c.trigger||!1!==c.trigger.apply(n,t))){if(!r&&!c.noBubble&&!x(n)){for(s=c.delegateType||d,bt.test(s+d)||(o=o.parentNode);o;o=o.parentNode)p.push(o),a=o;a===(n.ownerDocument||E)&&p.push(a.defaultView||a.parentWindow||C)}i=0;while((o=p[i++])&&!e.isPropagationStopped())f=o,e.type=1<i?s:c.bindType||d,(l=(Y.get(o,"events")||Object.create(null))[e.type]&&Y.get(o,"handle"))&&l.apply(o,t),(l=u&&o[u])&&l.apply&&V(o)&&(e.result=l.apply(o,t),!1===e.result&&e.preventDefault());return e.type=d,r||e.isDefaultPrevented()||c._default&&!1!==c._default.apply(p.pop(),t)||!V(n)||u&&m(n[d])&&!x(n)&&((a=n[u])&&(n[u]=null),S.event.triggered=d,e.isPropagationStopped()&&f.addEventListener(d,wt),n[d](),e.isPropagationStopped()&&f.removeEventListener(d,wt),S.event.triggered=void 0,a&&(n[u]=a)),e.result}},simulate:function(e,t,n){var r=S.extend(new S.Event,n,{type:e,isSimulated:!0});S.event.trigger(r,null,t)}}),S.fn.extend({trigger:function(e,t){return this.each(function(){S.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return S.event.trigger(e,t,n,!0)}}),y.focusin||S.each({focus:"focusin",blur:"focusout"},function(n,r){var i=function(e){S.event.simulate(r,e.target,S.event.fix(e))};S.event.special[r]={setup:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r);t||e.addEventListener(n,i,!0),Y.access(e,r,(t||0)+1)},teardown:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r)-1;t?Y.access(e,r,t):(e.removeEventListener(n,i,!0),Y.remove(e,r))}}});var Tt=C.location,Ct={guid:Date.now()},Et=/\?/;S.parseXML=function(e){var t;if(!e||"string"!=typeof e)return null;try{t=(new C.DOMParser).parseFromString(e,"text/xml")}catch(e){t=void 0}return t&&!t.getElementsByTagName("parsererror").length||S.error("Invalid XML: "+e),t};var St=/\[\]$/,kt=/\r?\n/g,At=/^(?:submit|button|image|reset|file)$/i,Nt=/^(?:input|select|textarea|keygen)/i;function Dt(n,e,r,i){var t;if(Array.isArray(e))S.each(e,function(e,t){r||St.test(n)?i(n,t):Dt(n+"["+("object"==typeof t&&null!=t?e:"")+"]",t,r,i)});else if(r||"object"!==w(e))i(n,e);else for(t in e)Dt(n+"["+t+"]",e[t],r,i)}S.param=function(e,t){var n,r=[],i=function(e,t){var n=m(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(null==e)return"";if(Array.isArray(e)||e.jquery&&!S.isPlainObject(e))S.each(e,function(){i(this.name,this.value)});else for(n in e)Dt(n,e[n],t,i);return r.join("&")},S.fn.extend({serialize:function(){return S.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=S.prop(this,"elements");return e?S.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!S(this).is(":disabled")&&Nt.test(this.nodeName)&&!At.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=S(this).val();return null==n?null:Array.isArray(n)?S.map(n,function(e){return{name:t.name,value:e.replace(kt,"\r\n")}}):{name:t.name,value:n.replace(kt,"\r\n")}}).get()}});var jt=/%20/g,qt=/#.*$/,Lt=/([?&])_=[^&]*/,Ht=/^(.*?):[ \t]*([^\r\n]*)$/gm,Ot=/^(?:GET|HEAD)$/,Pt=/^\/\//,Rt={},Mt={},It="*/".concat("*"),Wt=E.createElement("a");function Ft(o){return function(e,t){"string"!=typeof e&&(t=e,e="*");var n,r=0,i=e.toLowerCase().match(P)||[];if(m(t))while(n=i[r++])"+"===n[0]?(n=n.slice(1)||"*",(o[n]=o[n]||[]).unshift(t)):(o[n]=o[n]||[]).push(t)}}function Bt(t,i,o,a){var s={},u=t===Mt;function l(e){var r;return s[e]=!0,S.each(t[e]||[],function(e,t){var n=t(i,o,a);return"string"!=typeof n||u||s[n]?u?!(r=n):void 0:(i.dataTypes.unshift(n),l(n),!1)}),r}return l(i.dataTypes[0])||!s["*"]&&l("*")}function $t(e,t){var n,r,i=S.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&S.extend(!0,e,r),e}Wt.href=Tt.href,S.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Tt.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(Tt.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":It,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":S.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?$t($t(e,S.ajaxSettings),t):$t(S.ajaxSettings,e)},ajaxPrefilter:Ft(Rt),ajaxTransport:Ft(Mt),ajax:function(e,t){"object"==typeof e&&(t=e,e=void 0),t=t||{};var c,f,p,n,d,r,h,g,i,o,v=S.ajaxSetup({},t),y=v.context||v,m=v.context&&(y.nodeType||y.jquery)?S(y):S.event,x=S.Deferred(),b=S.Callbacks("once memory"),w=v.statusCode||{},a={},s={},u="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(h){if(!n){n={};while(t=Ht.exec(p))n[t[1].toLowerCase()+" "]=(n[t[1].toLowerCase()+" "]||[]).concat(t[2])}t=n[e.toLowerCase()+" "]}return null==t?null:t.join(", ")},getAllResponseHeaders:function(){return h?p:null},setRequestHeader:function(e,t){return null==h&&(e=s[e.toLowerCase()]=s[e.toLowerCase()]||e,a[e]=t),this},overrideMimeType:function(e){return null==h&&(v.mimeType=e),this},statusCode:function(e){var t;if(e)if(h)T.always(e[T.status]);else for(t in e)w[t]=[w[t],e[t]];return this},abort:function(e){var t=e||u;return c&&c.abort(t),l(0,t),this}};if(x.promise(T),v.url=((e||v.url||Tt.href)+"").replace(Pt,Tt.protocol+"//"),v.type=t.method||t.type||v.method||v.type,v.dataTypes=(v.dataType||"*").toLowerCase().match(P)||[""],null==v.crossDomain){r=E.createElement("a");try{r.href=v.url,r.href=r.href,v.crossDomain=Wt.protocol+"//"+Wt.host!=r.protocol+"//"+r.host}catch(e){v.crossDomain=!0}}if(v.data&&v.processData&&"string"!=typeof v.data&&(v.data=S.param(v.data,v.traditional)),Bt(Rt,v,t,T),h)return T;for(i in(g=S.event&&v.global)&&0==S.active++&&S.event.trigger("ajaxStart"),v.type=v.type.toUpperCase(),v.hasContent=!Ot.test(v.type),f=v.url.replace(qt,""),v.hasContent?v.data&&v.processData&&0===(v.contentType||"").indexOf("application/x-www-form-urlencoded")&&(v.data=v.data.replace(jt,"+")):(o=v.url.slice(f.length),v.data&&(v.processData||"string"==typeof v.data)&&(f+=(Et.test(f)?"&":"?")+v.data,delete v.data),!1===v.cache&&(f=f.replace(Lt,"$1"),o=(Et.test(f)?"&":"?")+"_="+Ct.guid+++o),v.url=f+o),v.ifModified&&(S.lastModified[f]&&T.setRequestHeader("If-Modified-Since",S.lastModified[f]),S.etag[f]&&T.setRequestHeader("If-None-Match",S.etag[f])),(v.data&&v.hasContent&&!1!==v.contentType||t.contentType)&&T.setRequestHeader("Content-Type",v.contentType),T.setRequestHeader("Accept",v.dataTypes[0]&&v.accepts[v.dataTypes[0]]?v.accepts[v.dataTypes[0]]+("*"!==v.dataTypes[0]?", "+It+"; q=0.01":""):v.accepts["*"]),v.headers)T.setRequestHeader(i,v.headers[i]);if(v.beforeSend&&(!1===v.beforeSend.call(y,T,v)||h))return T.abort();if(u="abort",b.add(v.complete),T.done(v.success),T.fail(v.error),c=Bt(Mt,v,t,T)){if(T.readyState=1,g&&m.trigger("ajaxSend",[T,v]),h)return T;v.async&&0<v.timeout&&(d=C.setTimeout(function(){T.abort("timeout")},v.timeout));try{h=!1,c.send(a,l)}catch(e){if(h)throw e;l(-1,e)}}else l(-1,"No Transport");function l(e,t,n,r){var i,o,a,s,u,l=t;h||(h=!0,d&&C.clearTimeout(d),c=void 0,p=r||"",T.readyState=0<e?4:0,i=200<=e&&e<300||304===e,n&&(s=function(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}(v,T,n)),!i&&-1<S.inArray("script",v.dataTypes)&&(v.converters["text script"]=function(){}),s=function(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}(v,s,T,i),i?(v.ifModified&&((u=T.getResponseHeader("Last-Modified"))&&(S.lastModified[f]=u),(u=T.getResponseHeader("etag"))&&(S.etag[f]=u)),204===e||"HEAD"===v.type?l="nocontent":304===e?l="notmodified":(l=s.state,o=s.data,i=!(a=s.error))):(a=l,!e&&l||(l="error",e<0&&(e=0))),T.status=e,T.statusText=(t||l)+"",i?x.resolveWith(y,[o,l,T]):x.rejectWith(y,[T,l,a]),T.statusCode(w),w=void 0,g&&m.trigger(i?"ajaxSuccess":"ajaxError",[T,v,i?o:a]),b.fireWith(y,[T,l]),g&&(m.trigger("ajaxComplete",[T,v]),--S.active||S.event.trigger("ajaxStop")))}return T},getJSON:function(e,t,n){return S.get(e,t,n,"json")},getScript:function(e,t){return S.get(e,void 0,t,"script")}}),S.each(["get","post"],function(e,i){S[i]=function(e,t,n,r){return m(t)&&(r=r||n,n=t,t=void 0),S.ajax(S.extend({url:e,type:i,dataType:r,data:t,success:n},S.isPlainObject(e)&&e))}}),S.ajaxPrefilter(function(e){var t;for(t in e.headers)"content-type"===t.toLowerCase()&&(e.contentType=e.headers[t]||"")}),S._evalUrl=function(e,t,n){return S.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(e){S.globalEval(e,t,n)}})},S.fn.extend({wrapAll:function(e){var t;return this[0]&&(m(e)&&(e=e.call(this[0])),t=S(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(n){return m(n)?this.each(function(e){S(this).wrapInner(n.call(this,e))}):this.each(function(){var e=S(this),t=e.contents();t.length?t.wrapAll(n):e.append(n)})},wrap:function(t){var n=m(t);return this.each(function(e){S(this).wrapAll(n?t.call(this,e):t)})},unwrap:function(e){return this.parent(e).not("body").each(function(){S(this).replaceWith(this.childNodes)}),this}}),S.expr.pseudos.hidden=function(e){return!S.expr.pseudos.visible(e)},S.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},S.ajaxSettings.xhr=function(){try{return new C.XMLHttpRequest}catch(e){}};var _t={0:200,1223:204},zt=S.ajaxSettings.xhr();y.cors=!!zt&&"withCredentials"in zt,y.ajax=zt=!!zt,S.ajaxTransport(function(i){var o,a;if(y.cors||zt&&!i.crossDomain)return{send:function(e,t){var n,r=i.xhr();if(r.open(i.type,i.url,i.async,i.username,i.password),i.xhrFields)for(n in i.xhrFields)r[n]=i.xhrFields[n];for(n in i.mimeType&&r.overrideMimeType&&r.overrideMimeType(i.mimeType),i.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest"),e)r.setRequestHeader(n,e[n]);o=function(e){return function(){o&&(o=a=r.onload=r.onerror=r.onabort=r.ontimeout=r.onreadystatechange=null,"abort"===e?r.abort():"error"===e?"number"!=typeof r.status?t(0,"error"):t(r.status,r.statusText):t(_t[r.status]||r.status,r.statusText,"text"!==(r.responseType||"text")||"string"!=typeof r.responseText?{binary:r.response}:{text:r.responseText},r.getAllResponseHeaders()))}},r.onload=o(),a=r.onerror=r.ontimeout=o("error"),void 0!==r.onabort?r.onabort=a:r.onreadystatechange=function(){4===r.readyState&&C.setTimeout(function(){o&&a()})},o=o("abort");try{r.send(i.hasContent&&i.data||null)}catch(e){if(o)throw e}},abort:function(){o&&o()}}}),S.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),S.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return S.globalEval(e),e}}}),S.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),S.ajaxTransport("script",function(n){var r,i;if(n.crossDomain||n.scriptAttrs)return{send:function(e,t){r=S("<script>").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Ut,Xt=[],Vt=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Xt.pop()||S.expando+"_"+Ct.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Vt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Vt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Vt,"$1"+r):!1!==e.jsonp&&(e.url+=(Et.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Xt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Ut=E.implementation.createHTMLDocument("").body).innerHTML="<form></form><form></form>",2===Ut.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1<s&&(r=vt(e.slice(s)),e=e.slice(0,s)),m(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),0<a.length&&S.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?S("<div>").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):("number"==typeof f.top&&(f.top+="px"),"number"==typeof f.left&&(f.left+="px"),c.css(f))}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=$e(y.pixelPosition,function(e,t){if(t)return t=Be(e,n),Me.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0<arguments.length?this.on(n,null,e,t):this.trigger(n)}});var Gt=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;S.proxy=function(e,t){var n,r,i;if("string"==typeof t&&(n=e[t],t=e,e=n),m(e))return r=s.call(arguments,2),(i=function(){return e.apply(t||this,r.concat(s.call(arguments)))}).guid=e.guid=e.guid||S.guid++,i},S.holdReady=function(e){e?S.readyWait++:S.ready(!0)},S.isArray=Array.isArray,S.parseJSON=JSON.parse,S.nodeName=A,S.isFunction=m,S.isWindow=x,S.camelCase=X,S.type=w,S.now=Date.now,S.isNumeric=function(e){var t=S.type(e);return("number"===t||"string"===t)&&!isNaN(e-parseFloat(e))},S.trim=function(e){return null==e?"":(e+"").replace(Gt,"")},"function"==typeof define&&define.amd&&define("jquery",[],function(){return S});var Yt=C.jQuery,Qt=C.$;return S.noConflict=function(e){return C.$===S&&(C.$=Qt),e&&C.jQuery===S&&(C.jQuery=Yt),S},"undefined"==typeof e&&(C.jQuery=C.$=S),S});
diff --git a/htdocs/WebApplicationFramework/FrameworkMain.js b/htdocs/WebApplicationFramework/FrameworkMain.js
index e8a6fce..f5534b6 100644
--- a/htdocs/WebApplicationFramework/FrameworkMain.js
+++ b/htdocs/WebApplicationFramework/FrameworkMain.js
@@ -200,9 +200,11 @@
     }
 
     var browser = browserCheck();
-    if ((browser[0].toLowerCase() == "firefox" && parseInt(browser[1].split(".")[0]) >= 38) || browser[0].toLowerCase() == "chrome") {
+    var not_first_run = localStorage.getItem('_not_first_run_');
+    if ((not_first_run == 'true') || ((browser[0].toLowerCase() == "firefox" && parseInt(browser[1].split(".")[0]) >= 38) || browser[0].toLowerCase() == "chrome")) {
         start();
     } else {
+        localStorage.setItem('_not_first_run_', 'true');
         var html = '' +
         '<div id="UnsupportedBrowser">' +
             '<p>This browser is not supported: ' + browser[0] + ' ' + browser[1] + '</p>' +
@@ -249,4 +251,4 @@
         });
         taskList.taskOperation();
     };
-}
\ No newline at end of file
+}
diff --git a/htdocs/WebApplicationFramework/Views/View_MultipliedViewAligner.js b/htdocs/WebApplicationFramework/Views/View_MultipliedViewAligner.js
index e05c64b..7cdad4a 100644
--- a/htdocs/WebApplicationFramework/Views/View_MultipliedViewAligner.js
+++ b/htdocs/WebApplicationFramework/Views/View_MultipliedViewAligner.js
@@ -19,23 +19,39 @@
     
     var v_multipliedSubviews = [];
     var v_alignerSize = 0;
-    
+
+    var v_last_viewmodelBundle;
+
     var v_this = this;
-    
+
     /** public functions */
 
     this.applicationCreated = function() {
         preprocessSubviewDescriptors(v_customData, 0);
     };
 
+    this.setSelection = function(selection) {
+        $("#" + v_mainId + " .Aligner").removeClass("Selected");
+        if (selection != undefined)
+            for (var i = 0; i < selection.length; ++i)
+                $("#" + v_mainId + "_" + selection[i] + " .Aligner").addClass("Selected");
+    };
+
     this.refresh = function(p_fullRefresh) {
         if (p_fullRefresh) {
-            $("#" + v_parentId).empty();
-            v_multipliedSubviews = [];
-            fullRefresh();
+            var viewmodelBundle = v_dataViewmodel.getViewmodelBundle();
+            if (v_last_viewmodelBundle != viewmodelBundle)
+            {
+                v_last_viewmodelBundle = viewmodelBundle;
+                $("#" + v_parentId).empty();
+                v_multipliedSubviews = [];
+                fullRefresh();
+                v_this.setSelection(v_dataViewmodel.getSelectionIndx());
+            }
         } else if (ViewUtils.checkVisibility(v_conditionViewmodel, v_mainId)) {
             for (var i = 0; i < v_multipliedSubviews.length; ++i) {
                 v_multipliedSubviews[i].refresh();
+                v_this.setSelection(v_dataViewmodel.getSelectionIndx());
             }
         }
     };
@@ -55,15 +71,14 @@
     }
     
     function fullRefresh() {
-        var viewmodelBundle = v_dataViewmodel.getViewmodelBundle();
-        v_alignerSize = viewmodelBundle.length;
+        v_alignerSize = v_last_viewmodelBundle.length;
         v_customData.idsCreating = [];
-        for (var i = 0; i < viewmodelBundle.length; ++i) {
+        for (var i = 0; i < v_last_viewmodelBundle.length; ++i) {
             v_customData.idsCreating.push(v_mainId + "_" + i);
         }
         createAligner();
-        for (var i = 0; i < viewmodelBundle.length; ++i) {
-            createSubviews(viewmodelBundle[i], v_customData.multipliedSubviews, [v_customData.idsCreating[i]], v_mainId + "_" + i + "_");
+        for (var i = 0; i < v_last_viewmodelBundle.length; ++i) {
+            createSubviews(v_last_viewmodelBundle[i], v_customData.multipliedSubviews, [v_customData.idsCreating[i]], v_mainId + "_" + i + "_");
         }
     }
     
diff --git a/htdocs/WebApplications/CustomizableApp/ViewModels/ViewModel_FSM_SVG.js b/htdocs/WebApplications/CustomizableApp/ViewModels/ViewModel_FSM_SVG.js
index 38e4af7..38b88bf 100644
--- a/htdocs/WebApplications/CustomizableApp/ViewModels/ViewModel_FSM_SVG.js
+++ b/htdocs/WebApplications/CustomizableApp/ViewModels/ViewModel_FSM_SVG.js
@@ -54,9 +54,18 @@
                 if (state != undefined)
                 {
                     state = state.node.val;
-                    var activeIndx = lsvgdec.indexOf(state);
-                    var colorindx = lsvgdec.lastIndexOf("<rect fill=\"#FEFECE\"", activeIndx);
-                    lsvgdec = replaceAt(lsvgdec, colorindx, "<rect fill=\"#ffafaf\"");
+                    if (state.indexOf(',') != -1)
+                        state = state.split(',');
+                    else
+                        state = [state];
+
+                    for (var i = 0; i < state.length; ++i) 
+                        if (!i || (state[i] != state[i - 1]))
+                        {
+                            var activeIndx = lsvgdec.indexOf(state[i]);
+                            var colorindx = lsvgdec.lastIndexOf("<rect fill=\"#FEFECE\"", activeIndx);
+                            lsvgdec = replaceAt(lsvgdec, colorindx, "<rect fill=\"#ffafaf\"");
+                        }
                 }
                 lValues[0] = {val: lsvgdec};
             }
diff --git a/htdocs/WebApplications/CustomizableApp/ViewModels/ViewModel_Multiplier.js b/htdocs/WebApplications/CustomizableApp/ViewModels/ViewModel_Multiplier.js
index 1ca73d4..4a8b21b 100644
--- a/htdocs/WebApplications/CustomizableApp/ViewModels/ViewModel_Multiplier.js
+++ b/htdocs/WebApplications/CustomizableApp/ViewModels/ViewModel_Multiplier.js
@@ -16,9 +16,10 @@
     var v_selections = [];
 
     var v_currentBundle = [];
-    
+    var v_last_response;
+
     var v_this = this;
-    
+
     /** public functions - interface for parent */ 
 
     this.setSelectionToControl = function(p_selection) {
@@ -45,12 +46,20 @@
     };
 
     this.getViewmodelBundle = function() {
+        
         var response = v_viewmodel.getResponseElement(v_dataPaths[0]);
         var numberOfBundles = 0;
         if (response != undefined && response.list != undefined) {
             numberOfBundles = response.list.length;
         }
         
+        var vmbjson = JSON.stringify(response);
+        if (v_last_response != vmbjson && numberOfBundles != v_currentBundle.length)
+        {
+            v_last_response = vmbjson;
+            v_currentBundle = [];
+        }
+        
         var currentBundles = v_currentBundle.length;
         if (numberOfBundles < currentBundles) {
             while (v_currentBundle.length > numberOfBundles) {
@@ -61,9 +70,16 @@
                 v_currentBundle.push(createBundle(i));
             }
         }
-        
+
         return v_currentBundle;
     };
+    
+    this.getSelectionIndx = function() {
+        if (v_selections[0])
+            return v_selections[0].selection;
+        else
+            return 0;
+    };
 
     /** private functions */
     
@@ -158,7 +174,7 @@
 };
 
 CViewModel_Multiplier.providesInterface = function() {
-    return ["getViewmodelBundle"];
+    return ["getViewmodelBundle", "getSelectionIndx"];
 };
 
 CViewModel_Multiplier.getCustomDataSchema = function() {
diff --git a/htdocs/WebApplications/GuiEditor/Models/Model.js b/htdocs/WebApplications/GuiEditor/Models/Model.js
index f7884ef..1b446ac 100644
--- a/htdocs/WebApplications/GuiEditor/Models/Model.js
+++ b/htdocs/WebApplications/GuiEditor/Models/Model.js
@@ -10,6 +10,7 @@
     var v_setupModel = v_baseModel.getSetupModel();

     var v_framework = p_framework;

     var v_dsRestAPI;

+    var v_MetaSchema;

 

     if (v_baseModel.getAppConfig().lastEditedApp != undefined && window["DsRestAPI"] != undefined) {

         v_dsRestAPI = new DsRestAPI(p_extension);

@@ -17,6 +18,10 @@
         v_dsRestAPI = {"getHelp": function(callback) {callback(true, {"sources" : []});}};

     }

 

+    v_baseModel.getFileHandler().loadFile('Libs/AJV/json-schema-draft-04.json', function(ok, data) {
+        v_MetaSchema = JSON.parse(data);
+    });

+

     ///////////////////// SETUP HANDLING /////////////////////

 

     this.newSetup = function() {

@@ -395,6 +400,10 @@
     this.getDsRestAPI = function() {

         return v_dsRestAPI;

     };

+
+    this.getMetaSchema = function() {
+        return v_MetaSchema;
+    }
 

     this.getFileHandler = v_baseModel.getFileHandler;

 }

diff --git a/htdocs/WebApplications/GuiEditor/ViewModels/ViewModel_SanityChecker.js b/htdocs/WebApplications/GuiEditor/ViewModels/ViewModel_SanityChecker.js
index bebc980..d46a35f 100644
--- a/htdocs/WebApplications/GuiEditor/ViewModels/ViewModel_SanityChecker.js
+++ b/htdocs/WebApplications/GuiEditor/ViewModels/ViewModel_SanityChecker.js
@@ -13,6 +13,7 @@
     var v_help;
     var v_request;
     var v_cache;
+    var v_ajv_validator;
 
     var v_this = this;
 
@@ -20,6 +21,14 @@
 
     this.init = function(p_callback) {
         v_cache = {};
+
+        v_ajv_validator = new Ajv({schemaId: 'id'});
+        v_ajv_validator.addFormat('checkbox', function (value) {return true;});
+        v_ajv_validator.addFormat('tabs', function (value) {return true;});
+        v_ajv_validator.addFormat('table', function (value) {return true;});
+        var metasch = v_model.getMetaSchema();
+        v_ajv_validator.addMetaSchema(metasch);
+
         function jsImported(ok, data) {
             if (!ok) {
                 alert("Some javascript files could not be imported\n" + JSON.stringify(data, null, 4));
@@ -88,8 +97,7 @@
 
             // chack if custom data is valid
             if (window[viewClass].getCustomDataSchema != undefined && !oldff) {
-                var validate = new Ajv({}).compile(window[viewClass].getCustomDataSchema());
-                var isValid = validate(view.getCustomData());
+                var isValid = v_ajv_validator.validate(window[viewClass].getCustomDataSchema(), view.getCustomData());
                 if (!isValid) {
                     return "custom data does not match the schema";
                 }
@@ -104,8 +112,7 @@
         if (window[viewmodelClass] != undefined) {
             // chack if custom data is valid
             if (window[viewmodelClass].getCustomDataSchema != undefined && !oldff) {
-                var validate = new Ajv({}).compile(window[viewmodelClass].getCustomDataSchema());
-                var isValid = validate(viewmodel.getCustomData());
+                var isValid = v_ajv_validator.validate(window[viewmodelClass].getCustomDataSchema(), viewmodel.getCustomData());
                 if (!isValid) {
                     return "custom data does not match the schema";
                 }
diff --git a/htdocs/WebApplications/RequestConsole/Models/Model.js b/htdocs/WebApplications/RequestConsole/Models/Model.js
index b2c95ad..63a7d70 100644
--- a/htdocs/WebApplications/RequestConsole/Models/Model.js
+++ b/htdocs/WebApplications/RequestConsole/Models/Model.js
@@ -10,6 +10,7 @@
     var v_setupModel = v_baseModel.getSetupModel();

     var v_framework = p_framework;

     var v_requestSchema;

+    var v_MetaSchema;

     var v_dsRestAPI;

 

     if (v_baseModel.getAppConfig().lastEditedApp != undefined && window["DsRestAPI"] != undefined) {

@@ -22,6 +23,10 @@
         v_requestSchema = JSON.parse(data);

     });

 

+    v_baseModel.getFileHandler().loadFile('Libs/AJV/json-schema-draft-04.json', function(ok, data) {

+        v_MetaSchema = JSON.parse(data);

+    });

+

     ///////////////////// SETUP HANDLING /////////////////////

 

     this.resetSetupDir = function() {

@@ -169,6 +174,10 @@
     this.getRequestSchema = function() {

         return v_requestSchema;

     }

+    

+    this.getMetaSchema = function() {

+        return v_MetaSchema;

+    }

 

     this.getDesktopDataForRequestEditor = function() {

         return v_setupModel.getSetup().desktop.getData()["RequestEditor"];

diff --git a/htdocs/WebApplications/RequestConsole/ViewModels/ViewModel_RequestEditor.js b/htdocs/WebApplications/RequestConsole/ViewModels/ViewModel_RequestEditor.js
index f3d986f..d2f14c5 100644
--- a/htdocs/WebApplications/RequestConsole/ViewModels/ViewModel_RequestEditor.js
+++ b/htdocs/WebApplications/RequestConsole/ViewModels/ViewModel_RequestEditor.js
@@ -3,336 +3,340 @@
 // terms of the Eclipse Public License v2.0 which accompanies this distribution, and is available at //
 // https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html                                                         //
 ///////////////////////////////////////////////////////////////////////////////////////////////////////
-function RequestConsole_RequestEditor_ViewModel(p_model, p_parent) {

-    "use strict";

-

-    var v_model = p_model;

-    var v_parent = p_parent;

-    var dataSourceUtils = new DataSourceUtils();

-    var v_desktopData;

-    var v_binder;

-

-    var v_help;

-    var v_requests = [];

-    var v_requestBuilder = new DSHelpToRequest_manual();

-    v_requestBuilder.setRequest(v_requests);

-

-    var v_this = this;

-

-    ///////////////////// GENERAL FUNCTIONS /////////////////////

-

-    this.init = function(p_callback) {

-        function helpArrived(ok, help) {

-            if (ok) {

-                v_help = help;

-                p_callback(true);

-            } else {

-                p_callback(false, "Error getting help");

-            }

-        }

-

-        v_model.getDsRestAPI().getHelp(helpArrived);

-    };

-

-    this.setBinder = function(p_binder) {

-        v_binder = p_binder;

-    };

-

-    this.setSetup = function(setup) {

-        v_requests = setup.request.getData();

-        v_requestBuilder.setRequest(v_requests);

-    };

-    

-    this.modelChanged = function() {

-        if (v_binder)

-            v_binder.modelChanged();

-    }

-

-    ///////////////////// FUNCTIONS FOR VIEW VISUALIZATION /////////////////////

-

-    this.getHelp = function(refresh, toSort, elementIcon) {

-        function helpArrived(ok, p_help) {

-            if (ok) {

-                v_help = p_help;

-                var help = new HelpTreeBuilder(mcopy(v_help)).getHelpTree(toSort);

-                v_requestBuilder.setHelp(help);

-                var jsTreeData = dataSourceUtils.convertHelpToTreeDataArray(help.sources, elementIcon);

-                refresh(jsTreeData);

-            } else {

-                alert("Failed to get help");

-                refresh([]);

-            }

-        }

-        v_model.getDsRestAPI().getHelp(helpArrived);

-    };

-

-    this.getRawHelp = function() {

-        return v_help;

-    };

-

-    this.getRequestTree = function(refresh) {

-        var jsTreeData = dataSourceUtils.convertRequestToTreeDataArray(v_requests);

-        refresh(jsTreeData);

-    };

-

-    this.getFilterAsTree = function(p_path) {

-        var filter = v_requestBuilder.getFilterPart(p_path, []);

-        var treeData = [];

-        if (filter != undefined) {

-            traverseFilter(filter, treeData);

-        }

-        return treeData;

-    };

-

-    function traverseFilter(filter, treeData, paramName) {

-        var treeNode;

-        var treeNodeText = "";

-        if (paramName != undefined) {

-            treeNodeText = paramName + ": ";

-        }

-        if (filter.dataValue != undefined) {

-            treeNode = {"text": treeNodeText + filter.dataValue};

-            treeData.push(treeNode);

-        } else if (filter.request != undefined) {

-            treeNode = {"text": treeNodeText + filter.request.element, "children": []};

-            treeData.push(treeNode);

-            if (filter.request.params != undefined && filter.request.params.length > 0) {

-                for (var i = 0; i < filter.request.params.length; ++i) {

-                    traverseFilter(filter.request.params[i].paramValue, treeNode.children, filter.request.params[i].paramName);

-                }

-            }

-            if (filter.request.remapTo != undefined) {

-                traverseFilter(filter.request.remapTo, treeNode.children, "remapTo");

-            }

-        }

-    }

-

-    this.findSelectionsAndFilters = function() {

-        traverseRequest(v_requests, [], selectionOrFilterChanged);

-    };

-

-    function selectionOrFilterChanged(node, path) {

-        if (node.getData)

-            v_binder.selectionOrFilterChanged(path, node.getData.selection != undefined, node.getData.filter != undefined, node.getData.rangeFilter != undefined, node.getData.writableInfo != undefined, "getData");

-        else if (node.setData)

-            v_binder.selectionOrFilterChanged(path, node.setData.selection != undefined, node.setData.filter != undefined, node.setData.rangeFilter != undefined, node.setData.writableInfo != undefined, "setData");

-    }

-

-    function traverseRequest(list, path, processGetData) {

-        for (var i = 0; i < list.length; ++i) {

-            path.push(i);

-            processGetData(list[i], path);

-            if (list[i].getData && list[i].getData.children != undefined) {

-                traverseRequest(list[i].getData.children, path, processGetData);

-            } else if (list[i].setData && list[i].setData.children != undefined) {

-                traverseRequest(list[i].setData.children, path, processGetData);

-            }

-            path.pop();

-        }

-    }

-

-    this.selectionAdded = function(p_path) {

-        var request = v_this.getRequestFromPath(p_path);

-        if (request.getData.selection == undefined) {

-            request.getData.selection = [0];

-        }

-        selectionOrFilterChanged(request, p_path);

-        v_parent.setupChanged("Selection added");

-    };

-

-    this.setDesktopData = function(p_data) {

-        v_desktopData = p_data;

-    };

-

-    this.getDesktopData = function() {

-        return v_desktopData;

-    };

-

-    this.getRequestSchema = function() {

-        return v_model.getRequestSchema();

-    }

-

-    ///////////////////// FUNCTIONS FOR REQUEST EDITING /////////////////////

-

-    this.createRequest = function(p_helpPath, p_position, partialRefresh) {

-        var request = v_requestBuilder.createRequest(p_helpPath, p_position);

-        partialRefresh([p_position], dataSourceUtils.convertRequestToTreeDataArray([request])[0]);

-        v_parent.setupChanged('Request added: "' + request.getData.element + '"');

-    };

-

-    this.createEmptyRequest = function(p_position, partialRefresh) {

-        var request = v_requestBuilder.createEmptyRequest(p_position);

-        partialRefresh([p_position], dataSourceUtils.convertRequestToTreeDataArray([request])[0]);

-        v_parent.setupChanged("Empty request added");

-    };

-

-    this.addChildRequest = function(p_helpPath, p_requestPath, p_position, partialRefresh) {

-        var childRequest = v_requestBuilder.addChildRequest(p_helpPath, mcopy(p_requestPath), p_position);

-        p_requestPath.push(p_position);

-        partialRefresh(p_requestPath, dataSourceUtils.convertRequestToTreeDataArray([childRequest])[0]);

-        v_parent.setupChanged('Child request added: "' + childRequest.getData.element + '"');

-    };

-

-    this.addEmptyChildRequest = function(p_requestPath, p_position, partialRefresh) {

-        var childRequest = v_requestBuilder.addEmptyChildRequest(mcopy(p_requestPath), p_position);

-        p_requestPath.push(p_position);

-        partialRefresh(p_requestPath, dataSourceUtils.convertRequestToTreeDataArray([childRequest])[0]);

-        v_parent.setupChanged("Empty child request added");

-    };

-

-    this.copyRequest = function(p_path, partialRefresh) {

-        var childRequest = v_requestBuilder.copyRequest(mcopy(p_path));

-        p_path[p_path.length - 1] += 1;

-        partialRefresh(p_path, dataSourceUtils.convertRequestToTreeDataArray([childRequest])[0]);

-        v_parent.setupChanged('Request copied');

-    };

-

-    this.convertToSizeOf = function(p_path, refresh) {

-        var request = v_this.getRequestFromPath(p_path);

-        if (request.getData)

-            convertTo(request.getData, "sizeOf");

-        else {

-            convertTo(request.setData, "sizeOf");

-            request.getData = request.setData;

-            delete request.setData.content;

-            delete request.setData.tp;

-            delete request.setData;

-        }

-        refresh(p_path, "sizeOf");

-        v_parent.setupChanged('Request converted to "sizeOf"');

-    };

-

-    this.convertToSetData = function(p_path, refresh) {

-        var request = v_this.getRequestFromPath(p_path);

-        if (request.getData) {

-            request.setData = request.getData;

-            request.setData.content = "";

-            request.setData.tp = 0;

-            delete request.getData;

-        } else {

-            request.getData = request.setData;

-            delete request.setData.content;

-            delete request.setData.tp;

-            delete request.setData;

-        }

-        selectionOrFilterChanged(request, p_path);

-        v_parent.setupChanged('Request converted to "setData"');

-    };

-

-    this.convertToDataElementPresent = function(p_path, refresh) {

-        var request = v_this.getRequestFromPath(p_path);

-        if (request.getData)

-            convertTo(request.getData, "dataElementPresent");

-        else {

-            convertTo(request.setData, "dataElementPresent");

-            request.getData = request.setData;

-            delete request.setData.content;

-            delete request.setData.tp;

-            delete request.setData;

-        }

-        refresh(p_path, "dataElementPresent");

-        v_parent.setupChanged('Request converted to "dataElementPresent"');

-    };

-

-    this.matches = function(string, path) {

-        var request = v_requestBuilder.getRequestCopy(path);

-        return JSON.stringify(request).toLowerCase().indexOf(string) != -1;

-    };

-

-    function convertTo(request, p_element) {

-        var source = request.source;

-        var element = request.element;

-        var ptcname = request.ptcname;

-        var params = request.params;

-        if (params == undefined) {

-            params = [];

-        }

-

-        request.source = "DataSource";

-        request.element = p_element;

-        request.ptcname = undefined;

-        request.filter = undefined;

-        request.rangeFilter = undefined;

-        request.params = [{

-            "paramName": "Source",

-            "paramValue": source

-        }, {

-            "paramName": "Element",

-            "paramValue": element

-        }];

-        if (ptcname != undefined) {

-            request.params.push({

-                "paramName": "PTCName",

-                "paramValue": ptcname

-            })

-        }

-

-        for (var i = 0; i < params.length; ++i) {

-            request.params.push({

-                "paramName": "ParamName",

-                "paramValue": params[i].paramName

-            });

-            request.params.push({

-                "paramName": "ParamValue",

-                "paramValue": params[i].paramValue

-            });

-        }

-    }

-

-    this.isValidToAddRequest = v_requestBuilder.isValidToAddRequest;

-    this.isValidToCreateRequest = v_requestBuilder.isValidToCreateRequest;

-    this.isValidToMoveRequest = v_requestBuilder.isValidToMoveRequest;

-

-    this.moveRequest = function(p_fromPath, p_toPath, p_position) {

-        v_requestBuilder.moveRequest(p_fromPath, p_toPath, p_position);

-        v_parent.setupChanged("Request moved");

-    };

-

-    this.deleteRequest = function(data) {

-        v_requestBuilder.deleteRequest(data);

-        v_parent.setupChanged("Request deleted");

-    };

-

-    this.getRequest = v_requestBuilder.getRequest;

-    this.getRequestFromPath = v_requestBuilder.getRequestFromPath;

-    this.getRequestCopy = v_requestBuilder.getRequestCopy;

-

-    ///////////////////// FUNCTIONS FOR FILTER EDITING /////////////////////

-

-    this.getFilterPart = v_requestBuilder.getFilterPart;

-    this.getFilterPartCopy = v_requestBuilder.getFilterPartCopy;

-    this.addFilterPart = function(p_requestPath, p_filterPath, p_paramName) {

-        v_requestBuilder.addFilterPart(p_requestPath, p_filterPath, p_paramName);

-        v_parent.setupChanged("Filter added");

-    };

-    this.deleteFilterPart = function(p_requestPath, p_filterPath) {

-        v_requestBuilder.deleteFilterPart(p_requestPath, p_filterPath);

-        v_parent.setupChanged("Filter deleted");

-    };

-    this.convertFilterPartToRequest = function(p_requestPath, p_filterPath, p_helpPath) {

-        v_requestBuilder.convertFilterPartToRequest(p_requestPath, p_filterPath, p_helpPath);

-        v_parent.setupChanged("Filter type converted to request");

-    };

-    this.convertFilterPartToDataValue = function(p_requestPath, p_filterPath, p_newValue) {

-        v_requestBuilder.convertFilterPartToDataValue(p_requestPath, p_filterPath, p_newValue);

-        v_parent.setupChanged("Filter type converted to data value");

-    };

-    this.isValidToConvertFilterToRequest = v_requestBuilder.isValidToConvertFilterToRequest;

-    this.changeParamNameOfFilterRequest = function(p_requestPath, p_filterPath, p_paramName) {

-        v_requestBuilder.changeParamNameOfFilterRequest(p_requestPath, p_filterPath, p_paramName);

-        v_parent.setupChanged("Filter param name changed");

-    };

-    this.isValidToAddParamToFilterRequest = v_requestBuilder.isValidToAddParamToFilterRequest;

-    this.convertToDataElementPresentInFilter = function(p_requestPath, p_filterPath) {

-        var filter = v_requestBuilder.getFilterPart(p_requestPath, p_filterPath);

-        var params = filter.request.params;

-        convertTo(filter.request, "dataElementPresent");

-        for (var i = 0; i < filter.request.params.length; ++i) {

-            if (filter.request.params[i].paramValue.dataValue == undefined) {

-                filter.request.params[i].paramValue = {"dataValue": filter.request.params[i].paramValue};

-            }

-        }

-        v_parent.setupChanged('Filter element converted to "dataElementPresent"');

-    };

-}

-//# sourceURL=RequestConsole\ViewModels\ViewModel_RequestEditor.js

+function RequestConsole_RequestEditor_ViewModel(p_model, p_parent) {
+    "use strict";
+
+    var v_model = p_model;
+    var v_parent = p_parent;
+    var dataSourceUtils = new DataSourceUtils();
+    var v_desktopData;
+    var v_binder;
+
+    var v_help;
+    var v_requests = [];
+    var v_requestBuilder = new DSHelpToRequest_manual();
+    v_requestBuilder.setRequest(v_requests);
+
+    var v_this = this;
+
+    ///////////////////// GENERAL FUNCTIONS /////////////////////
+
+    this.init = function(p_callback) {
+        function helpArrived(ok, help) {
+            if (ok) {
+                v_help = help;
+                p_callback(true);
+            } else {
+                p_callback(false, "Error getting help");
+            }
+        }
+
+        v_model.getDsRestAPI().getHelp(helpArrived);
+    };
+
+    this.setBinder = function(p_binder) {
+        v_binder = p_binder;
+    };
+
+    this.setSetup = function(setup) {
+        v_requests = setup.request.getData();
+        v_requestBuilder.setRequest(v_requests);
+    };
+    
+    this.modelChanged = function() {
+        if (v_binder)
+            v_binder.modelChanged();
+    }
+
+    ///////////////////// FUNCTIONS FOR VIEW VISUALIZATION /////////////////////
+
+    this.getHelp = function(refresh, toSort, elementIcon) {
+        function helpArrived(ok, p_help) {
+            if (ok) {
+                v_help = p_help;
+                var help = new HelpTreeBuilder(mcopy(v_help)).getHelpTree(toSort);
+                v_requestBuilder.setHelp(help);
+                var jsTreeData = dataSourceUtils.convertHelpToTreeDataArray(help.sources, elementIcon);
+                refresh(jsTreeData);
+            } else {
+                alert("Failed to get help");
+                refresh([]);
+            }
+        }
+        v_model.getDsRestAPI().getHelp(helpArrived);
+    };
+
+    this.getRawHelp = function() {
+        return v_help;
+    };
+
+    this.getRequestTree = function(refresh) {
+        var jsTreeData = dataSourceUtils.convertRequestToTreeDataArray(v_requests);
+        refresh(jsTreeData);
+    };
+
+    this.getFilterAsTree = function(p_path) {
+        var filter = v_requestBuilder.getFilterPart(p_path, []);
+        var treeData = [];
+        if (filter != undefined) {
+            traverseFilter(filter, treeData);
+        }
+        return treeData;
+    };
+
+    function traverseFilter(filter, treeData, paramName) {
+        var treeNode;
+        var treeNodeText = "";
+        if (paramName != undefined) {
+            treeNodeText = paramName + ": ";
+        }
+        if (filter.dataValue != undefined) {
+            treeNode = {"text": treeNodeText + filter.dataValue};
+            treeData.push(treeNode);
+        } else if (filter.request != undefined) {
+            treeNode = {"text": treeNodeText + filter.request.element, "children": []};
+            treeData.push(treeNode);
+            if (filter.request.params != undefined && filter.request.params.length > 0) {
+                for (var i = 0; i < filter.request.params.length; ++i) {
+                    traverseFilter(filter.request.params[i].paramValue, treeNode.children, filter.request.params[i].paramName);
+                }
+            }
+            if (filter.request.remapTo != undefined) {
+                traverseFilter(filter.request.remapTo, treeNode.children, "remapTo");
+            }
+        }
+    }
+
+    this.findSelectionsAndFilters = function() {
+        traverseRequest(v_requests, [], selectionOrFilterChanged);
+    };
+
+    function selectionOrFilterChanged(node, path) {
+        if (node.getData)
+            v_binder.selectionOrFilterChanged(path, node.getData.selection != undefined, node.getData.filter != undefined, node.getData.rangeFilter != undefined, node.getData.writableInfo != undefined, "getData");
+        else if (node.setData)
+            v_binder.selectionOrFilterChanged(path, node.setData.selection != undefined, node.setData.filter != undefined, node.setData.rangeFilter != undefined, node.setData.writableInfo != undefined, "setData");
+    }
+
+    function traverseRequest(list, path, processGetData) {
+        for (var i = 0; i < list.length; ++i) {
+            path.push(i);
+            processGetData(list[i], path);
+            if (list[i].getData && list[i].getData.children != undefined) {
+                traverseRequest(list[i].getData.children, path, processGetData);
+            } else if (list[i].setData && list[i].setData.children != undefined) {
+                traverseRequest(list[i].setData.children, path, processGetData);
+            }
+            path.pop();
+        }
+    }
+
+    this.selectionAdded = function(p_path) {
+        var request = v_this.getRequestFromPath(p_path);
+        if (request.getData.selection == undefined) {
+            request.getData.selection = [0];
+        }
+        selectionOrFilterChanged(request, p_path);
+        v_parent.setupChanged("Selection added");
+    };
+
+    this.setDesktopData = function(p_data) {
+        v_desktopData = p_data;
+    };
+
+    this.getDesktopData = function() {
+        return v_desktopData;
+    };
+
+    this.getRequestSchema = function() {
+        return v_model.getRequestSchema();
+    }
+
+    this.getMetaSchema = function() {
+        return v_model.getMetaSchema();
+    }
+
+    ///////////////////// FUNCTIONS FOR REQUEST EDITING /////////////////////
+
+    this.createRequest = function(p_helpPath, p_position, partialRefresh) {
+        var request = v_requestBuilder.createRequest(p_helpPath, p_position);
+        partialRefresh([p_position], dataSourceUtils.convertRequestToTreeDataArray([request])[0]);
+        v_parent.setupChanged('Request added: "' + request.getData.element + '"');
+    };
+
+    this.createEmptyRequest = function(p_position, partialRefresh) {
+        var request = v_requestBuilder.createEmptyRequest(p_position);
+        partialRefresh([p_position], dataSourceUtils.convertRequestToTreeDataArray([request])[0]);
+        v_parent.setupChanged("Empty request added");
+    };
+
+    this.addChildRequest = function(p_helpPath, p_requestPath, p_position, partialRefresh) {
+        var childRequest = v_requestBuilder.addChildRequest(p_helpPath, mcopy(p_requestPath), p_position);
+        p_requestPath.push(p_position);
+        partialRefresh(p_requestPath, dataSourceUtils.convertRequestToTreeDataArray([childRequest])[0]);
+        v_parent.setupChanged('Child request added: "' + childRequest.getData.element + '"');
+    };
+
+    this.addEmptyChildRequest = function(p_requestPath, p_position, partialRefresh) {
+        var childRequest = v_requestBuilder.addEmptyChildRequest(mcopy(p_requestPath), p_position);
+        p_requestPath.push(p_position);
+        partialRefresh(p_requestPath, dataSourceUtils.convertRequestToTreeDataArray([childRequest])[0]);
+        v_parent.setupChanged("Empty child request added");
+    };
+
+    this.copyRequest = function(p_path, partialRefresh) {
+        var childRequest = v_requestBuilder.copyRequest(mcopy(p_path));
+        p_path[p_path.length - 1] += 1;
+        partialRefresh(p_path, dataSourceUtils.convertRequestToTreeDataArray([childRequest])[0]);
+        v_parent.setupChanged('Request copied');
+    };
+
+    this.convertToSizeOf = function(p_path, refresh) {
+        var request = v_this.getRequestFromPath(p_path);
+        if (request.getData)
+            convertTo(request.getData, "sizeOf");
+        else {
+            convertTo(request.setData, "sizeOf");
+            request.getData = request.setData;
+            delete request.setData.content;
+            delete request.setData.tp;
+            delete request.setData;
+        }
+        refresh(p_path, "sizeOf");
+        v_parent.setupChanged('Request converted to "sizeOf"');
+    };
+
+    this.convertToSetData = function(p_path, refresh) {
+        var request = v_this.getRequestFromPath(p_path);
+        if (request.getData) {
+            request.setData = request.getData;
+            request.setData.content = "";
+            request.setData.tp = 0;
+            delete request.getData;
+        } else {
+            request.getData = request.setData;
+            delete request.setData.content;
+            delete request.setData.tp;
+            delete request.setData;
+        }
+        selectionOrFilterChanged(request, p_path);
+        v_parent.setupChanged('Request converted to "setData"');
+    };
+
+    this.convertToDataElementPresent = function(p_path, refresh) {
+        var request = v_this.getRequestFromPath(p_path);
+        if (request.getData)
+            convertTo(request.getData, "dataElementPresent");
+        else {
+            convertTo(request.setData, "dataElementPresent");
+            request.getData = request.setData;
+            delete request.setData.content;
+            delete request.setData.tp;
+            delete request.setData;
+        }
+        refresh(p_path, "dataElementPresent");
+        v_parent.setupChanged('Request converted to "dataElementPresent"');
+    };
+
+    this.matches = function(string, path) {
+        var request = v_requestBuilder.getRequestCopy(path);
+        return JSON.stringify(request).toLowerCase().indexOf(string) != -1;
+    };
+
+    function convertTo(request, p_element) {
+        var source = request.source;
+        var element = request.element;
+        var ptcname = request.ptcname;
+        var params = request.params;
+        if (params == undefined) {
+            params = [];
+        }
+
+        request.source = "DataSource";
+        request.element = p_element;
+        request.ptcname = undefined;
+        request.filter = undefined;
+        request.rangeFilter = undefined;
+        request.params = [{
+            "paramName": "Source",
+            "paramValue": source
+        }, {
+            "paramName": "Element",
+            "paramValue": element
+        }];
+        if (ptcname != undefined) {
+            request.params.push({
+                "paramName": "PTCName",
+                "paramValue": ptcname
+            })
+        }
+
+        for (var i = 0; i < params.length; ++i) {
+            request.params.push({
+                "paramName": "ParamName",
+                "paramValue": params[i].paramName
+            });
+            request.params.push({
+                "paramName": "ParamValue",
+                "paramValue": params[i].paramValue
+            });
+        }
+    }
+
+    this.isValidToAddRequest = v_requestBuilder.isValidToAddRequest;
+    this.isValidToCreateRequest = v_requestBuilder.isValidToCreateRequest;
+    this.isValidToMoveRequest = v_requestBuilder.isValidToMoveRequest;
+
+    this.moveRequest = function(p_fromPath, p_toPath, p_position) {
+        v_requestBuilder.moveRequest(p_fromPath, p_toPath, p_position);
+        v_parent.setupChanged("Request moved");
+    };
+
+    this.deleteRequest = function(data) {
+        v_requestBuilder.deleteRequest(data);
+        v_parent.setupChanged("Request deleted");
+    };
+
+    this.getRequest = v_requestBuilder.getRequest;
+    this.getRequestFromPath = v_requestBuilder.getRequestFromPath;
+    this.getRequestCopy = v_requestBuilder.getRequestCopy;
+
+    ///////////////////// FUNCTIONS FOR FILTER EDITING /////////////////////
+
+    this.getFilterPart = v_requestBuilder.getFilterPart;
+    this.getFilterPartCopy = v_requestBuilder.getFilterPartCopy;
+    this.addFilterPart = function(p_requestPath, p_filterPath, p_paramName) {
+        v_requestBuilder.addFilterPart(p_requestPath, p_filterPath, p_paramName);
+        v_parent.setupChanged("Filter added");
+    };
+    this.deleteFilterPart = function(p_requestPath, p_filterPath) {
+        v_requestBuilder.deleteFilterPart(p_requestPath, p_filterPath);
+        v_parent.setupChanged("Filter deleted");
+    };
+    this.convertFilterPartToRequest = function(p_requestPath, p_filterPath, p_helpPath) {
+        v_requestBuilder.convertFilterPartToRequest(p_requestPath, p_filterPath, p_helpPath);
+        v_parent.setupChanged("Filter type converted to request");
+    };
+    this.convertFilterPartToDataValue = function(p_requestPath, p_filterPath, p_newValue) {
+        v_requestBuilder.convertFilterPartToDataValue(p_requestPath, p_filterPath, p_newValue);
+        v_parent.setupChanged("Filter type converted to data value");
+    };
+    this.isValidToConvertFilterToRequest = v_requestBuilder.isValidToConvertFilterToRequest;
+    this.changeParamNameOfFilterRequest = function(p_requestPath, p_filterPath, p_paramName) {
+        v_requestBuilder.changeParamNameOfFilterRequest(p_requestPath, p_filterPath, p_paramName);
+        v_parent.setupChanged("Filter param name changed");
+    };
+    this.isValidToAddParamToFilterRequest = v_requestBuilder.isValidToAddParamToFilterRequest;
+    this.convertToDataElementPresentInFilter = function(p_requestPath, p_filterPath) {
+        var filter = v_requestBuilder.getFilterPart(p_requestPath, p_filterPath);
+        var params = filter.request.params;
+        convertTo(filter.request, "dataElementPresent");
+        for (var i = 0; i < filter.request.params.length; ++i) {
+            if (filter.request.params[i].paramValue.dataValue == undefined) {
+                filter.request.params[i].paramValue = {"dataValue": filter.request.params[i].paramValue};
+            }
+        }
+        v_parent.setupChanged('Filter element converted to "dataElementPresent"');
+    };
+}
+//# sourceURL=RequestConsole\ViewModels\ViewModel_RequestEditor.js
diff --git a/htdocs/WebApplications/RequestConsole/Views/View_RequestEditor.js b/htdocs/WebApplications/RequestConsole/Views/View_RequestEditor.js
index 03d2b0e..bea5829 100644
--- a/htdocs/WebApplications/RequestConsole/Views/View_RequestEditor.js
+++ b/htdocs/WebApplications/RequestConsole/Views/View_RequestEditor.js
@@ -3,616 +3,618 @@
 // terms of the Eclipse Public License v2.0 which accompanies this distribution, and is available at //
 // https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html                                                         //
 ///////////////////////////////////////////////////////////////////////////////////////////////////////
-function RequestConsole_RequestEditor_View(p_viewModel, p_parent) {

-    "use strict";

-

-    var v_viewModel = p_viewModel.getRequestEditorViewModel();

-    var v_parent = p_parent;

-

-    var v_desktopData;

-    var v_helpTree;

-    var v_requestTree;

-    var v_elementEditor;

-    var v_filterEditor;

-    var v_codeEditor;

-    var v_checkDisabled = false;

-    var v_this = this;

-

-    var jsTreeUtils = new JsTreeUtils();

-    var v_requestSchema;

-    var validate;

-

-    ///////////////////// GENERAL VIEW FUNCTIONS //////////////////////////////

-

-    this.applicationCreated = function() {

-        v_requestSchema = v_viewModel.getRequestSchema();

-        validate = new Ajv({}).compile(v_requestSchema);

-

-        var aligner = new CView_Aligner([], "RequestConsole_RequestEditorSplit", undefined, {

-            "existing": true,

-            "resizable": true

-        });

-        aligner.applicationCreated();

-

-        v_desktopData = v_viewModel.getDesktopData();

-        v_helpTree = $("#RequestConsole_HelpTree");

-        v_requestTree = $("#RequestConsole_RequestTree");

-

-        v_elementEditor = new RequestConsole_ElementEditor_View(p_viewModel, "RequestConsole_Playground", "RequestConsole_ElementEditor", v_this);

-        v_filterEditor = new RequestConsole_FilterEditor_View(p_viewModel, "RequestConsole_Playground", "RequestConsole_FilterEditor", v_this, v_requestTree, v_helpTree);

-        v_codeEditor = new CView_CodeEditor([p_viewModel], 'RequestConsole_CodeEditor_', 'RequestConsole_CodeEditor', {"editorType": "json", "formatAllowed": true, "headerText": "Request As Text:"});

-        v_codeEditor.applicationCreated();

-        v_codeEditor.refresh(true);

-        v_codeEditor.onDataChanged(onCodeEditorDataChanged);

-        v_codeEditor.isValid = function(text) {

-            var data;

-            try {

-                data = JSON.parse(text);

-            } catch (e) {

-                return false;

-            }

-            if (data != undefined) {

-                var isValid = validate({"requests":data});

-                if (!isValid) {

-                    return false;

-                }

-                else {

-                    return true;

-                }

-            }

-        };

-

-        setupCallbacks();

-        v_viewModel.getHelp(createHelpJSTree, v_desktopData["sortHelp"], "WebApplications/RequestConsole/Res/getData.png");

-    };

-

-    function onCodeEditorDataChanged(value) {

-        if (value == "")

-        {

-            return "[]"

-        }

-        else

-            return value;

-    }

-

-    this.getCodeEditorView = function() {

-        return v_codeEditor;

-    };

-

-    this.setFocusedObj = function(p_object) {

-        v_parent.setFocusedObj(p_object);

-    };

-

-    this.setDefaultZidx = function() {};

-    this.setZidx = function() {};

-    this.deletePressed = function() {

-        var selected = v_requestTree.jstree("get_selected")[0];

-        if (selected != undefined) {

-            deleteNode(selected);

-        }

-    };

-

-    this.fullRefresh = function() {

-        v_desktopData = v_viewModel.getDesktopData();

-        function viewsInitialized() {

-            v_parent.toggleButtons(true);

-

-            $(document).on("keydown", toggleValidation);

-            $(document).on("keyup", toggleValidation);

-        }

-

-        var taskList = new TaskList([new GenericTask(createViewElements)], viewsInitialized);

-        taskList.taskOperation();

-    };

-

-    this.destroy = function() {

-        closeEditors();

-        $(document).off('dnd_move.vakata', helpToRequestDrag);

-        $(document).off('dnd_stop.vakata', helpToRequestDrop);

-        $(document).off('dnd_stop.vakata', requestToHelpDrop);

-        $(document).off("keydown", toggleValidation);

-        $(document).off("keyup", toggleValidation);

-        v_requestTree.jstree("destroy");

-    };

-

-    this.search = function(string) {

-        var nodes = $("#RequestConsole_RequestTree li");

-        for (var i = 0; i < nodes.length; ++i) {

-            var path = jsTreeUtils.getPath(v_requestTree.jstree("get_node", $(nodes[i]))).path;

-            if (v_viewModel.matches(string, path)) {

-                $(nodes[i]).addClass("found");

-            }

-        }

-    };

-

-    ///////////////////// INTERACTION WITH OUTHER VIEWS //////////////////////////////

-

-    this.getRequestTree = function() {

-        return v_requestTree;

-    };

-

-    this.requestRenamed = function(p_path, name) {

-        v_requestTree.jstree("rename_node", jsTreeUtils.getLastNodeIdFromPath(v_requestTree, p_path), name);

-    };

-

-    this.selectionAdded = function(path) {

-        v_viewModel.selectionAdded(path);

-    };

-

-    this.selectionOrFilterChanged = function(p_path, p_selection, p_filter, p_rangeFilter, p_writableInfo, p_getOrSetData) {

-        var id = jsTreeUtils.getNodeIdFromPath(v_requestTree, mcopy(p_path));

-        if (id !== false) {

-            $("#" + id).removeClass("RequestConsole_NodeWithData RequestConsole_NodeWithSelection RequestConsole_NodeWithFilter RequestConsole_NodeWithRangeFilter RequestConsole_NodeWithWritableInfo");

-            var hasData = false

-            if (p_selection) {

-                $("#" + id).addClass("RequestConsole_NodeWithSelection");

-                hasData = true;

-            }

-            if (p_filter) {

-                $("#" + id).addClass("RequestConsole_NodeWithFilter");

-                hasData = true;

-            }

-            if (p_rangeFilter) {

-                $("#" + id).addClass("RequestConsole_NodeWithRangeFilter");

-                hasData = true;

-            }

-            if (p_writableInfo) {

-                $("#" + id).addClass("RequestConsole_NodeWithWritableInfo");

-                hasData = true;

-            }

-            if (hasData) {

-                $("#" + id).addClass("RequestConsole_NodeWithData");

-            }

-            if (p_getOrSetData) {

-                var shiftString = "";

-                if (hasData)

-                    shiftString = "S";

-                $("#RequestConsole_RequestTree").jstree(true).set_icon(id, "WebApplications/RequestConsole/Res/" + p_getOrSetData + shiftString + ".png");

-            }

-        }

-    };

-

-    ///////////////////// CREATING VIEW ELEMENTS AND INTERACTIONS //////////////////////////////

-

-    function createViewElements(callback) {

-        v_viewModel.getRequestTree(function(data) {

-            createRequestJSTree(data, callback);

-        });

-    }

-

-    function createHelpJSTree(p_data) {

-        v_helpTree.jstree("destroy");

-        v_helpTree = v_helpTree.jstree({

-            "core": {

-                "data": p_data,

-                "check_callback" : function(operation, node, node_parent, node_position, more) {

-                     if (operation === "copy_node" || operation === "move_node") {

-                         return false;

-                     } else {

-                         return true;

-                     }

-                },

-                "multiple" : false,

-                "animation": false,

-                "worker": false

-            },

-            "plugins" : ["search", "dnd", "types"],

-            "search" : {

-                "show_only_matches": true

-            },

-            "dnd": {

-                "always_copy": true

-            }

-        });

-

-        $(document).off('dnd_stop.vakata', requestToHelpDrop);

-        $(document).on('dnd_stop.vakata', requestToHelpDrop);

-

-        v_helpTree.bind("hover_node.jstree", function(e, data) {

-            $("#"+data.node.id).prop("title", data.node.data);

-        });

-    }

-

-    function createRequestJSTree(p_data, p_callback) {

-        v_requestTree.jstree("destroy");

-        v_requestTree = v_requestTree.jstree({

-            "core": {

-                "data": p_data,

-                "check_callback": function(operation, node, node_parent, node_position, more) {

-                    if (operation === "copy_node" && v_checkDisabled && jsTreeUtils.isNodeFromTree(node, v_helpTree) && jsTreeUtils.getDepth(node, v_helpTree) > 1 && $("#RequestConsole_RequestTree > ul").children().length > 0) {

-                        return true;

-                    } else if (operation === "copy_node" && jsTreeUtils.isNodeFromTree(node, v_helpTree) && $("#RequestConsole_RequestTree > ul").children().length > 0) {

-                        return dragFromHelpValidate(node.id, node_parent.id);

-                    } else if (operation === "copy_node" && jsTreeUtils.isNodeFromTree(node, v_requestTree)) {

-                        return dragFromRequestValidate(node.id, node_parent.id);

-                    } else if (operation === "copy_node" && node.text === "Selection connections" && node_parent.id != "#") {

-                        return true;

-                    } else if (operation === "copy_node" && node.text === "Request connection" && node_parent.id != "#") {

-                        return true;

-                    } else if (operation === "copy_node") {

-                        return false;

-                    } else {

-                        return true;

-                    }

-                },

-                "multiple": false,

-                "animation": false,

-                "worker": false

-            },

-            "plugins": ["contextmenu", "dnd"],

-            "dnd": {

-                "always_copy": true

-            },

-            "contextmenu": {

-                "items": function($node) {

-                    return {

-                        "Edit": {

-                            "label": "Edit request",

-                            "action": function(data) {

-                                var offset = data.reference.offset();

-                                offset.left += data.reference.width();

-

-                                v_elementEditor.open(jsTreeUtils.getPath(v_requestTree.jstree("get_node", data.reference)).path, offset);

-                                v_parent.setFocusedObj(v_elementEditor);

-                            }

-                        },

-                        "EditFilter": {

-                            "label": "Edit filter",

-                            "action": function(data) {

-                                var offset = data.reference.offset();

-                                offset.left += data.reference.width();

-

-                                var node = v_requestTree.jstree("get_node", data.reference);

-                                v_filterEditor.open(jsTreeUtils.getPath(node).path, offset);

-                                v_parent.setFocusedObj(v_filterEditor);

-                            },

-                            "separator_after": true

-                        },

-                        "Add": {

-                            "label": "Add child request",

-                            "action": function(data) {

-                                var path = jsTreeUtils.getPath(v_requestTree.jstree("get_node", data.reference)).path;

-                                v_viewModel.addEmptyChildRequest(mcopy(path), 0, partialRefresh);

-                                path.push(0);

-                                var added = jsTreeUtils.getLastNodeIdFromPath(v_requestTree, path);

-                                v_requestTree.jstree("deselect_node", data.reference)

-                                v_requestTree.jstree("select_node", added);

-

-                                var offset = $("#" + added + "_anchor").offset();

-                                offset.left += $("#" + added + "_anchor").width();

-

-                                v_elementEditor.open(path, offset);

-                                v_parent.setFocusedObj(v_elementEditor);

-                            }

-                        },

-                        "Copy": {

-                            "label": "Copy",

-                            "action": function(data) {

-                                var path = jsTreeUtils.getPath(v_requestTree.jstree("get_node", data.reference)).path;

-                                v_viewModel.copyRequest(mcopy(path), partialRefresh);

-                                path[path.length - 1] += 1;

-                                var added = jsTreeUtils.getLastNodeIdFromPath(v_requestTree, path);

-                                v_requestTree.jstree("deselect_node", data.reference)

-                                v_requestTree.jstree("select_node", added);

-                            }

-                        },

-                        "Delete": {

-                            "label": "Delete",

-                            "action": function(data) {

-                                deleteNode(data.reference);

-                            },

-                            "separator_after": true

-                        },

-                        "SizeOf": {

-                            "label": "Convert to sizeOf",

-                            "action": function(data) {

-                                var path = jsTreeUtils.getPath(v_requestTree.jstree("get_node", data.reference)).path;

-                                v_viewModel.convertToSizeOf(path, v_this.requestRenamed);

-                            }

-                        },

-                        "SetData": {

-                            "label": "Convert to setData or getData",

-                            "action": function(data) {

-                                var path = jsTreeUtils.getPath(v_requestTree.jstree("get_node", data.reference)).path;

-                                v_viewModel.convertToSetData(path, v_this.requestRenamed);

-                            }

-                        },

-                        "ElementPresent": {

-                            "label": "Convert to dataElementPresent",

-                            "action": function(data) {

-                                var path = jsTreeUtils.getPath(v_requestTree.jstree("get_node", data.reference)).path;

-                                v_viewModel.convertToDataElementPresent(path, v_this.requestRenamed);

-                            },

-                            "separator_after": true

-                        },

-                        "ExpandAll": {

-                            "label": "Expand all",

-                            "action": function(data) {

-                                v_requestTree.jstree("open_all");

-                            }

-                        },

-                        "CollapseAll": {

-                            "label": "Collapse all",

-                            "action": function(data) {

-                                v_requestTree.jstree("close_all");

-                            },

-                            "separator_after": true

-                        },

-                        "CopyRequestAsText": {

-                            "label": "Copy Request as Text",

-                            "action": function(data) {

-                                var text = JSON.stringify(v_viewModel.getRequest(), null, 4);

-

-                                var textArea = document.createElement("textarea");

-                                textArea.style.position = 'fixed';

-                                textArea.style.top = 0;

-                                textArea.style.left = 0;

-                                textArea.style.width = '2em';

-                                textArea.style.height = '2em';

-                                textArea.style.padding = 0;

-                                textArea.style.border = 'none';

-                                textArea.style.outline = 'none';

-                                textArea.style.boxShadow = 'none';

-                                textArea.style.background = 'transparent';

-                                textArea.value = text;

-

-                                document.body.appendChild(textArea);

-                                textArea.select();

-                                document.execCommand('copy');

-                                document.body.removeChild(textArea);

-                            }

-                        }

-                    };

-                },

-                "select_node": true

-            }

-        });

-

-        v_requestTree.bind("hover_node.jstree", function(e, data) {

-            var string = JSON.stringify(v_viewModel.getRequestCopy(jsTreeUtils.getPath(v_requestTree.jstree("get_node", data.node.id)).path), null, 4);

-            $("#"+data.node.id).prop("title", string);

-        });

-

-        v_requestTree.bind("select_node.jstree", function (e, data) {

-            closeEditors();

-            v_parent.setFocusedObj(v_this);

-        });

-

-        v_requestTree.bind("copy_node.jstree", function(e, data) {

-            if (jsTreeUtils.isNodeFromTree(data.original, v_helpTree)) {

-                helpNodeCopied(data);

-            } else if (jsTreeUtils.isNodeFromTree(data.original, v_requestTree)) {

-                requestNodeCopied(data);

-            } else if (data.original.text === "Selection connections") {

-                v_requestTree.jstree("delete_node", data.node.id);

-            } else if (data.original.text === "Request connection") {

-                v_requestTree.jstree("delete_node", data.node.id);

-            }

-        });

-

-        jsTreeUtils.openNodes(v_requestTree, v_desktopData.openRequests);

-

-        v_requestTree.bind("after_open.jstree after_close.jstree", function(e, data) {

-            v_desktopData.openRequests = jsTreeUtils.findOpenNodes(v_requestTree);

-        });

-

-        v_requestTree.bind("after_open.jstree delete_node.jstree ready.jstree", function(e, data) {

-            // some operations are async and even their callback gets called too soon... so we have to use a timeout

-            // after_open, when we open a node, or when we insert one, delete_node, when we delete a node, and ready when the tree gets drawn in the beginning

-            setTimeout(function() {

-                v_viewModel.findSelectionsAndFilters();

-            }, 100);

-        });

-

-        v_requestTree.bind("ready.jstree", function(e, data) {

-            p_callback(true);

-        });

-

-        $(document).off('dnd_move.vakata', helpToRequestDrag);

-        $(document).on('dnd_move.vakata', helpToRequestDrag);

-

-        $(document).off('dnd_stop.vakata', helpToRequestDrop);

-        $(document).on('dnd_stop.vakata', helpToRequestDrop);

-    }

-

-    function helpToRequestDrag(event, data) {

-        var node = {

-            "id": data.data.nodes[0]

-        }

-        if ($(data.event.target).attr("id") == "RequestConsole_RequestTree" && jsTreeUtils.isNodeFromTree(node, v_helpTree) && (v_checkDisabled || dragFromHelpValidate(data.data.nodes[0], "#"))) {

-            data.helper.find('.jstree-icon').removeClass('jstree-er').addClass('jstree-ok');

-        }

-    }

-

-    function helpToRequestDrop(event, data) {

-        var node = {

-            "id": data.data.nodes[0]

-        }

-        if ($(data.event.target).attr("id") == "RequestConsole_RequestTree" && jsTreeUtils.isNodeFromTree(node, v_helpTree) && (v_checkDisabled || dragFromHelpValidate(data.data.nodes[0], "#"))) {

-            var helpPath = jsTreeUtils.getPath(v_helpTree.jstree("get_node", node.id)).path;

-            var position = $("#RequestConsole_RequestTree > ul").children().length;

-            v_viewModel.createRequest(helpPath, position, partialRefresh);

-            v_viewModel.findSelectionsAndFilters();

-        }

-    }

-

-    function requestToHelpDrop(event, data) {

-        var node = {

-            "id": data.data.nodes[0]

-        }

-        if (($(data.event.target).attr("id") == "RequestConsole_HelpTree" || jsTreeUtils.isNodeFromTree({"id": $(data.event.target).attr("id")}, v_helpTree)) && jsTreeUtils.isNodeFromTree({"id": data.data.nodes[0]}, v_requestTree)) {

-            deleteNode(v_requestTree.jstree("get_node", node.id));

-        }

-    }

-

-    function setupCallbacks() {

-        $("#RequestConsole_HelpSearch").on("input", function() {

-            v_helpTree.jstree("search", $(this).val());

-        });

-        $("#RequestConsole_Button_AddRequest").on("click", addEmptyRequest);

-

-        $("#RequestConsole_SortHelpTree").button().click(function(event, ui) {

-            if($(this).prop('checked')) {

-                v_viewModel.getHelp(createHelpJSTree, true, "WebApplications/RequestConsole/Res/getData.png");

-                v_desktopData["sortHelp"] = true;

-            } else {

-                v_viewModel.getHelp(createHelpJSTree, false, "WebApplications/RequestConsole/Res/getData.png");

-                v_desktopData["sortHelp"] = false;

-            }

-        });

-

-        if (v_desktopData["sortHelp"]) {

-            $("#RequestConsole_SortHelpTree").prev().addClass('ui-state-active');

-            $("#RequestConsole_SortHelpTree").prop('checked', true);

-        }

-    }

-

-    function partialRefresh(p_path, p_data) {

-        var parentId = getParentNodeIdFromPath(p_path);

-        v_requestTree.jstree("create_node", parentId, p_data.text, p_path[p_path.length - 1]);

-        v_requestTree.jstree("open_node", parentId);

-    }

-

-    function closeEditors() {

-        v_elementEditor.close();

-        v_filterEditor.close();

-        v_viewModel.findSelectionsAndFilters();

-    }

-

-    ///////////////////// HANDLING EVENTS //////////////////////////////

-

-    function helpNodeCopied(data) {

-        closeEditors();

-        v_requestTree.jstree("delete_node", data.node.id);

-        var helpPath = jsTreeUtils.getPath(v_helpTree.jstree("get_node", data.original.id)).path;

-        if (data.parent === "#") {

-            v_viewModel.createRequest(helpPath, data.position, partialRefresh);

-        } else {

-            var requestPath = jsTreeUtils.getPath(v_requestTree.jstree("get_node", data.parent)).path;

-            v_viewModel.addChildRequest(helpPath, requestPath, data.position, partialRefresh);

-        }

-    }

-

-    function requestNodeCopied(data) {

-        closeEditors();

-        v_requestTree.jstree("delete_node", data.node.id);

-        var fromPathObj = jsTreeUtils.getPath(v_requestTree.jstree("get_node", data.original.id));

-        var fromPath = fromPathObj.path;

-        var fromPathStr = fromPathObj.strpath;

-        var toPath = [];

-        var toPathStr = "";

-        if (data.parent != "#") {

-            var toPathObj = jsTreeUtils.getPath(v_requestTree.jstree("get_node", data.parent));

-            toPath = toPathObj.path;

-            toPathStr = toPathObj.strpath;

-        }

-        v_viewModel.moveRequest(fromPath, toPath, data.position);

-

-        function moveComplete(node, parent, pos) {

-            toPath.push(data.position);

-            v_requestTree.jstree("open_node", parent);

-        }

-

-        v_requestTree.jstree("move_node", v_requestTree.jstree("get_node", data.original.id), v_requestTree.jstree("get_node", data.parent), data.position, moveComplete);

-    }

-

-    function dragFromHelpValidate(p_helpId, p_requestParentId) {

-        var helpPath = jsTreeUtils.getPath(v_helpTree.jstree("get_node", p_helpId)).path;

-        if (p_requestParentId === "#") {

-            return v_viewModel.isValidToCreateRequest(helpPath);

-        } else {

-            var requestPath = jsTreeUtils.getPath(v_requestTree.jstree("get_node", p_requestParentId)).path;

-            return v_viewModel.isValidToAddRequest(helpPath, requestPath);

-        }

-    }

-

-    function dragFromRequestValidate(p_fromId, p_toId) {

-        var fromPath = jsTreeUtils.getPath(v_requestTree.jstree("get_node", p_fromId)).path;

-        var toPath;

-        if (p_toId != "#") {

-            toPath = jsTreeUtils.getPath(v_requestTree.jstree("get_node", p_toId)).path;

-        } else {

-            toPath = [];

-        }

-

-        return v_viewModel.isValidToMoveRequest(fromPath, toPath);

-    }

-

-    function getParentNodeIdFromPath(p_path) {

-        if (p_path.length === 1) {

-            return "#";

-        } else {

-            var id = "#";

-            for (var i = 0; i < p_path.length - 1; ++i) {

-                id = v_requestTree.jstree("get_node", id).children[p_path[i]];

-            }

-            return id;

-        }

-    }

-

-    function addEmptyRequest() {

-        closeEditors();

-

-        v_viewModel.createEmptyRequest(0, partialRefresh);

-        v_requestTree.jstree("deselect_node", v_requestTree.jstree("get_selected"));

-        var newNodeId = jsTreeUtils.getLastNodeIdFromPath(v_requestTree, [0]);

-        v_requestTree.jstree("select_node", newNodeId);

-

-        var offset = $("#" + newNodeId + "_anchor").offset();

-        offset.left += $("#" + newNodeId + "_anchor").width();

-

-        v_elementEditor.open([0], offset);

-        v_parent.setFocusedObj(v_elementEditor);

-    }

-

-    function deleteNode(p_data) {

-        var path = jsTreeUtils.getPath(v_requestTree.jstree("get_node", p_data)).path;

-        v_viewModel.deleteRequest(mcopy(path));

-

-        v_requestTree.jstree("delete_node", p_data);

-        closeEditors();

-

-        v_desktopData.openRequests = jsTreeUtils.findOpenNodes(v_requestTree);

-    }

-

-    function toggleValidation(event) {

-        if (event.keyCode == 17) {

-            if (event.type == "keydown") {

-                v_checkDisabled = true;

-            } else {

-                v_checkDisabled = false;

-            }

-        }

-    }

-

-    ///////////////////// CONNECTION RELATED /////////////////////

-

-    function RequestEndpoint(p_identifier) {

-        var v_identifier = p_identifier;

-

-        this.getOffset = function() {

-

-            var id = jsTreeUtils.getLastNodeIdFromPath(v_requestTree, v_identifier());

-            var htmlObj = $("#" + id + "_anchor");

-

-            var offset = htmlObj.offset();

-            offset.top += htmlObj.height() / 2;

-            offset.left += htmlObj.width()

-            return offset;

-        };

-

-        this.object = v_this;

-    }

-

-    this.getEndpoint = function(identifier) {

-        return new RequestEndpoint(identifier);

-    };

-

-    this.getConnectionInformation = function(identifier) {

-        return jsTreeUtils.getPath(v_requestTree.jstree("get_node", identifier));

-    };

-

-    this.disabled = function() {};

-}

-

-//# sourceURL=RequestConsole\Views\View_RequestEditor.js

+function RequestConsole_RequestEditor_View(p_viewModel, p_parent) {
+    "use strict";
+
+    var v_viewModel = p_viewModel.getRequestEditorViewModel();
+    var v_parent = p_parent;
+
+    var v_desktopData;
+    var v_helpTree;
+    var v_requestTree;
+    var v_elementEditor;
+    var v_filterEditor;
+    var v_codeEditor;
+    var v_checkDisabled = false;
+    var v_this = this;
+
+    var jsTreeUtils = new JsTreeUtils();
+    var v_requestSchema;
+    var v_ajv_validator;
+
+    ///////////////////// GENERAL VIEW FUNCTIONS //////////////////////////////
+
+    this.applicationCreated = function() {
+        v_requestSchema = v_viewModel.getRequestSchema();
+        v_ajv_validator = new Ajv({schemaId: 'id'});
+        var metasch = v_viewModel.getMetaSchema();
+        v_ajv_validator.addMetaSchema(metasch);
+
+        var aligner = new CView_Aligner([], "RequestConsole_RequestEditorSplit", undefined, {
+            "existing": true,
+            "resizable": true
+        });
+        aligner.applicationCreated();
+
+        v_desktopData = v_viewModel.getDesktopData();
+        v_helpTree = $("#RequestConsole_HelpTree");
+        v_requestTree = $("#RequestConsole_RequestTree");
+
+        v_elementEditor = new RequestConsole_ElementEditor_View(p_viewModel, "RequestConsole_Playground", "RequestConsole_ElementEditor", v_this);
+        v_filterEditor = new RequestConsole_FilterEditor_View(p_viewModel, "RequestConsole_Playground", "RequestConsole_FilterEditor", v_this, v_requestTree, v_helpTree);
+        v_codeEditor = new CView_CodeEditor([p_viewModel], 'RequestConsole_CodeEditor_', 'RequestConsole_CodeEditor', {"editorType": "json", "formatAllowed": true, "headerText": "Request As Text:"});
+        v_codeEditor.applicationCreated();
+        v_codeEditor.refresh(true);
+        v_codeEditor.onDataChanged(onCodeEditorDataChanged);
+        v_codeEditor.isValid = function(text) {
+            var data;
+            try {
+                data = JSON.parse(text);
+            } catch (e) {
+                return false;
+            }
+            if (data != undefined) {
+                var isValid = v_ajv_validator.validate(v_requestSchema, {"requests":data});
+                if (!isValid) {
+                    return false;
+                }
+                else {
+                    return true;
+                }
+            }
+        };
+
+        setupCallbacks();
+        v_viewModel.getHelp(createHelpJSTree, v_desktopData["sortHelp"], "WebApplications/RequestConsole/Res/getData.png");
+    };
+
+    function onCodeEditorDataChanged(value) {
+        if (value == "")
+        {
+            return "[]"
+        }
+        else
+            return value;
+    }
+
+    this.getCodeEditorView = function() {
+        return v_codeEditor;
+    };
+
+    this.setFocusedObj = function(p_object) {
+        v_parent.setFocusedObj(p_object);
+    };
+
+    this.setDefaultZidx = function() {};
+    this.setZidx = function() {};
+    this.deletePressed = function() {
+        var selected = v_requestTree.jstree("get_selected")[0];
+        if (selected != undefined) {
+            deleteNode(selected);
+        }
+    };
+
+    this.fullRefresh = function() {
+        v_desktopData = v_viewModel.getDesktopData();
+        function viewsInitialized() {
+            v_parent.toggleButtons(true);
+
+            $(document).on("keydown", toggleValidation);
+            $(document).on("keyup", toggleValidation);
+        }
+
+        var taskList = new TaskList([new GenericTask(createViewElements)], viewsInitialized);
+        taskList.taskOperation();
+    };
+
+    this.destroy = function() {
+        closeEditors();
+        $(document).off('dnd_move.vakata', helpToRequestDrag);
+        $(document).off('dnd_stop.vakata', helpToRequestDrop);
+        $(document).off('dnd_stop.vakata', requestToHelpDrop);
+        $(document).off("keydown", toggleValidation);
+        $(document).off("keyup", toggleValidation);
+        v_requestTree.jstree("destroy");
+    };
+
+    this.search = function(string) {
+        var nodes = $("#RequestConsole_RequestTree li");
+        for (var i = 0; i < nodes.length; ++i) {
+            var path = jsTreeUtils.getPath(v_requestTree.jstree("get_node", $(nodes[i]))).path;
+            if (v_viewModel.matches(string, path)) {
+                $(nodes[i]).addClass("found");
+            }
+        }
+    };
+
+    ///////////////////// INTERACTION WITH OUTHER VIEWS //////////////////////////////
+
+    this.getRequestTree = function() {
+        return v_requestTree;
+    };
+
+    this.requestRenamed = function(p_path, name) {
+        v_requestTree.jstree("rename_node", jsTreeUtils.getLastNodeIdFromPath(v_requestTree, p_path), name);
+    };
+
+    this.selectionAdded = function(path) {
+        v_viewModel.selectionAdded(path);
+    };
+
+    this.selectionOrFilterChanged = function(p_path, p_selection, p_filter, p_rangeFilter, p_writableInfo, p_getOrSetData) {
+        var id = jsTreeUtils.getNodeIdFromPath(v_requestTree, mcopy(p_path));
+        if (id !== false) {
+            $("#" + id).removeClass("RequestConsole_NodeWithData RequestConsole_NodeWithSelection RequestConsole_NodeWithFilter RequestConsole_NodeWithRangeFilter RequestConsole_NodeWithWritableInfo");
+            var hasData = false
+            if (p_selection) {
+                $("#" + id).addClass("RequestConsole_NodeWithSelection");
+                hasData = true;
+            }
+            if (p_filter) {
+                $("#" + id).addClass("RequestConsole_NodeWithFilter");
+                hasData = true;
+            }
+            if (p_rangeFilter) {
+                $("#" + id).addClass("RequestConsole_NodeWithRangeFilter");
+                hasData = true;
+            }
+            if (p_writableInfo) {
+                $("#" + id).addClass("RequestConsole_NodeWithWritableInfo");
+                hasData = true;
+            }
+            if (hasData) {
+                $("#" + id).addClass("RequestConsole_NodeWithData");
+            }
+            if (p_getOrSetData) {
+                var shiftString = "";
+                if (hasData)
+                    shiftString = "S";
+                $("#RequestConsole_RequestTree").jstree(true).set_icon(id, "WebApplications/RequestConsole/Res/" + p_getOrSetData + shiftString + ".png");
+            }
+        }
+    };
+
+    ///////////////////// CREATING VIEW ELEMENTS AND INTERACTIONS //////////////////////////////
+
+    function createViewElements(callback) {
+        v_viewModel.getRequestTree(function(data) {
+            createRequestJSTree(data, callback);
+        });
+    }
+
+    function createHelpJSTree(p_data) {
+        v_helpTree.jstree("destroy");
+        v_helpTree = v_helpTree.jstree({
+            "core": {
+                "data": p_data,
+                "check_callback" : function(operation, node, node_parent, node_position, more) {
+                     if (operation === "copy_node" || operation === "move_node") {
+                         return false;
+                     } else {
+                         return true;
+                     }
+                },
+                "multiple" : false,
+                "animation": false,
+                "worker": false
+            },
+            "plugins" : ["search", "dnd", "types"],
+            "search" : {
+                "show_only_matches": true
+            },
+            "dnd": {
+                "always_copy": true
+            }
+        });
+
+        $(document).off('dnd_stop.vakata', requestToHelpDrop);
+        $(document).on('dnd_stop.vakata', requestToHelpDrop);
+
+        v_helpTree.bind("hover_node.jstree", function(e, data) {
+            $("#"+data.node.id).prop("title", data.node.data);
+        });
+    }
+
+    function createRequestJSTree(p_data, p_callback) {
+        v_requestTree.jstree("destroy");
+        v_requestTree = v_requestTree.jstree({
+            "core": {
+                "data": p_data,
+                "check_callback": function(operation, node, node_parent, node_position, more) {
+                    if (operation === "copy_node" && v_checkDisabled && jsTreeUtils.isNodeFromTree(node, v_helpTree) && jsTreeUtils.getDepth(node, v_helpTree) > 1 && $("#RequestConsole_RequestTree > ul").children().length > 0) {
+                        return true;
+                    } else if (operation === "copy_node" && jsTreeUtils.isNodeFromTree(node, v_helpTree) && $("#RequestConsole_RequestTree > ul").children().length > 0) {
+                        return dragFromHelpValidate(node.id, node_parent.id);
+                    } else if (operation === "copy_node" && jsTreeUtils.isNodeFromTree(node, v_requestTree)) {
+                        return dragFromRequestValidate(node.id, node_parent.id);
+                    } else if (operation === "copy_node" && node.text === "Selection connections" && node_parent.id != "#") {
+                        return true;
+                    } else if (operation === "copy_node" && node.text === "Request connection" && node_parent.id != "#") {
+                        return true;
+                    } else if (operation === "copy_node") {
+                        return false;
+                    } else {
+                        return true;
+                    }
+                },
+                "multiple": false,
+                "animation": false,
+                "worker": false
+            },
+            "plugins": ["contextmenu", "dnd"],
+            "dnd": {
+                "always_copy": true
+            },
+            "contextmenu": {
+                "items": function($node) {
+                    return {
+                        "Edit": {
+                            "label": "Edit request",
+                            "action": function(data) {
+                                var offset = data.reference.offset();
+                                offset.left += data.reference.width();
+
+                                v_elementEditor.open(jsTreeUtils.getPath(v_requestTree.jstree("get_node", data.reference)).path, offset);
+                                v_parent.setFocusedObj(v_elementEditor);
+                            }
+                        },
+                        "EditFilter": {
+                            "label": "Edit filter",
+                            "action": function(data) {
+                                var offset = data.reference.offset();
+                                offset.left += data.reference.width();
+
+                                var node = v_requestTree.jstree("get_node", data.reference);
+                                v_filterEditor.open(jsTreeUtils.getPath(node).path, offset);
+                                v_parent.setFocusedObj(v_filterEditor);
+                            },
+                            "separator_after": true
+                        },
+                        "Add": {
+                            "label": "Add child request",
+                            "action": function(data) {
+                                var path = jsTreeUtils.getPath(v_requestTree.jstree("get_node", data.reference)).path;
+                                v_viewModel.addEmptyChildRequest(mcopy(path), 0, partialRefresh);
+                                path.push(0);
+                                var added = jsTreeUtils.getLastNodeIdFromPath(v_requestTree, path);
+                                v_requestTree.jstree("deselect_node", data.reference)
+                                v_requestTree.jstree("select_node", added);
+
+                                var offset = $("#" + added + "_anchor").offset();
+                                offset.left += $("#" + added + "_anchor").width();
+
+                                v_elementEditor.open(path, offset);
+                                v_parent.setFocusedObj(v_elementEditor);
+                            }
+                        },
+                        "Copy": {
+                            "label": "Copy",
+                            "action": function(data) {
+                                var path = jsTreeUtils.getPath(v_requestTree.jstree("get_node", data.reference)).path;
+                                v_viewModel.copyRequest(mcopy(path), partialRefresh);
+                                path[path.length - 1] += 1;
+                                var added = jsTreeUtils.getLastNodeIdFromPath(v_requestTree, path);
+                                v_requestTree.jstree("deselect_node", data.reference)
+                                v_requestTree.jstree("select_node", added);
+                            }
+                        },
+                        "Delete": {
+                            "label": "Delete",
+                            "action": function(data) {
+                                deleteNode(data.reference);
+                            },
+                            "separator_after": true
+                        },
+                        "SizeOf": {
+                            "label": "Convert to sizeOf",
+                            "action": function(data) {
+                                var path = jsTreeUtils.getPath(v_requestTree.jstree("get_node", data.reference)).path;
+                                v_viewModel.convertToSizeOf(path, v_this.requestRenamed);
+                            }
+                        },
+                        "SetData": {
+                            "label": "Convert to setData or getData",
+                            "action": function(data) {
+                                var path = jsTreeUtils.getPath(v_requestTree.jstree("get_node", data.reference)).path;
+                                v_viewModel.convertToSetData(path, v_this.requestRenamed);
+                            }
+                        },
+                        "ElementPresent": {
+                            "label": "Convert to dataElementPresent",
+                            "action": function(data) {
+                                var path = jsTreeUtils.getPath(v_requestTree.jstree("get_node", data.reference)).path;
+                                v_viewModel.convertToDataElementPresent(path, v_this.requestRenamed);
+                            },
+                            "separator_after": true
+                        },
+                        "ExpandAll": {
+                            "label": "Expand all",
+                            "action": function(data) {
+                                v_requestTree.jstree("open_all");
+                            }
+                        },
+                        "CollapseAll": {
+                            "label": "Collapse all",
+                            "action": function(data) {
+                                v_requestTree.jstree("close_all");
+                            },
+                            "separator_after": true
+                        },
+                        "CopyRequestAsText": {
+                            "label": "Copy Request as Text",
+                            "action": function(data) {
+                                var text = JSON.stringify(v_viewModel.getRequest(), null, 4);
+
+                                var textArea = document.createElement("textarea");
+                                textArea.style.position = 'fixed';
+                                textArea.style.top = 0;
+                                textArea.style.left = 0;
+                                textArea.style.width = '2em';
+                                textArea.style.height = '2em';
+                                textArea.style.padding = 0;
+                                textArea.style.border = 'none';
+                                textArea.style.outline = 'none';
+                                textArea.style.boxShadow = 'none';
+                                textArea.style.background = 'transparent';
+                                textArea.value = text;
+
+                                document.body.appendChild(textArea);
+                                textArea.select();
+                                document.execCommand('copy');
+                                document.body.removeChild(textArea);
+                            }
+                        }
+                    };
+                },
+                "select_node": true
+            }
+        });
+
+        v_requestTree.bind("hover_node.jstree", function(e, data) {
+            var string = JSON.stringify(v_viewModel.getRequestCopy(jsTreeUtils.getPath(v_requestTree.jstree("get_node", data.node.id)).path), null, 4);
+            $("#"+data.node.id).prop("title", string);
+        });
+
+        v_requestTree.bind("select_node.jstree", function (e, data) {
+            closeEditors();
+            v_parent.setFocusedObj(v_this);
+        });
+
+        v_requestTree.bind("copy_node.jstree", function(e, data) {
+            if (jsTreeUtils.isNodeFromTree(data.original, v_helpTree)) {
+                helpNodeCopied(data);
+            } else if (jsTreeUtils.isNodeFromTree(data.original, v_requestTree)) {
+                requestNodeCopied(data);
+            } else if (data.original.text === "Selection connections") {
+                v_requestTree.jstree("delete_node", data.node.id);
+            } else if (data.original.text === "Request connection") {
+                v_requestTree.jstree("delete_node", data.node.id);
+            }
+        });
+
+        jsTreeUtils.openNodes(v_requestTree, v_desktopData.openRequests);
+
+        v_requestTree.bind("after_open.jstree after_close.jstree", function(e, data) {
+            v_desktopData.openRequests = jsTreeUtils.findOpenNodes(v_requestTree);
+        });
+
+        v_requestTree.bind("after_open.jstree delete_node.jstree ready.jstree", function(e, data) {
+            // some operations are async and even their callback gets called too soon... so we have to use a timeout
+            // after_open, when we open a node, or when we insert one, delete_node, when we delete a node, and ready when the tree gets drawn in the beginning
+            setTimeout(function() {
+                v_viewModel.findSelectionsAndFilters();
+            }, 100);
+        });
+
+        v_requestTree.bind("ready.jstree", function(e, data) {
+            p_callback(true);
+        });
+
+        $(document).off('dnd_move.vakata', helpToRequestDrag);
+        $(document).on('dnd_move.vakata', helpToRequestDrag);
+
+        $(document).off('dnd_stop.vakata', helpToRequestDrop);
+        $(document).on('dnd_stop.vakata', helpToRequestDrop);
+    }
+
+    function helpToRequestDrag(event, data) {
+        var node = {
+            "id": data.data.nodes[0]
+        }
+        if ($(data.event.target).attr("id") == "RequestConsole_RequestTree" && jsTreeUtils.isNodeFromTree(node, v_helpTree) && (v_checkDisabled || dragFromHelpValidate(data.data.nodes[0], "#"))) {
+            data.helper.find('.jstree-icon').removeClass('jstree-er').addClass('jstree-ok');
+        }
+    }
+
+    function helpToRequestDrop(event, data) {
+        var node = {
+            "id": data.data.nodes[0]
+        }
+        if ($(data.event.target).attr("id") == "RequestConsole_RequestTree" && jsTreeUtils.isNodeFromTree(node, v_helpTree) && (v_checkDisabled || dragFromHelpValidate(data.data.nodes[0], "#"))) {
+            var helpPath = jsTreeUtils.getPath(v_helpTree.jstree("get_node", node.id)).path;
+            var position = $("#RequestConsole_RequestTree > ul").children().length;
+            v_viewModel.createRequest(helpPath, position, partialRefresh);
+            v_viewModel.findSelectionsAndFilters();
+        }
+    }
+
+    function requestToHelpDrop(event, data) {
+        var node = {
+            "id": data.data.nodes[0]
+        }
+        if (($(data.event.target).attr("id") == "RequestConsole_HelpTree" || jsTreeUtils.isNodeFromTree({"id": $(data.event.target).attr("id")}, v_helpTree)) && jsTreeUtils.isNodeFromTree({"id": data.data.nodes[0]}, v_requestTree)) {
+            deleteNode(v_requestTree.jstree("get_node", node.id));
+        }
+    }
+
+    function setupCallbacks() {
+        $("#RequestConsole_HelpSearch").on("input", function() {
+            v_helpTree.jstree("search", $(this).val());
+        });
+        $("#RequestConsole_Button_AddRequest").on("click", addEmptyRequest);
+
+        $("#RequestConsole_SortHelpTree").button().click(function(event, ui) {
+            if($(this).prop('checked')) {
+                v_viewModel.getHelp(createHelpJSTree, true, "WebApplications/RequestConsole/Res/getData.png");
+                v_desktopData["sortHelp"] = true;
+            } else {
+                v_viewModel.getHelp(createHelpJSTree, false, "WebApplications/RequestConsole/Res/getData.png");
+                v_desktopData["sortHelp"] = false;
+            }
+        });
+
+        if (v_desktopData["sortHelp"]) {
+            $("#RequestConsole_SortHelpTree").prev().addClass('ui-state-active');
+            $("#RequestConsole_SortHelpTree").prop('checked', true);
+        }
+    }
+
+    function partialRefresh(p_path, p_data) {
+        var parentId = getParentNodeIdFromPath(p_path);
+        v_requestTree.jstree("create_node", parentId, p_data.text, p_path[p_path.length - 1]);
+        v_requestTree.jstree("open_node", parentId);
+    }
+
+    function closeEditors() {
+        v_elementEditor.close();
+        v_filterEditor.close();
+        v_viewModel.findSelectionsAndFilters();
+    }
+
+    ///////////////////// HANDLING EVENTS //////////////////////////////
+
+    function helpNodeCopied(data) {
+        closeEditors();
+        v_requestTree.jstree("delete_node", data.node.id);
+        var helpPath = jsTreeUtils.getPath(v_helpTree.jstree("get_node", data.original.id)).path;
+        if (data.parent === "#") {
+            v_viewModel.createRequest(helpPath, data.position, partialRefresh);
+        } else {
+            var requestPath = jsTreeUtils.getPath(v_requestTree.jstree("get_node", data.parent)).path;
+            v_viewModel.addChildRequest(helpPath, requestPath, data.position, partialRefresh);
+        }
+    }
+
+    function requestNodeCopied(data) {
+        closeEditors();
+        v_requestTree.jstree("delete_node", data.node.id);
+        var fromPathObj = jsTreeUtils.getPath(v_requestTree.jstree("get_node", data.original.id));
+        var fromPath = fromPathObj.path;
+        var fromPathStr = fromPathObj.strpath;
+        var toPath = [];
+        var toPathStr = "";
+        if (data.parent != "#") {
+            var toPathObj = jsTreeUtils.getPath(v_requestTree.jstree("get_node", data.parent));
+            toPath = toPathObj.path;
+            toPathStr = toPathObj.strpath;
+        }
+        v_viewModel.moveRequest(fromPath, toPath, data.position);
+
+        function moveComplete(node, parent, pos) {
+            toPath.push(data.position);
+            v_requestTree.jstree("open_node", parent);
+        }
+
+        v_requestTree.jstree("move_node", v_requestTree.jstree("get_node", data.original.id), v_requestTree.jstree("get_node", data.parent), data.position, moveComplete);
+    }
+
+    function dragFromHelpValidate(p_helpId, p_requestParentId) {
+        var helpPath = jsTreeUtils.getPath(v_helpTree.jstree("get_node", p_helpId)).path;
+        if (p_requestParentId === "#") {
+            return v_viewModel.isValidToCreateRequest(helpPath);
+        } else {
+            var requestPath = jsTreeUtils.getPath(v_requestTree.jstree("get_node", p_requestParentId)).path;
+            return v_viewModel.isValidToAddRequest(helpPath, requestPath);
+        }
+    }
+
+    function dragFromRequestValidate(p_fromId, p_toId) {
+        var fromPath = jsTreeUtils.getPath(v_requestTree.jstree("get_node", p_fromId)).path;
+        var toPath;
+        if (p_toId != "#") {
+            toPath = jsTreeUtils.getPath(v_requestTree.jstree("get_node", p_toId)).path;
+        } else {
+            toPath = [];
+        }
+
+        return v_viewModel.isValidToMoveRequest(fromPath, toPath);
+    }
+
+    function getParentNodeIdFromPath(p_path) {
+        if (p_path.length === 1) {
+            return "#";
+        } else {
+            var id = "#";
+            for (var i = 0; i < p_path.length - 1; ++i) {
+                id = v_requestTree.jstree("get_node", id).children[p_path[i]];
+            }
+            return id;
+        }
+    }
+
+    function addEmptyRequest() {
+        closeEditors();
+
+        v_viewModel.createEmptyRequest(0, partialRefresh);
+        v_requestTree.jstree("deselect_node", v_requestTree.jstree("get_selected"));
+        var newNodeId = jsTreeUtils.getLastNodeIdFromPath(v_requestTree, [0]);
+        v_requestTree.jstree("select_node", newNodeId);
+
+        var offset = $("#" + newNodeId + "_anchor").offset();
+        offset.left += $("#" + newNodeId + "_anchor").width();
+
+        v_elementEditor.open([0], offset);
+        v_parent.setFocusedObj(v_elementEditor);
+    }
+
+    function deleteNode(p_data) {
+        var path = jsTreeUtils.getPath(v_requestTree.jstree("get_node", p_data)).path;
+        v_viewModel.deleteRequest(mcopy(path));
+
+        v_requestTree.jstree("delete_node", p_data);
+        closeEditors();
+
+        v_desktopData.openRequests = jsTreeUtils.findOpenNodes(v_requestTree);
+    }
+
+    function toggleValidation(event) {
+        if (event.keyCode == 17) {
+            if (event.type == "keydown") {
+                v_checkDisabled = true;
+            } else {
+                v_checkDisabled = false;
+            }
+        }
+    }
+
+    ///////////////////// CONNECTION RELATED /////////////////////
+
+    function RequestEndpoint(p_identifier) {
+        var v_identifier = p_identifier;
+
+        this.getOffset = function() {
+
+            var id = jsTreeUtils.getLastNodeIdFromPath(v_requestTree, v_identifier());
+            var htmlObj = $("#" + id + "_anchor");
+
+            var offset = htmlObj.offset();
+            offset.top += htmlObj.height() / 2;
+            offset.left += htmlObj.width()
+            return offset;
+        };
+
+        this.object = v_this;
+    }
+
+    this.getEndpoint = function(identifier) {
+        return new RequestEndpoint(identifier);
+    };
+
+    this.getConnectionInformation = function(identifier) {
+        return jsTreeUtils.getPath(v_requestTree.jstree("get_node", identifier));
+    };
+
+    this.disabled = function() {};
+}
+
+//# sourceURL=RequestConsole\Views\View_RequestEditor.js
diff --git a/htdocs/index.html b/htdocs/index.html
index 8e703f1..878429a 100644
--- a/htdocs/index.html
+++ b/htdocs/index.html
@@ -22,7 +22,7 @@
         <script src="Utils/Polyfill.js"></script>
         <script src="Utils/Compat.js"></script>
         <!-- Polyfill the Zeroth, for the old browsers. -->
-        <script src="Libs/JQuery/jquery-3.4.0.min.js"></script>
+        <script src="Libs/JQuery/jquery-3.5.1.min.js"></script>
         <script src="Libs/JQuery/jquery.svg.js"></script>
         <script src="Libs/jsTree/jstree.min.js"></script>
         <script src="Libs/JQueryUI/jquery-ui.js "></script>
@@ -34,7 +34,16 @@
         <script src="Libs/Flot/jquery.flot.navigate.min.js"></script>
         <!-- Customized libs -->
         <script src="Libs/JSONEditor/jsoneditor.custom.js"></script>
-        <script src="Libs/Codemirror/codemirror.custom.js"></script>
+        <script src="Libs/Codemirror/codemirror.js"></script>
+        <script src="Libs/Codemirror/brace-fold.js"></script>
+        <script src="Libs/Codemirror/closebrackets.js"></script>
+        <script src="Libs/Codemirror/closetag.js"></script>
+        <script src="Libs/Codemirror/foldcode.js"></script>
+        <script src="Libs/Codemirror/foldgutter.js"></script>
+        <script src="Libs/Codemirror/indent-fold.js"></script>
+        <script src="Libs/Codemirror/javascript.js"></script>
+        <script src="Libs/Codemirror/matchbrackets.js"></script>
+        <script src="Libs/Codemirror/matchtags.js"></script>
 
         <!-- GENERAL UTILITIES -->
         <script src="Utils/Utilities.js"></script>
diff --git a/test/Selenium/GuiEditor_CommonFunctions.py b/test/Selenium/GuiEditor_CommonFunctions.py
index 8b2a522..a6b1394 100644
--- a/test/Selenium/GuiEditor_CommonFunctions.py
+++ b/test/Selenium/GuiEditor_CommonFunctions.py
@@ -141,7 +141,7 @@
     actions.perform()
     time.sleep(0.5)
     
-    contextMenu = driver.find_element_by_class_name("jstree-contextmenu")
+    contextMenu = driver.find_element_by_class_name("jstree-default-contextmenu")
     items = contextMenu.find_elements_by_tag_name("li")
     for element in items:
         if menuText in element.text:
@@ -228,4 +228,4 @@
 
 def pressDelete(driver):
     actions = ActionChains(driver)
-    actions.send_keys(Keys.DELETE).perform()
\ No newline at end of file
+    actions.send_keys(Keys.DELETE).perform()