// TODO actually recognize syntax of TypeScript constructs CodeMirror.defineMode("javascript",function(e,t){function a(e,t,n){return t.tokenize=n,n(e,t)}function f(e,t){var n=!1,r;while((r=e.next())!=null){if(r==t&&!n)return!1;n=!n&&r=="\\"}return n}function h(e,t,n){return l=e,c=n,t}function p(e,t){var n=e.next();if(n=='"'||n=="'")return a(e,t,d(n));if(n=="."&&e.match(/^\d+(?:[eE][+\-]?\d+)?/))return h("number","number");if(/[\[\]{}\(\),;\:\.]/.test(n))return h(n);if(n=="0"&&e.eat(/x/i))return e.eatWhile(/[\da-f]/i),h("number","number");if(/\d/.test(n))return e.match(/^\d*(?:\.\d*)?(?:[eE][+\-]?\d+)?/),h("number","number");if(n=="/")return e.eat("*")?a(e,t,v):e.eat("/")?(e.skipToEnd(),h("comment","comment")):t.lastType=="operator"||t.lastType=="keyword c"||/^[\[{}\(,;:]$/.test(t.lastType)?(f(e,"/"),e.eatWhile(/[gimy]/),h("regexp","string-2")):(e.eatWhile(u),h("operator",null,e.current()));if(n=="#")return e.skipToEnd(),h("error","error");if(u.test(n))return e.eatWhile(u),h("operator",null,e.current());e.eatWhile(/[\w\$_]/);var r=e.current(),i=o.propertyIsEnumerable(r)&&o[r];return i&&t.lastType!="."?h(i.type,i.style,r):h("variable","variable",r)}function d(e){return function(t,n){return f(t,e)||(n.tokenize=p),h("string","string")}}function v(e,t){var n=!1,r;while(r=e.next()){if(r=="/"&&n){t.tokenize=p;break}n=r=="*"}return h("comment","comment")}function g(e,t,n,r,i,s){this.indented=e,this.column=t,this.type=n,this.prev=i,this.info=s,r!=null&&(this.align=r)}function y(e,t){for(var n=e.localVars;n;n=n.next)if(n.name==t)return!0}function b(e,t,n,r,s){var o=e.cc;w.state=e,w.stream=s,w.marked=null,w.cc=o,e.lexical.hasOwnProperty("align")||(e.lexical.align=!0);for(;;){var u=o.length?o.pop():i?M:O;if(u(n,r)){while(o.length&&o[o.length-1].lex)o.pop()();return w.marked?w.marked:n=="variable"&&y(e,r)?"variable-2":t}}}function E(){for(var e=arguments.length-1;e>=0;e--)w.cc.push(arguments[e])}function S(){return E.apply(null,arguments),!0}function x(e){function t(t){for(var n=t;n;n=n.next)if(n.name==e)return!0;return!1}var n=w.state;if(n.context){w.marked="def";if(t(n.localVars))return;n.localVars={name:e,next:n.localVars}}else{if(t(n.globalVars))return;n.globalVars={name:e,next:n.globalVars}}}function N(){w.state.context={prev:w.state.context,vars:w.state.localVars},w.state.localVars=T}function C(){w.state.localVars=w.state.context.vars,w.state.context=w.state.context.prev}function k(e,t){var n=function(){var n=w.state,r=n.indented;n.lexical.type=="stat"&&(r=n.lexical.indented),n.lexical=new g(r,w.stream.column(),e,null,n.lexical,t)};return n.lex=!0,n}function L(){var e=w.state;e.lexical.prev&&(e.lexical.type==")"&&(e.indented=e.lexical.indented),e.lexical=e.lexical.prev)}function A(e){return function(t){return t==e?S():e==";"?E():S(arguments.callee)}}function O(e){return e=="var"?S(k("vardef"),V,A(";"),L):e=="keyword a"?S(k("form"),M,O,L):e=="keyword b"?S(k("form"),O,L):e=="{"?S(k("}"),z,L):e==";"?S():e=="if"?S(k("form"),M,O,L,J):e=="function"?S(Z):e=="for"?S(k("form"),A("("),k(")"),K,A(")"),L,O,L):e=="variable"?S(k("stat"),F):e=="switch"?S(k("form"),M,k("}","switch"),A("{"),z,L,L):e=="case"?S(M,A(":")):e=="default"?S(A(":")):e=="catch"?S(k("form"),N,A("("),et,A(")"),O,L,C):E(k("stat"),M,A(";"),L)}function M(e){return D(e,!1)}function _(e){return D(e,!0)}function D(e,t){var n=t?j:B;return m.hasOwnProperty(e)?S(n):e=="function"?S(Z):e=="keyword c"?S(t?H:P):e=="("?S(k(")"),P,A(")"),L,n):e=="operator"?S(t?_:M):e=="["?S(k("]"),U(_,"]"),L,n):e=="{"?S(k("}"),U(q,"}"),L,n):S()}function P(e){return e.match(/[;\}\)\],]/)?E():E(M)}function H(e){return e.match(/[;\}\)\],]/)?E():E(_)}function B(e,t){return e==","?S(M):j(e,t,!1)}function j(e,t,n){var r=n==0?B:j,i=n==0?M:_;if(e=="operator")return/\+\+|--/.test(t)?S(r):t=="?"?S(M,A(":"),i):S(i);if(e==";")return;if(e=="(")return S(k(")","call"),U(_,")"),L,r);if(e==".")return S(I,r);if(e=="[")return S(k("]"),P,A("]"),L,r)}function F(e){return e==":"?S(L,O):E(B,A(";"),L)}function I(e){if(e=="variable")return w.marked="property",S()}function q(e,t){if(e=="variable"){w.marked="property";if(t=="get"||t=="set")return S(R)}else if(e=="number"||e=="string")w.marked=e+" property";if(m.hasOwnProperty(e))return S(A(":"),_)}function R(e){return e==":"?S(M):e!="variable"?S(A(":"),M):(w.marked="property",S(Z))}function U(e,t){function n(r){if(r==","){var i=w.state.lexical;return i.info=="call"&&(i.pos=(i.pos||0)+1),S(e,n)}return r==t?S():S(A(t))}return function(r){return r==t?S():E(e,n)}}function z(e){return e=="}"?S():E(O,z)}function W(e){return e==":"?S(X):E()}function X(e){return e=="variable"?(w.marked="variable-3",S()):E()}function V(e,t){return e=="variable"?(x(t),s?S(W,$):S($)):E()}function $(e,t){if(t=="=")return S(_,$);if(e==",")return S(V)}function J(e,t){if(e=="keyword b"&&t=="else")return S(k("form"),O,L)}function K(e){return e=="var"?S(V,A(";"),G):e==";"?S(G):e=="variable"?S(Q):E(M,A(";"),G)}function Q(e,t){return t=="in"?S(M):S(B,G)}function G(e,t){return e==";"?S(Y):t=="in"?S(M):E(M,A(";"),Y)}function Y(e){e!=")"&&S(M)}function Z(e,t){if(e=="variable")return x(t),S(Z);if(e=="(")return S(k(")"),N,U(et,")"),L,O,C)}function et(e,t){if(e=="variable")return x(t),s?S(W):S()}var n=e.indentUnit,r=t.statementIndent,i=t.json,s=t.typescript,o=function(){function e(e){return{type:e,style:"keyword"}}var t=e("keyword a"),n=e("keyword b"),r=e("keyword c"),i=e("operator"),o={type:"atom",style:"atom"},u={"if":e("if"),"while":t,"with":t,"else":n,"do":n,"try":n,"finally":n,"return":r,"break":r,"continue":r,"new":r,"delete":r,"throw":r,"var":e("var"),"const":e("var"),let:e("var"),"function":e("function"),"catch":e("catch"),"for":e("for"),"switch":e("switch"),"case":e("case"),"default":e("default"),"in":i,"typeof":i,"instanceof":i,"true":o,"false":o,"null":o,"undefined":o,NaN:o,Infinity:o,"this":e("this")};if(s){var a={type:"variable",style:"variable-3"},f={"interface":e("interface"),"class":e("class"),"extends":e("extends"),constructor:e("constructor"),"public":e("public"),"private":e("private"),"protected":e("protected"),"static":e("static"),"super":e("super"),string:a,number:a,bool:a,any:a};for(var l in f)u[l]=f[l]}return u}(),u=/[+\-*&%=<>!?|~^]/,l,c,m={atom:!0,number:!0,variable:!0,string:!0,regexp:!0,"this":!0},w={state:null,column:null,marked:null,cc:null},T={name:"this",next:{name:"arguments"}};return L.lex=!0,{startState:function(e){return{tokenize:p,lastType:null,cc:[],lexical:new g((e||0)-n,0,"block",!1),localVars:t.localVars,globalVars:t.globalVars,context:t.localVars&&{vars:t.localVars},indented:0}},token:function(e,t){e.sol()&&(t.lexical.hasOwnProperty("align")||(t.lexical.align=!1),t.indented=e.indentation());if(t.tokenize!=v&&e.eatSpace())return null;var n=t.tokenize(e,t);return l=="comment"?n:(t.lastType=l!="operator"||c!="++"&&c!="--"?l:"incdec",b(t,n,l,c,e))},indent:function(e,i){if(e.tokenize==v)return CodeMirror.Pass;if(e.tokenize!=p)return 0;var s=i&&i.charAt(0),o=e.lexical;for(var u=e.cc.length-1;u>=0;--u){var a=e.cc[u];if(a==L)o=o.prev;else if(a!=J||/^else\b/.test(i))break}o.type=="stat"&&s=="}"&&(o=o.prev),r&&o.type==")"&&o.prev.type=="stat"&&(o=o.prev);var f=o.type,l=s==f;return f=="vardef"?o.indented+(e.lastType=="operator"||e.lastType==","?4:0):f=="form"&&s=="{"?o.indented:f=="form"?o.indented+n:f=="stat"?o.indented+(e.lastType=="operator"||e.lastType==","?r||n:0):o.info=="switch"&&!l&&t.doubleIndentSwitch!=0?o.indented+(/^(?:case|default)\b/.test(i)?n:2*n):o.align?o.column+(l?0:1):o.indented+(l?0:n)},electricChars:":{}",blockCommentStart:i?null:"/*",blockCommentEnd:i?null:"*/",lineComment:i?null:"//",fold:"brace",helperType:i?"json":"javascript",jsonMode:i}}),CodeMirror.defineMIME("text/javascript","javascript"),CodeMirror.defineMIME("text/ecmascript","javascript"),CodeMirror.defineMIME("application/javascript","javascript"),CodeMirror.defineMIME("application/ecmascript","javascript"),CodeMirror.defineMIME("application/json",{name:"javascript",json:!0}),CodeMirror.defineMIME("application/x-json",{name:"javascript",json:!0}),CodeMirror.defineMIME("text/typescript",{name:"javascript",typescript:!0}),CodeMirror.defineMIME("application/typescript",{name:"javascript",typescript:!0});